Identicon Punks
10,000 supply · 100% on-chain

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.

@

Paste the link to your reply under the post.

60.4%
Male
38.4%
Female
1.5%
Zombie
0.8%
Ape
0.4%
Alien

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.