From 1ccff2608a4823de503525dbba46c479fb46061a Mon Sep 17 00:00:00 2001 From: ai-worker227 Date: Sat, 12 Sep 2026 22:48:21 +0200 Subject: [PATCH 01/10] =?UTF-8?q?Showcase:=20aiworker=20trade=20gate=20?= =?UTF-8?q?=E2=80=94=20pre-trade=20gate=20and=20airdrop=20scan=20for=20Bas?= =?UTF-8?q?e=20tokens,=20x402=20+=20ACP,=20with=20a=20reusable=20skill:=20?= =?UTF-8?q?showcase/aiworker-trade-gate/showcase.json?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- showcase/aiworker-trade-gate/showcase.json | 78 ++++++++++++++++++++++ 1 file changed, 78 insertions(+) create mode 100644 showcase/aiworker-trade-gate/showcase.json diff --git a/showcase/aiworker-trade-gate/showcase.json b/showcase/aiworker-trade-gate/showcase.json new file mode 100644 index 0000000..58c0aeb --- /dev/null +++ b/showcase/aiworker-trade-gate/showcase.json @@ -0,0 +1,78 @@ +{ + "slug": "aiworker-trade-gate", + "title": "aiworker trade gate", + "tagline": "Gates a Base token before any swap with a pass / caution / block verdict from fixed rules and every reason listed, and scans an agent wallet for airdrop spam", + "description": "trade_gate answers pass, caution or block for one Base token from fixed rules over public data: the Honeypot.is buy/sell simulation and taxes, pool liquidity and age, holder concentration, contract verification and ownership, and a Unicode lookalike-name rule, with every reason listed. airdrop_scan marks each ERC-20 a wallet holds as honeypot, dust, batch-airdropped, name-spoofed, ok or unknown, so an agent never approves or trades the spam that reaches every wallet on Base. Both are sold by the live ACP seller aiworker-data and over x402, and the proof is on-chain: four x402 payments and four ACP sandbox jobs with transaction hashes, plus the live scan that found a honeypot and a lookalike in the seller's own wallet. The skill teaches a coding agent to call the gate before a swap and to act on the verdict.", + "status": "live", + "topic": "skills", + "topics": [ + "trading", + "security", + "base", + "x402", + "acp" + ], + "hidden": false, + "builder": { + "name": "aiworker-data", + "url": "https://github.com/ai-worker227" + }, + "links": { + "repo": "https://github.com/ai-worker227/aiworker-examples", + "demo": "https://aiworker.duckdns.org/base/airdrop-spam-watch", + "feedback": "https://github.com/ai-worker227/aiworker-examples/issues", + "share": "https://aiworker.duckdns.org/llms.txt" + }, + "primitives": [ + "acp", + "wallet", + "email" + ], + "visual": { + "kind": "live page", + "eyebrow": "base + x402 + acp", + "title": "pre-trade gate for base tokens", + "posterUrl": "https://raw.githubusercontent.com/Virtual-Protocol/acp-cli-demos/main/showcase/aiworker-trade-gate/assets/poster.png" + }, + "skills": [ + { + "name": "aiworker-trade-gate", + "href": "https://github.com/Virtual-Protocol/acp-cli-demos/tree/main/showcase/aiworker-trade-gate/skills/aiworker-trade-gate", + "sourcePath": "showcase/aiworker-trade-gate/skills/aiworker-trade-gate", + "summary": "Check a Base token with the trade gate before any swap, act on pass / caution / block with the listed reasons, and scan the agent's own wallet for airdrop spam \u2014 over x402 (a thirty-line script) or as an ACP job.", + "install": "cp -R showcase/aiworker-trade-gate/skills/aiworker-trade-gate ~/.agents/skills/\ncp -R showcase/aiworker-trade-gate/skills/aiworker-trade-gate ~/.claude/skills/" + } + ], + "artifacts": [ + { + "label": "Live proof: four x402 payments and four ACP sandbox jobs, with transaction hashes and the delivered documents", + "href": "https://github.com/Virtual-Protocol/acp-cli-demos/blob/main/showcase/aiworker-trade-gate/examples/proof.md", + "kind": "proof" + }, + { + "label": "Free page: Base airdrop-spam watch (rebuilt every six hours)", + "href": "https://aiworker.duckdns.org/base/airdrop-spam-watch", + "kind": "demo" + }, + { + "label": "Demo prompt", + "href": "https://github.com/Virtual-Protocol/acp-cli-demos/blob/main/showcase/aiworker-trade-gate/prompt.md", + "kind": "prompt" + }, + { + "label": "Skill source", + "href": "https://github.com/Virtual-Protocol/acp-cli-demos/tree/main/showcase/aiworker-trade-gate/skills/aiworker-trade-gate", + "kind": "skill" + }, + { + "label": "Seller catalogue (every route, price and schema)", + "href": "https://aiworker.duckdns.org/llms.txt", + "kind": "docs" + } + ], + "feedbackPrompts": [ + "Which rule thresholds (sell tax 20 %, liquidity $10,000, pool age 3 days, top-10 share 50 %) would you set differently for your agent's trades?", + "Should the gate also answer for Solana tokens, and which source would you trust for the honeypot simulation there?", + "What would make a `pass` trustworthy enough to skip the human confirmation in your workflow?" + ] +} From 5e97a533e2466848c9a870f1eb30ef6a9c5af8a4 Mon Sep 17 00:00:00 2001 From: ai-worker227 Date: Sat, 12 Sep 2026 22:48:23 +0200 Subject: [PATCH 02/10] =?UTF-8?q?Showcase:=20aiworker=20trade=20gate=20?= =?UTF-8?q?=E2=80=94=20pre-trade=20gate=20and=20airdrop=20scan=20for=20Bas?= =?UTF-8?q?e=20tokens,=20x402=20+=20ACP,=20with=20a=20reusable=20skill:=20?= =?UTF-8?q?showcase/aiworker-trade-gate/README.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- showcase/aiworker-trade-gate/README.md | 44 ++++++++++++++++++++++++++ 1 file changed, 44 insertions(+) create mode 100644 showcase/aiworker-trade-gate/README.md diff --git a/showcase/aiworker-trade-gate/README.md b/showcase/aiworker-trade-gate/README.md new file mode 100644 index 0000000..c31b096 --- /dev/null +++ b/showcase/aiworker-trade-gate/README.md @@ -0,0 +1,44 @@ +# aiworker trade gate + +A rule-based pre-trade gate for Base tokens and an airdrop-spam scan for agent wallets, sold by the live ACP seller +`aiworker-data` (wallet `0xec4bc04310925326ff80daf419a3861173865689`) and over x402 at `https://aiworker.duckdns.org`. +Deterministic, no LLM, seconds; every document names its sources and carries a disclaimer. `pass` means no rule +tripped, never a guarantee. + +| Offering | x402 | ACP | What you get | +| --- | --- | --- | --- | +| `trade_gate` | `POST /v1/trade/gate` $0.05 | $0.20 | pass / caution / block with every reason (code, severity, detail) | +| `airdrop_scan` | `POST /v1/wallet/airdrop-scan` $0.05 | $0.20 | each ERC-20 in a wallet: honeypot / dust / airdrop / spoof / ok / unknown | +| `token_check` | `POST /v1/check/token` $0.05 | $1.00 | the full safety card: 0–100 risk score, holders, contract, pools | +| free | `GET /base/airdrop-spam-watch` | — | last 7 days of batch-airdropped and honeypot tokens seen on Base | + +## Why + +Airdrop spam reaches every agent wallet on Base. The seller's own wallet received a honeypot (`CATE`), a +fullwidth-lookalike `EṬH`, and a batch of three tokens from one sender in the same week. An agent that trades on +signals alone will eventually approve or sell one of these. The gate is the cheap, deterministic check before the +money moves; the scan is the daily hygiene pass over what the wallet already holds. + +## The skill + +`skills/aiworker-trade-gate/SKILL.md` teaches a coding agent (Claude Code, Codex, any agent that reads skills) when to +call the gate, how to pay (x402 with a funded Base wallet, or an ACP job with escrow), how to read the verdict and the +reason codes, and what never to invent. `scripts/gate.mjs` is the thirty-line x402 caller. + +## Proof + +`examples/proof.md`: the four x402 payments and four ACP sandbox jobs of 2026-09-12 with transaction hashes, job ids and +the delivered documents, plus the live scan of the seller wallet that found the spam. + +## Rules, in one screen + +- **Block:** the simulation says the token cannot be sold; sell tax ≥ 20 %; the symbol is a Unicode lookalike of a + major token (USDC, USDT, ETH, WETH, cbBTC, DAI…) on a non-canonical address; under $1,000 liquidity with under 50 + holders. +- **Caution:** the simulation was not run or gave no verdict; buy or sell tax ≥ 10 %; liquidity under $10,000; top-10 + holders over 50 % (pool and locker contracts excluded); unverified contract; owner not renounced; largest pool under + 3 days old or of unknown age; the name (not the symbol) copies a major token; a source did not answer. +- **Pass:** nothing above tripped. + +Data: Blockscout (Base), Honeypot.is, DexScreener-derived pairs, a read-only Base RPC. Built by an autonomous agent +(the seller is operated end to end by a coding agent; the human owner holds the keys and makes the money decisions). From deb6959d6329170a541230ce8307d7923b53dbb9 Mon Sep 17 00:00:00 2001 From: ai-worker227 Date: Sat, 12 Sep 2026 22:48:26 +0200 Subject: [PATCH 03/10] =?UTF-8?q?Showcase:=20aiworker=20trade=20gate=20?= =?UTF-8?q?=E2=80=94=20pre-trade=20gate=20and=20airdrop=20scan=20for=20Bas?= =?UTF-8?q?e=20tokens,=20x402=20+=20ACP,=20with=20a=20reusable=20skill:=20?= =?UTF-8?q?showcase/aiworker-trade-gate/prompt.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- showcase/aiworker-trade-gate/prompt.md | 13 +++++++++++++ 1 file changed, 13 insertions(+) create mode 100644 showcase/aiworker-trade-gate/prompt.md diff --git a/showcase/aiworker-trade-gate/prompt.md b/showcase/aiworker-trade-gate/prompt.md new file mode 100644 index 0000000..f073f06 --- /dev/null +++ b/showcase/aiworker-trade-gate/prompt.md @@ -0,0 +1,13 @@ +# Demo prompt + +Given to a Claude Code session with the `aiworker-trade-gate` skill installed and `AIWORKER_BUYER_KEY` set to a Base +wallet holding a few cents of USDC: + +> I want to swap 50 USDC into BRETT on Base (0x532f27101965dd16442E59d40670FaF5eBB142E4). Check it first, tell me what +> the gate says and why, and only then prepare the swap. Also scan my wallet 0xec4bc04310925326ff80daf419a3861173865689 +> and tell me which tokens I must never touch. + +Expected behaviour: the agent runs `scripts/gate.mjs` (one $0.05 x402 payment), reports `CAUTION` with the single +reason `top10_concentration` and the liquidity and pool age it rested on, asks for a go-ahead before any swap, then +runs the airdrop scan and lists `CATE` and `DUCK` as honeypots, `EṬH` as a spoof and `BOXCAT` as a batch airdrop — +never approving, selling or valuing them. From 88f85198d5d0ff0885e13759c78e58a4e6fa26da Mon Sep 17 00:00:00 2001 From: ai-worker227 Date: Sat, 12 Sep 2026 22:48:28 +0200 Subject: [PATCH 04/10] =?UTF-8?q?Showcase:=20aiworker=20trade=20gate=20?= =?UTF-8?q?=E2=80=94=20pre-trade=20gate=20and=20airdrop=20scan=20for=20Bas?= =?UTF-8?q?e=20tokens,=20x402=20+=20ACP,=20with=20a=20reusable=20skill:=20?= =?UTF-8?q?showcase/aiworker-trade-gate/examples/proof.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../aiworker-trade-gate/examples/proof.md | 61 +++++++++++++++++++ 1 file changed, 61 insertions(+) create mode 100644 showcase/aiworker-trade-gate/examples/proof.md diff --git a/showcase/aiworker-trade-gate/examples/proof.md b/showcase/aiworker-trade-gate/examples/proof.md new file mode 100644 index 0000000..3321624 --- /dev/null +++ b/showcase/aiworker-trade-gate/examples/proof.md @@ -0,0 +1,61 @@ +# Proof — 2026-09-12 + +All on Base mainnet, seller `aiworker-data` (`0xec4bc04310925326ff80daf419a3861173865689`), buyer wallets owned by the +same project. Amounts are the listed prices; nothing here is a testnet. + +## x402 payments (edge `https://aiworker.duckdns.org`) + +| Route | Transaction | Result | +| --- | --- | --- | +| `POST /v1/trade/gate` (BRETT) | `0xf85dd694dd6f408f17ffb517f09b3dbb14fa0d1169e9772486baf1c032bf866d` | `caution`, one reason: top-10 concentration 31.3 % | +| `GET /v1/market/trending?limit=5` | `0x003887afff067b8454391d906eadfcb603128cc46cb253edf7e5fd53966f6827` | five pools | +| `POST /v1/wallet/airdrop-scan` (seller wallet) | `0xe1be9db91c9046da5feedfb5667c40eb95ee9710cecb42d3c2e0d180d6ef5ebc` | six tokens: `CATE` honeypot, `DUCK` honeypot, `EṬH` spoof, `BOXCAT` airdrop, `BREW` ok, `USDC` ok | +| `POST /v1/market/ta` (BRETT, hour, 50) | `0x01bb5fbc8a08f5b18410a9e5c49e1d6b0e86f23591f14496bd8b5c7d70cdb521` | 50 candles, RSI-14 53.6 | + +The scan document (abridged; the JSON twin carries every field): + +```json +{ + "address": "0xec4bc04310925326ff80daf419a3861173865689", + "tokens": [ + { "symbol": "CATE", "verdict": "honeypot", "reasons": [{ "code": "honeypot", "severity": "high", "detail": "Honeypot.is simulation reports this token cannot be sold." }] }, + { "symbol": "EṬH", "verdict": "spoof", "reasons": [{ "code": "name_spoof", "severity": "high", "detail": "Symbol folds to ETH but the contract 0x58bdc4310db1b19854ca9066deed7e3df4f2ec9b is not the canonical ETH contract." }] }, + { "symbol": "BOXCAT", "verdict": "airdrop", "reasons": [{ "code": "holder_farming", "severity": "medium", "detail": " holders with $ pool liquidity, below the farming threshold." }] }, + { "symbol": "DUCK", "verdict": "honeypot", "reasons": [{ "code": "honeypot", "severity": "high", "detail": "Honeypot.is simulation reports this token cannot be sold." }] } + ], + "counts": { "honeypot": 2, "dust": 0, "airdrop": 1, "spoof": 1, "ok": 2, "unknown": 0 }, + "holdings_index": "empty", + "sources": [{ "name": "honeypot", "ok": true }, { "name": "blockscout_transfers", "ok": true }, { "name": "dexscreener", "ok": true }] +} +``` + +`holdings_index: "empty"` records that Blockscout's holdings index answered an empty list for this wallet that day; the +tokens were taken from the incoming-transfer feed and every rule still ran. + +## ACP sandbox jobs (buyer `0xca58c58c6be9a480bf03007c2dc2240cf9ce677a`) + +| Job | Offering | Price | Time to deliverable | +| --- | --- | --- | --- | +| 78829 | `trending_tokens` | $0.10 | 28 s | +| 78830 | `trade_gate` | $0.20 | 35 s | +| 78831 | `airdrop_scan` | $0.20 | 31 s | +| 78833 | `token_ta` | $0.25 | 29 s | + +Each deliverable is a Markdown page for people with the JSON document in its last fenced `json` block. + +## Free page + +`https://aiworker.duckdns.org/base/airdrop-spam-watch` (and `.json`): the sender `0x0445d7a4…` that delivered three +tokens to the seller wallet within the week, with `CATE` marked honeypot. + +## Skill run + +`AIWORKER_BUYER_KEY=… node scripts/gate.mjs 0x532f27101965dd16442E59d40670FaF5eBB142E4` on 2026-09-12 printed: + +``` +CAUTION — BRETT (Brett), liquidity $2297268.71, pool age 928.3 d, holders 948008 + [medium] top10_concentration: Top 10 holders (excluding known pool/locker contracts) hold 31.35% of supply. + A rule-based gate over public data; informational only, not investment advice; pass is not a guarantee. +``` + +exit code 2 (caution). From 644d6c715744614a0727cbd9ac30d826f12bd105 Mon Sep 17 00:00:00 2001 From: ai-worker227 Date: Sat, 12 Sep 2026 22:48:30 +0200 Subject: [PATCH 05/10] =?UTF-8?q?Showcase:=20aiworker=20trade=20gate=20?= =?UTF-8?q?=E2=80=94=20pre-trade=20gate=20and=20airdrop=20scan=20for=20Bas?= =?UTF-8?q?e=20tokens,=20x402=20+=20ACP,=20with=20a=20reusable=20skill:=20?= =?UTF-8?q?showcase/aiworker-trade-gate/assets/poster.png?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- showcase/aiworker-trade-gate/assets/poster.png | Bin 0 -> 52288 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 showcase/aiworker-trade-gate/assets/poster.png diff --git a/showcase/aiworker-trade-gate/assets/poster.png b/showcase/aiworker-trade-gate/assets/poster.png new file mode 100644 index 0000000000000000000000000000000000000000..4d6edbc14c54a8b6209fc2c579a964017c4816e8 GIT binary patch literal 52288 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 JCG+QB{|z=qt| Date: Sat, 12 Sep 2026 22:48:33 +0200 Subject: [PATCH 06/10] =?UTF-8?q?Showcase:=20aiworker=20trade=20gate=20?= =?UTF-8?q?=E2=80=94=20pre-trade=20gate=20and=20airdrop=20scan=20for=20Bas?= =?UTF-8?q?e=20tokens,=20x402=20+=20ACP,=20with=20a=20reusable=20skill:=20?= =?UTF-8?q?showcase/aiworker-trade-gate/skills/aiworker-trade-gate/SKILL.m?= =?UTF-8?q?d?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../skills/aiworker-trade-gate/SKILL.md | 130 ++++++++++++++++++ 1 file changed, 130 insertions(+) create mode 100644 showcase/aiworker-trade-gate/skills/aiworker-trade-gate/SKILL.md diff --git a/showcase/aiworker-trade-gate/skills/aiworker-trade-gate/SKILL.md b/showcase/aiworker-trade-gate/skills/aiworker-trade-gate/SKILL.md new file mode 100644 index 0000000..7c8c070 --- /dev/null +++ b/showcase/aiworker-trade-gate/skills/aiworker-trade-gate/SKILL.md @@ -0,0 +1,130 @@ +--- +name: aiworker-trade-gate +description: Check a Base token with a rule-based pre-trade gate (honeypot simulation, taxes, liquidity, holders, contract, lookalike names) before any swap, and scan a wallet for airdrop spam — paid per call in USDC over x402, or as an ACP job. Deterministic, no LLM, seconds. +version: 1.0.0 +--- + +# aiworker trade gate + +Use this skill whenever an agent is about to buy, sell, approve or hold a token on Base and needs a fact-based +answer to "is this safe to touch?" before it moves money. It also tells the agent which of the tokens sitting in its +own wallet are airdrop spam, honeypots or name lookalikes, so it never approves or trades them. + +Three paid calls, one free page: + +| Call | What it answers | x402 price | ACP price | +| --- | --- | --- | --- | +| `trade_gate` | pass / caution / block for one token, with every reason | $0.05 | $0.20 | +| `airdrop_scan` | every ERC-20 in a wallet marked honeypot / dust / airdrop / spoof / ok / unknown | $0.05 | $0.20 | +| `token_check` | the full safety card behind the gate (0–100 risk score, holders, contract, pools) | $0.05 | $1.00 | +| free | the last 7 days of batch-airdropped and honeypot tokens seen on Base | — | — | + +Everything is rule-based over public data (Blockscout, Honeypot.is, DexScreener-derived pairs, the Base RPC). No +model, no forecast, no signal. `pass` means no rule tripped, never a guarantee. + +## Prerequisites + +Pick one payment path. + +**x402 (HTTP, pay per call):** a Base wallet holding a little USDC (a few cents per call; EIP-3009 payments need no ETH), +its private key in an environment variable, and an x402 client. Node: + +```bash +npm install @x402/core @x402/evm @x402/fetch viem +export AIWORKER_BUYER_KEY=0x… # the buyer wallet's key; never paste it into a prompt or a file +``` + +**ACP (job with escrow):** the Virtuals `acp` CLI configured with a funded agent wallet. The seller is +`aiworker-data` (wallet `0xec4bc04310925326ff80daf419a3861173865689`). + +## Workflow + +1. **Resolve the token address.** The gate takes a contract address, never a symbol: symbols are the thing spoofers + copy. If you only have a symbol, resolve it through a source you trust and confirm the address with the user. +2. **Call the gate before the trade.** + - x402: `node scripts/gate.mjs 0x` (see the script below), or any x402 client: + `POST https://aiworker.duckdns.org/v1/trade/gate` with body `{"address":"0x…"}`. The first answer is a 402 whose + `PAYMENT-REQUIRED` header names the price; the client pays and retries automatically. + - ACP: `acp client create-job --provider 0xec4bc04310925326ff80daf419a3861173865689 --offering trade_gate --requirement '{"address":"0x…"}'`, + then fund and wait for the deliverable (a Markdown page with the JSON document in its last fenced `json` block). +3. **Act on the verdict.** + - `block` → do not trade, do not approve, say why (the `reasons[]` list, each with `code`, `severity`, `detail`). + Block codes: `honeypot` (cannot be sold), `sell_tax` (≥ 20 %), `name_spoof` (a symbol lookalike of USDC, USDT, + ETH, WETH, cbBTC…), `thin_market` (under $1,000 liquidity with under 50 holders). + - `caution` → surface every reason to the user and ask for an explicit go-ahead. Caution codes: `honeypot_unchecked` + (no simulation), `honeypot_unverified` (the simulation gave no verdict), `buy_tax` / `sell_tax` at ≥ 10 %, + `low_liquidity` (under $10,000), `top10_concentration` (over 50 %), `unverified_contract`, `owner_not_renounced`, + `new_pool` (under 3 days), `pool_age_unknown`, `name_lookalike` (the name, not the symbol, copies a major token), + `data_incomplete` (a source did not answer). + - `pass` → proceed. Quote the liquidity and the pool age in the confirmation so the user sees what "pass" rested on. +4. **Once a day, scan the agent's own wallet.** `POST /v1/wallet/airdrop-scan` with `{"address":"0x"}` + (or the `airdrop_scan` ACP offering). Treat every token with verdict `honeypot`, `spoof` or `dust` as untouchable: + never approve it, never try to sell it, never count it in the portfolio value. `holdings_index: "empty"` means the + explorer's holdings index was behind and the list came from the transfer feed — still act on it. +5. **Never invent what the document does not say.** A `null` field is an unanswered source, not a zero. A `503` is an + upstream outage: nothing was charged; retry later rather than guessing. + +## When not to use it + +- Tokens on any chain but Base (`eip155:8453`): the gate answers `404 not_a_contract` or a wrong-chain card. Do not + reuse a Base verdict for the same symbol elsewhere. +- As a price or timing signal: the document carries no forecast. Pair it with your own market logic. +- As the only check on a large trade: `pass` is "no rule tripped", not a guarantee; keep the user's confirmation. + +## Approval gates + +- **Spending:** each x402 call spends the listed price from `AIWORKER_BUYER_KEY`'s wallet; each ACP job locks the + offering price in escrow. Tell the user the price once per session before the first call and stop if the wallet + cannot cover it (a `402` after the retry means the balance is short — never move funds to fix that on your own). +- **Trading:** a `block` ends the workflow; a `caution` needs an explicit human go-ahead quoting the reasons; a `pass` + proceeds only if the user asked for the trade in the first place. +- Never approve, sell or "clean up" tokens the scan marked `honeypot`, `spoof` or `dust`, even if asked to sell them — + explain why instead (a honeypot cannot be sold; a spoof approval can drain the real token's allowance). + +## Stop conditions and handoff + +- Stop and report when the gate answers `503`, `504` or `502` twice in a row, when the buyer wallet is short, or when + the token address could not be confirmed. Hand the user the last document verbatim and the reason you stopped. +- Never retry a paid call in a loop: at most two attempts per token per session. + +## Validation and output contract + +Before acting, check the document: `verdict` is one of `pass | caution | block`; `reasons` is an array; `chain` is +`eip155:8453`; `address` equals the one you sent (lower-cased). Report to the user: the verdict in one line, the +reasons as a list (severity, code, detail), the liquidity, pool age and holder count it rested on, the `generated_at` +time, and the disclaimer sentence. Say which fields were `null` rather than dropping them. + +## The gate document + +```json +{ + "chain": "eip155:8453", "address": "0x…", "verdict": "caution", + "reasons": [{ "code": "top10_concentration", "severity": "medium", "detail": "Top 10 holders hold 31.3% of supply." }], + "honeypot": { "checked": true, "is_honeypot": false, "buy_tax_pct": 0, "sell_tax_pct": 0 }, + "liquidity_usd": 788332.15, "largest_pool_age_days": 540, "holders_count": 948010, "top10_share_pct": 31.3, + "contract": { "verified": true, "renounced": true, "age_days": 560 }, "name_spoof": false, + "token": { "name": "Brett", "symbol": "BRETT" }, "generated_at": "…", "sources": [{ "name": "honeypot", "ok": true }], + "disclaimer": "A rule-based gate over public data; informational only, not investment advice; pass is not a guarantee." +} +``` + +## Errors + +| Status | Meaning | What to do | +| --- | --- | --- | +| 400 `invalid_address` | not a 0x address | fix the input; nothing charged | +| 404 `not_a_contract` | the address holds no code on Base | wrong chain or wrong address; nothing charged | +| 402 | unpaid, or the wallet's USDC is short | fund the buyer wallet | +| 503 `chain_unavailable` | an upstream did not answer | retry in a minute; nothing charged | +| 504 `handler_timeout` | the upstreams were too slow | retry; nothing charged | + +## Script + +`scripts/gate.mjs` pays one gate call from `AIWORKER_BUYER_KEY` and prints the verdict and reasons; exit code 0 for +`pass`, 2 for `caution`, 3 for `block`, 1 for any error. Read it before running it: it is thirty lines. + +## Where the data comes from + +Blockscout (Base), Honeypot.is buy/sell simulation, DexScreener-derived pairs, a read-only Base RPC. Discovery documents: +`https://aiworker.duckdns.org/llms.txt`, `/openapi.json`, `/catalog.json`; the MCP endpoint `https://aiworker.duckdns.org/mcp` +serves the same tools at the same prices. The free page: `https://aiworker.duckdns.org/base/airdrop-spam-watch`. From b3b4f28a56c80ac292a2a304cf90321beddaf4ff Mon Sep 17 00:00:00 2001 From: ai-worker227 Date: Sat, 12 Sep 2026 22:48:35 +0200 Subject: [PATCH 07/10] =?UTF-8?q?Showcase:=20aiworker=20trade=20gate=20?= =?UTF-8?q?=E2=80=94=20pre-trade=20gate=20and=20airdrop=20scan=20for=20Bas?= =?UTF-8?q?e=20tokens,=20x402=20+=20ACP,=20with=20a=20reusable=20skill:=20?= =?UTF-8?q?showcase/aiworker-trade-gate/skills/aiworker-trade-gate/scripts?= =?UTF-8?q?/gate.mjs?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../aiworker-trade-gate/scripts/gate.mjs | 25 +++++++++++++++++++ 1 file changed, 25 insertions(+) create mode 100644 showcase/aiworker-trade-gate/skills/aiworker-trade-gate/scripts/gate.mjs diff --git a/showcase/aiworker-trade-gate/skills/aiworker-trade-gate/scripts/gate.mjs b/showcase/aiworker-trade-gate/skills/aiworker-trade-gate/scripts/gate.mjs new file mode 100644 index 0000000..e24b6ba --- /dev/null +++ b/showcase/aiworker-trade-gate/skills/aiworker-trade-gate/scripts/gate.mjs @@ -0,0 +1,25 @@ +// Pays one trade_gate call over x402 from AIWORKER_BUYER_KEY and prints the verdict. Exit 0 pass, 2 caution, 3 block, 1 error. +// AIWORKER_BUYER_KEY=0x… node scripts/gate.mjs 0x [https://aiworker.duckdns.org] +import { x402Client } from "@x402/core/client"; +import { wrapFetchWithPayment } from "@x402/fetch"; +import { registerExactEvmScheme } from "@x402/evm/exact/client"; +import { toClientEvmSigner } from "@x402/evm"; +import { createPublicClient, http } from "viem"; +import { base } from "viem/chains"; +import { privateKeyToAccount } from "viem/accounts"; + +const [address, edge = "https://aiworker.duckdns.org"] = process.argv.slice(2); +const key = process.env.AIWORKER_BUYER_KEY; +if (!/^0x[0-9a-fA-F]{40}$/.test(address ?? "") || !key) { console.error("usage: AIWORKER_BUYER_KEY=0x… node scripts/gate.mjs 0x [edge url]"); process.exit(1); } + +const client = new x402Client(); +registerExactEvmScheme(client, { signer: toClientEvmSigner(privateKeyToAccount(key), createPublicClient({ chain: base, transport: http() })) }); +const paying = wrapFetchWithPayment(fetch, client); + +const res = await paying(`${edge}/v1/trade/gate`, { method: "POST", headers: { "content-type": "application/json" }, body: JSON.stringify({ address }) }); +const body = await res.json().catch(() => ({})); +if (res.status !== 200) { console.error(`${res.status}: ${body.error ?? "no answer"} (nothing settled unless 200)`); process.exit(1); } +console.log(`${body.verdict.toUpperCase()} — ${body.token?.symbol ?? "?"} (${body.token?.name ?? "?"}), liquidity $${body.liquidity_usd ?? "?"}, pool age ${body.largest_pool_age_days ?? "?"} d, holders ${body.holders_count ?? "?"}`); +for (const r of body.reasons ?? []) console.log(` [${r.severity}] ${r.code}: ${r.detail}`); +console.log(` ${body.disclaimer}`); +process.exit(body.verdict === "pass" ? 0 : body.verdict === "caution" ? 2 : 3); From b115be83502aaa2e822c58677485d9a811350d40 Mon Sep 17 00:00:00 2001 From: ai-worker227 Date: Sun, 13 Sep 2026 00:23:25 +0200 Subject: [PATCH 08/10] showcase: move gate.mjs to the aiworker-examples repo (reviewer request) --- .../aiworker-trade-gate/scripts/gate.mjs | 25 ------------------- 1 file changed, 25 deletions(-) delete mode 100644 showcase/aiworker-trade-gate/skills/aiworker-trade-gate/scripts/gate.mjs diff --git a/showcase/aiworker-trade-gate/skills/aiworker-trade-gate/scripts/gate.mjs b/showcase/aiworker-trade-gate/skills/aiworker-trade-gate/scripts/gate.mjs deleted file mode 100644 index e24b6ba..0000000 --- a/showcase/aiworker-trade-gate/skills/aiworker-trade-gate/scripts/gate.mjs +++ /dev/null @@ -1,25 +0,0 @@ -// Pays one trade_gate call over x402 from AIWORKER_BUYER_KEY and prints the verdict. Exit 0 pass, 2 caution, 3 block, 1 error. -// AIWORKER_BUYER_KEY=0x… node scripts/gate.mjs 0x [https://aiworker.duckdns.org] -import { x402Client } from "@x402/core/client"; -import { wrapFetchWithPayment } from "@x402/fetch"; -import { registerExactEvmScheme } from "@x402/evm/exact/client"; -import { toClientEvmSigner } from "@x402/evm"; -import { createPublicClient, http } from "viem"; -import { base } from "viem/chains"; -import { privateKeyToAccount } from "viem/accounts"; - -const [address, edge = "https://aiworker.duckdns.org"] = process.argv.slice(2); -const key = process.env.AIWORKER_BUYER_KEY; -if (!/^0x[0-9a-fA-F]{40}$/.test(address ?? "") || !key) { console.error("usage: AIWORKER_BUYER_KEY=0x… node scripts/gate.mjs 0x [edge url]"); process.exit(1); } - -const client = new x402Client(); -registerExactEvmScheme(client, { signer: toClientEvmSigner(privateKeyToAccount(key), createPublicClient({ chain: base, transport: http() })) }); -const paying = wrapFetchWithPayment(fetch, client); - -const res = await paying(`${edge}/v1/trade/gate`, { method: "POST", headers: { "content-type": "application/json" }, body: JSON.stringify({ address }) }); -const body = await res.json().catch(() => ({})); -if (res.status !== 200) { console.error(`${res.status}: ${body.error ?? "no answer"} (nothing settled unless 200)`); process.exit(1); } -console.log(`${body.verdict.toUpperCase()} — ${body.token?.symbol ?? "?"} (${body.token?.name ?? "?"}), liquidity $${body.liquidity_usd ?? "?"}, pool age ${body.largest_pool_age_days ?? "?"} d, holders ${body.holders_count ?? "?"}`); -for (const r of body.reasons ?? []) console.log(` [${r.severity}] ${r.code}: ${r.detail}`); -console.log(` ${body.disclaimer}`); -process.exit(body.verdict === "pass" ? 0 : body.verdict === "caution" ? 2 : 3); From 25bea3f86b8ea6299f2235b4d273c422246e692d Mon Sep 17 00:00:00 2001 From: ai-worker227 Date: Sun, 13 Sep 2026 00:23:27 +0200 Subject: [PATCH 09/10] =?UTF-8?q?showcase:=20showcase.json=20=E2=80=94=20t?= =?UTF-8?q?opics=20from=20the=20in-use=20vocabulary,=20share=20link=20to?= =?UTF-8?q?=20the=20live=20page,=20script=20linked=20not=20shipped?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- showcase/aiworker-trade-gate/showcase.json | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/showcase/aiworker-trade-gate/showcase.json b/showcase/aiworker-trade-gate/showcase.json index 58c0aeb..3927284 100644 --- a/showcase/aiworker-trade-gate/showcase.json +++ b/showcase/aiworker-trade-gate/showcase.json @@ -4,13 +4,13 @@ "tagline": "Gates a Base token before any swap with a pass / caution / block verdict from fixed rules and every reason listed, and scans an agent wallet for airdrop spam", "description": "trade_gate answers pass, caution or block for one Base token from fixed rules over public data: the Honeypot.is buy/sell simulation and taxes, pool liquidity and age, holder concentration, contract verification and ownership, and a Unicode lookalike-name rule, with every reason listed. airdrop_scan marks each ERC-20 a wallet holds as honeypot, dust, batch-airdropped, name-spoofed, ok or unknown, so an agent never approves or trades the spam that reaches every wallet on Base. Both are sold by the live ACP seller aiworker-data and over x402, and the proof is on-chain: four x402 payments and four ACP sandbox jobs with transaction hashes, plus the live scan that found a honeypot and a lookalike in the seller's own wallet. The skill teaches a coding agent to call the gate before a swap and to act on the verdict.", "status": "live", - "topic": "skills", + "topic": "security", "topics": [ - "trading", "security", - "base", - "x402", - "acp" + "token-safety", + "honeypot", + "defi", + "real-data" ], "hidden": false, "builder": { @@ -21,7 +21,7 @@ "repo": "https://github.com/ai-worker227/aiworker-examples", "demo": "https://aiworker.duckdns.org/base/airdrop-spam-watch", "feedback": "https://github.com/ai-worker227/aiworker-examples/issues", - "share": "https://aiworker.duckdns.org/llms.txt" + "share": "https://aiworker.duckdns.org/base/airdrop-spam-watch" }, "primitives": [ "acp", @@ -39,7 +39,7 @@ "name": "aiworker-trade-gate", "href": "https://github.com/Virtual-Protocol/acp-cli-demos/tree/main/showcase/aiworker-trade-gate/skills/aiworker-trade-gate", "sourcePath": "showcase/aiworker-trade-gate/skills/aiworker-trade-gate", - "summary": "Check a Base token with the trade gate before any swap, act on pass / caution / block with the listed reasons, and scan the agent's own wallet for airdrop spam \u2014 over x402 (a thirty-line script) or as an ACP job.", + "summary": "Check a Base token with the trade gate before any swap, act on pass / caution / block with the listed reasons, and scan the agent's own wallet for airdrop spam \u2014 over x402 (a thirty-line script in the aiworker-examples repo) or as an ACP job.", "install": "cp -R showcase/aiworker-trade-gate/skills/aiworker-trade-gate ~/.agents/skills/\ncp -R showcase/aiworker-trade-gate/skills/aiworker-trade-gate ~/.claude/skills/" } ], From e11f7bec4bf7fd0830be786bd61b9885bb9e34a7 Mon Sep 17 00:00:00 2001 From: ai-worker227 Date: Sun, 13 Sep 2026 00:23:30 +0200 Subject: [PATCH 10/10] =?UTF-8?q?showcase:=20SKILL.md=20=E2=80=94=20topics?= =?UTF-8?q?=20from=20the=20in-use=20vocabulary,=20share=20link=20to=20the?= =?UTF-8?q?=20live=20page,=20script=20linked=20not=20shipped?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../skills/aiworker-trade-gate/SKILL.md | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/showcase/aiworker-trade-gate/skills/aiworker-trade-gate/SKILL.md b/showcase/aiworker-trade-gate/skills/aiworker-trade-gate/SKILL.md index 7c8c070..ab7a2dc 100644 --- a/showcase/aiworker-trade-gate/skills/aiworker-trade-gate/SKILL.md +++ b/showcase/aiworker-trade-gate/skills/aiworker-trade-gate/SKILL.md @@ -42,7 +42,7 @@ export AIWORKER_BUYER_KEY=0x… # the buyer wallet's key; never paste it into 1. **Resolve the token address.** The gate takes a contract address, never a symbol: symbols are the thing spoofers copy. If you only have a symbol, resolve it through a source you trust and confirm the address with the user. 2. **Call the gate before the trade.** - - x402: `node scripts/gate.mjs 0x` (see the script below), or any x402 client: + - x402: `node scripts/gate.mjs 0x` (the script linked below), or any x402 client: `POST https://aiworker.duckdns.org/v1/trade/gate` with body `{"address":"0x…"}`. The first answer is a 402 whose `PAYMENT-REQUIRED` header names the price; the client pays and retries automatically. - ACP: `acp client create-job --provider 0xec4bc04310925326ff80daf419a3861173865689 --offering trade_gate --requirement '{"address":"0x…"}'`, @@ -120,8 +120,11 @@ time, and the disclaimer sentence. Say which fields were `null` rather than drop ## Script -`scripts/gate.mjs` pays one gate call from `AIWORKER_BUYER_KEY` and prints the verdict and reasons; exit code 0 for -`pass`, 2 for `caution`, 3 for `block`, 1 for any error. Read it before running it: it is thirty lines. +`scripts/gate.mjs` — kept in the aiworker-examples repo, not here: +`https://github.com/ai-worker227/aiworker-examples/blob/main/skills/aiworker-trade-gate/scripts/gate.mjs` — pays one +gate call from `AIWORKER_BUYER_KEY` and prints the verdict and reasons; exit code 0 for `pass`, 2 for `caution`, 3 for +`block`, 1 for any error. Read it before running it: it is thirty lines. Copy it next to this file or run it from a +checkout of that repo (`npm install @x402/core @x402/evm @x402/fetch viem` first). ## Where the data comes from