You can't buy a Punk.
You mine one.
3 333 pixel portraits behind one contract. No mint button and no allowlist: your browser hunts for a hash below the network target, you pay the entry price of the current epoch, and the contract hands you the next Punk in line — rendered before the contract existed, sealed by a provenance hash, yours forever. Or burn it for PUNK points.
- Difficulty now
- — bits
- Hashes per Punk
- —
- Entry price
- — ETH
- Epoch
- —

Nothing on the chain yet. The first hash below the target takes #1.
Three steps, none
of them ours
Nothing here waits on a server, a signature, or a list. The whole path from electricity to Punk runs between your browser and one contract.
Your browser hashes four things: your address, a nonce, the work behind the last Punk and a recent block. Nobody can steal the answer — your address is inside it. Nobody can prepare one in advance — the previous Punk is inside it too.
keccak256 · 116 bytes · Web Workers, every core you give it
A hash below the target is a ticket. Send it with the entry price of the epoch — exactly, not a wei more — and the contract checks it in one comparison. First come, one per block, no auction.
mine(nonce, anchorBlock) · value = entryPrice()
You get the next number, not a random one. All 3 333 portraits were rendered before the contract existed and their hashes are sealed on-chain; the queue decides which face is yours. Keep it, or burn it for PUNK points.
ERC-721 · sequential ids · never reissued
What makes it different
- Mint button
- nonea valid hash is the only door
- Price
- epoch tableepochStart × 0.00002 ETH, fixed at deploy
- Difficulty
- six rulesfloor · retarget · streak · failsafe · 1/block
- Burn
- PUNK points1 000, halving per epoch waited
- Supply
- 3 333ever. burned ids are gone for good
- Artwork
- pre-renderedsealed by a provenance hash
The contract has an owner for exactly two things: the metadata URL and withdrawing the treasury. It cannot mint, pause, reprice, or pick a face.