Skip to content

Routing a pool that triggers an arb recapture

Read what a router, an aggregator or an indexer has to change for a pool that triggers an arb recapture: gas, the route's effect on the split, and the events.

On this page

What changes for a router, an aggregator, a quoter or an indexer when the pool on the other side of a swap has arb recapture on. Three things change: the gas the swap needs, how the profit splits, and how close to execution a quote should be taken.

Which Pools These Are

Every pool on Hookr's shared hook names HookrRoot in PoolKey.hooks. Arb recapture is on by default: the root reaches the arb recapture lane for every pool that did not opt out at launch, and a pool that opted out never reaches the lane code. laneOf(id) on the root answers the lane for a pool: the executor, its runtime code hash, the partner share, whether the pool is on it, the gas cap and the gas floor. A pool fixes its terms when it opens, so whether it recaptures is read once from the pool and holds for its life.

The root's address renders below from the release book the app ships.

Hookr’s core and own-hook contracts

HookrRoot is the hook every Hookr pool names, and each pool records the Rules it opens with. The combined core carries every Hook Block in one Rules contract, with six parts pinned by code hash and a key for each block HookrRoot admits.

HookrOwnedRootFactoryV2 deploys a hook of your own with its own lane, and the two swap modules are admitted under the combined core. Each is verified on chain; the table below lists these contracts.

ContractAddress
HookrRoot, the hook every Hookr pool names0x89c9FB50d1f03192230FFB1c279BB6E7d3Fe6aCc
HookrRules, the combined core0x342bAA22e202954593b04B7eD1663621E0565d46
HookrViewSwap, part of the combined core0x844faE4347517180bf4656b67E4BFc27D194693F
HookrClaims, part of the combined core0x8D0583b408e2959FA0450c54F749C1A4Dad3d335
HookrRecapture, part of the combined core0x97D440593912234b78432A030fb5186BD2A3Bc86
HookrLimitBlocks, part of the combined core0xc42E47679dd06DDcC07acc72ca710f6E60ACC3A9
HookrCoreBlocks, part of the combined core0xdA360B744F8C816acbb97fF65cC4Cd81e27Df375
HookrBinder, part of the combined core0x0B0f08c381ed6902FAb74b470fe7f8A58E8EA269
HookrCoreSettle, the library HookrCoreBlocks links0x7E169f0c49Db67F1a4f6f3c48A69B2e244b85191
HookrLauncher, for new tokens0x70a66ADF39B5c9FfEE4A9F081C182edfbb7DBD0C
HookrFamilyRouter, for new tokens0xbc56F48f873841d26a5a02575263d82f68e12864
HookrFamilyLock, for new tokens0x5248AF9139DaDEf0C5296342b7BE441deDf0adC2
HookrTokenDeployer, for new tokens0xE703F2Cd21A8dEE05dbC81b693201D602772B2d8
Swap Cut key0x9394881A6Fe570adEC4480471B4D52652d263878
Exit Clock key0x2b6aB976d05Dcc7Cad53bF9324Fe892511036348
Holder Pot key0x740b2Da80eBB44613C2b44f380D55ECBECbFf11f
Storm Fee key0xD577087cbf9bEC0Ca0392efD8A83C3fE6A09Bd1f
Wallet Cap key0xfe5c29D2d6B7aC383A63291a771197e4D83E1d9c
Buy/Sell Block's pause and lock key0xa64be3B5eC9B7310CBd3F77736ca5D6Fa81C5BCb
Sandwich Guard key0xa214e747d1a8E767F88ed2170be62E22ED79a269
King of the Pool key0xD691021b7cbee6bFB1ACF73A3E1126603D1B26F9
HookrOwnedRootFactoryV2, deploys a hook of your own with its own lane0x4888f030F9D789Bf71F45B275dA7A7812036dE7e
HookrLane, the lane of a hook HookrOwnedRootFactoryV2 deploys0xa83007AB66cF977132c58F5a138E1e92A005Fff3
HookrRamsesV3Fill, swap module admitted under the combined core0x446e409484dE756662f2C238c9bDECB9f50f5B8F
HookrPonsCurveFill, swap module admitted under the combined core0xEa0A512dFA4D8CcaFA31E485bd189703D8BaAa27
HookrLpBoost, LP Time-Lock Boost for gauges opened on it0xa301A960716a070394826092e6fF113A156A80D1
HookrCodeStoreRoot, code HookrOwnedRootFactoryV2 deploys from0xB41EB84679855602522ecd0093ff6343EB3ceEc4
HookrCodeStoreCore0, code HookrOwnedRootFactoryV2 deploys from0xd71167314A50589C7C8CD9Cc9C81939f5DDDb190
HookrCodeStoreCore1, code HookrOwnedRootFactoryV2 deploys from0xe4731fFC8a0A0C10213C872F5c17b3f895A82a83

Hookr’s contracts

The table lists Hookr’s 35 core contracts, rendered from the release book the app ships, source commit 412960b37a631ce145d49fb4a1887f04a4d1fa74: HookrRoot, the hook every Hookr pool names, first, then the contracts a swap passes through, then the rest in the order they were deployed.

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. None of the contracts they add is in the release book.

ContractAddress
HookrRoot0x89c9FB50d1f03192230FFB1c279BB6E7d3Fe6aCc
HookrRules0x4a71c270b1520F94064268102AebD744b0DE7942
HookrLane0x9A8a1006469BA196f8FEfc017a53505C83A060BB
HookrRecapture0xF83569E564d70daebc35950f66a73f2e2B915583
HookrRouter0xC2Bc9a3fe6c4Ce8C2F7EB4655b0869b01D8c93C9
HookrQuoter0x445D7891381Aa7F91F5048EdBC6a611ccBDe7865
HookrLauncher0x1cf2748A6670572425eAbf9Ab9e5BC4eb2eB8Ef4
HookrRegistry0x463c82beA1a52F4Cc05ca0741a24F0AD24bA4602
HookrTreasury0x2242F7FC75606500503075f29ea8cDA684EfB4a9
HookrForwarder0xe7863CC0E2Fb783b44c279aB159bcD812c2ceA1c
HookrRegistryChecks0xB9F5c54E5Cc7ac6c7a96335E5A334Cf4eA496E98
HookrRegistryAdmin0x675ac2102E8c69E2467F64656E3c235AF3901Ac1
HookrLaunchChecks0x8567369a70100828611BB6F44ec051B48F10fb59
HookrTokenDeployer0x1B23D6d7beBcB61E39317E9F0Bc02AEB91aFCcAe
HookrReferralRegistry0xefD1DfBA80c06E72F793601706c3a1c71aab3057
HookrProgramsAdmin0x40B40D65543E70a9C757eda1A2208517a8BC7292
HookrPrograms0x9fA204AC99176782Fd20615b2b2A516D1F8C328F
HookrMilestoneNFTFactory0xa340F964F1E685c681dC3ABB5B0405E608914d00
HookrProgramValidator0x33e0249083Be7Cd8bD2fe175E0671AcfD0516850
HookrReferralDistributor0x690539c53212899A9c6AEEE3b4B6737A5c4851d9
HookrFamilyRouter0x854f3Fa7AC342B244DF0d9A8c8F597b051aAE559
HookrFamilyLock0xfAFEcE64099C1E791C4B46189c277f00c0c7e00b
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.

ContractAddress
HookrLane, the arb recapture lane on HookrRoot0x9A8a1006469BA196f8FEfc017a53505C83A060BB
What The Hook's arb recapture executor, 25% of each arb recapture's profit0x4B4c16681401454140a9dBca55e5c186BBE8D728

The Gas Point

A swap on a pool with arb recapture on must carry the lane's gas floor plus its own gas. Read the floor as gasFloor from laneOf(id) on the root, or laneGasFloor in hookr-sdk. It is 6,802,619 at the lane's 3,000,000 gas cap. The root requires the whole floor before the first arb recapture runs, whether or not the lane finds a profit, so eth_estimateGas includes it.

A 0.001 ETH buy on ETH/HOOKR estimates at about 7.5 million now. Send the estimate plus a sixth, and never override the result downwards. A fixed limit should be at least 8.8 million. Unused gas is refunded.

How the Profit Splits

Each arb recapture profit splits three ways: the partner's executor keeps up to the lane's share, 25% today; Hookr takes its cut of the profit; and the rest is the pool's, split as it froze it at launch between the King of the Pool pot where the pool has one and its LPs. recaptureSplit in hookr-sdk works out a pool opened at 25% to the wei at the lane's share.

What The Hook's executor runs the arb recapture, and if it cannot, the trade goes through without it.

Quoting

Quote the path you route: HookrQuoter's quoteExactInputSingle and quoteExactOutputSingle, in V4Quoter's shape, for the Universal Router, and quote(Swap, payer) for HookrRouter. quoteDetailed(Swap, payer) adds the payer's arb recapture claim. Swapping and quoting has each call.

An arb recapture moves the pool's price, so a quote can be stale by one arb recapture even within the same block. Quote close to execution and use the amount bound for slippage.

What an Indexer Sees

Read the pool's terms from the pool, never from events: its Hook Blocks and its lane are frozen at launch. Keep arb recapture profit apart from swap fees: it is paid out of the arb's profit, never out of a trade.