CRIUS Docs
API status Get API key
Safety & risk

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.

Updated 3 min read
Short answer

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?

GET/v1/robinhood/token/0x8b5a7a19fbd3d8e8422643fc229b3ab08697c0be/security
curl "https://api.crius.sh/v1/robinhood/token/0x8b5a7a19fbd3d8e8422643fc229b3ab08697c0be/security"
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_amounts and can_modify_liquidity_amounts are all true. permissions include beforeSwap and beforeSwapReturnDelta: it runs before every swap and can change the amounts.
  • The medium comes from what it did, not what it could do. The tax_observed flag’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.28 matches the token’s tax.sell_pct: 5.28.
  • observed.honeypot_pools: 0 and liquidity_pulled_pools: 0 over 8 traded pools: no trapped buyers and no rugs so far.
  • code.ownership: "active" with owner 0x33acedd086ee7fec19764b5f4a93a6ef067953f5, and code.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) and hook_can_block_swaps (for information, 0 points).
Security checks reference Runs from your browser on the anonymous plan Data looks wrong? Report it

The most-used hooks on Robinhood Chain

Which hooks do most v4 pools use, and how risky are they?

GET/v1/robinhood/hooks?limit=3
curl "https://api.crius.sh/v1/robinhood/hooks?limit=3" \
-H "x-api-key: $CRIUS_API_KEY"
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: 29952 hooks on chain; sorted by pool count, the top three are DopplerHookInitializer (224,090 pools), ClankerHookStaticFeeV2 (15,412) and PonsV2MemeHook (10,479). All three are verified: true and risk_level: "low".
  • ClankerHookStaticFeeV2 (0x48b8f6ad3a1b4aa477314c9a23035b8f84dde8cc) has can_block_swaps: true and can_gate_liquidity: true, and observed.honeypot_pools: 13 of 354 traded. It stays low: it’s a verified protocol hook, and 13 of 354 is a small share.
  • PonsV2MemeHook (0xe5e702641ea86f4ae6cc3cdaed2b886f976be044) has attribution: "known_launchpad", launchpad: "pons". Its family.taxed_pct of 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_24h and stats.volume_usd_24h show 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?

GET/v1/robinhood/hooks?risk_level=high,critical&sort=risk&limit=3
curl "https://api.crius.sh/v1/robinhood/hooks?risk_level=high,critical&sort=risk&limit=3" \
-H "x-api-key: $CRIUS_API_KEY"
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 rated high or critical, against 29,952 in the unfiltered list above. sort=risk puts the worst first.
  • 0x00000000000000000000000000000000dead0030 has code.kind: "no_code" (flag no_code, critical): there is no contract at the address. It also has rugs_observed: “liquidity was pulled in 142 of its 143 traded pools”, with a median_pool_life_min of 150.
  • 0x593da569c2a5a6999f59fcc5b06477d8bb4dc080 has no traded pools of its own (observed.pools_traded: 0), yet it is critical: honeypot_family says “94% of 35 traded pools of its code family 0x6f11e9734465 (34 hooks) became honeypots”. A new hook inherits its family’s record.
  • 0xce9b07b09b9a2b016a343e85936ffb7849f2c080 has the same code_hash and 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 beforeSwap permission (can_block_swaps: true), an owner (ownership: "active") and a blacklist function (owner_controls): a hook that can refuse swaps, with an owner who can blacklist wallets.

What the hook fields mean

FieldMeaning
risk_levelThe 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_hexThe callbacks the hook can run, decoded from the low 14 bits of its address. They can't change after deployment.
capabilitiesPlain-language summary: can_block_swaps, can_modify_swap_amounts, can_modify_liquidity_amounts, can_gate_liquidity.
codeWhat sits at the address (kind), its owner and ownership, admin_functions found in its code, size, code_hash and family.
observedIts 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.
familyThe 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.
patternHoneypot, rug and tax rates of all hooks with the same swap permissions (id, description).
verified, attribution, launchpadWhether 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

  1. Read hook from /security. It’s null for tokens priced in a pool without a hook (any v2 or v3 pool, or a v4 pool without one). No key needed.

  2. Gate on risk_level. Block critical (swaps can fail, the code can be replaced, or its pools trap buyers), warn on high, and show medium with its evidence.

  3. Show the evidence, not just the level. Each flags[].evidence is written to be shown to users as-is.

  4. Look up hooks directly. /hook/{address} adds the events the hook emits and its pools’ fee tiers; /hooks?risk_level=high,critical&sort=risk lists the riskiest hooks on chain (Free plan).

// Warn about a token's v4 hook before trading.
const token = "0x8b5a7a19fbd3d8e8422643fc229b3ab08697c0be"; // Ruby
const 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.

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