Skip to content

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.

ContractAddress
HookrRegistryChecks0xB9F5c54E5Cc7ac6c7a96335E5A334Cf4eA496E98
HookrRegistryAdmin0x675ac2102E8c69E2467F64656E3c235AF3901Ac1
HookrRegistry0x463c82beA1a52F4Cc05ca0741a24F0AD24bA4602
HookrTreasury0x2242F7FC75606500503075f29ea8cDA684EfB4a9
HookrForwarder0xe7863CC0E2Fb783b44c279aB159bcD812c2ceA1c
HookrRouter0xC2Bc9a3fe6c4Ce8C2F7EB4655b0869b01D8c93C9
HookrQuoter0x445D7891381Aa7F91F5048EdBC6a611ccBDe7865
HookrLaunchChecks0x8567369a70100828611BB6F44ec051B48F10fb59
HookrTokenDeployer0x1B23D6d7beBcB61E39317E9F0Bc02AEB91aFCcAe
HookrLauncher0x1cf2748A6670572425eAbf9Ab9e5BC4eb2eB8Ef4
HookrReferralRegistry0xefD1DfBA80c06E72F793601706c3a1c71aab3057
HookrProgramsAdmin0x40B40D65543E70a9C757eda1A2208517a8BC7292
HookrPrograms0x9fA204AC99176782Fd20615b2b2A516D1F8C328F
HookrMilestoneNFTFactory0xa340F964F1E685c681dC3ABB5B0405E608914d00
HookrProgramValidator0x33e0249083Be7Cd8bD2fe175E0671AcfD0516850
HookrReferralDistributor0x690539c53212899A9c6AEEE3b4B6737A5c4851d9
HookrRoot0x89c9FB50d1f03192230FFB1c279BB6E7d3Fe6aCc
HookrRules0x4a71c270b1520F94064268102AebD744b0DE7942
HookrFamilyRouter0x854f3Fa7AC342B244DF0d9A8c8F597b051aAE559
HookrFamilyLock0xfAFEcE64099C1E791C4B46189c277f00c0c7e00b
HookrLane0x9A8a1006469BA196f8FEfc017a53505C83A060BB
HookrRecapture0xF83569E564d70daebc35950f66a73f2e2B915583
HookrCompliance0x9D205e8a68464761A9d84bdeCcEa0C3CB1e7B1EC
HookrComplianceGuard0x6CD70db1ac99344416a6fD7184e23FA8f09f313A
HookrAccountCalls0x0579a95A7760070E2d6D34e5beCe571e5F1c4818
HookrPaymasterAdmin0x1d81F4B131832f741392edf7B91b4CF099FbB008
HookrPaymaster0x1c4682915092E742231ea038C4fcA61e96a83c99
HookrRootFactory0x21E438FaBE10770afb4407cF6b09d32369CBdCE4
HookrSessionAdvisory0x78Bc6b7302Dda8632e661c8d74966bdBea1c66b1
HookrFeeAdvisory0x3B6b3f00684987B831fcF9EB5f0d5B806afF7306
HookrLiquidityVault0xA408923EF811945Ef119Bc700B1950Dab65467Fc
HookrOwnedProfiles0xb46c318B6AEA2d6274f5566da414b09fDa6CC325
HookrOwnedRootsLens0x6Bb5c9d21dD095F788cb8373d0143429ad277366
HookrOwnedRootFactory0xA6c2a401597301dFf57A59bC8F70a9622499f3ec
HookrLpBoost0x52536F5F4E5BC7cEA2197c8F1BB49bf2B133E7f1

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.

ContractAddress
HookrLane, the arb recapture lane on HookrRoot0x9A8a1006469BA196f8FEfc017a53505C83A060BB
What The Hook's arb recapture executor, 25% of each arb recapture's profit0x4B4c16681401454140a9dBca55e5c186BBE8D728
HookrRules, King of the Pool whole-pot Rules0x10f684361b35c8411a2c07f68a6fb1f4b7e555f7
HookrRecapture, the whole-pot Rules' module0x60efc4a41498e9433be2155b6cc1677aec31d649

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.

ContractAddress
HookrRulesWalletCap, Wallet Cap's core0xb67b73e28c522a3aac438be970bf94976deee52a
HookrRecapture, the module of Wallet Cap's core0xbbc43dc2f01f5e7882cacd78ef094a44ef0e4d23

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:

FunctionReturns
quoteExactInputSingle(QuoteExactSingleParams)amountOut, gasEstimate
quoteExactOutputSingle(QuoteExactSingleParams)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.