diff --git a/src/index.html b/src/index.html index 0588171..cc84247 100644 --- a/src/index.html +++ b/src/index.html @@ -1104,6 +1104,7 @@ + diff --git a/src/js/bitcoinjs-extensions.js b/src/js/bitcoinjs-extensions.js index 84de8da..cc28677 100644 --- a/src/js/bitcoinjs-extensions.js +++ b/src/js/bitcoinjs-extensions.js @@ -1531,6 +1531,17 @@ libs.bitcoin.networks.bitcoinprivate = { wif: 0x80, }; +libs.bitcoin.networks.bitcoinprivatetestnet = { + messagePrefix: '\x18BitcoinPrivate Signed Message:\n', + bip32: { + public: 0x043587CF, + private: 0x04358394, + }, + pubKeyHash: 0x1957, + scriptHash: 0x19E0, + wif: 0xEF, +}; + libs.bitcoin.networks.bitcoinz = { messagePrefix: '\x18BitcoinZ Signed Message:\n', bip32: { diff --git a/src/js/index.js b/src/js/index.js index 8e103e4..1e86c91 100644 --- a/src/js/index.js +++ b/src/js/index.js @@ -209,12 +209,7 @@ var network = networks[networkIndex]; network.onSelect(); adjustNetworkForSegwit(); - if (seed != null) { - phraseChanged(); - } - else { - rootKeyChanged(); - } + rootKeyChanged(); } function bip32ClientChanged(e) { @@ -495,13 +490,16 @@ var app = DOM.bip85application.val(); - var phrase = DOM.phrase.val(); - var passphrase = DOM.passphrase.val(); - if (!phrase) { + var rootKeyBase58 = DOM.rootKey.val(); + if (!rootKeyBase58) { return; } try { - var master = libs.bip85.BIP85.fromMnemonic(phrase, passphrase); + // try parsing using base network params + // The bip85 lib only understands xpubs, so compute it + var rootKey = libs.bitcoin.HDNode.fromBase58(rootKeyBase58, network); + rootKey.keyPair.network = libs.bitcoin.networks['bitcoin'] + var master = libs.bip85.BIP85.fromBase58(rootKey.toBase58()); var result; @@ -1350,21 +1348,21 @@ } // ZooBC address format may vary - if (networks[DOM.network.val()].name == "ZBC - ZooBlockchain") { - + if (networks[DOM.network.val()].name == "ZBC - ZooBlockchain") { + var purpose = parseIntNoNaN(DOM.bip44purpose.val(), 44); var coin = parseIntNoNaN(DOM.bip44coin.val(), 0); var path = "m/"; path += purpose + "'/"; path += coin + "'/" + index + "'"; var result = libs.zoobcUtil.getKeypair(path, seed); - + let publicKey = result.pubKey.slice(1, 33); let privateKey = result.key; - + privkey = privateKey.toString('hex'); pubkey = publicKey.toString('hex'); - + indexText = path; address = libs.zoobcUtil.getZBCAddress(publicKey, 'ZBC'); } @@ -1425,15 +1423,35 @@ pubkey = CosmosBufferToPublic(keyPair.getPublicKeyBuffer(), hrp); privkey = keyPair.d.toBuffer().toString("base64"); } - + if (networks[DOM.network.val()].name == "RUNE - THORChain") { const hrp = "thor"; address = CosmosBufferToAddress(keyPair.getPublicKeyBuffer(), hrp); pubkey = keyPair.getPublicKeyBuffer().toString("hex"); privkey = keyPair.d.toBuffer().toString("hex"); - } + } + + if (networks[DOM.network.val()].name == "XWC - Whitecoin"){ + address = XWCbufferToAddress(keyPair.getPublicKeyBuffer()); + pubkey = XWCbufferToPublic(keyPair.getPublicKeyBuffer()); + privkey = XWCbufferToPrivate(keyPair.d.toBuffer(32)); + } - //Groestlcoin Addresses are different + if (networks[DOM.network.val()].name == "LUNA - Terra") { + const hrp = "terra"; + address = CosmosBufferToAddress(keyPair.getPublicKeyBuffer(), hrp); + pubkey = keyPair.getPublicKeyBuffer().toString("hex"); + privkey = keyPair.d.toBuffer().toString("hex"); + } + + if (networks[DOM.network.val()].name == "IOV - Starname") { + const hrp = "star"; + address = CosmosBufferToAddress(keyPair.getPublicKeyBuffer(), hrp); + pubkey = CosmosBufferToPublic(keyPair.getPublicKeyBuffer(), hrp); + privkey = keyPair.d.toBuffer().toString("base64"); + } + + //Groestlcoin Addresses are different if(isGRS()) { if (isSegwit) { @@ -2397,6 +2415,13 @@ setHdCoin(183); }, }, + { + name: "BTCPt - Bitcoin Private Testnet", + onSelect: function() { + network = libs.bitcoin.networks.bitcoinprivatetestnet; + setHdCoin(1); + }, + }, { name: "BSC - Binance Smart Chain", onSelect: function() { @@ -2859,6 +2884,13 @@ }, }, { + name: "IOV - Starname", + onSelect: function() { + network = libs.bitcoin.networks.bitcoin; + setHdCoin(234); + }, + }, + { name: "IXC - Ixcoin", onSelect: function() { network = libs.bitcoin.networks.ixcoin; @@ -2947,6 +2979,13 @@ setHdCoin(221); }, }, + { + name: "LUNA - Terra", + onSelect: function() { + network = libs.bitcoin.networks.bitcoin; + setHdCoin(330); + }, + }, { name: "LYNX - Lynx", onSelect: function() { @@ -3583,7 +3622,7 @@ }, }, { - name: "XWC - Whitecoin", + name: "XWCC - Whitecoin Classic", onSelect: function() { network = libs.bitcoin.networks.whitecoin; setHdCoin(155); @@ -3624,6 +3663,13 @@ setHdCoin(121); }, }, + { + name: "XWC - Whitecoin", + onSelect: function() { + network = libs.bitcoin.networks.bitcoin; + setHdCoin(559); + }, + } ] var clients = [ diff --git a/src/js/xwc-util.js b/src/js/xwc-util.js new file mode 100644 index 0000000..fc47d05 --- /dev/null +++ b/src/js/xwc-util.js @@ -0,0 +1,28 @@ +function XWCbufferToAddress(pubBuf){ + const Buffer = libs.buffer.Buffer; + const XWC_ADDRESS_PREFIX = "XWC"; + const XWC_NORMAL_ADDRESS_VERSION = "35" + let addrData = libs.createHash("rmd160").update( libs.createHash("sha512").update(pubBuf).digest()).digest(); + let addrBuf = Buffer.concat([Buffer.from(XWC_NORMAL_ADDRESS_VERSION, "hex") ,addrData]) + let checksum = libs.createHash("rmd160").update(addrBuf).digest("hex").slice(0, 8); + addrBuf = Buffer.concat([addrBuf, Buffer.from(checksum, "hex")]); + return XWC_ADDRESS_PREFIX.concat(libs.bs58.encode(addrBuf)); +} + +function XWCbufferToPublic(pubBuf) { + const Buffer = libs.buffer.Buffer; + const XWC_PUBLIC_PREFIX = "XWC"; + let checksum = libs.createHash("rmd160").update(pubBuf).digest("hex").slice(0, 8); + pubBuf = Buffer.concat([pubBuf, Buffer.from(checksum, "hex")]); + return XWC_PUBLIC_PREFIX.concat(libs.bs58.encode(pubBuf)); +} + +function XWCbufferToPrivate(privBuf) { + const Buffer = libs.buffer.Buffer; + const XWC_PRIVATE_PREFIX = "80"; + privBuf = Buffer.concat([Buffer.from(XWC_PRIVATE_PREFIX, "hex"), privBuf]); + let tmp = libs.createHash("sha256").update(privBuf).digest(); + let checksum = libs.createHash("sha256").update(tmp).digest("hex").slice(0, 8); + privBuf = Buffer.concat([privBuf, Buffer.from(checksum, "hex")]); + return libs.bs58.encode(privBuf); +} diff --git a/tests/spec/tests.js b/tests/spec/tests.js index 523f076..67e4221 100644 --- a/tests/spec/tests.js +++ b/tests/spec/tests.js @@ -927,6 +927,16 @@ it('Allows selection of Cosmos Hub', function(done) { }; testNetwork(done, params); }); +it('Allows selection of Terra', function(done) { + var params = { + selectText: "LUNA - Terra", + phrase: "abandon abandon ability", + firstAddress: "terra1txr4jwel3vjl64vrc08pljnjryqkhtffmyp265", + firstPubKey: "028e7658e3debb2d9d458919bfba0e85b0220e845f7552176f30a52acd0f809d71", + firstPrivKey: "d611b211e370aa1edd9743acd6ce537d16fade85d7ae7e88b32f3a0483f52535", + }; + testNetwork(done, params); +}); it('Allows selection of Auroracoin', function(done) { var params = { selectText: "AUR - Auroracoin", @@ -987,6 +997,16 @@ it('Allows selection of Bitcoin Private', function(done) { }; testNetwork(done, params); }); +it('Allows selection of Bitcoin Private testnet', function(done) { + var params = { + selectText: "BTCPt - Bitcoin Private Testnet", + phrase: "abandon abandon ability", + firstAddress: "n1UcUUSDfDppfzh7XLJNHmZkLdbTQg3VAZL", + firstPubKey: "0382a5450765e2025bdb5f7d109c9254a11ef97a566228bf171d80ecb348763bb0", + firstPrivKey: "cV3coiYD2NhHKfhC6Gb8DzpvPzcGYYExYxuNxpUtKq3VUJrkFLZx", + }; + testNetwork(done, params); +}); it('Allows selection of Bitcoin SV', function(done) { var params = { selectText: "BSV - BitcoinSV", @@ -1355,6 +1375,16 @@ it('Allows selection of Iop', function(done) { }; testNetwork(done, params); }); +it('Allows selection of Starname', function(done) { + var params = { + selectText: "IOV - Starname", + phrase: "abandon abandon ability", + firstAddress: "star1xgfvgq40r7ff8ylw9l95dw56xnr0pvtjnlp7h4", + firstPubKey: "starpub1addwnpepqg9x5cft48hcgx25vyzeyygntl7pt763datr6v50hrecafyane54xlqdxkd", + firstPrivKey: "bGI4BNRvMYT1lbCOoH000HvNFPkyXms9n3Xp1X/7E80=", + }; + testNetwork(done, params); +}); it('Allows selection of Ixcoin', function(done) { var params = { selectText: "IXC - Ixcoin", @@ -1885,9 +1915,9 @@ it('Allows selection of VeChain', function(done) { }; testNetwork(done, params); }); -it('Allows selection of Whitecoin', function(done) { +it('Allows selection of Whitecoin Classic', function(done) { var params = { - selectText: "XWC - Whitecoin", + selectText: "XWCC - Whitecoin Classic", phrase: "abandon abandon ability", firstAddress: "WcSwCAUqrSgeSYbsaS3SSWWhsx8KRYTFDR", firstPubKey: "03d3f4fa758f6260bfb39664d248a32258b53a90a71224db056ee79abaa3e9f208", @@ -1895,6 +1925,16 @@ it('Allows selection of Whitecoin', function(done) { }; testNetwork(done, params); }); +it('Allows selection of Whitecoin', function(done) { + var params = { + selectText: "XWC - Whitecoin", + phrase: "abandon abandon ability", + firstAddress: "XWCNY5EQsC55ifxRVEbP7H28yc3TMXC2pqsb5", + firstPubKey: "XWC68fEy4cCc8G1UWyeMPnQ5NjEhMUFSvu1oz4gLKxvj3dPvh7v18", + firstPrivKey: "5K8toD6TYy5DMHkxjpywXNLj4M6CjZAT5h12uhRuVuBBRtci8Zw", + }; + testNetwork(done, params); +}); it('Allows selection of Wincoin', function(done) { var params = { selectText: "WC - Wincoin",