Skip to content
SECTION 08 / 15

Graduation

The Pons graduation lifecycle for a virus, its threshold in host units, progress, COMPLETE MIGRATION and the permanently locked V4 position.

§Pons graduates viruses, not VIRUS

Graduation is entirely a Pons process (VIRUS_ADAPTATION A12). VIRUS adds no threshold, no migration contract and no liquidity of its own. It reads the Pons state, shows it, and gives anyone a button to push a stalled migration forward.

§Lifecycle

Every Pons V2 launch, and so every virus, moves through the phases in getLaunchedToken(token).phase (VERIFIED_PONS F16):

NotGraduated ──(curve sold out, graduate)──▶ Swept ──(createGraduatedPool)──▶ PoolCreated
                                               │
                                               └──(Pons owner rescue after 7 days)──▶ Rescued
Phase Value Trading What exists
NotGraduated 0 On the bonding curve, until it is sold out The curve holds the reserves
Swept 1 None Pons holds the curve's reserves, recorded as sweptQuote, sweptTokens, sweptAt
PoolCreated 2 In the Uniswap V4 pool A virus/host pool with the Pons hook; the LP position is locked
Rescued 3 None The Pons owner released the swept reserves

§The threshold is in host units

A Pons launch paired with a custom token uses that token's pairTokenEconomics, not the ETH figures in the launch config (VERIFIED_PONS F4). A virus's graduation threshold is therefore:

graduationThreshold = factory.pairTokenEconomics(host).graduationThreshold   // in host tokens

Pons sets it per host with the owner-only setPairTokenEconomics. VirusRegistry records the value it read at launch (getVirus(virus).graduationThreshold); the curve's own graduationThreshold() is authoritative.

VIRUS does not reproduce Parasite's threshold. The product brief describes Parasite's graduation threshold as 40 SOL; that figure is UNVERIFIED (brief only). A virus has no SOL or ETH threshold at all.

§Reserved tokens

Part of the supply is never sold on the curve. It is held back to seed the graduated pool (VERIFIED_PONS C5):

reservedTokens = supply × phantomQuote / (phantomQuote + graduationThreshold)
sellable       = tokenReserve − reservedTokens

The fraction is fixed at launch by the host's pair economics and the launch config's supply. The app shows reservedTokens as POOL RESERVE.

§Progress

INFECTION PROGRESS is the host actually raised by the curve against the threshold:

progress = realQuoteReserve / graduationThreshold          (capped at 100%)
realQuoteReserve = trackedQuote − quoteFeeBalance − creatorTaxBalance

Both figures are in host units. Collected fees and creator tax do not count toward graduation. Because the threshold is in host, the ETH value of what a virus must raise moves with the host's price, even when no one trades the virus.

§readyToGraduate and the crossing buy

The curve is ready to graduate when it has sold its entire sellable allocation:

readyToGraduate() ⇔ sellableTokens() == 0

The buy that crosses the boundary is partially filled up to the remaining sellable tokens, and its unspent input is refunded (VERIFIED_PONS C6). Pons then attempts to graduate automatically inside that buy. If the automatic graduation reverts, the curve emits AutoGraduationFailed(token, gasRemaining) (VERIFIED_PONS C10) and the launch is left ready but not graduated.

From readyToGraduate onward, sells are closed and there is nothing left to buy.

§COMPLETE MIGRATION

Whenever a launch is stuck between curve and pool, the app shows COMPLETE MIGRATION. It is two permissionless Pons calls, which anyone may send:

Step When offered Call Effect
1/2 readyToGraduate() && phase == NotGraduated factory.graduate(token) The curve sweeps its fees (without buyback), halts trading and sends its reserves to the factory. Phase becomes Swept.
2/2 phase == Swept factory.createGraduatedPool(token) Pons seeds the Uniswap V4 pool and locks the position permanently. Returns the position id. Phase becomes PoolCreated. Retryable if it fails.
function graduate(address token) external;
function createGraduatedPool(address token) external returns (uint256 positionId);

Neither call touches VIRUS contracts. Infection routes that pass through a launch in migration are incomplete until both steps are done (see Infection routes).

§After graduation

The graduated pool (VERIFIED_PONS F19, H7, T6):

  • pairs the virus with its host, with currencies sorted by address;
  • has fee = poolFee = 0: Pons requires a zero core LP fee, so all fees are hook fees;
  • uses the launch's tickSpacing and the Pons meme hook;
  • has pool id keccak256(abi.encode(currency0, currency1, poolFee, tickSpacing, memeHook)), which the feeder derived and stored when it was bound;
  • is backed by a V4 position NFT held by PonsV2LaunchLocker, which has no withdrawal path. Graduation tokens beyond what the pool needs are locked through the locker's lockTokenSupply.

The app labels this LIQUIDITY AFTER GRADUATION — LOCKED BY PONS. Neither VIRUS nor the developer can remove it.

Fees continue in the pool at hookFeeBps + creatorTaxBps, taken in the swap's unspecified currency (see Trading).

§Fees at graduation

graduate sweeps the curve's pending fees into the Pons fee escrow as part of graduation (VERIFIED_PONS C9). Nothing is lost at the boundary: the next feed() finds the feeder's host credit in the escrow and distributes it. In the Swept and Rescued phases the feeder has nothing to sweep and reports None, but still claims and distributes.

§Pons owner interventions

The Pons owner has two further powers over graduation (VERIFIED_PONS F17, BLOCKED_BY_PONS B6):

  • forceSweptGraduation, allowed only when the pool seed is not viable;
  • rescueSweptGraduation(token, recipient), allowed after a launch has spent 7 days in Swept. It sends the swept reserves to a recipient the owner names, and the launch ends in Rescued.

A Rescued virus has no market. Its feeder can still claim and distribute any host already credited to it. These are Pons powers; VIRUS can neither trigger nor prevent them. Calling createGraduatedPool during the 7 days is the way anyone can move a swept launch forward instead.

§Parasite comparison

Parasite moves a graduating parasite to Meteora DAMM v2 with LP locked forever (VERIFIED_PARASITE P9). VIRUS does not reproduce that. It is built on Pons, so it uses the Pons graduation to a permanently locked Uniswap V4 position instead. Both designs end with permanently locked liquidity; the venue, the threshold units and the migration calls are Pons's.