Swapping and quoting
Read how to route a swap through the Universal Router or the Hookr router, the price limit, and getting a matching quote.
On this page
Introduction
A Hookr pool on Hookr's shared hook is an ordinary Uniswap v4 pool whose PoolKey.hooks is HookrRoot. Any v4 caller can trade it. There are two ways in, the Universal Router and Hookr's own HookrRouter, and HookrQuoter quotes either one. Their addresses, and every other address, render below from the release book the app ships; none is typed into this page.
Hookr’s contracts
The table lists Hookr’s 35 core contracts, rendered from the hookr-1 release book the app ships, source commit 412960b37a631ce145d49fb4a1887f04a4d1fa74, in deployment order.
Each one’s source is verified on RobinScan, on Sourcify as an exact match and on Blockscout as a full match. The arb recapture table below repeats HookrLane and adds What The Hook’s executor and the whole-pot King of the Pool contracts, and the Wallet Cap table adds Wallet Cap’s core and its module. None of the contracts they add is in the release book.
Arb recapture
The registry opened the lane on HookrRoot on 2026-10-07. The executor is What The Hook’s contract, not Hookr’s. King of the Pool is live on ETH/HOOKR (0xd7cc047d…bc99), on the whole-pot Rules: each arb profit splits What The Hook 25% · Hookr 25% · Pot 50%, with nothing to traders or LPs, and the round’s winner takes the whole pot.
| Contract | Address |
|---|---|
| HookrLane, the arb recapture lane on HookrRoot | 0x9A8a1006469BA196f8FEfc017a53505C83A060BB |
| What The Hook's arb recapture executor, 25% of each arb recapture's profit | 0x4B4c16681401454140a9dBca55e5c186BBE8D728 |
| HookrRules, King of the Pool whole-pot Rules | 0x10f684361b35c8411a2c07f68a6fb1f4b7e555f7 |
| HookrRecapture, the whole-pot Rules' module | 0x60efc4a41498e9433be2155b6cc1677aec31d649 |
Wallet Cap
Wallet Cap runs on a core of its own: the whole-pot core with a cap on each wallet’s buys while a pool’s launch guard lasts. Hookr’s hook admits it, and a Wallet Cap pool’s claims are made on it.
| Contract | Address |
|---|---|
| HookrRulesWalletCap, Wallet Cap's core | 0xb67b73e28c522a3aac438be970bf94976deee52a |
| HookrRecapture, the module of Wallet Cap's core | 0xbbc43dc2f01f5e7882cacd78ef094a44ef0e4d23 |
Through the Universal Router
Nothing special is required. Build a V4_SWAP command against the pool's PoolKey and send empty hookData.
Commands.V4_SWAP
Actions.SWAP_EXACT_IN_SINGLE (key, zeroForOne, amountIn, amountOutMinimum, hookData = "")
Actions.SETTLE_ALL (inputCurrency, amountIn)
Actions.TAKE_ALL (outputCurrency, amountOutMinimum)An ERC-20 input is pulled through Permit2, so the payer approves the token to Permit2 and then approves the Universal Router as a Permit2 spender with an amount and an expiry. A plain ERC-20 approval to the Universal Router is not read, and the swap fails to settle.
Every Hook Block the pool froze at launch applies, whichever way the swap arrives.
Through HookrRouter
HookrRouter carries the payer to the root, settles exact amounts and returns unused ETH. It takes one Swap:
struct Swap {
PoolKey key;
bool zeroForOne;
int128 amountSpecified; // negative for exact input
uint128 amountBound; // minimum out for exact input, maximum in for exact output
uint160 sqrtPriceLimitX96;
address recipient;
uint256 deadline;
}For a native input, send msg.value equal to the input. For an ERC-20 input, approve the router directly: it pulls with transferFrom and does not read Permit2. swapAllowance in hookr-sdk returns the approval, and buildSwap builds the call. The builders refuse a swap without an amount bound, a price bound and a deadline within the next hour, and refuse a pool whose hooks is not HookrRoot.
Quoting
HookrQuoter answers in the shape of Uniswap's V4Quoter, so an aggregator that already quotes v4 pools quotes a Hookr pool the same way:
| Function | Returns |
|---|---|
quoteExactInputSingle(Quote | amountOut, gasEstimate |
quote | amountIn, gasEstimate |
QuoteExactSingleParams is V4Quoter's own struct: the pool key, the direction, the exact amount and hookData, which must be empty. Use these for a swap routed through the Universal Router.
For a swap routed through HookrRouter, quote the router's own call: quote(Swap, payer) returns the receipt the swap will settle, and quoteDetailed(Swap, payer) adds the payer's arb recapture claim and the simulation's gas. buildQuote builds that call from the same Swap that buildSwap sends.
Each quote runs the real hook callbacks and then reverts with its result, so none of them is a view function: call it with eth_call, or with a static call from another contract. A revert that is not the quote's result bubbles up unchanged, so a swap the pool would refuse reaches you as the same error the swap would throw. A quote simulates the pool's accounting; it does not prove approvals, balances or gas.
The Lane Gas Floor
On a pool with arb recapture on, a swap must carry the lane's gas floor plus its own gas: laneGasFloor in the SDK, or gasFloor from laneOf(id) on the root. The floor is 6,802,619 at the lane's 3,000,000 gas cap. eth_estimateGas includes the floor, about 7.5 million for a buy now. Send the estimate plus a sixth, never less than the estimate. A fixed limit should be at least 8.8 million. Unused gas is refunded.
What a Trader Pays
A pool's fee is its base LP fee, plus Hookr dynamic fees up to the ceiling it froze at launch, plus any Hook Block charge it carries (Anti-Snipe's tax during its window, Auto Burn, LP Rewards, a royalty), each frozen at launch. Quote before every swap during a new token's Anti-Snipe window: its limits are per block and shared by every trader.
Next Steps
Read Providing liquidity for the LP side of the same pool, and SDK, router and quoter for the builders.