]> git.immae.eu Git - perso/Immae/Projets/Cryptomonnaies/BIP39.git/blobdiff - src/js/index.js
Add a button to remove the "change" in the derivation path for ethereum
[perso/Immae/Projets/Cryptomonnaies/BIP39.git] / src / js / index.js
index b19dc4c5054cb5200fe3c78fb18adb880fbccfca..68c74f6912f0ac7d97940d5d611ffd30384ced55 100644 (file)
@@ -15,6 +15,7 @@
     var showPrivKey = true;
     var showQr = false;
     var litecoinUseLtub = true;
+    var isDefaultBip44ChangeValue = true;
 
     var entropyTypeAutoDetect = true;
     var entropyChangeTimeoutEvent = null;
@@ -76,6 +77,7 @@
     DOM.bip44accountXprv = $("#bip44 .account-xprv");
     DOM.bip44accountXpub = $("#bip44 .account-xpub");
     DOM.bip44change = $("#bip44 .change");
+    DOM.defaultBip44ChangeValue = $("#bip44 .default-bip44-change-value");
     DOM.bip49unavailable = $("#bip49 .unavailable");
     DOM.bip49available = $("#bip49 .available");
     DOM.bip49path = $("#bip49-path");
     DOM.bip84accountXprv = $("#bip84 .account-xprv");
     DOM.bip84accountXpub = $("#bip84 .account-xpub");
     DOM.bip84change = $("#bip84 .change");
+    DOM.bip85 = $('.bip85');
+    DOM.showBip85 = $('.showBip85');
+    DOM.bip85Field = $('.bip85Field');
+    DOM.bip85application = $('#bip85-application');
+    DOM.bip85mnemonicLanguage = $('#bip85-mnemonic-language');
+    DOM.bip85mnemonicLanguageInput = $('.bip85-mnemonic-language-input');
+    DOM.bip85mnemonicLength = $('#bip85-mnemonic-length');
+    DOM.bip85mnemonicLengthInput = $('.bip85-mnemonic-length-input');
+    DOM.bip85index = $('#bip85-index');
+    DOM.bip85indexInput = $('.bip85-index-input');
+    DOM.bip85bytes = $('#bip85-bytes');
+    DOM.bip85bytesInput = $('.bip85-bytes-input');
     DOM.bip141unavailable = $("#bip141 .unavailable");
     DOM.bip141available = $("#bip141 .available");
     DOM.bip141path = $("#bip141-path");
         DOM.more.on("click", showMore);
         DOM.seed.on("input", delayedSeedChanged);
         DOM.rootKey.on("input", delayedRootKeyChanged);
+        DOM.showBip85.on('change', toggleBip85);
         DOM.litecoinUseLtub.on("change", litecoinUseLtubChanged);
         DOM.bip32path.on("input", calcForDerivationPath);
         DOM.bip44account.on("input", calcForDerivationPath);
+        DOM.bip44change.on("input", modifiedDefaultBip44ChangeValue);
         DOM.bip44change.on("input", calcForDerivationPath);
+        DOM.defaultBip44ChangeValue.on("click", resetDefaultBip44ChangeValue);
         DOM.bip49account.on("input", calcForDerivationPath);
         DOM.bip49change.on("input", calcForDerivationPath);
         DOM.bip84account.on("input", calcForDerivationPath);
         DOM.bip84change.on("input", calcForDerivationPath);
+        DOM.bip85application.on('input', calcBip85);
+        DOM.bip85mnemonicLanguage.on('change', calcBip85);
+        DOM.bip85mnemonicLength.on('change', calcBip85);
+        DOM.bip85index.on('input', calcBip85);
+        DOM.bip85bytes.on('input', calcBip85);
         DOM.bip141path.on("input", calcForDerivationPath);
         DOM.bip141semantics.on("change", tabChanged);
         DOM.tab.on("shown.bs.tab", tabChanged);
         var passphrase = DOM.passphrase.val();
         calcBip32RootKeyFromSeed(phrase, passphrase);
         calcForDerivationPath();
+        calcBip85();
         // Show the word indexes
         showWordIndexes();
         writeSplitPhrase(phrase);
         }
         // Calculate and display
         calcForDerivationPath();
+        calcBip85();
     }
 
     function rootKeyChanged() {
         // Calculate and display
         calcBip32RootKeyFromBase58(rootKeyBase58);
         calcForDerivationPath();
+        calcBip85();
     }
 
     function litecoinUseLtubChanged() {
         }
     }
 
+    function toggleBip85() {
+      if (DOM.showBip85.prop('checked')) {
+        DOM.bip85.removeClass('hidden');
+        calcBip85();
+      } else {
+        DOM.bip85.addClass('hidden');
+      }
+    }
+
+    function toggleBip85Fields() {
+      if (DOM.showBip85.prop('checked')) {
+        DOM.bip85mnemonicLanguageInput.addClass('hidden');
+        DOM.bip85mnemonicLengthInput.addClass('hidden');
+        DOM.bip85bytesInput.addClass('hidden');
+
+        var app = DOM.bip85application.val();
+        if (app === 'bip39') {
+          DOM.bip85mnemonicLanguageInput.removeClass('hidden');
+          DOM.bip85mnemonicLengthInput.removeClass('hidden');
+        } else if (app === 'hex') {
+          DOM.bip85bytesInput.removeClass('hidden');
+        }
+      }
+    }
+
+    function calcBip85() {
+      if (!DOM.showBip85.prop('checked')) {
+        return
+      }
+
+      toggleBip85Fields();
+
+      var app = DOM.bip85application.val();
+
+      var phrase = DOM.phrase.val();
+      var passphrase = DOM.passphrase.val();
+      if (!phrase) {
+        return;
+      }
+      try {
+        var master = libs.bip85.BIP85.fromMnemonic(phrase, passphrase);
+
+        var result;
+
+        const index = parseInt(DOM.bip85index.val(), 10);
+
+        if (app === 'bip39') {
+          const language = parseInt(DOM.bip85mnemonicLanguage.val(), 10);
+          const length = parseInt(DOM.bip85mnemonicLength.val(), 10);
+
+          result = master.deriveBIP39(language, length, index).toMnemonic();
+        } else if (app === 'wif') {
+          result = master.deriveWIF(index).toWIF();
+        } else if (app === 'xprv') {
+          result = master.deriveXPRV(index).toXPRV();
+        } else if (app === 'hex') {
+          const bytes = parseInt(DOM.bip85bytes.val(), 10);
+
+          result = master.deriveHex(bytes, index).toEntropy();
+        }
+
+        hideValidationError();
+        DOM.bip85Field.val(result);
+      } catch (e) {
+        showValidationError('BIP85: ' + e.message);
+        DOM.bip85Field.val('');
+      }
+    }
+
     function calcForDerivationPath() {
         clearDerivedKeys();
         clearAddressesList();
             var purpose = parseIntNoNaN(DOM.bip44purpose.val(), 44);
             var coin = parseIntNoNaN(DOM.bip44coin.val(), 0);
             var account = parseIntNoNaN(DOM.bip44account.val(), 0);
-            var change = parseIntNoNaN(DOM.bip44change.val(), 0);
-            var path = "m/";
-            path += purpose + "'/";
-            path += coin + "'/";
-            path += account + "'/";
-            path += change;
+            var change = parseIntNoNaN(DOM.bip44change.val(), "");
+            var path = "m";
+            path += "/" + purpose + "'";
+            path += "/" + coin + "'";
+            path += "/" + account + "'";
+            if (change !== "") {
+              path += "/" + change;
+            }
             DOM.bip44path.val(path);
             var derivationPath = DOM.bip44path.val();
             console.log("Using derivation path from BIP44 tab: " + derivationPath);
                     address = libs.ethUtil.addHexPrefix(checksumAddress);
                     pubkey = libs.ethUtil.addHexPrefix(pubkey);
                     if (hasPrivkey) {
-                        privkey = libs.ethUtil.bufferToHex(keyPair.d.toBuffer());
+                        privkey = libs.ethUtil.bufferToHex(keyPair.d.toBuffer(32));
                     }
                 }
                 //TRX is different
                          address = libs.bchaddrSlp.toSlpAddress(address);
                      }
                  }
+
+                // ZooBC address format may vary
+                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');
+                }
+
                 // Segwit addresses are different
                 if (isSegwit) {
                     if (!segwitAvailable) {
                     privkey = FIObufferToPrivate(keyPair.d.toBuffer(32));
                 }
 
+                if (networks[DOM.network.val()].name == "ATOM - Cosmos Hub") {
+                    address = CosmosBufferToAddress(keyPair.getPublicKeyBuffer());
+                    pubkey = CosmosBufferToPublic(keyPair.getPublicKeyBuffer());
+                    privkey = keyPair.d.toBuffer().toString("base64");
+                }
+
                 //Groestlcoin Addresses are different
                 if(isGRS()) {
 
         return DOM.bip141tab.hasClass("active");
     }
 
+    function setBip44ChangeValue() {
+        if (isDefaultBip44ChangeValue) {
+            if (networkIsEthereum()) {
+                DOM.bip44change.val("");
+            } else {
+                DOM.bip44change.val(0);
+            }
+        }
+    }
+
+    function modifiedDefaultBip44ChangeValue() {
+        isDefaultBip44ChangeValue = false;
+    }
+
+    function resetDefaultBip44ChangeValue() {
+        isDefaultBip44ChangeValue = true;
+        setBip44ChangeValue();
+    }
+
     function setHdCoin(coinValue) {
         DOM.bip44coin.val(coinValue);
         DOM.bip49coin.val(coinValue);
         DOM.bip84coin.val(coinValue);
+        setBip44ChangeValue();
     }
 
     function showSegwitAvailable() {
                 setHdCoin(357);
             },
         },
+        {
+            name: "ATOM - Cosmos Hub",
+            onSelect: function() {
+                network = libs.bitcoin.networks.bitcoin;
+                setHdCoin(118);
+            },
+        },
         {
             name: "AUR - Auroracoin",
             onSelect: function() {
                 network = libs.bitcoin.networks.bitcoin;
                 setHdCoin(235);
             },
-        },  
+        },
         {
-            name: "FIRO - Firo",
+            name: "FIRO - Firo (Zcoin rebrand)",
             onSelect: function() {
                 network = libs.bitcoin.networks.firo;
                 setHdCoin(136);
                 setHdCoin(4);
             },
         },
+        {
+            name: "RITO - Ritocoin",
+            onSelect: function() {
+                network = libs.bitcoin.networks.ritocoin;
+                setHdCoin(19169);
+            },
+        },
         {
             name: "RVR - RevolutionVR",
             onSelect: function() {
                 setHdCoin(155);
             },
         },
+        {
+            name: "XZC - Zcoin (rebranded to Firo)",
+            onSelect: function() {
+                network = libs.bitcoin.networks.zcoin;
+                setHdCoin(136);
+            },
+        },
+        {
+            name: "ZBC - ZooBlockchain",
+            onSelect: function () {
+            network = libs.bitcoin.networks.zoobc;
+            setHdCoin(883);
+            },
+        },
         {
             name: "ZCL - Zclassic",
             onSelect: function() {