Skip to content

Instantly share code, notes, and snippets.

@Janaka-Steph
Last active January 31, 2024 22:29
Show Gist options
  • Star 1 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save Janaka-Steph/c267f410b8878214e9d637e8bccf5430 to your computer and use it in GitHub Desktop.
Save Janaka-Steph/c267f410b8878214e9d637e8bccf5430 to your computer and use it in GitHub Desktop.
Generate wallets (Alice, Bob, Carol), create a json file and import private keys to Bitcoin Core
/**
* Generate wallets (Alice, Bob, Carol), create a json file and import private keys to Bitcoin Core
*
* BIP32 methods
* - fromBase58
* - fromPrivateKey
* - fromPublicKey
* - fromSeed
*
* BIP39 methods
* - mnemonicToSeed
* - mnemonicToSeedHex
* - mnemonicToEntropy
* - entropyToMnemonic
* - generateMnemonic
* - validateMnemonic
*/
const { exec } = require('child_process')
const bitcoin = require('bitcoinjs-lib')
const bip32 = require('bip32')
const bip39 = require('bip39')
// Change the network appropriately
const network = bitcoin.networks.regtest
// Replace these values
// 128 bit entropy => 12 words mnemonic
// bx seed -b 128
const wallets = [
{alice: '182301471f6892728ae56bb95b54396e'},
{bob: '28c8b37e1462a460fafa440d3ec66d29'},
{carol: '61628dbe355f4675d895d399b984aaf4'}
]
// Create a json file with main info
let walletsJSON="{"
// Iterate on wallets
wallets.map((wallet, wallet_index) => {
walletsJSON += `"${Object.keys(wallet)}": [`
// Get mnemonic from entropy
let mnemonic = bip39.entropyToMnemonic(wallet[Object.keys(wallet)])
console.log(`${Object.keys(wallet)} mnemonic `, mnemonic)
// Get seed from mnemonic
let seed = bip39.mnemonicToSeed(mnemonic)
console.log(`${Object.keys(wallet)} seed `, seed.toString('hex'))
// Get master BIP32 master from seed
let master = bip32.fromSeed(seed, network)
// Get private key WIF
let wif = master.toWIF()
console.log(`${Object.keys(wallet)} master wif `, wif)
// Get BIP32 extended private key
let xpriv = master.toBase58()
console.log(`${Object.keys(wallet)} master xpriv `, xpriv)
// Get BIP32 extended public key
let xpub = master.neutered().toBase58()
console.log(`${Object.keys(wallet)} master xpub `, xpub)
console.log()
/**
* Bitcoin Core derivation - m/0'/0'/${index}'
* Derive 3 sets of addresses
*/
;[...Array(3)].map((u, i) => {
// Get child node
let child = master.derivePath(`m/0'/0'/${i}'`)
// Get child wif private key
let wif = child.toWIF()
console.log(`${Object.keys(wallet)} child ${i} wif `, wif)
// Get child extended private key
console.log(`${Object.keys(wallet)} child ${i} xpriv `, child.toBase58())
// Get child EC private key
console.log(`${Object.keys(wallet)} child ${i} privKey `, child.privateKey.toString('hex'))
// Get child extended public key
console.log(`${Object.keys(wallet)} child ${i} xpub `, child.neutered().toBase58())
// Get child EC public key
let ECPubKey = child.publicKey.toString('hex')
console.log(`${Object.keys(wallet)} child ${i} pubKey `, ECPubKey)
// Addresses
// P2PKH
let p2pkh = bitcoin.payments.p2pkh({pubkey: child.publicKey, network}).address
console.log(`${Object.keys(wallet)} child ${i} address p2pkh `, p2pkh)
// P2WPKH
let p2wpkh = bitcoin.payments.p2wpkh({pubkey: child.publicKey, network})
let p2wpkhAddress = p2wpkh.address
console.log(`${Object.keys(wallet)} child ${i} address p2wpkh `, p2wpkhAddress)
// P2SH-P2WPKH
let p2sh_p2wpkh = bitcoin.payments.p2sh({redeem: p2wpkh, network}).address
console.log(`${Object.keys(wallet)} child ${i} address p2sh-p2wpkh `, p2sh_p2wpkh)
console.log()
// No comma for the last derivation
if (i === 2) {
walletsJSON += `{"wif": "${wif}", "pubKey": "${ECPubKey}", "p2pkh": "${p2pkh}", "p2wpkh": "${p2wpkhAddress}", "p2sh-p2wpkh": "${p2sh_p2wpkh}"}`
} else {
walletsJSON += `{"wif": "${wif}", "pubKey": "${ECPubKey}", "p2pkh": "${p2pkh}", "p2wpkh": "${p2wpkhAddress}", "p2sh-p2wpkh": "${p2sh_p2wpkh}"},`
}
})
// No comma for last wallet
wallet_index === 2 ? walletsJSON+="]}" : walletsJSON+="],"
console.log()
})
// Write a json file with main info
exec(
`echo '${walletsJSON}' | jq . > wallets.json`, (error, stdout, stderr) => {
if (error) {
console.error('stderr', stderr)
throw error
}
stdout && console.log(stdout)
console.log('wallets.json has been written successfully')
// Import private keys to Bitcoin Core
exec('./import_privkeys.sh', (error, stdout, stderr) => {
if (error) {
console.error('stderr', stderr)
throw error
}
stdout && console.log(stdout)
console.log('Private keys have been imported to Bitcoin Core successfully')
})
})
#!/usr/bin/env bash
count=0
wallets=(alice alice alice bob bob bob carol carol carol)
cat wallets.json | jq -r '.[][].wif' |
while read -r wif
do
bitcoin-cli importprivkey ${wif} "autogen_${wallets[count]}" false
((count ++))
done
@cirosantilli
Copy link

package.json

{
  "name": "tmp",
  "version": "1.0.0",
  "license": "AGPL",
  "dependencies": {
    "bip32": "2.0.6",
    "bip39": "2.6.0",
    "bitcoinjs-lib": "5.2.0"
  }
}

wallets.json

{
  "alice": [
    {
      "wif": "cQBwuzEBYQrbWKFZZFpgitRpdDDxUrT1nzvhDWhxMmFtWdRnrCSm",
      "pubKey": "03745c9aceb84dcdeddf2c3cdc1edb0b0b5af2f9bf85612d73fa6394758eaee35d",
      "p2pkh": "n4SvybJicv79X1Uc4o3fYXWGwXadA53FSq",
      "p2wpkh": "bcrt1qlwyzpu67l7s9gwv4gzuv4psypkxa4fx4ggs05g",
      "p2sh-p2wpkh": "2MzFvFvnhFskGnVQpUr1ZPr4wYWLwf211s6"
    },
    {
      "wif": "cNSs88aArgZeHrq7wpq8B56k1LGi4BVbSHqzYDic9ztju6TruHM5",
      "pubKey": "02b233055e060a554201d227a0b9d019cf24468ab1a7d9446c423a198cfbf956d5",
      "p2pkh": "mgZt5Fqzszdwf8hDgZt3mUf7js611aKRPc",
      "p2wpkh": "bcrt1qpwzand6l2kke6sh29t56y32k3j35jvhkrn9s5l",
      "p2sh-p2wpkh": "2N95xbaytPcRBwi2HmUTumE7YSfLBk8po99"
    },
    {
      "wif": "cTp88sXB3ZDrWNnD1BtShjREFrw8eCs87bZncrZitryhFbiT2mmQ",
      "pubKey": "0220f2d0315bf811009bf82069dc6be7225cab598d0f3504695539d631711b6252",
      "p2pkh": "n3ZLcnCtfRucM4WLnXqukm9bTdb1PWeETk",
      "p2wpkh": "bcrt1q78rrh0fapgsgvhzrgphulsy6m9fmyw4q2ehuh6",
      "p2sh-p2wpkh": "2NC9jSfJyLLAKQgzxSJ7QGrq4X3Wgh34kCb"
    }
  ],
  "bob": [
    {
      "wif": "cNaEjitvA19JZxWAFyCFMsm16TvGEmVAW3AkPnVr8E9vgwdZWMGV",
      "pubKey": "027efbabf425077cdbceb73f6681c7ebe2ade74a65ea57ebcf0c42364d3822c590",
      "p2pkh": "mfsqh18UT3XjpJ8yVeiM7YX1mLxq5REG9d",
      "p2wpkh": "bcrt1qq0en3c8cnrh5pu0tvu6dc8665u4yzc0cw9nweq",
      "p2sh-p2wpkh": "2N8QRLVT9VTa5ryoqSbGhGqq1x3FKp9SfoJ"
    },
    {
      "wif": "cMhhNRoKiJP37jwwDjoXBhMRk8aEiTTe7fLbFNUc3HwD4jLciNfd",
      "pubKey": "02d8698e38dc413e175c60290b223c0cf175d15f22c889bc98849e81548e1a3168",
      "p2pkh": "mi4kxzYMgjqdqjvfLkHGPi7R1ZrLMx2BH7",
      "p2wpkh": "bcrt1qr06pkr2h98sqkd4lqgm6sngtjar0eswdrpttw7",
      "p2sh-p2wpkh": "2N6j5eEZzeouYMkHLXU5vU4BorXPhAR43NZ"
    },
    {
      "wif": "cSr7dfYATGQzMaS66caTGX3n2owEr5YcMUdmHSc3prj8zfusFz4s",
      "pubKey": "03091bf7a5f90630c7c6c10d68d5555917668d307565ed7ba458e69d137b33f86b",
      "p2pkh": "msPTg2SY8YasMCcCxgA4LocqdxP9SDz8uu",
      "p2wpkh": "bcrt1qsgmtfdh8ndyd7h9zv97xhdel52q6s0s8597nzc",
      "p2sh-p2wpkh": "2NEBdHDRNphUosaHENxyxs3Qp498NHgVtUz"
    }
  ],
  "carol": [
    {
      "wif": "cQj5thuudcupEQo5WTYqVzs6ZtPGkdfCepNUpgJe6VAFeKFfhMtW",
      "pubKey": "023a11cfcedb993ff2e7523f92e359c4454072a66d42e8b74b4b27a8a1258abddd",
      "p2pkh": "mh1HAVWhKkzcvF41MNRKfakVvPV2sfaf3R",
      "p2wpkh": "bcrt1qzpfcvdujk53llu3996ng0k57hn2q96k3dwmytw",
      "p2sh-p2wpkh": "2MyfuZkCtYeSEA4LjJAkkxW6zxdyhKnVyBX"
    },
    {
      "wif": "cP3NxUDcpQGmSEftJ9VVznpMXh8AHkyj9qczSUz2HHjweK2PjcsJ",
      "pubKey": "03e3aee22cc50638083afa8bd60da82cc351588619610566ca28cc50620e3f8cd9",
      "p2pkh": "n3AE1ou9qaJvM8yyhEKg8ktDKYY2aJbGcK",
      "p2wpkh": "bcrt1qa4nj0pgk428zy3rez5xcvjx29c9zcr5654qqzm",
      "p2sh-p2wpkh": "2MttMce5bYsZu22bFvXCKcosef9aJ4Bg36s"
    },
    {
      "wif": "cQkx12ymQJW4yiqRUefqFrYZR6oxHrNBoD7SBcuLTRTRAneFKgTH",
      "pubKey": "03db4f9fadddee79aa79591a55548bbb74018ec82460718bba4e46746d5b5e4d32",
      "p2pkh": "munrKvk5qGsG63be82rBk34hJqqSnSHWEk",
      "p2wpkh": "bcrt1qnjfk7nvpqnfluf6ff9748cq7a60qwj7n99m3l6",
      "p2sh-p2wpkh": "2Mt8ZpgtsnRnY3Lxed4KTExCvJxgePYwuPy"
    }
  ]
}

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment