ContentCoinHook on Base

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

Volume (24h)
$0
Value locked (TVL)
$0
All-time volume
$120
Pools using this hook
12,239
Swaps (24h)
2 (1 traders)
Total swaps
29,015

What it does

Hook for Zora content coin pools that seeds the pool with the coin's preset liquidity curve at initialization and, after every swap, harvests LP fees, reinvests part into new liquidity, converts the rest to a backing currency and pays it out to creator, referrers, protocol and Doppler.

How it works step by step

  • On pool initialization, only a registered V4 coin (checked via the coin version lookup) can create the pool; the hook computes multi-curve Doppler liquidity positions from the coin's config and mints them to itself through an unlock callback.
  • After every swap it collects accrued fees from all of its LP positions using zero-liquidity modifyLiquidity calls.
  • About one third of collected fees (3333 bps) is reinvested as a single-sided one-tick-spacing LP position placed two tick spacings away from the current tick; this liquidity stays owned by the hook.
  • The remaining fees are swapped along the coin's payout path (possibly multi-hop) into a payout currency and taken to the hook.
  • The payout is split: 50% to the creator payout recipient, 15% to the platform referrer, 15% to the trade referrer (address decoded from hookData), 5% to Doppler, and the remainder to the protocol recipient. Unused referrer shares fall to the protocol.
  • The coin that owns a pool can call migrateLiquidity to burn all positions and move the funds to a new hook, provided the upgrade gate has registered that path.
Swap behaviour
Swaps are not altered or blocked before execution. In afterSwap the hook looks up the pool's coin (reverting with NoCoinForHook if none), harvests fees, reinvests part, swaps the rest to the payout currency via nested pool swaps, pays rewards out, and emits a Swapped event with the sender, the original msg.sender (if the router exposes msgSender), price and amounts. It returns a zero delta, so the trader's amounts are unchanged.
Liquidity behaviour
No liquidity callbacks. The hook adds and removes its own liquidity internally: initial positions at initialization, reinvested fee positions after swaps, and a full burn during migrateLiquidity.
Fee behaviour
The pool's LP fee comes from the pool key; the coin config uses 3% (LP_FEE_V4 = 30000) for V4 coins. The hook does not override the fee at swap time. Fees accrue to the hook's own positions. About 1/3 is recycled as liquidity and about 2/3 is paid out as market rewards: 50% creator, 15% platform referrer, 15% trade referrer, 5% Doppler, remainder to protocol. Recipients are read from the coin contract at distribution time.
Owner & admin controls
No owner, pause or upgrade functions on the hook itself. The trusted message sender list is fixed in the constructor and the coin lookup and upgrade gate are immutable. Only a pool's coin contract can call migrateLiquidity, and only to a destination registered in the external upgrade gate. Reward recipients are read from each coin contract and are controlled outside this hook. The imported MultiOwnable is not inherited by the hook in the shown source.

Enabled Uniswap v4 callbacks

afterInitialize, afterSwap

afterInitialize validates the caller is a V4 coin, records the pool-to-coin mapping and mints the initial LP positions. afterSwap harvests fees, reinvests part, converts the rest to the payout currency, distributes rewards and emits the Swapped event.

Security & trust assessment

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

Who controls it: The hook has no privileged key. The coin contracts and the external upgrade gate can influence reward recipients and migration destinations, and are not visible in this source.

Risk to user funds: The hook holds the pool's liquidity positions and temporarily holds fee proceeds, and can move them to recipients or, via a coin-initiated migration, to a gate-approved new hook. Traders' swap amounts are not taken through return deltas, though swaps can be blocked if reward payouts or the coin calls revert.

Security findings

  • [medium] Swaps depend on external coin and recipient contracts: afterSwap calls the coin for its payout path and recipients, performs nested swaps, and pays out via ETH calls or ERC20 transfers. If a recipient reverts on ETH receipt (EthTransferFailed) or the coin misbehaves, every swap on that pool reverts.
  • [medium] Coin can migrate all pool liquidity: migrateLiquidity lets the pool's coin burn all hook-owned positions and send the proceeds to a new hook, gated only by upgrade-gate registration of the path. Trust rests on the coin and the gate's registrar.
  • [low] Hook owns pool liquidity and holds transient funds: LP positions are owned by the hook, and fees are taken to the hook before being forwarded. Funds should not rest there, but a failure mid-flow reverts the swap rather than stranding funds.
  • [info] Fees are taken from LP positions and paid to third parties: The hook does not use return deltas, so traders are not charged extra. Rewards come only from the LPs' own fee accruals.
  • [low] Trade referrer is arbitrary and caller-supplied: getTradeReferral decodes an address from hookData, so any swapper can direct the 15% referral share to any address. hookData of the wrong shape may revert the swap.

Contract details

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

Pools using ContentCoinHook