[{"data":1,"prerenderedAt":595},["ShallowReactive",2],{"navigation_docs":3,"-guide-verification":96,"-guide-verification-surround":590},[4,48],{"title":5,"path":6,"stem":7,"children":8,"icon":47},"Guide","\u002Fguide","1.guide\u002F01.index",[9,11,15,19,23,27,31,35,39,43],{"title":10,"path":6,"stem":7},"Getting Started",{"title":12,"path":13,"stem":14},"Puzzle records","\u002Fguide\u002Frecords","1.guide\u002F02.records",{"title":16,"path":17,"stem":18},"Registry","\u002Fguide\u002Fregistry","1.guide\u002F03.registry",{"title":20,"path":21,"stem":22},"Lookups and views","\u002Fguide\u002Flookups","1.guide\u002F04.lookups",{"title":24,"path":25,"stem":26},"Verification","\u002Fguide\u002Fverification","1.guide\u002F05.verification",{"title":28,"path":29,"stem":30},"Balances","\u002Fguide\u002Fbalances","1.guide\u002F06.balances",{"title":32,"path":33,"stem":34},"CLI","\u002Fguide\u002Fcli","1.guide\u002F07.cli",{"title":36,"path":37,"stem":38},"Agents","\u002Fguide\u002Fagents","1.guide\u002F08.agents",{"title":40,"path":41,"stem":42},"Custom collections","\u002Fguide\u002Fcustom","1.guide\u002F09.custom",{"title":44,"path":45,"stem":46},"Playground","\u002Fguide\u002Fplayground","1.guide\u002F10.playground","i-lucide-book-open",{"title":49,"path":50,"stem":51,"children":52,"icon":95},"Collections","\u002Fcollections","2.collections\u002F00.index",[53,55,59,63,67,71,75,79,83,87,91],{"title":54,"path":50,"stem":51},"Overview",{"title":56,"path":57,"stem":58},"Bitcoin puzzle transaction","\u002Fcollections\u002Fb1000","2.collections\u002F01.b1000",{"title":60,"path":61,"stem":62},"RushWallet contest","\u002Fcollections\u002Frushwallet","2.collections\u002F02.rushwallet",{"title":64,"path":65,"stem":66},"Zden's puzzles","\u002Fcollections\u002Fzden","2.collections\u002F03.zden",{"title":68,"path":69,"stem":70},"Arweave bounties","\u002Fcollections\u002Farweave","2.collections\u002F04.arweave",{"title":72,"path":73,"stem":74},"WarpWallet challenges","\u002Fcollections\u002Fwarp","2.collections\u002F05.warp",{"title":76,"path":77,"stem":78},"Hash collision bounties","\u002Fcollections\u002Fhash_collision","2.collections\u002F06.hash_collision",{"title":80,"path":81,"stem":82},"Ballet wallets","\u002Fcollections\u002Fballet","2.collections\u002F07.ballet",{"title":84,"path":85,"stem":86},"Bitimage","\u002Fcollections\u002Fbitimage","2.collections\u002F08.bitimage",{"title":88,"path":89,"stem":90},"Bitaps mnemonic challenge","\u002Fcollections\u002Fbitaps","2.collections\u002F09.bitaps",{"title":92,"path":93,"stem":94},"GSMG.io puzzle","\u002Fcollections\u002Fgsmg","2.collections\u002F10.gsmg","i-lucide-layers",{"id":97,"title":24,"body":98,"description":583,"extension":584,"links":585,"meta":586,"navigation":164,"path":25,"seo":588,"stem":26,"__hash__":589},"docs\u002F1.guide\u002F05.verification.md",{"type":99,"value":100,"toc":577},"minimark",[101,106,273,288,303,307,383,402,477,483,487,493,497,534,573],[102,103,105],"h2",{"id":104},"the-call","The call",[107,108,113],"pre",{"className":109,"code":110,"language":111,"meta":112,"style":112},"language-ts shiki shiki-themes github-light github-light vitesse-dark","import { verifyPuzzle, requirePuzzle } from \"@agntn\u002Fpuzzles\";\n\nconst result = verifyPuzzle(await requirePuzzle(\"b1000\u002F1\"));\n\nresult.verified; \u002F\u002F true\nresult.derivedAddress; \u002F\u002F \"1BgGZ9tcN4rm9KBzDn7KprQz87SZ26SAMH\"\nresult.expectedAddress; \u002F\u002F the same\nresult.privateKey; \u002F\u002F \"00…01\", the hex the derivation started from\n","ts","",[114,115,116,159,166,204,209,228,243,258],"code",{"__ignoreMap":112},[117,118,121,125,129,133,136,139,142,145,149,153,156],"span",{"class":119,"line":120},"line",1,[117,122,124],{"class":123},"sds8u","import",[117,126,128],{"class":127},"s14qF"," {",[117,130,132],{"class":131},"s9qSu"," verifyPuzzle",[117,134,135],{"class":127},",",[117,137,138],{"class":131}," requirePuzzle",[117,140,141],{"class":127}," }",[117,143,144],{"class":123}," from",[117,146,148],{"class":147},"s2tGe"," \"",[117,150,152],{"class":151},"skmWX","@agntn\u002Fpuzzles",[117,154,155],{"class":147},"\"",[117,157,158],{"class":127},";\n",[117,160,162],{"class":119,"line":161},2,[117,163,165],{"emptyLinePlaceholder":164},true,"\n",[117,167,169,173,177,181,184,187,190,192,194,196,199,201],{"class":119,"line":168},3,[117,170,172],{"class":171},"sO_1p","const",[117,174,176],{"class":175},"sHhh0"," result",[117,178,180],{"class":179},"sLuFV"," =",[117,182,132],{"class":183},"sTnI0",[117,185,186],{"class":127},"(",[117,188,189],{"class":123},"await",[117,191,138],{"class":183},[117,193,186],{"class":127},[117,195,155],{"class":147},[117,197,198],{"class":151},"b1000\u002F1",[117,200,155],{"class":147},[117,202,203],{"class":127},"));\n",[117,205,207],{"class":119,"line":206},4,[117,208,165],{"emptyLinePlaceholder":164},[117,210,212,215,218,221,224],{"class":119,"line":211},5,[117,213,214],{"class":131},"result",[117,216,217],{"class":127},".",[117,219,220],{"class":131},"verified",[117,222,223],{"class":127},";",[117,225,227],{"class":226},"sjj-T"," \u002F\u002F true\n",[117,229,231,233,235,238,240],{"class":119,"line":230},6,[117,232,214],{"class":131},[117,234,217],{"class":127},[117,236,237],{"class":131},"derivedAddress",[117,239,223],{"class":127},[117,241,242],{"class":226}," \u002F\u002F \"1BgGZ9tcN4rm9KBzDn7KprQz87SZ26SAMH\"\n",[117,244,246,248,250,253,255],{"class":119,"line":245},7,[117,247,214],{"class":131},[117,249,217],{"class":127},[117,251,252],{"class":131},"expectedAddress",[117,254,223],{"class":127},[117,256,257],{"class":226}," \u002F\u002F the same\n",[117,259,261,263,265,268,270],{"class":119,"line":260},8,[117,262,214],{"class":131},[117,264,217],{"class":127},[117,266,267],{"class":131},"privateKey",[117,269,223],{"class":127},[117,271,272],{"class":226}," \u002F\u002F \"00…01\", the hex the derivation started from\n",[274,275,276,279,280,283,284,287],"p",{},[114,277,278],{},"verifyPuzzle(puzzle)"," is synchronous. It reads ",[114,281,282],{},"secretOf(puzzle.keyData())",", turns the secret into a raw key, derives the address the way the chain does it, and compares. ",[114,285,286],{},"addressesEqual"," lowercases Ethereum and compares everything else byte for byte.",[274,289,290,291,294,295,298,299,302],{},"Collections have the asynchronous form, ",[114,292,293],{},"b1000.verify(1)"," and ",[114,296,297],{},"b1000.verifyById(\"b1000\u002F1\")",". They import the signing crypto on first use. That keeps secp256k1 out of the CLI's start: ",[114,300,301],{},"puzzles collections"," doesn't need it, so it doesn't pay for it.",[102,304,306],{"id":305},"failures-are-values","Failures are values",[107,308,310],{"className":109,"code":309,"language":111,"meta":112,"style":112},"const result = verifyPuzzle(await requirePuzzle(\"b1000\u002F71\"));\n\nresult.verified; \u002F\u002F false\nresult.unavailable; \u002F\u002F true\nresult.error; \u002F\u002F \"Puzzle has no private key\"\n",[114,311,312,339,343,356,369],{"__ignoreMap":112},[117,313,314,316,318,320,322,324,326,328,330,332,335,337],{"class":119,"line":120},[117,315,172],{"class":171},[117,317,176],{"class":175},[117,319,180],{"class":179},[117,321,132],{"class":183},[117,323,186],{"class":127},[117,325,189],{"class":123},[117,327,138],{"class":183},[117,329,186],{"class":127},[117,331,155],{"class":147},[117,333,334],{"class":151},"b1000\u002F71",[117,336,155],{"class":147},[117,338,203],{"class":127},[117,340,341],{"class":119,"line":161},[117,342,165],{"emptyLinePlaceholder":164},[117,344,345,347,349,351,353],{"class":119,"line":168},[117,346,214],{"class":131},[117,348,217],{"class":127},[117,350,220],{"class":131},[117,352,223],{"class":127},[117,354,355],{"class":226}," \u002F\u002F false\n",[117,357,358,360,362,365,367],{"class":119,"line":206},[117,359,214],{"class":131},[117,361,217],{"class":127},[117,363,364],{"class":131},"unavailable",[117,366,223],{"class":127},[117,368,227],{"class":226},[117,370,371,373,375,378,380],{"class":119,"line":211},[117,372,214],{"class":131},[117,374,217],{"class":127},[117,376,377],{"class":131},"error",[117,379,223],{"class":127},[117,381,382],{"class":226}," \u002F\u002F \"Puzzle has no private key\"\n",[274,384,385,386,389,390,393,394,397,398,401],{},"Three answers, one shape. ",[114,387,388],{},"verified: true"," with the derived address. ",[114,391,392],{},"verified: false, unavailable: true"," when there was nothing to derive: no key, an encrypted key without its passphrase, a mini key. And ",[114,395,396],{},"verified: false, unavailable: false"," with an error when a key exists and derives the wrong address. That last one is what the data gate exists to catch. Nothing throws for a bad record. Why not? Because ",[114,399,400],{},"puzzles verify --all"," would crash on the first unsolved puzzle.",[403,404,405,418],"table",{},[406,407,408],"thead",{},[409,410,411,415],"tr",{},[412,413,414],"th",{},"Secret",[412,416,417],{},"Verified how",[419,420,421,432,442,457,467],"tbody",{},[409,422,423,429],{},[424,425,426],"td",{},[114,427,428],{},"hex",[424,430,431],{},"The key as written, with the public key format the record declares, compressed by default",[409,433,434,439],{},[424,435,436],{},[114,437,438],{},"wif",[424,440,441],{},"Decoded first. The WIF says whether the key is compressed, so the record doesn't have to",[409,443,444,450],{},[424,445,446,449],{},[114,447,448],{},"seed"," with a phrase",[424,451,452,453,456],{},"BIP39 to BIP32 along the record's path. No path, or a ",[114,454,455],{},"Required"," passphrase, means unavailable",[409,458,459,464],{},[424,460,461],{},[114,462,463],{},"encrypted",[424,465,466],{},"Unavailable here. The data gate decrypts BIP38 payloads with the passphrase when the record has one, so an encrypted key with a known passphrase is still checked, just not at runtime",[409,468,469,474],{},[424,470,471],{},[114,472,473],{},"mini",[424,475,476],{},"Unavailable. Nobody has asked yet",[274,478,479,480,482],{},"Bitcoin and Litecoin derive P2PKH and P2WPKH, Ethereum its Keccak address, Decred its BLAKE-256 P2PKH. Arweave and Monero have no key to address derivation here. A key there stays ",[114,481,364],{}," too, and the data gate treats \"nothing to contradict\" as a pass, not a failure.",[102,484,486],{"id":485},"what-this-isnt","What this isn't",[274,488,489,490,492],{},"A verified puzzle is one whose published key derives its stored address. It says the record is internally consistent. It doesn't say the address holds anything, that the key was the solver's, or that the puzzle is worth your CPU. ",[114,491,198],{}," verifies and holds nothing. It was solved in 2013.",[102,494,496],{"id":495},"cli-and-tools","CLI and tools",[107,498,502],{"className":499,"code":500,"language":501,"meta":112,"style":112},"language-bash shiki shiki-themes github-light github-light vitesse-dark","puzzles verify b1000\u002F1          # OK    b1000\u002F1\npuzzles verify --all --quiet    # exit 1 when any puzzle with a key fails, nothing printed\n","bash",[114,503,504,518],{"__ignoreMap":112},[117,505,506,509,512,515],{"class":119,"line":120},[117,507,508],{"class":183},"puzzles",[117,510,511],{"class":151}," verify",[117,513,514],{"class":151}," b1000\u002F1",[117,516,517],{"class":226},"          # OK    b1000\u002F1\n",[117,519,520,522,524,528,531],{"class":119,"line":161},[117,521,508],{"class":183},[117,523,511],{"class":151},[117,525,527],{"class":526},"sAsIS"," --all",[117,529,530],{"class":526}," --quiet",[117,532,533],{"class":226},"    # exit 1 when any puzzle with a key fails, nothing printed\n",[274,535,536,538,539,542,543,546,547,550,551,553,554,557,558,561,562,565,566,557,569,572],{},[114,537,400],{}," prints one line per puzzle, ",[114,540,541],{},"OK",", ",[114,544,545],{},"SKIP"," or ",[114,548,549],{},"FAIL",". It exits 1 only on a ",[114,552,549],{},". The CI gate runs it with ",[114,555,556],{},"--quiet",". ",[114,559,560],{},"puzzles_verify"," is the same answer for a model: ",[114,563,564],{},"b1000\u002F1: verified, derives 1BgG…",", or ",[114,567,568],{},"unverifiable (Puzzle has no private key)",[114,570,571],{},"isError"," stays unset either way.",[574,575,576],"style",{},"html pre.shiki code .sds8u, html code.shiki .sds8u{--shiki-light:#D73A49;--shiki-default:#D73A49;--shiki-dark:#4D9375}html pre.shiki code .s14qF, html code.shiki .s14qF{--shiki-light:#24292E;--shiki-default:#24292E;--shiki-dark:#666666}html pre.shiki code .s9qSu, html code.shiki .s9qSu{--shiki-light:#24292E;--shiki-default:#24292E;--shiki-dark:#BD976A}html pre.shiki code .s2tGe, html code.shiki .s2tGe{--shiki-light:#032F62;--shiki-default:#032F62;--shiki-dark:#C98A7D77}html pre.shiki code .skmWX, html code.shiki .skmWX{--shiki-light:#032F62;--shiki-default:#032F62;--shiki-dark:#C98A7D}html pre.shiki code .sO_1p, html code.shiki .sO_1p{--shiki-light:#D73A49;--shiki-default:#D73A49;--shiki-dark:#CB7676}html pre.shiki code .sHhh0, html code.shiki .sHhh0{--shiki-light:#005CC5;--shiki-default:#005CC5;--shiki-dark:#BD976A}html pre.shiki code .sLuFV, html code.shiki .sLuFV{--shiki-light:#D73A49;--shiki-default:#D73A49;--shiki-dark:#666666}html pre.shiki code .sTnI0, html code.shiki .sTnI0{--shiki-light:#6F42C1;--shiki-default:#6F42C1;--shiki-dark:#80A665}html pre.shiki code .sjj-T, html code.shiki .sjj-T{--shiki-light:#6A737D;--shiki-default:#6A737D;--shiki-dark:#758575DD}html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html pre.shiki code .sAsIS, html code.shiki .sAsIS{--shiki-light:#005CC5;--shiki-default:#005CC5;--shiki-dark:#C99076}",{"title":112,"searchDepth":161,"depth":161,"links":578},[579,580,581,582],{"id":104,"depth":161,"text":105},{"id":305,"depth":161,"text":306},{"id":485,"depth":161,"text":486},{"id":495,"depth":161,"text":496},"verifyPuzzle derives the address from the one secret a record exposes and compares. Expected failures are values. What can and can't be checked.","md",null,{"icon":587},"i-lucide-badge-check",{"title":24,"description":583},"vVevBIh1qcBpPXNEPaCEEiTe11W8vdOTd0dg2JAZ9nA",[591,593],{"title":20,"path":21,"stem":22,"description":592,"children":-1},"get and requirePuzzle by identifier. selectPuzzles by collection and status. stats and the dataset snapshot with its deterministic data version.",{"title":28,"path":29,"stem":30,"description":594,"children":-1},"puzzle.balance() through the explorers provider for its chain. The one call that leaves the process. Base units as bigint. API keys never reach an error.",1789734790029]