PrismHookV2 on Ethereum

Uniswap v4 Hook Contract 0xcf4d29f14cc585ddd1167f956092852af844e040 on Ethereum · Liquidity management · Verified contract

Volume (24h)
$0
Value locked (TVL)
$0
All-time volume
$6.97M
Pools using this hook
1
Swaps (24h)
0 (0 traders)
Total swaps
9,998

What it does

PrismHookV2 runs one fixed-supply Uniswap v4 pool (ETH/PRISM, 1% fee) and distributes its collected LP fees to holders of PRISM-LP NFTs that mirror their PRISM balance one-for-one.

How it works step by step

  • Holds a single full-range POSM position created by seed(), which is the pool's only liquidity.
  • Pulls accrued fees from that position on pokeFees() and claim(), crediting ETH 100% to holders and 80% of PRISM fees to holders.
  • Burns 20% of PRISM-denominated fees to 0x...dEaD.
  • Mints, moves and burns ERC-721 fee-share NFTs so that each whole PRISM held maps to one NFT, with per-NFT fee debt tracking.
  • Credits pending ETH and PRISM balances that users withdraw with withdrawPending or withdrawPendingTo.
  • Blocks pool initialization by anyone other than seed(), so the opening price cannot be front-run.
Swap behaviour
No swap logic beyond afterSwap, which returns the selector with zero delta. Swaps execute against the pool's full-range position with no hook-side pricing, blocking or fee override.
Liquidity behaviour
No liquidity callbacks are enabled. The hook itself holds the full-range position NFT (hookPositionTokenId) minted in seed(), and fee collection is done by calling the POSM decrease-liquidity/take actions on that position.
Fee behaviour
The pool has a static 1% fee (POOL_FEE 10000) set in the pool key. Collected fees are pulled from the POSM position on pokeFees() and claim(): ETH is credited 100% to fee-share holders; PRISM-denominated fees are 20% transferred to the 0x...dEaD burn sink and 80% credited to holders per share. The first collection after a zero-share period is forfeited to reserve.
Owner & admin controls
Owner (solady Ownable, two-step handover) can call seed() once to create the pool and POSM position; there is no pause, no upgrade path and no parameter setter. Owner can transfer or renounce ownership, but ownership only gates seed(), which can run once. Fee split and caps are immutable constants.

Enabled Uniswap v4 callbacks

beforeInitialize, afterSwap

beforeInitialize: restricts pool initialization to the seed() call path (transient flag), so no one can front-run the opening price. afterSwap: no logic, returns the selector with zero delta; present so the hook can pull or poke fees after swaps via the pool manager context.

Security & trust assessment

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

Who controls it: The owner can only call seed() once and cannot move, pause, or reprice anything. The owner key cannot redirect fees or touch holder balances. The dominant risks are ordinary: a compromised owner before seed() could seed the pool at a chosen price and range, and the hook has no emergency stop if POSM misbehaves.

Risk to user funds: The hook holds PRISM and ETH only as pending fee balances and the POSM position it created. No admin path can withdraw holder funds or change prices. Exposure is to the POSM contract (which custodies the liquidity) and to fee accounting correctness, both reviewed in the verified source.

Security findings

  • [info] Fee accounting is pull-based and uses full-width accumulators: Collected POSM fees are split between holders (per-share accumulator) and a burn sink. The accumulator is never truncated and claims are pull-based with exact debt tracking, so no over-claim path was identified in the source.
  • [medium] Fee distribution depends on external POSM and keepers: The contract is immutable with no admin. pokeFees wraps the POSM collect in try/catch and emits PokeCollectFailed on failure, so a POSM-side problem leaves fees parked in the position rather than reverting the token. Fees stop distributing until a successful poke; a keeper must watch that event.
  • [low] Per-transfer mint cap leaves temporary share gaps: Realignment mints at most 128 NFTs per transfer and pushes larger holders into an under-mirrored state that only syncNFTs can close. Large transfers may exceed block gas limits and holders may need to split them; under-mirrored holders receive a reduced share of fee rounds until they sync.
  • [info] Excluded-recipient guard limits dead-share parking: Fee-share NFTs cannot be moved to the pool, the hook, POSM, Permit2, the mirror or the burn sink, which blocks parking shares on non-claiming addresses. Routers and aggregators that receive PRISM without sweeping can still accumulate unclaimable shares.

Contract details

Verified source
Yes (PrismHookV2)
Compiler
solc 0.8.26+commit.8a97fa7a
Bytecode size
21,262 bytes
Upgradeable proxy
No
Detected patterns
access-control, erc20, liquidity-management, ownable

Pools using PrismHookV2