@agntn/puzzles

中文文档
0.31.0发布于 2026/10/29MITTypeScriptES Module构建来源已验证近 30 天下载 2143

Crypto bounties, puzzles and challenges as class-owned data for agents

原始使用文档
文档目录13 节
  1. Why?
  2. ✨ Features
  3. 📦 Install
  4. 🚀 First call
  5. Commands
  6. 🧠 Library
  7. 🗺️ Collections
  8. 🤖 Agents
  9. 🚫 What this does not do
  10. 🧩 Adding a puzzle
  11. 🛠️ Development
  12. 💛 Thanks
  13. 📄 License

@agntn/puzzles

npm version npm downloads license Ask DeepWiki

Public crypto puzzles and bounties, as typed records. You ask for a puzzle, you get its address, its key material and what happened on chain.

Why?

Every puzzle thread has the same three things: the addresses, the prizes, and who solved what. Every scanner and tracker re-types them from the thread, slightly differently each time. So they live here once, as code. A puzzle is a TypeScript record. The type checker reads it before a test does. The CLI, the MCP server and the Pi and OMP extensions read one registry.

Docs, one page per puzzle and a live playground: puzzles.agntn.dev.

[!WARNING] Pre-1.0. The API, the CLI flags and the data model can still move. Pin an exact version if you build on it.

✨ Features

  • 🧾 Data as code. One PuzzleSpec literal per puzzle, built by one puzzle() factory for every chain. No JSON, no build step.
  • 🕳️ Absent means absent. A puzzle without a solver or a prize has no such key. Nothing serializes as null.
  • 🔑 Key material in every shape. Hex, WIF, a BIP38 payload, a seed phrase, secret shares, a sealed Arweave keyfile, or just a bit width. Every key of a multisig, too. One builder.
  • 💤 Lazy registry. Importing the package loads no records. get("bits/71") imports one collection module.
  • ✅ Verification is a value. A published key derives the address or it doesn't. Nothing throws for a bad record.
  • 💰 Live balances. puzzle.balance() through @agntn/explorers. Base units as bigint, API keys redacted from errors.
  • 👀 A watch on the record. puzzles watch lists the deposits and spends a record misses, a prize that moved, a public key a spend gave away, a source page that changed. It never edits a record. You do.
  • 📋 A checklist before the weekend. puzzles eligibility gathers the source, the address, lifetime totals from the explorer, the status with its evidence and what counts as a solution. Whatever nobody can fill comes back as a missing row, never a guess.
  • 🖼️ The puzzle itself, not a link to it. puzzles_assets hands a model the image, the stage files and the archived posts behind the hints, checked against the SHA-256 the record pins. Links rot. These don't.
  • 🤖 Fifteen agent tools. One executor behind MCP, Pi and OMP. Same answer everywhere.
  • 🌐 Runs anywhere. Neutral ESM on the Fetch API. Node, browsers, edge workers.

📦 Install

pnpm add @agntn/puzzles

Node.js 26 or newer for the CLI.

🚀 First call

npx @agntn/puzzles stats

That prints the total, one count per status and how many puzzles have a known public key. No key, no config, no network. The records ship inside the package. The bare puzzles below is pnpm exec puzzles after a local pnpm add, or just puzzles after pnpm add -g @agntn/puzzles.

puzzles show hash-collision/sha256
hash-collision/sha256	unsolved	0.27734251 BTC	35Snmmy3uhaer2gTboc81ayCip4m9DT4ko
chain: bitcoin  address kind: p2sh
hash160: 292fb39df7cd619a396069383928e6bfb74ebec5
redeem script: 6e879169a87ca887 (hash 292fb39df7cd619a396069383928e6bfb74ebec5)
public key: unknown
private key: unknown
started: 2013-09-13 05:59:09
transactions: 1
    funding	2013-09-13 05:59:09	0.1 BTC	397f12ee15f8a3d2ab25c0f6bb7d3c64d2038ca056af10dd8251b98ae0f076b0
explorer: https://blockstream.info/address/35Snmmy3uhaer2gTboc81ayCip4m9DT4ko
source: https://bitcointalk.org/index.php?topic=293382.0

Commands

CommandWhat it prints
puzzles statsTotals, status counts, prize sums and the data version
puzzles collectionsOne row per collection: key, counts, author
puzzles authors [key]One row per author, or one author's record with its sourced facts
puzzles author <key>One author's record, straight from the puzzles_author tool
puzzles solvers [key]One row per named solver, or one solver's record: every solve, profiles and sourced facts
puzzles solver <key>One solver's record, straight from the puzzles_solver tool
puzzles show <id>One puzzle's record: key material, transactions, hints and links. --json for the data
puzzles hints <id>The collection's hints, the puzzle's own, then its hint files. --json for both
puzzles stages <id>The stages of a multi-stage puzzle with their pages, files and published answers. --json for the list
puzzles assets <id>The files a puzzle ships with SHA-256 and size, and the archived pages it cites. --read <path> writes one, --check/--live verify
puzzles list [collection]One puzzle per line. --address, --chain, --status, --technique and --with-pubkey narrow it, --limit and --offset page it
puzzles verify [id]A published key and its recipe against the address. --all or the list filters for a set, exit 1 on a mismatch
puzzles balance [id]The live balance. The list filters check a whole set, one row each. --api-key, or one variable per chain
puzzles watch [id]What the chain knows and the record doesn't. --since checks the source pages too, exit 1 on any finding
puzzles eligibility <query>The checklist before working on a prize, by id or address. Exit 1 while any field is missing
puzzles exportThe whole dataset with its data_version
puzzles mcpThe MCP server over stdio

--json prints the data behind the text, bigint as strings and absent fields left out. The commands come from the same tool definitions the agents get, so a typo in a flag fails here just like it fails for a model. The flags and exit codes are in the CLI guide.

🧠 Library

import { get, stats, verify } from "@agntn/puzzles";
import { bits } from "@agntn/puzzles/collections/bits";

const puzzle = await get("bits/71"); // loads the bits collection, nothing else
puzzle?.address().value; // "1PWo3JeB9jrGwfHDNpdGK54CRas7fsVzXU"
puzzle?.keyRange(); // [2n ** 70n, 2n ** 71n - 1n]

(await verify(bits.require(1))).verified; // true, key 1 derives its address
(await stats()).unsolved; // how many are still waiting for a key
(await bits.require(71).balance()).totalUnits(); // 7.10190014 when I ran it, mempool.space decides

That's most of it, really. A collection is its own entry and everything on it is synchronous. The views that span collections await a load. Errors descend from PuzzlesError, balances have their own family under BalanceError. The rest is in the guides: records, registry, lookups, verification, balances.

🗺️ Collections

KeyChainsWhat it is
bitsbitcoinKeys of 1 to 256 bits, one address each
quizchainbitcoinQuiz blocks chained by their keys
quizchain2bitcoinQuizchain's second run, from May 2019
rushwalletbitcoinBrainwallets from a 2014 contest
zdenbitcoin, ethereum, litecoin, decredZden's visual puzzles
weavearweave, ethereumTiamat's Puzzle Weave series
move-over-brokersbitcoinTwelve keys hidden in a blockchain book
minibitcoin, bitcoincashRetiredCoder's seven mini-puzzles
warpbitcoinKeybase's scrypt brainwallet challenges
hash-collisionbitcoinPeter Todd's P2SH collision bounties
teikhosethereumContracts that pay for a public key
balletbitcoinBIP38 keys printed on physical wallets
dugbitcoin2025 student seed hunt
coin-gamesbitcoinBanknotes with a skull, a lion and Venus
bitimagebitcoinSeeds hashed from photographs
luckylurkerbitcoinTwo Bitcoin Vault seed challenges
iamabananaamaabitcoinA ZIP in a GIF, then a fake Caesar
doges-gambitethereum, dogecoinTwo keys read off one chess board video
crypto-puzzlesethereumRaw Ether keys hidden in short videos
walking-banksbitcoinA seed hidden in a Bitcoin thriller novel
grycoinbitcoinQuizchain renamed, days before the shutdown
smith-lyle-moorebitcoinA band's two hunts, one per single
real-big-blockbitcoin777 mBTC for a Wattpad chapter, unclaimed
school-of-bitcoinbitcoinA business card with 1M sats on the back
liberte-guidant-le-peuplebitcoinDelacroix in yellow vests, seed in French
hunting-timebitcoinSeed words disguised as times in a novel
bitapsbitcoinA 3 of 5 secret sharing scheme
gsmgbitcoinA multi phase image puzzle
movie-enigmabitcoinFilm titles as seed words, solved 2026
ledger-donjonbitcoinScissors Secret Sharing from the CTF
coin-artistbitcoinTORCHED H34R7S painting
genesisbitcoinGenesis block OP_RETURN puzzle
mineshopethereumA seed split between a video and a post
satoshi-birthday-quizbitcoinSeven quiz answers hashed into a wallet
book-quizbitcoinA book quiz nobody won in time
80-bitbitcoin80 hidden bits and a mempool race
wickexbitcoinHex, Morse and a spectrogram passphrase
picture-puzzlebitcoinFour pictures that spell a key database
brave-new-worldbitcoinA seed phrase hidden in a 2020 collage
wealth-in-poetrybitcoinSeed words hidden in a 2019 Medium essay
path-to-greatnesslitecoinClues from a game demo, a Litecoin key
proof-of-writingecashA Cashtab seed on an essay's diagonal
bitaddressbitcoinA BIP38 wallet with a forgotten passphrase
powerful-mossbaseA seed in an album, the prize in a contract
trivia-brainwalletbitcoinTwelve trivia riddles salted into scrypt
great-riddlebitcoinSeed words hidden in ballpoint pen drawings
satoshi-mazebitcoinA prime from e times two Base58 words
natasha-otomoskibitcoinEight camel case words as raw key bytes
phybitcoinA signed post and a spiral of grey emojis
seed-phrasebitcoinDated clues, then two years of silence
9vw04bitcoinA WIF in one tweet, rainbows not included

Identifiers are collection/name. A singleton, such as gsmg, genesis or 80-bit, is just the key. Each collection has a page with the story, the quirks and every puzzle: puzzles.agntn.dev/collections.

🤖 Agents

claude mcp add puzzles --scope user -- npx -y @agntn/puzzles mcp
claude mcp add --transport http puzzles https://puzzles.agntn.dev/mcp # nothing to install
pi install npm:@agntn/puzzles
{
  "mcpServers": {
    "puzzles": { "command": "npx", "args": ["-y", "@agntn/puzzles", "mcp"] }
  }
}

Fifteen tools: puzzles_stats, puzzles_collections, puzzles_authors, puzzles_author, puzzles_solvers, puzzles_solver, puzzles_show, puzzles_hints, puzzles_stages, puzzles_assets, puzzles_list, puzzles_verify, puzzles_balance, puzzles_watch and puzzles_eligibility. The last three leave the process, and so does puzzles_assets when it reads a file. Their annotations say so. What the text carries and where the limits live: the agents guide.

🚫 What this does not do

It doesn't solve anything. No scanner, no kangaroo, no brainwallet cracker, and no guessing a status from a transaction list. solved, swept, claimed and expired are written down by hand, because a claim transaction plus a published key still means solved. Chain facts come from @agntn/chains, key derivation from @agntn/keys and balances from @agntn/explorers. This package doesn't reimplement any of them.

🧩 Adding a puzzle

One record file under src/collections/<key>/ and one line in the collection module. Then pnpm test runs the data gate: unique ids, address and txid formats, key derivation, BIP38 payloads, asset paths and their SHA-256, no nulls. The shape of a record is in Puzzle records and the rules in CONTRIBUTING.md.

🛠️ Development

pnpm install      # the library and the docs site, one lockfile
pnpm lint         # vp lint and vp fmt, docs included
pnpm typecheck    # builds first, then checks src, Pi and OMP
pnpm test         # unit tests and the data gate
pnpm test:packed  # packs the tarball and runs every published entry without src/
pnpm run docs     # the Docus site on localhost

One install covers the site too. No second trip into docs/, no second lockfile quietly drifting away from the first. And the run in that last line isn't decoration. pnpm 12 has a docs command of its own, and it wants a package name, not our site.

💛 Thanks

This package exists thanks to the open source programs at Anthropic and OpenAI: Claude for Open Source and Codex for Open Source.

📄 License

MIT

版本与发布记录

@agntn/puzzles 共发布 27 个版本,首次发布于 2026/09/18;过去 12 个月发布了 27 个版本。最新版本附带 npm provenance 构建来源证明,可追溯到公开的 CI 构建记录。

版本发布日期距今
0.31.0latest2026/10/299 天前
0.30.02026/10/1424 天前
0.29.02026/10/071 个月前
0.28.42026/10/071 个月前
0.28.32026/10/061 个月前
0.28.22026/10/051 个月前

关于 @agntn/puzzles 的常见问题

@agntn/puzzles 是什么?

Crypto bounties, puzzles and challenges as class-owned data for agents

如何安装 @agntn/puzzles?

在项目目录运行 npm install @agntn/puzzles,或使用 pnpm add / yarn add / bun add。它还提供命令行工具 puzzles,可以用 npx puzzles 直接运行。

@agntn/puzzles 支持 TypeScript 吗?

支持。包内自带 TypeScript 类型声明(package.json 声明了 types 入口),安装后即可获得类型提示,无需再安装 @types 包。

@agntn/puzzles 支持 ESM 还是 CommonJS?

以 ES Module 形式发布,推荐使用 import 引入。在 CommonJS 项目中,Node.js 20.19+ / 22.12+ 可以直接 require() 不含顶层 await 的 ES Module,更早的版本需要改用动态 import()。

@agntn/puzzles 需要什么版本的 Node.js?

package.json 的 engines 字段要求 Node.js >=26。版本不符时 npm 默认只给出警告,开启 engine-strict 后会拒绝安装。

@agntn/puzzles 可以商用吗?

@agntn/puzzles 使用 MIT 许可。宽松许可:允许商业使用、修改和再分发,通常只需在分发时保留原版权与许可声明。以上为概括,不构成法律意见,请以许可原文为准。

@agntn/puzzles 的下载量有多少?

根据 npm 官方下载统计,@agntn/puzzles 在 2026/10/05 – 2026/11/03 这 30 天内被下载 2,143 次,日均约 71 次。下载量会把 CI 构建、镜像同步和作为其他包依赖的安装一并计入,适合横向比较热度,不能直接等同于使用人数。

@agntn/puzzles 还在维护吗?

最新版本 0.31.0 发布于 2026/10/29(9 天前);至今共发布 27 个版本,其中过去 12 个月发布了 27 个;首次发布于 2026/09/18。发布频率只是参考信号:功能稳定的工具可能很少需要更新,建议结合源码仓库的 issue 和提交记录判断。