Reading the hook.
The address, the bytecode, then a swap each way through its pool. A few seconds.
v4 hook · Robinhood Chain · block 93,176,580
0x3f7C…68cC
The eight checks
6 pools use this hook, the first one 7 d ago.
- 01caution
Permissions that touch your moneyThe address enables before swap returns delta, after swap returns delta. The hook is allowed to take; the next two checks measure whether it does.
- 02n/a
What it takes from a swapNo pool with liquidity to swap through yet.
- 03n/a
LPs can get outClosed to outside LPs: only the hook's own liquidity is in the pool.
- 04pass
The fee is the feeA fixed fee of 0%, written in the pool key.
- 05caution
No one holds the switchOwned by 0x20B254069882223BAcd3b0eaE25cC26D4142962c. Owner-style functions: setMarketRegistrationSpread, setBaseSpreadFloor, sweepDestination, setBaseSpread, setNativeShare, setSizeRungs.
- 06pass
The code cannot changeNot a proxy, no DELEGATECALL, no SELFDESTRUCT.
- 07pass
Only the PoolManager can call itEach callback refused a call that did not come from the PoolManager.
- 08pass
Track record6 pools over 7 days.
Measured at block 93,176,580. A hook with an owner or a dynamic fee can behave differently later; scan again before a large trade.
What the address allows
A v4 hook's permissions are the last fourteen bits of its address. The PoolManager calls only what they switch on.
address & 0x3fff0x28cc · 10100011001100
- bit 13Before initialize
- bit 12After initialize
- bit 11Before add liquidity
- bit 10After add liquidity
- bit 9Before remove liquidity
- bit 8After remove liquidity
- bit 7Before swap
- bit 6After swap
- bit 5Before donate
What it did to a real swap
A small swap each way and a liquidity round trip, run through the PoolManager and this hook inside a call that is never sent. The pool fee is expected; anything else missing is the hook.
WETH / TENDIES
fee 0%- Swap WETH → TENDIESno liquidity at the current price
- Swap TENDIES → WETHno liquidity at the current price
- Add, then remove liquiditydeposit refused: LiquidityNotAllowed
pool 0xcd51b28cb50cc0eb391b96c72ad17bce1f2a9ad290a6e026844c5a1eaac3a18d
Read from the bytecode
- Code size
- 24,013 bytes
- Owner
- 0x20B254069882223BAcd3b0eaE25cC26D4142962c
- Proxy
- no
- DELEGATECALL
- absent
- SELFDESTRUCT
- absent
- Outside calls
- 11
- Callbacks open to anyone
- none
Its functions, uncensored
Selectors found in the dispatcher, named from the public signature database. Red ones are what an owner usually keeps for itself.
- 0x0388a153 GEN4_POOL_NODE_GAS_ATTRIBUTED
- 0x05530999 GEN4_POOL_NODE_GAS
- 0x05d3cfdf DEFAULT_NATIVE_SHARE_BPS
- 0x0f0dc8a5 GEN4_POOL_SKIP_GAS
- 0x17d01716 unregisterPair
- 0x21d0ee70 beforeRemoveLiquidity
bit 4
After donate
bit 3Before swap returns deltabit 2After swap returns deltabit 1After add returns deltabit 0After remove returns delta- Before initialize. Runs once, when a pool is created.
- Before add liquidity. Can refuse a deposit, or only let some addresses provide liquidity.
- Before swap. Runs before every swap. On a dynamic-fee pool it can set the fee each time.
- After swap. Runs after every swap.
- Before swap returns delta. Can take part of what you put into a swap, or change how much is swapped.
- After swap returns delta. Can take part of what you get out of every swap.
0x259982e5 beforeAddLiquidity0x320ed5c8 sizeRungs0x454aca9e MAX_SPREAD_BPS0x466c5e1f setMarketRegistrationSpread0x490c98f5 tokenJar0x50879c1c weth90x50fb6aff GEN4_POOL_LEG_BASE_GAS0x529a2def spreadBpsFor0x557b4fd8 RedPacketCreated0x575e24b4 beforeSwap0x5b8fb17c GEN4_LISTING_LEG_MIN_GAS0x5e4aa0f3 listingSettlement0x5ebf3e9b listingRegistry0x673e0481 pairs0x67e92bcc setBaseSpreadFloor0x6c2bbe7e afterRemoveLiquidity0x6df282e1 GEN4_MAX_DEAD_RETIREMENTS0x6fe7e6eb afterInitialize0x70aaca57 jarFeeBps0x715018a6 renounceOwnership0x73cb5e30 GEN4_FINALIZATION_GAS_RESERVE0x79ba5097 acceptOwnership0x7ce46fb5 sweepDestination0x80f55605 market0x8da5cb5b owner0x95f4f05a registerPair0x9b8c6261 beaconSeeded0x9e250928 baseSpreadFloorBps0x9f063efc afterAddLiquidity0xa337663d CANONICAL_TICK_SPACING0xa9bf3933 registerPairFromMarket0xad1d17d2 accruedSpreadMargin0xad6d917b setBaseSpread0xafb9a5c1 setNativeShare0xb47b2fb1 afterSwap0xb6a8b0fa beforeDonate0xb7477db8 GEN4_POOL_NODE_GAS_RECYCLED0xbbcf1f1f resellerCode0xc1f48676 isPairRegistered0xc284f78b nativeShareBps0xc673b5b5 GEN4_MAX_POOL_NODES0xc8cbf10f setSizeRungs0xc99b0335 sweepMargin0xcd37200a isPairReady0xd3596e4e GEN4_MAX_LEG_GAS0xd47f6877 sweepETH0xd5ab76af setResellerCode0xdc4c90d3 poolManager0xdc98354e beforeInitialize0xdd372ee6 GEN4_POOL_NODE_GAS_ATTRIBUTED_RECYCLED0xe1a45218 BPS_DENOMINATOR0xe1b4af69 afterDonate0xe30c3978 pendingOwner0xe5948f8e accruedDust0xe85ebb59 GEN4_MAX_ATTEMPTS0xf0475791 setSweepDestination0xf2fde38b transferOwnership0xf365773d marketRegistrationSpreadBps