Docs · v1

How the ledger works

Genesis Run is a first-person maze through twelve blocks of crypto history, from the Bitcoin whitepaper in 2008 to spot bitcoin ETFs in 2024. The maze and its rules live in one contract, Ledger.sol. The website is a way to walk it and to send your route to that contract.

Overview

The maze

The grid was generated once with a seeded recursive backtracker (seed 713), which makes a perfect maze: every open cell is reachable and there is one path between any two of them. The contract stores the layout as four 256-bit words, one bit per cell, row by row. Cell c is at x = c % 31, y = c / 31. A copy is at maze.json with the start, exit, block cells and the shortest route.

Moves

ByteDirectionChange
0Upy − 1
1Rightx + 1
2Downy + 1
3Leftx − 1

The website appends a byte every time your position crosses into a new cell. A dead end costs two bytes per cell, one in and one out. The contract accepts at most 6,000 bytes.

Blocks

#YearBlockCellx,yStep on route
#002008The whitepaper406(3,13)22
#012009Block zero721(8,23)45
#022010Two pizzas843(6,27)67
#032012First halving726(13,23)90
#042014Mt. Gox796(21,25)112
#052015Ethereum511(15,16)135
#062016The DAO381(9,12)157
#072017Cartoon cats296(17,9)180
#082020DeFi summer114(21,3)202
#092021The $69M JPEG331(21,10)225
#102022FTX579(21,18)247
#112024Wall Street buys in678(27,21)270

The walls between two blocks are painted in the era of the block ahead of you: the PDF, a newspaper and a block hash, pizza boxes, coins cut in half, exchange error screens, diamonds, a forked wall, cartoon cats, a yield farm, gallery frames, hazard tape and exchange-floor marble.

The contract

function verify(bytes moves) pure returns (
  bool ok, uint256 steps, uint256 cleared, uint256 at, string reason)

function submit(bytes moves)          // reverts with the reason if rejected
function best(address) view returns (uint32)
function record() view returns (uint32)
function recordHolder() view returns (address)
function finishes() view returns (uint32)
function lastRuns() view returns (Run[])   // newest first, up to 50
function stations() pure returns (uint16[12])
function isWall(uint256 cell) pure returns (bool)

verify is free to call. It walks the bytes from the start cell and stops at the first problem. submit runs the same walk and, if it is clean, updates your personal best, the record and its holder, the finish count, and emits Cleared(runner, moves, personalBest, newRecord).

No owner, no setter, no upgrade path, nothing to withdraw. A 292-move run costs about 395,000 gas on first submission. Source: contracts/Ledger.sol, ABI: contracts/Ledger.abi.json.

Status: not deployed yet. Until it is, the website answers Ask the chain with a local copy of the same rules and says so.

Rejects

ReasonWhen
empty runZero bytes
over 6000 movesMore than 6,000 bytes
unknown move codeA byte other than 0–3
off the gridA step outside the board
into a wallA step into a wall cell
station out of orderA later block before an earlier one
stations missingFewer than twelve blocks confirmed
not at the exitAll twelve confirmed, but the last cell is not (29,29)

Hall

The Hall reads lastRuns(), record() and finishes() from Robinhood Chain through the public RPC. Runs you finish on this device are also kept in your browser so you can verify or submit them later.

Token

$GENESIS is an ordinary Pons coin on Robinhood Chain (chain ID 4663). It has no rights over the maze, the contract or the record.

Sources