Likely access control hook on Ethereum

Uniswap v4 Hook Contract 0x00f8e87bd467b7b436b95b78a08335ede40ceac0 on Ethereum · Access control

Volume (24h)
$0
Value locked (TVL)
$0
All-time volume
$301.15K
Pools using this hook
4
Swaps (24h)
0 (0 traders)
Total swaps
17

What it does

An owner-gated Uniswap v4 hook that whitelists which addresses can initialize pools and includes swap and liquidity callbacks whose exact effects could not be fully determined from bytecode alone.

How it works step by step

  • Gates pool initialization via a whitelist mapping stored at slot 2, checked in beforeInitialize.
  • Owner manages the whitelist with support(address,bool).
  • Owner can transfer ownership through a two-step nominate and accept flow.
  • Owner can withdraw tokens from the hook with withdraw(address,uint256).
  • Enables beforeSwap and afterSwap callbacks that appear to move currency via take, settle and sync.
  • Enables beforeAddLiquidity and beforeRemoveLiquidity callbacks, which are view functions that likely gate liquidity changes.
Swap behaviour
beforeSwap and afterSwap are enabled and nonpayable, and the hook references take, settle, sync and transfer selectors, so it likely interacts with currency during swaps. The exact logic could not be confirmed without source.
Liquidity behaviour
beforeAddLiquidity and beforeRemoveLiquidity are declared as view functions and appear to only gate liquidity actions; afterAddLiquidity and afterRemoveLiquidity are pure stubs with no state changes.
Fee behaviour
Uses the pool's static fee. No fee logic was identified in the decoded functions.
Owner & admin controls
Two-step ownership: transferOwnership(address) nominates a new owner and acceptOwnership() completes the transfer. The owner can call support(address,bool) to whitelist or un-whitelist addresses in a mapping(address=>bool) at storage slot 2, which is read by beforeInitialize. The owner can also call withdraw(address,uint256) to move tokens out of the hook.

Enabled Uniswap v4 callbacks

beforeInitialize, beforeAddLiquidity, beforeRemoveLiquidity, beforeSwap, afterSwap

beforeInitialize: checks the caller against the whitelist mapping and reverts if it is not allowed. beforeAddLiquidity and beforeRemoveLiquidity: enabled callbacks, implemented as view functions, likely used to gate liquidity actions. beforeSwap: enabled callback, nonpayable, decoded but its body logic could not be identified. afterSwap: enabled callback, nonpayable, decoded but its body logic could not be identified.

Security & trust assessment

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

Who controls it: The owner controls which addresses may initialize pools through the whitelist and can withdraw any tokens the hook holds. A compromised owner key could drain hook-held balances or block pool initialization for non-whitelisted callers.

Risk to user funds: The hook has transfer and withdraw paths, so it may hold tokens during swap or liquidity operations. The owner can withdraw tokens from the hook. Without verified source, the full extent of exposure and any fund-holding logic cannot be confirmed.

Security findings

  • [medium] Owner can withdraw hook-held tokens: withdraw(address,uint256) is callable by the owner and transfers tokens out of the hook. Its exact recipient and token handling could not be fully verified from bytecode alone.
  • [low] Hook moves currency: The hook calls take, settle, sync and transfer selectors, so it moves currency during pool operations. Whether it holds user funds long-term could not be confirmed.
  • [info] Two-step ownership transfer: Ownership transfer requires the new owner to call acceptOwnership(), which reduces the risk of transferring to a wrong address.
  • [info] Pool initialization is gated by whitelist: Whitelist check in beforeInitialize restricts which callers can initialize pools that use this hook.

Contract details

Verified source
No
Bytecode size
14,050 bytes
Upgradeable proxy
No
Detected patterns
moves-currency, ownable

Pools using Likely access control hook