Support matrix
This page is the canonical source of truth for what the platform supports. Every row here is covered by end-to-end tests in @highlight/testing; anything not on this page will be rejected by validation or deployment.
If you’re an AI agent, this is your ground truth. The schema docstring in packages/testing/matrices/ is regenerated with every release — this page mirrors it.
Dimensions
Section titled “Dimensions”Every sale is parameterized by four things:
| Dimension | Values |
|---|---|
| Collection type | OpenEdition, LimitedEdition, OneOfOne, Series, GenerativeSeries |
| Token standard | ERC721, ERC1155 (editions only — series and generative are always ERC721) |
| Sale type | FIXED_PRICE, DUTCH_AUCTION, RANKED_AUCTION, CUSTOM |
| Access mode | PUBLIC, GATED |
Universal rules
Section titled “Universal rules”- Ranked Auction + Gated is always rejected. Ranked auctions are on-chain only; there’s no executor-signed path.
- Ranked Auction is only valid for finite-supply collections.
LimitedEdition, standardSeries, andLimitedgenerative. Never for open editions, 1-of-1s, collectors-choice series, or open generative. - Gas sponsorship requires
FIXED_PRICE+PUBLIC. Any other combination rejects thegasSponsored: trueflag. - Gated sales have no on-chain vector or mechanic. The backend signs claim transactions with an executor key; the collector submits.
- Every deployment uses
ObservabilityV2. No exceptions.
Editions
Section titled “Editions”The contract implementation is derived from type + tokenStandard:
| Collection type | ERC721 contract | ERC1155 contract |
|---|---|---|
OpenEdition | SingleEditionDFSImplementation (non-reusable) | EditionsDFS1155Implementation (reusable) |
LimitedEdition | MultipleEditionsDFSImplementation (reusable) | EditionsDFS1155Implementation (reusable) |
OneOfOne | MultipleEditionsDFSImplementation (reusable) | EditionsDFS1155Implementation (reusable) |
Reusable contracts can back multiple collections; non-reusable contracts get one per collection.
Supported sale combinations
Section titled “Supported sale combinations”| Type | Sale | Access | Mint method | Supported |
|---|---|---|---|---|
| OpenEdition | Fixed Price | PUBLIC | vectorMint721 | ✓ |
| OpenEdition | Fixed Price | GATED | gatedNumMint | ✓ |
| OpenEdition | Dutch Auction | PUBLIC | mechanicMintNum | ✓ |
| OpenEdition | Dutch Auction | GATED | gatedNumMint | ✓ |
| OpenEdition | Ranked Auction | * | — | ✗ |
| LimitedEdition | Fixed Price | PUBLIC | vectorMint721 | ✓ |
| LimitedEdition | Fixed Price | GATED | gatedNumMint | ✓ |
| LimitedEdition | Dutch Auction | PUBLIC | mechanicMintNum | ✓ |
| LimitedEdition | Dutch Auction | GATED | gatedNumMint | ✓ |
| LimitedEdition | Ranked Auction | PUBLIC | mechanicMintNum | ✓ |
| LimitedEdition | Ranked Auction | GATED | — | ✗ |
| OneOfOne | Fixed Price | PUBLIC | vectorMint721 | ✓ |
| OneOfOne | Fixed Price | GATED | gatedNumMint | ✓ |
| OneOfOne | Dutch Auction | PUBLIC | mechanicMintNum | ✓ |
| OneOfOne | Dutch Auction | GATED | gatedNumMint | ✓ |
| OneOfOne | Ranked Auction | * | — | ✗ |
Valid for both ERC721 and ERC1155. ERC1155 splits the on-chain mint fee in half (matching the MintFeeOracle behavior).
Series
Section titled “Series”Series collections come in two variants. The variant drives the contract implementation and the mint method.
| Variant | Contract | Collector picks token? |
|---|---|---|
| Collectors Choice | SeriesImplementation | Yes — collector passes tokenIds |
| Standard | RandomSeriesImplementation | No — sequential/random assignment |
Both contracts are non-reusable.
Collectors Choice
Section titled “Collectors Choice”Every mint path is executor-signed (even public sales) because collectors pick specific token IDs.
| Sale | Access | Mint method | Supported |
|---|---|---|---|
| Fixed Price | PUBLIC | gatedSeriesMintChooseToken | ✓ |
| Fixed Price | GATED | gatedSeriesMintChooseToken | ✓ |
| Dutch Auction | PUBLIC | mechanicMintChoose | ✓ |
| Dutch Auction | GATED | gatedSeriesMintChooseToken | ✓ |
| Ranked Auction | * | — | ✗ |
Standard
Section titled “Standard”| Sale | Access | Mint method | Supported |
|---|---|---|---|
| Fixed Price | PUBLIC | vectorMint721 | ✓ |
| Fixed Price | GATED | gatedNumMint | ✓ |
| Dutch Auction | PUBLIC | mechanicMintNum | ✓ |
| Dutch Auction | GATED | gatedNumMint | ✓ |
| Ranked Auction | PUBLIC | mechanicMintNum | ✓ |
| Ranked Auction | GATED | — | ✗ |
Generative
Section titled “Generative”Single contract, two variants driven by maxTotal:
| Variant | Rule | Contract |
|---|---|---|
| Open | maxTotal = 0 | GenerativeSeriesImplementation (non-reusable) |
| Limited | maxTotal > 0 | GenerativeSeriesImplementation (non-reusable) |
| Variant | Sale | Access | Mint method | Supported |
|---|---|---|---|---|
| Open | Fixed Price | PUBLIC | vectorMint721 | ✓ |
| Open | Fixed Price | GATED | gatedNumMint | ✓ |
| Open | Dutch Auction | PUBLIC | mechanicMintNum | ✓ |
| Open | Dutch Auction | GATED | gatedNumMint | ✓ |
| Open | Ranked Auction | * | — | ✗ |
| Limited | Fixed Price | PUBLIC | vectorMint721 | ✓ |
| Limited | Fixed Price | GATED | gatedNumMint | ✓ |
| Limited | Dutch Auction | PUBLIC | mechanicMintNum | ✓ |
| Limited | Dutch Auction | GATED | gatedNumMint | ✓ |
| Limited | Ranked Auction | PUBLIC | mechanicMintNum | ✓ |
| Limited | Ranked Auction | GATED | — | ✗ |
Sale lifecycle rules
Section titled “Sale lifecycle rules”- A draft collection may have one sale at a time. Delete before replacing.
- After a collection goes Live, gated sales can still be added (they have no on-chain component and activate immediately). Adding a new public sale to a live collection is not yet implemented — it returns
400. - Live sales cannot be deleted. Pause or set
endAtinstead. - The following fields are immutable once a sale exists:
type,accessMode,gateId,gasSponsored,mechanicId,typeConfig. Re-create the sale to change them. - On a live public sale, only
name,collectorMessage,customMintFee, andpausedcan be updated. Other on-chain fields require a new sale.
Source
Section titled “Source”The canonical matrix definitions live in the repo at:
packages/testing/matrices/edition-functionality-matrix.mdpackages/testing/matrices/series-functionality-matrix.mdpackages/testing/matrices/generative-functionality-matrix.md
Each row in the tables above corresponds to a test ID (e.g. E01, S03, G08) that’s exercised end-to-end on Sepolia by the @highlight/testing package.