Identicon
Punks
Your Ethereum wallet is the seed. A unique 24×24 pixel Punk with identicon skin texture - born deterministically, stored entirely on-chain.
Whitelist application
Type your EVM wallet and X handle. Complete a short quest. No WalletConnect. No OAuth.
100% On-Chain
SVG and metadata assembled inside the EVM. No IPFS. No external servers. Immutable by design.
Wallet-Born
Species and 8×8 identicon skin derived from your address bytes. Deterministic and unique to you.
Evolving
Transfer can update the skin texture to match the recipient wallet - dynamic identity on-chain.
Creation mechanics
Identicon Punks programmatically pairs Ethereum wallet addresses with unique 24×24 pixel Punk sprites through a multi-step on-chain pipeline.
Pipeline overview
- 01Species selection - Byte 0 of the minter’s address seed determines the base Punk species across five rarity tiers (Male, Female, Zombie, Ape, Alien).
- 02Identicon synthesis - The wallet hash generates a custom 8×8 blockie with 2-way horizontal symmetry and a 3-color palette (Primary, Secondary, Background).
- 03Skin mask wrapping - The 8×8 identicon scales 3× and wraps as a skin texture across facial and neck pixels, leaving accessories and features visible above the pattern.
1 · On-chain seed extraction & rarity bucketing
When an address executes mint(), the contract evaluates the caller’s address bytes:
bytes32 addrHash = keccak256(abi.encodePacked(userAddress));
uint8 speciesByte = uint8(addrHash[0]);
if (speciesByte == 255) { species = "Alien"; } // Top 0.4%
else if (speciesByte >= 253) { species = "Ape"; } // Top 0.8%
else if (speciesByte == 252) { species = "Zombie"; } // Top 1.5%
else if (speciesByte >= 154) { species = "Female"; } // 38.4%
else { species = "Male"; } // 60.4%
2 · 8×8 identicon grid generation
Byte-level seed fills a 4×8 half-grid (color indices 0 / 1 / 2), then mirrors horizontally for strict two-way symmetry:
IdenticonGrid[y][x] = IdenticonGrid[y][7 − x]
3 · Bit-packed skin masking
A 576-pixel mask (two uint256) decides which pixels of the 24×24 canvas receive the scaled identicon so eyes, caps, and glasses stay clean:
function isSkinPixel(uint256 x, uint256 y) internal pure returns (bool) {
uint256 pixelIndex = y * 24 + x;
if (pixelIndex < 256) return (skinMaskPart1 & (1 << pixelIndex)) != 0;
else return (skinMaskPart2 & (1 << (pixelIndex - 256))) != 0;
}
4 · On-chain SVG assembly (tokenURI)
The contract assembles a dynamic SVG in memory on every call:
- Skin pass - If
isSkinPixel(x, y), render a 1×1<rect>using the scaled 8×8 color from cell (x/3, y/3). - Trait pass - Fixed arrays lay down hair, glasses, cigarettes, and outlines over the skin texture.
5 · Base64 JSON metadata packaging
The SVG is Base64-encoded and wrapped into the ERC-721 token URI:
{"name": "Identicon Punk #…",
"description": "100% On-Chain Skin-Masked Identicon Punk Avatar.",
"image": "data:image/svg+xml;base64,…"}
Architectural advantages
- ▸100% immutable on-chain storage - Identicon Punks exist entirely within EVM state. Artwork cannot be lost to dead IPFS nodes or server outages.
- ▸Evolving dynamic identity - Generation is tied to address bytes; transferring can trigger real-time skin texture updates matching the recipient wallet.