X-Git-Url: https://git.immae.eu/?p=perso%2FImmae%2FProjets%2FCryptomonnaies%2FBIP39.git;a=blobdiff_plain;f=src%2Fjs%2Findex.js;h=68c74f6912f0ac7d97940d5d611ffd30384ced55;hp=cb60941b1bca39f98a7f87e91fce2cecfe125a95;hb=83b2f0f10e950c7a05717bbe20ecc4367557abb6;hpb=30e3d246d494158b93550df5e70bcabc5f26f7c3 diff --git a/src/js/index.js b/src/js/index.js index cb60941..68c74f6 100644 --- a/src/js/index.js +++ b/src/js/index.js @@ -15,6 +15,7 @@ var showPrivKey = true; var showQr = false; var litecoinUseLtub = true; + var isDefaultBip44ChangeValue = true; var entropyTypeAutoDetect = true; var entropyChangeTimeoutEvent = null; @@ -47,6 +48,8 @@ DOM.entropyWeakEntropyOverrideWarning = DOM.entropyContainer.find(".weak-entropy-override-warning"); DOM.entropyFilterWarning = DOM.entropyContainer.find(".filter-warning"); DOM.phrase = $(".phrase"); + DOM.splitMnemonic = $(".splitMnemonic"); + DOM.showSplitMnemonic = $(".showSplitMnemonic"); DOM.phraseSplit = $(".phraseSplit"); DOM.phraseSplitWarn = $(".phraseSplitWarn"); DOM.passphrase = $(".passphrase"); @@ -74,6 +77,7 @@ DOM.bip44accountXprv = $("#bip44 .account-xprv"); DOM.bip44accountXpub = $("#bip44 .account-xpub"); DOM.bip44change = $("#bip44 .change"); + DOM.defaultBip44ChangeValue = $("#bip44 .default-bip44-change-value"); DOM.bip49unavailable = $("#bip49 .unavailable"); DOM.bip49available = $("#bip49 .available"); DOM.bip49path = $("#bip49-path"); @@ -92,6 +96,18 @@ DOM.bip84accountXprv = $("#bip84 .account-xprv"); DOM.bip84accountXpub = $("#bip84 .account-xpub"); DOM.bip84change = $("#bip84 .change"); + DOM.bip85 = $('.bip85'); + DOM.showBip85 = $('.showBip85'); + DOM.bip85Field = $('.bip85Field'); + DOM.bip85application = $('#bip85-application'); + DOM.bip85mnemonicLanguage = $('#bip85-mnemonic-language'); + DOM.bip85mnemonicLanguageInput = $('.bip85-mnemonic-language-input'); + DOM.bip85mnemonicLength = $('#bip85-mnemonic-length'); + DOM.bip85mnemonicLengthInput = $('.bip85-mnemonic-length-input'); + DOM.bip85index = $('#bip85-index'); + DOM.bip85indexInput = $('.bip85-index-input'); + DOM.bip85bytes = $('#bip85-bytes'); + DOM.bip85bytesInput = $('.bip85-bytes-input'); DOM.bip141unavailable = $("#bip141 .unavailable"); DOM.bip141available = $("#bip141 .available"); DOM.bip141path = $("#bip141-path"); @@ -133,19 +149,28 @@ DOM.entropyMnemonicLength.on("change", entropyChanged); DOM.entropyTypeInputs.on("change", entropyTypeChanged); DOM.phrase.on("input", delayedPhraseChanged); + DOM.showSplitMnemonic.on("change", toggleSplitMnemonic); DOM.passphrase.on("input", delayedPhraseChanged); DOM.generate.on("click", generateClicked); DOM.more.on("click", showMore); DOM.seed.on("input", delayedSeedChanged); DOM.rootKey.on("input", delayedRootKeyChanged); + DOM.showBip85.on('change', toggleBip85); DOM.litecoinUseLtub.on("change", litecoinUseLtubChanged); DOM.bip32path.on("input", calcForDerivationPath); DOM.bip44account.on("input", calcForDerivationPath); + DOM.bip44change.on("input", modifiedDefaultBip44ChangeValue); DOM.bip44change.on("input", calcForDerivationPath); + DOM.defaultBip44ChangeValue.on("click", resetDefaultBip44ChangeValue); DOM.bip49account.on("input", calcForDerivationPath); DOM.bip49change.on("input", calcForDerivationPath); DOM.bip84account.on("input", calcForDerivationPath); DOM.bip84change.on("input", calcForDerivationPath); + DOM.bip85application.on('input', calcBip85); + DOM.bip85mnemonicLanguage.on('change', calcBip85); + DOM.bip85mnemonicLength.on('change', calcBip85); + DOM.bip85index.on('input', calcBip85); + DOM.bip85bytes.on('input', calcBip85); DOM.bip141path.on("input", calcForDerivationPath); DOM.bip141semantics.on("change", tabChanged); DOM.tab.on("shown.bs.tab", tabChanged); @@ -265,6 +290,7 @@ var passphrase = DOM.passphrase.val(); calcBip32RootKeyFromSeed(phrase, passphrase); calcForDerivationPath(); + calcBip85(); // Show the word indexes showWordIndexes(); writeSplitPhrase(phrase); @@ -401,6 +427,7 @@ } // Calculate and display calcForDerivationPath(); + calcBip85(); } function rootKeyChanged() { @@ -415,6 +442,7 @@ // Calculate and display calcBip32RootKeyFromBase58(rootKeyBase58); calcForDerivationPath(); + calcBip85(); } function litecoinUseLtubChanged() { @@ -428,6 +456,84 @@ phraseChanged(); } + function toggleSplitMnemonic() { + if (DOM.showSplitMnemonic.prop("checked")) { + DOM.splitMnemonic.removeClass("hidden"); + } + else { + DOM.splitMnemonic.addClass("hidden"); + } + } + + function toggleBip85() { + if (DOM.showBip85.prop('checked')) { + DOM.bip85.removeClass('hidden'); + calcBip85(); + } else { + DOM.bip85.addClass('hidden'); + } + } + + function toggleBip85Fields() { + if (DOM.showBip85.prop('checked')) { + DOM.bip85mnemonicLanguageInput.addClass('hidden'); + DOM.bip85mnemonicLengthInput.addClass('hidden'); + DOM.bip85bytesInput.addClass('hidden'); + + var app = DOM.bip85application.val(); + if (app === 'bip39') { + DOM.bip85mnemonicLanguageInput.removeClass('hidden'); + DOM.bip85mnemonicLengthInput.removeClass('hidden'); + } else if (app === 'hex') { + DOM.bip85bytesInput.removeClass('hidden'); + } + } + } + + function calcBip85() { + if (!DOM.showBip85.prop('checked')) { + return + } + + toggleBip85Fields(); + + var app = DOM.bip85application.val(); + + var phrase = DOM.phrase.val(); + var passphrase = DOM.passphrase.val(); + if (!phrase) { + return; + } + try { + var master = libs.bip85.BIP85.fromMnemonic(phrase, passphrase); + + var result; + + const index = parseInt(DOM.bip85index.val(), 10); + + if (app === 'bip39') { + const language = parseInt(DOM.bip85mnemonicLanguage.val(), 10); + const length = parseInt(DOM.bip85mnemonicLength.val(), 10); + + result = master.deriveBIP39(language, length, index).toMnemonic(); + } else if (app === 'wif') { + result = master.deriveWIF(index).toWIF(); + } else if (app === 'xprv') { + result = master.deriveXPRV(index).toXPRV(); + } else if (app === 'hex') { + const bytes = parseInt(DOM.bip85bytes.val(), 10); + + result = master.deriveHex(bytes, index).toEntropy(); + } + + hideValidationError(); + DOM.bip85Field.val(result); + } catch (e) { + showValidationError('BIP85: ' + e.message); + DOM.bip85Field.val(''); + } + } + function calcForDerivationPath() { clearDerivedKeys(); clearAddressesList(); @@ -822,12 +928,14 @@ var purpose = parseIntNoNaN(DOM.bip44purpose.val(), 44); var coin = parseIntNoNaN(DOM.bip44coin.val(), 0); var account = parseIntNoNaN(DOM.bip44account.val(), 0); - var change = parseIntNoNaN(DOM.bip44change.val(), 0); - var path = "m/"; - path += purpose + "'/"; - path += coin + "'/"; - path += account + "'/"; - path += change; + var change = parseIntNoNaN(DOM.bip44change.val(), ""); + var path = "m"; + path += "/" + purpose + "'"; + path += "/" + coin + "'"; + path += "/" + account + "'"; + if (change !== "") { + path += "/" + change; + } DOM.bip44path.val(path); var derivationPath = DOM.bip44path.val(); console.log("Using derivation path from BIP44 tab: " + derivationPath); @@ -1136,7 +1244,7 @@ address = libs.ethUtil.addHexPrefix(checksumAddress); pubkey = libs.ethUtil.addHexPrefix(pubkey); if (hasPrivkey) { - privkey = libs.ethUtil.bufferToHex(keyPair.d.toBuffer()); + privkey = libs.ethUtil.bufferToHex(keyPair.d.toBuffer(32)); } } //TRX is different @@ -1246,6 +1354,27 @@ address = libs.bchaddrSlp.toSlpAddress(address); } } + + // ZooBC address format may vary + if (networks[DOM.network.val()].name == "ZBC - ZooBlockchain") { + + var purpose = parseIntNoNaN(DOM.bip44purpose.val(), 44); + var coin = parseIntNoNaN(DOM.bip44coin.val(), 0); + var path = "m/"; + path += purpose + "'/"; + path += coin + "'/" + index + "'"; + var result = libs.zoobcUtil.getKeypair(path, seed); + + let publicKey = result.pubKey.slice(1, 33); + let privateKey = result.key; + + privkey = privateKey.toString('hex'); + pubkey = publicKey.toString('hex'); + + indexText = path; + address = libs.zoobcUtil.getZBCAddress(publicKey, 'ZBC'); + } + // Segwit addresses are different if (isSegwit) { if (!segwitAvailable) { @@ -1296,6 +1425,12 @@ privkey = FIObufferToPrivate(keyPair.d.toBuffer(32)); } + if (networks[DOM.network.val()].name == "ATOM - Cosmos Hub") { + address = CosmosBufferToAddress(keyPair.getPublicKeyBuffer()); + pubkey = CosmosBufferToPublic(keyPair.getPublicKeyBuffer()); + privkey = keyPair.d.toBuffer().toString("base64"); + } + //Groestlcoin Addresses are different if(isGRS()) { @@ -1945,10 +2080,30 @@ return DOM.bip141tab.hasClass("active"); } + function setBip44ChangeValue() { + if (isDefaultBip44ChangeValue) { + if (networkIsEthereum()) { + DOM.bip44change.val(""); + } else { + DOM.bip44change.val(0); + } + } + } + + function modifiedDefaultBip44ChangeValue() { + isDefaultBip44ChangeValue = false; + } + + function resetDefaultBip44ChangeValue() { + isDefaultBip44ChangeValue = true; + setBip44ChangeValue(); + } + function setHdCoin(coinValue) { DOM.bip44coin.val(coinValue); DOM.bip49coin.val(coinValue); DOM.bip84coin.val(coinValue); + setBip44ChangeValue(); } function showSegwitAvailable() { @@ -2111,6 +2266,13 @@ setHdCoin(357); }, }, + { + name: "ATOM - Cosmos Hub", + onSelect: function() { + network = libs.bitcoin.networks.bitcoin; + setHdCoin(118); + }, + }, { name: "AUR - Auroracoin", onSelect: function() { @@ -2581,7 +2743,14 @@ network = libs.bitcoin.networks.bitcoin; setHdCoin(235); }, - }, + }, + { + name: "FIRO - Firo (Zcoin rebrand)", + onSelect: function() { + network = libs.bitcoin.networks.firo; + setHdCoin(136); + }, + }, { name: "FIX - FIX", onSelect: function() { @@ -3109,6 +3278,13 @@ setHdCoin(4); }, }, + { + name: "RITO - Ritocoin", + onSelect: function() { + network = libs.bitcoin.networks.ritocoin; + setHdCoin(19169); + }, + }, { name: "RVR - RevolutionVR", onSelect: function() { @@ -3425,12 +3601,19 @@ }, }, { - name: "XZC - Zcoin", + name: "XZC - Zcoin (rebranded to Firo)", onSelect: function() { network = libs.bitcoin.networks.zcoin; setHdCoin(136); }, }, + { + name: "ZBC - ZooBlockchain", + onSelect: function () { + network = libs.bitcoin.networks.zoobc; + setHdCoin(883); + }, + }, { name: "ZCL - Zclassic", onSelect: function() {