DopplerHookInitializer on Arbitrum

Uniswap v4 Hook Contract 0xaa7f809bb3752f715fa2e418230667c382a56544 on Arbitrum · Launchpad · Verified contract

Volume (24h)
$126
Value locked (TVL)
$1.59K
All-time volume
$230.80K
Pools using this hook
56
Swaps (24h)
47 (3 traders)
Total swaps
3,937

What it does

A launchpad initializer hook for Doppler multicurve pools that seeds a Uniswap v4 pool with bonding-curve liquidity, optionally applies a dynamic fee and swap-time fee capture controlled by an attached Doppler hook, and lets fee beneficiaries claim their share of LP fees.

How it works step by step

  • Deploys a new asset/numeraire pool through the Airlock: initialize() pulls the bonding-curve tokens from the Airlock, creates a Uniswap v4 pool with this contract as the hook, and mints multicurve liquidity positions across the configured curves.
  • Optionally sets the pool to a dynamic LP fee when a Doppler hook is attached; the attached hook can call updateDynamicLPFee to change the fee, capped at 10% (MAX_LP_FEE = 100_000 out of 1_000_000).
  • On afterSwap, if the attached Doppler hook has the swap flag enabled, the hook returns a fee amount in one currency; the initializer takes that amount from the PoolManager and settles it to the Doppler hook address.
  • Records each pool's beneficiaries and shares at launch; collectFees pulls LP fees from the positions and accumulates them so each beneficiary can claim pro-rata via releaseFees logic in collectFees and updateBeneficiary.
  • Graduation and exit: once the price reaches a far tick, anyone can call graduate() (Doppler hook must have the graduation flag) or the Airlock can call exitLiquidity() to burn all positions and send the proceeds to the Airlock for migration.
Swap behaviour
afterSwap calls the attached Doppler hook's onSwap when the swap flag is enabled for that hook; if it returns a positive delta, the initializer takes that currency from the pool and forwards it to the Doppler hook, which can extract a fee on swaps. Swaps emit a Swap event in all cases.
Liquidity behaviour
afterAddLiquidity and afterRemoveLiquidity only emit ModifyLiquidity events and return zero deltas. Liquidity itself is added and removed by the contract's own mint, burn and collect actions during initialization, graduation, exit and fee collection.
Fee behaviour
Static fee from the init data unless a Doppler hook is attached, in which case the pool uses dynamic fees set by the Doppler hook via updateDynamicLPFee (max 10%). Additionally, the Doppler hook may take a swap-time fee via afterSwap return delta. LP fees accrued by the positions are collected into FeesManager and split among beneficiaries by shares.
Owner & admin controls
setDopplerHookState can only be called by the Airlock owner and whitelists which Doppler hooks may be used. setDopplerHook can be called by the pool's timelock or its delegated authority to attach or change the hook for a locked pool. Attached hooks can change the LP fee and receive swap fees. No proxy or upgrade mechanism is visible; no pause function is visible.

Enabled Uniswap v4 callbacks

beforeInitialize, afterAddLiquidity, afterRemoveLiquidity, afterSwap, afterSwapReturnDelta

beforeInitialize restricts pool initialization to calls from the contract itself. afterAddLiquidity and afterRemoveLiquidity emit events. afterSwap routes swap-time logic to the attached Doppler hook and can take a currency amount via the return delta. afterSwapReturnDelta allows that afterSwap return value to move funds out of the swap.

Security & trust assessment

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

Who controls it: The Airlock owner can whitelist Doppler hooks and collect protocol fees. The pool timelock or its delegated authority can attach any whitelisted Doppler hook to a locked pool, which can then change the LP fee (up to 10%) and take swap-time fees.

Risk to user funds: The hook does not hold pool funds at rest but can take a currency amount on swaps through afterSwap return delta and forward it to the Doppler hook. Liquidity is held in the Uniswap v4 pool via this contract's positions, and exitLiquidity and graduate move that liquidity to the Airlock. Beneficiary fees are held in this contract until claimed.

Security findings

  • [medium] Attached Doppler hook controls swap fees and LP fee: The hook set per pool can call updateDynamicLPFee (up to 10%) and return a positive afterSwap delta that is taken from every swap. The authority that can set the hook is the pool's timelock or its delegated authority.
  • [medium] Swap-time fee taken via return delta: afterSwap takes the delta amount from the PoolManager and forwards it to the Doppler hook via settleFor, so the hook can capture part of trader output on every swap if the swap flag is set.
  • [medium] Hook changeable on locked pools: setDopplerHook can replace the hook on a Locked pool, so the behaviour applied to swaps can change after launch, with the timelock or its delegate as the decision maker.
  • [low] Protocol owner has privileged exit path: exitLiquidity can only be called by the Airlock, which can migrate or exit pool liquidity once the far tick is reached; the Airlock owner controls module whitelisting and fee collection.
  • [info] Non-upgradeable with immutable Airlock and PoolManager: The airlock and poolManager are immutable and no proxy or upgrade path is visible in the source.

Contract details

Verified source
Yes (DopplerHookInitializer)
Compiler
solc 0.8.26+commit.8a97fa7a
Bytecode size
24,039 bytes
Upgradeable proxy
No
Detected patterns
dynamic-fee, launchpad, moves-currency, return-delta, self-unlock

Pools using DopplerHookInitializer