]> git.immae.eu Git - perso/Immae/Projets/Cryptomonnaies/BIP39.git/commitdiff
Allow BitPay address format for bitcoin cash
authorIan Coleman <coleman.ian@gmail.com>
Mon, 30 Oct 2017 23:35:52 +0000 (10:35 +1100)
committerIan Coleman <coleman.ian@gmail.com>
Mon, 30 Oct 2017 23:35:52 +0000 (10:35 +1100)
src/index.html
src/js/bitcoinjs-extensions.js
src/js/index.js
tests.js

index 281e48c25d813cd8400f4b97fa1835b8ff931247..9da3e2561a1bc3a716e2be3fa537a00533128fca 100644 (file)
                 <div class="col-md-12">
                     <h2>Derived Addresses</h2>
                     <p>Note these addreses are derived from the BIP32 Extended Key</p>
                 <div class="col-md-12">
                     <h2>Derived Addresses</h2>
                     <p>Note these addreses are derived from the BIP32 Extended Key</p>
+                </div>
+                <div class="col-md-12 use-bitpay-addresses-container hidden">
+                    <div class="checkbox">
+                        <label>
+                            <input type="checkbox" class="use-bitpay-addresses">
+                            <span>Use BitPay-style addresses for Bitcoin Cash (ie starting with 'C' instead of '1')</span>
+                        </label>
+                    </div>
+                </div>
+                <div class="col-md-12">
                     <table class="table table-striped">
                         <thead>
                             <th>
                     <table class="table table-striped">
                         <thead>
                             <th>
index 661e089b79a7c5a24169ed259160bcc3ac806e2d..4448c7f1d102b5ca8ea6940e2af9d6cf86ce2a55 100644 (file)
@@ -250,3 +250,14 @@ bitcoinjs.bitcoin.networks.nubits = {
   scriptHash: 0x1a,
   wif: 0x96,
 };
   scriptHash: 0x1a,
   wif: 0x96,
 };
+
+bitcoinjs.bitcoin.networks.bitcoinCashBitbpay = {
+    messagePrefix: '\x18Bitcoin Signed Message:\n',
+    bip32: {
+      public: 0x0488b21e,
+      private: 0x0488ade4
+    },
+    pubKeyHash: 0x1c,
+    scriptHash: 0x28,
+    wif: 0x80
+};
index d61c31487d6b70b0b5ee22937ee7c620c21f1fa6..b1559ef8fbac65e01d047c70a57c026e4327abba 100644 (file)
@@ -75,6 +75,8 @@
     DOM.generatedStrength = $(".generate-container .strength");
     DOM.hardenedAddresses = $(".hardened-addresses");
     DOM.useP2wpkhNestedInP2sh = $(".p2wpkh-nested-in-p2sh");
     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");
     DOM.addresses = $(".addresses");
     DOM.rowsToAdd = $(".rows-to-add");
     DOM.more = $(".more");
         DOM.publicKeyToggle.on("click", togglePublicKeys);
         DOM.privateKeyToggle.on("click", togglePrivateKeys);
         DOM.languages.on("click", languageChanged);
         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();
         setQrEvents(DOM.showQrEls);
         disableForms();
         hidePending();
         clearDerivedKeys();
         clearAddressesList();
         DOM.litecoinLtubContainer.addClass("hidden");
         clearDerivedKeys();
         clearAddressesList();
         DOM.litecoinLtubContainer.addClass("hidden");
+        DOM.useBitpayAddressesContainer.addClass("hidden");
         var networkIndex = e.target.value;
         var network = networks[networkIndex];
         network.onSelect();
         var networkIndex = e.target.value;
         var network = networks[networkIndex];
         network.onSelect();
         }, 50);
     }
 
         }, 50);
     }
 
+    function useBitpayAddressesChange() {
+        setBitcoinCashNetworkValues();
+        phraseChanged();
+    }
+
     function toggleIndexes() {
         showIndex = !showIndex;
         $("td.index span").toggleClass("invisible");
     function toggleIndexes() {
         showIndex = !showIndex;
         $("td.index span").toggleClass("invisible");
         DOM.useP2wpkhNestedInP2sh.prop("checked", false);
     }
 
         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() {
     var networks = [
         {
             name: "BCH - Bitcoin Cash",
             p2wpkhNestedInP2shAvailable: false,
             onSelect: function() {
-                network = bitcoinjs.bitcoin.networks.bitcoin;
+                DOM.useBitpayAddressesContainer.removeClass("hidden");
+                setBitcoinCashNetworkValues();
                 setHdCoin(145);
             },
         },
                 setHdCoin(145);
             },
         },
index 8ac56468c1fc6a779c38518b498802547adaa491..c0f7df78377972a221f6707c322c254e69aef081 100644 (file)
--- 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
 // If you wish to add more tests, do so here...
 
 // Here is a blank test template