1,000 pixel foxes, drawn and stored entirely onchain — no IPFS, no server. Each one is generated from its own seed, so no two are alike, and a few show up in party hats.
The public mint is complete — all 900 are out in the wild, with 100 kept by the den. Connect a wallet to check the status, or browse the full collection below.
Reading foxes straight from the chain…
This runs the same pipeline the contract runs at mint: a random 256-bit seed, traits by modular arithmetic, the 24×24 sprite, corruption, a party-hat roll, and the fable. Roll as many as you like.
At mint, the contract hashes the previous blockhash + minter address + token id into a 256-bit seed. That one number is the fox’s entire DNA — stored forever, so the art re-derives identically every time anyone calls tokenURI().
_seed[id] = keccak256(blockhash(block.number-1), msg.sender, id)
Modular arithmetic peels traits off the seed: 6 furs × 6 hoods × 4 eyes, a d100 for background (30% CALM AF, 40% LOUD, 25% TRIPPY, 5% VOID), another for glitch tier (20% CLEAN, 45% GLITCHED, 25% CORRUPTED, 10% FRIED AF), and a 7% party-hat roll across 5 colors. Token #1 skips the roll: purple, hardcoded.
if (id == 1) { t.phat = true; t.phatIdx = PURPLE; }The base fox — hood, ears, snout, sly eyes — is a hand-placed 24×24 pixel grid packed two cells per byte into a 288-byte constant baked into the bytecode. Ten palette symbols; the trait colors fill them in.
bytes constant SPRITE = hex"0000...6510" // 288 bytes = the whole fox
The GAN-melt homage. Higher tiers shift whole pixel rows sideways (wrapping at the edges), splatter up to 40 dead pixels in 8 loud colors, lay scanlines over CORRUPTED+, and hue-rotate the entire image on FRIED AF.
shift[4+(h%18)] = 1+(h/18)%4 corr[h%576] = 1+(h/576)%8
Every token writes its own moral: 8 openers × 8 deeds × 8 morals = 512 possible fables, picked by a second hash of the seed. A nod to BGAN’s GPT-2 punk-lyric backstories — ours are composed onchain.
"FABLE #4: THE HOODED ONE APED THE ROYAL TREASURY INTO A MEMECOIN."
The SVG is run-length encoded into rects, base64’d, wrapped in JSON metadata, base64’d again, and returned as a data URI. OpenSea reads it straight off the chain — there is nothing else to host, and nothing that can ever 404.
return "data:application/json;base64," + Base64.encode(json)