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
- ETH / COAT (1.00% fee) — 24h volume $552, TVL $16.97K, 7 swaps today