{"service":"Token Backdoor Check","description":"Checks an ERC-20 token contract on Base or Robinhood Chain for code that lets someone other than the holder take holder balances. Runs the token bytecode (following proxies) in a local EVM simulation with test balances, and reports owner powers found in the code: pause, blacklist, mint, upgrade, fee setters, issuer seizure functions and known confiscation code. Returns a tier (CRITICAL, WARNING, INFO or UNDETERMINED), reasons, evidence and limitations. Not a guarantee.","tags":["token-security","erc20","base","robinhood-chain","smart-contracts"],"endpoint":"POST /v1/check","price":"$0.01","network":"eip155:84532","input_schema":{"type":"object","additionalProperties":false,"required":["chain","token"],"properties":{"chain":{"type":"string","enum":["base","robinhood"],"description":"Chain the token lives on: Base mainnet (8453) or Robinhood Chain mainnet (4663)."},"token":{"type":"string","pattern":"^0x[0-9a-fA-F]{40}$","description":"Token contract address."}}},"input_example":{"chain":"base","token":"0x820c137fa70c8691f0e44dc420a5e53c168921dc"},"output_schema":{"type":"object","required":["chain","token","tier","verdict","reasons","disclosed_issuer","evidence","limitations","detector","checked_at","cached"],"properties":{"chain":{"type":"string","enum":["base","robinhood"]},"token":{"type":"string","pattern":"^0x[0-9a-f]{40}$"},"tier":{"type":"string","enum":["CRITICAL","WARNING","INFO","UNDETERMINED"],"description":"CRITICAL: a code path can take holder balances. WARNING: owner powers common in legitimate tokens. INFO: none of the tested risks found within the test limits. UNDETERMINED: the balance-taking question could not be answered."},"verdict":{"type":"string","enum":["critical_risk_found","owner_powers_found","no_tested_risk_found","undetermined"]},"reasons":{"type":"array","items":{"type":"object","required":["code","label"],"properties":{"code":{"type":"string"},"label":{"type":"string"}}}},"disclosed_issuer":{"type":"boolean","description":"True only for exact addresses of regulated stablecoin issuers whose seizure powers are publicly documented."},"evidence":{"type":"object","required":["token_code_sha256","runtime_sha256","proxy","block","simulation"],"properties":{"token_code_sha256":{"type":["string","null"],"pattern":"^[0-9a-f]{64}$"},"runtime_sha256":{"type":["string","null"],"pattern":"^[0-9a-f]{64}$"},"proxy":{"type":"object","properties":{"kind":{"type":"string","enum":["direct","direct_with_delegatecall","eip1167_minimal","eip1967","eip1967_beacon","no_code"]},"implementation":{"type":"string"},"beacon":{"type":"string"}}},"block":{"type":"object","required":["number"],"properties":{"number":{"type":"integer"}}},"simulation":{"type":"string","enum":["SYNTHETIC_UNAUTHORIZED_MOVEMENT","NO_WITNESS_WITHIN_BOUNDS","UNKNOWN"]},"owner_functions":{"type":"object","additionalProperties":{"type":"array","items":{"type":"string"}}},"seizure_functions":{"type":"array","items":{"type":"string"}},"witness":{"type":"object","properties":{"actor":{"type":"string"},"sequence":{"type":"array","items":{"type":"string"}}}},"known_actors":{"type":"array","items":{"type":"string"}}}},"limitations":{"type":"array","items":{"type":"object","required":["code","text"],"properties":{"code":{"type":"string"},"text":{"type":"string"}}}},"detector":{"type":"object","required":["version","tiers"],"properties":{"version":{"type":"string"},"tiers":{"type":"string"}}},"checked_at":{"type":"string","format":"date-time"},"cached":{"type":"boolean"}}},"output_example":{"chain":"base","token":"0x820c137fa70c8691f0e44dc420a5e53c168921dc","tier":"WARNING","verdict":"owner_powers_found","reasons":[{"code":"MINT","label":"owner can create new tokens"},{"code":"UPGRADEABLE","label":"code can be replaced by an upgrade"}],"disclosed_issuer":false,"evidence":{"owner_functions":{"MINT":["mint(address,uint256)"],"UPGRADEABLE":["upgradeToAndCall(address,bytes)"]},"simulation":"NO_WITNESS_WITHIN_BOUNDS","token_code_sha256":"c78866360198324d73c63a6fae45acc2fc1efbff7531d663d5d8a90e6b54daa9","runtime_sha256":"cb457a4bfbd1b6ba6cb415384332f00d36ba2961935ec19c3d77f3cb5b6e3832","proxy":{"implementation":"0x191cd41681a3fe15aa15a0bec415821ce24cad5e","kind":"eip1967"},"block":{"number":54478907}},"limitations":[{"code":"DEPLOYER_UNKNOWN","text":"The deployer address was not looked up, so it was not tested as a possible taker."},{"code":"DELEGATECALL_OR_METADATA_OPCODE_REQUIRES_REVIEW","text":"The code can forward calls to other code (DELEGATECALL) that was not fetched."},{"code":"BOUNDED_TEMPLATES_NOT_ALL_FUNCTION_SEQUENCES","text":"Only a fixed set of transfer and allowance call sequences was tried."},{"code":"DEPLOYED_STORAGE_AND_HELPER_CALLABILITY_NOT_PROVEN","text":"Balances were test values; the real contract state was not reproduced."},{"code":"PROXY_STORAGE_NOT_MODELLED","text":"The token is a proxy; its implementation code ran with test storage, not the proxy's real storage."},{"code":"LOCAL_SIMULATION_ONLY","text":"Results come from running the token code in a local simulation with test balances. They are not a guarantee about the token."},{"code":"SELECTOR_INFERENCE","text":"Owner powers are inferred from function selectors found in the bytecode; who is allowed to call them is not proven."},{"code":"PRE_LAUNCH_EVALUATION","text":"This detector version (1.0.0) is still in pre-launch evaluation."}],"detector":{"version":"1.0.0","tiers":"A5-3"},"checked_at":"2026-11-07T21:15:58Z","cached":false},"errors":[{"status":400,"code":"invalid_request","when":"Body is not JSON, has unknown fields, an unsupported chain or a malformed address."},{"status":402,"code":"payment_required","when":"No valid x402 payment attached (standard x402 response)."},{"status":422,"code":"undetermined","when":"The balance-taking question could not be answered. Not charged. The full result (tier UNDETERMINED, with limitations) is in the \"result\" field."},{"status":500,"code":"internal_error","when":"Unexpected error; no answer was produced."},{"status":502,"code":"chain_provider_unavailable","when":"Reading the chain failed. Retry-After is set."},{"status":503,"code":"daily_capacity_reached","when":"Daily provider capacity used up; resets 00:00 UTC. Retry-After is set."},{"status":503,"code":"busy","when":"Another check is running for too long. Retry-After is set."},{"status":503,"code":"analysis_unavailable","when":"The local analysis failed on our side; the simulator was restarted. Retry-After is set."}]}