From: iancoleman <1281387+iancoleman@users.noreply.github.com> Date: Sun, 10 Nov 2019 22:47:35 +0000 (+1100) Subject: Merge pull request #368 from johnnynanjiang/elastos-pr X-Git-Url: https://git.immae.eu/?p=perso%2FImmae%2FProjets%2FCryptomonnaies%2FBIP39.git;a=commitdiff_plain;h=c7a092db32f161fe3f205493dafc54bd02627f84;hp=-c Merge pull request #368 from johnnynanjiang/elastos-pr Add Elastos --- c7a092db32f161fe3f205493dafc54bd02627f84 diff --combined src/index.html index bfb2bc1,c0b5847..2684c9f --- a/src/index.html +++ b/src/index.html @@@ -172,13 -172,6 +172,13 @@@ +
+ +
+ +
+
+
@@@ -930,6 -923,9 +930,9 @@@ + + + @@@ -952,7 -948,5 +955,5 @@@ - - diff --combined src/js/index.js index dc10d59,52fb3ff..9ace962 --- a/src/js/index.js +++ b/src/js/index.js @@@ -44,8 -44,6 +44,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"); @@@ -234,14 -232,7 +234,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() { @@@ -306,7 -297,6 +306,7 @@@ clearDisplay(); clearEntropyFeedback(); DOM.phrase.val(""); + DOM.phraseSplit.val(""); showValidationError("Blank entropy"); return; } @@@ -341,7 -331,6 +341,7 @@@ showPending(); // Clear existing mnemonic and passphrase DOM.phrase.val(""); + DOM.phraseSplit.val(""); DOM.passphrase.val(""); seed = null; if (rootKeyChangedTimeoutEvent != null) { @@@ -428,7 -417,6 +428,7 @@@ if (DOM.phrase.val().length > 0) { var newPhrase = convertPhraseToNewLanguage(); DOM.phrase.val(newPhrase); + writeSplitPhrase(newPhrase); phraseChanged(); } else { @@@ -489,7 -477,6 +489,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); @@@ -607,7 -594,7 +607,7 @@@ extendedKey = extendedKey.derive(index); } } - return extendedKey + return extendedKey; } function showValidationError(errorText) { @@@ -650,9 -637,9 +650,9 @@@ } function validateRootKey(rootKeyBase58) { - if(isGRS()) + if(isGRS()) return validateRootKeyGRS(rootKeyBase58); - + // try various segwit network params since this extended key may be from // any one of them. if (networkHasSegwit()) { @@@ -848,6 -835,10 +848,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); @@@ -861,9 -852,14 +865,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() { @@@ -919,6 -915,10 +928,10 @@@ clearAddressesList(); var initialAddressCount = parseInt(DOM.rowsToAdd.val()); displayAddresses(0, initialAddressCount); + + if (isELA()) { + displayBip32InfoForELA(); + } } function displayAddresses(start, total) { @@@ -1004,7 -1004,7 +1017,7 @@@ privkey = keyPair.toWIF(); // BIP38 encode private key if required if (useBip38) { - if(isGRS()) + 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")); @@@ -1023,7 -1023,6 +1036,7 @@@ // 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 == "EWT - EnergyWeb") || (networks[DOM.network.val()].name == "PIRL - Pirl") || (networks[DOM.network.val()].name == "MIX - MIX") || (networks[DOM.network.val()].name == "MUSIC - Musicoin") @@@ -1135,10 -1134,23 +1148,23 @@@ 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(); @@@ -1429,40 -1441,6 +1455,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