From 40a235eb042d5e592c6577c95cc38b6461e0c53a Mon Sep 17 00:00:00 2001 From: Kiyomichi Kosaka Date: Mon, 5 Apr 2021 19:58:35 +0200 Subject: [PATCH] Fix address generation for HD wallet with different types on simple path scheme. --- js/coin.js | 21 +++++++++++++++++---- 1 file changed, 17 insertions(+), 4 deletions(-) diff --git a/js/coin.js b/js/coin.js index 1e33588f..eef142cd 100644 --- a/js/coin.js +++ b/js/coin.js @@ -706,23 +706,34 @@ var ecparams = EllipticCurve.getSECCurveByName("secp256k1"); var curve = ecparams.getCurve(); - var k, key, pubkey, o; + var k, key, pubkey, o, addr_format, address_fun, address; o = coinjs.clone(this); o.chain_code = ir; o.child_index = i; + addr_format = $("#verifyHDaddress .derivation_addr_format").val(); + if (addr_format == "bech32") { + address_fun = function(pk) { return coinjs.bech32Address(pk); }; + } else if (addr_format == "segwit") { + address_fun = function(pk) { return coinjs.segwitAddress(pk); }; + } else { + address_fun = function(pk) { + return {'address': coinjs.pubkey2address(pubkey), 'redeemscript': ''}; + }; + } if(this.type=='private'){ // derive key pair from from a xprv key k = il.add(new BigInteger([0].concat(Crypto.util.hexToBytes(this.keys.privkey)))).mod(ecparams.getN()); key = Crypto.util.bytesToHex(k.toByteArrayUnsigned()); pubkey = coinjs.newPubkey(key); - + address = address_fun(pubkey); o.keys = {'privkey':key, 'pubkey':pubkey, 'wif':coinjs.privkey2wif(key), - 'address':coinjs.pubkey2address(pubkey)}; + 'address':address.address, + 'script':address.redeemscript}; } else if (this.type=='public'){ // derive xpub key from an xpub key @@ -739,9 +750,11 @@ publicKeyBytesCompressed.unshift(0x03) } pubkey = Crypto.util.bytesToHex(publicKeyBytesCompressed); + address = address_fun(pubkey); o.keys = {'pubkey':pubkey, - 'address':coinjs.pubkey2address(pubkey)} + 'address':address.address, + 'script':address.redeemscript} } else { // fail }