CryptoBullsCryptoBulls
The art

24×24 pixel bulls, rendered from the chain.

Each CryptoBull is a deterministic pixel-art portrait. The seed is the NFT mint address - locked at wrap time, follows the NFT through every transfer, and re-renders byte-identically from any Solana RPC. Open the renderer, point it at a mint, you get the same bull every time.

A sample of the herd

Ten bulls picked from a sheet of thirty. Browse the full live gallery at /gallery.

Sample CryptoBull bull_01
Sample CryptoBull bull_04
Sample CryptoBull bull_07
Sample CryptoBull bull_10
Sample CryptoBull bull_13
Sample CryptoBull bull_16
Sample CryptoBull bull_19
Sample CryptoBull bull_22
Sample CryptoBull bull_25
Sample CryptoBull bull_28

Anatomy of a bull

Seven trait categories. Each bull is a random draw from the weighted distribution, seeded by the NFT mint address.

Body
×9
brown · black · white · red · golden · cyan · pink · zombie · holo
Rarest: holo - legendary, ~1%
Horns
×5
ivory · dark · gold · crimson · silver
Rarest: silver - rare, ~5%
Eyes
×8
normal · golden · void · green · closed · angry · crying · ski_mask
Rarest: ski_mask - legendary, ~1%
Background
×7
pasture · sand · sunset · chart · void · sky · crimson
Rarest: void - epic, ~4%
Accessory
×23
halo · crown · top_hat · dubai_hat · strawberry_hat · diamond_aura · fire_aura · halo_stars · Pump · Phantom · scar · tinfoil · …
Rarest: halo_stars - legendary, ~1%
Eyewear
×7
none · mog · sunglasses · clout_shades · thug_life · 3d_glasses · lasers
Rarest: lasers - epic, ~2%
Mouth
×7
none · cigarette · grill · bubblegum · frown · tongue_out · open_shout
Rarest: grill - epic, ~2%

The math

Multiplying the active variants across every category:

9 × 5 × 8 × 7 × 23 × 7 × 7
2,840,040
possible unique combinations
Max bulls in circulation
1,000
Oversupply ratio
2,840×

2.8M is a measure of visual diversity, not supply. The real ceiling is 1,000 alive bulls at any moment, enforced on chain by the token math: 1B $BULLS ÷ 1M per wrap = 1,000 simultaneously wrappable. When all 1,000 are alive, zero free $BULLS remain to wrap an 1,001st - the only way to create a new bull is for an existing one to unwrap.

Lifetime mint count is unbounded. Every unwrap re-issues that tier with a fresh NFT mint and almost always a new pixel-art roll. Visual duplicates begin appearing around wrap #2,000 by birthday-paradox math - that's fine, because each NFT is uniquely identified by its mint pubkey, not its image. Tier #42 today and tier #42 a year from now are different bulls - different mints, different art, distinct on-chain identities.

Rarity tiers

Five rarity bands. Each trait is weighted within its category and picked at wrap time. The numbers below are per-item drop rates, sampled across all seven categories - exact rates vary by category because each category has its own weight sum, but every Common item is dominant and every Legendary is ~1%.

Common
22–68%
Uncommon
5–18%
Rare
2.7–12%
Epic
1.8–4%
Legendary
~1%

Three traits are legendary at ~1% drop rate: holo body (1/100), ski_mask eyes (1/99), and halo_stars accessory (1/110). Across 1,000 bulls you'd statistically expect 9-10 of each. Some categories (mouth, horn) intentionally have no Legendary or Epic tier — they're flatter by design.

How it's made

The seed is on chain. The render is reproducible from any RPC. Three steps, fully documented in source.

01
Seed from the NFT mint

When you wrap, the program generates a new NFT mint pubkey. That 32-byte address is the seed. The renderer hashes it with SHA-256 and consumes the bytes one trait at a time. No randomness, no off-chain input. Same mint always renders the same bull.

02
SVG built cell by cell

The renderer outputs a <svg viewBox="0 0 24 24"> document with a background gradient and ~250 <rect width="1" height="1"/> elements - one per occupied pixel. Vector. Crisp at any size. About 8 KB on disk.

03
Served as both SVG and PNG

/api/render/<tier>?format=svg returns the vector source. /api/render/<tier> returns a 768×768 PNG (24×24 grid scaled 32×, nearest-neighbor - no smoothing). Both are cached for 24 hours with Cache-Control: immutable because the visual never changes for a given mint.

Where the art lives

The seed (the NFT mint pubkey) lives on Solana - immutable, transferable with the NFT. The renderer is open source on GitHub. The delivered image is served from cryptobulls.fun, but anyone can run the renderer locally and produce a byte-identical SVG.

This is why the art is reproducible without trusting us. If the site goes down tomorrow, every bull can still be re-rendered from any RPC + the open-source renderer code. The art is bound to the NFT mint by mathematics, not by a server.