Skip to content

Launch mechanism

Every launch seeds token-only liquidity, zero quote asset consumed. This is the protocol’s core invariant, and it holds identically on the Uniswap V3 generations and the current Uniswap v4 ones. This page explains how that is possible, what the current generation adds at mint, and the one detail a reviewer or integrator has to get right.

A single-sided concentrated-liquidity position is a bonding curve. Providing liquidity over a price range with only the token, starting at the bottom of the range, produces exactly the pump-style price ascent, but the curve and the DEX pool are the same object, so nothing ever migrates.

This is the property that removes the worst exploit surface of curve-then-migrate launchpads: there is no migration window because there is no migration.

In concentrated liquidity, when the pool’s current price sits on one side of a position’s range, that position is composed 100% of one asset:

  • current tick < tickLower → position is 100% token0
  • current tick >= tickUpper → position is 100% token1

So a launch deposits only the launch token and zero quote:

  1. Deploy the token. The full fixed supply is minted to the factory.
  2. Create and initialize the pool. The factory creates the pool (v4: TOKEN/native-ETH with the generation’s hook; V3: TOKEN/WETH) and initializes its price at the token-only side of the intended range.
  3. Mint the position. It mints a position over the range, depositing only the token side.
  4. Lock it forever. The position NFT is transferred to the locker, which never releases it.

No ETH or WETH is required to bootstrap. The quote side is contributed by buyers as they trade: each buy walks price up the range, pulls token out, and leaves the quote asset inside the (locked) position, a permanent, growing liquidity floor.

On the current generation the factory has no unverified entrypoint. Every launch call carries a signed attestation, issued after the creator links an X account, that binds the launching wallet and the exact token identity (name, symbol, supply) to that X identity. The factory checks the signature on-chain and records a commitment to the X identity in the launch event; the coin’s page shows the verified handle. A stolen or replayed attestation fails: it is single-use, short-lived, and bound to the deployer wallet.

Verification changes who can launch. It does not touch the token (still inert) or the liquidity (still locked): those guarantees are unchanged from earlier generations.

A creator can optionally bundle their own first buy inside the launch transaction. Because launch and buy are one transaction, nothing can trade before the creator’s fill; the classic “creator gets sniped buying their own coin” window does not exist. The buy is a real swap at the opening price against the just-seeded pool, publicly labeled as the creator’s first buy, and capped on-chain at 5% of supply. It is not a pre-mine, a discount, or a reserved allocation; it pays the pool like every other buy.

Also on the newest generation, the creator chooses how the coin’s first minutes trade: Open (block one, anyone), Game (frozen for a tap-trading round whose top scorers win capped priority buys), or Verified only (a 10 to 60 minute window in which every trade needs a verified X account). Every gate ends in permanently open trading, inside a hard on-chain ceiling. See the overview.

Uniswap sorts pool tokens by address into token0 < token1. Which side the launch token lands on flips the single-sidedness condition, so the factory computes the deposit side from the ordering:

Launch token vs WETH Token is Need current tick Deposit side
token < weth token0 < tickLower amount0 only
token > weth token1 >= tickUpper amount1 only

The factory enforces on-chain that the quote side consumed is exactly zero; it does not trust off-chain tick parameters. The SDK computes a sqrtPriceX96 / tickLower / tickUpper preset consistent with the ordering, but the on-chain check is the source of truth.

Both orderings, token < weth and token > weth, are covered by fuzz and fork tests against real Uniswap V3.

On the v4 generations the coin flip disappears: the quote is native ETH (address(0)), which always sorts first, so the launch token is always currency1 and the seed always parks above the range. One fewer thing for an integrator to get wrong.

The failure mode that matters: an empty seed

Section titled “The failure mode that matters: an empty seed”

Because the factory sets the quote-side desired amount to 0, Uniswap’s getLiquidityForAmounts returns min(L_token, L_quote = 0) = 0 for any preset whose current price is not on the token-only side of the range.

The consequence is subtle and important:

  • A mispriced preset does not leak the quote asset. The zero-quote-consumed check can never fail via a normal launch; it is kept as a defensive assertion against a hostile position manager.
  • Instead, a mispriced preset would silently mint an empty locked position and strand the entire supply in the factory while the launch appears to succeed. That would leave a half-launched token.

To prevent this, the factory reverts EmptyLiquidity whenever the resulting position liquidity is 0. A mispriced launch reverts wholesale rather than half-completing. This is enforced on-chain and asserted in the invariant suite.

A launch either fully completes (token deployed, pool created and initialized, single-sided position minted and locked, and on gated launches the gate armed in the same transaction) or it reverts. There is no code path that leaves a token with unlocked or quote-contaminated liquidity, and none that leaves the supply stranded. This is invariant L5 (launch atomicity); see Contract addresses and invariants.