DecayMulticurveInitializerHook on Base
Uniswap v4 Hook Contract 0xbb7784a4d481184283ed89619a3e3ed143e1adc0 on Base · Dynamic fee · Verified contract
- Volume (24h)
- $529.50K
- Value locked (TVL)
- $3.36M
- All-time volume
- $860.98M
- Pools using this hook
- 976,818
- Swaps (24h)
- 1,657 (502 traders)
- Total swaps
- 3.3M
What it does
Hook for Doppler multicurve pools that starts the LP fee high and linearly lowers it over a set time after launch, restricts liquidity changes to the initializer contract, and emits Swap and ModifyLiquidity events.
How it works step by step
- The initializer calls setSchedule once at pool creation. This stores a start fee, an end fee, a start time and a duration, and immediately sets the pool's dynamic LP fee to the start fee.
- On each swap, beforeSwap computes a linearly decayed fee from the time elapsed since startingTime. If the result is lower than the last applied fee, it calls poolManager.updateDynamicLPFee and stores the new value.
- The fee only ever goes down. Before the start time it stays at startFee, and after the duration it stays at endFee.
- beforeInitialize and beforeAddLiquidity revert unless the caller is the immutable INITIALIZER, so only the initializer can create the pool or add liquidity.
- afterAddLiquidity, afterRemoveLiquidity and afterSwap only emit informational events (ModifyLiquidity, Swap) and return zero deltas.
- Swap behaviour
- beforeSwap reads the pool's fee schedule and, if the time-decayed fee is below the last stored fee, updates the pool's dynamic LP fee before the swap is priced. It never blocks swaps and returns a zero delta. afterSwap emits a Swap event and returns zero.
- Liquidity behaviour
- Adding liquidity reverts unless the sender is the initializer contract, so no third-party LPs can add liquidity. The after-add and after-remove callbacks only emit a ModifyLiquidity event with zero delta. The before-remove callback is not enabled, so removal is not restricted by the hook, though the initializer holds the positions.
- Fee behaviour
- The pool uses the dynamic fee flag. The LP fee starts at startFee, which is at most 900000 (90%) and at least endFee, and decays linearly to endFee over durationSeconds. The hook takes no fee itself (no return deltas). Fee sharing with beneficiaries is handled by the separate initializer contract, not this hook.
- Owner & admin controls
- No owner, pause, or upgrade mechanism in the hook. The only privileged function is setSchedule, callable only by the immutable INITIALIZER address set in the constructor. The initializer calls it during pool initialization. The Airlock owner has separate powers over the wider system, but not over this hook directly.
Enabled Uniswap v4 callbacks
beforeInitialize, beforeAddLiquidity, afterAddLiquidity, afterRemoveLiquidity, beforeSwap, afterSwap
beforeInitialize: only lets the initializer create the pool. beforeAddLiquidity: only lets the initializer add liquidity. afterAddLiquidity: emits a ModifyLiquidity event. afterRemoveLiquidity: emits a ModifyLiquidity event. beforeSwap: applies the time-decayed dynamic LP fee. afterSwap: emits a Swap event.
Security & trust assessment
Risk level: medium (verified source, high confidence).
Who controls it: The hook itself has no privileged key. Trust sits in the initializer, which sets the schedule at launch, and in the wider Airlock system, whose owner takes a minimum 5% beneficiary share of fees and controls module whitelisting. None of that can alter this hook after deployment.
Risk to user funds: The hook holds no funds and has no return-delta permissions, so it cannot take or move tokens. The main exposure for traders is the potentially high dynamic fee early on, and for LPs that liquidity is controlled by the initializer rather than open to third parties.
Security findings
- [medium] Very high starting fee possible: setSchedule allows startFee up to 900000 (90%), so traders can pay a very high fee early in a pool's life. The fee value comes from the launch parameters chosen by the token creator.
- [info] Liquidity restricted to initializer: beforeAddLiquidity and beforeInitialize revert unless the sender equals the immutable INITIALIZER, so external LPs cannot provide liquidity to these pools.
- [info] Schedule setter gated by immutable address: setSchedule is guarded by onlyInitializer(msg.sender). The schedule is set at initialization, and the hook has no other function that changes it later, so it is not modifiable after launch by this hook.
- [info] Hook cannot take funds or block swaps: No return-delta permissions are enabled and all callbacks return zero deltas. The swap path never reverts on its own apart from arithmetic or PoolManager errors, and there is no pause.
- [low] Fee decay is timestamp-based: The fee depends on block.timestamp relative to startingTime, so validators can influence it only marginally. Before startingTime the fee stays at startFee.
Contract details
- Verified source
- Yes (DecayMulticurveInitializerHook)
- Compiler
- solc 0.8.26+commit.8a97fa7a
- Bytecode size
- 4,884 bytes
- Upgradeable proxy
- No
- Detected patterns
- dynamic-fee
Pools using DecayMulticurveInitializerHook
- WETH / Surplus (Dynamic fee) — 24h volume $450.08K, TVL $1.08M, 701 swaps today
- WETH / aeon (Dynamic fee) — 24h volume $32.42K, TVL $373.87K, 119 swaps today
- WETH / GITLAWB (Dynamic fee) — 24h volume $21.60K, TVL $375.53K, 187 swaps today
- Alfred / WETH (Dynamic fee) — 24h volume $8.64K, TVL $6.70K, 20 swaps today
- Alfred / WETH (Dynamic fee) — 24h volume $5.46K, TVL $2.40K, 18 swaps today
- WETH / MiroShark (Dynamic fee) — 24h volume $3.33K, TVL $43.40K, 32 swaps today
- WETH / MURMR (Dynamic fee) — 24h volume $1.42K, TVL $461, 8 swaps today
- RIPPLE / WETH (Dynamic fee) — 24h volume $1.11K, TVL $57.04K, 22 swaps today
- NOUS / WETH (Dynamic fee) — 24h volume $983, TVL $5.63, 2 swaps today
- ETHR / WETH (Dynamic fee) — 24h volume $851, TVL $17.53K, 6 swaps today
- WETH / EVE (Dynamic fee) — 24h volume $782, TVL $17.31K, 6 swaps today
- Fastlane / WETH (Dynamic fee) — 24h volume $385, TVL $3.27K, 3 swaps today
- cyb3rwr3n / WETH (Dynamic fee) — 24h volume $344, TVL $48.79K, 50 swaps today
- WETH / evo (Dynamic fee) — 24h volume $310, TVL $11.98K, 3 swaps today
- WETH / PRIORSWAP (Dynamic fee) — 24h volume $293, TVL $280, 2 swaps today
- WETH / ROBOTMONEY (Dynamic fee) — 24h volume $288, TVL $60.99K, 10 swaps today
- URNX / WETH (Dynamic fee) — 24h volume $191, TVL $2.70, 1 swaps today
- WETH / CRED (Dynamic fee) — 24h volume $177, TVL $25.14K, 8 swaps today
- CoinGeckoCLI / WETH (Dynamic fee) — 24h volume $95, TVL $91, 1 swaps today
- IGNITION / WETH (Dynamic fee) — 24h volume $55, TVL $52, 1 swaps today