Technical notes

Everything here can be checked against the chain. Nothing on this page needs you to trust us.

Where the art lives

Two contracts. The collection holds ownership and a packed table of trait indices, three bytes per token. A separate renderer holds the art data and builds the picture. Both store their data as contract code rather than in storage slots, which is roughly three times cheaper per byte.

Art data
7,937 bytes — palette, layers, fur texture
Trait table
9,999 bytes — 3 bytes per token
Trait names
853 bytes — categories, traits, tiers
Outside references
none

How a picture is assembled

On tokenURI the renderer reads the token's three bytes, unpacks seven trait indices, and lays down the background, the body, the fur speckles and then each trait in a fixed order. The result is a grid of palette slots, turned into an SVG of horizontal runs and returned as a data: string. Reading it is a view call, so it costs nothing.

The renderer is interchangeable until the owner locks it with lockRenderer(). The art itself is data, not code, so replacing the renderer could fix a metadata bug without touching a single pixel.

Why the allocation can be trusted

Two things would each be easy to fake on their own, so both are pinned. The table of 3,333 trait sets was generated in advance from a published seed, and its hash was fixed before minting opened. Which token receives which row is then decided by a single offset, taken from a block hash at the moment minting opened. The owner does not produce blocks, so the offset was not theirs to choose.

Generation seed
—
Table hash (keccak256)
—
Offset at opening
—
Collection
—
Renderer
—
Network
—

Honest about the limit: the offset comes from a block hash, not from a verifiable random function. A block producer could in principle influence it. For a collection this size that is the usual trade-off, and it is written down here rather than glossed over.

Rules in the contract

What it costs

Measured on the network, not estimated.

ActionGas
Deploy both contracts9,064,508
Mint two119,937
Free mint123,726
Read tokenURIview call, free

Traits and rarity

Loading…

Checking it yourself

  1. Read combos() on the collection to get the table address, then read that contract's code. It is the table, byte for byte.
  2. Hash those bytes with keccak256 and compare with the value above.
  3. Re-run the generator with the published seed and confirm you get the same table.
  4. Call tokenURI on any token and decode the base64. The SVG comes out of the contract, not from here.

Back to the collection