]> git.immae.eu Git - perso/Immae/Projets/Cryptomonnaies/BIP39.git/commitdiff
Add BIP84 tab
authorIan Coleman <ian@iancoleman.io>
Tue, 2 Jan 2018 22:32:14 +0000 (09:32 +1100)
committerIan Coleman <ian@iancoleman.io>
Tue, 2 Jan 2018 22:32:14 +0000 (09:32 +1100)
src/index.html
src/js/index.js
tests/spec/tests.js

index 8d8f75666520f22feb8fc8ad554eeb01d94d8e56..0d1a2c6a39587efe2525b9fe15d08c6c9ed8ffd9 100644 (file)
                         <li id="bip49-tab">
                             <a href="#bip49" role="tab" data-toggle="tab">BIP49</a>
                         </li>
+                        <li id="bip84-tab">
+                            <a href="#bip84" role="tab" data-toggle="tab">BIP84</a>
+                        </li>
                         <li id="bip141-tab">
                             <a href="#bip141" role="tab" data-toggle="tab">BIP141</a>
                         </li>
                                 </div>
                             </form>
                         </div>
+                        <div id="bip84" class="tab-pane">
+                            <form class="form-horizontal" role="form">
+                                <br>
+                                <div class="col-sm-2"></div>
+                                <div class="col-sm-10">
+                                    <p>
+                                        For more info see the
+                                        <a href="https://github.com/bitcoin/bips/blob/master/bip-0084.mediawiki" target="_blank">BIP84 spec</a>.
+                                    </p>
+                                </div>
+                                <div class="form-group">
+                                    <label for="purpose" class="col-sm-2 control-label">
+                                        Purpose
+                                    </label>
+                                    <div class="col-sm-10">
+                                        <input id="purpose" type="text" class="purpose form-control" value="84" readonly>
+                                    </div>
+                                </div>
+                                <div class="form-group">
+                                    <label for="coin" class="col-sm-2 control-label">
+                                        Coin
+                                    </label>
+                                    <div class="col-sm-10">
+                                        <input id="coin" type="text" class="coin form-control" value="0" readonly>
+                                    </div>
+                                </div>
+                                <div class="form-group">
+                                    <label for="account" class="col-sm-2 control-label">
+                                        Account
+                                    </label>
+                                    <div class="col-sm-10">
+                                        <input id="account" type="text" class="account form-control" value="0">
+                                    </div>
+                                </div>
+                                <div class="form-group">
+                                    <label for="change" class="col-sm-2 control-label">
+                                        External / Internal
+                                    </label>
+                                    <div class="col-sm-10">
+                                        <input id="change" type="text" class="change form-control" value="0">
+                                    </div>
+                                </div>
+                                <div class="form-group">
+                                    <label class="col-sm-2 control-label">
+                                    </label>
+                                    <div class="col-sm-10">
+                                        <p>The account extended keys can be used for importing to most BIP84 compatible wallets.</p>
+                                    </div>
+                                </div>
+                                <div class="form-group">
+                                    <label for="account-xprv" class="col-sm-2 control-label">
+                                        <span>Account Extended Private Key</span>
+                                    </label>
+                                    <div class="col-sm-10">
+                                        <textarea id="account-xprv" type="text" class="account-xprv form-control" readonly data-show-qr></textarea>
+                                    </div>
+                                </div>
+                                <div class="form-group">
+                                    <label for="account-xpub" class="col-sm-2 control-label">
+                                        <span>Account Extended Public Key</span>
+                                    </label>
+                                    <div class="col-sm-10">
+                                        <textarea id="account-xpub" type="text" class="account-xpub form-control" readonly data-show-qr></textarea>
+                                    </div>
+                                </div>
+                                <div class="form-group">
+                                    <label class="col-sm-2 control-label">
+                                    </label>
+                                    <div class="col-sm-10">
+                                        <p>The BIP32 derivation path and extended keys are the basis for the derived addresses.</p>
+                                    </div>
+                                </div>
+                                <div class="form-group">
+                                    <label for="bip84-path" class="col-sm-2 control-label">BIP32 Derivation Path</label>
+                                    <div class="col-sm-10">
+                                        <input id="bip84-path" type="text" class="path form-control" value="m/84'/0'/0'/0" readonly="readonly">
+                                    </div>
+                                </div>
+                            </form>
+                        </div>
                     </div>
                     <form class="form-horizontal" role="form">
                         <div class="form-group">
index 9c9ad58ee7e1af0c58a7659d2035340745637364..e63c65fd74cfb1382e00f97650c2c67e4ab29720 100644 (file)
@@ -53,6 +53,7 @@
     DOM.bip32tab = $("#bip32-tab");
     DOM.bip44tab = $("#bip44-tab");
     DOM.bip49tab = $("#bip49-tab");
+    DOM.bip84tab = $("#bip84-tab");
     DOM.bip141tab = $("#bip141-tab");
     DOM.bip32panel = $("#bip32");
     DOM.bip44panel = $("#bip44");
     DOM.bip49accountXprv = $("#bip49 .account-xprv");
     DOM.bip49accountXpub = $("#bip49 .account-xpub");
     DOM.bip49change = $("#bip49 .change");
+    DOM.bip84path = $("#bip84-path");
+    DOM.bip84purpose = $("#bip84 .purpose");
+    DOM.bip84coin = $("#bip84 .coin");
+    DOM.bip84account = $("#bip84 .account");
+    DOM.bip84accountXprv = $("#bip84 .account-xprv");
+    DOM.bip84accountXpub = $("#bip84 .account-xpub");
+    DOM.bip84change = $("#bip84 .change");
     DOM.bip141unavailable = $("#bip141 .unavailable");
     DOM.bip141available = $("#bip141 .available");
     DOM.bip141path = $("#bip141-path");
         DOM.bip44change.on("input", calcForDerivationPath);
         DOM.bip49account.on("input", calcForDerivationPath);
         DOM.bip49change.on("input", calcForDerivationPath);
+        DOM.bip84account.on("input", calcForDerivationPath);
+        DOM.bip84change.on("input", calcForDerivationPath);
         DOM.bip141path.on("input", calcForDerivationPath);
         DOM.bip141semantics.on("change", tabChanged);
         DOM.tab.on("shown.bs.tab", tabChanged);
         else if (bip49TabSelected()) {
             displayBip49Info();
         }
+        else if (bip84TabSelected()) {
+            displayBip84Info();
+        }
         displayBip32Info();
     }
 
             console.log("Using derivation path from BIP49 tab: " + derivationPath);
             return derivationPath;
         }
+        else if (bip84TabSelected()) {
+            var purpose = parseIntNoNaN(DOM.bip84purpose.val(), 84);
+            var coin = parseIntNoNaN(DOM.bip84coin.val(), 0);
+            var account = parseIntNoNaN(DOM.bip84account.val(), 0);
+            var change = parseIntNoNaN(DOM.bip84change.val(), 0);
+            var path = "m/";
+            path += purpose + "'/";
+            path += coin + "'/";
+            path += account + "'/";
+            path += change;
+            DOM.bip84path.val(path);
+            var derivationPath = DOM.bip84path.val();
+            console.log("Using derivation path from BIP84 tab: " + derivationPath);
+            return derivationPath;
+        }
         else if (bip32TabSelected()) {
             var derivationPath = DOM.bip32path.val();
             console.log("Using derivation path from BIP32 tab: " + derivationPath);
         DOM.bip49accountXpub.val(accountXpub);
     }
 
+    function displayBip84Info() {
+        // Get the derivation path for the account
+        var purpose = parseIntNoNaN(DOM.bip84purpose.val(), 84);
+        var coin = parseIntNoNaN(DOM.bip84coin.val(), 0);
+        var account = parseIntNoNaN(DOM.bip84account.val(), 0);
+        var path = "m/";
+        path += purpose + "'/";
+        path += coin + "'/";
+        path += account + "'/";
+        // Calculate the account extended keys
+        var accountExtendedKey = calcBip32ExtendedKey(path);
+        var accountXprv = accountExtendedKey.toBase58();
+        var accountXpub = accountExtendedKey.neutered().toBase58();
+        // Display the extended keys
+        DOM.bip84accountXprv.val(accountXprv);
+        DOM.bip84accountXpub.val(accountXpub);
+    }
+
     function displayBip32Info() {
         // Display the key
         DOM.seed.val(seed);
     }
 
     function segwitSelected() {
-        return bip49TabSelected() || bip141TabSelected();
+        return bip49TabSelected() || bip84TabSelected() || bip141TabSelected();
     }
 
     function p2wpkhSelected() {
-        return bip141TabSelected() && DOM.bip141semantics.val() == "p2wpkh";
+        return bip84TabSelected() ||
+                bip141TabSelected() && DOM.bip141semantics.val() == "p2wpkh";
     }
 
     function p2wpkhInP2shSelected() {
         return DOM.bip49tab.hasClass("active");
     }
 
+    function bip84TabSelected() {
+        return DOM.bip84tab.hasClass("active");
+    }
+
     function bip141TabSelected() {
         return DOM.bip141tab.hasClass("active");
     }
     function setHdCoin(coinValue) {
         DOM.bip44coin.val(coinValue);
         DOM.bip49coin.val(coinValue);
+        DOM.bip84coin.val(coinValue);
     }
 
     function showSegwitAvailable() {
index 7691fccb5884fb81b5d93d4ac6f295c14da55870..07b7b1aba31dd03099c001c9c1ffb2b4d0fef33d 100644 (file)
@@ -2684,4 +2684,152 @@ it('Shows the index of each word in the mnemonic', function(done) {
     });
 });
 
+it('Shows the derivation path for bip84 tab', function(done) {
+    driver.findElement(By.css('#bip84-tab a'))
+        .click()
+    driver.findElement(By.css('.phrase'))
+        .sendKeys('abandon abandon ability');
+    driver.sleep(generateDelay).then(function() {
+        driver.findElement(By.css('#bip84 .path'))
+            .getAttribute("value")
+            .then(function(path) {
+                expect(path).toBe("m/84'/0'/0'/0");
+                done();
+            })
+    });
+});
+
+it('Shows the extended private key for bip84 tab', function(done) {
+    driver.findElement(By.css('#bip84-tab a'))
+        .click()
+    driver.findElement(By.css('.phrase'))
+        .sendKeys('abandon abandon ability');
+    driver.sleep(generateDelay).then(function() {
+        driver.findElement(By.css('.extended-priv-key'))
+            .getAttribute("value")
+            .then(function(path) {
+                expect(path).toBe("zprvAev3RKrZ3QVKiUFCfdeMRen1BPDJgdNt1XpxiDy8acSs4kkAGTCvq7HeRYRNNpo8EtEjCFQBWavJwtCUR29y4TUCH4X5RXMcyq48uN8y9BP");
+                done();
+            })
+    });
+});
+
+it('Shows the extended public key for bip84 tab', function(done) {
+    driver.findElement(By.css('#bip84-tab a'))
+        .click()
+    driver.findElement(By.css('.phrase'))
+        .sendKeys('abandon abandon ability');
+    driver.sleep(generateDelay).then(function() {
+        driver.findElement(By.css('.extended-pub-key'))
+            .getAttribute("value")
+            .then(function(path) {
+                expect(path).toBe("zpub6suPpqPSsn3cvxKfmfBMnnijjR3o666jNkkZWcNk8wyqwZ5JozXBNuc8Gs7DB3uLwTDvGVTspVEAUQcEjKF3pZHgywVbubdTqbXTUg7usyx");
+                done();
+            })
+    });
+});
+
+it('Changes the address list if bip84 account is changed', function(done) {
+    driver.findElement(By.css('#bip84-tab a'))
+        .click()
+    driver.findElement(By.css('#bip84 .account'))
+        .sendKeys('1');
+    driver.findElement(By.css('.phrase'))
+        .sendKeys('abandon abandon ability');
+    driver.sleep(generateDelay).then(function() {
+        getFirstAddress(function(address) {
+            expect(address).toBe("bc1qp7vv669t2fy965jdzvqwrraana89ctd5ewc662");
+            done();
+        });
+    });
+});
+
+it('Changes the address list if bip84 change is changed', function(done) {
+    driver.findElement(By.css('#bip84-tab a'))
+        .click()
+    driver.findElement(By.css('#bip84 .change'))
+        .sendKeys('1');
+    driver.findElement(By.css('.phrase'))
+        .sendKeys('abandon abandon ability');
+    driver.sleep(generateDelay).then(function() {
+        getFirstAddress(function(address) {
+            expect(address).toBe("bc1qr39vj6rh06ff05m53uxq8uazehwhccswylhrs2");
+            done();
+        });
+    });
+});
+
+it('Passes the official BIP84 test spec for rootpriv', function(done) {
+    driver.findElement(By.css('#bip84-tab a'))
+        .click()
+    driver.findElement(By.css('.phrase'))
+        .sendKeys('abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon about');
+    driver.sleep(generateDelay).then(function() {
+        driver.findElement(By.css(".root-key"))
+        .getAttribute("value")
+        .then(function(rootKey) {
+            expect(rootKey).toBe("zprvAWgYBBk7JR8Gjrh4UJQ2uJdG1r3WNRRfURiABBE3RvMXYSrRJL62XuezvGdPvG6GFBZduosCc1YP5wixPox7zhZLfiUm8aunE96BBa4Kei5");
+            done();
+        })
+    });
+});
+
+it('Passes the official BIP84 test spec for account 0 xprv', function(done) {
+    driver.findElement(By.css('#bip84-tab a'))
+        .click()
+    driver.findElement(By.css('.phrase'))
+        .sendKeys('abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon about');
+    driver.sleep(generateDelay).then(function() {
+        driver.findElement(By.css("#bip84 .account-xprv"))
+        .getAttribute("value")
+        .then(function(rootKey) {
+            expect(rootKey).toBe("zprvAdG4iTXWBoARxkkzNpNh8r6Qag3irQB8PzEMkAFeTRXxHpbF9z4QgEvBRmfvqWvGp42t42nvgGpNgYSJA9iefm1yYNZKEm7z6qUWCroSQnE");
+            done();
+        })
+    });
+});
+
+it('Passes the official BIP84 test spec for account 0 xpub', function(done) {
+    driver.findElement(By.css('#bip84-tab a'))
+        .click()
+    driver.findElement(By.css('.phrase'))
+        .sendKeys('abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon about');
+    driver.sleep(generateDelay).then(function() {
+        driver.findElement(By.css("#bip84 .account-xpub"))
+        .getAttribute("value")
+        .then(function(rootKey) {
+            expect(rootKey).toBe("zpub6rFR7y4Q2AijBEqTUquhVz398htDFrtymD9xYYfG1m4wAcvPhXNfE3EfH1r1ADqtfSdVCToUG868RvUUkgDKf31mGDtKsAYz2oz2AGutZYs");
+            done();
+        })
+    });
+});
+
+it('Passes the official BIP84 test spec for account 0 first address', function(done) {
+    driver.findElement(By.css('#bip84-tab a'))
+        .click()
+    driver.findElement(By.css('.phrase'))
+        .sendKeys('abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon about');
+    driver.sleep(generateDelay).then(function() {
+        getFirstAddress(function(address) {
+            expect(address).toBe("bc1qcr8te4kr609gcawutmrza0j4xv80jy8z306fyu");
+            done();
+        });
+    });
+});
+
+it('Passes the official BIP84 test spec for account 0 first change address', function(done) {
+    driver.findElement(By.css('#bip84-tab a'))
+        .click()
+    driver.findElement(By.css('.phrase'))
+        .sendKeys('abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon about');
+    driver.findElement(By.css('#bip84 .change'))
+        .sendKeys('1');
+    driver.sleep(generateDelay).then(function() {
+        getFirstAddress(function(address) {
+            expect(address).toBe("bc1q8c6fshw2dlwun7ekn9qwf37cu2rn755upcp6el");
+            done();
+        });
+    });
+});
+
 });