# The Crypt: NFT ecosystem across three chains

One NFT collection that grew into an ecosystem. We built every layer of it: the art, the contracts, and eight production dApps across three chains.

*2023 · built phase by phase, over years*

## The brief

The Crypt started as a single NFT collection with a roadmap that kept outgrowing itself. Every few months the ask changed shape: launch the flagship collection, then a second, then let holders evolve what they already own, then stake it, then burn a full set across two chains for a seat in the next drop. We were the entire technical side of that: the art generation, the metadata, the smart contracts, every website, every snapshot, every migration.

The job was never to build one thing. It was to be the engineering team for an ecosystem that reinvents itself every quarter without ever breaking what already shipped. That is the hard constraint underneath all of it: holders own these assets, so you cannot push a fix that changes what someone paid for, and you cannot take the system down to migrate it.

## What we built

- **Mint dApp.** four-phase merkle sale, plus card checkout for no-wallet buyers
- **Dutch auction.** descending price, every buyer settles at the floor
- **Burn to evolve.** holders permanently upgrade an NFT they already own
- **Staking.** lock tiers, rarity multipliers, batch claim and re-lock
- **Raffle platform.** NFT, token and physical prizes, shipped on two chains
- **11 collections.** generative art, on-chain items, and two Solana tokens
- **The layer nobody sees.** snapshots, merkle trees, cross-chain burn indexing

## How it works

One rule runs through everything: holders own these assets, so nothing that already shipped can ever break. Contracts are the source of truth. Sales run on a single phase variable that walks a collection from free to OG to allowlist to public, each phase with its own merkle root, price and supply cap, so a drop can be hard-stopped mid-flight without touching the collection ceiling. Evolution is two-sided by design: a dedicated contract burns the required artifact and records on-chain that a token has upgraded, which makes a double-upgrade impossible, while a generation pipeline swaps that token's metadata to its new tier. The token ID never changes, so the asset keeps its wallet, its contract and its full history and simply becomes something else. Every tier ships as its own immutable IPFS directory, so nothing live is ever mutated to make something new work.

## Stack

- **Contracts:** Solidity, ERC-721A, ERC-721C, ERC-1155, Merkle proofs, Payment splitters, Transfer validators
- **Frontend:** Next.js, React, TypeScript, Tailwind CSS, Framer Motion, GSAP, MUI
- **Web3:** wagmi, ethers, viem, RainbowKit, merkletreejs, Crossmint (fiat mint)
- **Data & indexing:** Alchemy, Reservoir, Infura, IPFS (Pinata, Filebase)
- **Solana:** Metaplex, Sugar, Programmable NFTs with rule sets
- **Pipeline & infra:** Python, Node, Vercel, Netlify, Discord API

## Numbers

- **11** collections generated and launched across three chains
- **8** production dApps, from mint to raffles
- **15+** smart contracts deployed or integrated
- **25,572** metadata records generated, validated and pinned
- **74** pipeline scripts behind the drops and reveals
- **4,537** NFTs burned in a single cross-chain event

## The hardest part

The cross-chain burn event. On the surface it was simple: holders burn NFTs from three collections to earn allocation in the next drop. The catch was that those collections lived on two different chains, and a full set meant one from each, so allocation could not be read from any single chain's state. There was no shared source of truth. We indexed burn activity independently on Ethereum and ApeChain, normalised it into one wallet-keyed ledger, and resolved allocation under rules that had to be provably fair: a full set scores differently from leftover extras, extras from different collections carry different weight, and every wallet could see exactly how its number was reached. Get the maths wrong by one and someone loses a mint they paid for in burned assets. More than four and a half thousand NFTs went into the fire, and the leaderboard showed the working the whole way through. That same ledger then became a merkle tree, fed a Dutch auction, and settled every early buyer back down to the floor price after the fact.

The close second was evolution. Letting a holder permanently change what an NFT is while keeping its token ID, contract and provenance intact means the on-chain record and the off-chain metadata can never drift apart, not once, not for a single token. We made the contract the sole authority on whether an upgrade happened and treated the metadata pipeline as a follower that can be re-run from chain state at any time. Every tier ships as its own immutable IPFS directory, so nothing that already exists is ever touched to make something new work.

More work: https://dock30.com/work

## Contact

- Email: crew@dock30.com
- Book a call: https://dock30.com/contact
