DOM.hardenedAddresses = $(".hardened-addresses");
DOM.useBitpayAddressesContainer = $(".use-bitpay-addresses-container");
DOM.useBitpayAddresses = $(".use-bitpay-addresses");
+ DOM.useBip38 = $(".use-bip38");
+ DOM.bip38Password = $(".bip38-password");
DOM.addresses = $(".addresses");
DOM.csvTab = $("#csv-tab a");
DOM.csv = $(".csv");
DOM.bip141semantics.on("change", tabChanged);
DOM.tab.on("shown.bs.tab", tabChanged);
DOM.hardenedAddresses.on("change", calcForDerivationPath);
+ DOM.useBip38.on("change", calcForDerivationPath);
+ DOM.bip38Password.on("change", calcForDerivationPath);
DOM.indexToggle.on("click", toggleIndexes);
DOM.addressToggle.on("click", toggleAddresses);
DOM.publicKeyToggle.on("click", togglePublicKeys);
var self = this;
this.shouldGenerate = true;
var useHardenedAddresses = DOM.hardenedAddresses.prop("checked");
+ var useBip38 = DOM.useBip38.prop("checked");
+ var bip38password = DOM.bip38Password.val();
var isSegwit = segwitSelected();
var segwitAvailable = networkHasSegwit();
var isP2wpkh = p2wpkhSelected();
if (!self.shouldGenerate) {
return;
}
+ // derive HDkey for this row of the table
var key = "NA";
if (useHardenedAddresses) {
key = bip32ExtendedKey.deriveHardened(index);
else {
key = bip32ExtendedKey.derive(index);
}
- var address = key.getAddress().toString();
+ // bip38 requires uncompressed keys
+ // see https://github.com/iancoleman/bip39/issues/140#issuecomment-352164035
+ var keyPair = key.keyPair;
+ var useUncompressed = useBip38;
+ if (useUncompressed) {
+ keyPair = new bitcoinjs.bitcoin.ECPair(keyPair.d, null, { compressed: false });
+ }
+ // get address
+ var address = keyPair.getAddress().toString();
+ // get privkey
+ var hasPrivkey = !key.isNeutered();
var privkey = "NA";
- if (!key.isNeutered()) {
- privkey = key.keyPair.toWIF(network);
+ if (hasPrivkey) {
+ privkey = keyPair.toWIF(network);
+ // BIP38 encode private key if required
+ if (useBip38) {
+ privkey = bitcoinjsBip38.encrypt(keyPair.d.toBuffer(), false, bip38password, function(p) {
+ console.log("Progressed " + p.percent.toFixed(1) + "% for index " + index);
+ });
+ }
}
- var pubkey = key.getPublicKeyBuffer().toString('hex');
+ // get pubkey
+ var pubkey = keyPair.getPublicKeyBuffer().toString('hex');
var indexText = getDerivationPath() + "/" + index;
if (useHardenedAddresses) {
indexText = indexText + "'";
}
// Ethereum values are different
if (networks[DOM.network.val()].name == "ETH - Ethereum") {
- var privKeyBuffer = key.keyPair.d.toBuffer();
+ var privKeyBuffer = keyPair.d.toBuffer(32);
privkey = privKeyBuffer.toString('hex');
var addressBuffer = ethUtil.privateToAddress(privKeyBuffer);
var hexAddress = addressBuffer.toString('hex');
}
var networks = [
+ {
+ name: "AXE - Axe",
+ segwitAvailable: false,
+ onSelect: function() {
+ network = bitcoinjs.bitcoin.networks.axe;
+ setHdCoin(0);
+ },
+ },
{
name: "BCH - Bitcoin Cash",
segwitAvailable: false,