{"name":"token_safety","title":"Token safety verdict","category":"tokens","useWhen":"Run before buying, accepting or recommending a token on Base. Answers SAFE, CAUTION or AVOID with the exact reasons, from a simulated buy and sell, the contract's verified code and market data.","benefit":{"kind":"money","text":"A honeypot lets you buy and never sell; a 99% sell tax takes almost everything. This catches both before you pay."},"description":"Simulates buying 0.01 ETH of the token and selling it straight back (catches honeypots and hidden taxes), reads what the owner can still do (mint, block wallets, change fees, pause, cap sells), checks whether the code can be swapped (upgradeable proxy), whether the source is verified, and liquidity and pool age. SAFE means none of these known traps were found, not that the token will hold its value.","price":"$0.02","priceText":"25 free calls a day, then $0.02 USDC per call (x402)","http":{"method":"POST","path":"/api/tools/token_safety","body":"JSON object with the inputs below"},"mcp":{"method":"tools/call","name":"token_safety"},"inputs":[{"name":"token","type":"string","required":true,"lookingFor":"The token's contract address on Base: 0x followed by 40 hex characters.","whereToGet":"The token page on a DEX or explorer, or find_token. Never a ticker or a name: copycats reuse those."}],"outputs":[{"field":"token","type":"string","is":"The token's contract, checksummed.","howWorkedOut":"The input."},{"field":"symbol / name / decimals","type":"string / string / number","is":"What the contract calls itself.","howWorkedOut":"symbol(), name() and decimals() on the contract. Anyone can pick any name, so these prove nothing."},{"field":"verdict","type":"\"SAFE\" | \"CAUTION\" | \"AVOID\"","is":"The answer. AVOID: at least one check failed. CAUTION: at least one warning, or something that couldn't be checked. SAFE: no warnings.","howWorkedOut":"The worst check wins."},{"field":"summary","type":"string","is":"One sentence explaining the verdict.","howWorkedOut":"Built from the failed and warning checks."},{"field":"checks[]","type":"array","is":"Every check: name, result (pass, warn, fail, info), detail in plain words, and source.","howWorkedOut":"One entry per rule; see the tool notes for the rules."},{"field":"trade_test","type":"object | null","is":"The simulated buy and sell: pool, block, whether each worked, buy_tax and sell_tax as fractions.","howWorkedOut":"eth_simulateV1 at the latest block: a made-up wallet buys 0.01 ETH of the token on its deepest Uniswap v2, v3 or v4 pool against ETH or WETH, then sells everything back (v4 through the Universal Router and Permit2, as a real wallet would). Taxes compare what arrived with the pool's own quote. null when no such pool exists."},{"field":"liquidity_usd","type":"number | null","is":"Total liquidity across the pools DexScreener lists, in US dollars.","howWorkedOut":"Sum of DexScreener's liquidity for each pool it lists (at most 30, so a widely traded token may have more). null when DexScreener couldn't be reached."},{"field":"sources","type":"string[]","is":"Where the facts came from.","howWorkedOut":"Each data source used."}],"notes":["Not checked yet: how concentrated the holders are, and whether liquidity is locked. Both need data we don't have a free, reliable source for on Base.","The trade test covers Uniswap v2, v3 and v4 pools against ETH or WETH. A token that trades only elsewhere (for example Aerodrome, or against another token) gets a warning that selling wasn't tested.","Verified source comes from Sourcify, and from Basescan when an Etherscan key is configured. A contract with no source found gets a warning: its owner powers can't be read."],"inputSchema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"token":{"type":"string"}},"required":["token"]}}