Versioning
vMAJOR.MINOR.PATCH, classified by one question: does an existing, correct caller keep working, unchanged, with the same result?
Standards (XNS-1, the Metadata Standard) version separately from the contracts that implement them, as
vMAJOR.MINOR.
Deployed now
XNS1.aml is the reference implementation and is not deployed.
XNS1 v4.0.0
Reference implementation. Verified, not deployed. Breaking against rev 3. Rev 3 is withdrawn and is not included in this repository. Existing implementations based on it should migrate to v4.0.0.What changes for implementers
is_approved_or_ownerreturnsu128(1or0). Rev 3 returnedbool, whichXmarket.require(approved == 1)cannot satisfy, so a literal rev-3 implementation is untradeable on Xmarket. This is the reason for the migration.total_supply()is live supply.total_minted()is the id count. Rev 3 had one counter.- New:
burn(token_id)(holder only),total_minted(),burned(),is_burned(token_id). get_contract_info()gainedtotal_minted | burned | events.- Mint emits
Transferred(id, 0, to); rev 3 emitted(id, caller, to). Burn emitsTransferred(id, owner, 0). event_logandget_event_logadded, so an XNS-1 contract is visible to an indexer at all.boolremoved from state and from numerically compared parameters.get_token_circle_infoversion is now 2: theactivecolumn is1/0.
Hashes
Sourcef55d89cd…, identical on both chains. Bytecode differs per chain, which is expected:
Verified true, 0 errors, 7 warnings on both.
XuperFactory v2.0.0
2026-08-21, mainnet. Breaking. Replaces SuperFactory, which was deployed on 2026-07-20 and never used (count 0, so nothing was orphaned).
What changes for callers
- The contract is renamed
SuperFactorytoXuperFactory. Revert strings are prefixedxuperfactory:. create_collectionis payable and requiresvalue >= launch_fee. A call that sends nothing now reverts. This is the breaking part.- The
genesisparameter is renamedxpectra. Positional order is unchanged, so the wire format is identical and no signature changes. - New views
get_launch_fee()andget_fee_balance().
- Launching costs a 1 OCT fee, on top of about 0.2 OCT of network fee. The fee is owner-settable and readable on-chain, and zero is legal.
The mainnet and devnet builds differ because the embedded Xcollection is compiled per chain. Same source, different bytecode, which is expected on this toolchain.
Xcollection v4.0.0
2026-08-21, mainnet, embedded in XuperFactory v2.0.0. Breaking. Folds in an earlier build from 2026-08-12 that was never deployed. What changes for callersgenesis_mint(genesis_id)is nowxholder_mint(xpectra_id).get_genesis_status,has_claimed_genesisandis_genesis_id_usedare nowget_xholder_status,has_claimed_xholderandis_xpectra_id_used.genesis_contract,genesis_minted_count,genesis_claimedandused_genesis_idsare nowxpectra_contract,xholder_minted_count,xholder_claimedandused_xpectra_ids.event GenesisMintis nowevent XholderMint. Indexers must update their filter, otherwise these mints will no longer be observed.total_supply()now returns live supply andtotal_minted()returns the id count. Callers readingtotal_supplyas the total ever minted will receive a different value.get_contract_info()gained a trailingburnedcolumn.- New:
burn(token_id),total_minted(),burned(),is_burned(token_id). get_provenance_hashis now aview fn. Reading it no longer costs a transaction.
- The Xholder reserve ceiling is 111, previously 222. For collections above 555 supply this materially changes the reserved allocation.
- The minimum phase length is 240 epochs, approximately 40 minutes, previously 360. The earlier value assumed exactly ten seconds per epoch, a rate the chain has not sustained. 240 is derived from the fastest rate measured over 160 days.
- Burning is available, holder-only. It never lowers
max_supplyand never reopens a mint slot.
Xcollection v3.1.1
2026-07-20, mainnet, embedded in SuperFactory. Patch. Hardening only, no interface change: checked mint-cost multiplication, a bounds check onget_approved, dropped vestigial guards, and xholder_mint marks claim state before the external owner_of call.
Xcollection v3.1.0
2026-06-26, devnet. Minor. What changes for creators- The Xholder claim became one per wallet and was decoupled from the Guaranteed allocation. It no longer increments
gtd_mintedor consumesgtd_cap/gtd_wallet_cap, so the reserve can never erode a creator’s own allowlist. - New view
has_claimed_genesis(renamed tohas_claimed_xholderin v4.0.0).
Xincinerator v1.0.0 and XincineratorLog v1.0.0
2026-07-28, mainnet. New.Xincinerator is an ownerless sink: no owner, no entry points, no call(), two view functions and nothing else. A token sent to it can never be moved again. XincineratorLog batches transfers into it and emits Burned, and can only ever name the incinerator fixed in its constructor.
Used to burn 111 Xpectra. See Xpectra.
Hashes
XpectrumGenesis v1.0.1
2026-07-21, mainnet, deployed as Xpectra. Patch. Hardening for parity with Xcollection: checked mint-cost multiplication, a bounds check onget_approved, dropped vestigial guards. No interface change.
Hashes: bytecode_hash 9e17d6c9…
Xmarket v3.2.0
2026-07-20, mainnet. Breaking, relative to v3.1. What changes for callersmake_collection_offer(nft, duration, quantity)takes a quantity.get_offernow returns 9 fields, and thecofferevent 7.- Accepting an offer emits an
osaleevent rather thansale. Previously an offer accept emittedsalecarrying an offer id in the listing-id field, which corrupted indexer listing tables. Consumers indexing sales must handleosale. - A
cancelevent is now logged when an accept auto-closes a listing, with status 0 rather than 2. - New
cancel_offerevent. - New
standard_modecompatibility lane: owner-flagged collections are checked viaowner_ofplusget_approved, which lets ERC-721-shaped contracts trade. - Accepting one’s own offer is now rejected.
943cbd42…