Brush on Robinhood Chain
Uniswap v4 Hook Contract 0xf5e1b5b02506fa728774610d5a1f5c3d70f9e0cc on Robinhood Chain · Fee sharing · Verified contract
- Volume (24h)
- $1.03K
- Value locked (TVL)
- $0
- All-time volume
- $1.03K
- Pools using this hook
- 1
- Swaps (24h)
- 14 (6 traders)
- Total swaps
- 14
What it does
Every swap through this token's home ETH pool pays a fixed ETH toll of 0.75% to 5%, with the same rate applied in both directions, and that toll is split across keeper-controlled caches while liquidity cannot be added or removed through the hook.
How it works step by step
- Charges a toll in ETH on every swap through the single home pool (the ERC20 paired with ETH), set at deploy between 0.75% and 5% via tollBps.
- Takes the toll via beforeSwapReturnDelta or afterSwapReturnDelta depending on swap leg, so the hook keeps part of the trader's input or output.
- Mints ERC-6909 ETH claims on the PoolManager for each toll, so collected fees remain backed inside the PoolManager rather than held by the hook as raw ETH.
- Splits each toll across four bookkeeping caches: 80% to the digger side (split between digger and pack by creditsBps), 10% to range, and the remainder to den.
- Lets only each cache's keeper call empty(), which burns the ETH claim via unlock and transfers ETH to that keeper.
- Mints a fixed one billion token supply to the deployer at construction and renounces ownership immediately; no pause, blacklist or transfer tax is present in the source.
- Swap behaviour
- Only swaps on the home pool (the pool with this token and native ETH, fee 0, tick spacing 1) are tolled; other pools revert. For buys with exact ETH input, the toll is taken from the ETH input before the pool swap, so the pool sees the reduced amount. For sells with exact ETH output, the pool is asked for a grossed-up ETH amount and the toll is the difference, so the trader receives the requested ETH. For buys with exact coin output and sells with exact coin input, the toll is computed in afterSwap from the ETH actually moved and taken as a share of that ETH. Every swap pays the same rate, tollBps, applied to the ETH leg; no direction is favoured in the toll rate itself.
- Liquidity behaviour
- Liquidity callbacks (beforeAddLiquidity, afterAddLiquidity, beforeRemoveLiquidity, afterRemoveLiquidity, donate callbacks) are all wired to revert with NotWired, so adding or removing liquidity through hooked pools is blocked. The pool is only initialised once from the Den and the hook does not manage liquidity itself.
- Fee behaviour
- The pool itself uses a static fee of 0. The hook adds a separate ETH toll of tollBps (75 to 500 basis points, fixed at deploy as an immutable) on each swap, which is split across the four caches as described above. The toll is not adjustable after deployment.
- Owner & admin controls
- Ownable is inherited, but ownership is renounced in the constructor so owner() is zero from the first block; no owner-only functions remain. There is no pause, no upgrade mechanism, no proxy, and no function to change tollBps, the cache keepers, or the pool. The four keeper addresses are immutable and only each keeper can empty its own cache.
Enabled Uniswap v4 callbacks
beforeInitialize, beforeSwap, afterSwap, beforeSwapReturnDelta, afterSwapReturnDelta
beforeInitialize restricts pool initialisation to the Den with the exact canonical key. beforeSwap computes and stashes the toll for exact-input ETH buys and exact-output ETH sells, returning a delta to the PoolManager. afterSwap computes and stashes the toll for the other two legs and validates that partial fills did not occur. beforeSwapReturnDelta and afterSwapReturnDelta allow the hook to take its toll via returned deltas.
Security & trust assessment
Risk level: low (verified source, high confidence).
Who controls it: No owner or admin key remains after construction (ownership renounced). The fixed keeper addresses can withdraw their respective cache balances in ETH at any time; no key can change the toll rate, pause swaps, or move the token balances of users.
Risk to user funds: The hook can take up to tollBps of ETH per swap via return deltas and holds that value as ERC-6909 claims inside the PoolManager; users' coin balances are not moved by the hook. Trade execution is not blocked by any admin switch, though partial fills revert.
Security findings
- [info] Toll taken via return deltas: The hook keeps part of every home-pool swap through beforeSwapReturnDelta and afterSwapReturnDelta, so traders pay a fixed ETH toll of 0.75% to 5% that cannot be changed after deployment.
- [low] Swaps revert on partial fills: afterSwap reverts with PartialFill if a coin-named or ETH-named leg did not fill exactly as the toll calculation assumed, so some partially filled or unusual trades will fail rather than settle.
- [low] Keeper-controlled cache withdrawals: Each of the four keepers (digger, pack, range, den) can withdraw ETH from its own cache at any time via empty(), so accumulated tolls are fully controlled by those keeper addresses, which are fixed at deploy.
- [info] Liquidity actions disabled: All liquidity and donate hook callbacks revert with NotWired, so LPs cannot add or remove liquidity through this hook's pool.
Contract details
- Verified source
- Yes (Brush)
- Compiler
- solc 0.8.26+commit.8a97fa7a
- Bytecode size
- 8,100 bytes
- Upgradeable proxy
- No
- Detected patterns
- erc20, moves-currency, ownable, return-delta, self-unlock, tax
Pools using Brush
- ETH / RELAY (0.00% fee) — 24h volume $1.03K, TVL $0, 14 swaps today