Skip to content

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.

Every sale is parameterized by four things:

DimensionValues
Collection typeOpenEdition, LimitedEdition, OneOfOne, Series, GenerativeSeries
Token standardERC721, ERC1155 (editions only — series and generative are always ERC721)
Sale typeFIXED_PRICE, DUTCH_AUCTION, RANKED_AUCTION, CUSTOM
Access modePUBLIC, GATED
  1. Ranked Auction + Gated is always rejected. Ranked auctions are on-chain only; there’s no executor-signed path.
  2. Ranked Auction is only valid for finite-supply collections. LimitedEdition, standard Series, and Limited generative. Never for open editions, 1-of-1s, collectors-choice series, or open generative.
  3. Gas sponsorship requires FIXED_PRICE + PUBLIC. Any other combination rejects the gasSponsored: true flag.
  4. Gated sales have no on-chain vector or mechanic. The backend signs claim transactions with an executor key; the collector submits.
  5. Every deployment uses ObservabilityV2. No exceptions.

The contract implementation is derived from type + tokenStandard:

Collection typeERC721 contractERC1155 contract
OpenEditionSingleEditionDFSImplementation (non-reusable)EditionsDFS1155Implementation (reusable)
LimitedEditionMultipleEditionsDFSImplementation (reusable)EditionsDFS1155Implementation (reusable)
OneOfOneMultipleEditionsDFSImplementation (reusable)EditionsDFS1155Implementation (reusable)

Reusable contracts can back multiple collections; non-reusable contracts get one per collection.

TypeSaleAccessMint methodSupported
OpenEditionFixed PricePUBLICvectorMint721
OpenEditionFixed PriceGATEDgatedNumMint
OpenEditionDutch AuctionPUBLICmechanicMintNum
OpenEditionDutch AuctionGATEDgatedNumMint
OpenEditionRanked Auction*
LimitedEditionFixed PricePUBLICvectorMint721
LimitedEditionFixed PriceGATEDgatedNumMint
LimitedEditionDutch AuctionPUBLICmechanicMintNum
LimitedEditionDutch AuctionGATEDgatedNumMint
LimitedEditionRanked AuctionPUBLICmechanicMintNum
LimitedEditionRanked AuctionGATED
OneOfOneFixed PricePUBLICvectorMint721
OneOfOneFixed PriceGATEDgatedNumMint
OneOfOneDutch AuctionPUBLICmechanicMintNum
OneOfOneDutch AuctionGATEDgatedNumMint
OneOfOneRanked Auction*

Valid for both ERC721 and ERC1155. ERC1155 splits the on-chain mint fee in half (matching the MintFeeOracle behavior).

Series collections come in two variants. The variant drives the contract implementation and the mint method.

VariantContractCollector picks token?
Collectors ChoiceSeriesImplementationYes — collector passes tokenIds
StandardRandomSeriesImplementationNo — sequential/random assignment

Both contracts are non-reusable.

Every mint path is executor-signed (even public sales) because collectors pick specific token IDs.

SaleAccessMint methodSupported
Fixed PricePUBLICgatedSeriesMintChooseToken
Fixed PriceGATEDgatedSeriesMintChooseToken
Dutch AuctionPUBLICmechanicMintChoose
Dutch AuctionGATEDgatedSeriesMintChooseToken
Ranked Auction*
SaleAccessMint methodSupported
Fixed PricePUBLICvectorMint721
Fixed PriceGATEDgatedNumMint
Dutch AuctionPUBLICmechanicMintNum
Dutch AuctionGATEDgatedNumMint
Ranked AuctionPUBLICmechanicMintNum
Ranked AuctionGATED

Single contract, two variants driven by maxTotal:

VariantRuleContract
OpenmaxTotal = 0GenerativeSeriesImplementation (non-reusable)
LimitedmaxTotal > 0GenerativeSeriesImplementation (non-reusable)
VariantSaleAccessMint methodSupported
OpenFixed PricePUBLICvectorMint721
OpenFixed PriceGATEDgatedNumMint
OpenDutch AuctionPUBLICmechanicMintNum
OpenDutch AuctionGATEDgatedNumMint
OpenRanked Auction*
LimitedFixed PricePUBLICvectorMint721
LimitedFixed PriceGATEDgatedNumMint
LimitedDutch AuctionPUBLICmechanicMintNum
LimitedDutch AuctionGATEDgatedNumMint
LimitedRanked AuctionPUBLICmechanicMintNum
LimitedRanked AuctionGATED
  • 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 endAt instead.
  • 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, and paused can be updated. Other on-chain fields require a new sale.

The canonical matrix definitions live in the repo at:

  • packages/testing/matrices/edition-functionality-matrix.md
  • packages/testing/matrices/series-functionality-matrix.md
  • packages/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.