Settings
A collection worth owning.
ERC-721 written from scratch: a Merkle-tree whitelist phase, a public phase with per-wallet caps, a pre/post-reveal flow and ERC-2981 royalties — 5000 supply, no OpenZeppelin.
Collection ↗
0x…
Minted—
Max supply—
Phase—
Revealed—
Royalty—
Your NFTs—
Public mint
Price — · max — per wallet.
Whitelist mint Merkle
Price — · max — per wallet. Paste your Merkle proof (32-byte hex hashes, one per line).
Gallery (recent mints from the chain)
Loading…
Owner Controls you own this collection
Mint phase
Merkle root
Reveal
—
Royalties
Reserve mint
Withdraw
Send the collection's full ETH balance to the owner.
Live Activity (recent events from the chain)
| Event | Details | Block | Tx |
|---|---|---|---|
| Loading… | |||
showing the latest 15 events
How it works (learn the dApp before you mint)
How to use
- Press Connect Wallet in the top-right header. The dApp runs on the Sepolia testnet (chain id 11155111) — switch networks in your wallet if prompted.
- Point the app at a collection. If the setup banner shows, paste the deployed GenesisNFT address and press Use this collection; you can change it anytime via ⚙ Settings → Save & reload.
- Mint an NFT. In the Public mint card, choose a quantity and press Mint; in the Whitelist mint card, paste your Merkle proof (one 32-byte hash per line) and press Mint (whitelist).
- Follow the result. Your token appears in the Gallery and the transaction in Live Activity; press ↻ Refresh to re-pull the latest 15 events.
- Owner only — manage the drop. If you own the collection, Owner Controls unlocks: set phase, set Merkle root, toggle reveal, update URIs, set royalties, reserve-mint and withdraw.
The process — what happens on-chain
- GenesisNFT.mintWhitelist checks the phase is WHITELIST and that you sent exactly 0.05 ETH per token (max 2 per wallet) before minting.
- MerkleProof.verify recomputes the Merkle root from your proof; the leaf is
keccak256(address), so a proof can never be reused by another wallet. - The hand-written ERC721 contract mints via _mintBatch: sequential
token ids, updated balances and
Transferevents, capped at 5000 supply. - tokenURI returns the shared pre-reveal placeholder until the owner calls
setRevealed(true); then it becomes
baseURI + id + ".json"served via IPFS. - royaltyInfo (ERC-2981) pays 5% of every secondary sale to the owner — marketplaces settle the artist automatically.
- withdraw() sends the contract's full ETH balance to the owner, guarded by ReentrancyGuard; the owner reserve respects the 5000 cap too.
Flow graph
Every token shows the same placeholder until the owner reveals the collection; royalties are paid on secondary sales by marketplaces.