]> 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 b0700063c3383157604e91909420308439b967f0..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;
@@ -47,6 +48,8 @@
     DOM.entropyWeakEntropyOverrideWarning = DOM.entropyContainer.find(".weak-entropy-override-warning");
     DOM.entropyFilterWarning = DOM.entropyContainer.find(".filter-warning");
     DOM.phrase = $(".phrase");
+    DOM.splitMnemonic = $(".splitMnemonic");
+    DOM.showSplitMnemonic = $(".showSplitMnemonic");
     DOM.phraseSplit = $(".phraseSplit");
     DOM.phraseSplitWarn = $(".phraseSplitWarn");
     DOM.passphrase = $(".passphrase");
@@ -74,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.entropyMnemonicLength.on("change", entropyChanged);
         DOM.entropyTypeInputs.on("change", entropyTypeChanged);
         DOM.phrase.on("input", delayedPhraseChanged);
+        DOM.showSplitMnemonic.on("change", toggleSplitMnemonic);
         DOM.passphrase.on("input", delayedPhraseChanged);
         DOM.generate.on("click", generateClicked);
         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() {
         phraseChanged();
     }
 
+    function toggleSplitMnemonic() {
+        if (DOM.showSplitMnemonic.prop("checked")) {
+            DOM.splitMnemonic.removeClass("hidden");
+        }
+        else {
+            DOM.splitMnemonic.addClass("hidden");
+        }
+    }
+
+    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
+                if (networks[DOM.network.val()].name == "TRX - Tron") {
+                    keyPair = new libs.bitcoin.ECPair(keyPair.d, null, { network: network, compressed: false });
+                    var pubkeyBuffer = keyPair.getPublicKeyBuffer();
+                    var ethPubkey = libs.ethUtil.importPublic(pubkeyBuffer);
+                    var addressBuffer = libs.ethUtil.publicToAddress(ethPubkey);
+                    address = libs.bitcoin.address.toBase58Check(addressBuffer, 0x41);
+                    if (hasPrivkey) {
+                        privkey = keyPair.d.toBuffer().toString('hex');
                     }
                 }
 
                     privkey = keypair.secret();
                     pubkey = address = keypair.publicKey();
                 }
+
+                // Nano currency
+                if (networks[DOM.network.val()].name == "NANO - Nano") {
+                    var nanoKeypair = libs.nanoUtil.getKeypair(index, seed);
+                    privkey = nanoKeypair.privKey;
+                    pubkey = nanoKeypair.pubKey;
+                    address = nanoKeypair.address;
+                }
+
                 if ((networks[DOM.network.val()].name == "NAS - Nebulas")) {
                     var privKeyBuffer = keyPair.d.toBuffer(32);
                     var nebulasAccount = libs.nebulas.Account.NewAccount();
                          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()) {
 
                     || (name == "ESN - Ethersocial Network")
                     || (name == "VET - VeChain")
                     || (name == "ERE - EtherCore")
+                    || (name == "BSC - Binance Smart Chain")
     }
 
     function networkIsRsk() {
         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() {
                 setHdCoin(183);
             },
         },
+        {
+            name: "BSC - Binance Smart Chain",
+            onSelect: function() {
+                network = libs.bitcoin.networks.bitcoin;
+                setHdCoin(60);
+            },
+        },
         {
             name: "BSV - BitcoinSV",
             onSelect: function() {
                 network = libs.bitcoin.networks.bitcoin;
                 setHdCoin(235);
             },
-        },  
+        },
+        {
+            name: "FIRO - Firo (Zcoin rebrand)",
+            onSelect: function() {
+                network = libs.bitcoin.networks.firo;
+                setHdCoin(136);
+            },
+        },
         {
             name: "FIX - FIX",
             onSelect: function() {
                 setHdCoin(184);
             },
         },
+        {
+            name: "NANO - Nano",
+            onSelect: function() {
+                network = network = libs.nanoUtil.dummyNetwork;
+                setHdCoin(165);
+            },
+        },
         {
             name: "NAV - Navcoin",
             onSelect: function() {
                 setHdCoin(4);
             },
         },
+        {
+            name: "RITO - Ritocoin",
+            onSelect: function() {
+                network = libs.bitcoin.networks.ritocoin;
+                setHdCoin(19169);
+            },
+        },
         {
             name: "RVR - RevolutionVR",
             onSelect: function() {
                 setHdCoin(159);
             },
         },
+        {
+            name: "TRX - Tron",
+            onSelect: function() {
+                setHdCoin(195);
+            },
+        },
         {
             name: "TWINS - TWINS",
             onSelect: function() {
             },
         },
         {
-            name: "XZC - Zcoin",
+            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() {