Reading the hook.
The address, the bytecode, then a swap each way through its pool. A few seconds.
v4 hook · Robinhood Chain · block 92,922,636
0xCf57…78CC
The eight checks
55 pools use this hook, the first one 55 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.
- 02pass
What it takes from a swapA swap through it pays the pool fee and nothing else.
- 03pass
LPs can get outLiquidity added and removed in the same block came back whole.
- 04caution
The fee is the feeIts pools use a dynamic fee that the hook sets before every swap. It stands at 0% now and can change.
- 05caution
No one holds the switchNo owner() but it has blockedBy.
- 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 record55 pools over 55 days.
Measured at block 92,922,636. 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 & 0x3fff0x38cc · 11100011001100
- 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.
SPY / SPY
fee dynamic, now 0%- Swap SPY → SPYnothing taken
- Swap SPY → SPYno liquidity above the price
- Add, then remove liquiditycame back whole
pool 0x455c8018741182531ae58ec834dd8b652546a6be049e00f5a1aad9d142a23428
ETH / SPRM
fee dynamic, now 0%- Swap ETH → SPRMnothing taken
- Swap SPRM → ETHnothing taken
- Add, then remove liquiditydeposit refused: NotPositionManager
pool 0xae8a223dfa6baf5fd36ea38dd07177744f1c22ce6c5c3d4b74a15491cdcb2d0e
Read from the bytecode
- Code size
- 23,400 bytes
- Owner
- none found
- Proxy
- no
- DELEGATECALL
- absent
- SELFDESTRUCT
- absent
- Outside calls
- 3
- 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.
- 0xdcf6836b quoteIsCurrency0
- 0xe1b4af69 afterDonate
- 0xf08cdfa2 liquidityAccessOf
- 0xf62983f0 rulesOf
- 0xc45a0155 unknown
- 0xc4e833ce getHookPermissions
- 0xdc4c90d3 poolManager
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.
- After initialize. Runs once, right after 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.
0xdc98354e beforeInitialize0xb0eae375 implementationHashOf0xb47b2fb1 afterSwap0xb6a8b0fa beforeDonate0xb996be53 isConfigured0x8e414478 engineVersionOf0x9f063efc afterAddLiquidity0xad69d4d5 platformSharePpmOf0x6fe7e6eb afterInitialize0x791b98bc positionManager0x8c17f334 initTimeOf0x8cf56d7c openingPriceOf0x4f214d78 cumulativeQuoteVolume0x575e24b4 beforeSwap0x6166e874 blockedBy0x6c2bbe7e afterRemoveLiquidity0x0dc5b294 configHashOf0x21d0ee70 beforeRemoveLiquidity0x259982e5 beforeAddLiquidity0x44a6fc9a referenceTickOf0x0177928f vaultOf0x06d3bb25 feePpmFor0x0b3bee39 configure