[{"data":1,"prerenderedAt":488},["ShallowReactive",2],{"navigation_docs":3,"-blockchains-ethereum":72,"-blockchains-ethereum-surround":483},[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":56,"body":74,"description":476,"extension":477,"links":478,"meta":479,"navigation":148,"path":57,"seo":481,"stem":58,"__hash__":482},"docs\u002F2.blockchains\u002Fethereum.md",{"type":75,"value":76,"toc":469},"minimark",[77,84,89,185,189,201,275,282,286,358,365,369,383,449,453,465],[78,79],"chain-facts",{"coin":80,"curve":81,"driver":82,"formats":83},"60","secp256k1","ethereum","EIP-55 hex",[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 ethereumChain = useBlockchain(await blockchains.ethereum()());\n","js","",[97,98,99,143,150],"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"," ethereumChain",[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",[85,186,188],{"id":187},"the-address","The address",[190,191,192,193,196,197,200],"p",{},"Uncompressed public key without the ",[97,194,195],{},"04",", Keccak-256, last 20 bytes, ",[97,198,199],{},"0x",", then the EIP-55 case checksum.",[90,202,204],{"className":92,"code":203,"language":94,"meta":95,"style":95},"const privateKey = \"0000000000000000000000000000000000000000000000000000000000000001\";\nconst publicKey = ethereumChain.getKeyPublic(privateKey);\n\nethereumChain.getAddress(publicKey); \u002F\u002F 0x7E5F4552091A69125d5DfCb7b8C2659029395Bdf\n",[97,205,206,224,248,252],{"__ignoreMap":95},[100,207,208,210,213,215,217,220,222],{"class":102,"line":103},[100,209,156],{"class":155},[100,211,212],{"class":159}," privateKey",[100,214,163],{"class":155},[100,216,132],{"class":131},[100,218,219],{"class":135},"0000000000000000000000000000000000000000000000000000000000000001",[100,221,139],{"class":131},[100,223,142],{"class":110},[100,225,226,228,231,233,235,237,240,242,245],{"class":102,"line":145},[100,227,156],{"class":155},[100,229,230],{"class":159}," publicKey",[100,232,163],{"class":155},[100,234,160],{"class":176},[100,236,179],{"class":110},[100,238,239],{"class":166},"getKeyPublic",[100,241,169],{"class":110},[100,243,244],{"class":176},"privateKey",[100,246,247],{"class":110},");\n",[100,249,250],{"class":102,"line":152},[100,251,149],{"emptyLinePlaceholder":148},[100,253,255,258,260,263,265,268,271],{"class":102,"line":254},4,[100,256,257],{"class":176},"ethereumChain",[100,259,179],{"class":110},[100,261,262],{"class":166},"getAddress",[100,264,169],{"class":110},[100,266,267],{"class":176},"publicKey",[100,269,270],{"class":110},"); ",[100,272,274],{"class":273},"sjhu3","\u002F\u002F 0x7E5F4552091A69125d5DfCb7b8C2659029395Bdf\n",[190,276,277,278,281],{},"Yes, that is the address of private key ",[97,279,280],{},"1",". It shows up in a lot of test suites.",[85,283,285],{"id":284},"validation","Validation",[90,287,289],{"className":92,"code":288,"language":94,"meta":95,"style":95},"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",[97,290,291,314,336],{"__ignoreMap":95},[100,292,293,295,297,300,302,304,307,309,311],{"class":102,"line":103},[100,294,257],{"class":176},[100,296,179],{"class":110},[100,298,299],{"class":166},"validateAddress",[100,301,169],{"class":110},[100,303,139],{"class":131},[100,305,306],{"class":135},"0x7E5F4552091A69125d5DfCb7b8C2659029395Bdf",[100,308,139],{"class":131},[100,310,270],{"class":110},[100,312,313],{"class":273},"\u002F\u002F true\n",[100,315,316,318,320,322,324,326,329,331,333],{"class":102,"line":145},[100,317,257],{"class":176},[100,319,179],{"class":110},[100,321,299],{"class":166},[100,323,169],{"class":110},[100,325,139],{"class":131},[100,327,328],{"class":135},"0x7e5f4552091a69125d5dfcb7b8c2659029395bdf",[100,330,139],{"class":131},[100,332,270],{"class":110},[100,334,335],{"class":273},"\u002F\u002F true, no checksum to check\n",[100,337,338,340,342,344,346,348,351,353,355],{"class":102,"line":152},[100,339,257],{"class":176},[100,341,179],{"class":110},[100,343,299],{"class":166},[100,345,169],{"class":110},[100,347,139],{"class":131},[100,349,350],{"class":135},"0x7e5F4552091A69125d5DfCb7b8C2659029395Bdf",[100,352,139],{"class":131},[100,354,270],{"class":110},[100,356,357],{"class":273},"\u002F\u002F false, bad checksum\n",[190,359,360,361,364],{},"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 ",[97,362,363],{},"false"," as \"look at it again\", not as \"this address does not exist\".",[85,366,368],{"id":367},"signing","Signing",[190,370,371,374,375,378,379,382],{},[97,372,373],{},"signMessage"," prepends ",[97,376,377],{},"\"\\x19Ethereum Signed Message:\\n\" + length",", hashes with Keccak-256, and signs with secp256k1. That is ",[97,380,381],{},"personal_sign",", so the signature verifies in MetaMask, ethers, viem, and anything else that follows EIP-191.",[90,384,386],{"className":92,"code":385,"language":94,"meta":95,"style":95},"const signature = ethereumChain.signMessage(\"hello\", privateKey);\nethereumChain.verifyMessage(\"hello\", signature, publicKey); \u002F\u002F true\n",[97,387,388,419],{"__ignoreMap":95},[100,389,390,392,395,397,399,401,403,405,407,410,412,415,417],{"class":102,"line":103},[100,391,156],{"class":155},[100,393,394],{"class":159}," signature",[100,396,163],{"class":155},[100,398,160],{"class":176},[100,400,179],{"class":110},[100,402,373],{"class":166},[100,404,169],{"class":110},[100,406,139],{"class":131},[100,408,409],{"class":135},"hello",[100,411,139],{"class":131},[100,413,414],{"class":110},", ",[100,416,244],{"class":176},[100,418,247],{"class":110},[100,420,421,423,425,428,430,432,434,436,438,441,443,445,447],{"class":102,"line":145},[100,422,257],{"class":176},[100,424,179],{"class":110},[100,426,427],{"class":166},"verifyMessage",[100,429,169],{"class":110},[100,431,139],{"class":131},[100,433,409],{"class":135},[100,435,139],{"class":131},[100,437,414],{"class":110},[100,439,440],{"class":176},"signature",[100,442,414],{"class":110},[100,444,267],{"class":176},[100,446,270],{"class":110},[100,448,313],{"class":273},[85,450,452],{"id":451},"one-driver-every-evm-chain","One driver, every EVM chain",[190,454,455,456,459,460,464],{},"Ethereum is ",[97,457,458],{},"AbstractEVMBlockchain"," with a name and coin type 60. Base is the same class with a different name. The ",[461,462,463],"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.",[466,467,468],"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":95,"searchDepth":145,"depth":145,"links":470},[471,472,473,474,475],{"id":87,"depth":145,"text":88},{"id":187,"depth":145,"text":188},{"id":284,"depth":145,"text":285},{"id":367,"depth":145,"text":368},{"id":451,"depth":145,"text":452},"secp256k1 with EIP-55 checksummed addresses and personal_sign message signatures.","md",null,{"icon":480},"i-simple-icons-ethereum",{"title":56,"description":476},"oykFOX2AxYNJcu8D6ycujP2qJSmMeI1RVGo6jqmwIjg",[484,486],{"title":52,"path":53,"stem":54,"description":485,"children":-1},"ed25519 with bech32 base, enterprise, and stake addresses. Mnemonic derivation is refused on purpose.",{"title":60,"path":61,"stem":62,"description":487,"children":-1},"ed25519. The address is the public key itself in base58, nothing hashed.",1788428715659]