ID@agntn/puzzlesv0.30.0data a747 e6ab 583e
Every puzzle, one record.
Public crypto bounties and puzzles, each one a typed record: address, key material, prize, what happened on chain. One library behind the CLI, an MCP server and the Pi and OMP extensions, with live balances from the explorers.
- Records
- 558
- in 51 collections
- Unclaimed
- 909.96 BTC
- + 12.66 ETH · 3.03 LTC · 1500.19 AR
- Open
- 113 / 558
- 20.25% of the records
$ pnpm add @agntn/puzzlesbits/1
A Bitcoin P2PKH address. The private key is a 1-bit number.
- Prize
- 0.001BTC
- Key
- 2^0 … 2^1 − 1
- Address
- 1BgGZ9tc…26SAMH
- Verify
- verified
On chain
Data as code, one file per puzzle
There's no JSON to edit and no build step that generates data. Each puzzle is a TypeScript file with one literal in it, and the type checker reads it before any test does. The panel walks through 55 records from every collection, key material included, the way they sit on disk.
- A record is a PuzzleSpec literal handed to puzzle(), with its chain as a field
- Keys and transactions come from builders, so an absent field is absent, never null
- Status is written down, not derived. A claim transaction plus a published key still means solved
Record
import { compressed, hex, puzzle, Status } from "@agntn/puzzles";export const bitsPuzzle1 = puzzle({ id: "bits/1" , chain: "bitcoin", address: "1BgGZ9tcN4…26SAMH", sourceUrl: "https://bitcointalk.org/index.php?topic=521…" , startedAt: "2013-01-09 11:59:15", status: Status.Solved, prize: 0.001, pubkey: compressed("0279be667e…f81798"), key: hex("0000000000…000001", 1).wif("KwDiBf89Qg…VHnoWn") , transactions: [ /* 4 recorded */ ] ,});A key that derives its address, or a plain no
A published key is a claim, so the library checks it: derive the address, compare. The data gate runs the same check on every record, so a wrong hex digit fails the build instead of shipping. Here it runs on the current sample with the code the CLI ships.
- verify() reads the one secret a record exposes: hex, WIF, BIP38 payload, seed phrase or mini key
- A solved puzzle with its key published derives the stored address, in your browser, secp256k1 and all
- No key, an encrypted key, a mini key: unavailable is a verdict, not an exception
verified
bitcoin / p2pkhsecretOf(puzzle.keyData()){ kind: "hex" }a raw private key, verification derives the address from it
puzzle.hasPubkey()truecompressed 0279be667ef9dc…5b16f81798
await verify(puzzle){ verified: true }derivedAddress 1BgGZ9tcN4…SZ26SAMH equals the stored one
A manifest of keys, records on first use
Importing the package evaluates no puzzle records. Each registry key has its own lazy import(), so a bundler splits each collection into its own chunk. Only ever ask about bits? The other collections stay unloaded. This panel shows the walk loading one collection at a time.
- collectionKeys() and hasCollection() answer from the manifest without loading anything
- get('bits/71') imports the bits module and nothing else; all() loads every collection once
- registerCollection({ key, load }) adds yours, lazily too, and the aggregate views refresh
Manifest
- 80-bit
- 9vw04
- ballet
- bitaddress
- bitaps
- bitimage
- bits
- book-quiz
- brave-new-world
- coin-artist
- coin-games
- crypto-puzzles
- doges-gambit
- dug
- genesis
- great-riddle
- grycoin
- gsmg
- hash-collision
- hunting-time
- iamabananaamaa
- ledger-donjon
- liberte-guidant-le-peuple
- luckylurker
- mineshop
- mini
- move-over-brokers
- movie-enigma
- natasha-otomoski
- path-to-greatness
- phy
- picture-puzzle
- powerful-moss
- proof-of-writing
- quizchain
- quizchain2
- real-big-block
- rushwallet
- satoshi-birthday-quiz
- satoshi-maze
- school-of-bitcoin
- seed-phrase
- smith-lyle-moore
- teikhos
- trivia-brainwallet
- walking-banks
- warp
- wealth-in-poetry
- weave
- wickex
- zden
51 collections, 9 chains, one page per puzzle
Each collection is a class with an author and its puzzle list, published on its own entry. Every puzzle has a page with its record, its transactions, its key material and its live balance. The numbers here come from the library at build time.
Import@agntn/puzzles/collections/<key>
| About | Unclaimed | |||
|---|---|---|---|---|
| kTimesG's 80-bit key challenge | 80-bit | 80 unknown bits in a 511-bit key. The public key only ever showed up in the mempool. Taken 39 minutes in. | closed | none |
| Gem Finder's 9vw04 puzzle | 9vw04 | One tweet, five characters and a grid of letters and digits in five colours. Everything for the WIF is in the post, the author says. Rainbows, not so much. | open | 0.0202076 BTC |
| Ballet wallets | ballet | Three BIP38 encrypted keys printed on physical wallets. | 2 of 3 open | 2.00007358 BTC |
| Brute force and the coins are yours | bitaddress | A paper wallet whose owner forgot the BIP38 passphrase and gave the coins to whoever guesses it. Probably three old passwords glued together. Good luck, q didn't have any. | open | 0.005297 BTC |
| Bitaps mnemonic challenge | bitaps | A 3 of 5 secret sharing scheme with two shares published. | open | 1.00016775 BTC |
| Bitimage | bitimage | Seeds hashed out of photographs. One solved, one waits on a passphrase. | 1 of 2 open | 0.010019 BTC |
| Bitcoin puzzle transaction | bits | 256 addresses with keys of 1 to 256 bits. The one everybody scans. | 77 of 256 open | 903.01685753 BTC |
| 7 million book quiz | book-quiz | Seven questions about a campaign book, one hour to sweep it. The deadline won and the author took the prize back. | closed | none |
| Brave New World | brave-new-world | All of 2020 in one collage, runes included. Find the seed phrase, says the picture. Six years on, the 0.2 BTC is still there. | open | 0.20107284 BTC |
| TORCHED H34R7S Bitcoin Puzzle | coin-artist | TORCHED H34R7S. A Bitcoin key painted into flames and decoded in 2018. | closed | none |
| Coin_Games weekly banknote puzzles | coin-games | Banknotes stuffed with skulls, lions and statues, a few thousand sats each. Every prize emptied by somebody who never said how. | 0 of 3 open | none |
| Crypto Puzzles on YouTube | crypto-puzzles | Two pairs of short videos with a raw Ether key in the footage. The first was gone within seven hours of its part 2. The second has sat on 0.05 ETH since 2018. | 1 of 2 open | 0.05 ETH |
| Doge's Gambit | doges-gambit | A chess board with coins for pieces, sixteen frames and two keys in one clip. The 10,000 DOGE went from about $50 to a few thousand dollars while nobody could read it. | 0 of 2 open | none |
| Dug's Student Treasure Hunt | dug | Twelve lecture words, three Bitcoin prizes. A better reason to take notes. | 0 of 3 open | none |
| Genesis Block Wallet Puzzle | genesis | Two keys hidden in Genesis block data, and the PBKDF2 rounds hidden in its timestamp. Solved. | closed | none |
| The Great Riddle | great-riddle | A seed of 24 words hidden one by one in the original ballpoint drawings of the Genesis Collection. Prints carry nothing, and the 25th word comes from the artist. | open | 0.00423871 BTC |
| Grycoin chain | grycoin | Quizchain under a new name, and over within a week. Block 1 was claimed before its post went up, block 2 with a solution its own author admits not knowing. | 0 of 2 open | none |
| GSMG.io puzzle | gsmg | A multi phase image puzzle. The prize has been halved twice. | open | 1.25649674 BTC |
| Hash collision bounties | hash-collision | Peter Todd's P2SH scripts that pay for a collision. SHA-1 fell in 2017. | 4 of 6 open | 0.59364885 BTC |
| Hunting Time seed phrase hunt | hunting-time | A seed phrase hidden in a thriller. Most words were times in the plot, and the title was the biggest clue. Claimed in seven weeks. | closed | none |
| IAMABananaAMAA's puzzles | iamabananaamaa | Two puzzles from the first night of r/bitcoinpuzzles. A ZIP after the last byte of a GIF, then a Caesar riddle whose key needed no shift at all. | 0 of 2 open | none |
| Ledger Donjon CTF | ledger-donjon | Scissors Secret Sharing. Twelve BIP39 words, ten out of order. CTF points, not a BTC prize. | closed | none |
| La Liberté guidant le peuple 2019 | liberte-guidant-le-peuple | Delacroix repainted with yellow vests on a wall in Paris. Half the seed hides in coloured strokes, half glows under black light, all of it in French. Claimed six days in. | closed | none |
| LuckyLurker Bitcoin Vault puzzles | luckylurker | Paul Jones’s two Bitcoin Vaults. The first solved, the second funded with 1 BTC. | 1 of 2 open | 1 BTC |
| The 10 ETH challenge | mineshop | Six seed words in a video, six in the blog post it links to. The author still spends from the wallet. | open | 8.61254155426562 ETH |
| RetiredCoder's mini-puzzles | mini | Seven small riddles on Bitcointalk. Four replay a solved puzzle key for the Bitcoin Cash still on its address, three put 0.01 BTC on a fresh key. | 0 of 7 open | none |
| Move Over Brokers treasure hunt | move-over-brokers | Twelve keys hidden in a blockchain book and its Italian translation. One answer is Sherlock Holmes's address, another is printed only on the back cover. | 3 of 12 open | 0.006 BTC |
| Bitcoin Movie Enigma | movie-enigma | 34 film stills, one BIP39 word each, ten intruders. Solved in 2026 with a phrase whose checksum fails. | closed | none |
| Natasha Otomoski puzzle, 1 BTC | natasha-otomoski | One question, 32 characters of plain text as the private key. Someone typed the right eight words seven months later and never said how. | closed | none |
| Path to Greatness | path-to-greatness | Clues hidden in a parkour game demo lead to a Litecoin key. Donations go straight into the prize, and nobody has taken it. | open | 3.02608794 LTC |
| kTimesG's Phy Challenge | phy | A signed forum post, a signature the author's cat cut one character short, and grey emojis spiralling around a gold coin. The signature gives up the address. The key behind it, and 800,000 sats, nobody has found yet. | open | 0.008 BTC |
| 1 mBTC picture puzzle | picture-puzzle | A directory, an eye, the letter O and a QR code: a page on directory.io and the 36th key down. Claimed five hours in. | closed | none |
| Powerful Moss | powerful-moss | Twelve songs on Donkey Kong Country 2 soundfonts and a twelve-word seed somewhere in them. The prize sat in a contract on Base that opened only for the wallet the seed derives, until somebody opened it in October 2026. | closed | none |
| Building an awesome eCash community | proof-of-writing | An essay on what makes a crypto community, with a Cashtab seed on its diagonal: word one of one paragraph, word two of the next. 30 million XEC by the time it fell. | closed | none |
| Quizchain | quizchain | A quiz answer plus a piece of the previous block's key, hashed into a wallet. The chain ran from April to July 2019, one block at a time. | 0 of 77 open | none |
| Quizchain2 | quizchain2 | The quizchain's second run, from May 2019. Most blocks stand alone now, an answer and a TOMI field hashed with MD5, and by block 6 the thread is arguing about scripts versus humans. | 0 of 77 open | none |
| Quizchain Real Big Block | real-big-block | 777 mBTC for the final version of a Wattpad chapter, line breaks and all. The author once rated the odds below humanity passing the reverse Turing test, and so far that holds. | open | 0.777 BTC |
| RushWallet contest | rushwallet | Thirty brainwallets from 2014. Almost all cracked since. | 1 of 30 open | none |
| Satoshi birthday 7 million quiz | satoshi-birthday-quiz | Seven questions about Bitcoin history, hashed into a brainwallet. Swept five hours after it was funded. | closed | none |
| Satoshi-Maze, Phemex 2.1 BTC puzzle | satoshi-maze | Satoshi drawn as a maze by an exchange. Nobody beat the deadline, so the designer published the key: a prime from e times two Base58 words read little endian. | closed | none |
| School of Bitcoin business card | school-of-bitcoin | A million sats behind a business card, shown once the account hit 2000 followers. Morse, Wingdings and three QR codes on one side, and the coins haven't moved since October 2024. | open | 0.01 BTC |
| seed-phrase.com | seed-phrase | Clues every few days toward a recovery phrase: a poem, a JAZZ crowd, a nauseous emoji and a box that changes colour with the video speed. Then August 2024 ended and so did the clues. The 0.01 BTC is still waiting. | open | 0.01 BTC |
| Smith, Lyle & Moore treasure hunts | smith-lyle-moore | An indie band spent its ad budget on bitcoin and hid it behind riddles on its own website. The moon trip ended in Morse and a password called supernova. The sea voyage ended with a failed checksum. | 0 of 2 open | none |
| TeikhosBounty | teikhos | Five Ethereum contracts that want a public key nobody published. Four can pay, and one did in 2026, with a key a failed attempt left on chain four years earlier. | 4 of 5 open | 3.000018104 ETH |
| Brainwallet puzzle, 0.04 BTC | trivia-brainwallet | Twelve riddles from patents to chess to a ham deal, typed into brainwallet.io as a passphrase and a salt. Swept six hours after the post. | closed | none |
| Walking Banks seed hunt | walking-banks | A thriller whose murder victims carry a seed phrase in their DNA, and a real one hidden in the book. Four words decode on page 122. The other twenty, and 800,000 sats, are still out there. | 2 of 2 open | 0.008 BTC |
| WarpWallet challenges | warp | Keybase's scrypt brainwallet. Four solved, two expired with the keys published. | 0 of 6 open | none |
| Securing Wealth in Poetry | wealth-in-poetry | An essay on hiding seed phrases in stories, with a real one hidden in the essay. You've read every word, it says. The 0.03 BTC is still there. | open | 0.0312463 BTC |
| Puzzle Weave | weave | Tiamat's weave puzzles. Prizes in AR and ETH. Four still open. | 3 of 12 open | 1500.188092936237 AR, 1 ETH |
| Wickex's YouTube puzzle | wickex | Hex that spells a YouTube link, Morse in the audio, a passphrase in a spectrogram. Swept 46 minutes in, sent back, swept again. | closed | none |
| Zden's puzzles | zden | Fifteen visual puzzles on four chains, most of them solved. | 1 of 16 open | 0.003125 BTC |
Every author, every fact with its page
Who funded a puzzle says something about how it was built. So every collection's author is a record, not a name and a link, and getAuthor(key) answers with it. The card follows the walk: it shows whoever published the puzzle on screen.
- A key, a kind, aliases, the channels they publish through and the addresses they fund from
- facts are sentences a public page states, with that page as source and a date where it has one
- Pseudonyms stay pseudonyms: klems and Tiamat are the handle and what they signed with it
Fifteen tools, three hosts, one executor each
puzzles mcp serves the tools over stdio, the Pi and OMP extensions render them in the terminal. All three call the same functions, so they answer identically and a fix lands once. Only puzzles_balance, puzzles_watch and puzzles_eligibility reach out to a block explorer, and they say so in their annotations.
- puzzles_stats, puzzles_collections, puzzles_authors, puzzles_author, puzzles_show, puzzles_hints, puzzles_stages, puzzles_list, puzzles_verify, puzzles_balance, puzzles_watch, puzzles_eligibility
- The text carries the whole record: address, status, prize, key material, transactions, explorer links
- Limits live in one facts table and the executors enforce them, so a host that skips schema validation hits the same wall
1
bitcoin / p2pkh solved
- Prize
- 0.001 BTC
- Address
- 1BgGZ9tcN4…SZ26SAMH
- Public key
- published
- On chain
- 4 tx · since 2013-01-09
Extend Collection, register a loader
A collection outside the package is the same shape as one inside it: a class extending NamedCollection or NumericCollection with its puzzle list. Register a loader and the registry treats it like a built-in, including the part where nothing loads until someone asks.
- A static key, an author from party(), and puzzles built with the same factories
- registerCollection({ key, load }) keeps yours lazy; registerCollection(instance) is fine too
- get, all, stats and the tools see it on the next call, and the same instance twice is a no-op
import { NamedCollection, party } from "@agntn/puzzles";import { minePuzzleFirst } from "./mine/first";export class MineCollection extends NamedCollection { static readonly key = "mine"; constructor() { super(MineCollection.key, party("you"), [minePuzzleFirst]); }}export const mine = new MineCollection();main.ts
import { registerCollection } from "@agntn/puzzles";registerCollection({ key: "mine", load: () => import("./mine").then((m) => m.mine),});Start with one command
One install gives you the library, the puzzles CLI and the MCP server. Look a puzzle up by its id and read the record.
- PinPre-1.0, so pin exact versions.
- DataPublic puzzles only. Every key here was public before it got here.
- BalanceWhat the explorer said five minutes ago at most.
First lookup
$ pnpm add @agntn/puzzlesimport { get } from "@agntn/puzzles";const puzzle = await get("bits/71");puzzle.status(); // "unsolved"puzzle.address().value; // "1PWo3JeB9j…Ras7fsVzXU"$ pnpm exec puzzles show bits/71