

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:
- Market status is
Bootstrap(a market can only graduate once) - Market is not frozen
curve_sol_raised >= graduation_target_sol- An oracle index exists (
index_twap > 0)
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.
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: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:
- AMM trading is open (
amm_buy,amm_sell) - CDP shorts can open, drawing reserve synth against SOL collateral
- The funding crank can run, pulling the mark toward the index
- Liquidations are armed
Graduated { market, amm_sol, amm_tokens, insurance } event records the split; see Events.

