PermaV2SimpleHook on Robinhood Chain

Uniswap v4 Hook Contract 0x4c237837f11b9c68c1f76fdc263f2c8850393800 on Robinhood Chain · Dynamic fee · Verified contract

Volume (24h)
$11
Value locked (TVL)
$1.04
All-time volume
$11
Pools using this hook
1
Swaps (24h)
3 (2 traders)
Total swaps
3

What it does

During the first three seconds after launch, buys pay a very high sniper fee of 90%, 67% and 35% that falls each second, while sells and all later trades pay the coin's normal fee.

How it works step by step

  • Sets the pool's dynamic LP fee from a fixed sniper schedule: 90%, 67% and 35% total fee in seconds 0, 1 and 2 after launch, then the coin's normal base fee.
  • Applies the sniper fee only to buys (currentFee with isBuy true); sells always pay the base fee after arming, although the simple hook's source comment says the sniper fee applies to buys and sells alike.
  • Exposes poke, which anyone can call to push the schedule into the pool's dynamic fee; the fee schedule only moves downward over time.
  • Exposes pokeIfNeeded, a non-reverting helper that brings the fee up to date and marks the pool settled once it reaches the base fee.
  • Restricts beforeInitialize to pools registered by the Perma factory and beforeAddLiquidity to the Perma vault, so outside parties cannot initialise or earn fees through liquidity on these pools.
  • Sets the initial fee to the base fee in afterInitialize, and makes no token movements or return-delta changes.
Swap behaviour
Only beforeSwap is stubbed to revert with HookNotImplemented, so the hook has no active swap callback in this flag set. The fee applied to swaps is determined by the pool's dynamic LP fee, which the hook sets through poke and pokeIfNeeded: buys within the first three seconds after arming pay the sniper fee (90%, 67%, 35%), and all other trades pay the base fee.
Liquidity behaviour
beforeAddLiquidity reverts unless the sender is the Perma vault, so only the vault can add liquidity. No afterAddLiquidity, beforeRemoveLiquidity or afterRemoveLiquidity callbacks are enabled, so removals are not hooked.
Fee behaviour
The hook sets the pool's dynamic LP fee via updateDynamicLPFee. Before arming, and after the 3 second window, the fee is the coin's base fee. During the window, buys pay the sniper step fee (capped below 99% and floored at the base fee), while sells pay the base fee. Fixed-fee pools are accepted but not updated.
Owner & admin controls
No owner, pause or upgrade mechanism is visible in the source. The factory is the only caller allowed to register pools and to arm the window; the factory and vault addresses are immutable constructor parameters. Anyone can call poke and pokeIfNeeded, but these can only apply the predefined schedule.

Enabled Uniswap v4 callbacks

beforeInitialize, afterInitialize, beforeAddLiquidity

beforeInitialize restricts pool initialisation to the factory for registered pools. afterInitialize sets the initial dynamic fee to the base fee. beforeAddLiquidity restricts liquidity additions to the vault.

Security & trust assessment

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

Who controls it: The factory can register pools and arm windows, and the vault can add liquidity. Neither role can change fee parameters, because the schedule and base fee are constants or fixed at registration, and no upgrade or pause path is visible. Admin power is limited to choosing which pools use the hook.

Risk to user funds: The hook never holds, transfers or takes tokens: it has no return-delta permissions and only sets a fee number. User funds are exposed to the fee level set by the pool and the trading path, not to the hook itself.

Security findings

  • [info] Sell-side fee not sniper-gated despite comment: The source comment says the sniper fee applies to buys and sells alike, but currentFee only applies it when isBuy is true, so sells pay the base fee in the window. The code, not the comment, determines behaviour.
  • [info] Stubbed swap callbacks revert: beforeSwap and other unused callbacks revert with HookNotImplemented; this is intentional given the hook flags, but it means no swap-time logic runs here.
  • [info] Public poke can only apply the schedule: poke and pokeIfNeeded are callable by anyone, but they only set the fee to the predetermined schedule value, so they cannot set arbitrary fees.

Contract details

Verified source
Yes (PermaV2SimpleHook)
Compiler
solc 0.8.26+commit.8a97fa7a
Bytecode size
6,443 bytes
Upgradeable proxy
No
Detected patterns
dynamic-fee, liquidity-management, mev-protection

Pools using PermaV2SimpleHook