Seven cats fishing along the edge of a swimming pool

Adopt a cat. It sets your fee.

A Uniswap v4 hook that prices every swap with the cat your pool adopts: a fee formula trained by builders on real swaps, reading volatility from the pool's own ticks, block by block.

Fees from 0.01% to 3.00%, set per swap

A flat fee loses the volatile hours. A cat prices them.

Builders train fee formulas on real swaps, LPs adopt the best one, and every swap through the pool pays what the cat asks, computed onchain by the hook.

Every swap asks the cat

The fee follows the pool

On every swap the v4 hook asks the pool's cat for a fee. The cat reads state the hook keeps itself: an average of tick moves per block, the direction of the last move, the swap's size against active liquidity and the UTC clock.

The first swap of each block rolls the volatility forward, so the fee moves block by block, between 0.01% and 3.00%.

A cat on a pool ladder watching its float on choppy water

Builders train the cats

A cat is one of four formulas, Calm, Stalker, Heavy or Clock, plus a packed set of parameters. Builders replay seven days of real swaps in the browser, search the parameters and publish the winner.

Publishing is a storage write in the hook, not a contract deploy. The AI trainer proposes parameter sets once it is connected; the fee itself is always the formula.

Train a catGrid search | in the browser
A cat tuning a fishing reel with a tiny screwdriver

LPs adopt a cat

Open an ETH pool against USDG, a tokenized stock or a Pons coin in one transaction, with the top cat of the week or any other. The keeper can switch cats at any time.

Liquidity goes through Uniswap's v4 PositionManager as usual. The hook never holds a position and never blocks liquidity.

Open a poolDynamic fee | tick spacing 60
A cat in a pool ring getting a tag clipped to its collar

The best cats eat first

Above a fixed 0.30%, LPs keep 88% of the extra fee. The cat's builder takes 10% and $HCAT stakers 2%, in ETH, claimable at any time.

Cats are ranked by the ETH they earned for LPs above 0.30% over 7 days. New pools default to the top cat, and the adoption list is sorted the same way.

LeaderboardPaid in ETH | claim any time
Two cats carrying a bucket of fish along the pool edge

One hour on a real pool

Fee now, last block
…
Cat
…
Swaps replayed
…
Volume
…
Average fee
…
LPs vs 0.30%, same swaps
…
House pool fee quote
…
House pool swaps
…

The house cat priced on the last 90 minutes of real ETH / USDG swaps, block by block, with the formula the hook runs. Refreshed every minute. The quote is the fee the hook charges right now on its own ETH / USDG pool (ETH in / ETH out).

Fee per block 0.30% poolLower pane: LP fees, cat vs 0.30%
Reading swaps from the PoolManager…

The cats on top this week

Full leaderboard

Where the fee goes

88%

of the fee above 0.30% stays with the pool's LPs, on top of the full 0.30%. Under 0.30%, LPs keep the whole fee and nothing is cut.

10%

to the cat's builder, in ETH, from every pool that adopted the cat. claimBuilder() at any time.

2%

to $HCAT stakers, in ETH, pro rata to stake, across every HookCat pool.

fee f from the cat, baseline b = 0.30%, excess e = f − b
f ≤ b: LP fee = f, no cut
f > b: LP fee = b + 0.88 e, hook cut = 0.12 e of the ETH side (0.10 e builder, 0.02 e stakers); the trader pays f

Built for routers, agents and code

A v4 pool like any other

HookCat pools route through Uniswap's Universal Router 2.1.1 with Permit2. The fee a swap pays is readable before it is sent with quoteFee, from the SDK, the JSON API or the MCP server.

SDK
/sdk/hookcat.mjs
API
/api/cats
MCP
/api/mcp
// curl -O https://www.hookcat.app/sdk/hookcat.mjs   (viem is the only dependency)
import { quoteFee, buildSwap, openPool, listCats } from "./hookcat.mjs";

const cats = await listCats();                  // ranked by 7-day take for LPs
const q = await quoteFee(POOL_ID, true, -10n ** 15n);
// { fee: 4397, lpFee: 4229, cutPips: 168 }  pips, 1e-6

const tx = buildSwap({ token: USDG, zeroForOne: true, amountIn: 10n ** 15n, minOut });
await wallet.sendTransaction(tx);             // Universal Router 2.1.1

Train a cat today

Seven days of real swaps, four formulas, one storage write to publish.

Uniswap Uniswap v4 hookPositionManagerUniversal Router 2.1.1Permit2Global Dollar USDG USDGETH pairsDynamic feeTick spacing 60Uniswap Uniswap v4 hookPositionManagerUniversal Router 2.1.1Permit2Global Dollar USDG USDGETH pairsDynamic feeTick spacing 60