ContentCoinHook on Base

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

Volume (24h)
$0
Value locked (TVL)
$0
All-time volume
$0
Pools using this hook
8,657
Swaps (24h)
0 (0 traders)
Total swaps
17,709

What it does

Hook for Zora content coin pools on Uniswap v4 that seeds the pool with the coin's liquidity curve at launch and, after every swap, collects LP fees, recycles a third into new liquidity, and pays the rest out as rewards to the creator, referrers and protocol.

How it works step by step

  • On pool initialization, it checks that the caller is a registered v4 coin and mints a multi-curve set of single-sided LP positions (990M coin supply plus a tail position) from the coin's pool configuration.
  • After each swap, it collects accrued fees from all of its own positions by calling modifyLiquidity with a zero liquidity delta.
  • About 33.33% of the collected fees are re-minted as a new single-sided LP position, placed two tick spacings away from the current tick.
  • The remaining fees are swapped through the coin's payout swap path (possibly multi-hop) into a backing currency and taken to the hook.
  • The payout is split: 50% to the creator, 15% to the platform referrer if set, 15% to the trade referrer if one is given in hookData, 5% to Doppler, and the remainder to the protocol. Payment is in ETH or ERC20.
  • Pool positions can be migrated to a new hook, but only when called by the pool's coin and only along an upgrade path registered in the upgrade gate.
Swap behaviour
The afterSwap callback reverts if the pool has no registered coin. Otherwise it collects fees, mints the LP reward, swaps the rest to the payout currency, pays out rewards, and emits Swapped and CoinMarketRewardsV4 events. It returns a zero hook delta, so the swapper's amounts are not changed. The trade referrer is read from hookData as an address. Nested swaps in the payout path run inside the same transaction, so swap gas is higher.
Liquidity behaviour
No add or remove liquidity callbacks. The hook itself mints all initial positions in afterInitialize through unlock/unlockCallback, and re-mints LP rewards after swaps. Positions owned by the hook can be burned entirely by migrateLiquidity.
Fee behaviour
The pool's LP fee is set when the pool is created. The configuration code uses LP_FEE_V4 of 3% (30000), but the fee is not set by this hook. The hook does not change the fee per swap. It redistributes the LP fees earned by its own positions: about one third goes back into liquidity, and about two thirds go to creator, referrers, Doppler and protocol, with the protocol taking the remainder.
Owner & admin controls
No owner, pause or parameter-setting functions were found in the hook (MultiOwnable is imported but not inherited). The trusted message senders and the immutable coin lookup and upgrade gate are fixed in the constructor. Migration is controlled by the coin contract and by whatever upgrade paths the external upgrade gate registers.

Enabled Uniswap v4 callbacks

afterInitialize, afterSwap

afterInitialize validates the coin and mints the initial liquidity positions; afterSwap collects fees, compounds them into liquidity, converts the rest to the payout currency and distributes rewards.

Security & trust assessment

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

Who controls it: The hook has no owner. Control sits with the coin contracts (reward recipients, swap path, migration trigger) and the upgrade gate (registered upgrade paths). Those parties could redirect future rewards or migrate the pool's liquidity to a registered hook.

Risk to user funds: The hook holds LP positions in the pool manager and briefly holds the payout tokens before distributing them. It does not take funds from swappers through return deltas. The main exposure is the pool liquidity, which could be moved by a migration, and the possibility that a failing reward payout blocks swaps.

Security findings

  • [info] Hook holds and moves pool liquidity: The hook owns all the pool's LP positions. It can burn them all via lockAndMigrate and send the proceeds to a new hook, so the pool's liquidity depends on migration authorization.
  • [medium] Migration gated by external contracts: migrateLiquidity requires msg.sender to be the pool's coin and requires the upgrade path to be registered in the external upgrade gate. Whoever controls the gate or the coin contract can move liquidity to a registered new hook, but this hook's code does not show who they are.
  • [medium] Swaps depend on external coin contracts: afterSwap calls the coin's getPayoutSwapPath and reward-recipient getters, runs nested pool swaps, and pays recipients. A reverting recipient, ETH transfer failure or broken swap path would revert all swaps in that pool.
  • [low] Unlimited slippage on fee conversion swaps: The internal fee swaps use min/max price limits with no minimum output, so they can be sandwiched. This affects only the fee portion, not the trader's own swap.
  • [low] ETH payouts use a raw call: When the payout currency is native ETH, rewards are sent via a call to recipient addresses taken from the coin. The call can run recipient code during afterSwap.

Contract details

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

Pools using ContentCoinHook