]> git.immae.eu Git - perso/Immae/Projets/Cryptomonnaies/BIP39.git/commitdiff
Merge branch 'master' into ethereum-like
authorxarakas <harilakas@gmail.com>
Mon, 18 Jun 2018 14:17:49 +0000 (17:17 +0300)
committerGitHub <noreply@github.com>
Mon, 18 Jun 2018 14:17:49 +0000 (17:17 +0300)
1  2 
src/js/index.js
tests/spec/tests.js

diff --combined src/js/index.js
index 7d04a0540d862e2628e72ca9eb5e8c8426448c5b,1b56d6cbf1e808aa5cdf5ef56425873a46d2d8cb..371cea9285d2b053cb1630b2d5a13792691827b5
@@@ -23,6 -23,7 +23,7 @@@
      var generationProcesses = [];
  
      var DOM = {};
+     DOM.privacyScreenToggle = $(".privacy-screen-toggle");
      DOM.network = $(".network");
      DOM.bip32Client = $("#bip32-client");
      DOM.phraseNetwork = $("#network-phrase");
@@@ -77,6 -78,8 +78,8 @@@
      DOM.bip49accountXprv = $("#bip49 .account-xprv");
      DOM.bip49accountXpub = $("#bip49 .account-xpub");
      DOM.bip49change = $("#bip49 .change");
+     DOM.bip84unavailable = $("#bip84 .unavailable");
+     DOM.bip84available = $("#bip84 .available");
      DOM.bip84path = $("#bip84-path");
      DOM.bip84purpose = $("#bip84 .purpose");
      DOM.bip84coin = $("#bip84 .coin");
  
      function init() {
          // Events
+         DOM.privacyScreenToggle.on("change", privacyScreenToggled);
          DOM.generatedStrength.on("change", generatedStrengthChanged);
          DOM.network.on("change", networkChanged);
          DOM.bip32Client.on("change", bip32ClientChanged);
          var networkIndex = e.target.value;
          var network = networks[networkIndex];
          network.onSelect();
-         if (network.segwitAvailable) {
-             adjustNetworkForSegwit();
-             showSegwitAvailable();
-         }
-         else {
-             showSegwitUnavailable();
-         }
+         adjustNetworkForSegwit();
          if (seed != null) {
              phraseChanged();
          }
          showPending();
          // Don't show segwit if it's selected but network doesn't support it
          if (segwitSelected() && !networkHasSegwit()) {
+             showSegwitUnavailable();
+             hidePending();
              return;
          }
+         showSegwitAvailable();
          // Get the derivation path
          var derivationPath = getDerivationPath();
          var errorText = findDerivationPathErrors(derivationPath);
          $("td.privkey span").toggleClass("invisible");
      }
  
+     function privacyScreenToggled() {
+         // private-data contains elements added to DOM at runtime
+         // so catch all by adding visual privacy class to the root of the DOM
+         if (DOM.privacyScreenToggle.prop("checked")) {
+             $("body").addClass("visual-privacy");
+         }
+         else {
+             $("body").removeClass("visual-privacy");
+         }
+     }
      // Private methods
  
      function generateRandomPhrase() {
      }
  
      function calcBip32RootKeyFromBase58(rootKeyBase58) {
+         // try parsing with various segwit network params since this extended
+         // key may be from any one of them.
+         if (networkHasSegwit()) {
+             var n = network;
+             if ("baseNetwork" in n) {
+                 n = bitcoinjs.bitcoin.networks[n.baseNetwork];
+             }
+             // try parsing using base network params
+             try {
+                 bip32RootKey = bitcoinjs.bitcoin.HDNode.fromBase58(rootKeyBase58, n);
+                 return;
+             }
+             catch (e) {}
+             // try parsing using p2wpkh params
+             if ("p2wpkh" in n) {
+                 try {
+                     bip32RootKey = bitcoinjs.bitcoin.HDNode.fromBase58(rootKeyBase58, n.p2wpkh);
+                     return;
+                 }
+                 catch (e) {}
+             }
+             // try parsing using p2wpkh-in-p2sh network params
+             if ("p2wpkhInP2sh" in n) {
+                 try {
+                     bip32RootKey = bitcoinjs.bitcoin.HDNode.fromBase58(rootKeyBase58, n.p2wpkhInP2sh);
+                     return;
+                 }
+                 catch (e) {}
+             }
+         }
+         // try the network params as currently specified
          bip32RootKey = bitcoinjs.bitcoin.HDNode.fromBase58(rootKeyBase58, network);
      }
  
      }
  
      function validateRootKey(rootKeyBase58) {
+         // try various segwit network params since this extended key may be from
+         // any one of them.
+         if (networkHasSegwit()) {
+             var n = network;
+             if ("baseNetwork" in n) {
+                 n = bitcoinjs.bitcoin.networks[n.baseNetwork];
+             }
+             // try parsing using base network params
+             try {
+                 bitcoinjs.bitcoin.HDNode.fromBase58(rootKeyBase58, n);
+                 return "";
+             }
+             catch (e) {}
+             // try parsing using p2wpkh params
+             if ("p2wpkh" in n) {
+                 try {
+                     bitcoinjs.bitcoin.HDNode.fromBase58(rootKeyBase58, n.p2wpkh);
+                     return "";
+                 }
+                 catch (e) {}
+             }
+             // try parsing using p2wpkh-in-p2sh network params
+             if ("p2wpkhInP2sh" in n) {
+                 try {
+                     bitcoinjs.bitcoin.HDNode.fromBase58(rootKeyBase58, n.p2wpkhInP2sh);
+                     return "";
+                 }
+                 catch (e) {}
+             }
+         }
+         // try the network params as currently specified
          try {
              bitcoinjs.bitcoin.HDNode.fromBase58(rootKeyBase58, network);
          }
                  var keyPair = key.keyPair;
                  var useUncompressed = useBip38;
                  if (useUncompressed) {
-                     keyPair = new bitcoinjs.bitcoin.ECPair(keyPair.d, null, { compressed: false });
+                     keyPair = new bitcoinjs.bitcoin.ECPair(keyPair.d, null, { network: network, compressed: false });
                  }
                  // get address
                  var address = keyPair.getAddress().toString();
                  var hasPrivkey = !key.isNeutered();
                  var privkey = "NA";
                  if (hasPrivkey) {
-                     privkey = keyPair.toWIF(network);
+                     privkey = keyPair.toWIF();
                      // BIP38 encode private key if required
                      if (useBip38) {
                          privkey = bitcoinjsBip38.encrypt(keyPair.d.toBuffer(), false, bip38password, function(p) {
                      indexText = indexText + "'";
                  }
                  // Ethereum values are different
 -                if (networks[DOM.network.val()].name == "ETH - Ethereum") {
 +                if ((networks[DOM.network.val()].name == "ETH - Ethereum")
 +                    || (networks[DOM.network.val()].name == "ETC - Ethereum Classic")
 +                    || (networks[DOM.network.val()].name == "PIRL - Pirl")
 +                    || (networks[DOM.network.val()].name == "MIX - MIX")
 +                    || (networks[DOM.network.val()].name == "MUSIC - Musicoin")
 +                    || (networks[DOM.network.val()].name == "POA - Poa")
 +                    || (networks[DOM.network.val()].name == "EXP - Expanse")
 +                    || (networks[DOM.network.val()].name == "CLO - Callisto")) {
                      var privKeyBuffer = keyPair.d.toBuffer(32);
                      privkey = privKeyBuffer.toString('hex');
                      var addressBuffer = ethUtil.privateToAddress(privKeyBuffer);
      }
  
      function networkHasSegwit() {
-         return networks[DOM.network.val()].segwitAvailable;
+         var n = network;
+         if ("baseNetwork" in network) {
+             n = bitcoinjs.bitcoin.networks[network.baseNetwork];
+         }
+         // check if only p2wpkh params are required
+         if (p2wpkhSelected()) {
+             return "p2wpkh" in n;
+         }
+         // check if only p2wpkh-in-p2sh params are required
+         else if (p2wpkhInP2shSelected()) {
+             return "p2wpkhInP2sh" in n;
+         }
+         // require both if it's unclear which params are required
+         return "p2wpkh" in n && "p2wpkhInP2sh" in n;
      }
  
      function bip49TabSelected() {
      function showSegwitAvailable() {
          DOM.bip49unavailable.addClass("hidden");
          DOM.bip49available.removeClass("hidden");
+         DOM.bip84unavailable.addClass("hidden");
+         DOM.bip84available.removeClass("hidden");
          DOM.bip141unavailable.addClass("hidden");
          DOM.bip141available.removeClass("hidden");
      }
      function showSegwitUnavailable() {
          DOM.bip49available.addClass("hidden");
          DOM.bip49unavailable.removeClass("hidden");
+         DOM.bip84available.addClass("hidden");
+         DOM.bip84unavailable.removeClass("hidden");
          DOM.bip141available.addClass("hidden");
          DOM.bip141unavailable.removeClass("hidden");
      }
      var networks = [
          {
              name: "AC - Asiacoin",
-             segwitAvailable: false,
              onSelect: function() {
                  network = bitcoinjs.bitcoin.networks.asiacoin;
                  setHdCoin(51);
          },
          {
              name: "ACC - Adcoin",
-             segwitAvailable: true,
              onSelect: function() {
                  network = bitcoinjs.bitcoin.networks.adcoin;
                  setHdCoin(161);
          },
          {
              name: "AUR - Auroracoin",
-             segwitAvailable: false,
              onSelect: function() {
                  network = bitcoinjs.bitcoin.networks.auroracoin;
                  setHdCoin(85);
          },
          {
              name: "AXE - Axe",
-             segwitAvailable: false,
              onSelect: function() {
                  network = bitcoinjs.bitcoin.networks.axe;
                  setHdCoin(4242);
          },
          {
              name: "BCA - Bitcoin Atom",
-             segwitAvailable: true,
              onSelect: function() {
                  network = bitcoinjs.bitcoin.networks.atom;
                  setHdCoin(185);
          },
          {
              name: "BCH - Bitcoin Cash",
-             segwitAvailable: false,
              onSelect: function() {
                  DOM.bitcoinCashAddressTypeContainer.removeClass("hidden");
                  setHdCoin(145);
          },
          {
              name: "BEET - Beetlecoin",
-             segwitAvailable: false,
              onSelect: function() {
                  network = bitcoinjs.bitcoin.networks.beetlecoin;
                  setHdCoin(800);
          },
          {
              name: "BELA - Belacoin",
-             segwitAvailable: false,
              onSelect: function() {
                  network = bitcoinjs.bitcoin.networks.belacoin;
                  setHdCoin(73);
          },
          {
              name: "BLK - BlackCoin",
-             segwitAvailable: false,
              onSelect: function() {
                  network = bitcoinjs.bitcoin.networks.blackcoin;
                  setHdCoin(10);
          },
          {
              name: "BRIT - Britcoin",
-             segwitAvailable: false,
              onSelect: function() {
                  network = bitcoinjs.bitcoin.networks.britcoin;
                  setHdCoin(70);
          },
          {
              name: "BSD - Bitsend",
-             segwitAvailable: true,
              onSelect: function() {
                  network = bitcoinjs.bitcoin.networks.bitsend;
                  setHdCoin(91);
          },
          {
              name: "BTA - Bata",
-             segwitAvailable: false,
              onSelect: function() {
                  network = bitcoinjs.bitcoin.networks.bata;
                  setHdCoin(89);
          },
          {
              name: "BTC - Bitcoin",
-             segwitAvailable: true,
              onSelect: function() {
                  network = bitcoinjs.bitcoin.networks.bitcoin;
                  setHdCoin(0);
          },
          {
              name: "BTC - Bitcoin Testnet",
-             segwitAvailable: true,
              onSelect: function() {
                  network = bitcoinjs.bitcoin.networks.testnet;
                  setHdCoin(1);
          },
          {
              name: "BTCP - Bitcoin Private",
-             segwitAvailable: true,
              onSelect: function() {
                  network = bitcoinjs.bitcoin.networks.bitcoinprivate;
                  setHdCoin(183);
          },
          {
              name: "BTCZ - Bitcoinz",
-             segwitAvailable: false,
              onSelect: function() {
                  network = bitcoinjs.bitcoin.networks.bitcoinz;
                  setHdCoin(177);
          },
          {
              name: "BTG - Bitcoin Gold",
-             segwitAvailable: true,
              onSelect: function() {
                  network = bitcoinjs.bitcoin.networks.bgold;
                  setHdCoin(156);
          },
          {
              name: "BTX - Bitcore",
-             segwitAvailable: true,
              onSelect: function() {
                  network = bitcoinjs.bitcoin.networks.bitcore;
                  setHdCoin(160);
          },
          {
              name: "CCN - Cannacoin",
-             segwitAvailable: false,
              onSelect: function() {
                  network = bitcoinjs.bitcoin.networks.cannacoin;
                  setHdCoin(19);
          },
          {
              name: "CDN - Canadaecoin",
-             segwitAvailable: false,
              onSelect: function() {
                  network = bitcoinjs.bitcoin.networks.canadaecoin;
                  setHdCoin(34);
          },
          {
              name: "CLAM - Clams",
-             segwitAvailable: false,
              onSelect: function() {
                  network = bitcoinjs.bitcoin.networks.clam;
                  setHdCoin(23);
              },
          },
 +        {
 +            name: "CLO - Callisto",
 +            segwitAvailable: false,
 +            onSelect: function() {
 +                network = bitcoinjs.bitcoin.networks.bitcoin;
 +                setHdCoin(820);
 +            },
 +        },
          {
              name: "CLUB - Clubcoin",
-             segwitAvailable: false,
              onSelect: function() {
                  network = bitcoinjs.bitcoin.networks.clubcoin;
                  setHdCoin(79);
          },
          {
              name: "CMP - Compcoin",
-             segwitAvailable: false,
              onSelect: function() {
                  network = bitcoinjs.bitcoin.networks.compcoin;
                  setHdCoin(71);
          },
          {
              name: "CRAVE - Crave",
-             segwitAvailable: false,
              onSelect: function() {
                  network = bitcoinjs.bitcoin.networks.crave;
                  setHdCoin(186);
          },
          {
              name: "CRW - Crown",
-             segwitAvailable: false,
              onSelect: function() {
                  network = bitcoinjs.bitcoin.networks.crown;
                  setHdCoin(72);
          },
          {
              name: "DASH - Dash",
-             segwitAvailable: false,
              onSelect: function() {
                  network = bitcoinjs.bitcoin.networks.dash;
                  setHdCoin(5);
          },
          {
              name: "DASH - Dash Testnet",
-             segwitAvailable: false,
              onSelect: function() {
                  network = bitcoinjs.bitcoin.networks.dashtn;
                  setHdCoin(1);
          },
          {
              name: "DFC - Defcoin",
-             segwitAvailable: false,
              onSelect: function() {
                  network = bitcoinjs.bitcoin.networks.defcoin;
                  setHdCoin(1337);
          },
          {
              name: "DGB - Digibyte",
-             segwitAvailable: true,
              onSelect: function() {
                  network = bitcoinjs.bitcoin.networks.digibyte;
                  setHdCoin(20);
          },
          {
              name: "DGC - Digitalcoin",
-             segwitAvailable: false,
              onSelect: function() {
                  network = bitcoinjs.bitcoin.networks.digitalcoin;
                  setHdCoin(18);
          },
          {
              name: "DMD - Diamond",
-             segwitAvailable: false,
              onSelect: function() {
                  network = bitcoinjs.bitcoin.networks.diamond;
                  setHdCoin(152);
          },
          {
              name: "DNR - Denarius",
-             segwitAvailable: false,
              onSelect: function() {
                  network = bitcoinjs.bitcoin.networks.denarius;
                  setHdCoin(116);
          },
          {
              name: "DOGE - Dogecoin",
-             segwitAvailable: false,
              onSelect: function() {
                  network = bitcoinjs.bitcoin.networks.dogecoin;
                  setHdCoin(3);
          },
          {
              name: "ECN - Ecoin",
-             segwitAvailable: false,
              onSelect: function() {
                  network = bitcoinjs.bitcoin.networks.ecoin;
                  setHdCoin(115);
          },
          {
              name: "EDRC - Edrcoin",
-             segwitAvailable: false,
              onSelect: function() {
                  network = bitcoinjs.bitcoin.networks.edrcoin;
                  setHdCoin(56);
          },
          {
              name: "EFL - Egulden",
-             segwitAvailable: true,
              onSelect: function() {
                  network = bitcoinjs.bitcoin.networks.egulden;
                  setHdCoin(78);
          },
          {
              name: "EMC2 - Einsteinium",
-             segwitAvailable: false,
              onSelect: function() {
                  network = bitcoinjs.bitcoin.networks.einsteinium;
                  setHdCoin(41);
          },
          {
              name: "ERC - Europecoin",
-             segwitAvailable: false,
              onSelect: function() {
                  network = bitcoinjs.bitcoin.networks.europecoin;
                  setHdCoin(151);
              },
          },
 +        {
 +            name: "ETC - Ethereum Classic",
 +            segwitAvailable: false,
 +            onSelect: function() {
 +                network = bitcoinjs.bitcoin.networks.bitcoin;
 +                setHdCoin(61);
 +            },
 +        },
          {
              name: "ETH - Ethereum",
-             segwitAvailable: false,
              onSelect: function() {
                  network = bitcoinjs.bitcoin.networks.bitcoin;
                  setHdCoin(60);
          },
          {
              name: "EXCL - Exclusivecoin",
-             segwitAvailable: false,
              onSelect: function() {
                  network = bitcoinjs.bitcoin.networks.exclusivecoin;
                  setHdCoin(190);
              },
          },
 +        {
 +            name: "EXP - Expanse",
 +            segwitAvailable: false,
 +            onSelect: function() {
 +                network = bitcoinjs.bitcoin.networks.bitcoin;
 +                setHdCoin(40);
 +            },
 +        },
          {
              name: "FJC - Fujicoin",
-             segwitAvailable: true,
              onSelect: function() {
                  network = bitcoinjs.bitcoin.networks.fujicoin;
                  setHdCoin(75);
          },
          {
              name: "FLASH - Flashcoin",
-             segwitAvailable: false,
              onSelect: function() {
                  network = bitcoinjs.bitcoin.networks.flashcoin;
                  setHdCoin(120);
          },
          {
              name: "FRST - Firstcoin",
-             segwitAvailable: false,
              onSelect: function() {
                  network = bitcoinjs.bitcoin.networks.firstcoin;
                  setHdCoin(167);
          },
          {
              name: "FTC - Feathercoin",
-             segwitAvailable: true,
              onSelect: function() {
                  network = bitcoinjs.bitcoin.networks.feathercoin;
                  setHdCoin(8);
          },
          {
              name: "GAME - GameCredits",
-             segwitAvailable: false,
              onSelect: function() {
                  network = bitcoinjs.bitcoin.networks.game;
                  setHdCoin(101);
          },
          {
              name: "GBX - Gobyte",
-             segwitAvailable: false,
              onSelect: function() {
                  network = bitcoinjs.bitcoin.networks.gobyte;
                  setHdCoin(176);
          },
          {
              name: "GCR - GCRCoin",
-             segwitAvailable: false,
              onSelect: function() {
                  network = bitcoinjs.bitcoin.networks.gcr;
                  setHdCoin(79);
          },
          {
              name: "GRC - Gridcoin",
-             segwitAvailable: false,
              onSelect: function() {
                  network = bitcoinjs.bitcoin.networks.gridcoin;
                  setHdCoin(84);
          },
          {
              name: "HNC - Helleniccoin",
-             segwitAvailable: false,
              onSelect: function() {
                  network = bitcoinjs.bitcoin.networks.helleniccoin;
                  setHdCoin(168);
          },
          {
              name: "INSN - Insane",
-             segwitAvailable: false,
              onSelect: function() {
                  network = bitcoinjs.bitcoin.networks.insane;
                  setHdCoin(68);
          },
          {
              name: "IOP - Iop",
-             segwitAvailable: true,
              onSelect: function() {
                  network = bitcoinjs.bitcoin.networks.iop;
                  setHdCoin(66);
          },
          {
              name: "IXC - Ixcoin",
-             segwitAvailable: false,
              onSelect: function() {
                  network = bitcoinjs.bitcoin.networks.ixcoin;
                  setHdCoin(86);
          },
          {
              name: "JBS - Jumbucks",
-             segwitAvailable: false,
              onSelect: function() {
                  network = bitcoinjs.bitcoin.networks.jumbucks;
                  setHdCoin(26);
          },
          {
              name: "LBC - Library Credits",
-             segwitAvailable: false,
              onSelect: function() {
                  network = bitcoinjs.bitcoin.networks.lbry;
                  setHdCoin(140);
          },
          {
              name: "LCC - Litecoincash",
-             segwitAvailable: true,
              onSelect: function() {
                  network = bitcoinjs.bitcoin.networks.litecoincash;
                  setHdCoin(192);
          },
          {
              name: "LDCN - Landcoin",
-             segwitAvailable: false,
              onSelect: function() {
                  network = bitcoinjs.bitcoin.networks.landcoin;
                  setHdCoin(63);
          },
          {
              name: "LINX - Linx",
-             segwitAvailable: false,
              onSelect: function() {
                  network = bitcoinjs.bitcoin.networks.linx;
                  setHdCoin(114);
          },
          {
              name: "LTC - Litecoin",
-             segwitAvailable: true,
              onSelect: function() {
                  network = bitcoinjs.bitcoin.networks.litecoin;
                  setHdCoin(2);
          },
          {
              name: "LYNX - Lynx",
-             segwitAvailable: false,
              onSelect: function() {
                  network = bitcoinjs.bitcoin.networks.lynx;
                  setHdCoin(191);
          },
          {
              name: "MAZA - Maza",
-             segwitAvailable: false,
              onSelect: function() {
                  network = bitcoinjs.bitcoin.networks.maza;
                  setHdCoin(13);
              },
          },
 +        {
 +            name: "MIX - MIX",
 +            segwitAvailable: false,
 +            onSelect: function() {
 +                network = bitcoinjs.bitcoin.networks.bitcoin;
 +                setHdCoin(76);
 +            },
 +        },
          {
              name: "MNX - Minexcoin",
-             segwitAvailable: true,
              onSelect: function() {
                  network = bitcoinjs.bitcoin.networks.minexcoin;
                  setHdCoin(182);
          },
          {
              name: "MONA - Monacoin",
-             segwitAvailable: true,
              onSelect: function() {
                  network = bitcoinjs.bitcoin.networks.monacoin,
                  setHdCoin(22);
              },
          },
 +        {
 +            name: "MUSIC - Musicoin",
 +            segwitAvailable: false,
 +            onSelect: function() {
 +                network = bitcoinjs.bitcoin.networks.bitcoin;
 +                setHdCoin(184);
 +            },
 +        },
          {
              name: "NAV - Navcoin",
-             segwitAvailable: true,
              onSelect: function() {
                  network = bitcoinjs.bitcoin.networks.navcoin;
                  setHdCoin(130);
          },
          {
              name: "NEBL - Neblio",
-             segwitAvailable: false,
              onSelect: function() {
                  network = bitcoinjs.bitcoin.networks.neblio;
                  setHdCoin(146);
          },
          {
              name: "NEOS - Neoscoin",
-             segwitAvailable: false,
              onSelect: function() {
                  network = bitcoinjs.bitcoin.networks.neoscoin;
                  setHdCoin(25);
          },
          {
              name: "NLG - Gulden",
-             segwitAvailable: false,
              onSelect: function() {
                  network = bitcoinjs.bitcoin.networks.gulden;
                  setHdCoin(87);
          },
          {
              name: "NMC - Namecoin",
-             segwitAvailable: false,
              onSelect: function() {
                  network = bitcoinjs.bitcoin.networks.namecoin;
                  setHdCoin(7);
          },
          {
              name: "NRG - Energi",
-             segwitAvailable: false,
              onSelect: function() {
                  network = bitcoinjs.bitcoin.networks.energi;
                  setHdCoin(204);
          },
          {
              name: "NRO - Neurocoin",
-             segwitAvailable: false,
              onSelect: function() {
                  network = bitcoinjs.bitcoin.networks.neurocoin;
                  setHdCoin(110);
          },
          {
              name: "NSR - Nushares",
-             segwitAvailable: false,
              onSelect: function() {
                  network = bitcoinjs.bitcoin.networks.nushares;
                  setHdCoin(11);
          },
          {
              name: "NYC - Newyorkc",
-             segwitAvailable: false,
              onSelect: function() {
                  network = bitcoinjs.bitcoin.networks.newyorkc;
                  setHdCoin(179);
          },
          {
              name: "NVC - Novacoin",
-             segwitAvailable: false,
              onSelect: function() {
                  network = bitcoinjs.bitcoin.networks.novacoin;
                  setHdCoin(50);
          },
          {
              name: "OK - Okcash",
-             segwitAvailable: false,
              onSelect: function() {
                  network = bitcoinjs.bitcoin.networks.okcash;
                  setHdCoin(69);
          },
          {
              name: "OMNI - Omnicore",
-             segwitAvailable: true,
              onSelect: function() {
                  network = bitcoinjs.bitcoin.networks.omnicore;
                  setHdCoin(200);
          },
          {
              name: "ONX - Onixcoin",
-             segwitAvailable: false,
              onSelect: function() {
                  network = bitcoinjs.bitcoin.networks.onixcoin;
                  setHdCoin(174);
          },
          {
              name: "PINK - Pinkcoin",
-             segwitAvailable: false,
              onSelect: function() {
                  network = bitcoinjs.bitcoin.networks.pinkcoin;
                  setHdCoin(117);
              },
          },
 +        {
 +            name: "PIRL - Pirl",
 +            segwitAvailable: false,
 +            onSelect: function() {
 +                network = bitcoinjs.bitcoin.networks.bitcoin;
 +                setHdCoin(164);
 +            },
 +        },
          {
              name: "PIVX - PIVX",
-             segwitAvailable: false,
              onSelect: function() {
                  network = bitcoinjs.bitcoin.networks.pivx;
                  setHdCoin(119);
          },
          {
              name: "PIVX - PIVX Testnet",
-             segwitAvailable: false,
              onSelect: function() {
                  network = bitcoinjs.bitcoin.networks.pivxtestnet;
                  setHdCoin(1);
              },
          },
 +        {
 +            name: "POA - Poa",
 +            segwitAvailable: false,
 +            onSelect: function() {
 +                network = bitcoinjs.bitcoin.networks.bitcoin;
 +                setHdCoin(178);
 +            },
 +        },
          {
              name: "POSW - POSWcoin",
-             segwitAvailable: false,
              onSelect: function() {
                  network = bitcoinjs.bitcoin.networks.poswcoin;
                  setHdCoin(47);
          },
          {
              name: "POT - Potcoin",
-             segwitAvailable: false,
              onSelect: function() {
                  network = bitcoinjs.bitcoin.networks.potcoin;
                  setHdCoin(81);
          },
          {
              name: "PPC - Peercoin",
-             segwitAvailable: false,
              onSelect: function() {
                  network = bitcoinjs.bitcoin.networks.peercoin;
                  setHdCoin(6);
          },
          {
              name: "PSB - Pesobit",
-             segwitAvailable: false,
              onSelect: function() {
                  network = bitcoinjs.bitcoin.networks.pesobit;
                  setHdCoin(62);
          },
          {
              name: "PUT - Putincoin",
-             segwitAvailable: false,
              onSelect: function() {
                  network = bitcoinjs.bitcoin.networks.putincoin;
                  setHdCoin(122);
          },
          {
              name: "RBY - Rubycoin",
-             segwitAvailable: false,
              onSelect: function() {
                  network = bitcoinjs.bitcoin.networks.rubycoin;
                  setHdCoin(16);
          },
          {
              name: "RDD - Reddcoin",
-             segwitAvailable: false,
              onSelect: function() {
-                 network = bitcoinjs.bitcoin.networks.reddoin;
+                 network = bitcoinjs.bitcoin.networks.reddcoin;
                  setHdCoin(4);
              },
          },
          {
              name: "RVR - RevolutionVR",
-             segwitAvailable: false,
              onSelect: function() {
                  network = bitcoinjs.bitcoin.networks.revolutionvr;
                  setHdCoin(129);
          },
          {
              name: "SDC - ShadowCash",
-             segwitAvailable: false,
              onSelect: function() {
                  network = bitcoinjs.bitcoin.networks.shadow;
                  setHdCoin(35);
          },
          {
              name: "SDC - ShadowCash Testnet",
-             segwitAvailable: false,
              onSelect: function() {
                  network = bitcoinjs.bitcoin.networks.shadowtn;
                  setHdCoin(1);
          },
          {
              name: "SLM - Slimcoin",
-             segwitAvailable: false,
              onSelect: function() {
                  network = bitcoinjs.bitcoin.networks.slimcoin;
                  setHdCoin(63);
          },
          {
              name: "SLM - Slimcoin Testnet",
-             segwitAvailable: false,
              onSelect: function() {
                  network = bitcoinjs.bitcoin.networks.slimcointn;
                  setHdCoin(111);
          },
          {
              name: "SLR - Solarcoin",
-             segwitAvailable: false,
              onSelect: function() {
                  network = bitcoinjs.bitcoin.networks.solarcoin;
                  setHdCoin(58);
          },
          {
              name: "SMLY - Smileycoin",
-             segwitAvailable: false,
              onSelect: function() {
                  network = bitcoinjs.bitcoin.networks.smileycoin;
                  setHdCoin(59);
          },
          {
              name: "STRAT - Stratis",
-             segwitAvailable: false,
              onSelect: function() {
                  network = bitcoinjs.bitcoin.networks.stratis;
                  setHdCoin(105);
          },
          {
              name: "SYS - Syscoin",
-             segwitAvailable: true,
              onSelect: function() {
                  network = bitcoinjs.bitcoin.networks.syscoin;
                  setHdCoin(57);
          },
          {
              name: "THC - Hempcoin",
-             segwitAvailable: false,
              onSelect: function() {
                  network = bitcoinjs.bitcoin.networks.hempcoin;
                  setHdCoin(113);
          },
          {
              name: "TOA - Toa",
-             segwitAvailable: false,
              onSelect: function() {
                  network = bitcoinjs.bitcoin.networks.toa;
                  setHdCoin(159);
          },
          {
              name: "USC - Ultimatesecurecash",
-             segwitAvailable: false,
              onSelect: function() {
                  network = bitcoinjs.bitcoin.networks.ultimatesecurecash;
                  setHdCoin(112);
          },
          {
              name: "USNBT - NuBits",
-             segwitAvailable: false,
              onSelect: function() {
                  network = bitcoinjs.bitcoin.networks.nubits;
                  setHdCoin(12);
          },
          {
              name: "UNO - Unobtanium",
-             segwitAvailable: false,
              onSelect: function() {
                  network = bitcoinjs.bitcoin.networks.unobtanium;
                  setHdCoin(92);
          },
          {
              name: "VASH - Vpncoin",
-             segwitAvailable: false,
              onSelect: function() {
                  network = bitcoinjs.bitcoin.networks.vpncoin;
                  setHdCoin(33);
          },
          {
              name: "VIA - Viacoin",
-             segwitAvailable: false,
              onSelect: function() {
                  network = bitcoinjs.bitcoin.networks.viacoin;
                  setHdCoin(14);
          },
          {
              name: "VIA - Viacoin Testnet",
-             segwitAvailable: false,
              onSelect: function() {
                  network = bitcoinjs.bitcoin.networks.viacointestnet;
                  setHdCoin(1);
          },
          {
              name: "VIVO - Vivo",
-             segwitAvailable: false,
              onSelect: function() {
                  network = bitcoinjs.bitcoin.networks.vivo;
                  setHdCoin(166);
          },
          {
              name: "VTC - Vertcoin",
-             segwitAvailable: true,
              onSelect: function() {
                  network = bitcoinjs.bitcoin.networks.vertcoin;
                  setHdCoin(28);
          },
          {
              name: "WC - Wincoin",
-             segwitAvailable: false,
              onSelect: function() {
                  network = bitcoinjs.bitcoin.networks.wincoin;
                  setHdCoin(181);
          },
          {
              name: "XBC - Bitcoinplus",
-             segwitAvailable: false,
              onSelect: function() {
                  network = bitcoinjs.bitcoin.networks.bitcoinplus;
                  setHdCoin(65);
          },
          {
              name: "XMY - Myriadcoin",
-             segwitAvailable: false,
              onSelect: function() {
                  network = bitcoinjs.bitcoin.networks.myriadcoin;
                  setHdCoin(90);
          },
          {
              name: "XRP - Ripple",
-             segwitAvailable: false,
              onSelect: function() {
                  network = bitcoinjs.bitcoin.networks.bitcoin;
                  setHdCoin(144);
          },
          {
              name: "XVC - Vcash",
-             segwitAvailable: false,
              onSelect: function() {
                  network = bitcoinjs.bitcoin.networks.vcash;
                  setHdCoin(127);
          },
          {
              name: "XVG - Verge",
-             segwitAvailable: false,
              onSelect: function() {
                  network = bitcoinjs.bitcoin.networks.verge;
                  setHdCoin(77);
              },
          },
 +        {
 +            name: "XUEZ - Xuez",
 +            segwitAvailable: false,
 +            onSelect: function() {
 +                network = bitcoinjs.bitcoin.networks.xuez;
 +                setHdCoin(225);
 +            },
 +        },
          {
              name: "XWC - Whitecoin",
-             segwitAvailable: false,
              onSelect: function() {
                  network = bitcoinjs.bitcoin.networks.whitecoin;
                  setHdCoin(155);
          },
          {
              name: "XZC - Zcoin",
-             segwitAvailable: true,
              onSelect: function() {
                  network = bitcoinjs.bitcoin.networks.zcoin;
                  setHdCoin(136);
          },
          {
              name: "ZCL - Zclassic",
-             segwitAvailable: false,
              onSelect: function() {
                  network = bitcoinjs.bitcoin.networks.zclassic;
                  setHdCoin(147);
          },
          {
              name: "ZEC - Zcash",
-             segwitAvailable: false,
              onSelect: function() {
                  network = bitcoinjs.bitcoin.networks.zcash;
                  setHdCoin(133);
              },
          },
 -        {
 -            name: "XUEZ - Xuez",
 -            onSelect: function() {
 -                network = bitcoinjs.bitcoin.networks.xuez;
 -                setHdCoin(225);
 -            },
 -        },
          {
              name: "ZEN - Zencash",
-             segwitAvailable: false,
              onSelect: function() {
                  network = bitcoinjs.bitcoin.networks.zencash;
                  setHdCoin(121);
                  DOM.bip32path.val("m/0'/0");
                  DOM.hardenedAddresses.prop('checked', false);
              },
 +        },
 +        {
 +            name: "Coinomi, Ledger",
 +            onSelect: function() {
 +                DOM.bip32path.val("m/44'/"+DOM.bip44coin.val()+"'/0'");
 +                DOM.hardenedAddresses.prop('checked', false);
 +            },
          }
      ]
  
diff --combined tests/spec/tests.js
index 250a7205f78602831cf35d7ea1e84d2afb14803e,b81294b64a532bf0a59d0db958b17a30d26cf539..0ffc73bd8d7d96ae2b43bc512fbeac228f2e7286
@@@ -616,7 -616,7 +616,7 @@@ it('Allows selection of monacoin', func
  it('Allows selection of AXE', function(done) {
      var params = {
          selectText: "AXE - Axe",
-         firstAddress: "XQ4HLxUVS3egk5ff1o9e2vJFJKSSsUH3B7",
+         firstAddress: "PScwtLUyPiGrqtKXrHF37DGETLXLZdw4up",
      };
      testNetwork(done, params);
  });
@@@ -1057,7 -1057,7 +1057,7 @@@ it('Allows selection of Putincoin', fun
  it('Allows selection of Reddcoin', function(done) {
      var params = {
          selectText: "RDD - Reddcoin",
-         firstAddress: "1M4druAcUfkXBaAcQ4cCgCLPHChiaib6kL",
+         firstAddress: "RtgRvXMBng1y51ftteveFqwNfyRG18HpxQ",
      };
      testNetwork(done, params);
  });
@@@ -1208,55 -1208,6 +1208,55 @@@ it('Allows selection of Energi', functi
      };
      testNetwork(done, params);
  });
 +it('Allows selection of Ethereum Classic', function(done) {
 +    var params = {
 +        selectText: "ETC - Ethereum Classic",
 +        firstAddress: "0x3c05e5556693808367afB62eF3b63e35d6eD249A",
 +    };
 +    testNetwork(done, params);
 +});
 +it('Allows selection of Pirl', function(done) {
 +    var params = {
 +        selectText: "PIRL - Pirl",
 +        firstAddress: "0xe77FC0723dA122B5025CA79193c28563eB47e776",
 +    };
 +    testNetwork(done, params);
 +});
 +it('Allows selection of MIX', function(done) {
 +    var params = {
 +        selectText: "MIX - MIX",
 +        firstAddress: "0x98BC5e63aeb6A4e82d72850d20710F07E29A29F1",
 +    };
 +    testNetwork(done, params);
 +});
 +it('Allows selection of Musicoin', function(done) {
 +    var params = {
 +        selectText: "MUSIC - Musicoin",
 +        firstAddress: "0xDc060e4A0b0313ea83Cf6B3A39B9db2D29004897",
 +    };
 +    testNetwork(done, params);
 +});
 +it('Allows selection of Poa', function(done) {
 +    var params = {
 +        selectText: "POA - Poa",
 +        firstAddress: "0x53aF28d754e106210C3d0467Dd581eaf7e3C5e60",
 +    };
 +    testNetwork(done, params);
 +});
 +it('Allows selection of Expanse', function(done) {
 +    var params = {
 +        selectText: "EXP - Expanse",
 +        firstAddress: "0xf57FeAbf26582b6E3E666559d3B1Cc6fB2b2c5F6",
 +    };
 +    testNetwork(done, params);
 +});
 +it('Allows selection of Callisto', function(done) {
 +    var params = {
 +        selectText: "CLO - Callisto",
 +        firstAddress: "0x4f9364F7420B317266C51Dc8eB979717D4dE3f4E",
 +    };
 +    testNetwork(done, params);
 +});
  
  
  // BIP39 seed is set from phrase
@@@ -3692,4 -3643,61 +3692,61 @@@ it('Does not show a warning if entropy 
          });
  });
  
+ it('Shows a warning for litecoin BIP84 (which does not have p2wpkh params)', function(done) {
+     driver.findElement(By.css('.phrase'))
+         .sendKeys('abandon abandon ability');
+     selectNetwork("LTC - Litecoin");
+     driver.findElement(By.css('#bip84-tab a'))
+         .click()
+     // bip84 unavailable is shown
+     driver.sleep(feedbackDelay).then(function() {
+         driver.findElement(By.css('#bip84 .unavailable'))
+             .getAttribute("class")
+             .then(function(classes) {
+                 expect(classes).not.toContain("hidden");
+                 done();
+             });
+     });
+ });
+ it('Shows litecoin BIP49 addresses', function(done) {
+     driver.findElement(By.css('.phrase'))
+         .sendKeys('abandon abandon ability');
+     selectNetwork("LTC - Litecoin");
+     driver.findElement(By.css('#bip49-tab a'))
+         .click()
+     // bip49 addresses are shown
+     driver.sleep(generateDelay).then(function() {
+         driver.findElement(By.css('#bip49 .available'))
+             .getAttribute("class")
+             .then(function(classes) {
+                 expect(classes).not.toContain("hidden");
+                 // check first address
+                 getFirstAddress(function(address) {
+                     expect(address).toBe("MFwLPhsXoBuSLL8cLmW9uK6tChkzduV8qN");
+                     done();
+                 });
+             });
+     });
+ });
+ it('Can use root keys to generate segwit table rows', function(done) {
+     // segwit uses ypub / zpub instead of xpub but the root key should still
+     // be valid regardless of the encoding used to import that key.
+     // Maybe this breaks the reason for the different extended key prefixes, but
+     // since the parsed root key is used behind the scenes anyhow this should be
+     // allowed.
+     driver.findElement(By.css('#root-key'))
+         .sendKeys('xprv9s21ZrQH143K2jkGDCeTLgRewT9F2pH5JZs2zDmmjXes34geVnFiuNa8KTvY5WoYvdn4Ag6oYRoB6cXtc43NgJAEqDXf51xPm6fhiMCKwpi');
+     driver.findElement(By.css('#bip49-tab a'))
+         .click()
+     // bip49 addresses are shown
+     driver.sleep(generateDelay).then(function() {
+         getFirstAddress(function(address) {
+             expect(address).toBe("3QG2Y9AA4xZ846gKHZqNf7mvVKbLqMKxr2");
+             done();
+         });
+     });
+ });
  });