CLI and Node.js library for Ethereum HD Wallet derivations from mnemonic
https://lab.miguelmota.com/ethereum-hdwallet
npm install ethereum-hdwallet
Available on jsDelivr CDN:
<script src="https://cdn.jsdelivr.net/npm/ethereum-hdwallet@latest/ethereum-hdwallet.js"></script>
Creating a new HD wallet from a mnemonic:
const HDWallet = require('ethereum-hdwallet')
const mnemonic = 'tag volcano eight thank tide danger coast health above argue embrace heavy'
const hdwallet = HDWallet.fromMnemonic(mnemonic)
console.log(`0x${hdwallet.derive(`m/44'/60'/0'/0/0`).getAddress().toString('hex')}`) // 0xc49926c4124cee1cba0ea94ea31a6c12318df947
Creating a new HD wallet from a seed:
const seed = Buffer.from('efea201152e37883bdabf10b28fdac9c146f80d2e161a544a7079d2ecc4e65948a0d74e47e924f26bf35aaee72b24eb210386bcb1deda70ded202a2b7d1a8c2e', 'hex')
const hdwallet= HDWallet.fromSeed(seed)
console.log(`0x${hdwallet.derive(`m/44'/60'/0'/0/0`).getAddress().toString('hex')}`) // 0xc49926c4124cee1cba0ea94ea31a6c12318df947
Deriving keys at a HD path:
console.log(hdwallet.derive(`m/44'/60'/0'/0/0`).getPublicKey().toString('hex')) // 6005c86a6718f66221713a77073c41291cc3abbfcd03aa4955e9b2b50dbf7f9b6672dad0d46ade61e382f79888a73ea7899d9419becf1d6c9ec2087c1188fa18
console.log(hdwallet.derive(`m/44'/60'/0'/0/0`).getPublicKey(true).toString('hex')) // 026005c86a6718f66221713a77073c41291cc3abbfcd03aa4955e9b2b50dbf7f9b
console.log(hdwallet.derive(`m/44'/60'/0'/0/0`).getPrivateKey().toString('hex')) // 63e21d10fd50155dbba0e7d3f7431a400b84b4c2ac1ee38872f82448fe3ecfb9
console.log(`0x${hdwallet.derive(`m/44'/60'/0'/0/0`).getAddress().toString('hex')}`) // 0xc49926c4124cee1cba0ea94ea31a6c12318df947
Deriving wallets given account index:
const hdwallet = HDWallet.fromMnemonic(mnemonic)
const mywallet = hdwallet.derive(`m/44'/60'/0'/0`)
console.log(`0x${mywallet.derive(1).getAddress().toString('hex')}`) // 0x8230645ac28a4edd1b0b53e7cd8019744e9dd559
console.log(`0x${mywallet.derive(2).getAddress().toString('hex')}`) // 0x65c150b7ef3b1adbb9cb2b8041c892b15edde05a
console.log(`0x${mywallet.derive(3).getAddress().toString('hex')}`) // 0x1aebbe69459b80d4975259378577bc01d2924cf4
console.log(`0x${mywallet.derive(3).hdpath()}`) // m/44'/60'/0'/0/3
Signing transaction with a wallet:
const hdwallet = HDWallet.fromMnemonic(mnemonic)
const signedRawTx = hdwallet.derive(`m/44'/60'/0'/0/0`).signTransaction({
to: '0x0000000000000000000000000000000000000000',
value: '0x0',
data: '0x0'
})
console.log(`0x${signedRawTx.toString('hex')}`) // 0xf85d80808094000000000000000000000000000000000000000080001ca0de4b34f17bf51d0b783082090c10d133dcc867c7e981c07cda5ddd1e3211f44ca02125dff6879141708899838356bc42df8815220069ce10507ae4ea980791dac4
npm install ethereum-hdwallet -g
$ ethereum_hdwallet --help
Usage
$ ethereum_hdwallet [options]
Options
-i, --index Account Index (e.g. 4)
-c, --columns Columns to display (e.g. address, publickey, privatekey, hdpath)
-r, --range Account Index Range (e.g 1-100)
-m, --mnemonic Mnemonic
-s, --seed Seed in hex format
-p, --hdpath HD Path
Examples
$ ethereum_hdwallet -m "tag volcano eight thank tide danger coast health ab
ove argue embrace heavy" -r 0-10
The default HD path is m/44'/60'/0'/0/
.
Display the address at a particular account index:
$ ethereum_hdwallet -m "tag volcano eight thank tide danger coast health above argue embrace heavy" -i 4
account address
4 0x32f48bf54dbbfce73172e69fe563c130d536cd5f
Display the account address derived from a range of account indexes:
$ ethereum_hdwallet -m "tag volcano eight thank tide danger coast health above argue embrace heavy" -r 5-10
account address
5 0x1c255db352e8b3cc16efd721c61d7b1b5952b2bb
6 0x1a41029aeb54a8c09211539b92b2a3fd92ea8270
7 0x54c0897a1e281b107eee25d4f8eee5f6ae13f9d9
8 0x3d503e7c3799ab9478b6c04623275fdc0ad09b1e
9 0x2d69b45301b9b3e01c4797c7a48bbc7e7f9b355b
10 0x5e611cbdd26f78a4c837759378a7b41caa17b41b
Display the private keys of accounts:
$ ethereum_hdwallet -m "tag volcano eight thank tide danger coast health above argue embrace heavy" -r 5-10 -c privatekey
account private key
5 1a69b812ca32e38bcac5197a63f6c1a1fcb6ac202e524382565cef16f1b3c84c
6 83d5a75675cc8f1be09c7d4189117fe33ee3f09d1f9b5783140f03016a35b132
7 526db1890baf94e82162f17f25ad769eb7f981272d8d99c527ea1af443c2d0cc
8 cae7ce30e8e07507988d43ad8907edea2fd23f848fb1b8522dee53cac43a825f
9 7525a4c5f03fb0b22fd88862e23833d62719b609e32a9264f6e437d56520d375
10 9974334c5b8fc190302e93bc0e233709192f89fb2a7eeaf1d2f877cd3ae24262
Display the HD path of the account:
$ ethereum_hdwallet -m "tag volcano eight thank tide danger coast health above argue embrace heavy" -i 3 -c hdpath
account hd path
3 m/44'/60'/0'/0/3
Use a custom HD path:
$ ethereum_hdwallet -m "tag volcano eight thank tide danger coast health above argue embrace heavy" -p "m/44'/60'/20'/0/0" -r 0-3
account address
0 0xba59f66b853f1acb242bcc57ef188754fc79434b
1 0xbf4cfeb783b913c0ed1710f00e9ae1844d597c86
2 0x62b6ffac78674392e0c30ec042636e22907fbcd2
3 0xce8bf9293cf5c4e9ecb50aa8f9e42adf568ae356
Display multiple columns:
$ ethereum_hdwallet -m "tag volcano eight thank tide danger coast health above argue embrace heavy" -c address,hdpath -r 0-5
account address hd path
0 0xc49926c4124cee1cba0ea94ea31a6c12318df947 m/44'/60'/0'/0/0
1 0x8230645ac28a4edd1b0b53e7cd8019744e9dd559 m/44'/60'/0'/0/1
2 0x65c150b7ef3b1adbb9cb2b8041c892b15edde05a m/44'/60'/0'/0/2
3 0x1aebbe69459b80d4975259378577bc01d2924cf4 m/44'/60'/0'/0/3
4 0x32f48bf54dbbfce73172e69fe563c130d536cd5f m/44'/60'/0'/0/4
5 0x1c255db352e8b3cc16efd721c61d7b1b5952b2bb m/44'/60'/0'/0/5
Pipe mnemonic:
$ echo "tag volcano eight thank tide danger coast health above argue embrace heavy" | ethereum_hdwallet -i 0
account address
0 0xc49926c4124cee1cba0ea94ea31a6c12318df947
npm test