about puffiez
10,000 hand-drawn pixel PFPs that live inside a contract on Robinhood Chain. There is no image file anywhere — the contract draws each one when asked.
what “fully on-chain” means here
Most NFTs store a link. The token points at a file on IPFS or a server, and if that file moves or the bill goes unpaid, the art is gone. Puffiez stores the artwork itself, as data, in the contract's own bytecode.
The whole collection — a 234-colour palette, 53 trait layers on a 35×35 grid, and the trait map for all 10,000 tokens — is packed into roughly 20 KB and written on chain. Nothing else is loaded, ever. As long as Robinhood Chain exists, so does the art.
how a token gets drawn
Calling tokenURI(id)runs the whole pipeline inside the contract: look up the token's five traits, unpack those layers, composite them in order (background, base, mouth, headwear, eyewear), and emit an SVG as a base64 data URI. No server is involved at any point.
Two layers are semi-transparent, so the compositor does real alpha blending rather than simply painting over. It uses the same rounding rule as Cairo and pixman — naive division diverges by a pixel value here and there, and the output must match exactly.
It has to match, because the browser renderer on the mint page is a port of the same logic. Every one of the 10,000 tokens was rendered both ways and compared byte for byte — 10,000/10,000 identical against the live contract. That is what the chain ✓ badge on the test render means.
minting
Payment is exact: the contract takes price × quantity and reverts on anything else rather than keeping the difference.
what is permanent
The renderer will be locked. Once locked it cannot be swapped, so the artwork a token draws is the artwork it draws forever. Locking is one-way, and refuses to run unless the renderer successfully draws a token first. Until then it remains swappable — you can check the current state by reading rendererLocked() on the contract, which is the only answer worth trusting.
Ownership cannot be renounced — the function is disabled outright, so the contract can never be left orphaned. Royalties are 0% and there is no mechanism to raise them.
verify it yourself
Do not take any of this on trust. Ask the contract directly — these read calls are free and need no wallet:
# what the contract says a token looks like cast call 0x81d830C38E4a1C369337256F24513761653BC369 \ "tokenURI(uint256)(string)" 1 --rpc-url https://rpc.mainnet.chain.robinhood.com # the raw SVG, straight from the renderer cast call 0x6b35a7398560305B25920A4A83d8347cAF443303 \ "svgOf(uint256)(string)" 1 --rpc-url https://rpc.mainnet.chain.robinhood.com # current price, supply and whether the sale is open cast call 0x81d830C38E4a1C369337256F24513761653BC369 "mintPriceWei()(uint256)" --rpc-url https://rpc.mainnet.chain.robinhood.com cast call 0x81d830C38E4a1C369337256F24513761653BC369 "totalMinted()(uint256)" --rpc-url https://rpc.mainnet.chain.robinhood.com cast call 0x81d830C38E4a1C369337256F24513761653BC369 "saleOpen()(bool)" --rpc-url https://rpc.mainnet.chain.robinhood.com
The renderer checks the art data too. Its constructor asserts the code hash of every stored blob, so a renderer holding different art than the one audited would fail to deploy at all.
contracts
Robinhood Chain is a test network. Tokens minted here carry no value and the deployment may be replaced while the collection is finalised.