> ## Documentation Index
> Fetch the complete documentation index at: https://docs.lunya.io/llms.txt
> Use this file to discover all available pages before exploring further.

# Graduation

> From curve to exchange pool: the call, the reward, the locker, the gate

## The call

```solidity theme={null}
function graduate() external returns (address graduatedPool);
```

**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](/exchange/pools-and-fees#who-can-create-pools) 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`:

```solidity theme={null}
// pre-graduation: only mint and transfers with the launch on one leg
if (!graduated && from != launch && to != launch && from != address(0)) {
    revert TransfersLockedUntilGraduation();
}
```

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](/developers/dex/overview). The curve quoters return zeros; the launch keeps only `sweepFees()` (permissionless, silent — no event) and its historical state.
