Curve phase
Phase 0. PLOUTO trades on a Pons bonding curve quoted in native ETH.
The curve interface
Each launch gets its own curve instance. Those instances are deployed unverified on Blockscout, so the ABI Plouto uses was recovered from the deployed dispatcher selectors and cross-checked against the public 4-byte database.
The one function Plouto calls was verified directly against deployed bytecode:
buy(uint256,uint256,address) = 0x59a87bc1 ← present in the deployed curveinterface IPonsV2Curve { function buy(uint256 quoteIn, uint256 minTokensOut, address recipient) external payable returns (uint256 tokensOut); function token() external view returns (address); function pairToken() external view returns (address); function isNativeQuote() external view returns (bool); function factory() external view returns (address); function graduated() external view returns (bool); function quoteReserve() external view returns (uint256); function tokenReserve() external view returns (uint256); function phantomQuote() external view returns (uint256); function graduationThreshold() external view returns (uint256); function feeBps() external view returns (uint256); function currentSnipeTaxBps(address buyer) external view returns (uint256);}Because the quote is native ETH, msg.value must equal quoteIn.
Route validation before every buy
The executor does not trust the registry alone. It re-checks the curve against the factory record on every execution:
if (c.token() != token) revert RouteMismatch();if (c.pairToken() != address(0) || !c.isNativeQuote()) revert RouteMismatch();if (c.factory() != address(ponsFactory)) revert RouteMismatch();if (c.graduated()) revert UnexpectedPhase(uint8(PonsPhase.PoolCreated));Any disagreement aborts the transaction. Nothing is spent.
Price impact is bounded on chain
The keeper supplies minTokensOut, but the contract does not rely on it alone. It computes its own reference from the live reserves:
uint256 quoteReserve = c.quoteReserve();uint256 tokenReserve = c.tokenReserve();uint256 idealOut = Math.mulDiv(ethIn, tokenReserve, quoteReserve);uint256 impactFloor = Math.mulDiv(idealOut, BPS - maxPriceImpactBps, BPS);// ... after the buy:if (got < impactFloor) revert PriceImpactTooHigh(got, impactFloor);So even a compromised keeper passing minTokensOut = 1 cannot execute a trade worse than maxPriceImpactBps against the pre-trade spot price.
The phantom quote
Pons curves are seeded with a phantomQuote — virtual reserves that set the opening price without requiring real ETH. In the live configuration observed, that is 1.68 ETH against a graduation threshold of 4.2 ETH.
This matters for reading progress: quoteReserve includes the phantom seed, so real progress toward graduation is quoteReserve − phantomQuote against threshold − phantomQuote. The status page does that subtraction rather than showing a progress bar that starts at 40%.
The snipe tax
Pons applies a decaying tax to very early buyers. In the live configuration it starts at 9,900 bps and decays over 3 seconds.
The keeper script checks it before submitting and refuses to trade while it is non-zero:
if (snipeBps > 0n) { fail(`the snipe tax is still active for this executor (${snipeBps} bps). Wait for it to decay.`);}This is also why Plouto does not use the Pons launch-and-buy router: an immediate creator purchase would be taxed as a snipe.
Verified against live liquidity
A fork test executes a real 0.01 ETH buy against a live Pons curve on forked mainnet state, confirms tokens are received, and confirms they are retired — with totalSupply() genuinely decreasing.