[{"data":1,"prerenderedAt":1036},["ShallowReactive",2],{"navigation_docs":3,"-guide-keys":84,"-guide-keys-surround":1031},[4,32],{"title":5,"path":6,"stem":7,"children":8,"icon":31},"Guide","\u002Fguide","1.guide\u002F1.index",[9,11,15,19,23,27],{"title":10,"path":6,"stem":7},"Getting Started",{"title":12,"path":13,"stem":14},"Working with Keys","\u002Fguide\u002Fkeys","1.guide\u002F2.keys",{"title":16,"path":17,"stem":18},"Working with Addresses","\u002Fguide\u002Faddresses","1.guide\u002F3.addresses",{"title":20,"path":21,"stem":22},"Generating Wallets","\u002Fguide\u002Fwallets","1.guide\u002F4.wallets",{"title":24,"path":25,"stem":26},"Working with EVM Chains","\u002Fguide\u002Fevm","1.guide\u002F5.evm",{"title":28,"path":29,"stem":30},"Creating Custom Blockchains","\u002Fguide\u002Fcustom","1.guide\u002F6.custom","i-lucide-book-open",{"title":33,"path":34,"stem":35,"children":36,"icon":83},"Blockchains","\u002Fblockchains","2.blockchains\u002F0.index",[37,39,43,47,51,55,59,63,67,71,75,79],{"title":38,"path":34,"stem":35},"Overview",{"title":40,"path":41,"stem":42},"Aptos","\u002Fblockchains\u002Faptos","2.blockchains\u002Faptos",{"title":44,"path":45,"stem":46},"Base","\u002Fblockchains\u002Fbase","2.blockchains\u002Fbase",{"title":48,"path":49,"stem":50},"Bitcoin","\u002Fblockchains\u002Fbitcoin","2.blockchains\u002Fbitcoin",{"title":52,"path":53,"stem":54},"Cardano","\u002Fblockchains\u002Fcardano","2.blockchains\u002Fcardano",{"title":56,"path":57,"stem":58},"Decred","\u002Fblockchains\u002Fdecred","2.blockchains\u002Fdecred",{"title":60,"path":61,"stem":62},"Ethereum","\u002Fblockchains\u002Fethereum","2.blockchains\u002Fethereum",{"title":64,"path":65,"stem":66},"Litecoin","\u002Fblockchains\u002Flitecoin","2.blockchains\u002Flitecoin",{"title":68,"path":69,"stem":70},"Solana","\u002Fblockchains\u002Fsolana","2.blockchains\u002Fsolana",{"title":72,"path":73,"stem":74},"Stellar","\u002Fblockchains\u002Fstellar","2.blockchains\u002Fstellar",{"title":76,"path":77,"stem":78},"Sui","\u002Fblockchains\u002Fsui","2.blockchains\u002Fsui",{"title":80,"path":81,"stem":82},"TRON","\u002Fblockchains\u002Ftron","2.blockchains\u002Ftron","i-lucide-boxes",{"id":85,"title":12,"body":86,"description":1024,"extension":1025,"links":1026,"meta":1027,"navigation":170,"path":13,"seo":1029,"stem":14,"__hash__":1030},"docs\u002F1.guide\u002F2.keys.md",{"type":87,"value":88,"toc":1014},"minimark",[89,94,98,250,271,275,325,336,381,384,388,447,454,458,464,530,537,541,552,737,746,750,813,816,859,863,870,978,989,993,1010],[90,91,93],"h2",{"id":92},"a-private-key","A private key",[95,96,97],"p",{},"Every chain uses the same generator. You get 32 bytes of randomness as a 64 character hex string, nothing more.",[99,100,105],"pre",{"className":101,"code":102,"language":103,"meta":104,"style":104},"language-js shiki shiki-themes github-light github-light poimandres","import { useBlockchain } from \"@agntn\u002Fkeys\";\nimport Bitcoin from \"@agntn\u002Fkeys\u002Fblockchains\u002Fbitcoin\";\n\nconst chain = useBlockchain(new Bitcoin());\nconst privateKey = chain.generateKeyPrivate();\n\nconsole.log(privateKey); \u002F\u002F '7f9e5b9e3bbed34a4c28c8c1665525fc2cd7afb4fdc7edca3eb93ddf8a31ef56'\n","js","",[106,107,108,146,165,172,200,222,227],"code",{"__ignoreMap":104},[109,110,113,117,121,125,128,132,136,140,143],"span",{"class":111,"line":112},"line",1,[109,114,116],{"class":115},"sP0CR","import",[109,118,120],{"class":119},"sKlNE"," {",[109,122,124],{"class":123},"snHMy"," useBlockchain",[109,126,127],{"class":119}," }",[109,129,131],{"class":130},"stCPd"," from",[109,133,135],{"class":134},"scVjq"," \"",[109,137,139],{"class":138},"sQ7BG","@agntn\u002Fkeys",[109,141,142],{"class":134},"\"",[109,144,145],{"class":119},";\n",[109,147,149,151,154,156,158,161,163],{"class":111,"line":148},2,[109,150,116],{"class":115},[109,152,153],{"class":123}," Bitcoin",[109,155,131],{"class":130},[109,157,135],{"class":134},[109,159,160],{"class":138},"@agntn\u002Fkeys\u002Fblockchains\u002Fbitcoin",[109,162,142],{"class":134},[109,164,145],{"class":119},[109,166,168],{"class":111,"line":167},3,[109,169,171],{"emptyLinePlaceholder":170},true,"\n",[109,173,175,179,183,186,189,192,195,197],{"class":111,"line":174},4,[109,176,178],{"class":177},"s1TYA","const",[109,180,182],{"class":181},"saoiD"," chain",[109,184,185],{"class":177}," =",[109,187,124],{"class":188},"sULi6",[109,190,191],{"class":119},"(",[109,193,194],{"class":115},"new",[109,196,153],{"class":188},[109,198,199],{"class":119},"());\n",[109,201,203,205,208,210,213,216,219],{"class":111,"line":202},5,[109,204,178],{"class":177},[109,206,207],{"class":181}," privateKey",[109,209,185],{"class":177},[109,211,182],{"class":212},"spVlQ",[109,214,215],{"class":119},".",[109,217,218],{"class":188},"generateKeyPrivate",[109,220,221],{"class":119},"();\n",[109,223,225],{"class":111,"line":224},6,[109,226,171],{"emptyLinePlaceholder":170},[109,228,230,233,235,238,240,243,246],{"class":111,"line":229},7,[109,231,232],{"class":212},"console",[109,234,215],{"class":119},[109,236,237],{"class":188},"log",[109,239,191],{"class":119},[109,241,242],{"class":212},"privateKey",[109,244,245],{"class":119},"); ",[109,247,249],{"class":248},"sjhu3","\u002F\u002F '7f9e5b9e3bbed34a4c28c8c1665525fc2cd7afb4fdc7edca3eb93ddf8a31ef56'\n",[95,251,252,253,256,257,260,261,264,265,270],{},"secp256k1 chains ask ",[106,254,255],{},"@noble\u002Fcurves"," for a scalar that sits inside the curve order, ed25519 chains ask the same library for a seed. There's no ",[106,258,259],{},"node:crypto"," anywhere, noble reads ",[106,262,263],{},"globalThis.crypto"," on its own, which is why the ",[266,267,269],"a",{"href":268},"\u002Fkeyspace","Keyspace"," explorer can run the whole thing in a tab.",[90,272,274],{"id":273},"the-public-key","The public key",[99,276,278],{"className":101,"code":277,"language":103,"meta":104,"style":104},"const publicKey = chain.getKeyPublic(privateKey);\n\nconsole.log(publicKey); \u002F\u002F '02a1633cafcc01ebfb6d78e39f687a1f0995c62fc95f51ead10a02ee0be551b5dc'\n",[106,279,280,303,307],{"__ignoreMap":104},[109,281,282,284,287,289,291,293,296,298,300],{"class":111,"line":112},[109,283,178],{"class":177},[109,285,286],{"class":181}," publicKey",[109,288,185],{"class":177},[109,290,182],{"class":212},[109,292,215],{"class":119},[109,294,295],{"class":188},"getKeyPublic",[109,297,191],{"class":119},[109,299,242],{"class":212},[109,301,302],{"class":119},");\n",[109,304,305],{"class":111,"line":148},[109,306,171],{"emptyLinePlaceholder":170},[109,308,309,311,313,315,317,320,322],{"class":111,"line":167},[109,310,232],{"class":212},[109,312,215],{"class":119},[109,314,237],{"class":188},[109,316,191],{"class":119},[109,318,319],{"class":212},"publicKey",[109,321,245],{"class":119},[109,323,324],{"class":248},"\u002F\u002F '02a1633cafcc01ebfb6d78e39f687a1f0995c62fc95f51ead10a02ee0be551b5dc'\n",[95,326,327,328,331,332,335],{},"On secp256k1 chains this is the compressed form: 33 bytes, starting with ",[106,329,330],{},"02"," or ",[106,333,334],{},"03",". That's what Bitcoin, Ethereum, and TRON expect today. If you need the uncompressed 65 byte key, ask for it:",[99,337,339],{"className":101,"code":338,"language":103,"meta":104,"style":104},"const uncompressed = chain.getKeyPublic(privateKey, { compressed: false });\n\u002F\u002F '04a1633cafcc01ebfb6d78e39f687a1f0995c62fc95f51ead10a02ee0be551b5dc7513...'\n",[106,340,341,376],{"__ignoreMap":104},[109,342,343,345,348,350,352,354,356,358,360,363,366,369,373],{"class":111,"line":112},[109,344,178],{"class":177},[109,346,347],{"class":181}," uncompressed",[109,349,185],{"class":177},[109,351,182],{"class":212},[109,353,215],{"class":119},[109,355,295],{"class":188},[109,357,191],{"class":119},[109,359,242],{"class":212},[109,361,362],{"class":119},", {",[109,364,365],{"class":123}," compressed",[109,367,368],{"class":119},":",[109,370,372],{"class":371},"sNe8j"," false",[109,374,375],{"class":119}," });\n",[109,377,378],{"class":111,"line":148},[109,379,380],{"class":248},"\u002F\u002F '04a1633cafcc01ebfb6d78e39f687a1f0995c62fc95f51ead10a02ee0be551b5dc7513...'\n",[95,382,383],{},"ed25519 chains have no compression flag. The public key is always 32 bytes.",[90,385,387],{"id":386},"both-at-once","Both at once",[99,389,391],{"className":101,"code":390,"language":103,"meta":104,"style":104},"const keyPair = chain.generateKeys();\n\nkeyPair.keys.private;\nkeyPair.keys.public;\n",[106,392,393,411,415,432],{"__ignoreMap":104},[109,394,395,397,400,402,404,406,409],{"class":111,"line":112},[109,396,178],{"class":177},[109,398,399],{"class":181}," keyPair",[109,401,185],{"class":177},[109,403,182],{"class":212},[109,405,215],{"class":119},[109,407,408],{"class":188},"generateKeys",[109,410,221],{"class":119},[109,412,413],{"class":111,"line":148},[109,414,171],{"emptyLinePlaceholder":170},[109,416,417,420,422,425,427,430],{"class":111,"line":167},[109,418,419],{"class":212},"keyPair",[109,421,215],{"class":119},[109,423,424],{"class":212},"keys",[109,426,215],{"class":119},[109,428,429],{"class":212},"private",[109,431,145],{"class":119},[109,433,434,436,438,440,442,445],{"class":111,"line":174},[109,435,419],{"class":212},[109,437,215],{"class":119},[109,439,424],{"class":212},[109,441,215],{"class":119},[109,443,444],{"class":212},"public",[109,446,145],{"class":119},[95,448,449,450,453],{},"The same options apply, so ",[106,451,452],{},"chain.generateKeys({ compressed: false })"," gives you an uncompressed pair.",[90,455,457],{"id":456},"flipping-a-public-key-you-already-have","Flipping a public key you already have",[95,459,460,463],{},[106,461,462],{},"convertSecp256k1PublicKey"," goes between the two encodings without a private key. It parses the point first, so a string that only looks like a key is rejected instead of encoded again.",[99,465,467],{"className":101,"code":466,"language":103,"meta":104,"style":104},"import { convertSecp256k1PublicKey } from \"@agntn\u002Fkeys\";\n\nconvertSecp256k1PublicKey(publicKey, { compressed: false }); \u002F\u002F 04..., 130 hex chars\nconvertSecp256k1PublicKey(uncompressed); \u002F\u002F back to 02... or 03..., the default\n",[106,468,469,490,494,516],{"__ignoreMap":104},[109,470,471,473,475,478,480,482,484,486,488],{"class":111,"line":112},[109,472,116],{"class":115},[109,474,120],{"class":119},[109,476,477],{"class":123}," convertSecp256k1PublicKey",[109,479,127],{"class":119},[109,481,131],{"class":130},[109,483,135],{"class":134},[109,485,139],{"class":138},[109,487,142],{"class":134},[109,489,145],{"class":119},[109,491,492],{"class":111,"line":148},[109,493,171],{"emptyLinePlaceholder":170},[109,495,496,498,500,502,504,506,508,510,513],{"class":111,"line":167},[109,497,462],{"class":188},[109,499,191],{"class":119},[109,501,319],{"class":212},[109,503,362],{"class":119},[109,505,365],{"class":123},[109,507,368],{"class":119},[109,509,372],{"class":371},[109,511,512],{"class":119}," }); ",[109,514,515],{"class":248},"\u002F\u002F 04..., 130 hex chars\n",[109,517,518,520,522,525,527],{"class":111,"line":174},[109,519,462],{"class":188},[109,521,191],{"class":119},[109,523,524],{"class":212},"uncompressed",[109,526,245],{"class":119},[109,528,529],{"class":248},"\u002F\u002F back to 02... or 03..., the default\n",[95,531,532,533,536],{},"Mind what that does to addresses. A legacy Bitcoin address hashes the bytes you give it, so the compressed and the uncompressed encoding of one key are two different addresses. Keep the ",[106,534,535],{},"compressed"," flag next to the key, the way WIF does.",[90,538,540],{"id":539},"wif","WIF",[95,542,543,544,547,548,551],{},"Wallet import format is the private key in base58check with a chain prefix and a compression flag. Bitcoin, Litecoin and Decred have one, and ",[106,545,546],{},"encodeWIF"," and ",[106,549,550],{},"decodeWIF"," speak all three.",[99,553,555],{"className":101,"code":554,"language":103,"meta":104,"style":104},"import { encodeWIF, decodeWIF } from \"@agntn\u002Fkeys\";\n\nencodeWIF(privateKey, { chain: \"bitcoin\" }); \u002F\u002F K... or L..., compressed\nencodeWIF(privateKey, { chain: \"bitcoin\", compressed: false }); \u002F\u002F 5...\nencodeWIF(privateKey, { chain: \"litecoin\" }); \u002F\u002F T...\nencodeWIF(privateKey, { chain: \"decred\" }); \u002F\u002F Pm...\n\ndecodeWIF(\"KwDiBf89QgGbjEhKnhXJuH7LrciVrZi3qYjgd9M7rFU73sVHnoWn\", { chain: \"bitcoin\" });\n\u002F\u002F { privateKey: '0000…0001', chain: 'bitcoin', network: 'mainnet', compressed: true }\n",[106,556,557,584,588,614,647,673,699,703,731],{"__ignoreMap":104},[109,558,559,561,563,566,569,572,574,576,578,580,582],{"class":111,"line":112},[109,560,116],{"class":115},[109,562,120],{"class":119},[109,564,565],{"class":123}," encodeWIF",[109,567,568],{"class":119},",",[109,570,571],{"class":123}," decodeWIF",[109,573,127],{"class":119},[109,575,131],{"class":130},[109,577,135],{"class":134},[109,579,139],{"class":138},[109,581,142],{"class":134},[109,583,145],{"class":119},[109,585,586],{"class":111,"line":148},[109,587,171],{"emptyLinePlaceholder":170},[109,589,590,592,594,596,598,600,602,604,607,609,611],{"class":111,"line":167},[109,591,546],{"class":188},[109,593,191],{"class":119},[109,595,242],{"class":212},[109,597,362],{"class":119},[109,599,182],{"class":123},[109,601,368],{"class":119},[109,603,135],{"class":134},[109,605,606],{"class":138},"bitcoin",[109,608,142],{"class":134},[109,610,512],{"class":119},[109,612,613],{"class":248},"\u002F\u002F K... or L..., compressed\n",[109,615,616,618,620,622,624,626,628,630,632,634,636,638,640,642,644],{"class":111,"line":174},[109,617,546],{"class":188},[109,619,191],{"class":119},[109,621,242],{"class":212},[109,623,362],{"class":119},[109,625,182],{"class":123},[109,627,368],{"class":119},[109,629,135],{"class":134},[109,631,606],{"class":138},[109,633,142],{"class":134},[109,635,568],{"class":119},[109,637,365],{"class":123},[109,639,368],{"class":119},[109,641,372],{"class":371},[109,643,512],{"class":119},[109,645,646],{"class":248},"\u002F\u002F 5...\n",[109,648,649,651,653,655,657,659,661,663,666,668,670],{"class":111,"line":202},[109,650,546],{"class":188},[109,652,191],{"class":119},[109,654,242],{"class":212},[109,656,362],{"class":119},[109,658,182],{"class":123},[109,660,368],{"class":119},[109,662,135],{"class":134},[109,664,665],{"class":138},"litecoin",[109,667,142],{"class":134},[109,669,512],{"class":119},[109,671,672],{"class":248},"\u002F\u002F T...\n",[109,674,675,677,679,681,683,685,687,689,692,694,696],{"class":111,"line":224},[109,676,546],{"class":188},[109,678,191],{"class":119},[109,680,242],{"class":212},[109,682,362],{"class":119},[109,684,182],{"class":123},[109,686,368],{"class":119},[109,688,135],{"class":134},[109,690,691],{"class":138},"decred",[109,693,142],{"class":134},[109,695,512],{"class":119},[109,697,698],{"class":248},"\u002F\u002F Pm...\n",[109,700,701],{"class":111,"line":229},[109,702,171],{"emptyLinePlaceholder":170},[109,704,706,708,710,712,715,717,719,721,723,725,727,729],{"class":111,"line":705},8,[109,707,550],{"class":188},[109,709,191],{"class":119},[109,711,142],{"class":134},[109,713,714],{"class":138},"KwDiBf89QgGbjEhKnhXJuH7LrciVrZi3qYjgd9M7rFU73sVHnoWn",[109,716,142],{"class":134},[109,718,362],{"class":119},[109,720,182],{"class":123},[109,722,368],{"class":119},[109,724,135],{"class":134},[109,726,606],{"class":138},[109,728,142],{"class":134},[109,730,375],{"class":119},[109,732,734],{"class":111,"line":733},9,[109,735,736],{"class":248},"\u002F\u002F { privateKey: '0000…0001', chain: 'bitcoin', network: 'mainnet', compressed: true }\n",[95,738,739,741,742,745],{},[106,740,550],{}," wants to be told the chain and checks the prefix against it, no guessing from the first letter. That's on purpose: Bitcoin and Litecoin share the testnet prefix, so a guess would be a coin flip there. Decred has its own layout, a scheme byte after the prefix and a single BLAKE-256 checksum, and only the compressed form exists, so ",[106,743,744],{},"compressed: false"," on Decred throws. What you get back is the hex key plus the flags that were encoded with it, not proof that the key belongs to that chain.",[90,747,749],{"id":748},"the-shape-you-get-back","The shape you get back",[99,751,755],{"className":752,"code":753,"language":754,"meta":104,"style":104},"language-typescript shiki shiki-themes github-light github-light poimandres","interface Keys {\n  keys: {\n    private: string;\n    public: string;\n  };\n}\n","typescript",[106,756,757,769,779,792,803,808],{"__ignoreMap":104},[109,758,759,762,766],{"class":111,"line":112},[109,760,761],{"class":177},"interface",[109,763,765],{"class":764},"sCrqT"," Keys",[109,767,768],{"class":119}," {\n",[109,770,771,775,777],{"class":111,"line":148},[109,772,774],{"class":773},"s0VbO","  keys",[109,776,368],{"class":177},[109,778,768],{"class":119},[109,780,781,784,786,790],{"class":111,"line":167},[109,782,783],{"class":773},"    private",[109,785,368],{"class":177},[109,787,789],{"class":788},"s8yaW"," string",[109,791,145],{"class":119},[109,793,794,797,799,801],{"class":111,"line":174},[109,795,796],{"class":773},"    public",[109,798,368],{"class":177},[109,800,789],{"class":788},[109,802,145],{"class":119},[109,804,805],{"class":111,"line":202},[109,806,807],{"class":119},"  };\n",[109,809,810],{"class":111,"line":224},[109,811,812],{"class":119},"}\n",[95,814,815],{},"Hex strings everywhere. Sizes by curve:",[817,818,819,835],"table",{},[820,821,822],"thead",{},[823,824,825,829,832],"tr",{},[826,827,828],"th",{},"Curve",[826,830,831],{},"Private",[826,833,834],{},"Public",[836,837,838,850],"tbody",{},[823,839,840,844,847],{},[841,842,843],"td",{},"secp256k1",[841,845,846],{},"64 hex chars",[841,848,849],{},"66 hex chars compressed, 130 uncompressed",[823,851,852,855,857],{},[841,853,854],{},"ed25519",[841,856,846],{},[841,858,846],{},[90,860,862],{"id":861},"sui-speaks-two-curves","Sui speaks two curves",[95,864,865,866,869],{},"Sui accepts ed25519 and secp256k1 keys on the same chain. The private key is the same 32 bytes either way. The ",[106,867,868],{},"scheme"," option decides which curve turns it into a public key:",[99,871,873],{"className":101,"code":872,"language":103,"meta":104,"style":104},"import Sui from \"@agntn\u002Fkeys\u002Fblockchains\u002Fsui\";\n\nconst suiChain = useBlockchain(new Sui());\n\nconst ed25519PublicKey = suiChain.getKeyPublic(privateKey); \u002F\u002F default\nconst secp256k1PublicKey = suiChain.getKeyPublic(privateKey, { scheme: \"secp256k1\" });\n",[106,874,875,893,897,916,920,944],{"__ignoreMap":104},[109,876,877,879,882,884,886,889,891],{"class":111,"line":112},[109,878,116],{"class":115},[109,880,881],{"class":123}," Sui",[109,883,131],{"class":130},[109,885,135],{"class":134},[109,887,888],{"class":138},"@agntn\u002Fkeys\u002Fblockchains\u002Fsui",[109,890,142],{"class":134},[109,892,145],{"class":119},[109,894,895],{"class":111,"line":148},[109,896,171],{"emptyLinePlaceholder":170},[109,898,899,901,904,906,908,910,912,914],{"class":111,"line":167},[109,900,178],{"class":177},[109,902,903],{"class":181}," suiChain",[109,905,185],{"class":177},[109,907,124],{"class":188},[109,909,191],{"class":119},[109,911,194],{"class":115},[109,913,881],{"class":188},[109,915,199],{"class":119},[109,917,918],{"class":111,"line":174},[109,919,171],{"emptyLinePlaceholder":170},[109,921,922,924,927,929,931,933,935,937,939,941],{"class":111,"line":202},[109,923,178],{"class":177},[109,925,926],{"class":181}," ed25519PublicKey",[109,928,185],{"class":177},[109,930,903],{"class":212},[109,932,215],{"class":119},[109,934,295],{"class":188},[109,936,191],{"class":119},[109,938,242],{"class":212},[109,940,245],{"class":119},[109,942,943],{"class":248},"\u002F\u002F default\n",[109,945,946,948,951,953,955,957,959,961,963,965,968,970,972,974,976],{"class":111,"line":224},[109,947,178],{"class":177},[109,949,950],{"class":181}," secp256k1PublicKey",[109,952,185],{"class":177},[109,954,903],{"class":212},[109,956,215],{"class":119},[109,958,295],{"class":188},[109,960,191],{"class":119},[109,962,242],{"class":212},[109,964,362],{"class":119},[109,966,967],{"class":123}," scheme",[109,969,368],{"class":119},[109,971,135],{"class":134},[109,973,843],{"class":138},[109,975,142],{"class":134},[109,977,375],{"class":119},[95,979,980,981,984,985,988],{},"Pick the scheme once and carry it through to ",[106,982,983],{},"getAddress",", otherwise the address won't match the key. The ",[266,986,987],{"href":77},"Sui page"," shows the full round trip.",[90,990,992],{"id":991},"under-the-hood","Under the hood",[95,994,995,996,998,999,1002,1003,1006,1007,215],{},"Curves come from ",[106,997,255],{},", hashes from ",[106,1000,1001],{},"@noble\u002Fhashes",". There's no second crypto implementation anywhere in the package, and adding one is the first thing a review would reject. EVM chains share everything through ",[106,1004,1005],{},"AbstractEVMBlockchain",", so Ethereum and Base are the same code with a different name and coin type. Bitcoin and Litecoin do the same through ",[106,1008,1009],{},"AbstractBitcoinBlockchain",[1011,1012,1013],"style",{},"html pre.shiki code .sP0CR, html code.shiki .sP0CR{--shiki-light:#D73A49;--shiki-default:#D73A49;--shiki-dark:#5DE4C7}html pre.shiki code .sKlNE, html code.shiki .sKlNE{--shiki-light:#24292E;--shiki-default:#24292E;--shiki-dark:#A6ACCD}html pre.shiki code .snHMy, html code.shiki .snHMy{--shiki-light:#24292E;--shiki-default:#24292E;--shiki-dark:#ADD7FF}html pre.shiki code .stCPd, html code.shiki .stCPd{--shiki-light:#D73A49;--shiki-default:#D73A49;--shiki-dark:#A6ACCD}html pre.shiki code .scVjq, html code.shiki .scVjq{--shiki-light:#032F62;--shiki-default:#032F62;--shiki-dark:#A6ACCD}html pre.shiki code .sQ7BG, html code.shiki .sQ7BG{--shiki-light:#032F62;--shiki-default:#032F62;--shiki-dark:#5DE4C7}html pre.shiki code .s1TYA, html code.shiki .s1TYA{--shiki-light:#D73A49;--shiki-default:#D73A49;--shiki-dark:#91B4D5}html pre.shiki code .saoiD, html code.shiki .saoiD{--shiki-light:#005CC5;--shiki-default:#005CC5;--shiki-dark:#E4F0FB}html pre.shiki code .sULi6, html code.shiki .sULi6{--shiki-light:#6F42C1;--shiki-default:#6F42C1;--shiki-dark:#E4F0FBD0}html pre.shiki code .spVlQ, html code.shiki .spVlQ{--shiki-light:#24292E;--shiki-default:#24292E;--shiki-dark:#E4F0FB}html pre.shiki code .sjhu3, html code.shiki .sjhu3{--shiki-light:#6A737D;--shiki-light-font-style:inherit;--shiki-default:#6A737D;--shiki-default-font-style:inherit;--shiki-dark:#767C9DB0;--shiki-dark-font-style:italic}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 .sNe8j, html code.shiki .sNe8j{--shiki-light:#005CC5;--shiki-default:#005CC5;--shiki-dark:#D0679D}html pre.shiki code .sCrqT, html code.shiki .sCrqT{--shiki-light:#6F42C1;--shiki-default:#6F42C1;--shiki-dark:#A6ACCDC0}html pre.shiki code .s0VbO, html code.shiki .s0VbO{--shiki-light:#E36209;--shiki-default:#E36209;--shiki-dark:#A6ACCD}html pre.shiki code .s8yaW, html code.shiki .s8yaW{--shiki-light:#005CC5;--shiki-default:#005CC5;--shiki-dark:#A6ACCDC0}",{"title":104,"searchDepth":148,"depth":148,"links":1015},[1016,1017,1018,1019,1020,1021,1022,1023],{"id":92,"depth":148,"text":93},{"id":273,"depth":148,"text":274},{"id":386,"depth":148,"text":387},{"id":456,"depth":148,"text":457},{"id":539,"depth":148,"text":540},{"id":748,"depth":148,"text":749},{"id":861,"depth":148,"text":862},{"id":991,"depth":148,"text":992},"Private and public keys. Compression and WIF. The one chain that speaks two curves.","md",null,{"icon":1028},"i-lucide-key",{"title":12,"description":1024},"VN5l85bTMEGUPjB9JtqJH2Y-jOPHDK0tdBjtmJK8v74",[1032,1034],{"title":10,"path":6,"stem":7,"description":1033,"children":-1},"Install the package. Load a chain. Get a wallet out in five lines.",{"title":16,"path":17,"stem":18,"description":1035,"children":-1},"Turn a public key into an address. Pick a format. Check one you were given.",1789795655690]