CoatFeeHook on Robinhood Chain

Uniswap v4 Hook Contract 0x51149a925e9193ea13ae406da6cc154eccd0a044 on Robinhood Chain · Fee sharing · Verified contract

Volume (24h)
$552
Value locked (TVL)
$16.97K
All-time volume
$4.72M
Pools using this hook
1
Swaps (24h)
7 (7 traders)
Total swaps
23,270

What it does

Skims a fixed 1% protocol fee from every swap on the COAT/ETH pool and routes the accrued ETH to a fee splitter and the accrued COAT to a burn sink.

How it works step by step

  • Takes a fixed 1% fee on the unspecified currency of every swap through afterSwap and afterSwapReturnDelta
  • Accrues fees inside the hook without forwarding them during the swap, so downstream failures cannot block trading
  • flush() permissionlessly sends accrued ETH to the FeeSplitter and burns accrued COAT
  • Only the launch initializer contract may initialize the pool with the expected pool key
  • Maintains a time-weighted average tick and price observation history with consult functions
  • Enforces a per-buy COAT cap during the launch restriction window via an external guard
Swap behaviour
On each swap, afterSwap records a TWAP observation, enforces a per-buy cap on COAT purchases during the launch restriction window, takes 1% of the unspecified-currency amount from the pool into the hook and returns it as a positive hook delta so the swapper covers the fee.
Liquidity behaviour
No liquidity callbacks.
Fee behaviour
Takes a fixed 1% (FEE_BPS = 100) of the unspecified-currency amount on every swap in afterSwap via poolManager.take and returns it as a positive hook delta; accrued ETH is forwarded to the ethSink (FeeSplitter) and accrued COAT is sent to the burn contract in permissionless flush().
Owner & admin controls
Owner (Ownable2Step) can only change the ETH sink address via setEthSink and transfer or renounce ownership; FEE_BPS is an immutable constant of 100 bps; no pause or upgrade path found.

Enabled Uniswap v4 callbacks

beforeInitialize, afterSwap, afterSwapReturnDelta

beforeInitialize restricts pool initialization to the launchInitializer contract and the expected pool key; afterSwap skims the 1% protocol fee and records TWAP observations; afterSwapReturnDelta lets the hook settle its fee as a positive delta on the swapper.

Security & trust assessment

Risk level: low (verified source, high confidence).

Who controls it: The owner cannot change the fee rate or pause swaps, but can redirect all future ETH fees by pointing ethSink to any address, which would divert the flywheel revenue.

Risk to user funds: The hook holds accrued ETH and COAT fees only between swaps and flush calls; it cannot move pool liquidity directly. Swaps are never blocked by downstream sink failures, but the owner can redirect accrued fees via setEthSink.

Security findings

  • [medium] Owner can redirect fee revenue: setEthSink lets the owner redirect all accrued ETH fees to an arbitrary address at any time, with no timelock or event-independent safeguard.
  • [low] External launch guard can block buys: afterSwap enforces a MAX_BUY cap on COAT purchases during the launch window via an external guard contract, so a misconfigured or upgraded guard could block large buys during that window.
  • [info] Fee distribution is permissionless and non-reverting: flush() is permissionless and sends the entire ETH balance to ethSink with a low-level call; a failed send leaves funds accrued rather than reverting, so trading is not blocked.
  • [info] Fixed immutable 1% swap fee: The hook takes a 1% fee from every swap's unspecified currency; the fee is bounded and immutable.

Contract details

Verified source
Yes (CoatFeeHook)
Compiler
solc 0.8.24+commit.e11b9ed9
Bytecode size
7,768 bytes
Upgradeable proxy
No
Detected patterns
launchpad, moves-currency, ownable, return-delta

Pools using CoatFeeHook