Skip to main content

The call

Anyone can call it, once phase() == ReadyToGraduate (the curve sold out). The caller is paid a reward in the quote token: min(graduationReward, raised · graduationFeeBps / 10000) — both from the launch’s config().

What it does

  1. Takes the graduation fee from the raise; the remainder plus the reserved LP supply (206.9M tokens) becomes the pool seed.
  2. The factory — which holds the DEX’s pool-creation role — opens a pool of the launch’s graduationPoolType (CP by default) and initializes its price. The launch itself never touches the DEX role.
  3. The liquidity position is minted directly to the locker, full range, and locked: creatorFeeBps of its trading fees to the creator, the rest to the protocol recipient. The locker has no withdraw function.
  4. The token’s transfer gate lifts, permanently.
Find the pool afterwards via launch.pool(), the Graduated event, or poolFactory.getPool(token0, token1, poolType).

Squat protection — and its failure mode

The factory refuses to graduate into any pre-existing pool of the target type, initialized or not: a squatter who created the pool first would own the market’s opening terms. Combined with restricted CP creation this cannot happen in normal operation — but an integrator should model the state: a launch whose target pool somehow exists sits in ReadyToGraduate indefinitely, raise held, untradeable.

The transfer gate, precisely

On the LaunchToken:
No wallet-to-wallet transfers, no router hops, no external pool seeding, no creator exemption. setGraduated() is callable only by the launch, flips once, and cannot be re-armed. The token announces the moment with its own zero-parameter Graduated() event, so a holder’s tooling need not know the launchpad exists.

After graduation

The token is an ordinary ERC-20 in an ordinary exchange pool: price it and route it with the DEX integration surface. The curve quoters return zeros; the launch keeps only sweepFees() (permissionless, silent — no event) and its historical state.