Token Risk (Base)

Heuristic risk checks for an ERC-20 token on Base mainnet before an agent buys or sells it: honeypot and transfer-tax simulation against the deepest pool, plus contract, metadata, proxy, owner and privileged-function checks. Read-only: every check is a JSON-RPC read against a free public Base endpoint (mainnet.base.org, then base-rpc.publicnode.com, then base.drpc.org). Nothing is signed or broadcast, and no paid data provider is called.

Informational only, not financial advice. The checks run at one block and can miss risks or flag legitimate tokens.

Call

POST /api/skills/token-risk

{"token": "0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913", "chain": "base"}

token (required): the token contract address (0x + 40 hex). chain (optional): only "base" for now.

Checks

Each check is {"result": "pass" | "warn" | "fail" | "unknown", "evidence": {...}}. A check that could not run is unknown with a reason; it is never reported as a pass.

Check What it does warn / fail when
contract_code eth_getCode fail: no code at the address
erc20_metadata name, symbol, decimals, totalSupply fail: none readable
proxy EIP-1967 and legacy zeppelinos implementation/admin slots warn: upgradeable proxy
ownership owner() / getOwner() warn: owner still set; pass: 0x0 or 0x…dEaD
privileged_functions PUSH4 selectors in the token's (and implementation's) bytecode: mint, blacklist, pause, fee setters, trading switches / limits warn: any found (presence only, not who may call them)
liquidity_pool Uniswap v2 getPair, Uniswap v3 getPool (fees 100/500/3000/10000), Aerodrome getPool (volatile/stable) against WETH and USDC; the pool holding the most of the token is used warn: thin quote-side liquidity
sell_simulation eth_simulateV1: a holder (balance planted with a state override after locating the balance storage slot) transfers 0.1% of the pool's balance into the pool, the token-side leg of a sell fail: reverts, returns false, or delivers nothing
buy_simulation the same amount transferred out of the pool, the token-side leg of a buy same as above
transfer_tax 1 βˆ’ received / sent for both legs, from balanceOf before and after warn β‰₯ 1%, fail > 10%

A Uniswap quoter is not used for tax: it quotes the pool's math, not what a fee-on-transfer token actually delivers, so the token transfer is measured directly. AMM fees are not included.

risk_level: any fail β†’ high; else any warn β†’ medium; else any unknown β†’ unknown; else low. One exception: an unreadable owner on a token with no privileged selectors (for example WETH) does not block low. reasons lists what drove the level.

Errors (not charged)

Response (paid 200, USDC)

USDC is medium because it is an upgradeable proxy with an active owner and mint, blacklist and pause functions. Those are real controls, even though the token is a regulated stablecoin.

{
  "skill": "token_risk",
  "ok": true,
  "token": "0x833589fcd6edb6e08f4c7c32d4f71b54bda02913",
  "chain": "base",
  "chain_id": 8453,
  "block": 52494540,
  "symbol": "USDC",
  "risk_level": "medium",
  "reasons": [
    "proxy: warn",
    "ownership: warn",
    "privileged_functions: warn"
  ],
  "checks": {
    "contract_code": {
      "result": "pass",
      "evidence": {
        "bytecode_bytes": 1852,
        "block": 52494540
      }
    },
    "erc20_metadata": {
      "result": "pass",
      "evidence": {
        "name": "USD Coin",
        "symbol": "USDC",
        "decimals": 6,
        "total_supply": "4419304031200909",
        "missing": []
      }
    },
    "proxy": {
      "result": "warn",
      "evidence": {
        "standard": "zeppelinos (legacy unstructured storage)",
        "implementation": "0x2ce6311ddae708829bc0784c967b7d77d19fd779",
        "admin": "0x4fc7850364958d97b4d3f5a08f79db2493f8ca44",
        "note": "upgradeable: whoever controls the proxy can replace the token's code"
      }
    },
    "ownership": {
      "result": "warn",
      "evidence": {
        "function": "owner()",
        "owner": "0x3abd6f64a422225e61e435bae41db12096106df7",
        "renounced": false
      }
    },
    "privileged_functions": {
      "result": "warn",
      "evidence": {
        "found": {
          "mint": [
            "configureMinter(address,uint256)",
            "mint(address,uint256)"
          ],
          "blacklist": [
            "blacklist(address)",
            "isBlacklisted(address)"
          ],
          "pause": [
            "pause()",
            "unpause()"
          ]
        },
        "scanned": [
          "token",
          "implementation"
        ],
        "note": "selector presence only; who may call them is not checked"
      }
    },
    "liquidity_pool": {
      "result": "pass",
      "evidence": {
        "dex": "uniswap_v3",
        "variant": "fee 3000",
        "pool": "0x6c561b446416e1a00e8e93e221854d6ea4171372",
        "quote_token": "WETH",
        "token_balance": "76072526114911",
        "quote_balance": "29060996929756341666149",
        "thin_liquidity": false,
        "pools_found": 7
      }
    },
    "sell_simulation": {
      "result": "pass",
      "evidence": {
        "pool": "0x6c561b446416e1a00e8e93e221854d6ea4171372",
        "amount": "76072526114",
        "balance_slot": "solidity:9",
        "method": "eth_simulateV1 transfer leg",
        "received": "76072526114"
      }
    },
    "buy_simulation": {
      "result": "pass",
      "evidence": {
        "pool": "0x6c561b446416e1a00e8e93e221854d6ea4171372",
        "amount": "76072526114",
        "balance_slot": "solidity:9",
        "method": "eth_simulateV1 transfer leg",
        "received": "76072526114"
      }
    },
    "transfer_tax": {
      "result": "pass",
      "evidence": {
        "sell_tax_pct": 0.0,
        "buy_tax_pct": 0.0,
        "note": "token-side transfer tax only; AMM/pool fees are not included"
      }
    }
  },
  "rpc": "mainnet.base.org",
  "disclaimer": "Informational only, not financial advice. These are automated heuristics from public on-chain reads and simulations at a single block. They can miss risks (owner actions after this block, time-, amount- or wallet-specific traps, off-chain controls, other pools) and can flag legitimate tokens (for example regulated stablecoins with blacklist and pause functions). Do your own research."
}

Unpaid β†’ HTTP 402 (x402 USDC on Base). Retry with PAYMENT-SIGNATURE. Free preflight: send X-X402-Validate-Only: 1 (422 on bad params, else 402).

Price: $0.005 per call.