Graduation
The single comparison the whole market rests on.
Everything PolyFrog does rests on one comparison. It is worth being precise about it, because two of its properties shape the entire market design.
The comparison
// ContinuousClearingAuction
function _isGraduated() internal view returns (bool) {
return $currencyRaisedQ96X7 >= REQUIRED_CURRENCY_RAISED_Q96X7;
}REQUIRED_CURRENCY_RAISED is an immutable set when the auction is created. currencyRaised accumulates as demand clears against released supply.
Property one: it is monotonic
While an auction is live, currency raised only ever increases. Bids cannot be withdrawn mid-flight; refunds and exits are only available once the auction is over.
Therefore graduation is an absorbing state. The moment the threshold is crossed, the answer is YES and can never become NO again.
This is why PolyFrog stops accepting bets at that instant. A market that kept taking stakes after the outcome was certain would simply be paying whoever noticed first. See Mechanism.
Property two: it is read off a checkpoint
The comparison uses stored state, which is only brought up to date when the auction is checkpointed. Between checkpoints, isGraduated() can report false for an auction that has, in substance, already cleared.
Crucially, the raise can advance with time alone — as the supply schedule releases more tokens, standing demand clears against it. So staleness is not only a problem after a bid; it can develop while nothing at all is happening.
PolyFrog handles this by never trusting a stale read:
bet()checkpoints the auction first, then refuses if it has graduated.resolve()checkpoints, then requires that the auction is finalised at its own end block before reading the outcome.
The threshold is not universal
There is no single graduation number. Each creator sets their own, and the values observed on chain range from a fraction of an ETH to tens of ETH. A launch is not “more legitimate” for having graduated — a threshold of zero graduates instantly and means nothing.
Always read the threshold before taking a side. The auctions page shows it next to the raise.