A 1,296 by 784 pixel billboard divided into 3,969 owner-controlled 16x16 tiles, deployed 17 November 2016. One of the oldest NFTs on Ethereum and among the first to keep its artwork entirely on-chain.
Historical Significance
Written by Ken Erwin and launched on 17 November 2016, PixelMap predates EIP-721 by years and is generally counted the second oldest NFT after Cyrus Adkisson's Etheria of 2015. It is the original billboard-style NFT and one of the first contracts to store its image data directly on-chain rather than pointing at a server. Its influence runs further than the project itself: Ben Nolan found PixelMap through Gitter and built Fontus, an early metaverse, and Fontus and Nolan were later acquired by the company that went on to build Decentraland.
Context
Deployed 2016-11-17 by 0x4f4b7e7edf5ec41235624ce207a6ef352aca7050, taking its idea from Alex Tew's Million Dollar Homepage of 2005 but replacing the single webmaster with a contract. Only 30 to 40 tiles sold before the end of 2017. The website crashed in 2018 and was shut down that year, and between 2018 and 2021 almost every trace of the project vanished from the web while the tiles themselves sat untouched on-chain. On 22 August 2021 the NFT archaeologist Adam McBride traced the contract back to Ken Erwin, and the project was rediscovered. See the wrapper at 0x050dc61dFB867E0fE3Cf2948362b6c0F3fAF790b.
Key Facts
Description
PixelMap divides a 1,296 by 784 grid, 1,016,064 pixels in total, into 3,969 visible 16x16 tiles plus one that is not shown. Each tile sold for an initial 2 ether, worth roughly 20 dollars at the time. A tile record holds its owner, the image itself as a hex string, a URL, and a sale price, so both the artwork and the link live in contract storage rather than at an external location. An owner can redraw the image, repoint the URL, or set their own asking price at any time, with no operator in the middle, and every previous version stays on-chain. Reading tile zero today still returns its image data and the URL its owner set.
Source Verified
Historian Categories
Heuristic Analysis
The following characteristics were detected through bytecode analysis and may not be accurate.
Tangerine Whistle Era
Emergency fork to address DoS attacks. Repriced IO-heavy opcodes.
Bytecode Overview
Verified Source Available
Source verified on Etherscan.
Show source code (Solidity)
pragma solidity ^0.4.2;
contract PixelMap {
address creator;
struct Tile {
address owner;
string image;
string url;
uint price;
}
mapping (uint => Tile) public tiles;
event TileUpdated(uint location);
// Original Tile Owner
function PixelMap() {creator = msg.sender;}
// Get Tile information at X,Y position.
function getTile(uint location) returns (address, string, string, uint) {
return (tiles[location].owner,
tiles[location].image,
tiles[location].url,
tiles[location].price);
}
// Purchase an unclaimed Tile for 2 Eth.
function buyTile(uint location) payable {
if (location > 3969) {throw;}
uint price = tiles[location].price;
address owner;
// Make sure person doesn't already own tile.
if (tiles[location].owner == msg.sender) {
throw;
}
// If Unowned by the Bank, sell for 2Eth.
if (tiles[location].owner == 0x0) {
price = 2000000000000000000;
owner = creator;
}
else {
owner = tiles[location].owner;
}
// If the tile isn't for sale, don't sell it!
if (price == 0) {
throw;
}
// Pay for Tile.
if (msg.value != price) {
throw;
}
if (owner.send(price)) {
tiles[location].owner = msg.sender;
tiles[location].price = 0; // Set Price to 0.
TileUpdated(location);
}
else {throw;}
}
// Set an already owned Tile to whatever you'd like.
function setTile(uint location, string image, string url, uint price) {
if (tiles[location].owner != msg.sender) {throw;} // Pixel not owned by you!
else {
tiles[location].image = image;
tiles[location].url = url;
tiles[location].price = price;
TileUpdated(location);
}
}
}External Links
Wrapped as
Later contracts that represent this one. Holding one of these counts as holding the original on a collector card.