DualPoolHook on Robinhood Chain

Uniswap v4 Hook Contract 0xd1bcbcca41f3bdb6b4812652959c6df725ea2ac0 on Robinhood Chain · Liquidity management · Verified contract

Volume (24h)
$5.49K
Value locked (TVL)
$0
All-time volume
$311.66K
Pools using this hook
34
Swaps (24h)
304 (137 traders)
Total swaps
23,618

What it does

DualPoolHook is a Uniswap v4 hook that pools two-token liquidity in ERC-4626 vaults and deploys it as just-in-time concentrated positions across configurable tick ranges during each swap.

How it works step by step

  • Deploys multi-range concentrated liquidity from vault and raw token balances during each swap, then tears it down afterwards
  • Rehypothecates idle assets into owner-configured ERC-4626 vaults between swaps and withdraws only what is needed for deployment
  • Issues non-transferable pool shares for LP deposits and redemptions, with a bootstrap seeded by the owner and virtual-shares inflation protection
  • Enforces per-pool deposit locks, deadlines, slippage bounds and a reentrancy JIT lock to prevent deposit-swap-withdraw sniping
  • Blocks direct v4 liquidity modification and pool initialization so only the hook controls the pool's price and depth
Swap behaviour
beforeSwap reverts if the pool is paused, otherwise takes the JIT lock and deploys the configured buckets from pool-owned balances (redeeming claims and withdrawing only the shortfall from vaults). afterSwap removes those positions, settles the hook's net deltas, re-deposits idle balances into vaults and releases the lock. Swaps charge the static pool fee.
Liquidity behaviour
Direct external addLiquidity/removeLiquidity to the v4 pool is blocked. Hook-level share deposits (addLiquidity, gated by owner or external-deposit flag) and withdrawals (removeLiquidity, with same-block/minimum-block deposit lock and slippage bounds) mint and burn pro-rata shares over assets held in ERC-4626 vaults, raw ERC-20 and ERC-6909 claims.
Fee behaviour
Pool fee is the static PoolKey.fee fixed at creation; dynamic-fee pools are rejected. The hook does not set or share fees and ignores hookData.
Owner & admin controls
Owner (Ownable2Step, renounce disabled) controls initializePool, bootstrap, setDistribution, setExternalDeposits, setPoolLive (per-pool pause), refreshVaultApproval, and emergencyRevokeVault which pauses the pool, disables external deposits, zeroes vault allowances and best-effort drains vault positions. Vault and minDepositBlocks bindings are immutable after pool init. Owner transfer is two-step.

Enabled Uniswap v4 callbacks

beforeInitialize, beforeAddLiquidity, beforeRemoveLiquidity, beforeSwap, afterSwap

beforeInitialize: blocks direct pool initialization so only initializePool can set the starting price. beforeAddLiquidity/beforeRemoveLiquidity: revert external LP modifications so only the hook's JIT cycle adds or removes positions. beforeSwap: pauses swaps if the pool is not live, takes the JIT lock, and deploys multi-range concentrated liquidity from vault and pool balances. afterSwap: removes the JIT positions, settles net deltas, re-deposits idle balances to vaults and clears the lock.

Security & trust assessment

Risk level: medium (verified source, high confidence).

Who controls it: The owner can pause any pool, change the distribution weights and tick ranges, toggle external deposits, and run emergencyRevokeVault. The owner cannot change the swap fee, but can sweep vault-held assets back to the hook during emergencyRevokeVault and the hook holds the pool's pooled capital, so a compromised owner key could pause or redirect exposure within the hook's own accounting.

Risk to user funds: Depositors' funds are held in the hook as ERC-20, ERC-6909 claims and ERC-4626 vault shares that the hook manages. The owner can pause swaps, change the deployment distribution and revoke vault exposure, and a compromised vault or ERC-20 could affect pooled balances. Liquidity exits via removeLiquidity remain open while the pool is paused.

Security findings

  • [medium] Vault trust and infinite approval: Vaults are per-currency ERC-4626 contracts with max approval granted at init; a compromised or malicious vault could drain the hook's raw ERC-20 balance for that currency, which is shared across pools that use the same token.
  • [medium] Owner pause and emergency revoke: Owner can pause a pool via setPoolLive, which causes beforeSwap to revert with PoolNotLive, halting trading, and can disable external deposits and revoke vault exposure via emergencyRevokeVault.
  • [low] Owner-controlled distribution: Owner can replace the liquidity distribution at any time via setDistribution (blocked only during a JIT cycle), changing where pool capital is deployed and the effective swap curve.
  • [info] Anti-sniping and reentrancy guards present: Per-pool deposit lock (minDepositBlocks) and deadline/slippage checks on addLiquidity and removeLiquidity protect against same-block deposit-then-withdraw sniping; the JIT lock blocks reentrant LP calls during a swap cycle.
  • [info] Vault validation at initialization: Vault fee-on-entry and fee-on-exit tokens are rejected at pool initialization, and vault asset mismatches are rejected, which reduces the chance of silently mis-accounted vault shares.

Contract details

Verified source
Yes (DualPoolHook)
Compiler
solc 0.8.26+commit.8a97fa7a
Bytecode size
24,412 bytes
Upgradeable proxy
No
Detected patterns
dynamic-fee, liquidity-management, moves-currency, ownable, self-unlock

Pools using DualPoolHook