Fee sharing hook on Ethereum

Uniswap v4 Hook Contract 0x11f53f6eb1444efe1071c54e9694da1e17b4abc4 on Ethereum · Fee sharing

Volume (24h)
$1.74K
Value locked (TVL)
$0
All-time volume
$1.74K
Pools using this hook
1
Swaps (24h)
18 (13 traders)
Total swaps
18

What it does

This hook takes a fee on swaps through a return delta and routes the collected fees to a configured recipient, so swappers pay that fee on each trade while liquidity providers are not directly charged by it, though the exact rates and direction of any trade-size or price-direction effect could not be confirmed from the bytecode.

How it works step by step

  • Holds a Uniswap v4 pool position and forwards trading fee revenue according to a stored project and genesis configuration
  • Activates once via activate(address) which sets the stored address and a one-time activated flag, reverting with AlreadyActivated on repeat calls
  • Uses a self-unlock pattern through unlock/unlockCallback to call modifyLiquidity, settle, take and sync on the pool manager
  • Collects accrued fees for a recipient via collectFees(address,address) and lets a caller reclaim a position amount via reclaim(uint128,address)
  • Tracks a capacity value and entry/market tick values, and reads a pool key and hook permissions
  • Gates liquidity additions and removals and performs an afterSwap accounting step that can return a delta to the pool manager
Swap behaviour
beforeSwap and afterSwap run on every swap. afterSwap can return a balance delta (afterSwapReturnDelta is enabled), so the hook can take a share of swap output in the pool currency; the exact fee rate is held in a TRADE_FEE_BPS constant that is not decoded here.
Liquidity behaviour
beforeAddLiquidity and beforeRemoveLiquidity gate liquidity changes, and afterRemoveLiquidity runs after removals. The hook itself manages a single protocol-owned position it creates through the unlock flow; external provider liquidity handling is not fully decoded.
Fee behaviour
Trading fees are routed by the hook rather than left to the pool's static fee: a TRADE_FEE_BPS constant is read and fees are collected and distributed through collectFees and reclaim. The exact split between project and other recipients cannot be determined from bytecode alone.
Owner & admin controls
activate(address) can be called once to set the configured address; no owner or pause function was clearly decoded. Whether reclaim and collectFees are restricted to a privileged role could not be confirmed from bytecode.

Enabled Uniswap v4 callbacks

beforeInitialize, beforeAddLiquidity, beforeRemoveLiquidity, afterRemoveLiquidity, beforeSwap, afterSwap, afterSwapReturnDelta

beforeInitialize validates pool setup; beforeAddLiquidity and beforeRemoveLiquidity gate liquidity changes; afterRemoveLiquidity handles post-removal accounting; beforeSwap and afterSwap run swap logic; afterSwapReturnDelta lets the hook take a delta from swap output.

Security & trust assessment

Risk level: medium, estimated (decoded bytecode, low confidence).

Who controls it: A privileged caller, if one exists for reclaim or collectFees, could redirect accrued fees or position value to an address of their choosing; the source is needed to confirm access control.

Risk to user funds: The hook holds a liquidity position and can take a delta from swap output, so user swap proceeds are exposed to the fee logic; funds held in the position can be withdrawn through reclaim.

Security findings

  • [medium] Return delta takes swap output: afterSwapReturnDelta is enabled and afterSwap moves currency through the pool manager, so the hook can take a share of user swap output.
  • [medium] Authorisation of reclaim and collectFees unclear: reclaim(uint128,address) and collectFees(address,address) move position value and fees to an address argument; without verified source it is not clear whether these are restricted to a privileged caller.
  • [low] One-time activation: activate(address) sets stored configuration once and reverts with AlreadyActivated afterwards, so the configured address is fixed after the first call, but the first caller's authority to set it is not confirmed.

Contract details

Verified source
No
Bytecode size
9,925 bytes
Upgradeable proxy
No
Detected patterns
erc20, fee-sharing, moves-currency, return-delta, self-unlock

Pools using Fee sharing hook