[{"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. SegWit v0 and the P2SH form take the compressed key only, as BIP143 requires, so an uncompressed key there throws, while taproot keeps just the x coordinate and takes either. 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},"Zq8tGC4V_f3csyCStWv6hSPVc66gMDY2WWvtlC9gQaw",[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.",1789827526012]