From: iancoleman <1281387+iancoleman@users.noreply.github.com> Date: Sun, 10 Nov 2019 22:56:10 +0000 (+1100) Subject: Merge branch 'master' into master X-Git-Url: https://git.immae.eu/?p=perso%2FImmae%2FProjets%2FCryptomonnaies%2FBIP39.git;a=commitdiff_plain;h=b9b3eaf670bcec0a2431055494987e70addd37ef;hp=-c Merge branch 'master' into master --- b9b3eaf670bcec0a2431055494987e70addd37ef diff --combined src/index.html index 6714a9f,096274d..b669add --- a/src/index.html +++ b/src/index.html @@@ -15,7 -15,7 +15,7 @@@

Mnemonic Code Converter

-

v0.3.12

+

v0.3.13


@@@ -172,6 -172,13 +172,13 @@@
+
+ +
+ +
+
+
@@@ -273,7 -280,10 +280,10 @@@ External / Internal
- +
+ + Default +
@@@ -923,6 -933,9 +933,9 @@@ + + + @@@ -945,7 -958,5 +958,5 @@@ - - diff --combined src/js/bitcoinjs-extensions.js index 255ac86,b6d2de6..4536783 --- a/src/js/bitcoinjs-extensions.js +++ b/src/js/bitcoinjs-extensions.js @@@ -1717,13 -1717,13 +1717,24 @@@ bitcoinjs.bitcoin.networks.aryacoin = wif: 0x97 }; +bitcoinjs.bitcoin.networks.thought = { + messagePrefix: 'unused', + bip32: { + public: 0xFbC6A00D, + private: 0x5AEBD8C6 + }, + pubKeyHash: 0x07, + scriptHash: 0x09, + wif: 0x7B +}; ++ + bitcoinjs.bitcoin.networks.elastos = { + messagePrefix: 'unused', + bip32: { + public: 0x0488B21E, + private: 0x0488ADE4, + }, + pubKeyHash: 0x21, + scriptHash: 0xc4, // TODO set this correctly, same as BTC for now + wif: 0xef // TODO set this correctly, same as BTC for now + }; diff --combined src/js/index.js index 0ecb735,23eaa47..9807449 --- a/src/js/index.js +++ b/src/js/index.js @@@ -15,6 -15,7 +15,7 @@@ var showPrivKey = true; var showQr = false; var litecoinUseLtub = true; + var isDefaultBip44ChangeValue = true; var entropyChangeTimeoutEvent = null; var phraseChangeTimeoutEvent = null; @@@ -44,6 -45,8 +45,8 @@@ DOM.entropyWeakEntropyOverrideWarning = DOM.entropyContainer.find(".weak-entropy-override-warning"); DOM.entropyFilterWarning = DOM.entropyContainer.find(".filter-warning"); DOM.phrase = $(".phrase"); + DOM.splitPhrase = $(".phraseSplit"); + DOM.phraseSplitWarn = $(".phraseSplitWarn"); DOM.passphrase = $(".passphrase"); DOM.generateContainer = $(".generate-container"); DOM.generate = $(".generate"); @@@ -69,6 -72,7 +72,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"); @@@ -134,7 -138,9 +138,9 @@@ 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); @@@ -232,7 -238,14 +238,14 @@@ 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); + } + }, 400); } function phraseChanged() { @@@ -297,6 -310,7 +310,7 @@@ clearDisplay(); clearEntropyFeedback(); DOM.phrase.val(""); + DOM.phraseSplit.val(""); showValidationError("Blank entropy"); return; } @@@ -331,6 -345,7 +345,7 @@@ showPending(); // Clear existing mnemonic and passphrase DOM.phrase.val(""); + DOM.phraseSplit.val(""); DOM.passphrase.val(""); seed = null; if (rootKeyChangedTimeoutEvent != null) { @@@ -417,6 -432,7 +432,7 @@@ if (DOM.phrase.val().length > 0) { var newPhrase = convertPhraseToNewLanguage(); DOM.phrase.val(newPhrase); + writeSplitPhrase(newPhrase); phraseChanged(); } else { @@@ -477,6 -493,7 +493,7 @@@ // show the words var words = mnemonic.toMnemonic(data); DOM.phrase.val(words); + writeSplitPhrase(words); // show the entropy var entropyHex = uint8ArrayToHex(data); DOM.entropy.val(entropyHex); @@@ -594,7 -611,7 +611,7 @@@ extendedKey = extendedKey.derive(index); } } - return extendedKey + return extendedKey; } function showValidationError(errorText) { @@@ -726,12 -743,14 +743,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); @@@ -835,6 -854,10 +854,10 @@@ 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); @@@ -848,9 -871,14 +871,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() { @@@ -906,6 -934,10 +934,10 @@@ clearAddressesList(); var initialAddressCount = parseInt(DOM.rowsToAdd.val()); displayAddresses(0, initialAddressCount); + + if (isELA()) { + displayBip32InfoForELA(); + } } function displayAddresses(start, total) { @@@ -1008,19 -1040,7 +1040,7 @@@ indexText = indexText + "'"; } // Ethereum values are different - 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") - || (networks[DOM.network.val()].name == "DXN - DEXON") - || (networks[DOM.network.val()].name == "ELLA - Ellaism") - || (networks[DOM.network.val()].name == "ESN - Ethersocial Network") - || (networks[DOM.network.val()].name == "VET - VeChain") - ) { + if (networkIsEthereum()) { var privKeyBuffer = keyPair.d.toBuffer(32); privkey = privKeyBuffer.toString('hex'); var addressBuffer = ethUtil.privateToAddress(privKeyBuffer); @@@ -1125,6 -1145,19 +1145,19 @@@ //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(); @@@ -1415,6 -1448,40 +1448,40 @@@ } return phrase; } + + function writeSplitPhrase(phrase) { + var wordCount = phrase.split(/\s/g).length; //get number of words in phrase + var left=[]; //initialize array of indexs + for (var i=0;i0) { //while indexs left + groupI=(groupI+1)%3; //get next group to insert index into + seed = seed * 16807 % 2147483647; //change random value.(simple predicatable random number generator works well for this use) + var selected=Math.floor(left.length*(seed - 1) / 2147483646); //get index in left we will use for this group + group[groupI].push(left[selected]); //add index to group + left.splice(selected,1); //remove selected index + } + var cards=[phrase.split(/\s/g),phrase.split(/\s/g),phrase.split(/\s/g)];//make array of cards + for (var i=0;i<3;i++) { //go through each card + for (var ii=0;ii