[{"data":1,"prerenderedAt":626},["ShallowReactive",2],{"navigation_docs":3,"-blockchains-sui":72,"-blockchains-sui-surround":621},[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":64,"body":74,"description":614,"extension":615,"links":616,"meta":617,"navigation":148,"path":65,"seo":619,"stem":66,"__hash__":620},"docs\u002F2.blockchains\u002Fsui.md",{"type":75,"value":76,"toc":607},"minimark",[77,84,89,203,207,211,265,276,287,353,371,446,449,453,504,509,513,524,596,600,603],[78,79],"chain-facts",{"coin":80,"curve":81,"driver":82,"formats":83},"784","ed25519, secp256k1","sui","0x hex (Blake2b)",[85,86,88],"h2",{"id":87},"load-it","Load it",[90,91,96],"pre",{"className":92,"code":93,"language":94,"meta":95,"style":95},"language-js shiki shiki-themes github-light github-light poimandres","import { useBlockchain, blockchains } from \"@agntn\u002Fkeys\";\n\nconst suiChain = useBlockchain(await blockchains.sui()());\nsuiChain.curve; \u002F\u002F ['ed25519', 'secp256k1']\n","js","",[97,98,99,143,150,185],"code",{"__ignoreMap":95},[100,101,104,108,112,116,119,122,125,129,133,137,140],"span",{"class":102,"line":103},"line",1,[100,105,107],{"class":106},"sP0CR","import",[100,109,111],{"class":110},"sKlNE"," {",[100,113,115],{"class":114},"snHMy"," useBlockchain",[100,117,118],{"class":110},",",[100,120,121],{"class":114}," blockchains",[100,123,124],{"class":110}," }",[100,126,128],{"class":127},"stCPd"," from",[100,130,132],{"class":131},"scVjq"," \"",[100,134,136],{"class":135},"sQ7BG","@agntn\u002Fkeys",[100,138,139],{"class":131},"\"",[100,141,142],{"class":110},";\n",[100,144,146],{"class":102,"line":145},2,[100,147,149],{"emptyLinePlaceholder":148},true,"\n",[100,151,153,157,161,164,167,170,174,177,180,182],{"class":102,"line":152},3,[100,154,156],{"class":155},"s1TYA","const",[100,158,160],{"class":159},"saoiD"," suiChain",[100,162,163],{"class":155}," =",[100,165,115],{"class":166},"sULi6",[100,168,169],{"class":110},"(",[100,171,173],{"class":172},"sZW6a","await",[100,175,121],{"class":176},"spVlQ",[100,178,179],{"class":110},".",[100,181,82],{"class":166},[100,183,184],{"class":110},"()());\n",[100,186,188,191,193,196,199],{"class":102,"line":187},4,[100,189,190],{"class":176},"suiChain",[100,192,179],{"class":110},[100,194,195],{"class":176},"curve",[100,197,198],{"class":110},"; ",[100,200,202],{"class":201},"sjhu3","\u002F\u002F ['ed25519', 'secp256k1']\n",[85,204,206],{"id":205},"two-curves-one-argument","Two curves, one argument",[208,209,210],"p",{},"Sui accepts several signature schemes and tags each key with a flag byte. The driver supports two of them:",[212,213,214,230],"table",{},[215,216,217],"thead",{},[218,219,220,224,227],"tr",{},[221,222,223],"th",{},"Scheme",[221,225,226],{},"Flag",[221,228,229],{},"Public key",[231,232,233,250],"tbody",{},[218,234,235,242,247],{},[236,237,238,241],"td",{},[97,239,240],{},"ed25519"," (default)",[236,243,244],{},[97,245,246],{},"0x00",[236,248,249],{},"32 bytes",[218,251,252,257,262],{},[236,253,254],{},[97,255,256],{},"secp256k1",[236,258,259],{},[97,260,261],{},"0x01",[236,263,264],{},"33 bytes, compressed",[208,266,267,268,271,272,275],{},"secp256r1 (",[97,269,270],{},"0x02",") and multisig (",[97,273,274],{},"0x03",") are not implemented.",[208,277,278,279,282,283,286],{},"The address is ",[97,280,281],{},"Blake2b-256(flag + publicKey)"," with ",[97,284,285],{},"0x"," in front. Because the flag is part of the hash, the same private key gives two unrelated addresses depending on the scheme.",[90,288,290],{"className":92,"code":289,"language":94,"meta":95,"style":95},"\u002F\u002F ed25519, the default\nconst wallet = suiChain.generateWallet();\n\n\u002F\u002F secp256k1: the address type doubles as the scheme\nconst walletSecp = suiChain.generateWallet({}, \"secp256k1\");\n",[97,291,292,297,316,320,325],{"__ignoreMap":95},[100,293,294],{"class":102,"line":103},[100,295,296],{"class":201},"\u002F\u002F ed25519, the default\n",[100,298,299,301,304,306,308,310,313],{"class":102,"line":145},[100,300,156],{"class":155},[100,302,303],{"class":159}," wallet",[100,305,163],{"class":155},[100,307,160],{"class":176},[100,309,179],{"class":110},[100,311,312],{"class":166},"generateWallet",[100,314,315],{"class":110},"();\n",[100,317,318],{"class":102,"line":152},[100,319,149],{"emptyLinePlaceholder":148},[100,321,322],{"class":102,"line":187},[100,323,324],{"class":201},"\u002F\u002F secp256k1: the address type doubles as the scheme\n",[100,326,328,330,333,335,337,339,341,344,346,348,350],{"class":102,"line":327},5,[100,329,156],{"class":155},[100,331,332],{"class":159}," walletSecp",[100,334,163],{"class":155},[100,336,160],{"class":176},[100,338,179],{"class":110},[100,340,312],{"class":166},[100,342,343],{"class":110},"({}, ",[100,345,139],{"class":131},[100,347,256],{"class":135},[100,349,139],{"class":131},[100,351,352],{"class":110},");\n",[208,354,355,356,359,360,362,363,366,367,370],{},"Passing ",[97,357,358],{},"\"secp256k1\""," as the address type sets the scheme for the key as well, so ",[97,361,312],{},", ",[97,364,365],{},"deriveWallet",", and ",[97,368,369],{},"deriveHDWallet"," all stay consistent with one argument. When you go step by step you have to say it twice:",[90,372,374],{"className":92,"code":373,"language":94,"meta":95,"style":95},"const secpKey = suiChain.getKeyPublic(privateKey, { scheme: \"secp256k1\" });\nconst secpAddress = suiChain.getAddress(secpKey, \"secp256k1\");\n",[97,375,376,415],{"__ignoreMap":95},[100,377,378,380,383,385,387,389,392,394,397,400,403,406,408,410,412],{"class":102,"line":103},[100,379,156],{"class":155},[100,381,382],{"class":159}," secpKey",[100,384,163],{"class":155},[100,386,160],{"class":176},[100,388,179],{"class":110},[100,390,391],{"class":166},"getKeyPublic",[100,393,169],{"class":110},[100,395,396],{"class":176},"privateKey",[100,398,399],{"class":110},", {",[100,401,402],{"class":114}," scheme",[100,404,405],{"class":110},":",[100,407,132],{"class":131},[100,409,256],{"class":135},[100,411,139],{"class":131},[100,413,414],{"class":110}," });\n",[100,416,417,419,422,424,426,428,431,433,436,438,440,442,444],{"class":102,"line":145},[100,418,156],{"class":155},[100,420,421],{"class":159}," secpAddress",[100,423,163],{"class":155},[100,425,160],{"class":176},[100,427,179],{"class":110},[100,429,430],{"class":166},"getAddress",[100,432,169],{"class":110},[100,434,435],{"class":176},"secpKey",[100,437,362],{"class":110},[100,439,139],{"class":131},[100,441,256],{"class":135},[100,443,139],{"class":131},[100,445,352],{"class":110},[208,447,448],{},"Forget the second one and you hash a secp256k1 key with the ed25519 flag. The result validates, looks fine, and no key can ever spend from it. This is the single easiest way to lose funds with this package, which is why the wallet methods take the scheme once.",[85,450,452],{"id":451},"validation","Validation",[90,454,456],{"className":92,"code":455,"language":94,"meta":95,"style":95},"suiChain.validateAddress(\"0x7e08ac7940568c91564ddc6f5f3bf91b15a9334194ab7855daeac51c5cc74936\"); \u002F\u002F true\nsuiChain.validateAddress(\"7e08ac7940568c91564ddc6f5f3bf91b15a9334194ab7855daeac51c5cc74936\"); \u002F\u002F false\n",[97,457,458,482],{"__ignoreMap":95},[100,459,460,462,464,467,469,471,474,476,479],{"class":102,"line":103},[100,461,190],{"class":176},[100,463,179],{"class":110},[100,465,466],{"class":166},"validateAddress",[100,468,169],{"class":110},[100,470,139],{"class":131},[100,472,473],{"class":135},"0x7e08ac7940568c91564ddc6f5f3bf91b15a9334194ab7855daeac51c5cc74936",[100,475,139],{"class":131},[100,477,478],{"class":110},"); ",[100,480,481],{"class":201},"\u002F\u002F true\n",[100,483,484,486,488,490,492,494,497,499,501],{"class":102,"line":145},[100,485,190],{"class":176},[100,487,179],{"class":110},[100,489,466],{"class":166},[100,491,169],{"class":110},[100,493,139],{"class":131},[100,495,496],{"class":135},"7e08ac7940568c91564ddc6f5f3bf91b15a9334194ab7855daeac51c5cc74936",[100,498,139],{"class":131},[100,500,478],{"class":110},[100,502,503],{"class":201},"\u002F\u002F false\n",[208,505,506,508],{},[97,507,285],{}," and 64 hex characters, any case. No checksum, same caveat as Aptos.",[85,510,512],{"id":511},"mnemonics","Mnemonics",[208,514,515,516,519,520,523],{},"ed25519 goes through SLIP-10 and needs every segment hardened, ",[97,517,518],{},"m\u002F44'\u002F784'\u002F0'\u002F0'\u002F0'",". secp256k1 goes through BIP32 and takes the usual ",[97,521,522],{},"m\u002F54'\u002F784'\u002F0'\u002F0\u002F0"," shape. Pass the scheme as the address type and the driver picks the right derivation:",[90,525,527],{"className":92,"code":526,"language":94,"meta":95,"style":95},"suiChain.deriveHDWallet(mnemonic, \"m\u002F44'\u002F784'\u002F0'\u002F0'\u002F0'\").address; \u002F\u002F ed25519\nsuiChain.deriveHDWallet(mnemonic, \"m\u002F54'\u002F784'\u002F0'\u002F0\u002F0\", {}, \"secp256k1\").address;\n",[97,528,529,561],{"__ignoreMap":95},[100,530,531,533,535,537,539,542,544,546,548,550,553,556,558],{"class":102,"line":103},[100,532,190],{"class":176},[100,534,179],{"class":110},[100,536,369],{"class":166},[100,538,169],{"class":110},[100,540,541],{"class":176},"mnemonic",[100,543,362],{"class":110},[100,545,139],{"class":131},[100,547,518],{"class":135},[100,549,139],{"class":131},[100,551,552],{"class":110},").",[100,554,555],{"class":176},"address",[100,557,198],{"class":110},[100,559,560],{"class":201},"\u002F\u002F ed25519\n",[100,562,563,565,567,569,571,573,575,577,579,581,584,586,588,590,592,594],{"class":102,"line":145},[100,564,190],{"class":176},[100,566,179],{"class":110},[100,568,369],{"class":166},[100,570,169],{"class":110},[100,572,541],{"class":176},[100,574,362],{"class":110},[100,576,139],{"class":131},[100,578,522],{"class":135},[100,580,139],{"class":131},[100,582,583],{"class":110},", {}, ",[100,585,139],{"class":131},[100,587,256],{"class":135},[100,589,139],{"class":131},[100,591,552],{"class":110},[100,593,555],{"class":176},[100,595,142],{"class":110},[85,597,599],{"id":598},"signing","Signing",[208,601,602],{},"ed25519 or secp256k1 depending on the scheme in the options, hex out. The signature does not carry the flag byte, so keep track of which scheme signed if you hand it to Sui tooling.",[604,605,606],"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 .sZW6a, html code.shiki .sZW6a{--shiki-light:#D73A49;--shiki-default:#D73A49;--shiki-dark:#5DE4C7C0}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);}",{"title":95,"searchDepth":145,"depth":145,"links":608},[609,610,611,612,613],{"id":87,"depth":145,"text":88},{"id":205,"depth":145,"text":206},{"id":451,"depth":145,"text":452},{"id":511,"depth":145,"text":512},{"id":598,"depth":145,"text":599},"ed25519 or secp256k1 on one chain. Blake2b over a flag byte and the public key.","md",null,{"icon":618},"i-simple-icons-sui",{"title":64,"description":614},"HI2DNYcY9KOJ8iRkiKb8huqNqYhANWdRsl3yCC55PdA",[622,624],{"title":60,"path":61,"stem":62,"description":623,"children":-1},"ed25519. The address is the public key itself in base58, nothing hashed.",{"title":68,"path":69,"stem":70,"description":625,"children":-1},"secp256k1 with Ethereum's 20 byte hash wrapped in base58check, so every address starts with T.",1788428715659]