[{"data":1,"prerenderedAt":1821},["ShallowReactive",2],{"navigation_docs":3,"-guide-custom":84,"-guide-custom-surround":1816},[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":28,"body":86,"description":1809,"extension":1810,"links":1811,"meta":1812,"navigation":539,"path":29,"seo":1814,"stem":30,"__hash__":1815},"docs\u002F1.guide\u002F6.custom.md",{"type":87,"value":88,"toc":1800},"minimark",[89,94,165,169,266,270,274,1232,1238,1242,1344,1350,1354,1364,1401,1408,1412,1418,1737,1762,1765,1769,1796],[90,91,93],"h2",{"id":92},"three-bases","Three bases",[95,96,97,130,141],"ul",{},[98,99,100,104,105,108,109,108,112,108,115,118,119,122,123,125,126,129],"li",{},[101,102,103],"code",{},"AbstractBlockchain"," gives you private key generation, key pairs, ",[101,106,107],{},"deriveWallet",", ",[101,110,111],{},"generateWallet",[101,113,114],{},"deriveHDWallet",[101,116,117],{},"getDerivationPath",", and the ",[101,120,121],{},"network"," option. You bring the chain rules. ",[101,124,117],{}," is BIP44 from your ",[101,127,128],{},"bip44","; override it when the chain's wallets walk another shape, the way Solana, Stellar, Aptos, Sui and Cardano do.",[98,131,132,135,136,140],{},[101,133,134],{},"AbstractEVMBlockchain"," has all the chain rules filled in for the EVM. See ",[137,138,139],"a",{"href":25},"EVM chains"," if that's what you're adding.",[98,142,143,146,147,150,151,154,155,154,157,160,161,164],{},[101,144,145],{},"AbstractBitcoinBlockchain"," in ",[101,148,149],{},"src\u002Futils\u002Fbitcoin.ts"," is what Bitcoin and Litecoin share: the five address formats, validation, purpose inference on HD paths and Core style message hashing. A subclass brings a ",[101,152,153],{},"name",", a ",[101,156,128],{},[101,158,159],{},"messagePreamble"," and a ",[101,162,163],{},"params"," getter with the version bytes and the bech32 prefix. It isn't exported from the package yet, so it's for drivers inside this repo.",[90,166,168],{"id":167},"what-a-direct-subclass-has-to-provide","What a direct subclass has to provide",[170,171,172,185],"table",{},[173,174,175],"thead",{},[176,177,178,182],"tr",{},[179,180,181],"th",{},"Member",[179,183,184],{},"What it is",[186,187,188,198,214,223,233,243,253],"tbody",{},[176,189,190,195],{},[191,192,193],"td",{},[101,194,153],{},[191,196,197],{},"lowercase identifier, also the key in the lazy loader",[176,199,200,205],{},[191,201,202],{},[101,203,204],{},"curve",[191,206,207,108,210,213],{},[101,208,209],{},"\"secp256k1\"",[101,211,212],{},"\"ed25519\"",", or a readonly array if the chain takes both",[176,215,216,220],{},[191,217,218],{},[101,219,128],{},[191,221,222],{},"SLIP-0044 coin type",[176,224,225,230],{},[191,226,227],{},[101,228,229],{},"getKeyPublic",[191,231,232],{},"public key from a private key",[176,234,235,240],{},[191,236,237],{},[101,238,239],{},"getAddress",[191,241,242],{},"address from a public key, plus an optional type",[176,244,245,250],{},[191,246,247],{},[101,248,249],{},"validateAddress",[191,251,252],{},"format and checksum check",[176,254,255,263],{},[191,256,257,108,260],{},[101,258,259],{},"signMessage",[101,261,262],{},"verifyMessage",[191,264,265],{},"message signatures",[90,267,269],{"id":268},"a-full-example","A full example",[271,272,273],"p",{},"A base58check chain with a made up version byte. Every helper here already exists in the package, so the class is mostly glue:",[275,276,281],"pre",{"className":277,"code":278,"language":279,"meta":280,"style":280},"language-ts shiki shiki-themes github-light github-light poimandres","\u002F\u002F src\u002Fblockchains\u002Fmychain.ts\nimport { ripemd160 } from \"@noble\u002Fhashes\u002Flegacy.js\";\nimport { sha256 } from \"@noble\u002Fhashes\u002Fsha2.js\";\nimport { hexToBytes } from \"@noble\u002Fhashes\u002Futils.js\";\nimport { AbstractBlockchain } from \"..\u002Fblockchain.ts\";\nimport { encodeBase58Check, validateBase58Check } from \"..\u002Futils\u002Fencoding.ts\";\nimport { generateKeyPublic } from \"..\u002Futils\u002Fsecp256k1.ts\";\nimport {\n  signMessage as genericSignMessage,\n  verifyMessage as genericVerifyMessage,\n} from \"..\u002Futils\u002Fsigning.ts\";\nimport type { Curve, KeyOptions } from \"..\u002Ftypes.ts\";\n\nconst ADDRESS_VERSION = 0x34;\n\nexport class MyChain extends AbstractBlockchain {\n  override readonly name = \"mychain\";\n  override readonly curve: Curve = \"secp256k1\";\n  override readonly bip44 = 1234;\n\n  override getKeyPublic(keyPrivate: string, options?: KeyOptions): string {\n    return generateKeyPublic(keyPrivate, options);\n  }\n\n  override getAddress(keyPublic: string): string {\n    const publicKey = hexToBytes(keyPublic);\n    const hash = ripemd160(sha256(publicKey));\n    const payload = new Uint8Array(hash.length + 1);\n    payload[0] = ADDRESS_VERSION;\n    payload.set(hash, 1);\n    return encodeBase58Check(payload);\n  }\n\n  override validateAddress(address: string): boolean {\n    return validateBase58Check(address, ADDRESS_VERSION);\n  }\n\n  override signMessage(\n    message: string | Uint8Array,\n    keyPrivate: string,\n    options?: KeyOptions,\n  ): string {\n    return genericSignMessage(message, keyPrivate, {\n      curve: \"secp256k1\",\n      ...options,\n    });\n  }\n\n  override verifyMessage(\n    message: string | Uint8Array,\n    signature: string,\n    keyPublic: string,\n    options?: KeyOptions,\n  ): boolean {\n    return genericVerifyMessage(message, signature, keyPublic, {\n      curve: \"secp256k1\",\n      ...options,\n    });\n  }\n}\n\nexport default MyChain;\n","ts","",[101,282,283,292,328,351,374,397,426,449,457,473,486,503,534,541,561,566,586,610,637,654,659,699,721,727,732,757,776,801,836,858,879,893,898,903,929,947,952,957,968,985,997,1009,1021,1040,1056,1066,1072,1077,1082,1092,1107,1119,1131,1142,1153,1175,1190,1199,1204,1209,1215,1220],{"__ignoreMap":280},[284,285,288],"span",{"class":286,"line":287},"line",1,[284,289,291],{"class":290},"sjhu3","\u002F\u002F src\u002Fblockchains\u002Fmychain.ts\n",[284,293,295,299,303,307,310,314,318,322,325],{"class":286,"line":294},2,[284,296,298],{"class":297},"sP0CR","import",[284,300,302],{"class":301},"sKlNE"," {",[284,304,306],{"class":305},"snHMy"," ripemd160",[284,308,309],{"class":301}," }",[284,311,313],{"class":312},"stCPd"," from",[284,315,317],{"class":316},"scVjq"," \"",[284,319,321],{"class":320},"sQ7BG","@noble\u002Fhashes\u002Flegacy.js",[284,323,324],{"class":316},"\"",[284,326,327],{"class":301},";\n",[284,329,331,333,335,338,340,342,344,347,349],{"class":286,"line":330},3,[284,332,298],{"class":297},[284,334,302],{"class":301},[284,336,337],{"class":305}," sha256",[284,339,309],{"class":301},[284,341,313],{"class":312},[284,343,317],{"class":316},[284,345,346],{"class":320},"@noble\u002Fhashes\u002Fsha2.js",[284,348,324],{"class":316},[284,350,327],{"class":301},[284,352,354,356,358,361,363,365,367,370,372],{"class":286,"line":353},4,[284,355,298],{"class":297},[284,357,302],{"class":301},[284,359,360],{"class":305}," hexToBytes",[284,362,309],{"class":301},[284,364,313],{"class":312},[284,366,317],{"class":316},[284,368,369],{"class":320},"@noble\u002Fhashes\u002Futils.js",[284,371,324],{"class":316},[284,373,327],{"class":301},[284,375,377,379,381,384,386,388,390,393,395],{"class":286,"line":376},5,[284,378,298],{"class":297},[284,380,302],{"class":301},[284,382,383],{"class":305}," AbstractBlockchain",[284,385,309],{"class":301},[284,387,313],{"class":312},[284,389,317],{"class":316},[284,391,392],{"class":320},"..\u002Fblockchain.ts",[284,394,324],{"class":316},[284,396,327],{"class":301},[284,398,400,402,404,407,410,413,415,417,419,422,424],{"class":286,"line":399},6,[284,401,298],{"class":297},[284,403,302],{"class":301},[284,405,406],{"class":305}," encodeBase58Check",[284,408,409],{"class":301},",",[284,411,412],{"class":305}," validateBase58Check",[284,414,309],{"class":301},[284,416,313],{"class":312},[284,418,317],{"class":316},[284,420,421],{"class":320},"..\u002Futils\u002Fencoding.ts",[284,423,324],{"class":316},[284,425,327],{"class":301},[284,427,429,431,433,436,438,440,442,445,447],{"class":286,"line":428},7,[284,430,298],{"class":297},[284,432,302],{"class":301},[284,434,435],{"class":305}," generateKeyPublic",[284,437,309],{"class":301},[284,439,313],{"class":312},[284,441,317],{"class":316},[284,443,444],{"class":320},"..\u002Futils\u002Fsecp256k1.ts",[284,446,324],{"class":316},[284,448,327],{"class":301},[284,450,452,454],{"class":286,"line":451},8,[284,453,298],{"class":297},[284,455,456],{"class":301}," {\n",[284,458,460,463,467,470],{"class":286,"line":459},9,[284,461,462],{"class":305},"  signMessage",[284,464,466],{"class":465},"sp-LQ"," as",[284,468,469],{"class":305}," genericSignMessage",[284,471,472],{"class":301},",\n",[284,474,476,479,481,484],{"class":286,"line":475},10,[284,477,478],{"class":305},"  verifyMessage",[284,480,466],{"class":465},[284,482,483],{"class":305}," genericVerifyMessage",[284,485,472],{"class":301},[284,487,489,492,494,496,499,501],{"class":286,"line":488},11,[284,490,491],{"class":301},"}",[284,493,313],{"class":312},[284,495,317],{"class":316},[284,497,498],{"class":320},"..\u002Futils\u002Fsigning.ts",[284,500,324],{"class":316},[284,502,327],{"class":301},[284,504,506,508,511,513,516,518,521,523,525,527,530,532],{"class":286,"line":505},12,[284,507,298],{"class":297},[284,509,510],{"class":312}," type",[284,512,302],{"class":301},[284,514,515],{"class":305}," Curve",[284,517,409],{"class":301},[284,519,520],{"class":305}," KeyOptions",[284,522,309],{"class":301},[284,524,313],{"class":312},[284,526,317],{"class":316},[284,528,529],{"class":320},"..\u002Ftypes.ts",[284,531,324],{"class":316},[284,533,327],{"class":301},[284,535,537],{"class":286,"line":536},13,[284,538,540],{"emptyLinePlaceholder":539},true,"\n",[284,542,544,548,552,555,559],{"class":286,"line":543},14,[284,545,547],{"class":546},"s1TYA","const",[284,549,551],{"class":550},"saoiD"," ADDRESS_VERSION",[284,553,554],{"class":546}," =",[284,556,558],{"class":557},"siHFe"," 0x34",[284,560,327],{"class":301},[284,562,564],{"class":286,"line":563},15,[284,565,540],{"emptyLinePlaceholder":539},[284,567,569,572,575,579,582,584],{"class":286,"line":568},16,[284,570,571],{"class":297},"export",[284,573,574],{"class":546}," class",[284,576,578],{"class":577},"scZRh"," MyChain",[284,580,581],{"class":297}," extends",[284,583,383],{"class":577},[284,585,456],{"class":301},[284,587,589,592,595,599,601,603,606,608],{"class":286,"line":588},17,[284,590,591],{"class":297},"  override",[284,593,594],{"class":297}," readonly",[284,596,598],{"class":597},"s0VbO"," name",[284,600,554],{"class":546},[284,602,317],{"class":316},[284,604,605],{"class":320},"mychain",[284,607,324],{"class":316},[284,609,327],{"class":301},[284,611,613,615,617,620,623,626,628,630,633,635],{"class":286,"line":612},18,[284,614,591],{"class":297},[284,616,594],{"class":297},[284,618,619],{"class":597}," curve",[284,621,622],{"class":546},":",[284,624,515],{"class":625},"sCrqT",[284,627,554],{"class":546},[284,629,317],{"class":316},[284,631,632],{"class":320},"secp256k1",[284,634,324],{"class":316},[284,636,327],{"class":301},[284,638,640,642,644,647,649,652],{"class":286,"line":639},19,[284,641,591],{"class":297},[284,643,594],{"class":297},[284,645,646],{"class":597}," bip44",[284,648,554],{"class":546},[284,650,651],{"class":557}," 1234",[284,653,327],{"class":301},[284,655,657],{"class":286,"line":656},20,[284,658,540],{"emptyLinePlaceholder":539},[284,660,662,664,667,670,674,676,680,682,685,688,690,693,695,697],{"class":286,"line":661},21,[284,663,591],{"class":297},[284,665,666],{"class":577}," getKeyPublic",[284,668,669],{"class":301},"(",[284,671,673],{"class":672},"s1jWp","keyPrivate",[284,675,622],{"class":546},[284,677,679],{"class":678},"s8yaW"," string",[284,681,108],{"class":301},[284,683,684],{"class":672},"options",[284,686,687],{"class":546},"?:",[284,689,520],{"class":625},[284,691,692],{"class":301},")",[284,694,622],{"class":546},[284,696,679],{"class":678},[284,698,456],{"class":301},[284,700,702,706,709,711,714,716,718],{"class":286,"line":701},22,[284,703,705],{"class":704},"sZW6a","    return",[284,707,435],{"class":708},"sULi6",[284,710,669],{"class":301},[284,712,673],{"class":713},"spVlQ",[284,715,108],{"class":301},[284,717,684],{"class":713},[284,719,720],{"class":301},");\n",[284,722,724],{"class":286,"line":723},23,[284,725,726],{"class":301},"  }\n",[284,728,730],{"class":286,"line":729},24,[284,731,540],{"emptyLinePlaceholder":539},[284,733,735,737,740,742,745,747,749,751,753,755],{"class":286,"line":734},25,[284,736,591],{"class":297},[284,738,739],{"class":577}," getAddress",[284,741,669],{"class":301},[284,743,744],{"class":672},"keyPublic",[284,746,622],{"class":546},[284,748,679],{"class":678},[284,750,692],{"class":301},[284,752,622],{"class":546},[284,754,679],{"class":678},[284,756,456],{"class":301},[284,758,760,763,766,768,770,772,774],{"class":286,"line":759},26,[284,761,762],{"class":546},"    const",[284,764,765],{"class":550}," publicKey",[284,767,554],{"class":546},[284,769,360],{"class":708},[284,771,669],{"class":301},[284,773,744],{"class":713},[284,775,720],{"class":301},[284,777,779,781,784,786,788,790,793,795,798],{"class":286,"line":778},27,[284,780,762],{"class":546},[284,782,783],{"class":550}," hash",[284,785,554],{"class":546},[284,787,306],{"class":708},[284,789,669],{"class":301},[284,791,792],{"class":708},"sha256",[284,794,669],{"class":301},[284,796,797],{"class":713},"publicKey",[284,799,800],{"class":301},"));\n",[284,802,804,806,809,811,814,817,819,822,825,828,831,834],{"class":286,"line":803},28,[284,805,762],{"class":546},[284,807,808],{"class":550}," payload",[284,810,554],{"class":546},[284,812,813],{"class":297}," new",[284,815,816],{"class":708}," Uint8Array",[284,818,669],{"class":301},[284,820,821],{"class":713},"hash",[284,823,824],{"class":301},".",[284,826,827],{"class":550},"length",[284,829,830],{"class":546}," +",[284,832,833],{"class":557}," 1",[284,835,720],{"class":301},[284,837,839,842,845,848,851,854,856],{"class":286,"line":838},29,[284,840,841],{"class":713},"    payload",[284,843,844],{"class":301},"[",[284,846,847],{"class":557},"0",[284,849,850],{"class":301},"] ",[284,852,853],{"class":546},"=",[284,855,551],{"class":550},[284,857,327],{"class":301},[284,859,861,863,865,868,870,872,874,877],{"class":286,"line":860},30,[284,862,841],{"class":713},[284,864,824],{"class":301},[284,866,867],{"class":708},"set",[284,869,669],{"class":301},[284,871,821],{"class":713},[284,873,108],{"class":301},[284,875,876],{"class":557},"1",[284,878,720],{"class":301},[284,880,882,884,886,888,891],{"class":286,"line":881},31,[284,883,705],{"class":704},[284,885,406],{"class":708},[284,887,669],{"class":301},[284,889,890],{"class":713},"payload",[284,892,720],{"class":301},[284,894,896],{"class":286,"line":895},32,[284,897,726],{"class":301},[284,899,901],{"class":286,"line":900},33,[284,902,540],{"emptyLinePlaceholder":539},[284,904,906,908,911,913,916,918,920,922,924,927],{"class":286,"line":905},34,[284,907,591],{"class":297},[284,909,910],{"class":577}," validateAddress",[284,912,669],{"class":301},[284,914,915],{"class":672},"address",[284,917,622],{"class":546},[284,919,679],{"class":678},[284,921,692],{"class":301},[284,923,622],{"class":546},[284,925,926],{"class":678}," boolean",[284,928,456],{"class":301},[284,930,932,934,936,938,940,942,945],{"class":286,"line":931},35,[284,933,705],{"class":704},[284,935,412],{"class":708},[284,937,669],{"class":301},[284,939,915],{"class":713},[284,941,108],{"class":301},[284,943,944],{"class":550},"ADDRESS_VERSION",[284,946,720],{"class":301},[284,948,950],{"class":286,"line":949},36,[284,951,726],{"class":301},[284,953,955],{"class":286,"line":954},37,[284,956,540],{"emptyLinePlaceholder":539},[284,958,960,962,965],{"class":286,"line":959},38,[284,961,591],{"class":297},[284,963,964],{"class":577}," signMessage",[284,966,967],{"class":301},"(\n",[284,969,971,974,976,978,981,983],{"class":286,"line":970},39,[284,972,973],{"class":672},"    message",[284,975,622],{"class":546},[284,977,679],{"class":678},[284,979,980],{"class":546}," |",[284,982,816],{"class":625},[284,984,472],{"class":301},[284,986,988,991,993,995],{"class":286,"line":987},40,[284,989,990],{"class":672},"    keyPrivate",[284,992,622],{"class":546},[284,994,679],{"class":678},[284,996,472],{"class":301},[284,998,1000,1003,1005,1007],{"class":286,"line":999},41,[284,1001,1002],{"class":672},"    options",[284,1004,687],{"class":546},[284,1006,520],{"class":625},[284,1008,472],{"class":301},[284,1010,1012,1015,1017,1019],{"class":286,"line":1011},42,[284,1013,1014],{"class":301},"  )",[284,1016,622],{"class":546},[284,1018,679],{"class":678},[284,1020,456],{"class":301},[284,1022,1024,1026,1028,1030,1033,1035,1037],{"class":286,"line":1023},43,[284,1025,705],{"class":704},[284,1027,469],{"class":708},[284,1029,669],{"class":301},[284,1031,1032],{"class":713},"message",[284,1034,108],{"class":301},[284,1036,673],{"class":713},[284,1038,1039],{"class":301},", {\n",[284,1041,1043,1046,1048,1050,1052,1054],{"class":286,"line":1042},44,[284,1044,1045],{"class":305},"      curve",[284,1047,622],{"class":301},[284,1049,317],{"class":316},[284,1051,632],{"class":320},[284,1053,324],{"class":316},[284,1055,472],{"class":301},[284,1057,1059,1062,1064],{"class":286,"line":1058},45,[284,1060,1061],{"class":546},"      ...",[284,1063,684],{"class":713},[284,1065,472],{"class":301},[284,1067,1069],{"class":286,"line":1068},46,[284,1070,1071],{"class":301},"    });\n",[284,1073,1075],{"class":286,"line":1074},47,[284,1076,726],{"class":301},[284,1078,1080],{"class":286,"line":1079},48,[284,1081,540],{"emptyLinePlaceholder":539},[284,1083,1085,1087,1090],{"class":286,"line":1084},49,[284,1086,591],{"class":297},[284,1088,1089],{"class":577}," verifyMessage",[284,1091,967],{"class":301},[284,1093,1095,1097,1099,1101,1103,1105],{"class":286,"line":1094},50,[284,1096,973],{"class":672},[284,1098,622],{"class":546},[284,1100,679],{"class":678},[284,1102,980],{"class":546},[284,1104,816],{"class":625},[284,1106,472],{"class":301},[284,1108,1110,1113,1115,1117],{"class":286,"line":1109},51,[284,1111,1112],{"class":672},"    signature",[284,1114,622],{"class":546},[284,1116,679],{"class":678},[284,1118,472],{"class":301},[284,1120,1122,1125,1127,1129],{"class":286,"line":1121},52,[284,1123,1124],{"class":672},"    keyPublic",[284,1126,622],{"class":546},[284,1128,679],{"class":678},[284,1130,472],{"class":301},[284,1132,1134,1136,1138,1140],{"class":286,"line":1133},53,[284,1135,1002],{"class":672},[284,1137,687],{"class":546},[284,1139,520],{"class":625},[284,1141,472],{"class":301},[284,1143,1145,1147,1149,1151],{"class":286,"line":1144},54,[284,1146,1014],{"class":301},[284,1148,622],{"class":546},[284,1150,926],{"class":678},[284,1152,456],{"class":301},[284,1154,1156,1158,1160,1162,1164,1166,1169,1171,1173],{"class":286,"line":1155},55,[284,1157,705],{"class":704},[284,1159,483],{"class":708},[284,1161,669],{"class":301},[284,1163,1032],{"class":713},[284,1165,108],{"class":301},[284,1167,1168],{"class":713},"signature",[284,1170,108],{"class":301},[284,1172,744],{"class":713},[284,1174,1039],{"class":301},[284,1176,1178,1180,1182,1184,1186,1188],{"class":286,"line":1177},56,[284,1179,1045],{"class":305},[284,1181,622],{"class":301},[284,1183,317],{"class":316},[284,1185,632],{"class":320},[284,1187,324],{"class":316},[284,1189,472],{"class":301},[284,1191,1193,1195,1197],{"class":286,"line":1192},57,[284,1194,1061],{"class":546},[284,1196,684],{"class":713},[284,1198,472],{"class":301},[284,1200,1202],{"class":286,"line":1201},58,[284,1203,1071],{"class":301},[284,1205,1207],{"class":286,"line":1206},59,[284,1208,726],{"class":301},[284,1210,1212],{"class":286,"line":1211},60,[284,1213,1214],{"class":301},"}\n",[284,1216,1218],{"class":286,"line":1217},61,[284,1219,540],{"emptyLinePlaceholder":539},[284,1221,1223,1225,1228,1230],{"class":286,"line":1222},62,[284,1224,571],{"class":297},[284,1226,1227],{"class":297}," default",[284,1229,578],{"class":713},[284,1231,327],{"class":301},[271,1233,1234,1237],{},[101,1235,1236],{},"1234"," is a placeholder. A real chain uses its registered SLIP-0044 number, and if it doesn't have one, that's a conversation to have upstream before shipping a driver.",[90,1239,1241],{"id":1240},"using-it","Using it",[275,1243,1245],{"className":277,"code":1244,"language":279,"meta":280,"style":280},"import { useBlockchain } from \"@agntn\u002Fkeys\";\nimport MyChain from \"@agntn\u002Fkeys\u002Fblockchains\u002Fmychain\";\n\nconst chain = useBlockchain(new MyChain({ network: \"testnet\" }));\nconst wallet = chain.generateWallet();\n",[101,1246,1247,1269,1286,1290,1326],{"__ignoreMap":280},[284,1248,1249,1251,1253,1256,1258,1260,1262,1265,1267],{"class":286,"line":287},[284,1250,298],{"class":297},[284,1252,302],{"class":301},[284,1254,1255],{"class":305}," useBlockchain",[284,1257,309],{"class":301},[284,1259,313],{"class":312},[284,1261,317],{"class":316},[284,1263,1264],{"class":320},"@agntn\u002Fkeys",[284,1266,324],{"class":316},[284,1268,327],{"class":301},[284,1270,1271,1273,1275,1277,1279,1282,1284],{"class":286,"line":294},[284,1272,298],{"class":297},[284,1274,578],{"class":305},[284,1276,313],{"class":312},[284,1278,317],{"class":316},[284,1280,1281],{"class":320},"@agntn\u002Fkeys\u002Fblockchains\u002Fmychain",[284,1283,324],{"class":316},[284,1285,327],{"class":301},[284,1287,1288],{"class":286,"line":330},[284,1289,540],{"emptyLinePlaceholder":539},[284,1291,1292,1294,1297,1299,1301,1303,1306,1308,1311,1314,1316,1318,1321,1323],{"class":286,"line":353},[284,1293,547],{"class":546},[284,1295,1296],{"class":550}," chain",[284,1298,554],{"class":546},[284,1300,1255],{"class":708},[284,1302,669],{"class":301},[284,1304,1305],{"class":297},"new",[284,1307,578],{"class":708},[284,1309,1310],{"class":301},"({",[284,1312,1313],{"class":305}," network",[284,1315,622],{"class":301},[284,1317,317],{"class":316},[284,1319,1320],{"class":320},"testnet",[284,1322,324],{"class":316},[284,1324,1325],{"class":301}," }));\n",[284,1327,1328,1330,1333,1335,1337,1339,1341],{"class":286,"line":376},[284,1329,547],{"class":546},[284,1331,1332],{"class":550}," wallet",[284,1334,554],{"class":546},[284,1336,1296],{"class":713},[284,1338,824],{"class":301},[284,1340,111],{"class":708},[284,1342,1343],{"class":301},"();\n",[271,1345,1346,1349],{},[101,1347,1348],{},"useBlockchain"," returns the same instance with its concrete type intact. It exists so the lazy loader and a direct import produce the same thing.",[90,1351,1353],{"id":1352},"registering-it","Registering it",[271,1355,1356,1357,1360,1361,622],{},"Add one line inside the ",[101,1358,1359],{},"blockchains"," object in ",[101,1362,1363],{},"src\u002F_blockchains.ts",[275,1365,1367],{"className":277,"code":1366,"language":279,"meta":280,"style":280},"mychain: lazy(() => import(\".\u002Fblockchains\u002Fmychain.ts\")),\n",[101,1368,1369],{"__ignoreMap":280},[284,1370,1371,1374,1377,1380,1383,1386,1389,1391,1393,1396,1398],{"class":286,"line":287},[284,1372,605],{"class":1373},"sseY5",[284,1375,1376],{"class":301},": ",[284,1378,1379],{"class":708},"lazy",[284,1381,1382],{"class":301},"(() ",[284,1384,1385],{"class":546},"=>",[284,1387,1388],{"class":546}," import",[284,1390,669],{"class":301},[284,1392,324],{"class":316},[284,1394,1395],{"class":320},".\u002Fblockchains\u002Fmychain.ts",[284,1397,324],{"class":316},[284,1399,1400],{"class":301},")),\n",[271,1402,1403,1404,1407],{},"From then on ",[101,1405,1406],{},"await blockchains.mychain({ network: \"testnet\" })()"," loads and constructs it like every other chain.",[90,1409,1411],{"id":1410},"testing-it","Testing it",[271,1413,1414,1415,622],{},"Mirror the source path under ",[101,1416,1417],{},"test\u002F",[275,1419,1421],{"className":277,"code":1420,"language":279,"meta":280,"style":280},"\u002F\u002F test\u002Fblockchains\u002Fmychain.test.ts\nimport { describe, expect, it } from \"vitest\";\nimport { useBlockchain } from \"..\u002F..\u002Fsrc\";\nimport MyChain from \"..\u002F..\u002Fsrc\u002Fblockchains\u002Fmychain\";\n\ndescribe(\"MyChain\", () => {\n  const blockchain = useBlockchain(new MyChain());\n\n  it(\"exposes its chain metadata\", () => {\n    expect(blockchain.name).toBe(\"mychain\");\n    expect(blockchain.curve).toBe(\"secp256k1\");\n    expect(blockchain.network).toBe(\"mainnet\");\n  });\n\n  it(\"generates self validating wallets\", () => {\n    const wallet = blockchain.generateWallet();\n    expect(blockchain.validateAddress(wallet.address)).toBe(true);\n  });\n});\n",[101,1422,1423,1428,1460,1481,1498,1502,1523,1544,1548,1568,1598,1624,1651,1656,1660,1679,1695,1728,1732],{"__ignoreMap":280},[284,1424,1425],{"class":286,"line":287},[284,1426,1427],{"class":290},"\u002F\u002F test\u002Fblockchains\u002Fmychain.test.ts\n",[284,1429,1430,1432,1434,1437,1439,1442,1444,1447,1449,1451,1453,1456,1458],{"class":286,"line":294},[284,1431,298],{"class":297},[284,1433,302],{"class":301},[284,1435,1436],{"class":305}," describe",[284,1438,409],{"class":301},[284,1440,1441],{"class":305}," expect",[284,1443,409],{"class":301},[284,1445,1446],{"class":305}," it",[284,1448,309],{"class":301},[284,1450,313],{"class":312},[284,1452,317],{"class":316},[284,1454,1455],{"class":320},"vitest",[284,1457,324],{"class":316},[284,1459,327],{"class":301},[284,1461,1462,1464,1466,1468,1470,1472,1474,1477,1479],{"class":286,"line":330},[284,1463,298],{"class":297},[284,1465,302],{"class":301},[284,1467,1255],{"class":305},[284,1469,309],{"class":301},[284,1471,313],{"class":312},[284,1473,317],{"class":316},[284,1475,1476],{"class":320},"..\u002F..\u002Fsrc",[284,1478,324],{"class":316},[284,1480,327],{"class":301},[284,1482,1483,1485,1487,1489,1491,1494,1496],{"class":286,"line":353},[284,1484,298],{"class":297},[284,1486,578],{"class":305},[284,1488,313],{"class":312},[284,1490,317],{"class":316},[284,1492,1493],{"class":320},"..\u002F..\u002Fsrc\u002Fblockchains\u002Fmychain",[284,1495,324],{"class":316},[284,1497,327],{"class":301},[284,1499,1500],{"class":286,"line":376},[284,1501,540],{"emptyLinePlaceholder":539},[284,1503,1504,1507,1509,1511,1514,1516,1519,1521],{"class":286,"line":399},[284,1505,1506],{"class":708},"describe",[284,1508,669],{"class":301},[284,1510,324],{"class":316},[284,1512,1513],{"class":320},"MyChain",[284,1515,324],{"class":316},[284,1517,1518],{"class":301},", () ",[284,1520,1385],{"class":546},[284,1522,456],{"class":301},[284,1524,1525,1528,1531,1533,1535,1537,1539,1541],{"class":286,"line":428},[284,1526,1527],{"class":546},"  const",[284,1529,1530],{"class":550}," blockchain",[284,1532,554],{"class":546},[284,1534,1255],{"class":708},[284,1536,669],{"class":301},[284,1538,1305],{"class":297},[284,1540,578],{"class":708},[284,1542,1543],{"class":301},"());\n",[284,1545,1546],{"class":286,"line":451},[284,1547,540],{"emptyLinePlaceholder":539},[284,1549,1550,1553,1555,1557,1560,1562,1564,1566],{"class":286,"line":459},[284,1551,1552],{"class":708},"  it",[284,1554,669],{"class":301},[284,1556,324],{"class":316},[284,1558,1559],{"class":320},"exposes its chain metadata",[284,1561,324],{"class":316},[284,1563,1518],{"class":301},[284,1565,1385],{"class":546},[284,1567,456],{"class":301},[284,1569,1570,1573,1575,1578,1580,1582,1585,1588,1590,1592,1594,1596],{"class":286,"line":475},[284,1571,1572],{"class":708},"    expect",[284,1574,669],{"class":301},[284,1576,1577],{"class":713},"blockchain",[284,1579,824],{"class":301},[284,1581,153],{"class":713},[284,1583,1584],{"class":301},").",[284,1586,1587],{"class":708},"toBe",[284,1589,669],{"class":301},[284,1591,324],{"class":316},[284,1593,605],{"class":320},[284,1595,324],{"class":316},[284,1597,720],{"class":301},[284,1599,1600,1602,1604,1606,1608,1610,1612,1614,1616,1618,1620,1622],{"class":286,"line":488},[284,1601,1572],{"class":708},[284,1603,669],{"class":301},[284,1605,1577],{"class":713},[284,1607,824],{"class":301},[284,1609,204],{"class":713},[284,1611,1584],{"class":301},[284,1613,1587],{"class":708},[284,1615,669],{"class":301},[284,1617,324],{"class":316},[284,1619,632],{"class":320},[284,1621,324],{"class":316},[284,1623,720],{"class":301},[284,1625,1626,1628,1630,1632,1634,1636,1638,1640,1642,1644,1647,1649],{"class":286,"line":505},[284,1627,1572],{"class":708},[284,1629,669],{"class":301},[284,1631,1577],{"class":713},[284,1633,824],{"class":301},[284,1635,121],{"class":713},[284,1637,1584],{"class":301},[284,1639,1587],{"class":708},[284,1641,669],{"class":301},[284,1643,324],{"class":316},[284,1645,1646],{"class":320},"mainnet",[284,1648,324],{"class":316},[284,1650,720],{"class":301},[284,1652,1653],{"class":286,"line":536},[284,1654,1655],{"class":301},"  });\n",[284,1657,1658],{"class":286,"line":543},[284,1659,540],{"emptyLinePlaceholder":539},[284,1661,1662,1664,1666,1668,1671,1673,1675,1677],{"class":286,"line":563},[284,1663,1552],{"class":708},[284,1665,669],{"class":301},[284,1667,324],{"class":316},[284,1669,1670],{"class":320},"generates self validating wallets",[284,1672,324],{"class":316},[284,1674,1518],{"class":301},[284,1676,1385],{"class":546},[284,1678,456],{"class":301},[284,1680,1681,1683,1685,1687,1689,1691,1693],{"class":286,"line":568},[284,1682,762],{"class":546},[284,1684,1332],{"class":550},[284,1686,554],{"class":546},[284,1688,1530],{"class":713},[284,1690,824],{"class":301},[284,1692,111],{"class":708},[284,1694,1343],{"class":301},[284,1696,1697,1699,1701,1703,1705,1707,1709,1712,1714,1716,1719,1721,1723,1726],{"class":286,"line":588},[284,1698,1572],{"class":708},[284,1700,669],{"class":301},[284,1702,1577],{"class":713},[284,1704,824],{"class":301},[284,1706,249],{"class":708},[284,1708,669],{"class":301},[284,1710,1711],{"class":713},"wallet",[284,1713,824],{"class":301},[284,1715,915],{"class":713},[284,1717,1718],{"class":301},")).",[284,1720,1587],{"class":708},[284,1722,669],{"class":301},[284,1724,1725],{"class":557},"true",[284,1727,720],{"class":301},[284,1729,1730],{"class":286,"line":612},[284,1731,1655],{"class":301},[284,1733,1734],{"class":286,"line":639},[284,1735,1736],{"class":301},"});\n",[275,1738,1742],{"className":1739,"code":1740,"language":1741,"meta":280,"style":280},"language-bash shiki shiki-themes github-light github-light poimandres","pnpm exec vitest run test\u002Fblockchains\u002Fmychain.test.ts\n","bash",[101,1743,1744],{"__ignoreMap":280},[284,1745,1746,1749,1753,1756,1759],{"class":286,"line":287},[284,1747,1748],{"class":1373},"pnpm",[284,1750,1752],{"class":1751},"sX7Zv"," exec",[284,1754,1755],{"class":1751}," vitest",[284,1757,1758],{"class":1751}," run",[284,1760,1761],{"class":1751}," test\u002Fblockchains\u002Fmychain.test.ts\n",[271,1763,1764],{},"Self validating wallets are the minimum. Before the driver is worth merging it also needs a published test vector: a known key with the address the chain's own tooling produces for it. Without that you're testing that your encoder agrees with your decoder, which proves nothing.",[90,1766,1768],{"id":1767},"rules-of-the-house","Rules of the house",[1770,1771,1772,1783,1790,1793],"ol",{},[98,1773,1774,1775,1778,1779,1782],{},"Reuse the ",[101,1776,1777],{},"@noble"," and ",[101,1780,1781],{},"@scure"," helpers already in the package. A second crypto implementation is a review rejection, not a style preference.",[98,1784,1785,1786,1789],{},"Keep network parameters in one record and read ",[101,1787,1788],{},"this.network",". Conditionals spread across methods drift.",[98,1791,1792],{},"Export the class by name and as default.",[98,1794,1795],{},"Register it in the lazy loader and mirror the path in tests.",[1797,1798,1799],"style",{},"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 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 .sp-LQ, html code.shiki .sp-LQ{--shiki-light:#D73A49;--shiki-default:#D73A49;--shiki-dark:#A6ACCDC0}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 .siHFe, html code.shiki .siHFe{--shiki-light:#005CC5;--shiki-default:#005CC5;--shiki-dark:#5DE4C7}html pre.shiki code .scZRh, html code.shiki .scZRh{--shiki-light:#6F42C1;--shiki-default:#6F42C1;--shiki-dark:#ADD7FF}html pre.shiki code .s0VbO, html code.shiki .s0VbO{--shiki-light:#E36209;--shiki-default:#E36209;--shiki-dark:#A6ACCD}html pre.shiki code .sCrqT, html code.shiki .sCrqT{--shiki-light:#6F42C1;--shiki-default:#6F42C1;--shiki-dark:#A6ACCDC0}html pre.shiki code .s1jWp, html code.shiki .s1jWp{--shiki-light:#E36209;--shiki-default:#E36209;--shiki-dark:#E4F0FB}html pre.shiki code .s8yaW, html code.shiki .s8yaW{--shiki-light:#005CC5;--shiki-default:#005CC5;--shiki-dark:#A6ACCDC0}html pre.shiki code .sZW6a, html code.shiki .sZW6a{--shiki-light:#D73A49;--shiki-default:#D73A49;--shiki-dark:#5DE4C7C0}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 .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 .sseY5, html code.shiki .sseY5{--shiki-light:#6F42C1;--shiki-default:#6F42C1;--shiki-dark:#91B4D5}html pre.shiki code .sX7Zv, html code.shiki .sX7Zv{--shiki-light:#032F62;--shiki-default:#032F62;--shiki-dark:#ADD7FF}",{"title":280,"searchDepth":294,"depth":294,"links":1801},[1802,1803,1804,1805,1806,1807,1808],{"id":92,"depth":294,"text":93},{"id":167,"depth":294,"text":168},{"id":268,"depth":294,"text":269},{"id":1240,"depth":294,"text":1241},{"id":1352,"depth":294,"text":1353},{"id":1410,"depth":294,"text":1411},{"id":1767,"depth":294,"text":1768},"Extend AbstractBlockchain. Implement five methods. Register it and test it.","md",null,{"icon":1813},"i-lucide-circle-plus",{"title":28,"description":1809},"wygZ1SArBLrBA8s4jIt2-7oAGOUmW0EyaJ-TV_jSZhs",[1817,1819],{"title":24,"path":25,"stem":26,"description":1818,"children":-1},"Ethereum and Base share one implementation. One address and one signing scheme.",{"title":38,"path":34,"stem":35,"description":1820,"children":-1},"Eleven drivers and one class shape. Pick a chain to see its address rules and the traps.",1789851666121]