Crest on Robinhood Chain
Uniswap v4 Hook Contract 0x0b19335de7a3fc6d78cf47e1b275b93fbbbc20cc on Robinhood Chain · Fee sharing · Verified contract
- Volume (24h)
- $136
- Value locked (TVL)
- $0.98
- All-time volume
- $136
- Pools using this hook
- 1
- Swaps (24h)
- 20 (3 traders)
- Total swaps
- 20
What it does
Every swap of a Weir home pool pays a flat 2% skim on its ETH side, whether buying or selling the coin, and that skim goes to the coin's keeper rather than to liquidity providers.
This read was written for the hook 0xad74…20cc on Robinhood Chain and reused here: the two share a code shape, so constants such as fees, owners and addresses can differ.
How it works step by step
- Shared Uniswap v4 hook for Weir home pools (ETH paired with each Reach coin, fee 0, tick spacing 1), registering a pool only when the Headworks opens it
- Skims a flat 2% of each swap's ETH side (SKIM_BPS = 200) and books it into a per-reach basin, backed by an ERC-6909 claim minted to the hook
- Lets only the reach's keeper draw down its basin, burning the hook's ETH claim and taking the ETH to the keeper
- Maintains a high-water mark per pool equal to the lowest tick the pool has touched, updated downward in afterSwap
- Reverts on all liquidity and donate callbacks, so only swaps and initialization are wired
- Swap behaviour
- On swaps of home pools, a 2% skim is taken from the ETH side: for ETH-specified exact-in legs it is removed from the ETH input before the pool runs, for ETH-specified exact-out legs the pool is asked for a grossed-up ETH amount, and for coin-specified legs it is computed in afterSwap from the ETH actually moved. Buyers paying ETH and sellers receiving ETH both pay the skim; the trade is otherwise priced by the pool. Non-home pools revert.
- Liquidity behaviour
- No liquidity callbacks. beforeAddLiquidity, afterAddLiquidity, beforeRemoveLiquidity, afterRemoveLiquidity, beforeDonate and afterDonate all revert with NotWired.
- Fee behaviour
- The pool's LP fee is fixed at 0 and cannot change. The hook takes a 2% skim on the ETH side of every swap via return deltas, sent entirely to the keeper's basin rather than to LPs.
- Owner & admin controls
- No owner, pause, setter or upgrade path found in the hook. The immutables are the PoolManager and Headworks address. Only the reach's keeper (read from the Reach contract) can call drawdown. The Reach token renounces ownership in its constructor.
Enabled Uniswap v4 callbacks
beforeInitialize, beforeSwap, afterSwap, beforeSwapReturnDelta, afterSwapReturnDelta
beforeInitialize registers and validates the pool and sets its high-water mark; beforeSwap takes the skim for ETH-specified legs via a before-swap return delta; afterSwap takes the skim for coin-specified legs via an after-swap return delta and lowers the high-water mark when the tick falls; afterSwapReturnDelta and beforeSwapReturnDelta let the hook claim a portion of swap amounts.
Security & trust assessment
Risk level: medium (verified source, medium confidence).
Who controls it: No owner or pausing key exists in the hook; the only privileged actor is the per-reach keeper, which can withdraw that reach's accumulated ETH skim. The Headworks address is fixed in the constructor and controls which pools are opened.
Risk to user funds: The hook holds ERC-6909 claims on the PoolManager backing the basins and can take up to 2% of ETH on swaps via return deltas; it does not custody LP liquidity, and no function lets anyone other than the keeper move basin funds out.
Security findings
- [info] Return-delta skim on every swap: The hook claims 2% of the ETH side of every home pool swap through beforeSwapReturnDelta and afterSwapReturnDelta, so traders pay this on each trade and it is the hook's only revenue.
- [medium] Keeper-only basin withdrawal: drawdown lets the keeper named in each Reach burn the hook's ETH claim and receive accumulated skim; the keeper therefore receives all skim proceeds for that reach, and the keeper address is set at the Reach constructor and not changeable in the decoded source.
- [low] Coin-specified legs revert on unfilled amounts: afterSwap reverts with Unfilled when an ETH-named leg does not fill exactly as expected, because the skim was already booked in beforeSwap.
- [info] Mark can only move downward: highWater is lowered in afterSwap whenever the tick falls below it and is otherwise unchanged; it is readable on-chain and not set by any privileged key.
Contract details
- Verified source
- Yes (Crest)
- Compiler
- solc 0.8.26+commit.8a97fa7a
- Bytecode size
- 8,563 bytes
- Upgradeable proxy
- No
- Detected patterns
- erc6909-claims, moves-currency, return-delta, self-unlock
Pools using Crest
- ETH / WEIR (0.00% fee) — 24h volume $136, TVL $0.98, 20 swaps today