Forensics on standard/broadcast/SetNftURIs.s.sol/96369: three runs. The two earlier ones (2026-07-07 23:33Z, 2026-07-09 20:29Z) produced no transaction hashes at all — simulations that never broadcast. The successful run (2026-07-09 23:46Z) recorded 51 transactions but only 50 receipts, all 50 successful, and the transaction missing a receipt is the LAST one: setTokenURI(49, …) = C-Chain id 49 = Ethereum #50. So exactly ONE tokenURI is unconfirmed, not ~43. It cannot be checked now — the contract was wiped by the 2026-07-10 fresh genesis the next day. This also explains the null name for id 49 in data/cchain-current.json: that snapshot was taken 16:11Z, before the 23:46Z URI pass. Corrects the previous claim that id 49's art/metadata 'were restored'. Co-authored-by: Hanzo Dev <[email protected]>
7.2 KiB
Lux C-Chain — GenesisNFTs
The migration target: the GenesisNFTs contract on Lux C-Chain (EVM chainId 96369). It re-mints the Ethereum lux.town collection as an LRC721 token with permanently-locked LUX bonds and holder-follows staking rewards.
- Address:
0x004287C47efc912FEc391979154454a8017A76C6 - Name / symbol: "Lux Genesis" / GENESIS
- Owner + royalty receiver:
0x9011E888251AB053B7bD1cdB598Db4f9DEd94714(DAO) - Source:
~/work/lux/standard/contracts/nft/GenesisNFTs.sol
1. Contract model
GenesisNFTs is LRC721, Ownable, ReentrancyGuard — a Lux LRC721 (ERC-721
equivalent) preserving the Zora-style content/metadata URIs and marketplace
integration from the Ethereum Media contract, plus permanent LUX locking.
Key constants:
| Constant | Value |
|---|---|
LUX_LOCKED_PER_NFT |
1_000_000_000 ether (1B — the Genesis-Validator bond) |
DAO_TREASURY |
0x9011E888251AB053B7bD1cdB598Db4f9DEd94714 (sale proceeds, owner) |
ETH_GENESIS_CONTRACT |
0x31e0F919C67ceDd2Bc3E294340Dc900735810311 (Ethereum Media) |
totalLuxLocked |
running sum of all bonded LUX (accounting) |
Each token's TokenMeta records nftType, tier, name, originTokenId
(the Ethereum tokenId), luxLocked, and timestamp.
Permanent locking. Per the contract header: each Genesis NFT has LUX "permanently locked … can NEVER be unlocked." Staking rewards flow to the current holder; transferring the NFT transfers future rewards. Minting does not move LUX — it records
luxLocked/totalLuxLockedas an accounting figure; the physical LUX remains in the DAO treasury wallet (see RECONCILIATION.md).
Enums
enum NFTType { VALIDATOR, CARD, COIN } // what the token is
enum Tier { GENESIS, VALIDATOR, MINI, NANO } // its bond size
_getLuxForTier(tier) — the only bond source in the contract:
| Tier | Bond | Comment in source |
|---|---|---|
GENESIS |
1,000,000,000 LUX | $1M - 1B LUX |
VALIDATOR |
100,000,000 LUX | $100K - 100M LUX |
MINI |
10,000,000 LUX | $10K - 10M LUX |
NANO |
1,000,000 LUX | $1K - 1M LUX |
2. Tier naming
The Tier enum is reused for both NFTType.COIN and NFTType.VALIDATOR, which
is why the on-chain token names cross the two vocabularies. Read a name as
<TIER> <TYPE> #<serial>:
| On-chain name | NFTType | Tier | Bond |
|---|---|---|---|
GENESIS VALIDATOR #n |
VALIDATOR | GENESIS | 1,000,000,000 |
GENESIS COIN #n |
COIN | GENESIS | 1,000,000,000 |
VALIDATOR COIN #n |
COIN | VALIDATOR | 100,000,000 |
MINI COIN #n |
COIN | MINI | 10,000,000 |
NANO COIN #n |
COIN | NANO | 1,000,000 |
⚠️ Counting trap.
"VALIDATOR COIN"contains the substring "validator" but is a Coin. A naive substring match over-counts validators and under-counts coins — this is exactly whydata/cchain-current.json's embeddedsummaryis wrong (it reports 104 validators / 14 coins). Classify by the full class: a name ofGENESIS VALIDATOR(or treasuryLux Genesis Validator) is a validator; anything ending inCOINis a coin. The corrected split is 100 validators + 18 coins — enforced bydata/gen_migration_map.py.
3. Current on-chain state (118 tokens)
⚠️ SUPERSEDED (2026-07-10 genesis reset). This 118-token state was wiped when mainnet 96369 was reset to a fresh genesis on 2026-07-10 (recovery from a
warpConfigVM-init bug). The contract0x004287C4…and its 118 tokens are gone from chain; this table is the re-mint target, not live state. The treasury 2T (genesis alloc) survived. Re-mint is deferred to after v1.36. See migration/HISTORY.md (2026-07-10 entry).
From data/cchain-current.json, corrected:
| Validators | Coins | Total | |
|---|---|---|---|
| Held by original holders (people) | 32 | 18 | 50 |
Held by DAO treasury 0x9011 |
68 | 0 | 68 |
| Total minted | 100 | 18 | 118 |
- 100 Genesis Validators — serial-numbered exactly #1–#100 by
name(no gaps, no duplicates). 32 held by the 28 original wallets; 68 held by the DAO treasury (the completion of the authorized 100).⚠️ By trait and artwork the pre-reset set was NOT clean. The nine renumbered treasury tokens kept
"Validator No": 33and art readingVALIDATOR #33 / 100, so ten tokens rendered as #33. Verified 2026-07-25; detail in migration/HISTORY.md (2026-07-09, item 2). The re-mint plan mints each treasury validator at its canonical serial directly, so no renumber step exists to get half-applied. - 18 Coins — all held by original holders: 2× GENESIS(1B), 5× VALIDATOR(100M), 8× MINI(10M), 3× NANO(1M).
Recorded LUX locked
| Family | Count | Bond each | Bonded LUX |
|---|---|---|---|
| Genesis Validators | 100 | 1,000,000,000 | 100,000,000,000 |
| Coins | 18 | (mixed) | 2,583,000,000 |
| totalLuxLocked | 118 | 102,583,000,000 |
Coin bonds: 2×1B + 5×100M + 8×10M + 3×1M = 2,583,000,000 LUX.
Token id 49 (Ethereum #50) had a null name in the export snapshot — the
snapshot was taken before the URI pass ran. Its setTokenURI is the one
transaction in the whole record with no receipt (last tx of the 2026-07-09
23:46Z run: 51 transactions, 50 receipts, all 50 successful), so whether it
landed is unverifiable — the contract was wiped the next day. It is a Genesis
Validator by originTokenId either way. See
migration/HISTORY.md (2026-07-09, item 3).
4. Gaps — the contract must be extended
The current GenesisNFTs tier model cannot represent the full designed
collection:
| Missing | Why it matters |
|---|---|
| No 10B Coin tier | The Tier enum tops out at GENESIS (1B). The authorized Wallet 10B Lux coin (1 authorized, 0 minted) has no representable tier. |
| No Card bond | NFTType.CARD exists, but _getLuxForTier has no Card amount — the ATM/Card (1,000 authorized, ~200M LUX each) can't be bonded. |
| No sub-Genesis validator hierarchy | The designed Validator (100M) / Mini (10M) / Nano (1M) / Mobile validators would collide with the COIN tier names; issuing them needs a distinct type/tier axis. |
| No Pass type | The Pass (LUX) has no NFTType. |
To mint the remaining 12,093 authorized-but-unminted tokens (11,093 coins +
1,000 ATM/Card) and the designed validator hierarchy, the contract needs a tier
extension. Because minting only records totalLuxLocked (locks nothing
physically), the extension is additive and does not disturb the existing 118
tokens. Tracked in RECONCILIATION.md.
5. Provenance
- Contract logic:
~/work/lux/standard/contracts/nft/GenesisNFTs.sol(enum Tier,_getLuxForTier,LUX_LOCKED_PER_NFT,DAO_TREASURY,ETH_GENESIS_CONTRACT,originTokenId). - Live state:
data/cchain-current.json. - Corrected classification + serial verification:
data/gen_migration_map.py.