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