QuiverHook on Robinhood Chain
Uniswap v4 Hook Contract 0x1c500ad759bf4c109b8b2391fdcc7853d278cac0 on Robinhood Chain · Launchpad · Verified contract
- Volume (24h)
- $575
- Value locked (TVL)
- $3.89K
- All-time volume
- $622.97K
- Pools using this hook
- 1
- Swaps (24h)
- 89 (62 traders)
- Total swaps
- 16,894
What it does
A QVR launch hook that owns a single-sided QVR/WETH Uniswap v4 position, charges a 50% LP fee and enforces a 1% per-wallet cap on buys until the reserve renounces, then drops the fee to 2%.
How it works step by step
- Holds and mints the protocol's QVR-only liquidity position between the minimum tick and tickUpper, initialized at the upper bound so it contains no WETH
- Overrides the LP fee to 50% on every swap while maxWalletEnabled is true, then to 2% after disableMaxWallet is called
- Blocks outside liquidity adds and removes on this pool, so only the hook itself can change the position
- Enforces a 1% of total supply cap on QVR received by buyers in afterSwap until the reserve turns it off
- Lets the reserve harvest fees, or remove up to 1% of liquidity per call through a pool manager unlock callback
- Settles or takes currency deltas to the reserve or a recipient inside unlockCallback
- Swap behaviour
- beforeSwap sets a dynamic 50% LP fee while the max-wallet window is on and 2% afterwards. afterSwap rejects QVR buys that would push a non-reserve buyer above 1% of total supply, reading the buyer from hookData when it is 32 bytes or from the sender otherwise.
- Liquidity behaviour
- The hook owns a single-sided QVR position between TICK_LOWER (-887200) and tickUpper, minted once by initializeLiquidity from QVR the launcher transfers in. beforeAddLiquidity and beforeRemoveLiquidity only allow the hook itself (sender == address(this)) on this exact pool, so outside LPs cannot add or remove liquidity. Position liquidity is reduced only through harvest by the reserve.
- Fee behaviour
- beforeSwap overrides the LP fee to 50% (500000 hundredths of a bip) while maxWalletEnabled is true, and to 2% after disableMaxWallet is called. The fee is set via the override flag and the pool was initialized with the dynamic-fee flag. The hook takes no fee of its own and returns no swap delta.
- Owner & admin controls
- Only the reserve address can call disableMaxWallet (one-shot, turns off the 1% max wallet and drops the LP fee to 2%) and harvest (removes 1% of liquidity when prune is true, or collects fees otherwise). The launcher alone can call initializeLiquidity, once. No owner, pause, upgrade proxy or parameter setter was found in the source; the pool and fee constants are immutable.
Enabled Uniswap v4 callbacks
beforeAddLiquidity, beforeRemoveLiquidity, beforeSwap, afterSwap
beforeAddLiquidity: blocks any liquidity add not initiated by the hook itself. beforeRemoveLiquidity: blocks any liquidity removal not initiated by the hook itself. beforeSwap: sets the dynamic LP fee to 50% during the launch window or 2% after renounce. afterSwap: enforces the 1% max wallet cap on QVR received by buyers while maxWalletEnabled is true and the sender is not the reserve.
Security & trust assessment
Risk level: medium (verified source, high confidence).
Who controls it: The reserve can harvest and remove up to 1% of the position per call, and it alone decides when the max-wallet cap and 50% fee end. The hook has no admin key that can freeze swaps, change the fee arbitrarily, or upgrade the logic. The reserve cannot change the pool key, tick range or fee tiers.
Risk to user funds: The hook holds the QVR liquidity position on the QVR/WETH pool and can release up to 1% of it per harvest call through the reserve. It does not hold trader funds in custody and does not block swaps, but a buyer's transfer can be rejected by the afterSwap max-wallet check while the cap is active.
Security findings
- [medium] Punitive 50% fee during launch window: While maxWalletEnabled is true, every swap pays a 50% LP fee, which is set by the hook and not by the pool. Traders get very poor execution until the reserve calls disableMaxWallet.
- [medium] Max wallet cap can be bypassed by routing: afterSwap checks the buyer's balance against maxWallet using the hookData address or the sender. A buyer can route through a different recipient or a contract wallet to bypass the per-address check, so the cap is advisory rather than absolute.
- [low] Reserve can withdraw position liquidity: The reserve can call harvest with prune true to remove 1% of the position each time. This is a real, reserve-controlled withdrawal of pool liquidity, though it is bounded per call.
- [info] Single privileged reserve role: The hook is the only LP and the sole recipient-settlement path for its own liquidity. The reserve controls the timing of disableMaxWallet and harvest, so there is a single privileged role over the pool's launch mechanics.
Contract details
- Verified source
- Yes (QuiverHook)
- Compiler
- solc 0.8.21+commit.d9974bed
- Bytecode size
- 8,105 bytes
- Upgradeable proxy
- No
- Detected patterns
- dynamic-fee, erc20, launchpad, moves-currency, self-unlock
Pools using QuiverHook
- WETH / QVR (Dynamic fee) — 24h volume $575, TVL $3.89K, 89 swaps today