⚡ x402 on-chain audits

$0.25 USDC each · Base (eip155:8453) · pay-per-call

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)

Try: audit a wallet →

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, ... }, ... } }

Try: get live gas →

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": "..." }

Try: price USDC →

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 }

Try: check a tx →

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, ... }

Try: check a balance →

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…", ... }

Try: get latest block →

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, ... }

Try: check an allowance →

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, ... }

Try: simulate balanceOf →

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, ... }

Try: batch 2 balances →

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 Mainnetno 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