Skip to main content
A single sale can run as an ordered series of phases — e.g. a cheap whitelisted private round that rolls into an open public round. Leave the phase builder empty for a plain single-phase sale.
Multi-phase is fixed-price only — it can’t be combined with oracle/USD pricing.

Each phase sets

FieldMeaning
startsAt / endsAtThe phase’s window
tokensPerQuoteUnitThe price for this phase
phaseCapCumulative raise ceiling by the end of this phase
maxBuyPer-wallet cumulative cap during this phase
merkleRootWhitelist for this phase (empty = open to all)

The rules

The contract enforces a few invariants so phases stay solvent and predictable:
Each phase’s rate must be ≤ the previous phase’s — i.e. private buyers never pay more than public. A cheaper early round that gets more expensive later is rejected.
phaseCap is a running high-water mark and must strictly increase. The last phase’s cap must equal the hard cap.
Each phase starts at or after the previous one ends. A gap between phases simply reads as pending — no buys until the next phase opens.
First-come, first-served inside each phase too — no pro-rata.

Whitelists

Gate a phase (or a single-phase sale) with a Merkle root. You paste the allowed addresses; the form builds the tree and stores the root on-chain. At buy time, a whitelisted wallet submits a Merkle proof — the app derives it automatically for the active phase, so whitelisted buyers purchase straight from the UI.
A common shape: Phase 1 — whitelisted, low price, small cap; Phase 2 — open, higher price, cap = hard cap. Early supporters get the discount; everyone else gets a fair open round.