X-Git-Url: https://git.immae.eu/?a=blobdiff_plain;f=src%2Fjs%2Findex.js;h=f2913950e85b68ef9f16de6a47ae4533d2c3524d;hb=e8ee368f189137fdadcca3d8dffe743c8bb20172;hp=80c7fa87d7c1efbc92757a8f60c42fc657e4c03c;hpb=3abab9b0874904f610cfeb7d136e97ca0ebac1e1;p=perso%2FImmae%2FProjets%2FCryptomonnaies%2FBIP39.git diff --git a/src/js/index.js b/src/js/index.js index 80c7fa8..f291395 100644 --- a/src/js/index.js +++ b/src/js/index.js @@ -38,6 +38,7 @@ DOM.entropyWordCount = DOM.entropyContainer.find(".word-count"); DOM.entropyBinary = DOM.entropyContainer.find(".binary"); DOM.entropyMnemonicLength = DOM.entropyContainer.find(".mnemonic-length"); + DOM.entropyFilterWarning = DOM.entropyContainer.find(".filter-warning"); DOM.phrase = $(".phrase"); DOM.passphrase = $(".passphrase"); DOM.generateContainer = $(".generate-container"); @@ -73,6 +74,9 @@ DOM.bip49change = $("#bip49 .change"); 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"); @@ -107,13 +111,15 @@ 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); DOM.addressToggle.on("click", toggleAddresses); 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(); @@ -128,14 +134,15 @@ clearDerivedKeys(); clearAddressesList(); DOM.litecoinLtubContainer.addClass("hidden"); + DOM.useBitpayAddressesContainer.addClass("hidden"); var networkIndex = e.target.value; var network = networks[networkIndex]; network.onSelect(); - if (network.bip49available) { - showBip49(); + if (network.p2wpkhNestedInP2shAvailable) { + showP2wpkhNestedInP2shAvailable(); } else { - hideBip49(); + showP2wpkhNestedInP2shUnavailable(); } if (seed != null) { phraseChanged(); @@ -207,6 +214,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(); @@ -267,7 +303,6 @@ function rootKeyChanged() { showPending(); hideValidationError(); - // Validate the root key TODO var rootKeyBase58 = DOM.rootKey.val(); var errorText = validateRootKey(rootKeyBase58); if (errorText) { @@ -345,6 +380,11 @@ }, 50); } + function useBitpayAddressesChange() { + setBitcoinCashNetworkValues(); + phraseChanged(); + } + function toggleIndexes() { showIndex = !showIndex; $("td.index span").toggleClass("invisible"); @@ -460,7 +500,7 @@ function validateRootKey(rootKeyBase58) { try { - bitcoinjs.bitcoin.HDNode.fromBase58(rootKeyBase58); + bitcoinjs.bitcoin.HDNode.fromBase58(rootKeyBase58, network); } catch (e) { return "Invalid root key"; @@ -633,13 +673,17 @@ })()); } + function P2wpkhNestedInP2shSelected() { + return bip49TabSelected() || (bip32TabSelected() && useP2wpkhNestedInP2sh()); + } + function TableRow(index, isLast) { var self = this; this.shouldGenerate = true; var useHardenedAddresses = DOM.hardenedAddresses.prop("checked"); - var isBip49 = bip49TabSelected(); - var bip49available = networkHasBip49(); + var isP2wpkhNestedInP2sh = P2wpkhNestedInP2shSelected(); + var p2wpkhNestedInP2shAvailable = networkHasBip49(); function init() { calculateValues(); @@ -684,8 +728,8 @@ address = convertRippleAdrr(address); } // BIP49 addresses are different - if (isBip49) { - if (!bip49available) { + if (isP2wpkhNestedInP2sh) { + if (!p2wpkhNestedInP2shAvailable) { return; } var keyhash = bitcoinjs.bitcoin.crypto.hash160(key.getPublicKeyBuffer()); @@ -1060,6 +1104,16 @@ DOM.entropyWordCount.text(wordCount); DOM.entropyBinary.text(entropy.binaryStr); DOM.entropyBitsPerEvent.text(bitsPerEvent); + // detect and warn of filtering + var rawNoSpaces = DOM.entropy.val().replace(/\s/g, ""); + var cleanNoSpaces = entropy.cleanStr.replace(/\s/g, ""); + var isFiltered = rawNoSpaces.length != cleanNoSpaces.length; + if (isFiltered) { + DOM.entropyFilterWarning.removeClass('hidden'); + } + else { + DOM.entropyFilterWarning.addClass('hidden'); + } } function getEntropyTypeStr(entropy) { @@ -1165,8 +1219,12 @@ return DOM.bip32tab.hasClass("active"); } + function useP2wpkhNestedInP2sh() { + return DOM.useP2wpkhNestedInP2sh.prop("checked"); + } + function networkHasBip49() { - return networks[DOM.network.val()].bip49available; + return networks[DOM.network.val()].p2wpkhNestedInP2shAvailable; } function bip49TabSelected() { @@ -1178,28 +1236,74 @@ DOM.bip49coin.val(coinValue); } - function showBip49() { + function showP2wpkhNestedInP2shAvailable() { DOM.bip49unavailable.addClass("hidden"); DOM.bip49available.removeClass("hidden"); + DOM.useP2wpkhNestedInP2sh.prop("disabled", false); } - function hideBip49() { + function showP2wpkhNestedInP2shUnavailable() { DOM.bip49available.addClass("hidden"); DOM.bip49unavailable.removeClass("hidden"); + DOM.useP2wpkhNestedInP2sh.prop("disabled", true); + 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; + } + } } var networks = [ { name: "BCH - Bitcoin Cash", - bip49available: false, + p2wpkhNestedInP2shAvailable: false, onSelect: function() { - network = bitcoinjs.bitcoin.networks.bitcoin; + DOM.useBitpayAddressesContainer.removeClass("hidden"); + setBitcoinCashNetworkValues(); setHdCoin(145); }, }, { name: "BTC - Bitcoin", - bip49available: true, + p2wpkhNestedInP2shAvailable: true, onSelect: function() { network = bitcoinjs.bitcoin.networks.bitcoin; setHdCoin(0); @@ -1207,15 +1311,23 @@ }, { name: "BTC - Bitcoin Testnet", - bip49available: true, + p2wpkhNestedInP2shAvailable: true, onSelect: function() { network = bitcoinjs.bitcoin.networks.testnet; setHdCoin(1); }, }, + { + name: "BTG - Bitcoin Gold", + p2wpkhNestedInP2shAvailable: true, + onSelect: function() { + network = bitcoinjs.bitcoin.networks.bgold; + setHdCoin(0); + }, + }, { name: "CLAM - Clams", - bip49available: false, + p2wpkhNestedInP2shAvailable: false, onSelect: function() { network = bitcoinjs.bitcoin.networks.clam; setHdCoin(23); @@ -1223,7 +1335,7 @@ }, { name: "CRW - Crown", - bip49available: false, + p2wpkhNestedInP2shAvailable: false, onSelect: function() { network = bitcoinjs.bitcoin.networks.crown; setHdCoin(72); @@ -1231,7 +1343,7 @@ }, { name: "DASH - Dash", - bip49available: false, + p2wpkhNestedInP2shAvailable: false, onSelect: function() { network = bitcoinjs.bitcoin.networks.dash; setHdCoin(5); @@ -1239,7 +1351,7 @@ }, { name: "DASH - Dash Testnet", - bip49available: false, + p2wpkhNestedInP2shAvailable: false, onSelect: function() { network = bitcoinjs.bitcoin.networks.dashtn; setHdCoin(1); @@ -1247,7 +1359,7 @@ }, { name: "DOGE - Dogecoin", - bip49available: false, + p2wpkhNestedInP2shAvailable: false, onSelect: function() { network = bitcoinjs.bitcoin.networks.dogecoin; setHdCoin(3); @@ -1255,15 +1367,23 @@ }, { name: "ETH - Ethereum", - bip49available: false, + p2wpkhNestedInP2shAvailable: false, onSelect: function() { network = bitcoinjs.bitcoin.networks.bitcoin; setHdCoin(60); }, }, + { + name: "FJC - Fujicoin", + p2wpkhNestedInP2shAvailable: false, + onSelect: function() { + network = bitcoinjs.bitcoin.networks.fujicoin; + setHdCoin(75); + }, + }, { name: "GAME - GameCredits", - bip49available: false, + p2wpkhNestedInP2shAvailable: false, onSelect: function() { network = bitcoinjs.bitcoin.networks.game; setHdCoin(101); @@ -1271,7 +1391,7 @@ }, { name: "JBS - Jumbucks", - bip49available: false, + p2wpkhNestedInP2shAvailable: false, onSelect: function() { network = bitcoinjs.bitcoin.networks.jumbucks; setHdCoin(26); @@ -1279,7 +1399,7 @@ }, { name: "LTC - Litecoin", - bip49available: false, + p2wpkhNestedInP2shAvailable: true, onSelect: function() { network = bitcoinjs.bitcoin.networks.litecoin; setHdCoin(2); @@ -1288,7 +1408,7 @@ }, { name: "MAZA - Maza", - bip49available: false, + p2wpkhNestedInP2shAvailable: false, onSelect: function() { network = bitcoinjs.bitcoin.networks.maza; setHdCoin(13); @@ -1297,7 +1417,7 @@ { name: "NMC - Namecoin", - bip49available: false, + p2wpkhNestedInP2shAvailable: false, onSelect: function() { network = bitcoinjs.bitcoin.networks.namecoin; setHdCoin(7); @@ -1305,7 +1425,7 @@ }, { name: "PIVX - PIVX", - bip49available: false, + p2wpkhNestedInP2shAvailable: false, onSelect: function() { network = bitcoinjs.bitcoin.networks.pivx; setHdCoin(119); @@ -1313,7 +1433,7 @@ }, { name: "PIVX - PIVX Testnet", - bip49available: false, + p2wpkhNestedInP2shAvailable: false, onSelect: function() { network = bitcoinjs.bitcoin.networks.pivxtestnet; setHdCoin(1); @@ -1321,7 +1441,7 @@ }, { name: "PPC - Peercoin", - bip49available: false, + p2wpkhNestedInP2shAvailable: false, onSelect: function() { network = bitcoinjs.bitcoin.networks.peercoin; setHdCoin(6); @@ -1329,7 +1449,7 @@ }, { name: "SDC - ShadowCash", - bip49available: false, + p2wpkhNestedInP2shAvailable: false, onSelect: function() { network = bitcoinjs.bitcoin.networks.shadow; setHdCoin(35); @@ -1337,7 +1457,7 @@ }, { name: "SDC - ShadowCash Testnet", - bip49available: false, + p2wpkhNestedInP2shAvailable: false, onSelect: function() { network = bitcoinjs.bitcoin.networks.shadowtn; setHdCoin(1); @@ -1345,7 +1465,7 @@ }, { name: "SLM - Slimcoin", - bip49available: false, + p2wpkhNestedInP2shAvailable: false, onSelect: function() { network = bitcoinjs.bitcoin.networks.slimcoin; setHdCoin(63); @@ -1353,15 +1473,23 @@ }, { name: "SLM - Slimcoin Testnet", - bip49available: false, + p2wpkhNestedInP2shAvailable: false, onSelect: function() { network = bitcoinjs.bitcoin.networks.slimcointn; setHdCoin(111); }, }, + { + name: "USNBT - NuBits", + p2wpkhNestedInP2shAvailable: false, + onSelect: function() { + network = bitcoinjs.bitcoin.networks.nubits; + setHdCoin(12); + }, + }, { name: "VIA - Viacoin", - bip49available: false, + p2wpkhNestedInP2shAvailable: false, onSelect: function() { network = bitcoinjs.bitcoin.networks.viacoin; setHdCoin(14); @@ -1369,7 +1497,7 @@ }, { name: "VIA - Viacoin Testnet", - bip49available: false, + p2wpkhNestedInP2shAvailable: false, onSelect: function() { network = bitcoinjs.bitcoin.networks.viacointestnet; setHdCoin(1); @@ -1377,7 +1505,7 @@ }, { name: "XMY - Myriadcoin", - bip49available: false, + p2wpkhNestedInP2shAvailable: false, onSelect: function() { network = bitcoinjs.bitcoin.networks.myriadcoin; setHdCoin(90); @@ -1385,11 +1513,19 @@ }, { name: "XRP - Ripple", - bip49available: false, + p2wpkhNestedInP2shAvailable: false, onSelect: function() { network = bitcoinjs.bitcoin.networks.bitcoin; setHdCoin(144); }, + }, + { + name: "MONA - Monacoin", + p2wpkhNestedInP2shAvailable: true, + onSelect: function() { + network = bitcoinjs.bitcoin.networks.monacoin, + setHdCoin(22); + }, } ]