How this works
A terminal for Uniswap v4 hooks. Projects, not hook addresses. Figures refreshed nightly; trades live.
What you are looking at
A Uniswap v4 pool can name a hook: a contract that runs before or after swaps and liquidity changes and can change fees, block trades, take a cut or run an auction. Thousands of hooks are deployed; most see no use. Bait finds every hook with a live pool on the chains it covers, groups hooks that belong to one team into a project, and shows how much people trade through it, how many wallets, and whether the volume looks like real use.
Every figure is a closed UTC day, refreshed nightly; a project page says which day. A dash means unknown, never zero. Badges explain themselves when you tap "What these badges mean". Nothing here is an audit, an endorsement or trading advice, and Bait never executes trades.
Method
Identity comes from the public hooklist registry and from the chain: a hook that is not in the registry is found from its pools, and its permissions come from the bits in its address. Usage comes from Bait's own indexer, which reads every hooked Uniswap v4 pool and the last 14 days of swaps on 16 chains through Envio HyperSync, valued at current DefiLlama prices. Where the indexer has not caught up, or a hook keeps its own accounting, GeckoTerminal's daily figures stand in. GeckoTerminal also supplies pool TVL and rolling 24-hour figures, and public RPC nodes resolve hooks and read their bytecode. The feed covers ten of those chains; the rest appear under Just launched. Figures are closed UTC days, refreshed by a nightly run; a project page says which day its figures run through. Contract names come from Blockscout, Sourcify and Routescan. Links come from Exa, last 30 days. Team, site and audit details for new projects come from Parallel. The one-line "what it does" and the two-sentence "why people care" are written by Claude from those sources, rewritten only when the signals change; the page shows when.
Activity
Buys and sells are GeckoTerminal's rolling 24-hour counts. Top wallets come from GeckoTerminal's latest ~300 trades in each of Bait's 30 busiest pools, once a day. Distinct wallet counts come from the indexer where it has caught up, otherwise from those trades; a "≤" marks an upper bound. The live trade feed on a project page reads GeckoTerminal's recent trades for the project's busiest pool, hides trades under $10, and refreshes every minute while you watch. Wallet labels and the "Smart money" pill come from Nansen labels collected through early October 2026. "Wallets 7d" and the top wallet's share of swaps come from the indexer and are shown at any size, with no threshold; they are unknown unless every chain the project is on has caught up through the week. A project page names the wallet that deployed each hook (from the registry, or the explorer's contract creator) and the share of the week's swaps those wallets made. The same figures are available as JSON from the read API: /api/v1/projects, /api/v1/projects/[slug] and /api/v1/hooks/[address]. The field reference is in the repository under docs/api.md.
Grouping
Thousands of hook addresses collapse into projects. Hooks that share a hooklist name are one project, unless unrelated teams share that name (deployer clashes on one chain and no shared bytecode). A verified contract name is only a candidate: those hooks join on evidence, the same bytecode (not a shared proxy) or the same deployer (not a factory). Hooks with generic names, such as template defaults, stay apart. The few left with only a description are classified once by a small model. Factories that deploy one hook per pool are one card with the hook count as a stat. Renamed and merged projects keep their old links.
Categories
Dynamic fee · Launchpad · Orders (limit, TWAMM) · LP management · Compliance · Oracle · MEV / LVR · Lending · Gaming / NFT · Other
A category comes from the generated description where one exists. Until then it is guessed from what the chain and the registry already say: a dynamic-fee property or pool, a factory or a hook with many pools, or words in the hook's own name or description (limit order, lending, auction, oracle, KYC, vault, NFT). A category written from the description wins; where the description found none, the guess applies.
Scoring
- New: project first seen within 7 days, and either a pool above $1K TVL or at least 10 swaps in the week.
- Trending: 7-day volume of at least $10K, at least $1K the week before, first seen over a week ago, and no wash-like volume. Score is
log1p(vol_7d) × clamp(vol_7d / max(vol_7d_prev, 1000), 0.5, 10), so growth counts more than size; tie-break on TVL. Top 20. - Routable: at least one hook is on Uniswap's routing allowlist, or one pool meets the automatic rule below, and no hook is on its denylist. Audit status is a separate badge.
- Hidden from All: no pools, or every pool under $100 TVL with fewer than 10 swaps lifetime, unless the project moved $1M or more.
Wash-like volume
A project gets the red "Wash-like volume" badge when pools carrying at least half its volume match one of these rules. It stays in All with its page, and never reaches Trending, New, Routable, movers, Leaders or the weekly digest.
- Few wallets: $250K or more in a day through 25 wallets or fewer, or $1M in a week through 10 or fewer, when the pool also shows 7-day volume over 50 times a known TVL, no liquidity, or symmetric trading; or $1M carried by 10 swaps or fewer.
- Concentrated: $1M or more in a week carried by at most two wallets.
- Volume far above liquidity: 7-day volume over 300 times a known TVL, with fewer than 50 wallets.
- No liquidity: $1M or more in a week through a pool with at most $1K of known TVL and fewer than 50 wallets.
- Symmetric: the top wallets each buy and sell equally and carry most of the pool's volume (bots trading with themselves).
- Uniform: the top wallets each made one trade of the same size, and the pool averages that size per wallet.
- Unverified: $1M or more through pools too small to list, with no wallet data to check who moved it.
- Lookalike token: the volume runs through a pool with a token posing as USDC, USDT or the chain's wrapped coin, by copying its symbol or the start and end of its address.
Wallet counts are lower bounds and unknown TVL is never treated as zero. A private or RFQ hook with few counterparties and real liquidity is not flagged unless one or two wallets carry it. TVL is GeckoTerminal's valuation of a pool at its own prices, so Bait shows it as unknown when it cannot be liquidity: a pool with a lookalike token, or $1M or more that traded under 0.1% of itself in a fully measured week (usually a launch's own supply).
Routable
The Uniswap app only routes through hooked pools whose hook is allowlisted. Per Uniswap's published rule, a hook is allowed automatically unless its address starts with 0x91, or it uses beforeSwapReturnsDelta, afterSwapReturnsDelta or a dynamic fee. Bait computes this from the permission bits in the hook address (the chain enforces them) and also treats afterAddLiquidityReturnsDelta and afterRemoveLiquidityReturnsDelta as blocking, which is stricter than the published rule. Uniswap also publishes the hooks it approved by hand and the hooks it never routes through, in its uniroute-public allowlist and denylist. Bait reads both every few hours: a denylisted hook never counts as routable, an allowlisted one always does, and every other hook is judged by the rule. The Routable tab lists projects with at least one hook or pool that passes. Hooks without a known pool show Routing unknown. Not in hooklist means we found the hook from its pools, not from Uniswap's registry; its name and permissions come from the chain. The badge is a rule, not a guarantee: Bait has not checked current Uniswap routing or quote availability, and it does not execute trades.
Disclaimers
- Hooks are third-party code in the swap path. Nothing here is audited by us.
- Flags and properties are shown as published in the hooklist registry. We do not verify them against bytecode.
- "Audit linked" means an audit link is published. It is not a statement about the audit's scope or findings.
- Smart-money counts are Nansen labels on addresses that interacted with a project's top pools. They are not investment signals.
- Figures come from Bait's indexer and public APIs and can lag or be wrong when a source stalls; a project page says which day its figures run through. Metrics are USD estimates.
- Bait is a personal project, not affiliated with Uniswap Labs or the Uniswap Foundation.
Submit a hook
To get a hook listed, open a pull request on the Uniswap hooklist repository.