Check the risk of a Uniswap v4 hook
Find out what a Robinhood Chain token's Uniswap v4 hook can do and what happened in its pools (taxes, honeypots, rugs). Real examples, including critical hooks.
Call GET /v1/robinhood/token/{address}/security and read hook: its risk_level (low, medium, high, critical), flags with evidence, decoded permissions and capabilities, its code, what happened in its pools (observed) and its code family's record. For any hook address, GET /v1/robinhood/hook/{address} returns the same and more (Free plan, 2 credits); GET /v1/robinhood/hooks lists every hook on chain.
A Uniswap v4 hook is a contract that a pool calls on every swap or liquidity change. It is how launchpads take their fee, and also how a pool can tax, reprice or block trades without the token contract doing anything. Crius inspects every hook on Robinhood Chain: what its address allows it to do, what code sits there and who owns it, and what has actually happened in the pools that use it. The result is a risk_level and a list of flags, each with the evidence behind it.
Check a token’s hook in one call
A hook that taxes: Ruby's pool, medium risk
Ruby (0x8b5a7a19fbd3d8e8422643fc229b3ab08697c0be) trades in a Uniswap v4 pool with an unnamed hook. What can the hook do?
curl "https://api.crius.sh/v1/robinhood/token/0x8b5a7a19fbd3d8e8422643fc229b3ab08697c0be/security"const res = await fetch("https://api.crius.sh/v1/robinhood/token/0x8b5a7a19fbd3d8e8422643fc229b3ab08697c0be/security");const { data, meta } = await res.json();import requests
r = requests.get( "https://api.crius.sh/v1/robinhood/token/0x8b5a7a19fbd3d8e8422643fc229b3ab08697c0be/security",)body = r.json()print(body["data"])Real response 200 Captured Oct 28, 2026 · 191 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": "0x000000000000000000000000000000000000dead", "ownership": "renounced", "pausable": false, "proxy_kind": null, "self_destruct": false, "trading_switch": false, "upgradeable": false, "verified": "none" }, "flags": [ "tax_over_5pct", "hook_can_block_swaps", "hook_medium_risk", "unverified" ], "honeypot": { "is_honeypot": false, "reason": null, "selective": false }, "hook": { "address": "0x97240e95756c7b70db1ffaeee85a6c091c33a4ce", "capabilities": { "can_block_swaps": true, "can_gate_liquidity": false, "can_modify_liquidity_amounts": true, "can_modify_swap_amounts": true }, "code": { "admin_functions": [], "checked_ts": 1793207142599, "code_hash": "0x5cb5a35842eb82ff5c9dbed2dca84d023823d841a2c0fc642568bc8ff276f72f", "family": "0xaa8854cbf2bd", "kind": "contract", "logic": null, "owner": "0x33acedd086ee7fec19764b5f4a93a6ef067953f5", "ownership": "active", "size": 24040 }, "family": { "honeypot_pct": 0, "hooks": 3, "id": "0xaa8854cbf2bd", "liquidity_pulled_pct": 0, "pools_traded": 10, "taxed_pct": 90, "verified_hooks": 0 }, "flags": [ { "evidence": "7 of its 7 measured pools take 1%+ per trade (median per pool, up to 6.3%); only 10.83% of traded hooked pools tax at all", "flag": "tax_observed", "severity": "medium" }, { "evidence": "can take part of every swap (return delta); 4.55% of traded pools of hooks that can block swaps and change swap amounts taxed, 0.61% became honeypots", "flag": "can_modify_swap_amounts", "severity": "low" } ], "name": null, "observed": { "dynamic_tax_pools": 0, "first_trade_ts": 1793119940000, "honeypot_pools": 0, "last_trade_ts": 1793223286000, "liquidity_pulled_pct": 0, "liquidity_pulled_pools": 0, "max_buy_tax_pct": 2.545, "max_sell_tax_pct": 6.28, "median_pool_life_min": 1380, "pools": 18, "pools_traded": 8, "tax_measured_pools": 7, "taxed_10pct_pools": 0, "taxed_pools": 7, "volume_usd": 924751 }, "pattern": { "description": "hooks that can block swaps and change swap amounts", "honeypot_pct": 0.608377, "id": "before_swap_with_delta", "liquidity_pulled_pct": 21.5893, "pools_traded": 18574, "taxed_pct": 4.55475 }, "permissions": [ "beforeInitialize", "afterAddLiquidity", "beforeSwap", "afterSwap", "beforeSwapReturnDelta" ], "risk": [ "can_block_or_reprice_swaps", "can_modify_swap_amounts", "can_modify_liquidity_amounts", "unverified" ], "risk_level": "medium" }, "known_asset": false, "launch": { "flags": [], "lp_top_wallet": { "address": "0x20ac92362ead44f457913ca1a6c24fae049078d9", "liquidity_usd": 23.0571, "pct": 0.214633 }, "sniper_supply_pct": 1.77655, "sniper_top_wallet_pct": 1.77655, "sniper_wallets": 1, "sniper_window_blocks": 10, "uniform_holders": null, "wallet_farm": null }, "limits": {}, "liquidity": { "status": "partially_locked", "summary": { "burned_pct": 99.2777, "locked_pct": 0, "next_unlock_ts": null, "protocol_fee_pct": 0, "unlocked_in_wallets_pct": 0.722259, "weighting": "by pool liquidity_usd" } }, "primary_dex": "uniswap_v4", "risk": "medium", "score": 70, "tax": { "buy_pct": 0.84, "confidence": "high", "realized": { "buy_pct": 0.84, "by_wallet_class": { "dev_sell_pct": null, "others_sell_pct": 5.28 }, "last_sample_ts": 1793221716000, "max_sell_pct_seen": 16.65, "samples": { "buys": 8, "sells": 240 }, "sell_pct": 5.28, "window": "30d" }, "sell_pct": 5.28, "simulated": null, "source": "realized", "transfer_pct": null }, "tax_history": [ { "from_block": 99421932, "pct": 5, "side": "sell" }, { "from_block": 99791485, "pct": 1, "side": "buy" } ], "tax_history_total": 2, "tax_mode": "static", "token": "0x8b5a7a19fbd3d8e8422643fc229b3ab08697c0be" }, "meta": { "block": 100406622, "block_age_ms": 595, "block_ts": 1793225060000, "chain": "robinhood", "finalized_block": 100397649, "lag_ms": 100, "safe_block": 100401329, "simulation": "no V2 WETH pair: realized tax only" }}What this tells you
hook.address: "0x97240e95756c7b70db1ffaeee85a6c091c33a4ce",name: null: not a known launchpad or protocol hook.hook.risk_level: "medium".hook.capabilities:can_block_swaps,can_modify_swap_amountsandcan_modify_liquidity_amountsare alltrue.permissionsincludebeforeSwapandbeforeSwapReturnDelta: it runs before every swap and can change the amounts.- The
mediumcomes from what it did, not what it could do. Thetax_observedflag’s evidence: “7 of its 7 measured pools take 1%+ per trade (median per pool, up to 6.3%); only 10.83% of traded hooked pools tax at all”.observed.max_sell_tax_pct: 6.28matches the token’stax.sell_pct: 5.28. observed.honeypot_pools: 0andliquidity_pulled_pools: 0over 8 traded pools: no trapped buyers and no rugs so far.code.ownership: "active"with owner0x33acedd086ee7fec19764b5f4a93a6ef067953f5, andcode.admin_functions: []: an owner exists, but no fee setter, pause, blacklist or withdraw function was found in its code.pattern.id: "before_swap_with_delta": across 18,574 traded pools of hooks with these permissions, 0.61% became honeypots and 21.59% had liquidity pulled.- On the token:
hook_medium_risk(−10 points) andhook_can_block_swaps(for information, 0 points).
The most-used hooks on Robinhood Chain
Which hooks do most v4 pools use, and how risky are they?
curl "https://api.crius.sh/v1/robinhood/hooks?limit=3" \ -H "x-api-key: $CRIUS_API_KEY"const res = await fetch("https://api.crius.sh/v1/robinhood/hooks?limit=3", { headers: { "x-api-key": process.env.CRIUS_API_KEY },});const { data, meta } = await res.json();import os, requests
r = requests.get( "https://api.crius.sh/v1/robinhood/hooks?limit=3", headers={"x-api-key": os.environ["CRIUS_API_KEY"]},)body = r.json()print(body["data"])Real response 200 Captured Oct 28, 2026 · 258 lines (arrays trimmed)
{ "data": [ { "address": "0x4e3468951d49f2eea976ed0d6e75ffcb44a9a544", "attribution": "unattributed", "capabilities": { "can_block_swaps": false, "can_gate_liquidity": false, "can_modify_liquidity_amounts": false, "can_modify_swap_amounts": true }, "code": { "admin_functions": [], "checked_ts": 1793207143998, "code_hash": "0xc41a91106002f15bf70ae266824317f3f3ac638ac72ca5253bae395fa47ee631", "family": "0xaa37a5a3457a", "kind": "contract", "logic": null, "owner": null, "ownership": "none", "size": 25533 }, "events_sample": [ "Swap", "ModifyLiquidity", "Create" ], "family": { "honeypot_pct": 0.0318652, "hooks": 1, "id": "0xaa37a5a3457a", "liquidity_pulled_pct": 0.0389463, "pools_traded": 28244, "taxed_pct": 1.78091, "verified_hooks": 1 }, "flags": [], "flags_hex": "0x2544", "launchpad": null, "launchpad_name": null, "name": "DopplerHookInitializer", "observed": { "dynamic_tax_pools": 24, "first_trade_ts": 1782922953000, "honeypot_pools": 9, "last_trade_ts": 1793223683000, "liquidity_pulled_pct": 0.0389463, "liquidity_pulled_pools": 11, "max_buy_tax_pct": 99.52, "max_sell_tax_pct": 93.49, "median_pool_life_min": 2138, "pools": 224061, "pools_traded": 28244, "tax_measured_pools": 5814, "taxed_10pct_pools": 29, "taxed_pools": 503, "volume_usd": 1968346259 }, "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", "afterAddLiquidity", "afterRemoveLiquidity" ], "pools": 224090, "risk": [ "can_modify_swap_amounts" ], "risk_level": "low", "stats": { "trades_24h": 59387, "volume_usd_24h": 7478239 }, "verified": true }, { "address": "0x48b8f6ad3a1b4aa477314c9a23035b8f84dde8cc", "attribution": "unattributed", "capabilities": { "can_block_swaps": true, "can_gate_liquidity": true, "can_modify_liquidity_amounts": false, "can_modify_swap_amounts": true }, "code": { "admin_functions": [], "checked_ts": 1793207143709, "code_hash": "0x0883056c4856f8fe464ff49f9c1c028455459dad8ceddcc6d5159259fe51e07f", "family": "0x8f75b80c2683", "kind": "contract", "logic": null, "owner": null, "ownership": "none", "size": 16405 }, "events_sample": [ "ClaimProtocolFees", "PoolInitialized", "PoolCreatedFactory" ], "family": { "honeypot_pct": 3.67232, "hooks": 1, "id": "0x8f75b80c2683", "liquidity_pulled_pct": 1.41243, "pools_traded": 354, "taxed_pct": 0, "verified_hooks": 1 }, "flags": [], "flags_hex": "0x28cc", "launchpad": null, "launchpad_name": null, "name": "ClankerHookStaticFeeV2", "observed": { "dynamic_tax_pools": 0, "first_trade_ts": 1783535745000, "honeypot_pools": 13, "last_trade_ts": 1793222422000, "liquidity_pulled_pct": 1.41243, "liquidity_pulled_pools": 5, "max_buy_tax_pct": 0.99, "max_sell_tax_pct": 0.395, "median_pool_life_min": 6549.5, "pools": 15412, "pools_traded": 354, "tax_measured_pools": 276, "taxed_10pct_pools": 0, "taxed_pools": 0, "volume_usd": 14554905 }, "pattern": { "description": "hooks that can block swaps and change swap amounts", "honeypot_pct": 0.608377, "id": "before_swap_with_delta", "liquidity_pulled_pct": 21.5893, "pools_traded": 18574, "taxed_pct": 4.55475 }, "permissions": [ "beforeInitialize", "beforeAddLiquidity", "beforeSwap" ], "pools": 15412, "risk": [ "can_block_or_reprice_swaps", "can_modify_swap_amounts", "can_gate_liquidity_add" ], "risk_level": "low", "stats": { "trades_24h": 335, "volume_usd_24h": 29851.6 }, "verified": true }, { "address": "0xe5e702641ea86f4ae6cc3cdaed2b886f976be044", "attribution": "known_launchpad", "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 }, "events_sample": [ "HookFeeCollected", "PoolFeesSwept", "PoolRegistered" ], "family": { "honeypot_pct": 0, "hooks": 22, "id": "0xabda3266e50c", "liquidity_pulled_pct": 0.684086, "pools_traded": 10525, "taxed_pct": 51.9715, "verified_hooks": 1 }, "flags": [], "flags_hex": "0x2044", "launchpad": "pons", "launchpad_name": "Pons", "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" ], "pools": 10479, "risk": [ "can_modify_swap_amounts" ], "risk_level": "low", "stats": { "trades_24h": 118712, "volume_usd_24h": 11871071 }, "verified": true } ], "meta": { "block": 100406858, "block_age_ms": 657, "block_ts": 1793225084000, "chain": "robinhood", "finalized_block": 100397649, "intel_computed_ts": 1793223685333, "lag_ms": 221, "next_cursor": "3", "safe_block": 100401329, "total": 29952 }}What this tells you
meta.total: 29952hooks on chain; sorted by pool count, the top three are DopplerHookInitializer (224,090 pools), ClankerHookStaticFeeV2 (15,412) and PonsV2MemeHook (10,479). All three areverified: trueandrisk_level: "low".- ClankerHookStaticFeeV2 (
0x48b8f6ad3a1b4aa477314c9a23035b8f84dde8cc) hascan_block_swaps: trueandcan_gate_liquidity: true, andobserved.honeypot_pools: 13of 354 traded. It stayslow: it’s a verified protocol hook, and 13 of 354 is a small share. - PonsV2MemeHook (
0xe5e702641ea86f4ae6cc3cdaed2b886f976be044) hasattribution: "known_launchpad",launchpad: "pons". Itsfamily.taxed_pctof 51.97 is the launchpad’s own fee, which is why a verified launchpad hook is only flagged for tax when its pools take 10% or more. stats.trades_24handstats.volume_usd_24hshow how active each hook is: 118,712 trades in 24 hours for the Pons hook.
Critical hooks: no code, and a honeypot code family
Which Uniswap v4 hooks on Robinhood Chain are the most dangerous, and why?
curl "https://api.crius.sh/v1/robinhood/hooks?risk_level=high,critical&sort=risk&limit=3" \ -H "x-api-key: $CRIUS_API_KEY"const res = await fetch("https://api.crius.sh/v1/robinhood/hooks?risk_level=high,critical&sort=risk&limit=3", { headers: { "x-api-key": process.env.CRIUS_API_KEY },});const { data, meta } = await res.json();import os, requests
r = requests.get( "https://api.crius.sh/v1/robinhood/hooks?risk_level=high,critical&sort=risk&limit=3", headers={"x-api-key": os.environ["CRIUS_API_KEY"]},)body = r.json()print(body["data"])Real response 200 Captured Oct 28, 2026 · 297 lines (arrays trimmed)
{ "data": [ { "address": "0x00000000000000000000000000000000dead0030", "attribution": "unattributed", "capabilities": { "can_block_swaps": false, "can_gate_liquidity": false, "can_modify_liquidity_amounts": false, "can_modify_swap_amounts": false }, "code": { "admin_functions": [], "checked_ts": 1793208104654, "code_hash": "", "family": null, "kind": "no_code", "logic": null, "owner": null, "ownership": "none", "size": 0 }, "family": null, "flags": [ { "evidence": "no contract at the hook address: v4 calls into it fail, so swaps in its pools revert", "flag": "no_code", "severity": "critical" }, { "evidence": "liquidity was pulled in 142 of its 143 traded pools", "flag": "rugs_observed", "severity": "high" }, { "evidence": "tax swung by 5%+ within 22 of its 124 measured pools", "flag": "dynamic_tax", "severity": "medium" } ], "flags_hex": "0x30", "launchpad": null, "launchpad_name": null, "name": null, "observed": { "dynamic_tax_pools": 22, "first_trade_ts": 1786194462000, "honeypot_pools": 0, "last_trade_ts": 1792690001000, "liquidity_pulled_pct": 99.3007, "liquidity_pulled_pools": 142, "max_buy_tax_pct": 1.99, "max_sell_tax_pct": 1.99, "median_pool_life_min": 150, "pools": 205, "pools_traded": 143, "tax_measured_pools": 124, "taxed_10pct_pools": 0, "taxed_pools": 2, "volume_usd": 1597201 }, "pattern": { "description": "hook addresses with no code", "honeypot_pct": 0, "id": "no_code", "liquidity_pulled_pct": 99.3007, "pools_traded": 143, "taxed_pct": 1.3986 }, "permissions": [ "beforeDonate", "afterDonate" ], "pools": 205, "risk": [ "unverified" ], "risk_level": "critical", "stats": { "trades_24h": 0, "volume_usd_24h": 0 }, "verified": null }, { "address": "0x593da569c2a5a6999f59fcc5b06477d8bb4dc080", "attribution": "unattributed", "capabilities": { "can_block_swaps": true, "can_gate_liquidity": false, "can_modify_liquidity_amounts": false, "can_modify_swap_amounts": false }, "code": { "admin_functions": [ "blacklist" ], "checked_ts": 1793207136068, "code_hash": "0x49d3bdb05d0e518dbd5da6a7335e820fc4b5d84bc59c9cce45bb972a8c0798a9", "family": "0x6f11e9734465", "kind": "contract", "logic": null, "owner": "0x4e59b44847b379578588920ca78fbf26c0b4956c", "ownership": "active", "size": 2458 }, "family": { "honeypot_pct": 94.2857, "hooks": 34, "id": "0x6f11e9734465", "liquidity_pulled_pct": 80, "pools_traded": 35, "taxed_pct": 0, "verified_hooks": 0 }, "flags": [ { "evidence": "94% of 35 traded pools of its code family 0x6f11e9734465 (34 hooks) became honeypots", "flag": "honeypot_family", "severity": "critical" }, { "evidence": "liquidity was pulled in 80% of 35 traded pools of its code family 0x6f11e9734465 (34 hooks)", "flag": "rug_family", "severity": "high" }, { "evidence": "10.6% of 3326 traded pools of hooks that can block or reprice swaps (beforeSwap) without taking a delta became honeypots, 69% had liquidity pulled", "flag": "can_block_swaps", "severity": "high" }, { "evidence": "owner-callable functions: blacklist", "flag": "owner_controls", "severity": "medium" } ], "flags_hex": "0x80", "launchpad": null, "launchpad_name": null, "name": null, "observed": { "dynamic_tax_pools": 0, "first_trade_ts": 1785744995000, "honeypot_pools": 0, "last_trade_ts": 1785773803000, "liquidity_pulled_pct": 0, "liquidity_pulled_pools": 0, "max_buy_tax_pct": 0, "max_sell_tax_pct": 0, "median_pool_life_min": 0, "pools": 142, "pools_traded": 0, "tax_measured_pools": 0, "taxed_10pct_pools": 0, "taxed_pools": 0, "volume_usd": 53234.8 }, "pattern": { "description": "hooks that can block or reprice swaps (beforeSwap) without taking a delta", "honeypot_pct": 10.6133, "id": "before_swap_only", "liquidity_pulled_pct": 69.1221, "pools_traded": 3326, "taxed_pct": 1.89417 }, "permissions": [ "beforeSwap" ], "pools": 142, "risk": [ "can_block_or_reprice_swaps", "unverified" ], "risk_level": "critical", "stats": { "trades_24h": 0, "volume_usd_24h": 0 }, "verified": null }, { "address": "0xce9b07b09b9a2b016a343e85936ffb7849f2c080", "attribution": "unattributed", "capabilities": { "can_block_swaps": true, "can_gate_liquidity": false, "can_modify_liquidity_amounts": false, "can_modify_swap_amounts": false }, "code": { "admin_functions": [ "blacklist" ], "checked_ts": 1793207142720, "code_hash": "0x49d3bdb05d0e518dbd5da6a7335e820fc4b5d84bc59c9cce45bb972a8c0798a9", "family": "0x6f11e9734465", "kind": "contract", "logic": null, "owner": "0x4e59b44847b379578588920ca78fbf26c0b4956c", "ownership": "active", "size": 2458 }, "family": { "honeypot_pct": 94.2857, "hooks": 34, "id": "0x6f11e9734465", "liquidity_pulled_pct": 80, "pools_traded": 35, "taxed_pct": 0, "verified_hooks": 0 }, "flags": [ { "evidence": "1 of its 1 traded pools had 10+ buys and no sells", "flag": "honeypot_observed", "severity": "critical" }, { "evidence": "94% of 35 traded pools of its code family 0x6f11e9734465 (34 hooks) became honeypots", "flag": "honeypot_family", "severity": "critical" }, { "evidence": "liquidity was pulled in 80% of 35 traded pools of its code family 0x6f11e9734465 (34 hooks)", "flag": "rug_family", "severity": "high" }, { "evidence": "10.6% of 3326 traded pools of hooks that can block or reprice swaps (beforeSwap) without taking a delta became honeypots, 69% had liquidity pulled", "flag": "can_block_swaps", "severity": "high" }, { "evidence": "owner-callable functions: blacklist", "flag": "owner_controls", "severity": "medium" } ], "flags_hex": "0x80", "launchpad": null, "launchpad_name": null, "name": null, "observed": { "dynamic_tax_pools": 0, "first_trade_ts": 1788387847000, "honeypot_pools": 1, "last_trade_ts": 1788725350000, "liquidity_pulled_pct": 100, "liquidity_pulled_pools": 1, "max_buy_tax_pct": 0, "max_sell_tax_pct": 0, "median_pool_life_min": 16, "pools": 141, "pools_traded": 1, "tax_measured_pools": 1, "taxed_10pct_pools": 0, "taxed_pools": 0, "volume_usd": 142769 }, "pattern": { "description": "hooks that can block or reprice swaps (beforeSwap) without taking a delta", "honeypot_pct": 10.6133, "id": "before_swap_only", "liquidity_pulled_pct": 69.1221, "pools_traded": 3326, "taxed_pct": 1.89417 }, "permissions": [ "beforeSwap" ], "pools": 141, "risk": [ "can_block_or_reprice_swaps", "unverified" ], "risk_level": "critical", "stats": { "trades_24h": 0, "volume_usd_24h": 0 }, "verified": null } ], "meta": { "block": 100415559, "block_age_ms": 1099, "block_ts": 1793225982000, "chain": "robinhood", "finalized_block": 100405028, "intel_computed_ts": 1793225485302, "lag_ms": 364, "next_cursor": "3", "safe_block": 100408671, "total": 20073 }}What this tells you
meta.total: 20073: that many hooks are ratedhighorcritical, against 29,952 in the unfiltered list above.sort=riskputs the worst first.0x00000000000000000000000000000000dead0030hascode.kind: "no_code"(flagno_code, critical): there is no contract at the address. It also hasrugs_observed: “liquidity was pulled in 142 of its 143 traded pools”, with amedian_pool_life_minof 150.0x593da569c2a5a6999f59fcc5b06477d8bb4dc080has no traded pools of its own (observed.pools_traded: 0), yet it is critical:honeypot_familysays “94% of 35 traded pools of its code family 0x6f11e9734465 (34 hooks) became honeypots”. A new hook inherits its family’s record.0xce9b07b09b9a2b016a343e85936ffb7849f2c080has the samecode_hashand family, and its own pool confirms it:honeypot_observed, “1 of its 1 traded pools had 10+ buys and no sells”, after a median pool life of 16 minutes.- Both family hooks have only the
beforeSwappermission (can_block_swaps: true), an owner (ownership: "active") and ablacklistfunction (owner_controls): a hook that can refuse swaps, with an owner who can blacklist wallets.
What the hook fields mean
| Field | Meaning |
|---|---|
risk_level | The worst severity among flags: low, medium, high or critical. |
flags[] | Each finding: flag, severity and evidence (a sentence with the numbers behind it). |
permissions, flags_hex | The callbacks the hook can run, decoded from the low 14 bits of its address. They can't change after deployment. |
capabilities | Plain-language summary: can_block_swaps, can_modify_swap_amounts, can_modify_liquidity_amounts, can_gate_liquidity. |
code | What sits at the address (kind), its owner and ownership, admin_functions found in its code, size, code_hash and family. |
observed | Its own pools: pools, pools_traded, honeypot_pools, liquidity_pulled_pools, taxed_pools, taxed_10pct_pools, max_buy_tax_pct, max_sell_tax_pct, dynamic_tax_pools, volume_usd, median_pool_life_min. |
family | The same record summed over every hook with the same code (hooks, pools_traded, honeypot_pct, liquidity_pulled_pct, taxed_pct): a new hook inherits its family's history. |
pattern | Honeypot, rug and tax rates of all hooks with the same swap permissions (id, description). |
verified, attribution, launchpad | Whether the hook is a known launchpad or protocol hook (on /hooks and /hook). |
The full list of flags, what triggers each one and how verified hooks are treated is in Uniswap v4 hook risk.
Use it in your app
-
Read
hookfrom/security. It’snullfor tokens priced in a pool without a hook (any v2 or v3 pool, or a v4 pool without one). No key needed. -
Gate on
risk_level. Blockcritical(swaps can fail, the code can be replaced, or its pools trap buyers), warn onhigh, and showmediumwith its evidence. -
Show the evidence, not just the level. Each
flags[].evidenceis written to be shown to users as-is. -
Look up hooks directly.
/hook/{address}adds the events the hook emits and its pools’ fee tiers;/hooks?risk_level=high,critical&sort=risklists the riskiest hooks on chain (Free plan).
// Warn about a token's v4 hook before trading.const token = "0x8b5a7a19fbd3d8e8422643fc229b3ab08697c0be"; // Rubyconst res = await fetch(`https://api.crius.sh/v1/robinhood/token/${token}/security`);const { hook } = (await res.json()).data;
if (!hook) console.log("no v4 hook on the pricing pool");else { console.log(`${hook.name ?? hook.address}: ${hook.risk_level} risk`); for (const f of hook.flags) console.log(`- [${f.severity}] ${f.flag}: ${f.evidence}`);}Frequently asked questions
What is a Uniswap v4 hook and why does it matter for a token?
A hook is a contract a Uniswap v4 pool calls before or after swaps and liquidity changes. It can take a fee on every trade, change swap amounts, block swaps or stop liquidity from being added or removed. A token with a clean contract can still be taxed or trapped by its pool's hook, so the hook needs its own check.
How do I check a Uniswap v4 hook's risk on Robinhood Chain?
For a token, call /v1/robinhood/token/{address}/security (no key) and read hook.risk_level and hook.flags. For a hook address, call /v1/robinhood/hook/{address} with a free key. Each flag has a severity and an evidence sentence you can show users as-is.
Why is a hook that can block swaps rated low risk?
Permissions say what a hook could do, not what it does. Hooks verified in Crius's registry (launchpads and known protocols, verified: true) are judged only on what happened in their pools, and those results are shares, not counts: a hook with 13 honeypot pools out of 354 traded is not a honeypot hook. Unverified hooks are also judged on their permissions and their code family's record.
How much does a risky hook cost in the security score?
The token loses 60 points for a critical hook (hook_critical_risk, and the token becomes risk: "high"), 30 for high and 10 for medium. A low hook costs nothing. hook_can_block_swaps is added for information when the hook can block swaps.
How often is hook risk updated?
Every hook on chain is re-assessed every 30 minutes (meta.intel_computed_ts on /hooks and /hook). Hooks whose code can change (proxies, delegated wallets) are re-inspected every 6 hours, and hooks with an active owner daily.
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