ContentCoinHook on Base

Uniswap v4 Hook Contract 0x2b15a16b3ef024005ba899bb51764fcd58cf9040 on Base · Rewards · Verified contract

Volume (24h)
$74
Value locked (TVL)
$28.43K
All-time volume
$6.80M
Pools using this hook
569,496
Swaps (24h)
24 (7 traders)
Total swaps
461,235

What it does

Hook for Zora content coin pools on Uniswap v4 that seeds the coin's liquidity curve at launch, then on every swap collects LP fees, converts them to a backing currency and pays them out to the creator, referrers, the protocol and Doppler.

How it works step by step

  • On pool initialization it checks that the caller is a registered V4 coin, builds a multi-curve (Doppler-style) set of LP positions from the coin's pool configuration, and mints them from the hook using the PoolManager unlock callback.
  • After every swap it collects accrued fees from all of its LP positions with zero-liquidity modifyLiquidity calls.
  • It reinvests 20% of the collected fees as a new single-sided LP position placed two tick spacings away from the current tick.
  • It swaps the remaining 80% through the coin's payout swap path (possibly multi-hop) into a single backing currency, takes the result to the hook and pays it out immediately.
  • The payout split is 62.5% to the creator, 25% to the platform referrer, 5% to the trade referrer (taken from hookData), 1.25% to Doppler, and the remainder to the protocol. Shares for missing referrers fall to the protocol.
  • The coin can migrate the pool's liquidity to a new hook version if the upgrade gate has registered that path.
Swap behaviour
afterSwap does not change the user's swap price or amounts and returns a zero delta. It looks up the pool's coin (reverting if none is registered), collects LP fees, mints the LP reward position, swaps the fees to the payout currency, distributes rewards in ETH or ERC20, and emits a Swapped event with the swapper, trade details and the new price. The trade referrer is read from the first 20 bytes of hookData. Because the hook performs extra pool operations and transfers inside every swap, swaps can revert if any of them fails, for example an ETH transfer to a reward recipient that rejects it or a failing path swap.
Liquidity behaviour
No liquidity callbacks. The hook itself owns and manages the pool's liquidity positions: it mints them at initialization, adds the LP reward positions after swaps, and can burn them all during migration to a new hook.
Fee behaviour
The pool uses a static 1% LP fee (10000 bps, tick spacing 200). The hook redistributes the fees it collects: 20% is reinvested as liquidity and 80% is paid out as market rewards (creator 62.5%, platform referrer 25%, trade referrer 5%, Doppler 1.25%, protocol the remainder, all as shares of the 80%). Recipient addresses are read from the coin contract.
Owner & admin controls
The hook has no owner or pause function. Control sits with external contracts. The coin contract supplies the reward recipients, the payout swap path and the pool configuration, and the coinVersionLookup and upgradeGate addresses are immutable. Only the coin that owns a pool can call migrateLiquidity, and only to a hook whose upgrade path is registered in the upgrade gate, so the gate's admin controls which hooks can receive migrations. Trusted message senders are set in the constructor and cannot be changed afterwards.

Enabled Uniswap v4 callbacks

afterInitialize, afterSwap

afterInitialize validates the coin and mints its initial liquidity positions, or returns early when the hook itself initializes a migrated pool. afterSwap collects fees, converts them and pays rewards.

Security & trust assessment

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

Who controls it: The hook has no privileged key of its own. The coin contract's controller sets reward recipients and the swap path, and can trigger a migration through the coin, subject to the upgrade gate's registered paths. The upgrade gate owner decides which migration targets are allowed. The code for these external contracts was not provided.

Risk to user funds: The hook owns the pool's LP positions, and in swaps it transiently holds fees, which it pays to recipients in the same transaction. Traders' swap amounts are not taken through return deltas. Pool liquidity could be moved to a new hook via migration if authorized by the coin and the gate. Swap availability depends on the reward payout and path swaps succeeding.

Security findings

  • [medium] Hook moves and pays out pool fees on every swap: afterSwap collects fees from LP positions, takes tokens to the hook with poolManager.take and transfers them to the coin's recipients. This is intended, but it adds external calls and transfers to every swap.
  • [medium] Migration of all liquidity to another hook: migrateLiquidity burns every hook-owned position and sends the tokens to a new hook, callable by the pool's coin if the upgrade gate has registered the path. Whoever controls the coin's calls and the gate can move all pool liquidity to a different hook implementation.
  • [medium] Reward routing depends on external coin contract: Recipients, the payout swap path and the pool configuration come from the coin contract (payoutRecipient, getPayoutSwapPath, getPoolConfiguration). Whoever controls those values determines where rewards go and which pools the fee conversion swaps through. The coin source was not part of the input.
  • [low] Swaps can be blocked by reward payout failure: ETH rewards use a low-level call that reverts with EthTransferFailed if a recipient rejects it. A failing path swap or a missing coin also reverts the whole swap.
  • [info] No ownership or upgrade proxy in the hook: The hook is a plain contract with no owner, pause or proxy logic. Its receive function only accepts ETH from the PoolManager. The MultiOwnable source is imported but not inherited.

Contract details

Verified source
Yes (ContentCoinHook)
Compiler
solc 0.8.28+commit.7893614a
Bytecode size
21,220 bytes
Upgradeable proxy
No
Detected patterns
moves-currency, rewards, self-unlock

Pools using ContentCoinHook