Protocol
Graduation
How a curve becomes a pool with permanently locked liquidity.
One transaction, no waiting#
Graduation is not a job someone runs later, and there is no keeper to trust. The buy that sells out the curve carries the whole migration with it: the pool is funded, the opening position is minted, and that position is locked before the transaction returns.
the final buy
├─ the curve closes and hands over its ETH and the 200M it held back
├─ the reserved pool is funded with both sides
├─ the opening liquidity is minted, then locked
└─ the launch is recorded as trading on the poolIf any part of that fails, the entire buy reverts. A launch cannot end up half-migrated, and there is no moment where an empty or partly funded pool is tradable.
What moves into the pool#
The pool gets the curve's ETH minus fees that were already earned, plus the 200M tokens the curve never sold. With no sells along the way, that lands on:
| WETH into the pool | 3.6 |
| Tokens into the pool | 200,000,000 |
| Opening pool price | 0.000000018 ETH per token |
| Pool TVL | 7.2 ETH |
| FDV | 18 ETH |
Creator fees that accrued on the curve stay in the curve contract and remain claimable afterwards. Neither those nor the protocol's share are treated as liquidity — only the clean 3.6 ETH is.
You can read what a launch would migrate before it happens: the migration manager exposes a quote view returning the same three numbers.
The two checks that make the handoff safe#
The prices have to match. The curve's closing price and the pool's opening price are compared before funding, and the migration refuses if they differ by more than a rounding margin. Without that check, the first arbitrageur would collect the difference from whoever bought last.
The pool has to be untouched. Its reserves and its balances must both be exactly zero before funding. That is what guarantees the opening price is the one the curve arrived at, rather than one somebody else set. The pool is reserved when the token is created and cannot be traded before the migration seeds it, and anything sent to it in the meantime is swept out first.
Liquidity that stays put#
The opening LP position goes into a locker in the same transaction that mints it. The locker takes deposits only from the migration manager, only for a pool it has verified belongs to that launch, and only once per token.
It has no withdraw function. Not gated, not timelocked — absent. That position cannot be removed by the creator, by us, or by anyone else.
Only the opening position is locked. Liquidity you add afterwards is yours and you can remove it whenever you like.
You can check any graduated launch yourself by reading the locker's lockedPair(token) and lockedLiquidity(token).
After graduation#
Trading moves to the router, and the curve stops accepting trades entirely — a stale interface fails loudly instead of quietly sending your ETH to a closed pool.
The indexer converts pool swaps into the same price units it used for curve trades, so charts and trade history run continuously across the switch rather than restarting.
Creator fees do not stop either. They change source. See fees.