> Bull Launch docs. Every page is available as Markdown by adding `.md` to its URL; the index is https://bulllaunch.fun/llms.txt. This page on the web: https://bulllaunch.fun/docs/graduation

# Graduation

When a curve fills, the hook locks its liquidity in the same pool; nothing migrates and the pool id never changes.

A launch graduates once its main band has taken in its configured fill amount of the base asset. Progress toward that amount is what each coin's page tracks, and what `progressBps` reports on every `CurveBuy` and `CurveSell`.

> Graduation threshold is per base asset, read from `ConfigRegistry.baseCurve(base)`. On Arc Chain Testnet today: 8 USDC for a USDC-priced launch, 8,000 USDT for a USDT-priced launch. See [Base assets and curves](https://bulllaunch.fun/docs/base-assets.md).

There is no migration step, and no second pool. A launch is a Uniswap v4 pool from the moment it is created, because the hook is part of its pool key. On the swap that crosses the fill target, the hook withdraws the main band whole inside `afterSwap` and redeploys the proceeds as a locked position held by the LP lock, `LauncherLocker`. The pool id never changes, so an integration that indexed the pool before graduation keeps working after it.

| Parameter | Value |
| --- | --- |
| Post-graduation pool | The same pool. Same pool id, same PoolManager, same hook. |
| Post-graduation pool fee tier | Dynamic fee flag `0x800000`. The pool charges 0 and the hook takes the real fee, which is 0% (0 bps). |
| Liquidity lock | Permanent. The tail band is locked at launch and the graduation position is locked on graduation, both held by `LauncherLocker`, which exposes no withdrawal function. |
| Migration delay | None. It happens inside the swap that crosses the target. |

Graduation only confirms the threshold was reached. It is not a quality signal and does not guarantee future liquidity, price, or an exit.
