Sales
A sale defines how collectors can purchase tokens from a collection. A collection can have multiple sales over its lifetime — for example, a gated early-access sale followed by a public drop.
Draft vs live — who can have what sales
Section titled “Draft vs live — who can have what sales”- Draft collection — exactly one sale at a time (public or gated). Delete the existing draft sale before adding a different one.
- Live collection — gated sales can be added freely (they don’t register anything on-chain; they activate immediately). Public sales on live collections are not yet implemented — they require on-chain vector registration, which is on the roadmap.
- Live sales cannot be deleted. Pause them or set an
endAt.
Access modes
Section titled “Access modes”PUBLIC— open to anyone. Registers an on-chain vector or mechanic that theMintManagerreads from.GATED— restricted to wallets that satisfy a gate. No on-chain registration; the backend signs each claim with an executor key.
Because gated sales are fully off-chain from the contract’s perspective, you can attach a gated sale to an already-live collection, run it, end it, and attach another — all without touching the chain outside of mints.
Configuration
Section titled “Configuration”| Setting | Description |
|---|---|
| Sale type | FIXED_PRICE, DUTCH_AUCTION, RANKED_AUCTION, or CUSTOM |
| Access mode | PUBLIC or GATED |
| Price / reserve | Token price in native currency or ERC-20 |
maxPerTransaction | Per-transaction mint cap |
maxPerWallet | Per-wallet accumulation cap |
maxTotal | Cap on total tokens this sale can mint |
startAt / endAt | Sale window |
paymentRecipient | Where proceeds go |
| Gas sponsorship | Creator-paid gas — only FIXED_PRICE + PUBLIC |
gateId | Required when access is GATED, forbidden otherwise |
mechanicId | Required when type is CUSTOM |
typeConfig | Type-specific config for DUTCH_AUCTION, RANKED_AUCTION, CUSTOM |
collectorMessage | Optional copy shown on the mint page |
Immutable vs mutable fields
Section titled “Immutable vs mutable fields”Once a sale exists, these fields cannot be changed — delete and re-add to change them:
typeaccessModegateIdgasSponsoredmechanicIdtypeConfig
For a live public sale, on-chain fields (price, startAt, endAt, currency, limits, paymentRecipient) also can’t be changed yet. Only name, collectorMessage, customMintFee, and paused are mutable.
For a draft sale, everything is freely updatable.
Constraints
Section titled “Constraints”- Gas sponsorship: only
FIXED_PRICE+PUBLIC. - Ranked auctions:
PUBLIConly. Gated ranked auctions are rejected. - Ranked auctions only work on
LimitedEdition, standardSeries, andLimitedGenerativeSeries. - Custom sales require a registered
mechanicIdwith a deployment on the sale’s chain. - See support matrix for the full combination set.
Advanced — burn-redeem and donation
Section titled “Advanced — burn-redeem and donation”Fixed price sales support two advanced modes via typeConfig.
Burn-redeem — collectors burn tokens from another contract to redeem:
burnAddress— contract to burn frommechanicAddress— on-chain mechanic handling the burntokenId,burnAmount— which and how manychainId— optional, for cross-chain burns
Donation — collectors can pay above the reserve:
reserveEtherPrice— minimummaxPerWallet— optional wallet cap
Both only apply when type: "FIXED_PRICE".
Related
Section titled “Related”- Sale types — pricing strategies
- Gates — access control
- Support matrix — every valid combination
- Sales SDK — code-level reference
- Gated sales guide — claim flow