Graduation is the moment a market stops being a launchpad token and becomes a live synthetic. It converts the SOL raised on the Launch Curve into standing AMM liquidity, and switches on the machinery that tethers the token to the Price Index.
The market state machine: bootstrap, live, and the frozen flag.The market state machine: bootstrap, live, and the frozen flag.

The market state machine: bootstrap, live, and the frozen flag.

Preconditions

graduate() is permissionless: anyone can crank it once the conditions hold. In practice migration is automatic: the indexer keeper sweeps every bootstrap market on a short interval, and additionally reacts to each CurveTraded event, so the transition lands within seconds of the raise target being crossed with no manual step for the creator or buyers. The call requires:
  1. Market status is Bootstrap (a market can only graduate once)
  2. Market is not frozen
  3. curve_sol_raised >= graduation_target_sol
  4. An oracle index exists (index_twap > 0)
The index requirement matters: the funding clock starts at graduation, and funding is meaningless without a reference price.

The split

The raise is divided by one parameter:
  • The insurance fund backstops liquidation shortfalls; see Insurance Fund.
  • The AMM SOL reserve becomes the real, protocol-owned liquidity the token trades against from now on.
Under the launch convention insurance_share_bps = 0: the entire raise seeds the pool, so migration means the AMM starts with at least 100 SOL of real liquidity inside it (the 100 SOL target plus whatever the final buy overshot; the end-to-end run migrated at 104 SOL raised, all of it into the pool). The split machinery remains for markets listed with a nonzero share. Curve fees collected during Bootstrap are already accounted separately in fee_lamports and are not part of the split.

Pairing the AMM at the closing price

The AMM’s token side comes out of the unsold curve allocation, sized so the pool opens exactly at the curve’s closing price:
Since curve_virtual_sol / curve_virtual_tokens is the price where the curve ended, the pool’s opening spot equals that price, and graduation itself causes no price gap. Under the launch convention (25 SOL virtual against the 1B supply, 100 SOL target; see Launch curve) the closing price is 0.625 SOL per unit, and the oracle index is launch-scaled to define one unit as worth exactly that at launch, so the AMM opens at zero premium to the index. A clean 100 SOL raise pairs the pool as 100 SOL against 160M tokens; the seed stays in the market’s pool token account, a program-controlled account no person can sign for. The unsold excess burns. The pool account still holds every curve-allocation token that was never sold; graduation keeps exactly amm_tokens and burns the rest (a burn needs only the market’s authority over its own token account, not the revoked mint authority). Supply after graduation is exactly tokens sold on the curve + the AMM seed + the hedging reserve, and it can never grow again.
Graduation does not migrate the curve’s buyers. Tokens bought on the curve stay in their owners’ wallets; only the raise moves. Holders can now trade against the AMM instead of the curve.

What switches on

Graduation initializes the live-market state in one transaction: From this block forward: The Graduated { market, amm_sol, amm_tokens, insurance } event records the split; see Events.

Design intent

The graduation gate is what keeps the two-phase promise honest. Before it, the token is explicitly a launch asset: pure curve price, no tether, no leverage anywhere in the system. After it, every mechanism that makes the synth track its underlying is live simultaneously, funded by the raise itself. There is no intermediate state where the token claims to track the index but lacks the liquidity to defend that claim.