X-Git-Url: https://git.immae.eu/?a=blobdiff_plain;f=src%2Fjs%2Findex.js;h=38a7efdd41642d1f892aa4750b0c318ea146b482;hb=9183f9f658222dc3a24c8b4794887b6ecd80ba1e;hp=d61c31487d6b70b0b5ee22937ee7c620c21f1fa6;hpb=8dd28f2cff4e1f673f4aa7adc93a7254de72a297;p=perso%2FImmae%2FProjets%2FCryptomonnaies%2FBIP39.git diff --git a/src/js/index.js b/src/js/index.js index d61c314..38a7efd 100644 --- a/src/js/index.js +++ b/src/js/index.js @@ -75,9 +75,12 @@ 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.moreRowsStartIndex = $(".more-rows-start-index"); DOM.feedback = $(".feedback"); DOM.tab = $(".derivation-type a"); DOM.indexToggle = $(".index-toggle"); @@ -109,7 +112,7 @@ DOM.bip44change.on("input", calcForDerivationPath); DOM.bip49account.on("input", calcForDerivationPath); DOM.bip49change.on("input", calcForDerivationPath); - DOM.tab.on("shown.bs.tab", calcForDerivationPath); + DOM.tab.on("shown.bs.tab", tabChanged); DOM.hardenedAddresses.on("change", calcForDerivationPath); DOM.useP2wpkhNestedInP2sh.on("change", calcForDerivationPath); DOM.indexToggle.on("click", toggleIndexes); @@ -117,6 +120,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 +135,7 @@ clearDerivedKeys(); clearAddressesList(); DOM.litecoinLtubContainer.addClass("hidden"); + DOM.useBitpayAddressesContainer.addClass("hidden"); var networkIndex = e.target.value; var network = networks[networkIndex]; network.onSelect(); @@ -210,6 +215,35 @@ calcForDerivationPath(); } + function tabChanged() { + showPending(); + adjustNetworkForBip49(); + var phrase = DOM.phrase.val(); + if (phrase != "") { + // Calculate and display for mnemonic + var errorText = findPhraseErrors(phrase); + if (errorText) { + showValidationError(errorText); + return; + } + // Calculate and display + var passphrase = DOM.passphrase.val(); + calcBip32RootKeyFromSeed(phrase, passphrase); + } + else { + // Calculate and display for root key + var rootKeyBase58 = DOM.rootKey.val(); + var errorText = validateRootKey(rootKeyBase58); + if (errorText) { + showValidationError(errorText); + return; + } + // Calculate and display + calcBip32RootKeyFromBase58(rootKeyBase58); + } + calcForDerivationPath(); + } + function delayedEntropyChanged() { hideValidationError(); showPending(); @@ -347,6 +381,11 @@ }, 50); } + function useBitpayAddressesChange() { + setBitcoinCashNetworkValues(); + phraseChanged(); + } + function toggleIndexes() { showIndex = !showIndex; $("td.index span").toggleClass("invisible"); @@ -635,12 +674,16 @@ })()); } + function P2wpkhNestedInP2shSelected() { + return bip49TabSelected() || (bip32TabSelected() && useP2wpkhNestedInP2sh()); + } + function TableRow(index, isLast) { var self = this; this.shouldGenerate = true; var useHardenedAddresses = DOM.hardenedAddresses.prop("checked"); - var isP2wpkhNestedInP2sh = bip49TabSelected() || (bip32TabSelected() && useP2wpkhNestedInP2sh()); + var isP2wpkhNestedInP2sh = P2wpkhNestedInP2shSelected(); var p2wpkhNestedInP2shAvailable = networkHasBip49(); function init() { @@ -708,12 +751,19 @@ } function showMore() { - var start = DOM.addresses.children().length; var rowsToAdd = parseInt(DOM.rowsToAdd.val()); if (isNaN(rowsToAdd)) { rowsToAdd = 20; DOM.rowsToAdd.val("20"); } + var start = parseInt(DOM.moreRowsStartIndex.val()) + if (isNaN(start)) { + start = lastIndexInTable() + 1; + } + else { + var newStart = start + rowsToAdd; + DOM.moreRowsStartIndex.val(newStart); + } if (rowsToAdd > 200) { var msg = "Generating " + rowsToAdd + " rows could take a while. "; msg += "Do you want to continue?"; @@ -1207,12 +1257,63 @@ 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; + } + } + + function adjustNetworkForBip49() { + // If bip49 is selected the xpub/xprv prefixes need to be adjusted + // to avoid accidentally importing BIP49 xpub to BIP44 watch only + // wallet. + // See https://github.com/iancoleman/bip39/issues/125 + if (P2wpkhNestedInP2shSelected()) { + if (network == bitcoinjs.bitcoin.networks.bitcoin) { + network = bitcoinjs.bitcoin.networks.bitcoinBip49; + } + else if (network == bitcoinjs.bitcoin.networks.testnet) { + network = bitcoinjs.bitcoin.networks.testnetBip49; + } + else if (network == bitcoinjs.bitcoin.networks.litecoin) { + network = bitcoinjs.bitcoin.networks.litecoinBip49; + } + } + else { + if (network == bitcoinjs.bitcoin.networks.bitcoinBip49) { + network = bitcoinjs.bitcoin.networks.bitcoin; + } + else if (network == bitcoinjs.bitcoin.networks.testnetBip49) { + network = bitcoinjs.bitcoin.networks.testnet; + } + else if (network == bitcoinjs.bitcoin.networks.litecoinBip49) { + network = bitcoinjs.bitcoin.networks.litecoin; + } + } + } + + function lastIndexInTable() { + var pathText = DOM.addresses.find(".index").last().text(); + var pathBits = pathText.split("/"); + var lastBit = pathBits[pathBits.length-1]; + var lastBitClean = lastBit.replace("'", ""); + return parseInt(lastBitClean); + } + var networks = [ { name: "BCH - Bitcoin Cash", p2wpkhNestedInP2shAvailable: false, onSelect: function() { - network = bitcoinjs.bitcoin.networks.bitcoin; + DOM.useBitpayAddressesContainer.removeClass("hidden"); + setBitcoinCashNetworkValues(); setHdCoin(145); }, }, @@ -1232,6 +1333,14 @@ setHdCoin(1); }, }, + { + name: "BTG - Bitcoin Gold", + p2wpkhNestedInP2shAvailable: true, + onSelect: function() { + network = bitcoinjs.bitcoin.networks.bgold; + setHdCoin(0); + }, + }, { name: "CLAM - Clams", p2wpkhNestedInP2shAvailable: false, @@ -1306,7 +1415,7 @@ }, { name: "LTC - Litecoin", - p2wpkhNestedInP2shAvailable: false, + p2wpkhNestedInP2shAvailable: true, onSelect: function() { network = bitcoinjs.bitcoin.networks.litecoin; setHdCoin(2); @@ -1321,7 +1430,14 @@ setHdCoin(13); }, }, - + { + name: "MONA - Monacoin", + p2wpkhNestedInP2shAvailable: true, + onSelect: function() { + network = bitcoinjs.bitcoin.networks.monacoin, + setHdCoin(22); + }, + }, { name: "NMC - Namecoin", p2wpkhNestedInP2shAvailable: false,