After a lot of research, I went with ethereumjs-util, bip39 and hdkey.
A Installations
Install Node.js (npm will also be needed but it is included in node.js)
Then open a CMD and install the packages :
You can do it in 2 ways:
Method A: install via the install @ethereumjs/tx
command. This will install the package in C:\Users\<iuser>\node_modules\
and you can access them directly in the Node command.
npm install ethereumjs-util
npm install bip39
npm install hdkey
Method B: install via a npm install -g @ethereumjs/tx
command. It will install the package in C:\Users\<user>\AppData\Roaming\npm\node_modules
, then you will need to create a folder let's call it folder_B
and inside of it another folder named node_modules
and then run a command on B
like npm link @ethereumjs/tx
(cf below, for each package), and after that you will be able to use them in the Node when it is open on folder_B
.
npm install -g ethereumjs-util
npm install -g bip39
npm install -g hdkey
npm link ethereumjs-util
npm link bip39
npm link hdkey
B Creating a mnemonic
B1) preparing the environnement :
Open a cmd (if you use method A it can be started anywhere, if you use methob B it should started on folder_B
)
Type node
then press Enter
Once the node console is loaded (cf the message "welcome to node...), type:
bip39 = require('bip39');
ethUtil = require('ethereumjs-util');
hdkey = require('hdkey');
B2) generating the mnemonic
const mnemonic = bip39.generateMnemonic(256);
console.log( "mnemonic: ", mnemonic)
C Deriving an address from a specific path in your wallet
C1) If you still have the node console open from the Step B, you can continue to step C2, otherwise, first do the step B1 and save your mnemonic in a variable like this:
const mnemonic = "replace this by your mnemonic"
C2) From the mnemonic to the master private key
const seed = bip39.mnemonicToSeedSync(mnemonic);
const root = hdkey.fromMasterSeed(seed);
const masterPrivateKey = root.privateKey.toString('hex');
C3) From the path to the address
var path = "m/44'/60'/0'/0/0" // change path
var addrNode = root.derive(path);
var pubKey = ethUtil.privateToPublic(addrNode._privateKey);
var addr = '0x' + ethUtil.publicToAddress(pubKey).toString('hex');
var address = ethUtil.toChecksumAddress(addr);
console.log( "\n", "\n", "\n","ACCOUNT ", path, "\n", "private key : 0x", addrNode._privateKey.toString('hex'), "\n", "public key : ",pubKey.toString('hex'), "\n", "address : ", address)
C4) To get different address, you can rerun C3 with a different path each time, just change the last and/or third last number*. Some examples:
"m/44'/60'/0'/0/1"
"m/44'/60'/0'/0/9"
"m/44'/60'/1'/0/0"
"m/44'/60'/7'/0/15"
- this is the meaning of the path (you only have to change the account and the address_index) :
m / purpose' / coin_type' / account' / change / address_index
If you don't intent to use this wallet to hold real ETH, then you can verify the address, and the private/public key on for https://iancoleman.io/bip39/
D Once you are done, delete nodejs history :
In a CMD...
cd %userprofile%
echo. > .node_repl_history
Or delete file : C:\Users\<user>\.node_repl_history