Knot on Robinhood Chain
Uniswap v4 Hook Contract 0x20814fd7871db50e433c3b6b7636a2c284d920cc on Robinhood Chain · Fee sharing · Verified contract
- Volume (24h)
- $0
- Value locked (TVL)
- $0
- All-time volume
- $0
- Pools using this hook
- 2
- Swaps (24h)
- 7 (2 traders)
- Total swaps
- 7
What it does
Every swap through this pool pays a fixed 3.1% tax in ETH that is sent to a fixed hand wallet, with buyers paying it on top of or out of their ETH and sellers having it deducted from their proceeds.
This read was written for the hook 0xdeca…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
- Charges a fixed 3.1% tug (TUG_BPS = 310) on every swap, denominated in ETH, the pool's currency0 side
- Takes the tug to a fixed hand wallet inside the same swap via poolManager.take, so buyers pay it on top of or out of their ETH and sellers receive it out of their proceeds
- If the hand refuses ETH, mints an ERC-6909 claim to the hook (held) that release() can later carry over to the hand
- Maintains a per-pool gauge with swap count, buy count, ETH volume, tug paid, last swap time and crest tick (lowest tick reached, i.e. highest price)
- Restricts initialization to the spool address and requires the pool to be ETH-paired with a zero static fee
- Reverts on all liquidity add/remove and donate callbacks, so liquidity is not managed through the hook
- Swap behaviour
- On exact-input buys (ETH in) and exact-output sells, beforeSwap takes the tug as a specified-side delta: tugOutOf(ETH in) is taken off the buyer's input. On exact-output buys and exact-input sells, afterSwap computes the tug from the realised pool ETH and takes it as an unspecified-side delta: on buys tugOnTopOf(pool ETH) is charged on top, on sells tugOutOf(pool ETH) is deducted from proceeds. Each swap therefore pays roughly 3.1% of its ETH side, with buys paying slightly more when the tug is added on top of the pool amount.
- Liquidity behaviour
- No liquidity callbacks. beforeAddLiquidity, afterAddLiquidity, beforeRemoveLiquidity, afterRemoveLiquidity revert with NotImplemented. The description states the pool's single position is minted to a dead address by the spool, so liquidity is not guarded by the hook but is not add/remove-managed by it either.
- Fee behaviour
- The pool's static fee must be zero. The 3.1% tug is a return-delta charge taken by the hook, not an LP fee. Tug is delivered to the hand wallet in ETH; undelivered tug is held as an ERC-6909 claim and tracked in held and delivered counters.
- Owner & admin controls
- No owner, setter, pause, blocklist or upgrade mechanism is present in the source. The hand address and TUG_BPS are immutable or constant, and the pool manager, spool, and tick range are fixed at construction. Anyone may call release() to move held claims to the hand.
Enabled Uniswap v4 callbacks
beforeInitialize, beforeSwap, afterSwap, beforeSwapReturnDelta, afterSwapReturnDelta
beforeInitialize restricts pool creation to the spool and records the initial crest tick; beforeSwap takes the tug on specified-side swaps via a before-swap return delta; afterSwap takes the tug on unspecified-side swaps and updates the gauge via an after-swap return delta; the other hook callbacks are enabled only as reverting stubs.
Security & trust assessment
Risk level: medium (verified source, high confidence).
Who controls it: No privileged function exists on the hook itself, but the immutable hand address receives all tug revenue and the spool is the only initializer; a compromised hand or spool cannot change the hook's parameters but would control where fees flow.
Risk to user funds: The hook can take 3.1% of each swap's ETH side and send it to the hand via return deltas, and it can hold undelivered tug as ERC-6909 claims. It does not custody token-side funds and does not block swaps, so funds are exposed to the fixed levy and to the hand's receipt of it.
Security findings
- [info] Fixed 3.1% tug taken from every swap: TUG_BPS is a constant 310 basis points, so every swap pays a fixed ETH levy to the hand address regardless of conditions; users cannot opt out except by not trading the pool.
- [medium] Hook takes ETH via return deltas: beforeSwapReturnDelta and afterSwapReturnDelta let the hook extract ETH from swap flows and take it to the hand, so the hook directly moves user and pool value on every trade.
- [low] Hand-refusal fallback mints ERC-6909 claims: If poolManager.take to the hand reverts, the tug is minted as a claim to the hook and tracked in held; these claims depend on release() being called and the hand eventually receiving them.
- [medium] Hand address is a single immutable recipient: All tug revenue goes to one fixed wallet set at construction, so that key's holder receives the entire fee stream with no on-chain change or governance path.
- [info] Pool initialization gated to spool: beforeInitialize reverts unless sender is the spool, so only the spool can create pools using this hook.
Contract details
- Verified source
- Yes (Knot)
- Compiler
- solc 0.8.26+commit.8a97fa7a
- Bytecode size
- 8,521 bytes
- Upgradeable proxy
- No
- Detected patterns
- erc6909-claims, moves-currency, return-delta, rewards, self-unlock