⚡ x402 on-chain audits
Two on-chain audits for agents, delivered as JSON — paid in a single HTTP round-trip with x402. No API key, no signup, no subscription. You pay, you get the data, on-chain.
Product 1 — Wallet audit ($0.25)
- Token balances (ETH, USDC, sUSDC) on Optimism, Base and Ethereum Mainnet
- Total gas spent (ETH) + USD estimate
- Recent transactions: to/from/value/status
Product 2 — Token safety audit ($0.25)
Before you accept payment in an unknown token, check it: honeypot simulation (can you sell?), buy/sell/transfer taxes, liquidity USD, holder count, source verification, proxy, owner renouncement and risk flags — one call, one JSON.
# score 0-100 + verdict (safe/caution/danger) + reasons
GET /token?address=0x3e12b9d6a4d12cd9b4a6d613872d0eb32f68b380
→ { "score": 0, "verdict": "danger",
"reasons": ["HONEYPOT: simulação de venda bloqueada (não dá pra sair)", ...] }
Try: audit a token → See a real honeypot caught →
Product 3 — Live gas prices ($0.10)
Every bot needs gas before it moves: gasPrice, maxPriorityFee (EIP-1559) and the latest block for Base, Optimism and Ethereum Mainnet — one call, three chains, public RPCs (no API key). Cheap enough to poll constantly.
# any chain — or ?chain=base,op
GET /gas
→ { "chains": { "base": { "gasPriceGwei": 0.021,
"maxPriorityFeeGwei": 0.002, "blockNumber": 24400000, ... }, ... } }
Product 4 — Token prices ($0.10)
Spot USD price, supply and market cap for up to 30 tokens at once on Base, Optimism or Ethereum Mainnet — computed on-chain from the most liquid DEX pool (Uniswap V3 + Uniswap V2), no external market API. The cheapest way to price a payment batch, a portfolio or a liquidity check before you accept a token.
# comma-separated addresses (up to 30), optional ?chain=base|op|mainnet
GET /price?address=0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913,0x4bfaa776991e85e5f8b1255461cbbd216cfc714f&chain=op
→ { "network": "op", "count": 2, "tokens": [ { "symbol": "USDC", "priceUsd": 1.0002,
"supply": 50000000000, "marketCapUsd": 50001000000, ... }, ... ],
"missing": [], "requestedAt": "..." }
Product 5 — Transaction status ($0.10)
Did your settlement land? Status, block, gas used, from/to and value for any Base transaction hash — the confirmation call every agent needs after paying or sending. On-chain receipt, no explorer API.
# tx hash (0x + 64 hex)
GET /tx?hash=0x941a93c...
→ { "status": "success", "blockNumber": 24400123, "gasUsed": 21000,
"from": "0x…", "to": "0x…", "valueEth": 0.1, "logCount": 0 }
Product 6 — Wallet balances ($0.10)
Before you move funds, pay a bot or accept a payment, check the balance: native ETH or any ERC-20 for any address on Base, Optimism or Ethereum Mainnet — on-chain, no explorer API. The "does this wallet have enough?" call every agent makes.
# native balance (default chain=base) — or add &token=0x… &chain=op|mainnet
GET /balance?address=0x8e8d53a67b59E6f2A28e0d6d52012A2b0e3E1886
→ { "network": "base", "native": true, "symbol": "ETH",
"balanceWei": "194087918645289", "balanceFormatted": "0.00019408",
"decimals": 18, "blockNumber": 24400123, ... }
Product 7 — ENS name resolution ($0.10)
Who is this address? Resolve an ENS name to an address (vitalik.eth → 0xd8dA…6045) or reverse-resolve an address to its ENS name — on Ethereum Mainnet, Base or Optimism, straight from the ENS registry on-chain. The identity check every agent makes before paying a counterparty.
# forward: name → address (default chain=mainnet) — or &chain=base|op GET /ens?name=vitalik.eth → { "network": "mainnet", "type": "forward", "name": "vitalik.eth", "address": "0xd8da6bf26964af9d7eed9e03e53415d37aa96045", "found": true, "resolver": "0x231b0ee…", "blockNumber": 25684589, ... } # reverse: address → name GET /ens?address=0xd8dA6BF26964aF9D7eEd9e03E53415D37aA96045 → { "network": "mainnet", "type": "reverse", "address": "0xd8da…6045", "name": "vitalik.eth", "found": true, ... }
Try: resolve vitalik.eth → Try: reverse →
Product 8 — Block data ($0.10)
What happened at block X? Timestamp, baseFee, gas used, transaction count, proposer and hashes for any block on Base, Optimism or Ethereum Mainnet — the network snapshot call: proof of time, network cost and activity before you send anything. On-chain, no explorer API.
# latest (default) — or &block=24912345 (decimal) / 0x… (hex) / earliest
GET /block?chain=base
→ { "network": "base", "block": "latest", "found": true,
"number": 24400123, "timestamp": 1786123456, "timestampIso": "2026-08-05T00:44:16.000Z",
"baseFeeGwei": 0.01, "gasUsed": 8501234, "gasLimit": 30000000,
"transactionCount": 212, "proposer": "0x…", ... }
Product 9 — ERC-20 allowance ($0.10)
How much can this contract spend from this wallet? The ERC-20 allowance check — token, owner and spender — on Base, Optimism or Ethereum Mainnet: the pre-flight call before you approve a spender, accept a payment or audit an over-permissioned approval. On-chain, no explorer API.
# how much can 0xd8dA… spend of vitalik.eth's USDC on Base?
GET /allowance?token=0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913&owner=0xd8dA6BF26964aF9D7eEd9e03E53415D37aA96045&spender=0x8e8d53a67b59E6f2A28e0d6d52012A2b0e3E1886
→ { "network": "base", "token": "0x8335…", "tokenExists": true, "symbol": "USDC", "decimals": 6,
"owner": "0xd8da…", "spender": "0x8e8d…",
"allowanceWei": "0", "allowanceFormatted": "0", "blockNumber": 24400123, ... }
Product 10 — Transaction simulator ($0.10)
Will this transaction work? Simulate any from/to/data/value before you sign — on Base, Optimism or Ethereum Mainnet: success flag, return data, decoded revert reason (Error(string)) and gas estimate, straight from an on-chain eth_call. The pre-flight every agent does before paying gas on a swap, approve, claim or transfer.
# simulate a USDC transfer (from has no balance → revert reason decoded)
GET /simulate?from=0x8e8d53a67b59E6f2A28e0d6d52012A2b0e3E1886&to=0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913&data=0xa9059cbb000000000000000000000000d8dA6BF26964aF9D7eEd9e03E53415D37aA9604500000000000000000000000000000000000000000000000000000000000f4240
→ { "success": false, "revertReason": "ERC20: transfer amount exceeds balance",
"gasEstimate": null, "blockNumber": 24400123, ... }
Product 11 — Swap quote ($0.10)
How much will I receive? An on-chain swap quote for any ERC-20 pair on Base: amountOut for your amountIn, straight from the DEX pools — Uniswap V3 (best liquidity across fee tiers) or Aerodrome V2, with a WETH route when there is no direct pair. Includes spot price, price impact and minOut slippage guards (0.5% / 1%) you can use directly as execution safety. No market API — everything from pool reserves on-chain.
# how much WETH for 1 USDC on Base? (amountIn in wei — 1 USDC = 1000000)
GET /swap?in=0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913&out=0x4200000000000000000000000000000000000006&amountIn=1000000
→ { "routeFound": true, "tokenIn": { "symbol": "USDC", "decimals": 6 },
"tokenOut": { "symbol": "WETH", "decimals": 18 },
"amountIn": { "wei": "1000000", "formatted": "1" },
"amountOut": { "wei": "532154915082329", "formatted": "0.00053215" },
"executionPrice": "0.00053215", "spotPrice": "0.00053375",
"priceImpactPct": 0.3, "slippagePct": 0, "feePct": 0.3,
"minOut": { "slippage0_5": "529494140693067", "slippage1": "526833365931505" },
"route": [ { "kind": "uniswap-v3", "fee": 3000, "pool": "0x6c561b…" } ], ... }
Try: quote 1 USDC → WETH → Try: 1 WETH → USDC →
Product 12 — MultiCall batch ($0.10)
N on-chain reads in one call. Batch up to 20 read-only calls (balances, allowances, symbols, any eth_call) into a single request via the canonical Multicall3 contract on Base, Optimism or Ethereum Mainnet — one payment, one response, per-call success flag (a reverting call doesn't fail the batch). The portfolio/wallet check every agent needs before deciding: check N wallets, N tokens, N approvals at once. No market API — all from the chain.
# 2 calls: USDC balance + WETH balance of one wallet on Base (URL-encoded JSON)
GET /multicall?chain=base&calls=[{"to":"0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913","data":"0x70a082310000000000000000000000008e8d53a67b59E6f2A28e0d6d52012A2b0e3E1886"},{"to":"0x4200000000000000000000000000000000000006","data":"0x70a082310000000000000000000000008e8d53a67b59E6f2A28e0d6d52012A2b0e3E1886"}]
→ { "network": "base", "callCount": 2, "blockNumber": 24400123,
"calls": [ { "to": "0x8335…", "data": "0x70a0…", "success": true,
"returnData": "0x0000000000000000000000000000000000000000000000000000000000000000" }, ... ],
"gasEstimate": 61458, ... }
Product 13 — On-chain events ($0.10)
What happened to this contract/wallet? Raw event logs (eth_getLogs) for any address on Base, Optimism or Ethereum Mainnet, with block range filters and per-event timestamp. The three most-used events are decoded for you — Transfer (from/to/value with the token decimals), Approval (owner/spender/value) and Uniswap V3 Swap (sender/recipient/amount0/amount1/tick) — everything else comes back raw for client-side decoding. Filter by topic (e.g. 0xddf252ad… = transfers only) and window. Busy contracts: the range auto-shrinks to what the RPC accepts (rangeHint shows the effective window). The monitoring primitive — deposits, payouts, approvals, swaps of any contract.
# last USDC transfers on Base (topic0 = Transfer; desc = newest first)
GET /events?address=0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913&topics=0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef&limit=5
→ { "network": "base", "count": 5, "truncated": true, "blockRange": "5000",
"events": [ { "blockNumber": 49548044, "timestamp": 1785914235,
"timestampISO": "2026-08-04T23:17:15.000Z", "txHash": "0xb7dde…",
"decoded": { "event": "Transfer",
"args": { "from": "0x1231…", "to": "0x1e55…", "value": "39679954",
"valueFormatted": "39.679954", "symbol": "USDC" } } }, ... ], ... }
Try: USDC transfers → Try: Uniswap V3 swaps →
Product 14 — Wallet activity ($0.10)
What did this wallet receive or send? ERC-20 Transfer activity of any address on Base, Optimism or Ethereum Mainnet — no token address needed (unlike /balance) and no contract address needed (unlike /events). Just the wallet: you get every token that moved in or out (incoming/outgoing), the formatted value with the token's own decimals, per-transfer timestamp, txHash and the native ETH balance delta over the window. The "did my payment land?" check — verify payouts, bounties and airdrops in one call. Busy wallets auto-shrink the window to what the RPC accepts (rangeHint).
# what came in and out of this wallet recently (mainnet)
GET /history?address=0xd8dA6BF26964aF9D7eEd9e03E53415D37aA96045&chain=mainnet&limit=5
→ { "network": "mainnet", "count": 5, "native": { "beforeFormatted": "41727.89", "afterFormatted": "41928.88", "deltaFormatted": "200.98", "direction": "in" },
"transfers": [ { "direction": "in", "blockNumber": 25685765, "timestamp": 1785914235,
"txHash": "0xf2e57…", "token": "0xa0b86…", "decoded": { "event": "Transfer",
"args": { "from": "0x278d…", "to": "0x0000…", "value": "71735844",
"valueFormatted": "71.735844", "symbol": "USDC" } } }, ... ], ... }
Try: vitalik.eth wallet activity → Try: USDC contract on Base →
Product 15 — DEX pair discovery
Where does this token trade? Every Uniswap V2 + Uniswap V3 pool (fees 100/500/3000/10000) of any token on Base, Optimism or Ethereum Mainnet against the chain's major base tokens (WETH, USDC, USDT, DAI + cbBTC/AERO on Base, OP/WBTC on Optimism, WBTC on Mainnet — or your own list via bases=). Per pool: address, venue, fee tier, token0/token1 (symbol + decimals), reserves (V2) or sqrtPriceX96 + liquidity (V3), the token's spot price in the quote token and in USD, and a liquidity estimate in USD (V2: reserves × price; V3: virtual TVL approximation). All computed on-chain from the DEX factories — no indexer, no market API. Liquidity research, pair discovery and "what's the deepest venue for this token?" in one call.
# where does AERO trade on Base, by liquidity?
GET /pairs?token=0x940181a94a35a4569e4529a3cdfb74e38fd98631&chain=base
→ { "network": "base", "token": { "address": "0x940181a94a35a4569e4529a3cdfb74e38fd98631", "symbol": "AERO", "decimals": 18 },
"count": 10, "truncated": true,
"pairs": [ { "venue": "uniswap-v3", "address": "0x3d5d14…", "feeTier": 3000, "feePct": 0.3,
"token0": { "symbol": "WETH" }, "token1": { "symbol": "AERO" }, "tokenIsToken0": false,
"quote": { "symbol": "WETH" }, "priceInQuote": 0.0002216, "priceUsd": 0.4153,
"liquidityUsd": 4342823, "sqrtPriceX96": "532227488789…", "liquidity": "778276117698…" }, ... ], ... }
Try: AERO pairs on Base → Try: WETH pairs on Mainnet →
Product 16 — Wallet snapshot ($0.10)
How much is this wallet worth? One-call portfolio snapshot of any address on Base, Optimism or Ethereum Mainnet: native ETH + the chain's curated tokens (WETH, USDC, USDT, DAI + cbBTC/AERO on Base, OP/WBTC on Optimism, WBTC on Mainnet — or your own list via tokens=), each with formatted balance, USD price (on-chain DEX pools) and value in USD, plus the wallet total. Replaces 5+ /balance + /price calls — the "how much does this address hold?" answer for fund managers, payout checks and portfolio monitoring.
# full picture of a wallet on Base, one call
GET /wallet?address=0x8e8d53a67b59E6f2A28e0d6d52012A2b0e3E1886&chain=base
→ { "network": "base", "count": 7, "totalUsd": 0.81,
"assets": [ { "symbol": "ETH", "native": true, "decimals": 18,
"balanceFormatted": "0.00009565", "priceUsd": 1868.33, "valueUsd": 0.18 },
{ "symbol": "USDC", "balanceFormatted": "0.260384", "priceUsd": 0.9993, "valueUsd": 0.26 }, ... ], ... }
Try: wallet snapshot on Base → Try: vitalik.eth on Mainnet →
Product 17 — Transaction intel, full ($0.10)
What did this tx do, and what did it cost? Complete on-chain picture of any transaction on Base, Optimism or Ethereum Mainnet: receipt (success/reverted, gas used, logs) + raw tx (from/to/value, nonce, type, EIP-1559 fees, input calldata) + block timestamp + confirmations + the decoded function call (4-byte selector resolved against ~40 known functions — transfer/approve/swap/deposit/withdraw/mint/burn/supply/borrow/multicall… — with typed arguments) + an event summary (Transfer/Approval/Swap/Deposit/Withdrawal/Sync/PairCreated…). The debugging call agents reach for after every settlement, swap or payment — no explorer, no API key.
# everything about a Base transaction, one call
GET /tx-full?hash=0x4b3c762f0eec8b264f177e82505a24c9992519b0e2ef05850f8689a4f1719f4b&chain=base
→ { "network": "base", "status": "success", "blockNumber": 49559107,
"timestamp": { "unix": 1785907561, "iso": "2026-08-05T05:26:01.000Z" }, "confirmations": 105,
"from": "0x56f326…", "to": "0xb73a29…", "type": "eip1559",
"gasUsed": 192900, "effectiveGasPriceGwei": 0.0294, "transactionFeeEth": 0.00000568,
"inputSize": 112, "function": { "selector": "0x01000000", "known": false },
"logCount": 3, "logSummary": [ { "name": "Transfer", "count": 2 }, { "name": "Swap", "count": 1 } ], ... }
Try: real swap tx on Base → Try: decoded USDC transfer →
Product 18 — Calldata decoder, offline ($0.10)
What does this calldata do? Paste any raw transaction calldata and get the decoded function call — 4-byte selector resolved against ~40 known functions (transfer/approve/swapExact*/deposit/withdraw/mint/burn/supply/borrow/repay/multicall/addLiquidity/removeLiquidity/safeTransferFrom/setApprovalForAll/execute/execTransaction…) with typed, named arguments — plus nested decoding of inner sub-calls (multicall bytes[], Gnosis Safe execute/execTransaction). The "what will this execute?" answer before you sign or relay — complements /simulate (will it work?) with what it does. Pure ABI decoding: no RPC, no explorer, no API key, instant response.
# decode a USDC transfer before approving it (or a Safe execTransaction)
GET /decode?data=0xa9059cbb000000000000000000000000d8dA6BF26964aF9D7eEd9e03E53415D37aA9604500000000000000000000000000000000000000000000000000000000000f4240
→ { "network": "offline", "inputSize": 68, "selector": "0xa9059cbb",
"function": { "known": true, "name": "transfer", "signature": "transfer(address,uint256)",
"args": [ "0xd8da6bf26964af9d7eed9e03e53415d37aa96045", "1000000" ],
"argsNamed": { "to": "0xd8da6bf26964af9d7eed9e03e53415d37aa96045", "value": "1000000" },
"nested": null }, ... }
Try: decode a transfer → Try: decode a multicall (2 inner calls) →
Product 19 — Calldata encoder, offline ($0.10)
Build the calldata you want to send. Give the function name (transfer/approve/swapExact*/deposit/withdraw/mint/burn/supply/borrow/repay/multicall/addLiquidity/removeLiquidity/safeTransferFrom/setApprovalForAll/execute/execTransaction… — the same ~40-function dictionary as /decode) or the 4-byte selector, plus the arguments as JSON (named object or positional array) — and get the raw calldata hex ready to sign, with an embedded round-trip verification: the generated calldata is decoded by the same decoder as /decode and the resulting call comes back in verify — you see, before signing, exactly what it will execute. Pure ABI encoding: no RPC, no explorer, no API key, instant response.
# build a USDC transfer calldata (named args) — or positional / by selector
GET /encode?fn=transfer&args={"to":"0xd8dA6BF26964aF9D7eEd9e03E53415D37aA96045","value":"1000000"}
→ { "network": "offline", "fn": "transfer", "selector": "0xa9059cbb",
"signature": "transfer(address to, uint256 value)",
"calldata": "0xa9059cbb000000000000000000000000d8dA6BF26964aF9D7eEd9e03E53415D37aA9604500000000000000000000000000000000000000000000000000000000000f4240",
"inputSize": 68, "args": { "to": "0xd8da…6045", "value": "1000000" },
"verify": { "known": true, "name": "transfer", "argsNamed": { ... }, ... }, ... }
Try: encode a transfer → Try: encode a Safe execTransaction →
Product 20 — EIP-712 typed data, offline ($0.10)
Build or check the message your wallet signs. Give the typed data JSON (domain + types + primaryType + message — any EIP-712 scheme: Permit/Permit2/relayer/off-chain votes…) and get the domainSeparator, the hashStruct of the message and the final digest (the 32-byte value actually signed), with the whole typed data normalized (uintN as decimal strings, addresses lowercased). Add an optional signature (0x + 65 bytes) and the endpoint recovers the signer address (ecrecover) — with an expectedAddress it confirms recover.ok whether the signature is from who you expect. Pure cryptography: no RPC, no explorer, no API key, instant response.
# USDC Permit (EIP-2612) — see the digest + verify the signature
GET /eip712?data={"domain":{"name":"USDC","version":"2","chainId":8453,"verifyingContract":"0x833589…2913"},"types":{"Permit":[{"name":"owner","type":"address"},…]},"primaryType":"Permit","message":{…},"signature":"0x…","expectedAddress":"0x…"}
→ { "network": "offline", "domainSeparator": "0x…", "hashStruct": "0x…",
"digest": "0x…", "recover": { "address": "0x…", "ok": true }, ... }
Try: a USDC Permit digest → Try: + recover the signer →
Product 21 — ABI selector generator, offline ($0.10)
The signature calculator for calldata builders and log filters. Give the human function signature (transfer(address,uint256) — parameter names optional: transfer(address to, uint256 value); arrays address[]; tuples (bytes,address,uint256,uint256)) and get the 4-byte selector (0xa9059cbb), the full keccak256 and the parsed inputs (type + name). Add kind=event and it computes the 32-byte topic0 for log filtering (Transfer/Approval/Swap/Sync/Paused…). Every result carries a round-trip verification (verify.known): if the function/event is in the /decode dictionary, you already know the calldata or logs can be decoded by the same API. Pure cryptography: no RPC, no explorer, no API key, instant response.
# selector 4-byte de função (com nomes de parâmetro) GET /selector?sig=transfer(address to, uint256 value) → { "network": "offline", "kind": "function", "signature": "transfer(address,uint256)", "selector": "0xa9059cbb", "verify": { "known": true, "name": "transfer" }, ... } # topic0 32-byte de evento (log filter) GET /selector?sig=Transfer(address,address,uint256)&kind=event → { "kind": "event", "topic0": "0xddf252ad1be2c89b…", "verify": { "known": true, "name": "Transfer" }, ... }
Try: transfer selector → Try: Transfer topic0 → Try: Uniswap V3 exactInput →
Product 22 — ABI map generator, offline ($0.10)
The whole contract interface in one call. Paste the contract ABI (JSON array of entries) and get the full selector map: the 4-byte selector, canonical signature and typed inputs/outputs of every function (with stateMutability), the 32-byte topic0 of every event (with indexed/anonymous flags) and the 4-byte selector of every error. Tuples (type: "tuple" + components), dynamic and fixed arrays — up to 300 entries. Every selector carries the round-trip verification (verify.known): which functions/events this API can already decode (/decode) and encode (/encode). The map calldata builders, indexers and log filters reach for before integrating a contract. Pure cryptography: no RPC, no explorer, no API key, instant response.
# ABI de um contrato → mapa completo (selectors + topics + erros)
GET /abi?abi=[{"type":"function","name":"transfer","inputs":[…]},…]
→ { "network": "offline", "count": { "functions": 2, "events": 1, … },
"functions": [{ "name": "transfer", "signature": "transfer(address,uint256)",
"selector": "0xa9059cbb", "verify": { "known": true, "name": "transfer" }, … }],
"events": [{ "name": "Transfer", "topic0": "0xddf252ad…", … }], … }
Try: ERC-20 ABI map → Try: Uniswap V3 router ABI →
Sample report (wallet)
A real audit of 0xd8dA6BF26964aF9D7eEd9e03E53415D37aA96045 (public data):
{
"address": "0xd8dA6BF26964aF9D7eEd9e03E53415D37aA96045",
"generated_at": "SAMPLE (generated 2026-08-04)",
"chains": {
"op": {
"chain": "Optimism",
"balance_eth": "0.180525",
"tx_count": null,
"gas_spent_eth": "0.000000",
"recent_txs": [
{
"hash": "0x4b2b9c9aafa11ac57418c67ffaeddb53ae7a76fb8de636f84868e667dd5a9afa",
"method": null,
"from": "0x13302Eb0aD9Af2F847119dC4Ac632fFe196d0B0f",
"to": "0xd8dA6BF26964aF9D7eEd9e03E53415D37aA96045",
"fee_eth": "0.00000000",
"status": "success",
"timestamp": "2026-07-28T10:01:07.000000Z"
},
{
"hash": "0x5e06256f9dc58b1bbad22733608e3bd7bffc9aa87f180159beb2fa08d2178bf1",
"method": null,
"from": "0x30C2f36db3a88b632c319D83F92Eac8246c4A9C6",
"to": "0xd8dA6BF26964aF9D7eEd9e03E53415D37aA96045",
…
Full sample JSON →
How it works
# 1. request → 402 with payment requirements curl -s https://x402-audit.tatschluizguilherme.workers.dev/audit?address=0x... curl -s https://x402-audit.tatschluizguilherme.workers.dev/token?address=0x... # 2. pay with any x402 client → re-send with PAYMENT-SIGNATURE → 200 JSON # (exact scheme, EIP-3009, USDC on Base)
Try it
Audit any address or token — e.g. 0x8e8d53a67b59E6f2A28e0d6d52012A2b0e3E1886 (a real Base wallet) or 0x4bfaa776991e85e5f8b1255461cbbd216cfc714f (a real Base token):
Run a live wallet audit → Run a live token audit →You'll get a 402 with the payment requirements — that's the product working. Pay with an x402-enabled wallet and re-request to receive the full JSON report.
FAQ
How do I pay?
Any wallet or client that speaks x402 (exact scheme, EIP-3009). The server responds 402 with machine-readable payment requirements; your client pays $0.25 USDC on Base and re-sends the signed request. Settlement happens on-chain — no accounts, no cards.
Which chains are covered?
Wallet audit: Optimism, Base and Ethereum Mainnet — native balance + gas spent + up to 6 recent transactions per chain, sourced from public explorers and RPCs. Token audit: Base (eip155:8453) — the chain where most agent payments settle.
What does the token audit actually check?
A buy/sell simulation (honeypot detection + real tax percentages), liquidity in USD, holder count, source verification (Sourcify + explorer), proxy detection, owner renouncement and risk flags. Everything is combined into a 0-100 safety score with a verdict (safe/caution/danger) and human-readable reasons — enough to decide whether to accept a payment token.
Can I audit any address?
Any valid 0x… address. Data is public on-chain data — you don't need to own the wallet to audit it.
What if a chain fails to respond?
The report returns an error field for that chain and keeps the others. You only pay once per request — a failed chain is noted in the JSON, not re-charged.
Who operates this?
hermes-ops. Payments settle directly to the operator wallet shown below; the settlement key holds gas only and never touches the principal.
Details
- Price: $0.25 USDC, network Base (
eip155:8453) - Payments settle on-chain to: 0x8e8d53a67b59E6f2A28e0d6d52012A2b0e3E1886
- Spec: docs.x402.org
- For agents: llms.txt (machine-readable description) · openapi.json (OpenAPI 3.0 spec)