X-Git-Url: https://git.immae.eu/?a=blobdiff_plain;f=src%2Fjs%2Findex.js;h=261a6d19c43005d77809bae797f7f1726fdbee0e;hb=c49e881294343b762109bb8104e7c1b45898c894;hp=f2913950e85b68ef9f16de6a47ae4533d2c3524d;hpb=e8ee368f189137fdadcca3d8dffe743c8bb20172;p=perso%2FImmae%2FProjets%2FCryptomonnaies%2FBIP39.git diff --git a/src/js/index.js b/src/js/index.js index f291395..261a6d1 100644 --- a/src/js/index.js +++ b/src/js/index.js @@ -14,7 +14,7 @@ var showPubKey = true; var showPrivKey = true; var showQr = false; - var litecoinUseLtub = false; + var litecoinUseLtub = true; var entropyChangeTimeoutEvent = null; var phraseChangeTimeoutEvent = null; @@ -52,6 +52,7 @@ DOM.bip32tab = $("#bip32-tab"); DOM.bip44tab = $("#bip44-tab"); DOM.bip49tab = $("#bip49-tab"); + DOM.bip141tab = $("#bip141-tab"); DOM.bip32panel = $("#bip32"); DOM.bip44panel = $("#bip44"); DOM.bip49panel = $("#bip49"); @@ -72,14 +73,18 @@ DOM.bip49accountXprv = $("#bip49 .account-xprv"); DOM.bip49accountXpub = $("#bip49 .account-xpub"); DOM.bip49change = $("#bip49 .change"); + DOM.bip141unavailable = $("#bip141 .unavailable"); + DOM.bip141available = $("#bip141 .available"); + DOM.bip141path = $("#bip141-path"); + DOM.bip141semantics = $(".bip141-semantics"); 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"); @@ -111,9 +116,10 @@ DOM.bip44change.on("input", calcForDerivationPath); DOM.bip49account.on("input", calcForDerivationPath); DOM.bip49change.on("input", calcForDerivationPath); + DOM.bip141path.on("input", calcForDerivationPath); + DOM.bip141semantics.on("change", tabChanged); 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); @@ -138,11 +144,12 @@ var networkIndex = e.target.value; var network = networks[networkIndex]; network.onSelect(); - if (network.p2wpkhNestedInP2shAvailable) { - showP2wpkhNestedInP2shAvailable(); + if (network.segwitAvailable) { + adjustNetworkForSegwit(); + showSegwitAvailable(); } else { - showP2wpkhNestedInP2shUnavailable(); + showSegwitUnavailable(); } if (seed != null) { phraseChanged(); @@ -216,7 +223,7 @@ function tabChanged() { showPending(); - adjustNetworkForBip49(); + adjustNetworkForSegwit(); var phrase = DOM.phrase.val(); if (phrase != "") { // Calculate and display for mnemonic @@ -317,10 +324,10 @@ function litecoinUseLtubChanged() { litecoinUseLtub = DOM.litecoinUseLtub.prop("checked"); if (litecoinUseLtub) { - network = bitcoinjs.bitcoin.networks.litecoinLtub; + network = bitcoinjs.bitcoin.networks.litecoin; } else { - network = bitcoinjs.bitcoin.networks.litecoin; + network = bitcoinjs.bitcoin.networks.litecoinXprv; } phraseChanged(); } @@ -329,8 +336,8 @@ clearDerivedKeys(); clearAddressesList(); showPending(); - // Don't show bip49 if it's selected but network doesn't support it - if (bip49TabSelected() && !networkHasBip49()) { + // Don't show segwit if it's selected but network doesn't support it + if (segwitSelected() && !networkHasSegwit()) { return; } // Get the derivation path @@ -344,7 +351,7 @@ if (bip44TabSelected()) { displayBip44Info(); } - if (bip49TabSelected()) { + else if (bip49TabSelected()) { displayBip49Info(); } displayBip32Info(); @@ -524,7 +531,7 @@ console.log("Using derivation path from BIP44 tab: " + derivationPath); return derivationPath; } - if (bip49TabSelected()) { + else if (bip49TabSelected()) { var purpose = parseIntNoNaN(DOM.bip49purpose.val(), 49); var coin = parseIntNoNaN(DOM.bip49coin.val(), 0); var account = parseIntNoNaN(DOM.bip49account.val(), 0); @@ -544,6 +551,11 @@ console.log("Using derivation path from BIP32 tab: " + derivationPath); return derivationPath; } + else if (bip141TabSelected()) { + var derivationPath = DOM.bip141path.val(); + console.log("Using derivation path from BIP141 tab: " + derivationPath); + return derivationPath; + } else { console.log("Unknown derivation path"); } @@ -673,8 +685,17 @@ })()); } - function P2wpkhNestedInP2shSelected() { - return bip49TabSelected() || (bip32TabSelected() && useP2wpkhNestedInP2sh()); + function segwitSelected() { + return bip49TabSelected() || bip141TabSelected(); + } + + function p2wpkhSelected() { + return bip141TabSelected() && DOM.bip141semantics.val() == "p2wpkh"; + } + + function p2wpkhInP2shSelected() { + return bip49TabSelected() || + (bip141TabSelected() && DOM.bip141semantics.val() == "p2wpkh-p2sh"); } function TableRow(index, isLast) { @@ -682,8 +703,10 @@ var self = this; this.shouldGenerate = true; var useHardenedAddresses = DOM.hardenedAddresses.prop("checked"); - var isP2wpkhNestedInP2sh = P2wpkhNestedInP2shSelected(); - var p2wpkhNestedInP2shAvailable = networkHasBip49(); + var isSegwit = segwitSelected(); + var segwitAvailable = networkHasSegwit(); + var isP2wpkh = p2wpkhSelected(); + var isP2wpkhInP2sh = p2wpkhInP2shSelected(); function init() { calculateValues(); @@ -727,16 +750,23 @@ privkey = convertRipplePriv(privkey); address = convertRippleAdrr(address); } - // BIP49 addresses are different - if (isP2wpkhNestedInP2sh) { - if (!p2wpkhNestedInP2shAvailable) { + // Segwit addresses are different + if (isSegwit) { + if (!segwitAvailable) { return; } - var keyhash = bitcoinjs.bitcoin.crypto.hash160(key.getPublicKeyBuffer()); - var scriptsig = bitcoinjs.bitcoin.script.witnessPubKeyHash.output.encode(keyhash); - var addressbytes = bitcoinjs.bitcoin.crypto.hash160(scriptsig); - var scriptpubkey = bitcoinjs.bitcoin.script.scriptHash.output.encode(addressbytes); - address = bitcoinjs.bitcoin.address.fromOutputScript(scriptpubkey, network) + if (isP2wpkh) { + var keyhash = bitcoinjs.bitcoin.crypto.hash160(key.getPublicKeyBuffer()); + var scriptpubkey = bitcoinjs.bitcoin.script.witnessPubKeyHash.output.encode(keyhash); + address = bitcoinjs.bitcoin.address.fromOutputScript(scriptpubkey, network) + } + else if (isP2wpkhInP2sh) { + var keyhash = bitcoinjs.bitcoin.crypto.hash160(key.getPublicKeyBuffer()); + var scriptsig = bitcoinjs.bitcoin.script.witnessPubKeyHash.output.encode(keyhash); + var addressbytes = bitcoinjs.bitcoin.crypto.hash160(scriptsig); + var scriptpubkey = bitcoinjs.bitcoin.script.scriptHash.output.encode(addressbytes); + address = bitcoinjs.bitcoin.address.fromOutputScript(scriptpubkey, network) + } } addAddressToList(indexText, address, pubkey, privkey); if (isLast) { @@ -750,12 +780,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?"; @@ -1219,34 +1256,35 @@ return DOM.bip32tab.hasClass("active"); } - function useP2wpkhNestedInP2sh() { - return DOM.useP2wpkhNestedInP2sh.prop("checked"); - } - - function networkHasBip49() { - return networks[DOM.network.val()].p2wpkhNestedInP2shAvailable; + function networkHasSegwit() { + return networks[DOM.network.val()].segwitAvailable; } function bip49TabSelected() { return DOM.bip49tab.hasClass("active"); } + function bip141TabSelected() { + return DOM.bip141tab.hasClass("active"); + } + function setHdCoin(coinValue) { DOM.bip44coin.val(coinValue); DOM.bip49coin.val(coinValue); } - function showP2wpkhNestedInP2shAvailable() { + function showSegwitAvailable() { DOM.bip49unavailable.addClass("hidden"); DOM.bip49available.removeClass("hidden"); - DOM.useP2wpkhNestedInP2sh.prop("disabled", false); + DOM.bip141unavailable.addClass("hidden"); + DOM.bip141available.removeClass("hidden"); } - function showP2wpkhNestedInP2shUnavailable() { + function showSegwitUnavailable() { DOM.bip49available.addClass("hidden"); DOM.bip49unavailable.removeClass("hidden"); - DOM.useP2wpkhNestedInP2sh.prop("disabled", true); - DOM.useP2wpkhNestedInP2sh.prop("checked", false); + DOM.bip141available.addClass("hidden"); + DOM.bip141unavailable.removeClass("hidden"); } function useBitpayAddresses() { @@ -1262,39 +1300,38 @@ } } - function adjustNetworkForBip49() { - // If bip49 is selected the xpub/xprv prefixes need to be adjusted + function adjustNetworkForSegwit() { + // If segwit 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; - } + var segwitNetworks = null; + // if a segwit network is alread selected, need to use base network to + // look up new parameters + if ("baseNetwork" in network) { + network = bitcoinjs.bitcoin.networks[network.baseNetwork]; } - 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; - } + // choose the right segwit params + if (p2wpkhSelected() && "p2wpkh" in network) { + network = network.p2wpkh; + } + else if (p2wpkhInP2shSelected() && "p2wpkhInP2sh" in network) { + network = network.p2wpkhInP2sh; } } + 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, + segwitAvailable: false, onSelect: function() { DOM.useBitpayAddressesContainer.removeClass("hidden"); setBitcoinCashNetworkValues(); @@ -1303,7 +1340,7 @@ }, { name: "BTC - Bitcoin", - p2wpkhNestedInP2shAvailable: true, + segwitAvailable: true, onSelect: function() { network = bitcoinjs.bitcoin.networks.bitcoin; setHdCoin(0); @@ -1311,7 +1348,7 @@ }, { name: "BTC - Bitcoin Testnet", - p2wpkhNestedInP2shAvailable: true, + segwitAvailable: true, onSelect: function() { network = bitcoinjs.bitcoin.networks.testnet; setHdCoin(1); @@ -1319,7 +1356,7 @@ }, { name: "BTG - Bitcoin Gold", - p2wpkhNestedInP2shAvailable: true, + segwitAvailable: true, onSelect: function() { network = bitcoinjs.bitcoin.networks.bgold; setHdCoin(0); @@ -1327,7 +1364,7 @@ }, { name: "CLAM - Clams", - p2wpkhNestedInP2shAvailable: false, + segwitAvailable: false, onSelect: function() { network = bitcoinjs.bitcoin.networks.clam; setHdCoin(23); @@ -1335,7 +1372,7 @@ }, { name: "CRW - Crown", - p2wpkhNestedInP2shAvailable: false, + segwitAvailable: false, onSelect: function() { network = bitcoinjs.bitcoin.networks.crown; setHdCoin(72); @@ -1343,7 +1380,7 @@ }, { name: "DASH - Dash", - p2wpkhNestedInP2shAvailable: false, + segwitAvailable: false, onSelect: function() { network = bitcoinjs.bitcoin.networks.dash; setHdCoin(5); @@ -1351,7 +1388,7 @@ }, { name: "DASH - Dash Testnet", - p2wpkhNestedInP2shAvailable: false, + segwitAvailable: false, onSelect: function() { network = bitcoinjs.bitcoin.networks.dashtn; setHdCoin(1); @@ -1359,7 +1396,7 @@ }, { name: "DOGE - Dogecoin", - p2wpkhNestedInP2shAvailable: false, + segwitAvailable: false, onSelect: function() { network = bitcoinjs.bitcoin.networks.dogecoin; setHdCoin(3); @@ -1367,7 +1404,7 @@ }, { name: "ETH - Ethereum", - p2wpkhNestedInP2shAvailable: false, + segwitAvailable: false, onSelect: function() { network = bitcoinjs.bitcoin.networks.bitcoin; setHdCoin(60); @@ -1375,7 +1412,7 @@ }, { name: "FJC - Fujicoin", - p2wpkhNestedInP2shAvailable: false, + segwitAvailable: false, onSelect: function() { network = bitcoinjs.bitcoin.networks.fujicoin; setHdCoin(75); @@ -1383,7 +1420,7 @@ }, { name: "GAME - GameCredits", - p2wpkhNestedInP2shAvailable: false, + segwitAvailable: false, onSelect: function() { network = bitcoinjs.bitcoin.networks.game; setHdCoin(101); @@ -1391,7 +1428,7 @@ }, { name: "JBS - Jumbucks", - p2wpkhNestedInP2shAvailable: false, + segwitAvailable: false, onSelect: function() { network = bitcoinjs.bitcoin.networks.jumbucks; setHdCoin(26); @@ -1399,7 +1436,7 @@ }, { name: "LTC - Litecoin", - p2wpkhNestedInP2shAvailable: true, + segwitAvailable: true, onSelect: function() { network = bitcoinjs.bitcoin.networks.litecoin; setHdCoin(2); @@ -1408,16 +1445,23 @@ }, { name: "MAZA - Maza", - p2wpkhNestedInP2shAvailable: false, + segwitAvailable: false, onSelect: function() { network = bitcoinjs.bitcoin.networks.maza; setHdCoin(13); }, }, - + { + name: "MONA - Monacoin", + segwitAvailable: true, + onSelect: function() { + network = bitcoinjs.bitcoin.networks.monacoin, + setHdCoin(22); + }, + }, { name: "NMC - Namecoin", - p2wpkhNestedInP2shAvailable: false, + segwitAvailable: false, onSelect: function() { network = bitcoinjs.bitcoin.networks.namecoin; setHdCoin(7); @@ -1425,7 +1469,7 @@ }, { name: "PIVX - PIVX", - p2wpkhNestedInP2shAvailable: false, + segwitAvailable: false, onSelect: function() { network = bitcoinjs.bitcoin.networks.pivx; setHdCoin(119); @@ -1433,7 +1477,7 @@ }, { name: "PIVX - PIVX Testnet", - p2wpkhNestedInP2shAvailable: false, + segwitAvailable: false, onSelect: function() { network = bitcoinjs.bitcoin.networks.pivxtestnet; setHdCoin(1); @@ -1441,7 +1485,7 @@ }, { name: "PPC - Peercoin", - p2wpkhNestedInP2shAvailable: false, + segwitAvailable: false, onSelect: function() { network = bitcoinjs.bitcoin.networks.peercoin; setHdCoin(6); @@ -1449,7 +1493,7 @@ }, { name: "SDC - ShadowCash", - p2wpkhNestedInP2shAvailable: false, + segwitAvailable: false, onSelect: function() { network = bitcoinjs.bitcoin.networks.shadow; setHdCoin(35); @@ -1457,7 +1501,7 @@ }, { name: "SDC - ShadowCash Testnet", - p2wpkhNestedInP2shAvailable: false, + segwitAvailable: false, onSelect: function() { network = bitcoinjs.bitcoin.networks.shadowtn; setHdCoin(1); @@ -1465,7 +1509,7 @@ }, { name: "SLM - Slimcoin", - p2wpkhNestedInP2shAvailable: false, + segwitAvailable: false, onSelect: function() { network = bitcoinjs.bitcoin.networks.slimcoin; setHdCoin(63); @@ -1473,7 +1517,7 @@ }, { name: "SLM - Slimcoin Testnet", - p2wpkhNestedInP2shAvailable: false, + segwitAvailable: false, onSelect: function() { network = bitcoinjs.bitcoin.networks.slimcointn; setHdCoin(111); @@ -1481,7 +1525,7 @@ }, { name: "USNBT - NuBits", - p2wpkhNestedInP2shAvailable: false, + segwitAvailable: false, onSelect: function() { network = bitcoinjs.bitcoin.networks.nubits; setHdCoin(12); @@ -1489,7 +1533,7 @@ }, { name: "VIA - Viacoin", - p2wpkhNestedInP2shAvailable: false, + segwitAvailable: false, onSelect: function() { network = bitcoinjs.bitcoin.networks.viacoin; setHdCoin(14); @@ -1497,7 +1541,7 @@ }, { name: "VIA - Viacoin Testnet", - p2wpkhNestedInP2shAvailable: false, + segwitAvailable: false, onSelect: function() { network = bitcoinjs.bitcoin.networks.viacointestnet; setHdCoin(1); @@ -1505,7 +1549,7 @@ }, { name: "XMY - Myriadcoin", - p2wpkhNestedInP2shAvailable: false, + segwitAvailable: false, onSelect: function() { network = bitcoinjs.bitcoin.networks.myriadcoin; setHdCoin(90); @@ -1513,19 +1557,11 @@ }, { name: "XRP - Ripple", - p2wpkhNestedInP2shAvailable: false, + segwitAvailable: false, onSelect: function() { network = bitcoinjs.bitcoin.networks.bitcoin; setHdCoin(144); }, - }, - { - name: "MONA - Monacoin", - p2wpkhNestedInP2shAvailable: true, - onSelect: function() { - network = bitcoinjs.bitcoin.networks.monacoin, - setHdCoin(22); - }, } ]