How to detect a honeypot token on Robinhood Chain
Check whether a Robinhood Chain token can be sold before you buy it. One API call simulates a buy and a sell and checks real trades; a real honeypot example shows the evidence.
Call GET /v1/robinhood/token/{address}/security and read honeypot.is_honeypot. It is true when a simulated sell at the latest block fails (honeypot.reason: "simulated sell failed", with the revert in tax.simulated.revert_reason), or when 20+ buys have no sells at all; honeypot.selective is true when only the developer has sold. A honeypot always gets risk: "critical". No API key needed.
A honeypot is a token you can buy but can’t sell: the price chart looks healthy because every trade is a buy, and the money stays in the pool. Crius checks this two ways for every Robinhood Chain token. It simulates a real buy, transfer and sell at the latest block, and it looks at who has actually managed to sell. If either test fails, honeypot.is_honeypot is true and the token’s risk is critical, whatever else it has going for it.
Check if a token can be sold
Crius flags Let's End AI (ENDAI) as a honeypot
Let's End AI (0xc882f10529a5518ee3393af5a80e9ff00d38d44b) has burned liquidity and a renounced owner. Can I sell it?
curl "https://api.crius.sh/v1/robinhood/token/0xc882f10529a5518ee3393af5a80e9ff00d38d44b/security"const res = await fetch("https://api.crius.sh/v1/robinhood/token/0xc882f10529a5518ee3393af5a80e9ff00d38d44b/security");const { data, meta } = await res.json();import requests
r = requests.get( "https://api.crius.sh/v1/robinhood/token/0xc882f10529a5518ee3393af5a80e9ff00d38d44b/security",)body = r.json()print(body["data"])Real response 200 Captured Oct 28, 2026 · 140 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": "0x0000000000000000000000000000000000000000", "ownership": "renounced", "pausable": false, "proxy_kind": null, "self_destruct": false, "trading_switch": true, "upgradeable": false, "verified": "none" }, "flags": [ "honeypot", "unverified", "uniform_holders" ], "honeypot": { "is_honeypot": true, "reason": "simulated sell failed", "selective": false }, "hook": null, "known_asset": false, "launch": { "flags": [ "uniform_holders" ], "lp_top_wallet": { "address": "0xabe3a51937eb4c76ab6449e9823dbffd4409776f", "liquidity_usd": 8.58651, "pct": 0.0253312 }, "sniper_supply_pct": 0.000299049, "sniper_top_wallet_pct": 0.000299049, "sniper_wallets": 1, "sniper_window_blocks": 10, "uniform_holders": { "balance_pct": 0.112731, "holders": 51, "of_top": 100 }, "wallet_farm": null }, "limits": { "max_tx": "1000000000", "max_tx_getter": "maxTxAmount()", "max_tx_pct": 100, "max_wallet": "1000000000", "max_wallet_getter": "maxWalletSize()", "max_wallet_pct": 100 }, "liquidity": { "status": "burned", "summary": { "burned_pct": 99.9715, "locked_pct": 0, "next_unlock_ts": null, "protocol_fee_pct": 0, "unlocked_in_wallets_pct": 0.0284848, "weighting": "by pool liquidity_usd" } }, "primary_dex": "uniswap_v2", "risk": "critical", "score": 0, "tax": { "buy_pct": 0, "confidence": "high", "realized": { "buy_pct": 0, "by_wallet_class": { "dev_sell_pct": null, "others_sell_pct": 0 }, "last_sample_ts": 1793224820000, "max_sell_pct_seen": 0, "samples": { "buys": 27197, "sells": 3423 }, "sell_pct": 0, "window": "30d" }, "sell_pct": 0, "simulated": { "amount_eth": 0.042454083286938696, "buy_gas": 159144, "buy_pct": 0, "can_buy": true, "can_sell": false, "can_transfer": true, "from": "eoa", "revert_reason": { "code": 3, "data": "0x08c379a0000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000245472616e7366657248656c7065723a205452414e534645525f46524f4d5f4641494c454400000000000000000000000000000000000000000000000000000000", "message": "execution reverted: TransferHelper: TRANSFER_FROM_FAILED" }, "router": "0x89e5db8b5aa49aa85ac63f691524311aeb649eba", "sell_gas": 229228, "sell_pct": null, "transfer_pct": 0 }, "source": "realized", "transfer_pct": 0 }, "tax_history": [ { "from_block": 62239227, "pct": 0, "side": "buy" }, { "from_block": 62240181, "pct": 0, "side": "sell" } ], "tax_history_total": 2, "tax_mode": "static", "token": "0xc882f10529a5518ee3393af5a80e9ff00d38d44b" }, "meta": { "block": 100406838, "block_age_ms": 1257, "block_ts": 1793225081000, "chain": "robinhood", "finalized_block": 100397649, "lag_ms": 14, "safe_block": 100401329, "simulation": "eth_simulateV1 via Uniswap V2 router at head" }}What this tells you
honeypot.is_honeypot: true,reason: "simulated sell failed",score: 0,risk: "critical".- The evidence is in
tax.simulated:can_buy: trueandcan_transfer: true, butcan_sell: false. Buying about 0.042 ETH worth (amount_eth) and sending tokens to another wallet work; selling them back reverts with"execution reverted: TransferHelper: TRANSFER_FROM_FAILED". The router couldn’t move the tokens from the seller into the pool: the token’stransferFromfailed. meta.simulation: "eth_simulateV1 via Uniswap V2 router at head": the test ran against the live chain state through the Uniswap v2 router0x89e5db8b5aa49aa85ac63f691524311aeb649eba.- What looks safe doesn’t help:
contract.ownership: "renounced"(owner0x0000000000000000000000000000000000000000),liquidity.status: "burned"(99.97%) and a 0% buy tax. contract.trading_switch: true: the code includes a trading switch (a function such asopenTrading()), common in contracts that control who can trade.launch.uniform_holders: 51 of the top 100 holders hold nearly the same amount (about 0.113% of supply each), which costs another 30 points.
The market agrees: 150 buyers and no sellers in 24 hours
What do Let's End AI's (0xc882f10529a5518ee3393af5a80e9ff00d38d44b) recent trades look like?
curl "https://api.crius.sh/v1/robinhood/token/0xc882f10529a5518ee3393af5a80e9ff00d38d44b"const res = await fetch("https://api.crius.sh/v1/robinhood/token/0xc882f10529a5518ee3393af5a80e9ff00d38d44b");const { data, meta } = await res.json();import requests
r = requests.get( "https://api.crius.sh/v1/robinhood/token/0xc882f10529a5518ee3393af5a80e9ff00d38d44b",)body = r.json()print(body["data"])Real response 200 Captured Oct 28, 2026 · 303 lines (arrays trimmed)
{ "data": { "address": "0xc882f10529a5518ee3393af5a80e9ff00d38d44b", "admin_flags": null, "bundles": { "see": "/v1/robinhood/token/0xc882f10529a5518ee3393af5a80e9ff00d38d44b/bundles" }, "burned": 0, "chain_id": 4663, "circulating_supply": 1000000000, "creation": { "attribution": "direct", "block": 62239223, "deployed_via": "direct", "deployer": "0xb9707a550b874137da35bbcbbb0f6992a8f5e84b", "factory": null, "source": "trace", "tx": "0xc3e87157315181f6982525fa677d217f1b6a0b863eafd19c358f2946312b3f2f" }, "decimals": 9, "dexscreener": { "boosts": { "active_amount": null, "active_seen_ts": null, "count": 1, "last_ts": 1789335376746, "total_amount": 100 }, "checked_ts": 1793040466789, "community_takeover": false, "community_takeover_ts": null, "confirmed": true, "dex_paid": true, "dex_paid_ts": 1789332236212, "orders": [ { "payment_ts": 1789332236212, "status": "approved", "type": "tokenProfile" } ], "profile": { "description": null, "header": "https://cdn.dexscreener.com/cms/images/gvWC0hpE9DWAKeSG?width=1500&height=500&quality=95&format=auto", "icon": "https://cdn.dexscreener.com/cms/images/BunNPZVadA3UN23s?width=800&height=800&quality=95&format=auto", "links": [ { "label": "Website", "type": "website", "url": "https://www.letsendai.fun" }, { "type": "twitter", "url": "https://x.com/letsendaix" } ] }, "url": "https://dexscreener.com/robinhood/0xc882f10529a5518ee3393af5a80e9ff00d38d44b" }, "first_seen_block": 62239223, "history": "complete", "holders": { "burned_pct": 0, "count": 12467, "dev_holding": null, "dev_pct": null, "locked_pct": 0, "top10_pct": 65.7728 }, "launch": null, "liquidity": { "see": "/v1/robinhood/token/0xc882f10529a5518ee3393af5a80e9ff00d38d44b/liquidity", "status": "burned", "summary": { "burned_pct": 99.9715, "locked_pct": 0, "next_unlock_ts": null, "protocol_fee_pct": 0, "unlocked_in_wallets_pct": 0.0284847, "weighting": "by pool liquidity_usd" } }, "locked": 0, "market": { "fdv_usd": 890863960, "liquidity_usd": 33898.9, "market_cap_usd": 890863960, "pools_count": 45, "quote_liquidity_usd": 16949.4 }, "metadata": { "banner": "https://cdn.dexscreener.com/cms/images/gvWC0hpE9DWAKeSG?width=1500&height=500&quality=95&format=auto", "description": null, "links": { "discord": null, "farcaster": null, "github": null, "telegram": null, "twitter": "https://x.com/letsendaix", "website": "https://www.letsendai.fun" }, "logo": "https://api.crius.sh/v1/robinhood/logo/0xc882f10529a5518ee3393af5a80e9ff00d38d44b.png?size=128", "logo_original": "https://cdn.dexscreener.com/cms/images/BunNPZVadA3UN23s?width=800&height=800&quality=95&format=auto", "socials": { "discord": null, "farcaster": null, "github": null, "telegram": null, "twitter": null, "website": null }, "source": null, "sources": { "links": "dexscreener", "logo": "dexscreener" } }, "name": "Let's End AI", "price": { "ath_market_cap_usd": 890863960, "ath_scope": "all_time", "ath_ts": 1793225323000, "ath_usd": 0.890864, "change_pct": { "1h": -0.371574, "1m": -0.595507, "1s": -0.595507, "24h": 2.18224, "30s": -0.595507, "4h": 1.26767, "5m": -0.595507, "6h": 2.21205 }, "confidence": "high", "dex": "uniswap_v2", "eth": 0.000378207, "liquidity_usd": 33887.4, "quote": "0x0bd7d308f8e1639fab988df18a8011f41eacad73", "quote_liquidity_usd": 16943.7, "source_pool": "0x3d3d2ef643dfe12a0a15c51b34284025f048d7f0", "thin_liquidity": false, "usd": 0.890864 }, "security": { "see": "/v1/robinhood/token/0xc882f10529a5518ee3393af5a80e9ff00d38d44b/security" }, "standard": "erc20", "stats": { "all_time": { "buy_volume_usd": 4893579, "buys": 27252, "first_trade_ts": 1789331187000, "sell_volume_usd": 4876381, "sells": 3503, "since": "chain_start", "trades": 30755, "volume_usd": 9769960 }, "avg_trade_usd": { "1h": 0.694851, "1m": null, "1s": null, "24h": 0.964906, "30s": null, "4h": 0.902284, "5m": null, "6h": 0.942947 }, "buy_volume_usd": { "1h": 12.5073, "1m": 0, "1s": 0, "24h": 181.402, "30s": 0, "4h": 97.4467, "5m": 0, "6h": 120.697 }, "buyers": { "1h": 18, "1m": 0, "1s": 0, "24h": 150, "30s": 0, "4h": 86, "5m": 0, "6h": 100 }, "buys": { "1h": 18, "1m": 0, "1s": 0, "24h": 188, "30s": 0, "4h": 108, "5m": 0, "6h": 128 }, "last_trade_ts": 1793224820000, "sell_volume_usd": { "1h": 0, "1m": 0, "1s": 0, "24h": 0, "30s": 0, "4h": 0, "5m": 0, "6h": 0 }, "sellers": { "1h": 0, "1m": 0, "1s": 0, "24h": 0, "30s": 0, "4h": 0, "5m": 0, "6h": 0 }, "sells": { "1h": 0, "1m": 0, "1s": 0, "24h": 0, "30s": 0, "4h": 0, "5m": 0, "6h": 0 }, "traders": { "1h": 18, "1m": 0, "1s": 0, "24h": 150, "30s": 0, "4h": 86, "5m": 0, "6h": 100 }, "trades": { "1h": 18, "1m": 0, "1s": 0, "24h": 188, "30s": 0, "4h": 108, "5m": 0, "6h": 128 }, "txns": { "1h": 18, "1m": 0, "1s": 0, "24h": 188, "30s": 0, "4h": 108, "5m": 0, "6h": 128 }, "volume_eth": { "1h": 0.00530164, "1m": 0, "1s": 0, "24h": 0.0772172, "30s": 0, "4h": 0.0413886, "5m": 0, "6h": 0.0513545 }, "volume_usd": { "1h": 12.5073, "1m": 0, "1s": 0, "24h": 181.402, "30s": 0, "4h": 97.4467, "5m": 0, "6h": 120.697 } }, "symbol": "ENDAI", "total_supply": 1000000000, "type": "generic", "ui_multiplier": null, "verification": { "compiler": null, "contract_name": null, "implementation": null, "is_proxy": false, "sourcify": "none" } }, "meta": { "block": 100409183, "block_age_ms": 985, "block_ts": 1793225323000, "chain": "robinhood", "finalized_block": 100401329, "lag_ms": 78, "pending": [], "safe_block": 100405028 }}What this tells you
stats.buyers["24h"]: 150andstats.buys["24h"]: 188, againststats.sellers["24h"]: 0andstats.sells["24h"]: 0. Nobody has sold in a day of steady buying.stats.all_timecounts 3,503 sells against 27,252 buys, so selling worked at some point. A sell that worked last month is no proof it works today, which is why the simulation runs at the latest block.market.market_cap_usdis about $890.9 million onmarket.liquidity_usdof about $33,899. A price that only goes up because no one can sell produces numbers like these.
How the verdict is decided
| Test | Honeypot when | Where to look |
|---|---|---|
| Sell simulation | A simulated buy works but the sell reverts or returns no ETH. Runs only when the token has a Uniswap v2 WETH pair. | tax.simulated.can_sell, revert_reason, meta.simulation |
| Real trades | 20+ buys and no sells at all. | tax.realized.samples, honeypot.reason |
| Selective sells | 20+ buys and only the developer has sold (selective_honeypot, −60 points). | honeypot.selective, tax.realized.by_wallet_class.dev_sell_pct |
| The pool's v4 hook | The hook has no code, is a delegated wallet, or many of its own or its code family's pools had 10+ buys and no sells (hook_critical_risk, −60 points). | hook.risk_level, hook.flags |
A failed simulation or a market with no sellers sets honeypot.is_honeypot and takes the full 100 points. The hook test doesn’t set is_honeypot itself, but a critical hook makes the token risk: "high". See Check the risk of a Uniswap v4 hook.
The simulation uses a $100 trade by default; pass amount_usd to test the size you plan to trade, since some contracts cap how much one transaction can move (see limits). Results are cached briefly; fresh=1 forces a new simulation (Starter plan, 20 credits).
Use it in your app
-
Check before the first buy. Call
/securityfor every token a user or bot is about to buy. It’s on the anonymous plan, 1 credit with a key. -
Block on
honeypot.is_honeypotorhoneypot.selective. Don’t rely onriskalone for this: a honeypot is alwayscritical, but you want to say why. -
Show the evidence. Quote
honeypot.reasonand, when present,tax.simulated.revert_reason.message, so users see it’s a measured result. -
Re-check before selling large amounts. A token can turn into a honeypot after launch (
contract.trading_switch,contract.blacklist). Re-run the check, withamount_usdset to the sell size.
# Refuse to buy tokens that can't be sold.import requests
token = "0xc882f10529a5518ee3393af5a80e9ff00d38d44b" # Let's End AIdata = requests.get(f"https://api.crius.sh/v1/robinhood/token/{token}/security").json()["data"]
hp = data["honeypot"]if hp["is_honeypot"] or hp["selective"]: revert = (data["tax"]["simulated"] or {}).get("revert_reason") why = revert.get("message") if isinstance(revert, dict) else revert raise SystemExit(f"honeypot: {why or hp['reason'] or 'only the developer has sold'}")print("no honeypot found:", data["meta"]["simulation"])Frequently asked questions
How do I check if a Robinhood Chain token is a honeypot?
Call GET https://api.crius.sh/v1/robinhood/token/{address}/security (no key needed). If honeypot.is_honeypot is true, don't buy: honeypot.reason says whether the simulated sell failed or real buyers haven't been able to sell. honeypot.selective: true means only the developer has sold.
Can a token with burned liquidity and a renounced contract be a honeypot?
Yes. Let's End AI (0xc882f10529a5518ee3393af5a80e9ff00d38d44b) has 99.97% of its liquidity burned and its owner set to the zero address, and Crius still flags it as a honeypot because the simulated sell reverts. Burned liquidity means the pool can't be pulled; it says nothing about whether the token lets you sell into it.
What is a selective honeypot?
A token where the developer has sold but no one else has, across 20+ buys. Crius reports it as honeypot.selective: true with the selective_honeypot flag (−60 points). It usually means a whitelist: the contract lets chosen wallets sell and blocks the rest.
Why does the response say 'no V2 WETH pair, realized tax only'?
The sell simulation runs through the Uniswap v2 router, so it needs a v2 pair with WETH. Tokens that only trade on Uniswap v4 (most graduated launchpad tokens) are judged from real trades instead: 20+ buys and no sells is a honeypot, and sells by the developer only is a selective honeypot. Their pool's hook is checked too: hooks whose pools trap buyers are flagged honeypot_observed.
I think a token is wrongly flagged. What can I do?
Look at the evidence first: honeypot.reason, tax.simulated.revert_reason and tax.realized.samples. With a key on the Starter plan or higher, ?fresh=1 re-runs the simulation now (20 credits). If the verdict still looks wrong, email support@crius.sh with the token address.
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