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.










Anatomy of a bull
Seven trait categories. Each bull is a random draw from the weighted distribution, seeded by the NFT mint address.
The math
Multiplying the active variants across every category:
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%.
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.
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.
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.
/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.