Skip to main content

NFT Migration Guide

How Faded Monsuta's 100,000+ WAX NFTs are migrating to Avalanche — the phased player migration plan. For the technical bridge implementation, see NFT Bridge →.


Migration Phases

PhaseDescription
1. Metadata SnapshotCatalog all WAX NFT templates and ownership state
2. Avalanche ContractsDeploy NFT contracts (MonsutaNFT.sol) on Avalanche
3. Bridge Contract + OracleVault-based bridge with oracle threshold signatures
4. Player Migration PortalUI for players to move their WAX NFTs to Avalanche
5. Legacy DeprecationWAX NFT support sunset with 90-day notice

Purpose

Faded Monsuta has 100,000+ NFTs on WAX (AtomicAssets standard). As the game's economy migrates to Avalanche, these assets need to be representable on the new chain without:

  • Losing ownership
  • Losing metadata (attributes, rarity, history)
  • Forcing players to act within a deadline
  • Creating duplicates across chains

Why this is different from the token bridge: Fungible tokens have a 1:1 numerical equivalence. NFTs carry metadata, schemas, templates, and individual attributes. The migration strategy must account for this complexity.


Design Constraints

ConstraintReason
No forced deadlinePlayers migrate on their own schedule — nobody loses anything by waiting
No data lossAll attributes, rarity, and provenance must transfer
No duplicatesNFTs are locked (vaulted) on WAX when minted on Avalanche — not burned
Reversible during transitionBidirectional flow until full migration is declared complete
Schema preservationWAX template/schema structure maps to on-chain metadata

Important: The implementation uses vault-based locking, not burning. WAX NFTs are held in the bridge contract and can always be returned. See NFT Bridge → for the full technical details.


The Migration Phases

Phase 1: Metadata Snapshot

Goal: Build a complete catalog of all NFT assets on WAX.

The oracle's PostgreSQL database maintains the authoritative mapping:

  • WAX template_id → Avalanche type_id (stored in wax_template_map)
  • Atomic serial counters per type (stored in nft_id_counter)
  • Full ownership snapshot available via AtomicAssets API queries
AtomicAssets API


wax_template_map table
template_id: 12345
avax_type_id: 1
avax_class: "Base"

No on-chain storage of the mapping — it all lives in the oracle's database and is queried at bridge time.


Phase 2: Avalanche Contract Deployment

Goal: Deploy NFT contracts on Avalanche that can represent migrated assets.

MonsutaNFT.sol is deployed and live on Fuji testnet:

  • ERC-721 with UUPS upgradeability
  • MINTER_ROLE granted to the NFT bridge contract
  • Token IDs encode type via bitwise scheme: avaxTokenId = (typeId << 128) | serial
  • Dynamic metadata via the Metadata Router on Railway

All attributes and provenance are preserved in the metadata JSON served by the router.


Phase 3: Bridge Contract + Oracle

Goal: Deploy a working bridge so WAX NFTs can be moved to Avalanche and back.

The bridge is live. See NFT Bridge → for the full technical documentation.

Player transfers NFTs to WAX bridge contract


NFTs vault-locked on WAX (NOT burned — always recoverable)


nft-oracle-wax.js detects event, translates IDs, signs EIP-712 payload


Player calls NFTBridge.claim() on Avalanche


MonsutaNFT.mintBatch() — Avalanche NFTs issued with full metadata

Vault-based locking means:

  • Reverse migration is always possible during the transition period
  • NFTs can be validated against the WAX vault at any time
  • Nothing is permanently destroyed until Phase 5 is explicitly executed

Phase 4: Player Migration Portal

Goal: A UI that lets players move their WAX NFTs to Avalanche without touching a command line.

Portal features:

  • Connect both WAX wallet and Avalanche wallet
  • View all eligible WAX NFTs with their metadata
  • Select assets for migration (individual or batch)
  • Preview how the NFT will appear on Avalanche before confirming
  • Track pending and completed migration status
  • Initiate reverse migration (Avalanche → WAX) if needed

Phase 5: Legacy Deprecation

Goal: After the migration window, formally sunset WAX NFT support.

Steps (minimum 90-day notice period required):

  1. Publish deprecation timeline publicly
  2. Stop minting new NFTs on WAX
  3. In-game systems exclusively recognize Avalanche NFTs
  4. WAX bridge remains operational for late migrators
  5. Optional: final release of WAX vault (locked assets returned to original holders)

No forced burns. Players who haven't migrated by the end of the window will have their WAX NFTs returned, not destroyed.


Metadata Mapping

WAX AtomicAssets → Avalanche ERC-721

WAX FieldAvalanche EquivalentNotes
template_idwaxTemplateIdStored on-chain for provenance
asset_idwaxAssetIdUnique WAX identifier
schema_nameschema (string)Preserved in metadata
immutable_dataMetadata URI (IPFS)All attributes in JSON
mutable_dataMetadata URI (updatable)Points to current state
collection_nameContract-level constantOne contract per collection
ownerNFT owner addressMapped via wallet link

Metadata JSON (on IPFS)

{
"name": "Fire Drake",
"description": "Legendary Monsuta from Season 1",
"image": "ipfs://Qm.../fire_drake.png",
"attributes": [
{ "trait_type": "Rarity", "value": "Legendary" },
{ "trait_type": "Attack", "value": 85 },
{ "trait_type": "Defense", "value": 42 },
{ "trait_type": "Element", "value": "Fire" },
{ "trait_type": "Origin Chain", "value": "WAX" },
{ "trait_type": "WAX Template ID", "value": "12345" },
{ "trait_type": "WAX Asset ID", "value": "1099512345678" }
],
"provenance": {
"originChain": "WAX",
"originContract": "atomicassets",
"originCollection": "fadedmonsuta",
"migratedAt": "2026-03-15T00:00:00Z"
}
}

What Players Keep vs What Changes

What Players Keep

  • Full ownership of all migrated assets — same NFTs, new chain
  • Complete attribute set (rarity, stats, element, type)
  • Historical provenance — WAX template and asset IDs are preserved in metadata
  • The ability to bridge back to WAX during the transition period

What Changes

Before (WAX)After (Avalanche)
AtomicAssets standardERC-721
WAX blockchainAvalanche C-Chain
AtomicHub marketplaceAvalanche-native markets
WAX Cloud Wallet / AnchorMetaMask or equivalent

Players do not lose any asset value or history. The migration changes the technical representation, not the ownership.


Metadata Mapping

WAX AtomicAssets → Avalanche ERC-721

WAX FieldAvalanche EquivalentNotes
template_idtypeId (in token ID encoding)Stored in oracle DB, encoded in token ID
asset_idserial (in token ID encoding)Unique per-type serial counter
schema_nameMetadata JSON schema fieldPreserved via metadata router
immutable_dataMetadata JSON attributesServed dynamically by metadata router
collection_nameContract-level constantOne MonsutaNFT contract for the collection
ownerERC-721 ownerOf()Mapped via wallet link at bridge time

Metadata JSON (served by metadata router)

{
"name": "Fire Drake",
"description": "Legendary Monsuta from the original WAX collection",
"image": "ipfs://Qm.../fire_drake.png",
"attributes": [
{ "trait_type": "Rarity", "value": "Legendary" },
{ "trait_type": "Attack", "value": 85 },
{ "trait_type": "Defense", "value": 42 },
{ "trait_type": "Element", "value": "Fire" },
{ "trait_type": "Origin Chain", "value": "WAX" },
{ "trait_type": "WAX Template ID", "value": "12345" }
],
"provenance": {
"originChain": "WAX",
"originContract": "atomicassets",
"originCollection": "fadedmonsuta"
}
}

Adapting for Other Games

To run this migration pattern for a different game migrating from WAX (or any chain):

  1. Snapshot your assets — enumerate all NFTs from your source chain's API
  2. Design the metadata mapping — map source format to ERC-721 + IPFS
  3. Deploy your NFT contract — include origin fields for provenance tracking
  4. Deploy source chain bridge contract — vault-based locking, not burning
  5. Configure the oracle database — populate wax_template_map with your template IDs
  6. Run oracle processes — adapt nft-oracle-wax.js for your source chain's events
  7. Build the migration portal — UI for players to connect both wallets and migrate
  8. Follow the 5-phase plan — snapshot → deploy → bridge → portal → deprecate

The pattern is chain-agnostic. Replace WAX/AtomicAssets with your source chain's NFT standard and the architecture remains the same.