# 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.

Source: https://docs.crius.sh/guides/check-uniswap-v4-hook-risk/ · Updated 2026-10-28

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.

[GET `/token/{address}/security`](https://docs.crius.sh/reference/security/security-checks/) [GET `/hook/{address}`](https://docs.crius.sh/reference/pools/hook-detail/) [GET `/hooks`](https://docs.crius.sh/reference/pools/uniswap-v4-hooks/)

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

Example [Anonymous · no key · 1 credit](https://docs.crius.sh/reference/security/security-checks/)

### 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**

```bash
curl "https://api.crius.sh/v1/robinhood/token/0x8b5a7a19fbd3d8e8422643fc229b3ab08697c0be/security"
```

**JavaScript**

```js
const res = await fetch("https://api.crius.sh/v1/robinhood/token/0x8b5a7a19fbd3d8e8422643fc229b3ab08697c0be/security");
const { data, meta } = await res.json();
```

**Python**

```python
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)**

```json
{
  "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](https://docs.crius.sh/reference/security/security-checks/) Runs from your browser on the anonymous plan [Data looks wrong? Report it](mailto:support@crius.sh?subject=Wrong%20data%20in%20docs%20example%3A%20A%20hook%20that%20taxes%3A%20Ruby's%20pool%2C%20medium%20risk&body=Page%3A%20https%3A%2F%2Fdocs.crius.sh%2Fguides%2Fcheck-uniswap-v4-hook-risk%2F%23taxing-hook%0ARequest%3A%20GET%20%2Fv1%2Frobinhood%2Ftoken%2F0x8b5a7a19fbd3d8e8422643fc229b3ab08697c0be%2Fsecurity%0A%0AWhat's%20wrong%20or%20missing%3F%0A%0A)

Example [Free plan · 2 credits](https://docs.crius.sh/reference/pools/uniswap-v4-hooks/)

### 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**

```bash
curl "https://api.crius.sh/v1/robinhood/hooks?limit=3" \
  -H "x-api-key: $CRIUS_API_KEY"
```

**JavaScript**

```js
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();
```

**Python**

```python
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)**

```json
{
  "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.

[Uniswap v4 hooks reference](https://docs.crius.sh/reference/pools/uniswap-v4-hooks/) [Data looks wrong? Report it](mailto:support@crius.sh?subject=Wrong%20data%20in%20docs%20example%3A%20The%20most-used%20hooks%20on%20Robinhood%20Chain&body=Page%3A%20https%3A%2F%2Fdocs.crius.sh%2Fguides%2Fcheck-uniswap-v4-hook-risk%2F%23hook-list%0ARequest%3A%20GET%20%2Fv1%2Frobinhood%2Fhooks%3Flimit%3D3%0A%0AWhat's%20wrong%20or%20missing%3F%0A%0A)

Example [Free plan · 2 credits](https://docs.crius.sh/reference/pools/uniswap-v4-hooks/)

### 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**

```bash
curl "https://api.crius.sh/v1/robinhood/hooks?risk_level=high,critical&sort=risk&limit=3" \
  -H "x-api-key: $CRIUS_API_KEY"
```

**JavaScript**

```js
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();
```

**Python**

```python
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)**

```json
{
  "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.

[Uniswap v4 hooks reference](https://docs.crius.sh/reference/pools/uniswap-v4-hooks/) [Data looks wrong? Report it](mailto:support@crius.sh?subject=Wrong%20data%20in%20docs%20example%3A%20Critical%20hooks%3A%20no%20code%2C%20and%20a%20honeypot%20code%20family&body=Page%3A%20https%3A%2F%2Fdocs.crius.sh%2Fguides%2Fcheck-uniswap-v4-hook-risk%2F%23critical-hooks%0ARequest%3A%20GET%20%2Fv1%2Frobinhood%2Fhooks%3Frisk_level%3Dhigh%2Ccritical%26sort%3Drisk%26limit%3D3%0A%0AWhat's%20wrong%20or%20missing%3F%0A%0A)

## 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](https://docs.crius.sh/concepts/uniswap-v4-hooks/).

## 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).
    

```js
// 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}`);
}
```

Which pool's hook?

`/security` reports the hook of the pool the token’s price comes from (its main pool). A token with several v4 pools can have other hooks: list them with [`/token/{address}/pools`](https://docs.crius.sh/reference/tokens/token-markets/) and check each with `/hook/{address}`.

## 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

[Concept **v4 hook risk** How Crius rates every Uniswap v4 hook on Robinhood Chain, from its permissions, its code and owner, what happened in its pools and its code family's record, with each risk flag and its threshold. Read](https://docs.crius.sh/concepts/uniswap-v4-hooks/) [Concept **Uniswap v2, v3 & v4** How Crius indexes Uniswap v2 pairs, v3 concentrated-liquidity pools and v4 singleton pools with hooks on Robinhood Chain, including liquidity definitions and v4 hook permissions. Read](https://docs.crius.sh/concepts/uniswap/) [Guide **Check token taxes** Get the real buy and sell tax of any Robinhood Chain token in one call, measured from recent trades and checked by simulation. Real examples with a 5% sell tax and a 7% buy tax. Read](https://docs.crius.sh/guides/check-token-taxes/) [Guide **Token security score** Score any Robinhood Chain token from 0 to 100 with one API call. Honeypot, buy and sell taxes, owner powers, LP locks, v4 hook risk and insider launches, with real examples. Read](https://docs.crius.sh/guides/token-security-score/) [API reference **Hook detail API** One hook: decoded permissions, code (kind, owner, admin functions), what happened in its pools, its code family's history, flags with evidence and risk level, and the events it emits. Read](https://docs.crius.sh/reference/pools/hook-detail/) [API reference **Uniswap v4 hooks API** Every v4 hook seen on chain, with pool count, volume, verification, risk level and flags. Read](https://docs.crius.sh/reference/pools/uniswap-v4-hooks/)
