Launch lifecycle
Every Pons launch has a phase field in its factory record. Plouto reads it before every buyback and behaves differently in each one.
enum PonsPhase { Curve, Swept, PoolCreated, Rescued }The four phases
| Phase | Value | Tradeable by Plouto | What it means |
|---|---|---|---|
Curve | 0 | Yes — bonding curve | Pre-graduation. Trading happens on the curve. |
Swept | 1 | No | Mid-graduation. Liquidity has been swept out of the curve. |
PoolCreated | 2 | Yes — Uniswap v4 pool | Graduated. Trading happens in the canonical pool. |
Rescued | 3 | No | A graduation that was rescued rather than completed. |
Reading the phase
PonsLaunchedToken memory record = ponsFactory.getLaunchedToken(token);uint8 phase = record.phase;The full record also carries the curve address, the deployer, the creator-fee recipient, the pair token, the pool fee and tick spacing — everything the executor needs to reconstruct a route.
How the executor branches
if (phase == uint8(PonsPhase.Curve)) { _buyOnCurve(curve, token, ethIn, minTokensOut);} else if (phase == uint8(PonsPhase.PoolCreated)) { _buyOnPool(record, token, ethIn, minTokensOut);} else { // SWEPT (mid-graduation) and RESCUED are not tradeable routes. revert UnexpectedPhase(phase);}An unknown phase
If Pons ever introduces a phase value the executor does not recognise, it falls into the same revert UnexpectedPhase branch. That is deliberate: the failure mode for an unknown state is stop, not improvise.
The consequence is that a Pons upgrade could pause Plouto buybacks until the executor is reviewed. This is listed in Pons dependency.
Where the phase is visible
The status page shows the live phase, and the Core page tags it alongside the fee pipeline. Every buyback execution also records the phase it ran in, so the history shows which route each purchase used.