[{"data":1,"prerenderedAt":511},["ShallowReactive",2],{"navigation_docs":3,"-blockchains-ethereum":84,"-blockchains-ethereum-surround":506},[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":60,"body":86,"description":499,"extension":500,"links":501,"meta":502,"navigation":160,"path":61,"seo":504,"stem":62,"__hash__":505},"docs\u002F2.blockchains\u002Fethereum.md",{"type":87,"value":88,"toc":492},"minimark",[89,96,101,197,201,213,287,294,298,370,377,381,407,472,476,488],[90,91],"chain-facts",{"coin":92,"curve":93,"driver":94,"formats":95},"60","secp256k1","ethereum","EIP-55 hex",[97,98,100],"h2",{"id":99},"load-it","Load it",[102,103,108],"pre",{"className":104,"code":105,"language":106,"meta":107,"style":107},"language-js shiki shiki-themes github-light github-light poimandres","import { useBlockchain, blockchains } from \"@agntn\u002Fkeys\";\n\nconst ethereumChain = useBlockchain(await blockchains.ethereum()());\n","js","",[109,110,111,155,162],"code",{"__ignoreMap":107},[112,113,116,120,124,128,131,134,137,141,145,149,152],"span",{"class":114,"line":115},"line",1,[112,117,119],{"class":118},"sP0CR","import",[112,121,123],{"class":122},"sKlNE"," {",[112,125,127],{"class":126},"snHMy"," useBlockchain",[112,129,130],{"class":122},",",[112,132,133],{"class":126}," blockchains",[112,135,136],{"class":122}," }",[112,138,140],{"class":139},"stCPd"," from",[112,142,144],{"class":143},"scVjq"," \"",[112,146,148],{"class":147},"sQ7BG","@agntn\u002Fkeys",[112,150,151],{"class":143},"\"",[112,153,154],{"class":122},";\n",[112,156,158],{"class":114,"line":157},2,[112,159,161],{"emptyLinePlaceholder":160},true,"\n",[112,163,165,169,173,176,179,182,186,189,192,194],{"class":114,"line":164},3,[112,166,168],{"class":167},"s1TYA","const",[112,170,172],{"class":171},"saoiD"," ethereumChain",[112,174,175],{"class":167}," =",[112,177,127],{"class":178},"sULi6",[112,180,181],{"class":122},"(",[112,183,185],{"class":184},"sZW6a","await",[112,187,133],{"class":188},"spVlQ",[112,190,191],{"class":122},".",[112,193,94],{"class":178},[112,195,196],{"class":122},"()());\n",[97,198,200],{"id":199},"the-address","The address",[202,203,204,205,208,209,212],"p",{},"Uncompressed public key without the ",[109,206,207],{},"04",", Keccak-256, last 20 bytes, ",[109,210,211],{},"0x",", then the EIP-55 case checksum.",[102,214,216],{"className":104,"code":215,"language":106,"meta":107,"style":107},"const privateKey = \"0000000000000000000000000000000000000000000000000000000000000001\";\nconst publicKey = ethereumChain.getKeyPublic(privateKey);\n\nethereumChain.getAddress(publicKey); \u002F\u002F 0x7E5F4552091A69125d5DfCb7b8C2659029395Bdf\n",[109,217,218,236,260,264],{"__ignoreMap":107},[112,219,220,222,225,227,229,232,234],{"class":114,"line":115},[112,221,168],{"class":167},[112,223,224],{"class":171}," privateKey",[112,226,175],{"class":167},[112,228,144],{"class":143},[112,230,231],{"class":147},"0000000000000000000000000000000000000000000000000000000000000001",[112,233,151],{"class":143},[112,235,154],{"class":122},[112,237,238,240,243,245,247,249,252,254,257],{"class":114,"line":157},[112,239,168],{"class":167},[112,241,242],{"class":171}," publicKey",[112,244,175],{"class":167},[112,246,172],{"class":188},[112,248,191],{"class":122},[112,250,251],{"class":178},"getKeyPublic",[112,253,181],{"class":122},[112,255,256],{"class":188},"privateKey",[112,258,259],{"class":122},");\n",[112,261,262],{"class":114,"line":164},[112,263,161],{"emptyLinePlaceholder":160},[112,265,267,270,272,275,277,280,283],{"class":114,"line":266},4,[112,268,269],{"class":188},"ethereumChain",[112,271,191],{"class":122},[112,273,274],{"class":178},"getAddress",[112,276,181],{"class":122},[112,278,279],{"class":188},"publicKey",[112,281,282],{"class":122},"); ",[112,284,286],{"class":285},"sjhu3","\u002F\u002F 0x7E5F4552091A69125d5DfCb7b8C2659029395Bdf\n",[202,288,289,290,293],{},"Yes, that's the address of private key ",[109,291,292],{},"1",". It shows up in a lot of test suites.",[97,295,297],{"id":296},"validation","Validation",[102,299,301],{"className":104,"code":300,"language":106,"meta":107,"style":107},"ethereumChain.validateAddress(\"0x7E5F4552091A69125d5DfCb7b8C2659029395Bdf\"); \u002F\u002F true\nethereumChain.validateAddress(\"0x7e5f4552091a69125d5dfcb7b8c2659029395bdf\"); \u002F\u002F true, no checksum to check\nethereumChain.validateAddress(\"0x7e5F4552091A69125d5DfCb7b8C2659029395Bdf\"); \u002F\u002F false, bad checksum\n",[109,302,303,326,348],{"__ignoreMap":107},[112,304,305,307,309,312,314,316,319,321,323],{"class":114,"line":115},[112,306,269],{"class":188},[112,308,191],{"class":122},[112,310,311],{"class":178},"validateAddress",[112,313,181],{"class":122},[112,315,151],{"class":143},[112,317,318],{"class":147},"0x7E5F4552091A69125d5DfCb7b8C2659029395Bdf",[112,320,151],{"class":143},[112,322,282],{"class":122},[112,324,325],{"class":285},"\u002F\u002F true\n",[112,327,328,330,332,334,336,338,341,343,345],{"class":114,"line":157},[112,329,269],{"class":188},[112,331,191],{"class":122},[112,333,311],{"class":178},[112,335,181],{"class":122},[112,337,151],{"class":143},[112,339,340],{"class":147},"0x7e5f4552091a69125d5dfcb7b8c2659029395bdf",[112,342,151],{"class":143},[112,344,282],{"class":122},[112,346,347],{"class":285},"\u002F\u002F true, no checksum to check\n",[112,349,350,352,354,356,358,360,363,365,367],{"class":114,"line":164},[112,351,269],{"class":188},[112,353,191],{"class":122},[112,355,311],{"class":178},[112,357,181],{"class":122},[112,359,151],{"class":143},[112,361,362],{"class":147},"0x7e5F4552091A69125d5DfCb7b8C2659029395Bdf",[112,364,151],{"class":143},[112,366,282],{"class":122},[112,368,369],{"class":285},"\u002F\u002F false, bad checksum\n",[202,371,372,373,376],{},"Lowercase and uppercase pass, mixed case has to match. A rejected mixed case address is almost always a copy and paste that lost a character somewhere, so treat ",[109,374,375],{},"false"," as \"look at it again\", not as \"this address doesn't exist\".",[97,378,380],{"id":379},"signing","Signing",[202,382,383,386,387,390,391,394,395,398,399,402,403,406],{},[109,384,385],{},"signMessage"," prepends ",[109,388,389],{},"\"\\x19Ethereum Signed Message:\\n\" + length",", hashes with Keccak-256, and signs with secp256k1. That's ",[109,392,393],{},"personal_sign",", the same hash MetaMask, ethers and viem sign. What comes back is 64 bytes of ",[109,396,397],{},"r||s"," in hex, no recovery byte. ",[109,400,401],{},"verifyMessage"," here doesn't need one, ethers does, so append a ",[109,404,405],{},"v"," before asking it to recover the signer.",[102,408,410],{"className":104,"code":409,"language":106,"meta":107,"style":107},"const signature = ethereumChain.signMessage(\"hello\", privateKey);\nethereumChain.verifyMessage(\"hello\", signature, publicKey); \u002F\u002F true\n",[109,411,412,443],{"__ignoreMap":107},[112,413,414,416,419,421,423,425,427,429,431,434,436,439,441],{"class":114,"line":115},[112,415,168],{"class":167},[112,417,418],{"class":171}," signature",[112,420,175],{"class":167},[112,422,172],{"class":188},[112,424,191],{"class":122},[112,426,385],{"class":178},[112,428,181],{"class":122},[112,430,151],{"class":143},[112,432,433],{"class":147},"hello",[112,435,151],{"class":143},[112,437,438],{"class":122},", ",[112,440,256],{"class":188},[112,442,259],{"class":122},[112,444,445,447,449,451,453,455,457,459,461,464,466,468,470],{"class":114,"line":157},[112,446,269],{"class":188},[112,448,191],{"class":122},[112,450,401],{"class":178},[112,452,181],{"class":122},[112,454,151],{"class":143},[112,456,433],{"class":147},[112,458,151],{"class":143},[112,460,438],{"class":122},[112,462,463],{"class":188},"signature",[112,465,438],{"class":122},[112,467,279],{"class":188},[112,469,282],{"class":122},[112,471,325],{"class":285},[97,473,475],{"id":474},"one-driver-every-evm-chain","One driver, every EVM chain",[202,477,478,479,482,483,487],{},"Ethereum is ",[109,480,481],{},"AbstractEVMBlockchain"," with a name and coin type 60. Base is the same class with a different name. The ",[484,485,486],"a",{"href":25},"EVM guide"," explains why one private key gives one address on every EVM chain and how to add another one in two lines.",[489,490,491],"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 .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 .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}",{"title":107,"searchDepth":157,"depth":157,"links":493},[494,495,496,497,498],{"id":99,"depth":157,"text":100},{"id":199,"depth":157,"text":200},{"id":296,"depth":157,"text":297},{"id":379,"depth":157,"text":380},{"id":474,"depth":157,"text":475},"secp256k1 with EIP-55 checksummed addresses and personal_sign message signatures.","md",null,{"icon":503},"i-token-eth",{"title":60,"description":499},"V_lRhZcO7AuDZOvncqWjo0eV-Pv5Y6CY92zC3tDLIJk",[507,509],{"title":56,"path":57,"stem":58,"description":508,"children":-1},"secp256k1 with BLAKE-256 in every hash. Addresses start with Ds. No mnemonic derivation and that's on purpose.",{"title":64,"path":65,"stem":66,"description":510,"children":-1},"Bitcoin's driver with Litecoin's prefixes. Five address formats on mainnet and testnet and its own signed message preamble.",1789938975649]