24×24 pixel bulls, rendered from the chain.
Each Bull 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 $WBULL ÷ 1M per wrap = 1,000 simultaneously wrappable. When all 1,000 are alive, zero free $WBULL 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 wrappedbulls.com, 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.