X-Git-Url: https://git.immae.eu/?p=perso%2FImmae%2FProjets%2FCryptomonnaies%2FBIP39.git;a=blobdiff_plain;f=src%2Fjs%2Findex.js;h=6b292f53095f80ebf56a63fba07c74fa7a911233;hp=0a2d3626e70e34b5f46ee0f7ecc4d9b399fe9d1e;hb=f12242014d1ed5c7606c3350a9780c3883abc565;hpb=85c906727a24ab97a3c2908c72ad37ad988ecb01 diff --git a/src/js/index.js b/src/js/index.js index 0a2d362..d169ed2 100644 --- a/src/js/index.js +++ b/src/js/index.js @@ -16,6 +16,7 @@ var showQr = false; var litecoinUseLtub = true; + var entropyTypeAutoDetect = true; var entropyChangeTimeoutEvent = null; var phraseChangeTimeoutEvent = null; var rootKeyChangedTimeoutEvent = null; @@ -23,6 +24,7 @@ var generationProcesses = []; var DOM = {}; + DOM.privacyScreenToggle = $(".privacy-screen-toggle"); DOM.network = $(".network"); DOM.bip32Client = $("#bip32-client"); DOM.phraseNetwork = $("#network-phrase"); @@ -31,6 +33,7 @@ DOM.entropy = $(".entropy"); DOM.entropyFiltered = DOM.entropyContainer.find(".filtered"); DOM.entropyType = DOM.entropyContainer.find(".type"); + DOM.entropyTypeInputs = DOM.entropyContainer.find("input[name='entropy-type']"); DOM.entropyCrackTime = DOM.entropyContainer.find(".crack-time"); DOM.entropyEventCount = DOM.entropyContainer.find(".event-count"); DOM.entropyBits = DOM.entropyContainer.find(".bits"); @@ -40,8 +43,11 @@ DOM.entropyWordIndexes = DOM.entropyContainer.find(".word-indexes"); DOM.entropyChecksum = DOM.entropyContainer.find(".checksum"); DOM.entropyMnemonicLength = DOM.entropyContainer.find(".mnemonic-length"); + DOM.entropyWeakEntropyOverrideWarning = DOM.entropyContainer.find(".weak-entropy-override-warning"); DOM.entropyFilterWarning = DOM.entropyContainer.find(".filter-warning"); DOM.phrase = $(".phrase"); + DOM.phraseSplit = $(".phraseSplit"); + DOM.phraseSplitWarn = $(".phraseSplitWarn"); DOM.passphrase = $(".passphrase"); DOM.generateContainer = $(".generate-container"); DOM.generate = $(".generate"); @@ -76,6 +82,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"); @@ -90,8 +98,8 @@ DOM.generatedStrength = $(".generate-container .strength"); DOM.generatedStrengthWarning = $(".generate-container .warning"); DOM.hardenedAddresses = $(".hardened-addresses"); - DOM.useBitpayAddressesContainer = $(".use-bitpay-addresses-container"); - DOM.useBitpayAddresses = $(".use-bitpay-addresses"); + DOM.bitcoinCashAddressTypeContainer = $(".bch-addr-type-container"); + DOM.bitcoinCashAddressType = $("[name=bch-addr-type]") DOM.useBip38 = $(".use-bip38"); DOM.bip38Password = $(".bip38-password"); DOM.addresses = $(".addresses"); @@ -115,12 +123,14 @@ function init() { // Events + DOM.privacyScreenToggle.on("change", privacyScreenToggled); DOM.generatedStrength.on("change", generatedStrengthChanged); DOM.network.on("change", networkChanged); DOM.bip32Client.on("change", bip32ClientChanged); DOM.useEntropy.on("change", setEntropyVisibility); DOM.entropy.on("input", delayedEntropyChanged); DOM.entropyMnemonicLength.on("change", entropyChanged); + DOM.entropyTypeInputs.on("change", entropyTypeChanged); DOM.phrase.on("input", delayedPhraseChanged); DOM.passphrase.on("input", delayedPhraseChanged); DOM.generate.on("click", generateClicked); @@ -146,7 +156,7 @@ DOM.privateKeyToggle.on("click", togglePrivateKeys); DOM.csvTab.on("click", updateCsv); DOM.languages.on("click", languageChanged); - DOM.useBitpayAddresses.on("change", useBitpayAddressesChange); + DOM.bitcoinCashAddressType.on("change", bitcoinCashAddressTypeChange); setQrEvents(DOM.showQrEls); disableForms(); hidePending(); @@ -171,17 +181,11 @@ clearDerivedKeys(); clearAddressesList(); DOM.litecoinLtubContainer.addClass("hidden"); - DOM.useBitpayAddressesContainer.addClass("hidden"); + DOM.bitcoinCashAddressTypeContainer.addClass("hidden"); var networkIndex = e.target.value; var network = networks[networkIndex]; network.onSelect(); - if (network.segwitAvailable) { - adjustNetworkForSegwit(); - showSegwitAvailable(); - } - else { - showSegwitUnavailable(); - } + adjustNetworkForSegwit(); if (seed != null) { phraseChanged(); } @@ -233,7 +237,16 @@ if (phraseChangeTimeoutEvent != null) { clearTimeout(phraseChangeTimeoutEvent); } - phraseChangeTimeoutEvent = setTimeout(phraseChanged, 400); + phraseChangeTimeoutEvent = setTimeout(function() { + phraseChanged(); + var entropy = mnemonic.toRawEntropyHex(DOM.phrase.val()); + if (entropy !== null) { + DOM.entropyMnemonicLength.val("raw"); + DOM.entropy.val(entropy); + DOM.entropyTypeInputs.filter("[value='hexadecimal']").prop("checked", true); + entropyTypeAutoDetect = false; + } + }, 400); } function phraseChanged() { @@ -252,6 +265,7 @@ calcForDerivationPath(); // Show the word indexes showWordIndexes(); + writeSplitPhrase(phrase); } function tabChanged() { @@ -298,6 +312,7 @@ clearDisplay(); clearEntropyFeedback(); DOM.phrase.val(""); + DOM.phraseSplit.val(""); showValidationError("Blank entropy"); return; } @@ -320,6 +335,11 @@ } } + function entropyTypeChanged() { + entropyTypeAutoDetect = false; + entropyChanged(); + } + function delayedRootKeyChanged() { // Warn if there is an existing mnemonic or passphrase. if (DOM.phrase.val().length > 0 || DOM.passphrase.val().length > 0) { @@ -332,6 +352,7 @@ showPending(); // Clear existing mnemonic and passphrase DOM.phrase.val(""); + DOM.phraseSplit.val(""); DOM.passphrase.val(""); seed = null; if (rootKeyChangedTimeoutEvent != null) { @@ -371,8 +392,11 @@ 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); @@ -423,8 +447,7 @@ }, 50); } - function useBitpayAddressesChange() { - setBitcoinCashNetworkValues(); + function bitcoinCashAddressTypeChange() { phraseChanged(); } @@ -448,6 +471,17 @@ $("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() { @@ -476,12 +510,101 @@ function calcBip32RootKeyFromSeed(phrase, passphrase) { seed = mnemonic.toSeed(phrase, passphrase); bip32RootKey = bitcoinjs.bitcoin.HDNode.fromSeedHex(seed, network); + if(isGRS()) + bip32RootKey = groestlcoinjs.HDNode.fromSeedHex(seed, network); + } function calcBip32RootKeyFromBase58(rootKeyBase58) { + if(isGRS()) { + calcBip32RootKeyFromBase58GRS(rootKeyBase58); + return; + } + // 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 parsing using p2wsh network params + if ("p2wsh" in n) { + try { + bip32RootKey = bitcoinjs.bitcoin.HDNode.fromBase58(rootKeyBase58, n.p2wsh); + return; + } + catch (e) {} + } + // try parsing using p2wsh-in-p2sh network params + if ("p2wshInP2sh" in n) { + try { + bip32RootKey = bitcoinjs.bitcoin.HDNode.fromBase58(rootKeyBase58, n.p2wshInP2sh); + return; + } + catch (e) {} + } + } + // try the network params as currently specified bip32RootKey = bitcoinjs.bitcoin.HDNode.fromBase58(rootKeyBase58, network); } + function calcBip32RootKeyFromBase58GRS(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 = groestlcoinjs.HDNode.fromBase58(rootKeyBase58, n); + return; + } + catch (e) {} + // try parsing using p2wpkh params + if ("p2wpkh" in n) { + try { + bip32RootKey = groestlcoinjs.HDNode.fromBase58(rootKeyBase58, n.p2wpkh); + return; + } + catch (e) {} + } + // try parsing using p2wpkh-in-p2sh network params + if ("p2wpkhInP2sh" in n) { + try { + bip32RootKey = groestlcoinjs.HDNode.fromBase58(rootKeyBase58, n.p2wpkhInP2sh); + return; + } + catch (e) {} + } + } + // try the network params as currently specified + bip32RootKey = groestlcoinjs.HDNode.fromBase58(rootKeyBase58, network); + } + function calcBip32ExtendedKey(path) { // Check there's a root key to derive from if (!bip32RootKey) { @@ -509,7 +632,7 @@ extendedKey = extendedKey.derive(index); } } - return extendedKey + return extendedKey; } function showValidationError(errorText) { @@ -552,6 +675,56 @@ } function validateRootKey(rootKeyBase58) { + if(isGRS()) + return validateRootKeyGRS(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 parsing using p2wsh network params + if ("p2wsh" in n) { + try { + bitcoinjs.bitcoin.HDNode.fromBase58(rootKeyBase58, n.p2wsh); + return ""; + } + catch (e) {} + } + // try parsing using p2wsh-in-p2sh network params + if ("p2wshInP2sh" in n) { + try { + bitcoinjs.bitcoin.HDNode.fromBase58(rootKeyBase58, n.p2wshInP2sh); + return ""; + } + catch (e) {} + } + } + // try the network params as currently specified try { bitcoinjs.bitcoin.HDNode.fromBase58(rootKeyBase58, network); } @@ -561,6 +734,47 @@ return ""; } + function validateRootKeyGRS(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 { + groestlcoinjs.HDNode.fromBase58(rootKeyBase58, n); + return ""; + } + catch (e) {} + // try parsing using p2wpkh params + if ("p2wpkh" in n) { + try { + groestlcoinjs.HDNode.fromBase58(rootKeyBase58, n.p2wpkh); + return ""; + } + catch (e) {} + } + // try parsing using p2wpkh-in-p2sh network params + if ("p2wpkhInP2sh" in n) { + try { + groestlcoinjs.HDNode.fromBase58(rootKeyBase58, n.p2wpkhInP2sh); + return ""; + } + catch (e) {} + } + } + // try the network params as currently specified + try { + groestlcoinjs.HDNode.fromBase58(rootKeyBase58, network); + } + catch (e) { + return "Invalid root key"; + } + return ""; + } + function getDerivationPath() { if (bip44TabSelected()) { var purpose = parseIntNoNaN(DOM.bip44purpose.val(), 44); @@ -671,6 +885,14 @@ return false; } + function isGRS() { + return networks[DOM.network.val()].name == "GRS - Groestlcoin" || networks[DOM.network.val()].name == "GRS - Groestlcoin Testnet"; + } + + function isELA() { + return networks[DOM.network.val()].name == "ELA - Elastos" + } + function displayBip44Info() { // Get the derivation path for the account var purpose = parseIntNoNaN(DOM.bip44purpose.val(), 44); @@ -684,9 +906,14 @@ var accountExtendedKey = calcBip32ExtendedKey(path); var accountXprv = accountExtendedKey.toBase58(); var accountXpub = accountExtendedKey.neutered().toBase58(); + // Display the extended keys DOM.bip44accountXprv.val(accountXprv); DOM.bip44accountXpub.val(accountXpub); + + if (isELA()) { + displayBip44InfoForELA(); + } } function displayBip49Info() { @@ -742,6 +969,10 @@ clearAddressesList(); var initialAddressCount = parseInt(DOM.rowsToAdd.val()); displayAddresses(0, initialAddressCount); + + if (isELA()) { + displayBip32InfoForELA(); + } } function displayAddresses(start, total) { @@ -779,6 +1010,14 @@ (bip141TabSelected() && DOM.bip141semantics.val() == "p2wpkh-p2sh"); } + function p2wshSelected() { + return bip141TabSelected() && DOM.bip141semantics.val() == "p2wsh"; + } + + function p2wshInP2shSelected() { + return (bip141TabSelected() && DOM.bip141semantics.val() == "p2wsh-p2sh"); + } + function TableRow(index, isLast) { var self = this; @@ -790,6 +1029,8 @@ var segwitAvailable = networkHasSegwit(); var isP2wpkh = p2wpkhSelected(); var isP2wpkhInP2sh = p2wpkhInP2shSelected(); + var isP2wsh = p2wshSelected(); + var isP2wshInP2sh = p2wshInP2shSelected(); function init() { calculateValues(); @@ -813,7 +1054,10 @@ 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 }); + if(isGRS()) + keyPair = new groestlcoinjs.ECPair(keyPair.d, null, { network: network, compressed: false }); + } // get address var address = keyPair.getAddress().toString(); @@ -821,12 +1065,17 @@ 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) { - console.log("Progressed " + p.percent.toFixed(1) + "% for index " + index); - }); + if(isGRS()) + privkey = groestlcoinjsBip38.encrypt(keyPair.d.toBuffer(), false, bip38password, function(p) { + console.log("Progressed " + p.percent.toFixed(1) + "% for index " + index); + }, null, networks[DOM.network.val()].name.includes("Testnet")); + else + privkey = bitcoinjsBip38.encrypt(keyPair.d.toBuffer(), false, bip38password, function(p) { + console.log("Progressed " + p.percent.toFixed(1) + "% for index " + index); + }); } } // get pubkey @@ -836,7 +1085,7 @@ indexText = indexText + "'"; } // Ethereum values are different - if (networks[DOM.network.val()].name == "ETH - Ethereum") { + if (networkIsEthereum()) { var privKeyBuffer = keyPair.d.toBuffer(32); privkey = privKeyBuffer.toString('hex'); var addressBuffer = ethUtil.privateToAddress(privKeyBuffer); @@ -846,11 +1095,55 @@ privkey = ethUtil.addHexPrefix(privkey); pubkey = ethUtil.addHexPrefix(pubkey); } + + // Stellar is different + if (networks[DOM.network.val()].name == "XLM - Stellar") { + var purpose = parseIntNoNaN(DOM.bip44purpose.val(), 44); + var coin = parseIntNoNaN(DOM.bip44coin.val(), 0); + var path = "m/"; + path += purpose + "'/"; + path += coin + "'/" + index + "'"; + var keypair = stellarUtil.getKeypair(path, seed); + indexText = path; + privkey = keypair.secret(); + pubkey = address = keypair.publicKey(); + } + if ((networks[DOM.network.val()].name == "NAS - Nebulas")) { + var NasAccount = require("nebulas-account"); + var privKeyBuffer = keyPair.d.toBuffer(32); + var nebulasAccount = new NasAccount(); + nebulasAccount.setPrivateKey(privKeyBuffer); + address = nebulasAccount.getAddressString(); + privkey = nebulasAccount.getPrivateKeyString(); + pubkey = nebulasAccount.getPublicKeyString(); + } // Ripple values are different if (networks[DOM.network.val()].name == "XRP - Ripple") { privkey = convertRipplePriv(privkey); address = convertRippleAdrr(address); } + // CasinoCoin values are different + if (networks[DOM.network.val()].name == "CSC - CasinoCoin") { + privkey = convertCasinoCoinPriv(privkey); + address = convertCasinoCoinAdrr(address); + } + // Bitcoin Cash address format may vary + if (networks[DOM.network.val()].name == "BCH - Bitcoin Cash") { + var bchAddrType = DOM.bitcoinCashAddressType.filter(":checked").val(); + if (bchAddrType == "cashaddr") { + address = bchaddr.toCashAddress(address); + } + else if (bchAddrType == "bitpay") { + address = bchaddr.toBitpayAddress(address); + } + } + // Bitcoin Cash address format may vary + if (networks[DOM.network.val()].name == "SLP - Simple Ledger Protocol") { + var bchAddrType = DOM.bitcoinCashAddressType.filter(":checked").val(); + if (bchAddrType == "cashaddr") { + address = bchaddr.toSlpAddress(address); + } + } // Segwit addresses are different if (isSegwit) { if (!segwitAvailable) { @@ -868,7 +1161,63 @@ var scriptpubkey = bitcoinjs.bitcoin.script.scriptHash.output.encode(addressbytes); address = bitcoinjs.bitcoin.address.fromOutputScript(scriptpubkey, network) } + else if (isP2wsh) { + // https://github.com/bitcoinjs/bitcoinjs-lib/blob/v3.3.2/test/integration/addresses.js#L71 + // This is a 1-of-1 + var witnessScript = bitcoinjs.bitcoin.script.multisig.output.encode(1, [key.getPublicKeyBuffer()]); + var scriptPubKey = bitcoinjs.bitcoin.script.witnessScriptHash.output.encode(bitcoinjs.bitcoin.crypto.sha256(witnessScript)); + address = bitcoinjs.bitcoin.address.fromOutputScript(scriptPubKey, network); + } + else if (isP2wshInP2sh) { + // https://github.com/bitcoinjs/bitcoinjs-lib/blob/v3.3.2/test/integration/transactions.js#L183 + // This is a 1-of-1 + var witnessScript = bitcoinjs.bitcoin.script.multisig.output.encode(1, [key.getPublicKeyBuffer()]); + var redeemScript = bitcoinjs.bitcoin.script.witnessScriptHash.output.encode(bitcoinjs.bitcoin.crypto.sha256(witnessScript)); + var scriptPubKey = bitcoinjs.bitcoin.script.scriptHash.output.encode(bitcoinjs.bitcoin.crypto.hash160(redeemScript)); + address = bitcoinjs.bitcoin.address.fromOutputScript(scriptPubKey, network) + } + } + + if ((networks[DOM.network.val()].name == "CRW - Crown")) { + address = bitcoinjs.bitcoin.networks.crown.toNewAddress(address); + } + + if (networks[DOM.network.val()].name == "EOS - EOSIO") { + address = "" + pubkey = eosUtil.bufferToPublic(keyPair.getPublicKeyBuffer()); + privkey = eosUtil.bufferToPrivate(keyPair.d.toBuffer(32)); + } + + //Groestlcoin Addresses are different + if(isGRS()) { + + if (isSegwit) { + if (!segwitAvailable) { + return; + } + if (isP2wpkh) { + address = groestlcoinjs.address.fromOutputScript(scriptpubkey, network) + } + else if (isP2wpkhInP2sh) { + address = groestlcoinjs.address.fromOutputScript(scriptpubkey, network) + } + } + //non-segwit addresses are handled by using groestlcoinjs for bip32RootKey } + + if (isELA()) { + let elaAddress = calcAddressForELA( + seed, + parseIntNoNaN(DOM.bip44coin.val(), 0), + parseIntNoNaN(DOM.bip44account.val(), 0), + parseIntNoNaN(DOM.bip44change.val(), 0), + index + ); + address = elaAddress.address; + privkey = elaAddress.privateKey; + pubkey = elaAddress.publicKey; + } + addAddressToList(indexText, address, pubkey, privkey); if (isLast) { hidePending(); @@ -1154,12 +1503,55 @@ function wordArrayToPhrase(words) { var phrase = words.join(" "); var language = getLanguageFromPhrase(phrase); - if (language == "japanese" || language == "korean") { + if (language == "japanese") { phrase = words.join("\u3000"); } return phrase; } + function writeSplitPhrase(phrase) { + var wordCount = phrase.split(/\s/g).length; + var left=[]; + for (var i=0;i0) { + groupI=(groupI+1)%3; + seed = seed * 16807 % 2147483647; + var selected=Math.floor(left.length*(seed - 1) / 2147483646); + group[groupI].push(left[selected]); + left.splice(selected,1); + } + var cards=[phrase.split(/\s/g),phrase.split(/\s/g),phrase.split(/\s/g)]; + for (var i=0;i<3;i++) { + for (var ii=0;ii entropy.binaryStr.length) { + DOM.entropyWeakEntropyOverrideWarning.removeClass("hidden"); + } + else { + DOM.entropyWeakEntropyOverrideWarning.addClass("hidden"); + } + } + else { + // hide warning for weak entropy override + DOM.entropyWeakEntropyOverrideWarning.addClass("hidden"); } // Discard trailing entropy var bitsToUse = Math.floor(bits.length / 32) * 32; @@ -1206,6 +1616,7 @@ var phrase = mnemonic.toMnemonic(entropyArr); // Set the mnemonic in the UI DOM.phrase.val(phrase); + writeSplitPhrase(phrase); // Show the word indexes showWordIndexes(); // Show the checksum @@ -1238,6 +1649,8 @@ console.log(e); } var entropyTypeStr = getEntropyTypeStr(entropy); + DOM.entropyTypeInputs.attr("checked", false); + DOM.entropyTypeInputs.filter("[value='" + entropyTypeStr + "']").attr("checked", true); var wordCount = Math.floor(numberOfBits / 32) * 3; var bitsPerEvent = entropy.bitsPerEvent.toFixed(2); var spacedBinaryStr = addSpacesEveryElevenBits(entropy.binaryStr); @@ -1369,8 +1782,38 @@ return DOM.bip32tab.hasClass("active"); } + function networkIsEthereum() { + var name = networks[DOM.network.val()].name; + return (name == "ETH - Ethereum") + || (name == "ETC - Ethereum Classic") + || (name == "EWT - EnergyWeb") + || (name == "PIRL - Pirl") + || (name == "MIX - MIX") + || (name == "MUSIC - Musicoin") + || (name == "POA - Poa") + || (name == "EXP - Expanse") + || (name == "CLO - Callisto") + || (name == "DXN - DEXON") + || (name == "ELLA - Ellaism") + || (name == "ESN - Ethersocial Network") + || (name == "VET - VeChain") + } + 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() { @@ -1394,6 +1837,8 @@ 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"); } @@ -1401,23 +1846,12 @@ 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"); } - function useBitpayAddresses() { - return !(DOM.useBitpayAddresses.prop("checked")); - } - - function setBitcoinCashNetworkValues() { - if (useBitpayAddresses()) { - network = bitcoinjs.bitcoin.networks.bitcoin; - } - else { - network = bitcoinjs.bitcoin.networks.bitcoinCashBitbpay; - } - } - function adjustNetworkForSegwit() { // If segwit is selected the xpub/xprv prefixes need to be adjusted // to avoid accidentally importing BIP49 xpub to BIP44 watch only @@ -1436,6 +1870,12 @@ else if (p2wpkhInP2shSelected() && "p2wpkhInP2sh" in network) { network = network.p2wpkhInP2sh; } + else if (p2wshSelected() && "p2wsh" in network) { + network = network.p2wsh; + } + else if (p2wshInP2shSelected() && "p2wshInP2sh" in network) { + network = network.p2wshInP2sh; + } } function lastIndexInTable() { @@ -1528,7 +1968,6 @@ var networks = [ { name: "AC - Asiacoin", - segwitAvailable: false, onSelect: function() { network = bitcoinjs.bitcoin.networks.asiacoin; setHdCoin(51); @@ -1536,15 +1975,20 @@ }, { name: "ACC - Adcoin", - segwitAvailable: true, onSelect: function() { network = bitcoinjs.bitcoin.networks.adcoin; setHdCoin(161); }, }, + { + name: "ARYA - Aryacoin", + onSelect: function() { + network = bitcoinjs.bitcoin.networks.aryacoin; + setHdCoin(357); + }, + }, { name: "AUR - Auroracoin", - segwitAvailable: false, onSelect: function() { network = bitcoinjs.bitcoin.networks.auroracoin; setHdCoin(85); @@ -1552,15 +1996,27 @@ }, { name: "AXE - Axe", - segwitAvailable: false, onSelect: function() { network = bitcoinjs.bitcoin.networks.axe; - setHdCoin(0); + setHdCoin(4242); + }, + }, + { + name: "ANON - ANON", + onSelect: function() { + network = bitcoinjs.bitcoin.networks.anon; + setHdCoin(220); + }, + }, + { + name: "BOLI - Bolivarcoin", + onSelect: function() { + network = bitcoinjs.bitcoin.networks.bolivarcoin; + setHdCoin(278); }, }, { name: "BCA - Bitcoin Atom", - segwitAvailable: true, onSelect: function() { network = bitcoinjs.bitcoin.networks.atom; setHdCoin(185); @@ -1568,16 +2024,13 @@ }, { name: "BCH - Bitcoin Cash", - segwitAvailable: false, onSelect: function() { - DOM.useBitpayAddressesContainer.removeClass("hidden"); - setBitcoinCashNetworkValues(); + DOM.bitcoinCashAddressTypeContainer.removeClass("hidden"); setHdCoin(145); }, }, { name: "BEET - Beetlecoin", - segwitAvailable: false, onSelect: function() { network = bitcoinjs.bitcoin.networks.beetlecoin; setHdCoin(800); @@ -1585,7 +2038,6 @@ }, { name: "BELA - Belacoin", - segwitAvailable: false, onSelect: function() { network = bitcoinjs.bitcoin.networks.belacoin; setHdCoin(73); @@ -1593,15 +2045,27 @@ }, { name: "BLK - BlackCoin", - segwitAvailable: false, onSelect: function() { network = bitcoinjs.bitcoin.networks.blackcoin; setHdCoin(10); }, }, + { + name: "BND - Blocknode", + onSelect: function() { + network = bitcoinjs.bitcoin.networks.blocknode; + setHdCoin(2941); + }, + }, + { + name: "tBND - Blocknode Testnet", + onSelect: function() { + network = bitcoinjs.bitcoin.networks.blocknode_testnet; + setHdCoin(1); + }, + }, { name: "BRIT - Britcoin", - segwitAvailable: false, onSelect: function() { network = bitcoinjs.bitcoin.networks.britcoin; setHdCoin(70); @@ -1609,15 +2073,20 @@ }, { name: "BSD - Bitsend", - segwitAvailable: true, onSelect: function() { network = bitcoinjs.bitcoin.networks.bitsend; setHdCoin(91); }, }, + { + name: "BST - BlockStamp", + onSelect: function() { + network = bitcoinjs.bitcoin.networks.blockstamp; + setHdCoin(254); + }, + }, { name: "BTA - Bata", - segwitAvailable: false, onSelect: function() { network = bitcoinjs.bitcoin.networks.bata; setHdCoin(89); @@ -1625,23 +2094,64 @@ }, { name: "BTC - Bitcoin", - segwitAvailable: true, onSelect: function() { network = bitcoinjs.bitcoin.networks.bitcoin; setHdCoin(0); }, }, + { + name: "BTC - Bitcoin RegTest", + onSelect: function() { + network = bitcoinjs.bitcoin.networks.regtest; + // Using hd coin value 1 based on bip44_coin_type + // https://github.com/chaintope/bitcoinrb/blob/f1014406f6b8f9b4edcecedc18df70c80df06f11/lib/bitcoin/chainparams/regtest.yml + setHdCoin(1); + }, + }, { name: "BTC - Bitcoin Testnet", - segwitAvailable: true, onSelect: function() { network = bitcoinjs.bitcoin.networks.testnet; setHdCoin(1); }, }, + { + name: "BITG - Bitcoin Green", + onSelect: function() { + network = bitcoinjs.bitcoin.networks.bitcoingreen; + setHdCoin(222); + }, + }, + { + name: "BTCP - Bitcoin Private", + onSelect: function() { + network = bitcoinjs.bitcoin.networks.bitcoinprivate; + setHdCoin(183); + }, + }, + { + name: "BSV - BitcoinSV", + onSelect: function() { + network = bitcoinjs.bitcoin.networks.bitcoinsv; + setHdCoin(236); + }, + }, + { + name: "BTCZ - Bitcoinz", + onSelect: function() { + network = bitcoinjs.bitcoin.networks.bitcoinz; + setHdCoin(177); + }, + }, + { + name: "BTDX - BitCloud", + onSelect: function() { + network = bitcoinjs.bitcoin.networks.bitcloud; + setHdCoin(218); + }, + }, { name: "BTG - Bitcoin Gold", - segwitAvailable: true, onSelect: function() { network = bitcoinjs.bitcoin.networks.bgold; setHdCoin(156); @@ -1649,7 +2159,6 @@ }, { name: "BTX - Bitcore", - segwitAvailable: true, onSelect: function() { network = bitcoinjs.bitcoin.networks.bitcore; setHdCoin(160); @@ -1657,15 +2166,20 @@ }, { name: "CCN - Cannacoin", - segwitAvailable: false, onSelect: function() { network = bitcoinjs.bitcoin.networks.cannacoin; setHdCoin(19); }, }, + { + name: "CESC - Cryptoescudo", + onSelect: function() { + network = bitcoinjs.bitcoin.networks.cannacoin; + setHdCoin(111); + }, + }, { name: "CDN - Canadaecoin", - segwitAvailable: false, onSelect: function() { network = bitcoinjs.bitcoin.networks.canadaecoin; setHdCoin(34); @@ -1673,15 +2187,21 @@ }, { name: "CLAM - Clams", - segwitAvailable: false, onSelect: function() { network = bitcoinjs.bitcoin.networks.clam; setHdCoin(23); }, }, { - name: "CLUB - Clubcoin", + name: "CLO - Callisto", segwitAvailable: false, + onSelect: function() { + network = bitcoinjs.bitcoin.networks.bitcoin; + setHdCoin(820); + }, + }, + { + name: "CLUB - Clubcoin", onSelect: function() { network = bitcoinjs.bitcoin.networks.clubcoin; setHdCoin(79); @@ -1689,31 +2209,48 @@ }, { name: "CMP - Compcoin", - segwitAvailable: false, onSelect: function() { network = bitcoinjs.bitcoin.networks.compcoin; setHdCoin(71); }, }, + { + name: "CPU - CPUchain", + onSelect: function() { + network = bitcoinjs.bitcoin.networks.cpuchain; + setHdCoin(363); + }, + }, { name: "CRAVE - Crave", - segwitAvailable: false, onSelect: function() { network = bitcoinjs.bitcoin.networks.crave; setHdCoin(186); }, }, + { + name: "CRW - Crown (Legacy)", + onSelect: function() { + network = bitcoinjs.bitcoin.networks.crown; + setHdCoin(72); + }, + }, { name: "CRW - Crown", - segwitAvailable: false, onSelect: function() { network = bitcoinjs.bitcoin.networks.crown; setHdCoin(72); }, }, + { + name: "CSC - CasinoCoin", + onSelect: function() { + network = bitcoinjs.bitcoin.networks.bitcoin; + setHdCoin(359); + }, + }, { name: "DASH - Dash", - segwitAvailable: false, onSelect: function() { network = bitcoinjs.bitcoin.networks.dash; setHdCoin(5); @@ -1721,7 +2258,6 @@ }, { name: "DASH - Dash Testnet", - segwitAvailable: false, onSelect: function() { network = bitcoinjs.bitcoin.networks.dashtn; setHdCoin(1); @@ -1729,7 +2265,6 @@ }, { name: "DFC - Defcoin", - segwitAvailable: false, onSelect: function() { network = bitcoinjs.bitcoin.networks.defcoin; setHdCoin(1337); @@ -1737,7 +2272,6 @@ }, { name: "DGB - Digibyte", - segwitAvailable: true, onSelect: function() { network = bitcoinjs.bitcoin.networks.digibyte; setHdCoin(20); @@ -1745,7 +2279,6 @@ }, { name: "DGC - Digitalcoin", - segwitAvailable: false, onSelect: function() { network = bitcoinjs.bitcoin.networks.digitalcoin; setHdCoin(18); @@ -1753,7 +2286,6 @@ }, { name: "DMD - Diamond", - segwitAvailable: false, onSelect: function() { network = bitcoinjs.bitcoin.networks.diamond; setHdCoin(152); @@ -1761,7 +2293,6 @@ }, { name: "DNR - Denarius", - segwitAvailable: false, onSelect: function() { network = bitcoinjs.bitcoin.networks.denarius; setHdCoin(116); @@ -1769,15 +2300,27 @@ }, { name: "DOGE - Dogecoin", - segwitAvailable: false, onSelect: function() { network = bitcoinjs.bitcoin.networks.dogecoin; setHdCoin(3); }, }, + { + name: "DOGEt - Dogecoin Testnet", + onSelect: function() { + network = bitcoinjs.bitcoin.networks.dogecointestnet; + setHdCoin(1); + }, + }, + { + name: "DXN - DEXON", + onSelect: function() { + network = bitcoinjs.bitcoin.networks.bitcoin; + setHdCoin(237); + }, + }, { name: "ECN - Ecoin", - segwitAvailable: false, onSelect: function() { network = bitcoinjs.bitcoin.networks.ecoin; setHdCoin(115); @@ -1785,7 +2328,6 @@ }, { name: "EDRC - Edrcoin", - segwitAvailable: false, onSelect: function() { network = bitcoinjs.bitcoin.networks.edrcoin; setHdCoin(56); @@ -1793,47 +2335,115 @@ }, { 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: "ELA - Elastos", + onSelect: function () { + network = bitcoinjs.bitcoin.networks.elastos; + setHdCoin(2305); }, }, { - name: "ERC - Europecoin", + name: "ELLA - Ellaism", segwitAvailable: false, onSelect: function() { - network = bitcoinjs.bitcoin.networks.europecoin; - setHdCoin(151); + network = bitcoinjs.bitcoin.networks.bitcoin; + setHdCoin(163); }, }, { - name: "ETH - Ethereum", + name: "EMC2 - Einsteinium", + onSelect: function() { + network = bitcoinjs.bitcoin.networks.einsteinium; + setHdCoin(41); + }, + }, + { + name: "ERC - Europecoin", + onSelect: function() { + network = bitcoinjs.bitcoin.networks.europecoin; + setHdCoin(151); + }, + }, + { + name: "EOS - EOSIO", + onSelect: function() { + network = bitcoinjs.bitcoin.networks.bitcoin; + setHdCoin(194); + }, + }, + { + name: "ESN - Ethersocial Network", segwitAvailable: false, onSelect: function() { network = bitcoinjs.bitcoin.networks.bitcoin; - setHdCoin(60); + setHdCoin(31102); }, }, { - name: "EXCL - Exclusivecoin", + name: "ETC - Ethereum Classic", segwitAvailable: false, + onSelect: function() { + network = bitcoinjs.bitcoin.networks.bitcoin; + setHdCoin(61); + }, + }, + { + name: "ETH - Ethereum", + onSelect: function() { + network = bitcoinjs.bitcoin.networks.bitcoin; + setHdCoin(60); + }, + }, + { + name: "EWT - EnergyWeb", + onSelect: function() { + network = bitcoinjs.bitcoin.networks.bitcoin; + setHdCoin(246); + }, + }, + { + name: "EXCL - Exclusivecoin", onSelect: function() { network = bitcoinjs.bitcoin.networks.exclusivecoin; setHdCoin(190); }, }, + { + name: "EXCC - ExchangeCoin", + onSelect: function() { + network = bitcoinjs.bitcoin.networks.exchangecoin; + setHdCoin(0); + }, + }, + { + name: "EXP - Expanse", + segwitAvailable: false, + onSelect: function() { + network = bitcoinjs.bitcoin.networks.bitcoin; + setHdCoin(40); + }, + }, + { + name: "FIX - FIX", + onSelect: function() { + network = bitcoinjs.bitcoin.networks.fix; + setHdCoin(336); + }, + }, + { + name: "FIX - FIX Testnet", + onSelect: function() { + network = bitcoinjs.bitcoin.networks.fixtestnet; + setHdCoin(1); + }, + }, { name: "FJC - Fujicoin", - segwitAvailable: true, onSelect: function() { network = bitcoinjs.bitcoin.networks.fujicoin; setHdCoin(75); @@ -1841,7 +2451,6 @@ }, { name: "FLASH - Flashcoin", - segwitAvailable: false, onSelect: function() { network = bitcoinjs.bitcoin.networks.flashcoin; setHdCoin(120); @@ -1849,7 +2458,6 @@ }, { name: "FRST - Firstcoin", - segwitAvailable: false, onSelect: function() { network = bitcoinjs.bitcoin.networks.firstcoin; setHdCoin(167); @@ -1857,7 +2465,6 @@ }, { name: "FTC - Feathercoin", - segwitAvailable: true, onSelect: function() { network = bitcoinjs.bitcoin.networks.feathercoin; setHdCoin(8); @@ -1865,7 +2472,6 @@ }, { name: "GAME - GameCredits", - segwitAvailable: false, onSelect: function() { network = bitcoinjs.bitcoin.networks.game; setHdCoin(101); @@ -1873,7 +2479,6 @@ }, { name: "GBX - Gobyte", - segwitAvailable: false, onSelect: function() { network = bitcoinjs.bitcoin.networks.gobyte; setHdCoin(176); @@ -1881,7 +2486,6 @@ }, { name: "GCR - GCRCoin", - segwitAvailable: false, onSelect: function() { network = bitcoinjs.bitcoin.networks.gcr; setHdCoin(79); @@ -1889,23 +2493,48 @@ }, { name: "GRC - Gridcoin", - segwitAvailable: false, onSelect: function() { network = bitcoinjs.bitcoin.networks.gridcoin; setHdCoin(84); }, }, + { + name: "GRS - Groestlcoin", + onSelect: function() { + network = bitcoinjs.bitcoin.networks.groestlcoin; + setHdCoin(17); + }, + }, + { + name: "GRS - Groestlcoin Testnet", + onSelect: function() { + network = bitcoinjs.bitcoin.networks.groestlcointestnet; + setHdCoin(1); + }, + }, { name: "HNC - Helleniccoin", - segwitAvailable: false, onSelect: function() { network = bitcoinjs.bitcoin.networks.helleniccoin; setHdCoin(168); }, }, + { + name: "HUSH - Hush (Legacy)", + onSelect: function() { + network = bitcoinjs.bitcoin.networks.hush; + setHdCoin(197); + }, + }, + { + name: "HUSH - Hush3", + onSelect: function() { + network = bitcoinjs.bitcoin.networks.hush3; + setHdCoin(197); + }, + }, { name: "INSN - Insane", - segwitAvailable: false, onSelect: function() { network = bitcoinjs.bitcoin.networks.insane; setHdCoin(68); @@ -1913,7 +2542,6 @@ }, { name: "IOP - Iop", - segwitAvailable: true, onSelect: function() { network = bitcoinjs.bitcoin.networks.iop; setHdCoin(66); @@ -1921,7 +2549,6 @@ }, { name: "IXC - Ixcoin", - segwitAvailable: false, onSelect: function() { network = bitcoinjs.bitcoin.networks.ixcoin; setHdCoin(86); @@ -1929,7 +2556,6 @@ }, { name: "JBS - Jumbucks", - segwitAvailable: false, onSelect: function() { network = bitcoinjs.bitcoin.networks.jumbucks; setHdCoin(26); @@ -1943,9 +2569,16 @@ setHdCoin(141); }, }, + { + name: "KOBO - Kobocoin", + bip49available: false, + onSelect: function() { + network = bitcoinjs.bitcoin.networks.kobocoin; + setHdCoin(196); + }, + }, { name: "LBC - Library Credits", - segwitAvailable: false, onSelect: function() { network = bitcoinjs.bitcoin.networks.lbry; setHdCoin(140); @@ -1953,7 +2586,6 @@ }, { name: "LCC - Litecoincash", - segwitAvailable: true, onSelect: function() { network = bitcoinjs.bitcoin.networks.litecoincash; setHdCoin(192); @@ -1961,7 +2593,6 @@ }, { name: "LDCN - Landcoin", - segwitAvailable: false, onSelect: function() { network = bitcoinjs.bitcoin.networks.landcoin; setHdCoin(63); @@ -1969,24 +2600,44 @@ }, { name: "LINX - Linx", - segwitAvailable: false, onSelect: function() { network = bitcoinjs.bitcoin.networks.linx; setHdCoin(114); }, }, + { + name: "LKR - Lkrcoin", + segwitAvailable: false, + onSelect: function() { + network = bitcoinjs.bitcoin.networks.lkrcoin; + setHdCoin(557); + }, + }, { name: "LTC - Litecoin", - segwitAvailable: true, onSelect: function() { network = bitcoinjs.bitcoin.networks.litecoin; setHdCoin(2); DOM.litecoinLtubContainer.removeClass("hidden"); }, }, + { + name: "LTCt - Litecoin Testnet", + onSelect: function() { + network = bitcoinjs.bitcoin.networks.litecointestnet; + setHdCoin(1); + DOM.litecoinLtubContainer.removeClass("hidden"); + }, + }, + { + name: "LTZ - LitecoinZ", + onSelect: function() { + network = bitcoinjs.bitcoin.networks.litecoinz; + setHdCoin(221); + }, + }, { name: "LYNX - Lynx", - segwitAvailable: false, onSelect: function() { network = bitcoinjs.bitcoin.networks.lynx; setHdCoin(191); @@ -1994,15 +2645,28 @@ }, { name: "MAZA - Maza", - segwitAvailable: false, onSelect: function() { network = bitcoinjs.bitcoin.networks.maza; setHdCoin(13); }, }, + { + name: "MEC - Megacoin", + onSelect: function() { + network = bitcoinjs.bitcoin.networks.megacoin; + setHdCoin(217); + }, + }, + { + 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); @@ -2010,23 +2674,42 @@ }, { name: "MONA - Monacoin", - segwitAvailable: true, onSelect: function() { network = bitcoinjs.bitcoin.networks.monacoin, setHdCoin(22); }, }, + { + name: "MONK - Monkey Project", + onSelect: function() { + network = bitcoinjs.bitcoin.networks.monkeyproject, + setHdCoin(214); + }, + }, + { + 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: "NAS - Nebulas", + onSelect: function() { + network = bitcoinjs.bitcoin.networks.bitcoin; + setHdCoin(2718); + }, + }, { name: "NEBL - Neblio", - segwitAvailable: false, onSelect: function() { network = bitcoinjs.bitcoin.networks.neblio; setHdCoin(146); @@ -2034,15 +2717,20 @@ }, { name: "NEOS - Neoscoin", - segwitAvailable: false, onSelect: function() { network = bitcoinjs.bitcoin.networks.neoscoin; setHdCoin(25); }, }, + { + name: "NIX - NIX Platform", + onSelect: function() { + network = bitcoinjs.bitcoin.networks.nix; + setHdCoin(400); + }, + }, { name: "NLG - Gulden", - segwitAvailable: false, onSelect: function() { network = bitcoinjs.bitcoin.networks.gulden; setHdCoin(87); @@ -2050,15 +2738,20 @@ }, { name: "NMC - Namecoin", - segwitAvailable: false, onSelect: function() { network = bitcoinjs.bitcoin.networks.namecoin; setHdCoin(7); }, }, + { + name: "NRG - Energi", + onSelect: function() { + network = bitcoinjs.bitcoin.networks.energi; + setHdCoin(204); + }, + }, { name: "NRO - Neurocoin", - segwitAvailable: false, onSelect: function() { network = bitcoinjs.bitcoin.networks.neurocoin; setHdCoin(110); @@ -2066,7 +2759,6 @@ }, { name: "NSR - Nushares", - segwitAvailable: false, onSelect: function() { network = bitcoinjs.bitcoin.networks.nushares; setHdCoin(11); @@ -2074,7 +2766,6 @@ }, { name: "NYC - Newyorkc", - segwitAvailable: false, onSelect: function() { network = bitcoinjs.bitcoin.networks.newyorkc; setHdCoin(179); @@ -2082,7 +2773,6 @@ }, { name: "NVC - Novacoin", - segwitAvailable: false, onSelect: function() { network = bitcoinjs.bitcoin.networks.novacoin; setHdCoin(50); @@ -2090,7 +2780,6 @@ }, { name: "OK - Okcash", - segwitAvailable: false, onSelect: function() { network = bitcoinjs.bitcoin.networks.okcash; setHdCoin(69); @@ -2098,31 +2787,49 @@ }, { name: "OMNI - Omnicore", - segwitAvailable: true, onSelect: function() { network = bitcoinjs.bitcoin.networks.omnicore; setHdCoin(200); }, }, + { + name: "ONION - DeepOnion", + onSelect: function() { + network = bitcoinjs.bitcoin.networks.deeponion; + setHdCoin(305); + }, + }, { name: "ONX - Onixcoin", - segwitAvailable: false, onSelect: function() { network = bitcoinjs.bitcoin.networks.onixcoin; setHdCoin(174); }, }, + { + name: "PHR - Phore", + onSelect: function() { + network = bitcoinjs.bitcoin.networks.phore; + setHdCoin(444); + }, + }, { name: "PINK - Pinkcoin", - segwitAvailable: false, onSelect: function() { network = bitcoinjs.bitcoin.networks.pinkcoin; setHdCoin(117); }, }, { - name: "PIVX - PIVX", + name: "PIRL - Pirl", segwitAvailable: false, + onSelect: function() { + network = bitcoinjs.bitcoin.networks.bitcoin; + setHdCoin(164); + }, + }, + { + name: "PIVX - PIVX", onSelect: function() { network = bitcoinjs.bitcoin.networks.pivx; setHdCoin(119); @@ -2130,15 +2837,21 @@ }, { name: "PIVX - PIVX Testnet", - segwitAvailable: false, onSelect: function() { network = bitcoinjs.bitcoin.networks.pivxtestnet; setHdCoin(1); }, }, { - name: "POSW - POSWcoin", + name: "POA - Poa", segwitAvailable: false, + onSelect: function() { + network = bitcoinjs.bitcoin.networks.bitcoin; + setHdCoin(178); + }, + }, + { + name: "POSW - POSWcoin", onSelect: function() { network = bitcoinjs.bitcoin.networks.poswcoin; setHdCoin(47); @@ -2146,7 +2859,6 @@ }, { name: "POT - Potcoin", - segwitAvailable: false, onSelect: function() { network = bitcoinjs.bitcoin.networks.potcoin; setHdCoin(81); @@ -2154,15 +2866,20 @@ }, { name: "PPC - Peercoin", - segwitAvailable: false, onSelect: function() { network = bitcoinjs.bitcoin.networks.peercoin; setHdCoin(6); }, }, + { + name: "PRJ - ProjectCoin", + onSelect: function() { + network = bitcoinjs.bitcoin.networks.projectcoin; + setHdCoin(533); + }, + }, { name: "PSB - Pesobit", - segwitAvailable: false, onSelect: function() { network = bitcoinjs.bitcoin.networks.pesobit; setHdCoin(62); @@ -2170,15 +2887,27 @@ }, { name: "PUT - Putincoin", - segwitAvailable: false, onSelect: function() { network = bitcoinjs.bitcoin.networks.putincoin; setHdCoin(122); }, }, + { + name: "RPD - Rapids", + onSelect: function() { + network = bitcoinjs.bitcoin.networks.rapids; + setHdCoin(320); + }, + }, + { + name: "RVN - Ravencoin", + onSelect: function() { + network = bitcoinjs.bitcoin.networks.ravencoin; + setHdCoin(175); + }, + }, { name: "RBY - Rubycoin", - segwitAvailable: false, onSelect: function() { network = bitcoinjs.bitcoin.networks.rubycoin; setHdCoin(16); @@ -2186,23 +2915,34 @@ }, { 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: "SAFE - Safecoin", + onSelect: function() { + network = bitcoinjs.bitcoin.networks.safecoin; + setHdCoin(19165); + }, + }, + { + name: "SLS - Salus", + onSelect: function() { + network = bitcoinjs.bitcoin.networks.salus; + setHdCoin(63); + }, + }, { name: "SDC - ShadowCash", - segwitAvailable: false, onSelect: function() { network = bitcoinjs.bitcoin.networks.shadow; setHdCoin(35); @@ -2210,7 +2950,6 @@ }, { name: "SDC - ShadowCash Testnet", - segwitAvailable: false, onSelect: function() { network = bitcoinjs.bitcoin.networks.shadowtn; setHdCoin(1); @@ -2218,7 +2957,6 @@ }, { name: "SLM - Slimcoin", - segwitAvailable: false, onSelect: function() { network = bitcoinjs.bitcoin.networks.slimcoin; setHdCoin(63); @@ -2226,15 +2964,20 @@ }, { name: "SLM - Slimcoin Testnet", - segwitAvailable: false, onSelect: function() { network = bitcoinjs.bitcoin.networks.slimcointn; setHdCoin(111); }, }, + { + name: "SLP - Simple Ledger Protocol", + onSelect: function() { + DOM.bitcoinCashAddressTypeContainer.removeClass("hidden"); + setHdCoin(245); + }, + }, { name: "SLR - Solarcoin", - segwitAvailable: false, onSelect: function() { network = bitcoinjs.bitcoin.networks.solarcoin; setHdCoin(58); @@ -2242,23 +2985,41 @@ }, { name: "SMLY - Smileycoin", - segwitAvailable: false, onSelect: function() { network = bitcoinjs.bitcoin.networks.smileycoin; setHdCoin(59); }, }, + { + name: "STASH - Stash", + onSelect: function() { + network = bitcoinjs.bitcoin.networks.stash; + setHdCoin(0xC0C0); + }, + }, + { + name: "STASH - Stash Testnet", + onSelect: function() { + network = bitcoinjs.bitcoin.networks.stashtn; + setHdCoin(0xCAFE); + }, + }, { name: "STRAT - Stratis", - segwitAvailable: false, onSelect: function() { network = bitcoinjs.bitcoin.networks.stratis; setHdCoin(105); }, }, + { + name: "TSTRAT - Stratis Testnet", + onSelect: function() { + network = bitcoinjs.bitcoin.networks.stratistest; + setHdCoin(105); + }, + }, { name: "SYS - Syscoin", - segwitAvailable: true, onSelect: function() { network = bitcoinjs.bitcoin.networks.syscoin; setHdCoin(57); @@ -2266,23 +3027,41 @@ }, { name: "THC - Hempcoin", - segwitAvailable: false, onSelect: function() { network = bitcoinjs.bitcoin.networks.hempcoin; setHdCoin(113); }, }, + { + name: "THT - Thought", + onSelect: function() { + network = bitcoinjs.bitcoin.networks.thought; + setHdCoin(1618); + }, + }, { name: "TOA - Toa", - segwitAvailable: false, onSelect: function() { network = bitcoinjs.bitcoin.networks.toa; setHdCoin(159); }, }, + { + name: "TWINS - TWINS", + onSelect: function() { + network = bitcoinjs.bitcoin.networks.twins; + setHdCoin(970); + }, + }, + { + name: "TWINS - TWINS Testnet", + onSelect: function() { + network = bitcoinjs.bitcoin.networks.twinstestnet; + setHdCoin(1); + }, + }, { name: "USC - Ultimatesecurecash", - segwitAvailable: false, onSelect: function() { network = bitcoinjs.bitcoin.networks.ultimatesecurecash; setHdCoin(112); @@ -2290,7 +3069,6 @@ }, { name: "USNBT - NuBits", - segwitAvailable: false, onSelect: function() { network = bitcoinjs.bitcoin.networks.nubits; setHdCoin(12); @@ -2298,7 +3076,6 @@ }, { name: "UNO - Unobtanium", - segwitAvailable: false, onSelect: function() { network = bitcoinjs.bitcoin.networks.unobtanium; setHdCoin(92); @@ -2306,15 +3083,20 @@ }, { name: "VASH - Vpncoin", - segwitAvailable: false, onSelect: function() { network = bitcoinjs.bitcoin.networks.vpncoin; setHdCoin(33); }, }, + { + name: "VET - VeChain", + onSelect: function() { + network = bitcoinjs.bitcoin.networks.bitcoin; + setHdCoin(818); + }, + }, { name: "VIA - Viacoin", - segwitAvailable: false, onSelect: function() { network = bitcoinjs.bitcoin.networks.viacoin; setHdCoin(14); @@ -2322,7 +3104,6 @@ }, { name: "VIA - Viacoin Testnet", - segwitAvailable: false, onSelect: function() { network = bitcoinjs.bitcoin.networks.viacointestnet; setHdCoin(1); @@ -2330,7 +3111,6 @@ }, { name: "VIVO - Vivo", - segwitAvailable: false, onSelect: function() { network = bitcoinjs.bitcoin.networks.vivo; setHdCoin(166); @@ -2338,31 +3118,48 @@ }, { name: "VTC - Vertcoin", - segwitAvailable: false, onSelect: function() { network = bitcoinjs.bitcoin.networks.vertcoin; setHdCoin(28); }, }, + { + name: "WGR - Wagerr", + onSelect: function() { + network = bitcoinjs.bitcoin.networks.wagerr; + setHdCoin(7825266); + }, + }, { name: "WC - Wincoin", - segwitAvailable: false, onSelect: function() { network = bitcoinjs.bitcoin.networks.wincoin; setHdCoin(181); }, }, + { + name: "XAX - Artax", + onSelect: function() { + network = bitcoinjs.bitcoin.networks.artax; + setHdCoin(219); + }, + }, { name: "XBC - Bitcoinplus", - segwitAvailable: false, onSelect: function() { network = bitcoinjs.bitcoin.networks.bitcoinplus; setHdCoin(65); }, }, + { + name: "XLM - Stellar", + onSelect: function() { + network = stellarUtil.dummyNetwork; + setHdCoin(148); + }, + }, { name: "XMY - Myriadcoin", - segwitAvailable: false, onSelect: function() { network = bitcoinjs.bitcoin.networks.myriadcoin; setHdCoin(90); @@ -2370,7 +3167,6 @@ }, { name: "XRP - Ripple", - segwitAvailable: false, onSelect: function() { network = bitcoinjs.bitcoin.networks.bitcoin; setHdCoin(144); @@ -2378,7 +3174,6 @@ }, { name: "XVC - Vcash", - segwitAvailable: false, onSelect: function() { network = bitcoinjs.bitcoin.networks.vcash; setHdCoin(127); @@ -2386,15 +3181,21 @@ }, { name: "XVG - Verge", - segwitAvailable: false, onSelect: function() { network = bitcoinjs.bitcoin.networks.verge; setHdCoin(77); }, }, { - name: "XWC - Whitecoin", + name: "XUEZ - Xuez", segwitAvailable: false, + onSelect: function() { + network = bitcoinjs.bitcoin.networks.xuez; + setHdCoin(225); + }, + }, + { + name: "XWC - Whitecoin", onSelect: function() { network = bitcoinjs.bitcoin.networks.whitecoin; setHdCoin(155); @@ -2402,12 +3203,32 @@ }, { name: "XZC - Zcoin", - segwitAvailable: true, onSelect: function() { network = bitcoinjs.bitcoin.networks.zcoin; setHdCoin(136); }, }, + { + name: "ZCL - Zclassic", + onSelect: function() { + network = bitcoinjs.bitcoin.networks.zclassic; + setHdCoin(147); + }, + }, + { + name: "ZEC - Zcash", + onSelect: function() { + network = bitcoinjs.bitcoin.networks.zcash; + setHdCoin(133); + }, + }, + { + name: "ZEN - Horizen", + onSelect: function() { + network = bitcoinjs.bitcoin.networks.zencash; + setHdCoin(121); + }, + }, ] var clients = [ @@ -2431,9 +3252,66 @@ 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); + }, } ] + // ELA - Elastos functions - begin + function displayBip44InfoForELA() { + if (!isELA()) { + return; + } + + var coin = parseIntNoNaN(DOM.bip44coin.val(), 0); + var account = parseIntNoNaN(DOM.bip44account.val(), 0); + + // Calculate the account extended keys + var accountXprv = elastosjs.getAccountExtendedPrivateKey(seed, coin, account); + var accountXpub = elastosjs.getAccountExtendedPublicKey(seed, coin, account); + + // Display the extended keys + DOM.bip44accountXprv.val(accountXprv); + DOM.bip44accountXpub.val(accountXpub); + } + + function displayBip32InfoForELA() { + if (!isELA()) { + return; + } + + var coin = parseIntNoNaN(DOM.bip44coin.val(), 0); + var account = parseIntNoNaN(DOM.bip44account.val(), 0); + var change = parseIntNoNaN(DOM.bip44change.val(), 0); + + DOM.extendedPrivKey.val(elastosjs.getBip32ExtendedPrivateKey(seed, coin, account, change)); + DOM.extendedPubKey.val(elastosjs.getBip32ExtendedPublicKey(seed, coin, account, change)); + + // Display the addresses and privkeys + clearAddressesList(); + var initialAddressCount = parseInt(DOM.rowsToAdd.val()); + displayAddresses(0, initialAddressCount); + } + + function calcAddressForELA(seed, coin, account, change, index) { + if (!isELA()) { + return; + } + + var publicKey = elastosjs.getDerivedPublicKey(elastosjs.getMasterPublicKey(seed), change, index); + return { + privateKey: elastosjs.getDerivedPrivateKey(seed, coin, account, change, index), + publicKey: publicKey, + address: elastosjs.getAddress(publicKey.toString('hex')) + }; + } + // ELA - Elastos functions - end + init(); })();