Docs

How Lunauts works.

Every number on this site comes from one deterministic pipeline: a seed produces the art, the art produces the rarity table, and the rarity table is written into the metadata. Nothing is assigned by hand, so anyone can rebuild the collection and check it.

Art & generator

DeterministicSeed lunauts-genesis-v1 drives a seeded PRNG, so token #1,337 always gets the same layers on any machine.
Layered vectors13 trait types are drawn as original flat-vector SVG layers, then rasterised to 1024px PNG. No traced or borrowed art.
No duplicatesTrait combinations are hashed while generating; a collision is rerolled, so all 2,000 tokens are unique.

Rarity method

sum of supply / trait count across all traits; rank 1 = highest score. Scores come from realised trait frequency after generation, so a rare value stays rare even if the weights drift. Each token gets a tier and a numeric rank, both written into its metadata.

Tiers

Mythic · top 1%20 tokens
Legendary · top 5%80 tokens
Epic · top 15%200 tokens
Rare · top 40%500 tokens
Uncommon · top 70%600 tokens
Common · top 100%600 tokens

Full trait distribution →

Metadata

Token metadata follows the OpenSea standard, with rarity exposed as attributes so marketplaces can sort on it. Pre-reveal, every id serves the same placeholder document.

{
  "name": "Lunaut #1",
  "description": "One of 2,000 Lunauts...",
  "image": "ipfs://<art-cid>/1.png",
  "external_url": "https://lunauts.com/lunaut/1",
  "attributes": [
    { "trait_type": "Background", "value": "Dawn Haze" },
    { "trait_type": "Headgear", "value": "Crater Crown" },
    { "trait_type": "Rarity Tier", "value": "Mythic" },
    { "trait_type": "Rarity Rank", "value": 1, "display_type": "number" }
  ]
}

Contract

StandardERC-721 + ERC-2981 royalties
Supply cap2,000, immutable
PhasesClosed → Allowlist → Public, owner-controlled
AllowlistMerkle proof, per-wallet allowance in the leaf
RevealPlaceholder URI, then a one-way switch to the final base URI
WithdrawOwner-only pull to the payout address
Drop variantLunautsSeaDrop, for an OpenSea Drop on the same chain
Addressnot deployed yet

Chain settings

Robinhood Chain

Chain id4663
Gas tokenETH
RPChttps://rpc.mainnet.chain.robinhood.com
ExplorerBlockscout

Robinhood Chain Testnet

Chain id46630
Gas tokenETH
RPChttps://rpc.testnet.chain.robinhood.com
ExplorerBlockscout

The mint panel can add the active network (Robinhood Chain) to your wallet in one click. Public RPCs are rate limited — a dedicated RPC is recommended for heavy use.

Verify it yourself

The generator, rarity script and contracts ship in the project archive. Run these to reproduce every claim on this site.

npm run generate --workspace packages/artre-render all 2,000 SVG + PNG from the seed
npm run rarity --workspace packages/artrecompute trait distribution, tiers and ranks
npm run placeholder --workspace packages/artbuild the pre-reveal metadata and image
npm test --workspace packages/contractsrun the mint contract test suite
forge testrun the SeaDrop variant tests in packages/seadrop

Raw data: rarity-traits.csv · rarity-tokens.csv

Waitlist API

The waitlist is a single JSON endpoint backed by Cloudflare KV, rate limited to 5 requests per minute per IP with a honeypot field for bots.

POST /api/waitlist
{ "email": "you@example.com", "wallet": "0x…", "x": "handle" }

200 { "ok": true }
409 { "error": "already on the waitlist" }
429 { "error": "too many requests" }

Signups are exported to allowlist leaves with node scripts/export-allowlist.mjs.