mined

How it works

Modern Punk is one ERC-721 contract. Nothing here is sold ready made: the only way a Punk comes into existence is a hash below the current target, paid for at the entry price of the current epoch, and it is always the next one in line.

Every moving part is below, and the instruments are real — keccak256 in your browser, the live chain, and the same formulas the contract uses.

01Mining

What your browser
actually computes

Open the miner

Four values, one hash, one comparison — and you can run them right here. Everything else on this page is a consequence of them.

A miner picks a nonce and hashes four values together: their own address, the nonce, the work behind the previous Punk, and an anchor — the hash of a recent block. 20 + 32 + 32 + 32 bytes, keccak256, 32 bytes out. If the result has at least as many leading zero bits as the target asks for, the contract accepts it, takes the entry price of the current epoch and mints the next Punk in line.

Every Punk is chained to the one before it. The work of the last Punk goes into the next one, so nothing can be mined ahead of time, and the moment somebody else mints, every solution being held becomes worthless.

The address is part of the work. That is what makes a solution untradeable: the same nonce and anchor produce a different hash for anybody else.

The miner runs on processor cores. One Web Worker per core, minus one so the page keeps drawing; each worker walks its own stride of nonces with the same keccak256 the contract uses, changing only the 32 nonce bytes of a reused 116-byte buffer. Pure JavaScript, no graphics card, no WebAssembly in this version — about 1.8 MH/s on an ordinary desktop.

A solution is checked before it costs anything. The worker reports it, the page hashes it again, then asks the contract's own checkSolution view against the chain as it stands. Only then is mine(nonce, anchorBlock) sent, with the entry price attached. The contract recomputes the whole thing itself; the browser's hash is a preview, never a claim.

Stealing a solution
impossible

The address is inside the hash, so a copied transaction computes to something else. The anchor and the previous work are public; your address is what makes them yours.

One per block
1 Punk

The contract mints at most once per block. Two valid solutions in the same block: the first one included wins, the second reverts — and its work was void anyway, because the previous work moved.

Measured on one desktop
1.8 MH/s

Thirteen workers on a 14-thread CPU, pure JavaScript keccak. At 20 bits that is under a second per Punk; at 32 bits, about forty minutes.

What the miner hashesLive
Miner0x0000…0000

No wallet connected, so the zero address stands in. Connect one and this row — and every hash below — becomes yours.

Nonce4 815 162 342

The only free value of the four — this is what the workers spin, hundreds of thousands of times a second per core.

Previous work

The work behind the Punk before yours. Every mint replaces it, and everything found under the old one is spent.

Anchor

A recent block hash, read from the live chain. The contract accepts any of the last 250 blocks — about 25 seconds on Robinhood Chain.

Keccak256 of the four / zero bits
Target right nowreading…
Waiting for the chain: previous work, anchor and target arrive within a few seconds.

The hash does not pick the picture. Punks are numbered, and the next number in line goes to whoever mints next: your hash is the proof of work behind Punk #n, recorded with it for ever, but #n was drawn long before you found it. Spare hashrate buys zero bits, and nothing else.

What a zero bit costsInteractive
Hashes per Punk
1M
One browser tab
<1s
Chance in a minute
100%

At 1.8MH/s — thirteen workers of an ordinary desktop, pure JavaScript keccak, no GPU. Every extra bit doubles all three numbers; there is no shortcut, and that is the whole point.

A solution dies with the next mint, or when its anchor leaves the window — whichever comes first. The anchor is the hash of a recent block, and the contract accepts one of the last 250 of them. At the planned pace the next Punk usually arrives first; the anchor is the backstop for a quiet hour.

Anchor windowLive
Block

One cell is 5 blocks of the 250-block window — about 25s at Robinhood Chain's 0.1 s blocks. A solution found against this anchor is sent with its block number; when the window runs out the solution is dead and the search starts again against a fresh anchor. The next mint usually ends it sooner: every mint replaces the previous work, which is inside the preimage too.

One mint, end to end
  1. Your browser reads the current target, the anchor, the work behind the last Punk and the entry price.
  2. Web Workers hash nonces until one lands below the target.
  3. The candidate is dry-run through checkSolution, then sent to the contract with the entry price attached.
  4. The contract recomputes the hash from your address and checks it itself — against the target for your address in that block, the price, the anchor and the one-per-block rule.
  5. The next Punk in line is minted to you, and its work becomes the previous work of everyone else’s search.
  6. The entry price stays in the contract until the owner withdraws it to the treasury. No rent, no hook, no token.
02Difficulty

Six rules that
set the target

Difficulty is not one number drifting upward: a floor that rises with the epoch, a retarget every eight mints, and a streak that doubles the work for every recent mint.

Epoch floor and streakInteractive
Epoch floor
14bits
With the streak
14bits
16.4K hashes
Entry price
0.000069ETH

Every bit doubles the search, so the two sliders multiply: the epoch sets the floor (14 + epoch on this chain), the streak stacks on top of it, and the price of that epoch moves alongside — money and work grow together. The floor is only the lowest the base can sit; the retarget can hold it higher.

Epoch floorfloorBase + epoch
Work doubles every epoch, and the retarget may never go below that line. Measured on the base difficulty, before the streak is added.
Base difficultyread from the chain
What the retarget works on. The first Punk was mined at the number the deployment set; from there the pace alone moves it, and it never goes below the epoch floor.
Retargetevery 8 mints
Compares the real pace of the last eight mints with the plan of 10 seconds each and moves the base: up to 4× harder in one window (+2 bits), at most 2× easier (−1), and never below the floor.
Streak×2 per recent mint
Adds one bit for every recent mint and cools one step at a time, every 10 seconds, counted per network and per address. Twelve mints in a row cost 4 096× the work of one; the doubling stops after 16 steps.
Failsafe5 min, one bit
After that much silence the target is one bit easier — never more. The first mint switches it off again.
One Punk per block1 per block
A hard ceiling, counted by the chain’s own block number. On a 2-second chain that is 30 Punks a minute at the very most; the rules above keep the real pace near one every 10 seconds.

Every epoch doubles three things at once: the floor's work, the size of the epoch and the price step — and halves what a burn returns. The last epoch, #2 0413 333, is cut short by the cap: 3 333 Punks, then the contract refuses every solution.

NumbersWhat runs today
constantvaluenote
baseBitsreading…
floorBasereading…
TARGET_INTERVAL10 sone mint every ten seconds is the plan
RETARGET_WINDOW8 mints— / 8 into the current window
STREAK_COOLDOWN10 s per stepcap 16
FAILSAFE_IDLE5 min, one bitnever deeper
ANCHOR_WINDOW250 blocks · 25sRobinhood Chain
BLOCK_CEILING1 per block · 100 mscounted by the chain, not by the clock
03Price

What the price is,
and where it goes

The entry price is the number of Punks that already exist times a fixed step. It is derived, not chosen.

Epochs double. The first is 8 Punks, each next one twice as large: 8, 16, 32 … up to the last, which the 3 333 cap cuts short. The price is constant inside an epoch and changes only at its border.

The price is derived, not chosen. It equals the number of Punks minted before the epoch began times 0.00002 ETH. Epoch 3 starts after 56 Punks, so every Punk in it costs 56 × 0.00002 = 0.00112 ETH. There is no list of prices in the contract, only that one line.

The first 8 Punks are the exception. Nobody exists before them, so they cost a flat 0.000069 ETH. From the second epoch on, the formula above is the whole story.

Where it goes. Every entry price stays in the contract until the owner calls withdraw(), which sends the balance to the treasury address. There is no rent to earlier Punks, no hook, no buyback and no token to buy back: what a Punk costs is the work behind it, and the price is the ticket.

The cheap band
504 Punks up to 0.00496 ETH

The first six epochs together. The price is flat inside an epoch, so a whole epoch is entered at one number — and these are pocket change. The work is what you pay.

The wall
#3 333

The last epoch would run to #4 088; the cap stops it at #3 333. After that mine() reverts with SoldOut whatever the hash.

Price by epochLive
Entry price now
ETH
reading…
Mined
Next price change
EpochPunksSizeBefore itPrice (ETH)
0#18800.000069
1#9241680.00016
2#255632240.00048
3#5712064560.00112
4#1212481281200.0024
5#2495042562480.00496
6#5051 0165125040.01008
7#1 0172 0401 0241 0160.02032
8#2 0413 3331 2932 0400.0408
punks before the epoch × 0.00002 = entry price

The identity the price rests on: the number of Punks that already exist, times one fixed step. Nothing is chosen per epoch; the table above is that one line evaluated nine times.

04Burn & PUNK points

The other exit:
burn it for points

A Punk burned in its own epoch credits 1 000 PUNK points to the address that burns it. Wait an epoch and it is 500; wait two and it is 250. Burning is final.

A Punk cannot be burned the minute it is mined. Two doors stand before the burn: at least one more Punk has to exist after yours, and 10 minutes have to pass since the mint. The contract answers both separately (burnQuote), so the Punk page can tell you which one you are waiting on.

Points are a number on-chain, next to your address. points[owner] goes up, the token goes away, Burned is emitted. The site shows the balance next to the wallet button. There is no ERC-20, nothing to trade and nothing to approve: PUNK points are an airdrop promise, not a token.

The supply stays 3 333 for ever. A burned id is never reissued and minted never goes down, so a burn does not make room for another mint. It makes the collection smaller.

The halving is per epoch, not per day. The clock is epoch() − punk.epoch: the epoch of the next mint, minus the one your Punk was mined in. On a quiet chain a Punk can sit in its own epoch for a long time at the full rate; a busy chain melts it faster.

Burn credit by epochs waited
1 000 · 500 · 250 · 125

Halves with every epoch waited, down to 1. Inside an epoch the rate does not move at all; it drops at the border.

WaitedPoints
own epoch1 000
1 epoch500
2 epochs250
3 epochs125
4 epochs62
5 epochs31
6 epochs15
7 epochs7
8 epochs3
Hold or burnInteractive
Paid to mint
0.000069ETH
Burn returns
1 000PUNK
its own epoch
Later Punks needed
1
one door: a later Punk exists

1 000 points if the burn lands in the same epoch the Punk was mined in, half of that for every epoch waited, never below 1. Points are credited to the burner's address on-chain and shown next to the wallet; the Punk is gone for good and its number is never reissued.

05The art

3 333 portraits,
drawn before the first hash

Browse Punks

Every Modern Punk is a 128 × 128 pixel portrait, pre-rendered and scaled 8× to 1 024 px with no smoothing. The set was fixed before deployment; mining decides who gets the next one, not what it looks like.

Sequential assignment. Token id, edition and artwork number are the same integer. The next Punk in line is yours — the hash does not pick the picture, and no amount of hashrate reaches past the queue. A farm cannot grind for a rare Punk; it can only be first to the next one.

Seven trait types. 7 layers per portrait, 81 values in all. Rarity is a share of the 3 333, known in advance and printed on every Punk page next to the trait.

Provenance. Every image has a SHA-256, and the SHA-256 of all 3 333 of them in order is the provenance hash below. The per-image hash is printed on the Punk's page; recompute it from the PNG and it matches, or the site is lying.

Served by this site. Images and metadata come from /api/image/[id] and /api/metadata/[id]; the contract's baseURI points here and the owner can move it. No IPFS yet — the provenance hash is what pins the set until then.

Modern Punk #1, the first portrait in the sequence
TraitValuesRarest
Background10Plum · 280
Equipment15Golden Scythe · 4
Skin6Cool Umber · 555
Clothes6Black Techwear · 555
Face6Silver Beard · 51
Eyes11Yellow Laser · 54
Head27Golden Helmet · 7
Provenance hashsha256 of 3 333 sha256s
d92e4bb0c1ae493f3fe9b0b3c3539e82090924019810fd2969ee09e9ff969209

Concatenate the SHA-256 of /punks/1.png through /punks/3 333.png as hex, in order, hash the string once more, and this is what you get.

06Contracts

The whole thing,
by address

One contract: the ERC-721, the mining rules, the price table, the burn and the points all live in PunkMiner. The site is told its address; everything else on this page it asked the chain for.

AddressesRobinhood Chain
  1. The collection: mining, the target, epochs, burning, PUNK points. An ERC-721 that mints to nothing but a hash below the target, paid at the entry price.

  2. 02 Treasuryreading…

    Where withdraw() sends the entry prices. Set once in the constructor; the contract holds the ETH until the owner calls it.

  3. 03 ChainRobinhood Chain · id 4 663

    RPC https://rpc.mainnet.chain.robinhood.com · explorer robinhoodchain.blockscout.com. Blocks every 100 ms; block numbers and hashes come from ArbSys.

Robinhood Chain (planned): its addresses will be listed here after that deployment. The rules are the same contract with a different block source (ArbSys), a 32-bit start and a 26-bit floor.
07Questions

Things people
ask first

10 answers about getting one, mining against a farm, and the art.

Getting one

Can I just buy one?
Not from the contract. There is no mint button and no fixed-price sale: mine() refuses anything that is not a hash below the target. Somebody who already mined one can sell it on any marketplace, like any ERC-721 — that is the only way a Punk changes hands without work.
What am I paying for, then?
The entry price is a ticket, not the product. The product is the work: about 2bits hashes, done by your machine. The ETH goes to the treasury when the owner withdraws it. Nothing is rented, nothing is bought back.
Why does the price go up?
Because it is the count of Punks that already exist, times 0.00002 ETH. Every epoch doubles the count, so every epoch doubles the price — 0.000069 for the first 8, then 0.00016, 0.00048, … up to 0.0408 ETH for the last 1 293.

The art

Can the art disappear?
The images are served by this site today, not by IPFS; if the site vanished, so would the pictures. What cannot vanish is the proof: the provenance hash and every per-image SHA-256 are published, and the contract owner can point baseURI at a new home. The tokens, the work hashes and the points live on-chain regardless.
What are PUNK points?
A number in the contract, per address, that goes up when you burn a Punk: 1 000 in its own epoch, halving per epoch waited. It is shown next to your wallet. It is an airdrop promise — not a token, not transferable, not tradable. Whatever it becomes, the count is already on-chain.

Mining against a farm

Does mining in a browser stand a chance?
At 26 bits, the epoch-0 floor, a browser needs about 67 million hashes — half a minute on one desktop; every epoch adds a bit and doubles that. A farm is faster, but the streak doubles the work for every recent mint and cools only 10 seconds a step, so a farm racing itself climbs into 16 extra bits within a minute; a browser arriving in the pause pays the base rate.
Can someone steal my solution?
No. Your address is the first 20 bytes of the preimage, so your nonce hashes to something else for anyone else. Copying the transaction from the mempool changes the sender and voids the hash.
Can a farm grind for a rare Punk?
No. Ids are sequential: the next mint gets the next number, whatever the hash looks like. The only thing extra hashrate buys is arriving first — and the streak charges for that.
Does a big holder mine cheaper?
No. The target depends on the epoch, the pace and the streak; not on what an address owns. The per-address streak only ever makes it harder for whoever just minted.
What happens when all 3 333 are mined?
mine() reverts with SoldOut for ever. Burning still works — the doors only need a later Punk and ten minutes — and points keep accruing; ids are never reissued, so the supply only shrinks from there.
Where to go from here

Real keccak256 in your browser, at the current target and the current price.

Mine a Punk

Every Punk mined so far, with the work behind each one.

Browse Punks

The one contract that holds the rules, the ids and the points.

Contract