Security score: confidence and limitations
What the Crius security score can and can't see on Robinhood Chain, how to read its confidence fields, and why a low-risk result is not a guarantee a token is safe.
The score only reports what was checked: a honeypot simulation (only for tokens with a Uniswap v2 WETH pair), taxes measured from real trades, contract code, LP locks Crius recognises, hook history and launch buyers. Read tax.source, tax.confidence, tax.realized.samples and meta.simulation to see how much evidence stands behind each answer. A low risk means no trap was found, not that none exists.
The security score is a summary of evidence, and every piece of evidence has limits. This page lists what each check can miss, which fields show how much evidence stands behind a result, and how to use the score without over-trusting it. Read it before you gate trades, listings or alerts on risk or score.
What each check can miss
| Check | How it works | Can miss (false negatives) |
|---|---|---|
| Honeypot simulation | eth_simulateV1 buy → transfer → approve → sell from a fresh wallet through the Uniswap v2 router, at the current block, for amount_usd (default $100). | Tokens without a v2 WETH pair (v3 / v4 / curve only) are not simulated. Traps that whitelist fresh wallets, trigger later (time, block or trade count), depend on trade size, or block only certain wallets or contracts can pass. |
| Realized honeypot rule | Flags 20+ buys with no successful sell by anyone but the developer. | A brand-new token with fewer than 20 buys can't be flagged by this rule yet. A trap that lets a few insider wallets sell to fake activity can pass. |
| Realized taxes | The median of the latest 50 real trades per side in the last 30 days, compared with what the pool paid out. | A tax raised a minute ago only shows once new trades come in; a median hides a tax charged only on some trades (large sells, specific wallets). max_sell_pct_seen shows the worst single trade. |
| Contract powers | Function selectors found in the token's code (and its implementation, for proxies): mint, blacklist, pause, tax changes, limits, self-destruct. | Powers behind renamed or obfuscated functions, or in another contract the token calls. An upgradeable proxy can change all of this later (it is flagged as upgradeable_proxy). |
| Liquidity locks | LP held by burn addresses and by lockers Crius recognises (registry lockers and launchpad lock contracts). | A lock in a contract Crius doesn't know shows as held by that contract, so locks can be understated, not overstated. A lock can expire: check next_unlock_ts. |
| Uniswap v4 hook | The hook's code, permissions, owner, its own pools' outcomes and its code family's history. | A new hook with no history gets new_unknown, not a verdict. Clean history doesn't stop an owner-controlled hook from changing behaviour later. |
| Launch risk | Buyers in the first 10 blocks, wallet farms, uniform balances and LP concentration. | Insiders who fund wallets through exchanges, bridges or relayers look unrelated, and buyers after block 10 aren't counted as snipers. |
How to read the confidence fields
Every security response carries the evidence behind its answer. Check these before you trust a verdict:
tax.source:realized(measured from real trades),realized+simulated(measured, and the simulation agrees),simulated(no recent trades, simulation only) ornone(neither: the tax is unknown, not zero).tax.confidence:highwith 20 or more measured trades,mediumwith 3 or more,lowbelow that. Alowconfidence tax of 0% says little.tax.realized.samples: how many buys and sells the realized numbers come from, andmax_sell_pct_seen, the worst single sell.meta.simulation:eth_simulateV1 via Uniswap V2 router at headwhen a simulation ran, orno V2 WETH pair: realized tax onlywhen it couldn’t.honeypot.reason: which check made the call (simulated sell failedorbuys but no successful sells by non-dev wallets).hook.observedandhook.family: how many traded pools the hook verdict rests on.
Little evidence: a token with no simulation
Recast (0xb656eadd009b3b409d7a0971e50df2f0e4ddef5a) trades only on Uniswap v4. Which parts of its verdict are measured, and which are missing?
curl "https://api.crius.sh/v1/robinhood/token/0xb656eadd009b3b409d7a0971e50df2f0e4ddef5a/security"const res = await fetch("https://api.crius.sh/v1/robinhood/token/0xb656eadd009b3b409d7a0971e50df2f0e4ddef5a/security");const { data, meta } = await res.json();import requests
r = requests.get( "https://api.crius.sh/v1/robinhood/token/0xb656eadd009b3b409d7a0971e50df2f0e4ddef5a/security",)body = r.json()print(body["data"])Real response 200 Captured Oct 28, 2026 · 188 lines (arrays trimmed)
{ "data": { "contract": { "blacklist": false, "can_change_limits": false, "can_change_tax": false, "cooldown": false, "implementation": null, "is_proxy": false, "mintable": false, "owner": null, "ownership": "none", "pausable": false, "proxy_kind": null, "self_destruct": false, "trading_switch": false, "upgradeable": false, "verified": null }, "flags": [ "tax_over_5pct", "unverified" ], "honeypot": { "is_honeypot": false, "reason": null, "selective": false }, "hook": { "address": "0xe5e702641ea86f4ae6cc3cdaed2b886f976be044", "capabilities": { "can_block_swaps": false, "can_gate_liquidity": false, "can_modify_liquidity_amounts": false, "can_modify_swap_amounts": true }, "code": { "admin_functions": [], "checked_ts": 1793207140434, "code_hash": "0xc21b1e6c1b45403e81a581f22ed6d9c747997af1cfdac1b1dc9f4b1d346a10db", "family": "0xabda3266e50c", "kind": "contract", "logic": null, "owner": "0x263ed295dafae1d9aadd6e56c4b6f9f38ee019dd", "ownership": "active", "size": 15167 }, "family": { "honeypot_pct": 0, "hooks": 22, "id": "0xabda3266e50c", "liquidity_pulled_pct": 0.684086, "pools_traded": 10525, "taxed_pct": 51.9715, "verified_hooks": 1 }, "flags": [], "name": "PonsV2MemeHook", "observed": { "dynamic_tax_pools": 13, "first_trade_ts": 1785866942000, "honeypot_pools": 0, "last_trade_ts": 1793223683000, "liquidity_pulled_pct": 0.66813, "liquidity_pulled_pools": 70, "max_buy_tax_pct": 10.99, "max_sell_tax_pct": 0.7, "median_pool_life_min": 53423.5, "pools": 10478, "pools_traded": 10477, "tax_measured_pools": 10392, "taxed_10pct_pools": 35, "taxed_pools": 5463, "volume_usd": 5384607135 }, "pattern": { "description": "hooks that change swap amounts only", "honeypot_pct": 0.0696347, "id": "swap_delta_only", "liquidity_pulled_pct": 7.93603, "pools_traded": 43082, "taxed_pct": 15.7537 }, "permissions": [ "beforeInitialize", "afterSwap", "afterSwapReturnDelta" ], "risk": [ "can_modify_swap_amounts" ], "risk_level": "low" }, "known_asset": false, "launch": { "flags": [], "lp_top_wallet": { "address": "0x441568fdd10b00ddc90b4a95aee03d8d06242283", "liquidity_usd": 2.08528, "pct": 0.0195019 }, "sniper_supply_pct": 0.61622, "sniper_top_wallet_pct": 0.61622, "sniper_wallets": 1, "sniper_window_blocks": 10, "uniform_holders": null, "wallet_farm": null }, "limits": {}, "liquidity": { "status": "locked", "summary": { "burned_pct": 0, "locked_pct": 99.9805, "next_unlock_ts": null, "protocol_fee_pct": 0, "unlocked_in_wallets_pct": 0.019502, "weighting": "by pool liquidity_usd" } }, "primary_dex": "uniswap_v4", "risk": "low", "score": 80, "tax": { "buy_pct": 6.99, "confidence": "high", "realized": { "buy_pct": 6.99, "by_wallet_class": { "dev_sell_pct": null, "others_sell_pct": 0 }, "last_sample_ts": 1793223683000, "max_sell_pct_seen": 1, "samples": { "buys": 1107, "sells": 530 }, "sell_pct": 0, "window": "30d" }, "sell_pct": 0, "simulated": null, "source": "realized", "transfer_pct": null }, "tax_history": [ { "from_block": 82850924, "pct": 0, "side": "buy" }, { "from_block": 82929088, "pct": 0, "side": "sell" }, { "from_block": 85677230, "pct": 1, "side": "buy" }, { "from_block": 85686101, "pct": 0, "side": "buy" }, { "from_block": 90626923, "pct": 7, "side": "buy" } ], "tax_history_total": 9, "tax_mode": "dynamic", "token": "0xb656eadd009b3b409d7a0971e50df2f0e4ddef5a" }, "meta": { "block": 100406621, "block_age_ms": 400, "block_ts": 1793225060000, "chain": "robinhood", "finalized_block": 100397649, "lag_ms": 10, "safe_block": 100401329, "simulation": "no V2 WETH pair: realized tax only" }}What this tells you
tax.simulated: nullandmeta.simulation: "no V2 WETH pair: realized tax only": no buy-and-sell simulation ran, because the token has no v2 WETH pair.tax.source: "realized"withtax.confidence: "high": the 6.99% buy tax and 0% sell tax are measured from real trades (tax.realized.samples), so the tax answer is solid even without a simulation.- The honeypot verdict rests on the realized rule only: real wallets have sold, so it isn’t a honeypot for them. A trap that targets only some wallets would not show here.
Timing: how fresh a result is
- Results are cached for 15 seconds per token and
amount_usd. On paid plans,fresh=1skips the cache and simulates again at the current block (20 credits). - The simulation runs at the current block only. It says nothing about what the owner can switch on tomorrow; that is what the contract-power and proxy flags are for.
- Realized taxes cover the last 30 days; older trades only appear in
tax_history. - Every response’s
meta.blocktells you the block the answer was read at. Store it with any decision you make.
Use the score safely
-
Gate on
risk, then read the evidence. Blockcriticalandhigh. Forlowandmedium, checktax.confidenceandmeta.simulationbefore treating the tax as known. -
Treat missing evidence as unknown, not as safe.
tax.source: "none",tax.confidence: "low"or no simulation on a token with few trades means “not enough data yet”, not “no tax”. -
Re-check before every trade on new tokens. Taxes, LP locks and hook behaviour can change after launch. Re-call
/security(or subscribe totax:andlp:events on the WebSocket stream) instead of caching a verdict for hours. -
Size for being wrong. Use the score to remove obvious traps, combine it with holder and launch data (bundles and snipers, holders), and never risk more than you can lose on a token the checks can’t fully see.
Frequently asked questions
Can a token with a score of 100 be a scam?
Yes. The score finds known trap mechanics on-chain. It can't see a team that abandons the project, a coordinated dump by wallets that look unrelated, a trap that turns on later, or a contract that treats some wallets differently from the ones the checks use. Treat the score as a filter that removes obvious traps, then size positions as if it could be wrong.
Why is `tax.simulated` null for my token?
The buy-and-sell simulation runs through the Uniswap v2 router, so it needs a v2 pool against WETH with liquidity. Tokens that trade only on Uniswap v3 or v4, or still on a launchpad curve, get no simulation; meta.simulation says no V2 WETH pair: realized tax only and the verdict rests on real trades alone.
How fresh is a security result?
Results are cached for 15 seconds per token and trade size, so they are close to live. Taxes come from the last 30 days of trades (the median of the latest 50 per side), so a tax change shows up as new trades arrive, not instantly. On paid plans fresh=1 skips the cache and simulates again at the current block.
Which result fields tell me how confident the answer is?
tax.source (realized, realized+simulated, simulated or none), tax.confidence (high with 20+ measured trades, medium with 3+, low below that), tax.realized.samples (buy and sell counts), meta.simulation (whether a simulation ran) and, for the hook, hook.observed and hook.family (how much history the verdict is based on).
Related
Get your free Crius API key
Every example on this page works with a free key: higher rate limits than the anonymous plan, holders, wallets and the WebSocket stream. No card needed.
- Robinhood Chain (4663) only, from our own archive nodes
- REST + WebSocket
- Pay on-chain or by card