From: Ian Coleman Date: Mon, 30 Oct 2017 23:35:52 +0000 (+1100) Subject: Allow BitPay address format for bitcoin cash X-Git-Url: https://git.immae.eu/?p=perso%2FImmae%2FProjets%2FCryptomonnaies%2FBIP39.git;a=commitdiff_plain;h=fe8f2d140d9c9e260ebeab7135aa5197b27df406 Allow BitPay address format for bitcoin cash --- diff --git a/src/index.html b/src/index.html index 281e48c..9da3e25 100644 --- a/src/index.html +++ b/src/index.html @@ -575,6 +575,16 @@

Derived Addresses

Note these addreses are derived from the BIP32 Extended Key

+
+ +
diff --git a/src/js/bitcoinjs-extensions.js b/src/js/bitcoinjs-extensions.js index 661e089..4448c7f 100644 --- a/src/js/bitcoinjs-extensions.js +++ b/src/js/bitcoinjs-extensions.js @@ -250,3 +250,14 @@ bitcoinjs.bitcoin.networks.nubits = { scriptHash: 0x1a, wif: 0x96, }; + +bitcoinjs.bitcoin.networks.bitcoinCashBitbpay = { + messagePrefix: '\x18Bitcoin Signed Message:\n', + bip32: { + public: 0x0488b21e, + private: 0x0488ade4 + }, + pubKeyHash: 0x1c, + scriptHash: 0x28, + wif: 0x80 +}; diff --git a/src/js/index.js b/src/js/index.js index d61c314..b1559ef 100644 --- a/src/js/index.js +++ b/src/js/index.js @@ -75,6 +75,8 @@ DOM.generatedStrength = $(".generate-container .strength"); DOM.hardenedAddresses = $(".hardened-addresses"); DOM.useP2wpkhNestedInP2sh = $(".p2wpkh-nested-in-p2sh"); + DOM.useBitpayAddressesContainer = $(".use-bitpay-addresses-container"); + DOM.useBitpayAddresses = $(".use-bitpay-addresses"); DOM.addresses = $(".addresses"); DOM.rowsToAdd = $(".rows-to-add"); DOM.more = $(".more"); @@ -117,6 +119,7 @@ DOM.publicKeyToggle.on("click", togglePublicKeys); DOM.privateKeyToggle.on("click", togglePrivateKeys); DOM.languages.on("click", languageChanged); + DOM.useBitpayAddresses.on("change", useBitpayAddressesChange); setQrEvents(DOM.showQrEls); disableForms(); hidePending(); @@ -131,6 +134,7 @@ clearDerivedKeys(); clearAddressesList(); DOM.litecoinLtubContainer.addClass("hidden"); + DOM.useBitpayAddressesContainer.addClass("hidden"); var networkIndex = e.target.value; var network = networks[networkIndex]; network.onSelect(); @@ -347,6 +351,11 @@ }, 50); } + function useBitpayAddressesChange() { + setBitcoinCashNetworkValues(); + phraseChanged(); + } + function toggleIndexes() { showIndex = !showIndex; $("td.index span").toggleClass("invisible"); @@ -1207,12 +1216,26 @@ DOM.useP2wpkhNestedInP2sh.prop("checked", false); } + function useBitpayAddresses() { + return !(DOM.useBitpayAddresses.prop("checked")); + } + + function setBitcoinCashNetworkValues() { + if (useBitpayAddresses()) { + network = bitcoinjs.bitcoin.networks.bitcoin; + } + else { + network = bitcoinjs.bitcoin.networks.bitcoinCashBitbpay; + } + } + var networks = [ { name: "BCH - Bitcoin Cash", p2wpkhNestedInP2shAvailable: false, onSelect: function() { - network = bitcoinjs.bitcoin.networks.bitcoin; + DOM.useBitpayAddressesContainer.removeClass("hidden"); + setBitcoinCashNetworkValues(); setHdCoin(145); }, }, diff --git a/tests.js b/tests.js index 8ac5646..c0f7df7 100644 --- a/tests.js +++ b/tests.js @@ -4404,6 +4404,37 @@ page.open(url, function(status) { }); }, +// Bitcoin Cash address can be set to use bitpay format +function() { +page.open(url, function(status) { + // set the phrase and coin and address format + var expected = "CZnpA9HPmvhuhLLPWJP8rNDpLUYXy1LXFk"; + page.evaluate(function() { + $(".use-bitpay-addresses").prop("checked", true); + $(".phrase").val("abandon abandon ability"); + $(".phrase").trigger("input"); + $(".network option[selected]").removeAttr("selected"); + $(".network option").filter(function() { + return $(this).html() == "BCH - Bitcoin Cash"; + }).prop("selected", true); + $(".network").trigger("change"); + }); + // check the address is generated correctly + waitForGenerate(function() { + var actual = page.evaluate(function() { + return $(".address:first").text(); + }); + if (actual != expected) { + console.log("Bitcoin Cash address is incorrect"); + console.log("Expected: " + expected); + console.log("Actual: " + actual); + fail(); + } + next(); + }); +}); +}, + // If you wish to add more tests, do so here... // Here is a blank test template