$DOOM

DOOMon Solana

The whole 1993 game, byte for byte, written into 588 Solana transactions. No server holds it. Your browser pulls it off the ledger and runs it. Right here.

Contract
pump.fun

E1M1 is 588 transactions away

Reading root transaction0 / 588

              

The ledger didn't answer

Source
Transactions588
Bytes on chain2.24 MB
Hashnot verified

Arrows move · Ctrl fires · Space opens doors · Alt + arrows strafe · Enter picks · Esc menu

Not a link to DOOM. DOOM.

Most "on-chain" games store a URL. This stores the game. Every byte of the engine and the shareware levels sits inside the data field of a Solana transaction, forever, on every full node in the world.

4,096 bytes per transaction since Solana's v1 format went live on mainnet on September 15, 2026. Before that: 1,232. DOOM would have needed 1,850 transactions. Now it needs 588.
0.012 SOL total network fees to write the entire game. Storage in transaction data has no rent. It never expires.
0 servers between you and the game. The page asks an RPC node for the transactions, checks the SHA-256 against the root, inflates the gzip, and boots the WebAssembly. Even the boot script comes from the chain.
Verify it yourself in 20 lines
// node ≥ 20 — reads the root tx, then every chunk, and rebuilds doom.wasm.gz
const RPC = 'https://api.mainnet-beta.solana.com';
const ROOT = '2qQDvkVaxbF84o25N1gH1o87T19ZNiD6wbHKhQwYDQmBi9qoaCVMpcFL4ey7m3i9Xm9PcdE5HhFmeSxZusGevPsc';
const b58 = s => { const A='123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz'; let n=0n; for (const c of s) n=n*58n+BigInt(A.indexOf(c)); const out=[]; while(n>0n){out.push(Number(n&255n)); n>>=8n;} for (const c of s){ if(c!=='1')break; out.push(0);} return Uint8Array.from(out.reverse()); };
const tx = async sig => b58((await (await fetch(RPC,{method:'POST',headers:{'content-type':'application/json'},body:JSON.stringify({jsonrpc:'2.0',id:1,method:'getTransaction',params:[sig,{maxSupportedTransactionVersion:1}]})})).json()).result.transaction.message.instructions[0].data);
const root = JSON.parse(new TextDecoder().decode((await tx(ROOT)).subarray(5)));
const asset = root.assets.find(a => a.name === 'doom.wasm.gz');
const out = new Uint8Array(asset.size);
for (const pageSig of asset.pages) {
  const p = await tx(pageSig); const n = new DataView(p.buffer).getUint32(11, true);
  for (let k = 0; k < n; k++) {
    const sig = /* base58 of */ p.subarray(15 + k*64, 15 + (k+1)*64);
    const c = await tx(encodeBase58(sig)); const i = new DataView(c.buffer).getUint32(7, true);
    out.set(c.subarray(11), i * asset.chunkSize);
  }
}
// sha256(out) === asset.sha256  →  gunzip(out) is DOOM

Rip and tear. Then ape.

The game is the proof. The coin is the ticket. Three steps, no wallet drama.

  1. 1
    Get a Solana wallet. Phantom or Solflare, on phone or desktop. Fund it with SOL from any exchange.
  2. 2
    Copy the contract. Only from this page or the pinned post on X. Anything else is a fake.
  3. 3
    Swap SOL for $DOOM. Paste the contract into pump.fun or Jupiter, pick your size, confirm.
pump.fun