14 October 2026
Reconstructing nine years of the CryptoPunks floor from contract events
CryptoPunks launched in June 2017, before the ERC-721 standard existed. Instead of relying on outside marketplaces, its contract ships with a marketplace of its own: owners list punks, buyers buy them, and every step is an event on Ethereum. That makes the floor, the cheapest punk anyone can buy, something you can read straight from the chain.
Most people get the floor from an aggregator. That works for today's number. The history is harder: CoinGecko's NFT floor history sits behind a paid plan, and Reservoir, the free alternative, has shut down. So we rebuilt the whole series from the contract itself: every day from 23 June 2017 to today, with no gaps, free to download.

Why we needed it
We track PunkStrategy (PNKSTR), a token whose treasury buys punks. Its premium is its market cap divided by what the treasury holds, and the treasury is valued at the floor. Any error in the floor goes straight into the premium.
Our first version estimated the historical floor from its correlation with the ETH price. Checked against the chain, that estimate was about 10% off on an average day and 33% off on the worst one. On 6 October 2025 it put PNKSTR's premium at about 66x. With the real floor, it was 45.5x.
The contract is the order book
Four events carry everything we need:
PunkOffered(punkIndex, minValue, toAddress): a punk is listed at a price, optionally for one buyer only.PunkNoLongerForSale(punkIndex): the listing is withdrawn.PunkBought(punkIndex, value, from, to): the punk is sold.PunkTransfer(from, to, punkIndex): the punk moves to another wallet.
We replay all of them since the contract's first block (3,914,495), about 240,000 events, in block and log order. The rules are simple:
- A listing stands until the next event for the same punk. A new listing replaces it; a withdrawal, sale or transfer ends it. That is exactly what the contract does.
- The floor for a day is the lowest listing still open at 23:59:59 UTC.
- Listings reserved for one buyer don't count. If
toAddressis set, only that wallet can buy, so it is not a price the market can take. Listings at a price of zero are ignored too.
One trap worth knowing if you try this yourself with Etherscan's log API: it returns log
index 0 as "0x", which parses as NaN. Sort by it and events within a block quietly come out
in the wrong order.
Checking it
A reconstruction is only worth something if it can be checked, so we checked it three ways.
- Against contract state. The contract stores every open listing in
punksOfferedForSale. On a given day you can read that for all 10,000 punks at the last block of the day from an archive node and take the lowest public, non-zero price. That is the floor by definition, with no replay involved. Our verification script does this and is public. - Against today's market. On 14 October 2026 our floor was 31.29 ETH, punk #5098, with 1,152 open listings: the same floor CoinGecko showed.
- Against a second implementation. The same rules written in SQL on Dune, reading raw
ethereum.logswith no decoded tables, return every day from 2017 to 23 September 2026 (3,380 days) with zero differences from ours.
What it turned up
cryptopunks.app, the collection's official site, also shows a daily floor. On most days the two series match. Where they differ, we read the contract directly on 24 days. It agreed with us on all 24.
- A flat 59 ETH for ten months. Their chart shows exactly 59 ETH every day from 18 June 2022 to 6 April 2023. Over those 293 days the cheapest punk actually listed was above 59 ETH on 291 of them, reaching 83.72 ETH.
- Private listings counted as the floor. From 12 to 14 July 2021 their chart reads 6.9 ETH. That listing was reserved for one buyer; the cheapest punk anyone could buy was 19 ETH.
- Public listings missing. Punk #3190 was listed at 28.5 ETH from 26 to 28 August 2024 and does not appear in their series.
We sent these to the team behind cryptopunks.app on 25 September 2026, before publishing this.
The second correction is our own: the PNKSTR premium described above, 45.5x on 6 October 2025 rather than about 66x.
Limits
- Only the contract's own marketplace counts. Wrapped punks traded on other marketplaces are not included.
- A floor is an asking price, not a sale price.
- One number per day, taken at the end of the UTC day. Intraday moves are not captured.
Get the data
The series is free under CC BY 4.0 and updates every day.
- Chart, table and downloads: punkprice.com/data
- CSV and JSON, no key needed: floor-history.csv and floor-history.json
- GitHub, with the verification script and the SQL: punkprice-data/cryptopunks-floor
- Kaggle: CryptoPunks daily floor price
- Dune: CryptoPunks floor, every day since 2017
- Full method: punkprice.com/about
The PNKSTR premium series is published the same way at punkprice.com/premium.
If you use it, cite it as: PunkPrice (2026). CryptoPunks daily floor price, reconstructed from the CryptoPunks marketplace contract. https://punkprice.com/data