Compare commits

..

43 Commits
0.5.2 ... 0.5.4

Author SHA1 Message Date
Ian Coleman
e2fdc5b942 Release v0.5.4 2021-10-08 15:10:31 +11:00
Ian Coleman
450b0a571a Fix coin name in divi tests 2021-10-08 14:46:39 +11:00
iancoleman
5c4382c3c1 Merge pull request #525 from secinthenet/add-tests-lockfile
tests: add jasmine dep and missing lockfile
2021-10-08 14:18:49 +11:00
iancoleman
c3c7cebfe4 Merge pull request #522 from secinthenet/fix-seed-only-coin-switch2
fix "blank mnemonic" errors when using only seed
2021-10-08 14:17:01 +11:00
iancoleman
58d84449f4 Merge pull request #521 from 7h3v01c3/master
Added Divi
2021-10-08 14:15:04 +11:00
iancoleman
9303d0e078 Merge pull request #510 from Macha-orange/PBKDF2
Add PBKDF2 customization
2021-10-08 14:03:20 +11:00
iancoleman
bd1f1706fe Merge pull request #508 from Macha-orange/master
Add "auto compute" check box
2021-10-08 13:53:32 +11:00
iancoleman
8d119065f0 Merge pull request #506 from tecnovert/master
Add Particl support
2021-10-08 13:50:31 +11:00
Sylvia G
45a8e2a218 test: verify BROWSER is valid 2021-10-07 10:45:02 +03:00
Sylvia G
d035063dcc test: add npm lockfile 2021-10-07 10:44:38 +03:00
Sylvia G
26d2c54381 test: add jasmine to deps 2021-10-07 10:44:19 +03:00
Sylvia G
ecbc254ba3 fix test command to use jasmine 2021-10-07 10:44:06 +03:00
Sylvia G
874b6d4e08 fix "blank mnemonic" errors when using only seed
This is a follow up to #486 which was reverted because of a failed test which should now pass
2021-10-02 20:57:05 +03:00
TheVoice
1fa3f997a2 Merge pull request #1 from 7h3v01c3/Divi
Added Divi
2021-09-26 23:15:11 -05:00
TheVoice
4cf9de3202 Added Divi
Add Divi to
BIP39 - Mnemonic Code
And Tested
2021-09-26 22:38:53 -05:00
Macha-orange
c04d31f82f Add PBKDF2 customization
- Add a "PBKDF2 rounds" button inside "Show Entropy Details" with values : 2048, 4096, 8192, 16384, 32768, custom.
- Add hidden button for custom iterations. Accept number.
- Add a Warning message above BIP39 seed when using anything other than 2048 PBKDF2 iterations.
- Add a "PBKDF2" section in the bottom for detail.
2021-07-28 19:33:41 +02:00
Macha-orange
530a9f6047 Typo 2021-07-17 12:47:37 +02:00
Macha-orange
126af2bee3 Add "auto compute" check box
When checked, nothing change.

When unchecked, disable phraseChangeTimeoutEvent() so there is no update. Also, add an error message "Auto compute is disabled" so after changing phrase/passephrase and parameters, you are reminded to check "auto compute" to compute your seed.

I added this because on very low end computer (raspberry pi) the computing is quite annoying and you have to wait for each change.

When you add a custom words, seed is computed every 400ms so you have to copy/paste it to not be stuck after each letter.

And if you encrypt your private key with BIP38 it become unusable.

Autocompute is by default checked so there is no change for other users.
2021-07-17 12:38:47 +02:00
tecnovert
c7e1af7300 Add Particl support 2021-06-24 23:16:11 +02:00
Ian Coleman
c4f0c2908f Release v0.5.3 2021-05-12 07:57:39 +10:00
Ian Coleman
941b099f14 Revert PR #486 2021-05-10 14:08:16 +10:00
iancoleman
83f23081a3 Merge pull request #485 from secinthenet/fix-zpub-from-seed
fix extended key version bytes not updating after switching tabs
2021-05-07 19:13:28 +10:00
iancoleman
1dab87d842 Merge pull request #496 from thisisvitto/patch-1
Incorrect HTML closing tag
2021-05-07 09:52:55 +10:00
iancoleman
83c580c678 Merge pull request #492 from HildisviniOttar/master
Support THORChain (RUNE) m/44/931
2021-05-07 09:51:38 +10:00
iancoleman
8b44f5d19a Merge branch 'master' into master 2021-05-07 09:51:28 +10:00
iancoleman
a7705b8ebc Merge pull request #484 from secinthenet/bip85-fix-from-ent
fix bip85 mode to work without mnemonic (using xprv or entropy)
2021-05-07 09:39:45 +10:00
iancoleman
f2081ee467 Merge pull request #486 from secinthenet/fix-seed-only-coin-switch
fix "blank mnemonic" error when only using a BIP39 seed (no mnemonic phrase) and then changing the coin
2021-05-07 09:34:41 +10:00
iancoleman
f50464249c Merge pull request #482 from interbiznw/btcp
add bitcoin private testnet support
2021-05-07 09:28:51 +10:00
iancoleman
ed720546bf Merge pull request #480 from xwcdev/master
Change xwc to xwcc according to slip-0044 and add xwc
2021-05-07 09:26:47 +10:00
iancoleman
e8f27ba2c3 Merge pull request #479 from a00a63/terra
Add Terra (LUNA) support
2021-05-07 09:24:28 +10:00
iancoleman
be946a2061 Merge branch 'master' into terra 2021-05-07 09:24:18 +10:00
iancoleman
a636b24619 Merge pull request #475 from davepuchyr/starname-iov
Add Starname (IOV) support
2021-05-07 09:17:46 +10:00
Vitto K
f8fd590588 Incorrect HTML closing tag
Fixed incorrect HTML closing tag, made it difficult to expand/collapse code folds correctly in text editors.
2021-05-01 21:52:50 +02:00
Hildisvíni Óttar
02eeb81713 Support THORChain (RUNE) m/44/931 2021-04-23 14:22:42 +09:30
Sylvia G
18d64d9586 fix bip85 root key when using non-xprv version bytes 2021-04-06 04:32:20 +03:00
Sylvia G
5b5b11fd96 fix "blank mnemonic" error when only using a BIP39 seed (no mnemonic phrase) and then changing the coin 2021-04-06 03:55:40 +03:00
Sylvia G
2c86fb4746 fix extended key version bytes not updating after switching tabs 2021-04-06 03:35:24 +03:00
Sylvia G
85711db3bb fix bip85 mode to work without mnemonic (using xprv or entropy) 2021-04-06 03:18:04 +03:00
J62
1820b6ac67 add bitcoin private testnet support 2021-03-29 19:46:51 -07:00
xwcdev
b500a60e28 fix test title 2021-03-28 19:13:33 +08:00
xwcdev
942de1bc5e change xwc to xwcc,add new xwc 2021-03-28 18:54:12 +08:00
a00a63
43bef4e19d Add Terra (LUNA) support 2021-03-27 14:04:07 +01:00
Dave Puchyr
20bd34b014 Add Starname (IOV) support 2021-02-25 15:51:45 +01:00
10 changed files with 892 additions and 32 deletions

View File

@@ -1,3 +1,22 @@
# 0.5.4
* Add Particl network
* Add Divi network
* Add option to turn autocompute on / off
* Add option to set custom number of pbkdf2 rounds
* Fix blank mnemonic errors when using only seed
# 0.5.3
Add Starname network
Add Terra network
Add Bitcoin Private network
Add Thorchain network
Change Xwc network to Xwcc and add new Xwc
Fix Bip85 works without mnemonic (using xprv)
Fix extended key not updating when switching tabs
Fix incorrect html closing tag
# 0.5.2
* Show ethereum private keys with correct padding

View File

@@ -15,7 +15,7 @@
<div class="container">
<h1 class="text-center">Mnemonic Code Converter</h1>
<p class="version">v0.5.2</p>
<p class="version">v0.5.4</p>
<hr>
<div class="row">
<div class="col-md-12">
@@ -119,6 +119,18 @@
</span>
</p>
</div>
<label class="col-sm-3 control-label">PBKDF2 rounds</label>
<div class="col-sm-9">
<select class="pbkdf2-rounds form-control" style="width: 60%;float: left;">
<option value="2048" selected>2048 <span>(compatibility)</span></option>
<option value="4096">4096 <span>iterations</span></option>
<option value="8192">8192 <span>iterations</span></option>
<option value="16384">16384 <span>iterations</span></option>
<option value="32768">32768 <span>iterations</span></option>
<option value="custom">Custom <span>iterations</span></option>
</select>
<input type="number" class="form-control hidden" id="pbkdf2-custom-input" value="1" min="1" pattern="[0-9]" style="float: right;width: 40%;">
</div>
</div>
<div class="col-sm-3">
<p>Valid entropy values include:</p>
@@ -181,6 +193,15 @@
</label>
</div>
</div>
<div class="form-group">
<div class="col-sm-2"></div>
<div class="col-sm-10 checkbox">
<label>
<input type="checkbox" class="autoCompute" checked>
<span>Auto compute</span>
</label>
</div>
</div>
<div class="form-group">
<label class="col-sm-2 control-label">Mnemonic Language</label>
<div class="col-sm-10 languages">
@@ -198,6 +219,13 @@
</div>
</div>
</div>
<div class="form-group text-danger PBKDF2-infos-danger hidden">
<label class="col-sm-2 control-label">Warning</label>
<div class="col-sm-10 form-control-static">
<span>You are using a custom number of PBKDF2 iterations. Your BIP39 seed may not show same addresses on a different software.</span>
<a href="#PBKDF2-notes">Read more</a>
</div>
</div>
<div class="form-group">
<label for="phrase" class="col-sm-2 control-label">BIP39 Mnemonic</label>
<div class="col-sm-10">
@@ -286,7 +314,7 @@
for more information.
</p>
</div>
</p>
</div>
<label for="bip85-application" class="col-sm-2 control-label">BIP85 Application</label>
<div class="col-sm-10">
<select id="bip85-application" class="form-control">
@@ -964,6 +992,12 @@
</a>
</span>
</p>
<h3 id="PBKDF2-notes">PBKDF2</h3>
<p><a href="https://learnmeabitcoin.com/technical/mnemonic#pbkdf2---password-based-key-derivation-function-2 " target="_blank">What is PBKDF2 (Password Based Key Derivation Function 2) ?</a></p>
<p><span>Please refer to this <a href="https://en.wikipedia.org/wiki/PBKDF2" target="_blank">wikipedia article</a> for more detail.
<span>Mail about PBKDF2 security <a href="https://lists.linuxfoundation.org/pipermail/bitcoin-dev/2016-July/012902.html" target="_blank">here</a>.</p>
<p>Wallet software that implement BIP39 only use 2048 iterations as a norm. Increasing this parameter will increase security against brute force attack, but you will need to store this new parameter. However, as long as you back up your BIP39 seed there will not be risk to lost your fund. To access them with custom PBKDF2 iterations, use this file (or <a href="https://stuff.birkenstab.de/pbkdf2/" target="_blank">other</a>) to compute your targeted BIP39 seed.</p>
<p>Using less than 2048 PBKDF2 iterations is insecure without strong optional BIP39 Passphrase.</p>
<h3>License</h3>
<p>
<span>Please refer to <a href="https://github.com/iancoleman/bip39/blob/master/LICENSE" target="_blank">the software license</a> for more detail.
@@ -1104,6 +1138,7 @@
<script src="js/cosmos-util.js"></script>
<script src="js/eos-util.js"></script>
<script src="js/fio-util.js"></script>
<script src="js/xwc-util.js"></script>
<script src="js/sjcl-bip39.js"></script>
<script src="js/wordlist_english.js"></script>
<script src="js/wordlist_japanese.js"></script>

View File

@@ -691,6 +691,28 @@ libs.bitcoin.networks.digitalcoin = {
wif: 0x9e,
};
libs.bitcoin.networks.divi = {
messagePrefix: '\x19Divi Signed Message:\n',
bip32: {
public: 0x022d2533,
private: 0x0221312b,
},
pubKeyHash: 0x1e,
scriptHash: 0x0d,
wif: 0xd4,
};
libs.bitcoin.networks.divitestnet = {
messagePrefix: '\x19Divi Signed Message:\n',
bip32: {
public: 0x3a8061a0,
private: 0x3a805837,
},
pubKeyHash: 0x8b,
scriptHash: 0x13,
wif: 0xef,
};
libs.bitcoin.networks.ecoin = {
messagePrefix: '\x18eCoin Signed Message:\n',
bip32: {
@@ -1531,6 +1553,17 @@ libs.bitcoin.networks.bitcoinprivate = {
wif: 0x80,
};
libs.bitcoin.networks.bitcoinprivatetestnet = {
messagePrefix: '\x18BitcoinPrivate Signed Message:\n',
bip32: {
public: 0x043587CF,
private: 0x04358394,
},
pubKeyHash: 0x1957,
scriptHash: 0x19E0,
wif: 0xEF,
};
libs.bitcoin.networks.bitcoinz = {
messagePrefix: '\x18BitcoinZ Signed Message:\n',
bip32: {
@@ -1865,3 +1898,15 @@ libs.bitcoin.networks.argoneum = {
scriptHash: 0x61,
wif: 0xbf
};
libs.bitcoin.networks.particl = {
messagePrefix: '\x18Bitcoin Signed Message:\n',
bech32: 'pw',
bip32: {
public: 0x696e82d1,
private: 0x8f1daeb8,
},
pubKeyHash: 0x38,
scriptHash: 0x3c,
wif: 0x6c,
};

View File

@@ -1,13 +1,13 @@
function CosmosBufferToPublic(pubBuf) {
function CosmosBufferToPublic(pubBuf, hrp = "cosmos") {
const Buffer = libs.buffer.Buffer;
const AminoSecp256k1PubkeyPrefix = Buffer.from("EB5AE987", "hex");
const AminoSecp256k1PubkeyLength = Buffer.from("21", "hex");
pubBuf = Buffer.concat([AminoSecp256k1PubkeyPrefix, AminoSecp256k1PubkeyLength, pubBuf]);
return libs.bech32.encode("cosmospub", libs.bech32.toWords(pubBuf));
return libs.bech32.encode(`${hrp}pub`, libs.bech32.toWords(pubBuf));
}
function CosmosBufferToAddress(pubBuf) {
function CosmosBufferToAddress(pubBuf, hrp = "cosmos") {
const sha256_ed = libs.createHash("sha256").update(pubBuf).digest();
const ripemd160_ed = libs.createHash("rmd160").update(sha256_ed).digest();
return libs.bech32.encode("cosmos", libs.bech32.toWords(ripemd160_ed));
return libs.bech32.encode(hrp, libs.bech32.toWords(ripemd160_ed));
}

View File

@@ -44,9 +44,13 @@
DOM.entropyWordIndexes = DOM.entropyContainer.find(".word-indexes");
DOM.entropyChecksum = DOM.entropyContainer.find(".checksum");
DOM.entropyMnemonicLength = DOM.entropyContainer.find(".mnemonic-length");
DOM.pbkdf2Rounds = DOM.entropyContainer.find(".pbkdf2-rounds");
DOM.pbkdf2CustomInput = DOM.entropyContainer.find("#pbkdf2-custom-input");
DOM.pbkdf2InfosDanger = $(".PBKDF2-infos-danger");
DOM.entropyWeakEntropyOverrideWarning = DOM.entropyContainer.find(".weak-entropy-override-warning");
DOM.entropyFilterWarning = DOM.entropyContainer.find(".filter-warning");
DOM.phrase = $(".phrase");
DOM.autoCompute = $(".autoCompute");
DOM.splitMnemonic = $(".splitMnemonic");
DOM.showSplitMnemonic = $(".showSplitMnemonic");
DOM.phraseSplit = $(".phraseSplit");
@@ -143,8 +147,11 @@
DOM.network.on("change", networkChanged);
DOM.bip32Client.on("change", bip32ClientChanged);
DOM.useEntropy.on("change", setEntropyVisibility);
DOM.autoCompute.on("change", delayedPhraseChanged);
DOM.entropy.on("input", delayedEntropyChanged);
DOM.entropyMnemonicLength.on("change", entropyChanged);
DOM.pbkdf2Rounds.on("change", pbkdf2RoundsChanged);
DOM.pbkdf2CustomInput.on("change", pbkdf2RoundsChanged);
DOM.entropyTypeInputs.on("change", entropyTypeChanged);
DOM.phrase.on("input", delayedPhraseChanged);
DOM.showSplitMnemonic.on("change", toggleSplitMnemonic);
@@ -210,7 +217,7 @@
network.onSelect();
adjustNetworkForSegwit();
if (seed != null) {
phraseChanged();
seedChanged()
}
else {
rootKeyChanged();
@@ -225,15 +232,14 @@
else {
DOM.bip32path.prop("readonly", true);
clients[clientIndex].onSelect();
if (seed != null) {
phraseChanged();
}
else {
rootKeyChanged();
}
rootKeyChanged();
}
}
function isUsingAutoCompute() {
return DOM.autoCompute.prop("checked");
}
function setEntropyVisibility() {
if (isUsingOwnEntropy()) {
DOM.entropyContainer.removeClass("hidden");
@@ -251,6 +257,8 @@
}
function delayedPhraseChanged() {
if(isUsingAutoCompute()) {
hideValidationError();
seed = null;
bip32RootKey = null;
@@ -270,6 +278,11 @@
entropyTypeAutoDetect = false;
}
}, 400);
} else {
clearDisplay();
clearEntropyFeedback();
showValidationError("Auto compute is disabled");
}
}
function phraseChanged() {
@@ -296,6 +309,7 @@
showPending();
adjustNetworkForSegwit();
var phrase = DOM.phrase.val();
var seed = DOM.seed.val();
if (phrase != "") {
// Calculate and display for mnemonic
var errorText = findPhraseErrors(phrase);
@@ -307,6 +321,11 @@
var passphrase = DOM.passphrase.val();
calcBip32RootKeyFromSeed(phrase, passphrase);
}
else if (seed != "") {
bip32RootKey = libs.bitcoin.HDNode.fromSeedHex(seed, network);
var rootKeyBase58 = bip32RootKey.toBase58();
DOM.rootKey.val(rootKeyBase58);
}
else {
// Calculate and display for root key
var rootKeyBase58 = DOM.rootKey.val();
@@ -330,6 +349,24 @@
entropyChangeTimeoutEvent = setTimeout(entropyChanged, 400);
}
function pbkdf2RoundsChanged() {
if (DOM.pbkdf2Rounds.val() == "custom") {
PBKDF2_ROUNDS = DOM.pbkdf2CustomInput.val();
DOM.pbkdf2CustomInput.removeClass("hidden");
} else {
PBKDF2_ROUNDS = DOM.pbkdf2Rounds.val();
DOM.pbkdf2CustomInput.addClass("hidden");
}
ispbkdf2Rounds2048();
phraseChanged();
}
function ispbkdf2Rounds2048() {
if (PBKDF2_ROUNDS == 2048) {
DOM.pbkdf2InfosDanger.addClass("hidden");
} else {
DOM.pbkdf2InfosDanger.removeClass("hidden");
}
}
function entropyChanged() {
// If blank entropy, clear mnemonic, addresses, errors
if (DOM.entropy.val().trim().length == 0) {
@@ -449,7 +486,9 @@
else {
network = libs.bitcoin.networks.litecoinXprv;
}
phraseChanged();
// Can't use rootKeyChanged because validation will fail as we changed
// the network but the version bytes stayed as previously.
seedChanged();
}
function toggleSplitMnemonic() {
@@ -495,13 +534,16 @@
var app = DOM.bip85application.val();
var phrase = DOM.phrase.val();
var passphrase = DOM.passphrase.val();
if (!phrase) {
var rootKeyBase58 = DOM.rootKey.val();
if (!rootKeyBase58) {
return;
}
try {
var master = libs.bip85.BIP85.fromMnemonic(phrase, passphrase);
// try parsing using base network params
// The bip85 lib only understands xpubs, so compute it
var rootKey = libs.bitcoin.HDNode.fromBase58(rootKeyBase58, network);
rootKey.keyPair.network = libs.bitcoin.networks['bitcoin']
var master = libs.bip85.BIP85.fromBase58(rootKey.toBase58());
var result;
@@ -592,7 +634,7 @@
}
function bitcoinCashAddressTypeChange() {
phraseChanged();
rootKeyChanged();
}
function toggleIndexes() {
@@ -1350,21 +1392,21 @@
}
// ZooBC address format may vary
if (networks[DOM.network.val()].name == "ZBC - ZooBlockchain") {
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');
}
@@ -1420,12 +1462,40 @@
}
if (networks[DOM.network.val()].name == "ATOM - Cosmos Hub") {
address = CosmosBufferToAddress(keyPair.getPublicKeyBuffer());
pubkey = CosmosBufferToPublic(keyPair.getPublicKeyBuffer());
const hrp = "cosmos";
address = CosmosBufferToAddress(keyPair.getPublicKeyBuffer(), hrp);
pubkey = CosmosBufferToPublic(keyPair.getPublicKeyBuffer(), hrp);
privkey = keyPair.d.toBuffer().toString("base64");
}
//Groestlcoin Addresses are different
if (networks[DOM.network.val()].name == "RUNE - THORChain") {
const hrp = "thor";
address = CosmosBufferToAddress(keyPair.getPublicKeyBuffer(), hrp);
pubkey = keyPair.getPublicKeyBuffer().toString("hex");
privkey = keyPair.d.toBuffer().toString("hex");
}
if (networks[DOM.network.val()].name == "XWC - Whitecoin"){
address = XWCbufferToAddress(keyPair.getPublicKeyBuffer());
pubkey = XWCbufferToPublic(keyPair.getPublicKeyBuffer());
privkey = XWCbufferToPrivate(keyPair.d.toBuffer(32));
}
if (networks[DOM.network.val()].name == "LUNA - Terra") {
const hrp = "terra";
address = CosmosBufferToAddress(keyPair.getPublicKeyBuffer(), hrp);
pubkey = keyPair.getPublicKeyBuffer().toString("hex");
privkey = keyPair.d.toBuffer().toString("hex");
}
if (networks[DOM.network.val()].name == "IOV - Starname") {
const hrp = "star";
address = CosmosBufferToAddress(keyPair.getPublicKeyBuffer(), hrp);
pubkey = CosmosBufferToPublic(keyPair.getPublicKeyBuffer(), hrp);
privkey = keyPair.d.toBuffer().toString("base64");
}
//Groestlcoin Addresses are different
if(isGRS()) {
if (isSegwit) {
@@ -2389,6 +2459,13 @@
setHdCoin(183);
},
},
{
name: "BTCPt - Bitcoin Private Testnet",
onSelect: function() {
network = libs.bitcoin.networks.bitcoinprivatetestnet;
setHdCoin(1);
},
},
{
name: "BSC - Binance Smart Chain",
onSelect: function() {
@@ -2559,6 +2636,20 @@
setHdCoin(18);
},
},
{
name: "DIVI - DIVI",
onSelect: function() {
network = libs.bitcoin.networks.divi;
setHdCoin(301);
},
},
{
name: "DIVI - DIVI Testnet",
onSelect: function() {
network = libs.bitcoin.networks.divitestnet;
setHdCoin(1);
},
},
{
name: "DMD - Diamond",
onSelect: function() {
@@ -2851,6 +2942,13 @@
},
},
{
name: "IOV - Starname",
onSelect: function() {
network = libs.bitcoin.networks.bitcoin;
setHdCoin(234);
},
},
{
name: "IXC - Ixcoin",
onSelect: function() {
network = libs.bitcoin.networks.ixcoin;
@@ -2939,6 +3037,13 @@
setHdCoin(221);
},
},
{
name: "LUNA - Terra",
onSelect: function() {
network = libs.bitcoin.networks.bitcoin;
setHdCoin(330);
},
},
{
name: "LYNX - Lynx",
onSelect: function() {
@@ -3124,6 +3229,13 @@
setHdCoin(174);
},
},
{
name: "PART - Particl",
onSelect: function() {
network = libs.bitcoin.networks.particl;
setHdCoin(44);
},
},
{
name: "PHR - Phore",
onSelect: function() {
@@ -3259,6 +3371,13 @@
setHdCoin(19169);
},
},
{
name: "RUNE - THORChain",
onSelect: function() {
network = libs.bitcoin.networks.bitcoin;
setHdCoin(931);
},
},
{
name: "RVR - RevolutionVR",
onSelect: function() {
@@ -3568,7 +3687,7 @@
},
},
{
name: "XWC - Whitecoin",
name: "XWCC - Whitecoin Classic",
onSelect: function() {
network = libs.bitcoin.networks.whitecoin;
setHdCoin(155);
@@ -3609,6 +3728,13 @@
setHdCoin(121);
},
},
{
name: "XWC - Whitecoin",
onSelect: function() {
network = libs.bitcoin.networks.bitcoin;
setHdCoin(559);
},
}
]
var clients = [

View File

@@ -28,7 +28,9 @@
var Mnemonic = function(language) {
var PBKDF2_ROUNDS = 2048;
var DOM = {};
DOM.entropyContainer = $(".entropy-container");
PBKDF2_ROUNDS = DOM.entropyContainer.find(".pbkdf2-rounds").val();
var RADIX = 2048;
var self = this;

28
src/js/xwc-util.js Normal file
View File

@@ -0,0 +1,28 @@
function XWCbufferToAddress(pubBuf){
const Buffer = libs.buffer.Buffer;
const XWC_ADDRESS_PREFIX = "XWC";
const XWC_NORMAL_ADDRESS_VERSION = "35"
let addrData = libs.createHash("rmd160").update( libs.createHash("sha512").update(pubBuf).digest()).digest();
let addrBuf = Buffer.concat([Buffer.from(XWC_NORMAL_ADDRESS_VERSION, "hex") ,addrData])
let checksum = libs.createHash("rmd160").update(addrBuf).digest("hex").slice(0, 8);
addrBuf = Buffer.concat([addrBuf, Buffer.from(checksum, "hex")]);
return XWC_ADDRESS_PREFIX.concat(libs.bs58.encode(addrBuf));
}
function XWCbufferToPublic(pubBuf) {
const Buffer = libs.buffer.Buffer;
const XWC_PUBLIC_PREFIX = "XWC";
let checksum = libs.createHash("rmd160").update(pubBuf).digest("hex").slice(0, 8);
pubBuf = Buffer.concat([pubBuf, Buffer.from(checksum, "hex")]);
return XWC_PUBLIC_PREFIX.concat(libs.bs58.encode(pubBuf));
}
function XWCbufferToPrivate(privBuf) {
const Buffer = libs.buffer.Buffer;
const XWC_PRIVATE_PREFIX = "80";
privBuf = Buffer.concat([Buffer.from(XWC_PRIVATE_PREFIX, "hex"), privBuf]);
let tmp = libs.createHash("sha256").update(privBuf).digest();
let checksum = libs.createHash("sha256").update(tmp).digest("hex").slice(0, 8);
privBuf = Buffer.concat([privBuf, Buffer.from(checksum, "hex")]);
return libs.bs58.encode(privBuf);
}

501
tests/package-lock.json generated Normal file
View File

@@ -0,0 +1,501 @@
{
"name": "tests",
"version": "1.0.0",
"lockfileVersion": 2,
"requires": true,
"packages": {
"": {
"name": "tests",
"version": "1.0.0",
"license": "MIT",
"dependencies": {
"jasmine": "^3.9.0",
"selenium-webdriver": "^3.6.0"
}
},
"node_modules/balanced-match": {
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz",
"integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw=="
},
"node_modules/brace-expansion": {
"version": "1.1.11",
"resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz",
"integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==",
"dependencies": {
"balanced-match": "^1.0.0",
"concat-map": "0.0.1"
}
},
"node_modules/concat-map": {
"version": "0.0.1",
"resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz",
"integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s="
},
"node_modules/core-util-is": {
"version": "1.0.3",
"resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz",
"integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ=="
},
"node_modules/fs.realpath": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz",
"integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8="
},
"node_modules/glob": {
"version": "7.2.0",
"resolved": "https://registry.npmjs.org/glob/-/glob-7.2.0.tgz",
"integrity": "sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q==",
"dependencies": {
"fs.realpath": "^1.0.0",
"inflight": "^1.0.4",
"inherits": "2",
"minimatch": "^3.0.4",
"once": "^1.3.0",
"path-is-absolute": "^1.0.0"
},
"engines": {
"node": "*"
},
"funding": {
"url": "https://github.com/sponsors/isaacs"
}
},
"node_modules/immediate": {
"version": "3.0.6",
"resolved": "https://registry.npmjs.org/immediate/-/immediate-3.0.6.tgz",
"integrity": "sha1-nbHb0Pr43m++D13V5Wu2BigN5ps="
},
"node_modules/inflight": {
"version": "1.0.6",
"resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz",
"integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=",
"dependencies": {
"once": "^1.3.0",
"wrappy": "1"
}
},
"node_modules/inherits": {
"version": "2.0.4",
"resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz",
"integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ=="
},
"node_modules/isarray": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz",
"integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE="
},
"node_modules/jasmine": {
"version": "3.9.0",
"resolved": "https://registry.npmjs.org/jasmine/-/jasmine-3.9.0.tgz",
"integrity": "sha512-JgtzteG7xnqZZ51fg7N2/wiQmXon09szkALcRMTgCMX4u/m17gVJFjObnvw5FXkZOWuweHPaPRVB6DI2uN0wVA==",
"dependencies": {
"glob": "^7.1.6",
"jasmine-core": "~3.9.0"
},
"bin": {
"jasmine": "bin/jasmine.js"
}
},
"node_modules/jasmine-core": {
"version": "3.9.0",
"resolved": "https://registry.npmjs.org/jasmine-core/-/jasmine-core-3.9.0.tgz",
"integrity": "sha512-Tv3kVbPCGVrjsnHBZ38NsPU3sDOtNa0XmbG2baiyJqdb5/SPpDO6GVwJYtUryl6KB4q1Ssckwg612ES9Z0dreQ=="
},
"node_modules/jszip": {
"version": "3.7.1",
"resolved": "https://registry.npmjs.org/jszip/-/jszip-3.7.1.tgz",
"integrity": "sha512-ghL0tz1XG9ZEmRMcEN2vt7xabrDdqHHeykgARpmZ0BiIctWxM47Vt63ZO2dnp4QYt/xJVLLy5Zv1l/xRdh2byg==",
"dependencies": {
"lie": "~3.3.0",
"pako": "~1.0.2",
"readable-stream": "~2.3.6",
"set-immediate-shim": "~1.0.1"
}
},
"node_modules/lie": {
"version": "3.3.0",
"resolved": "https://registry.npmjs.org/lie/-/lie-3.3.0.tgz",
"integrity": "sha512-UaiMJzeWRlEujzAuw5LokY1L5ecNQYZKfmyZ9L7wDHb/p5etKaxXhohBcrw0EYby+G/NA52vRSN4N39dxHAIwQ==",
"dependencies": {
"immediate": "~3.0.5"
}
},
"node_modules/minimatch": {
"version": "3.0.4",
"resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz",
"integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==",
"dependencies": {
"brace-expansion": "^1.1.7"
},
"engines": {
"node": "*"
}
},
"node_modules/once": {
"version": "1.4.0",
"resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz",
"integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=",
"dependencies": {
"wrappy": "1"
}
},
"node_modules/os-tmpdir": {
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz",
"integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=",
"engines": {
"node": ">=0.10.0"
}
},
"node_modules/pako": {
"version": "1.0.11",
"resolved": "https://registry.npmjs.org/pako/-/pako-1.0.11.tgz",
"integrity": "sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw=="
},
"node_modules/path-is-absolute": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz",
"integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=",
"engines": {
"node": ">=0.10.0"
}
},
"node_modules/process-nextick-args": {
"version": "2.0.1",
"resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz",
"integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag=="
},
"node_modules/readable-stream": {
"version": "2.3.7",
"resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz",
"integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==",
"dependencies": {
"core-util-is": "~1.0.0",
"inherits": "~2.0.3",
"isarray": "~1.0.0",
"process-nextick-args": "~2.0.0",
"safe-buffer": "~5.1.1",
"string_decoder": "~1.1.1",
"util-deprecate": "~1.0.1"
}
},
"node_modules/rimraf": {
"version": "2.7.1",
"resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz",
"integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==",
"dependencies": {
"glob": "^7.1.3"
},
"bin": {
"rimraf": "bin.js"
}
},
"node_modules/safe-buffer": {
"version": "5.1.2",
"resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz",
"integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g=="
},
"node_modules/sax": {
"version": "1.2.4",
"resolved": "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz",
"integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw=="
},
"node_modules/selenium-webdriver": {
"version": "3.6.0",
"resolved": "https://registry.npmjs.org/selenium-webdriver/-/selenium-webdriver-3.6.0.tgz",
"integrity": "sha512-WH7Aldse+2P5bbFBO4Gle/nuQOdVwpHMTL6raL3uuBj/vPG07k6uzt3aiahu352ONBr5xXh0hDlM3LhtXPOC4Q==",
"dependencies": {
"jszip": "^3.1.3",
"rimraf": "^2.5.4",
"tmp": "0.0.30",
"xml2js": "^0.4.17"
},
"engines": {
"node": ">= 6.9.0"
}
},
"node_modules/set-immediate-shim": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/set-immediate-shim/-/set-immediate-shim-1.0.1.tgz",
"integrity": "sha1-SysbJ+uAip+NzEgaWOXlb1mfP2E=",
"engines": {
"node": ">=0.10.0"
}
},
"node_modules/string_decoder": {
"version": "1.1.1",
"resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz",
"integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==",
"dependencies": {
"safe-buffer": "~5.1.0"
}
},
"node_modules/tmp": {
"version": "0.0.30",
"resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.30.tgz",
"integrity": "sha1-ckGdSovn1s51FI/YsyTlk6cRwu0=",
"dependencies": {
"os-tmpdir": "~1.0.1"
},
"engines": {
"node": ">=0.4.0"
}
},
"node_modules/util-deprecate": {
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz",
"integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8="
},
"node_modules/wrappy": {
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz",
"integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8="
},
"node_modules/xml2js": {
"version": "0.4.23",
"resolved": "https://registry.npmjs.org/xml2js/-/xml2js-0.4.23.tgz",
"integrity": "sha512-ySPiMjM0+pLDftHgXY4By0uswI3SPKLDw/i3UXbnO8M/p28zqexCUoPmQFrYD+/1BzhGJSs2i1ERWKJAtiLrug==",
"dependencies": {
"sax": ">=0.6.0",
"xmlbuilder": "~11.0.0"
},
"engines": {
"node": ">=4.0.0"
}
},
"node_modules/xmlbuilder": {
"version": "11.0.1",
"resolved": "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-11.0.1.tgz",
"integrity": "sha512-fDlsI/kFEx7gLvbecc0/ohLG50fugQp8ryHzMTuW9vSa1GJ0XYWKnhsUx7oie3G98+r56aTQIUB4kht42R3JvA==",
"engines": {
"node": ">=4.0"
}
}
},
"dependencies": {
"balanced-match": {
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz",
"integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw=="
},
"brace-expansion": {
"version": "1.1.11",
"resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz",
"integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==",
"requires": {
"balanced-match": "^1.0.0",
"concat-map": "0.0.1"
}
},
"concat-map": {
"version": "0.0.1",
"resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz",
"integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s="
},
"core-util-is": {
"version": "1.0.3",
"resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz",
"integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ=="
},
"fs.realpath": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz",
"integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8="
},
"glob": {
"version": "7.2.0",
"resolved": "https://registry.npmjs.org/glob/-/glob-7.2.0.tgz",
"integrity": "sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q==",
"requires": {
"fs.realpath": "^1.0.0",
"inflight": "^1.0.4",
"inherits": "2",
"minimatch": "^3.0.4",
"once": "^1.3.0",
"path-is-absolute": "^1.0.0"
}
},
"immediate": {
"version": "3.0.6",
"resolved": "https://registry.npmjs.org/immediate/-/immediate-3.0.6.tgz",
"integrity": "sha1-nbHb0Pr43m++D13V5Wu2BigN5ps="
},
"inflight": {
"version": "1.0.6",
"resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz",
"integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=",
"requires": {
"once": "^1.3.0",
"wrappy": "1"
}
},
"inherits": {
"version": "2.0.4",
"resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz",
"integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ=="
},
"isarray": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz",
"integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE="
},
"jasmine": {
"version": "3.9.0",
"resolved": "https://registry.npmjs.org/jasmine/-/jasmine-3.9.0.tgz",
"integrity": "sha512-JgtzteG7xnqZZ51fg7N2/wiQmXon09szkALcRMTgCMX4u/m17gVJFjObnvw5FXkZOWuweHPaPRVB6DI2uN0wVA==",
"requires": {
"glob": "^7.1.6",
"jasmine-core": "~3.9.0"
}
},
"jasmine-core": {
"version": "3.9.0",
"resolved": "https://registry.npmjs.org/jasmine-core/-/jasmine-core-3.9.0.tgz",
"integrity": "sha512-Tv3kVbPCGVrjsnHBZ38NsPU3sDOtNa0XmbG2baiyJqdb5/SPpDO6GVwJYtUryl6KB4q1Ssckwg612ES9Z0dreQ=="
},
"jszip": {
"version": "3.7.1",
"resolved": "https://registry.npmjs.org/jszip/-/jszip-3.7.1.tgz",
"integrity": "sha512-ghL0tz1XG9ZEmRMcEN2vt7xabrDdqHHeykgARpmZ0BiIctWxM47Vt63ZO2dnp4QYt/xJVLLy5Zv1l/xRdh2byg==",
"requires": {
"lie": "~3.3.0",
"pako": "~1.0.2",
"readable-stream": "~2.3.6",
"set-immediate-shim": "~1.0.1"
}
},
"lie": {
"version": "3.3.0",
"resolved": "https://registry.npmjs.org/lie/-/lie-3.3.0.tgz",
"integrity": "sha512-UaiMJzeWRlEujzAuw5LokY1L5ecNQYZKfmyZ9L7wDHb/p5etKaxXhohBcrw0EYby+G/NA52vRSN4N39dxHAIwQ==",
"requires": {
"immediate": "~3.0.5"
}
},
"minimatch": {
"version": "3.0.4",
"resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz",
"integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==",
"requires": {
"brace-expansion": "^1.1.7"
}
},
"once": {
"version": "1.4.0",
"resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz",
"integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=",
"requires": {
"wrappy": "1"
}
},
"os-tmpdir": {
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz",
"integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ="
},
"pako": {
"version": "1.0.11",
"resolved": "https://registry.npmjs.org/pako/-/pako-1.0.11.tgz",
"integrity": "sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw=="
},
"path-is-absolute": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz",
"integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18="
},
"process-nextick-args": {
"version": "2.0.1",
"resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz",
"integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag=="
},
"readable-stream": {
"version": "2.3.7",
"resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz",
"integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==",
"requires": {
"core-util-is": "~1.0.0",
"inherits": "~2.0.3",
"isarray": "~1.0.0",
"process-nextick-args": "~2.0.0",
"safe-buffer": "~5.1.1",
"string_decoder": "~1.1.1",
"util-deprecate": "~1.0.1"
}
},
"rimraf": {
"version": "2.7.1",
"resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz",
"integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==",
"requires": {
"glob": "^7.1.3"
}
},
"safe-buffer": {
"version": "5.1.2",
"resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz",
"integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g=="
},
"sax": {
"version": "1.2.4",
"resolved": "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz",
"integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw=="
},
"selenium-webdriver": {
"version": "3.6.0",
"resolved": "https://registry.npmjs.org/selenium-webdriver/-/selenium-webdriver-3.6.0.tgz",
"integrity": "sha512-WH7Aldse+2P5bbFBO4Gle/nuQOdVwpHMTL6raL3uuBj/vPG07k6uzt3aiahu352ONBr5xXh0hDlM3LhtXPOC4Q==",
"requires": {
"jszip": "^3.1.3",
"rimraf": "^2.5.4",
"tmp": "0.0.30",
"xml2js": "^0.4.17"
}
},
"set-immediate-shim": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/set-immediate-shim/-/set-immediate-shim-1.0.1.tgz",
"integrity": "sha1-SysbJ+uAip+NzEgaWOXlb1mfP2E="
},
"string_decoder": {
"version": "1.1.1",
"resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz",
"integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==",
"requires": {
"safe-buffer": "~5.1.0"
}
},
"tmp": {
"version": "0.0.30",
"resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.30.tgz",
"integrity": "sha1-ckGdSovn1s51FI/YsyTlk6cRwu0=",
"requires": {
"os-tmpdir": "~1.0.1"
}
},
"util-deprecate": {
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz",
"integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8="
},
"wrappy": {
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz",
"integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8="
},
"xml2js": {
"version": "0.4.23",
"resolved": "https://registry.npmjs.org/xml2js/-/xml2js-0.4.23.tgz",
"integrity": "sha512-ySPiMjM0+pLDftHgXY4By0uswI3SPKLDw/i3UXbnO8M/p28zqexCUoPmQFrYD+/1BzhGJSs2i1ERWKJAtiLrug==",
"requires": {
"sax": ">=0.6.0",
"xmlbuilder": "~11.0.0"
}
},
"xmlbuilder": {
"version": "11.0.1",
"resolved": "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-11.0.1.tgz",
"integrity": "sha512-fDlsI/kFEx7gLvbecc0/ohLG50fugQp8ryHzMTuW9vSa1GJ0XYWKnhsUx7oie3G98+r56aTQIUB4kht42R3JvA=="
}
}
}

View File

@@ -2,7 +2,7 @@
"name": "tests",
"version": "1.0.0",
"scripts": {
"test": "node tests.js"
"test": "jasmine spec/tests.js"
},
"author": "Ian coleman",
"description": "Tests for BIP39 tool",
@@ -11,6 +11,7 @@
"url": "git://github.com/iancoleman/bip39.git"
},
"dependencies": {
"jasmine": "^3.9.0",
"selenium-webdriver": "^3.6.0"
},
"license": "MIT"

View File

@@ -17,6 +17,9 @@ if (!browser) {
console.log("Using default browser: chrome");
browser = "chrome";
}
else if (browser !== 'chrome' && browser !== 'firefox') {
throw `Unsupported browser: "${browser}", must be "chrome" or "firefox"`
}
else {
console.log("Using browser: " + browser);
}
@@ -625,6 +628,26 @@ it('Allows selection of dash testnet', function(done) {
};
testNetwork(done, params);
});
it('Allows selection of divi', function(done) {
var params = {
selectText: "DIVI - DIVI",
phrase: "abandon abandon ability",
firstAddress: "DLeGz7jqF1y1cmfEkSeRBkQPK8vTZ8rHt4",
firstPubKey: "032ade8a36983a1efcc40d64b2a1a52cc26a908f7dc2fa222f43598812dd10d8bc",
firstPrivKey: "YWG1Fht24fMUntuAhVRMPSj2eVN7BxkM7SuuqRhg1ibsTNbr31VF",
};
testNetwork(done, params);
});
it('Allows selection of divi testnet', function(done) {
var params = {
selectText: "DIVI - DIVI Testnet",
phrase: "abandon abandon ability",
firstAddress: "yB5U384n6dGkVE3by5y9VdvHHPwPg68fQj",
firstPubKey: "0382a5450765e2025bdb5f7d109c9254a11ef97a566228bf171d80ecb348763bb0",
firstPrivKey: "cV3coiYD2NhHKfhC6Gb8DzpvPzcGYYExYxuNxpUtKq3VUJrkFLZx",
};
testNetwork(done, params);
});
it('Allows selection of game', function(done) {
var params = {
selectText: "GAME - GameCredits",
@@ -927,6 +950,16 @@ it('Allows selection of Cosmos Hub', function(done) {
};
testNetwork(done, params);
});
it('Allows selection of Terra', function(done) {
var params = {
selectText: "LUNA - Terra",
phrase: "abandon abandon ability",
firstAddress: "terra1txr4jwel3vjl64vrc08pljnjryqkhtffmyp265",
firstPubKey: "028e7658e3debb2d9d458919bfba0e85b0220e845f7552176f30a52acd0f809d71",
firstPrivKey: "d611b211e370aa1edd9743acd6ce537d16fade85d7ae7e88b32f3a0483f52535",
};
testNetwork(done, params);
});
it('Allows selection of Auroracoin', function(done) {
var params = {
selectText: "AUR - Auroracoin",
@@ -987,6 +1020,16 @@ it('Allows selection of Bitcoin Private', function(done) {
};
testNetwork(done, params);
});
it('Allows selection of Bitcoin Private testnet', function(done) {
var params = {
selectText: "BTCPt - Bitcoin Private Testnet",
phrase: "abandon abandon ability",
firstAddress: "n1UcUUSDfDppfzh7XLJNHmZkLdbTQg3VAZL",
firstPubKey: "0382a5450765e2025bdb5f7d109c9254a11ef97a566228bf171d80ecb348763bb0",
firstPrivKey: "cV3coiYD2NhHKfhC6Gb8DzpvPzcGYYExYxuNxpUtKq3VUJrkFLZx",
};
testNetwork(done, params);
});
it('Allows selection of Bitcoin SV', function(done) {
var params = {
selectText: "BSV - BitcoinSV",
@@ -1355,6 +1398,16 @@ it('Allows selection of Iop', function(done) {
};
testNetwork(done, params);
});
it('Allows selection of Starname', function(done) {
var params = {
selectText: "IOV - Starname",
phrase: "abandon abandon ability",
firstAddress: "star1xgfvgq40r7ff8ylw9l95dw56xnr0pvtjnlp7h4",
firstPubKey: "starpub1addwnpepqg9x5cft48hcgx25vyzeyygntl7pt763datr6v50hrecafyane54xlqdxkd",
firstPrivKey: "bGI4BNRvMYT1lbCOoH000HvNFPkyXms9n3Xp1X/7E80=",
};
testNetwork(done, params);
});
it('Allows selection of Ixcoin', function(done) {
var params = {
selectText: "IXC - Ixcoin",
@@ -1665,6 +1718,16 @@ it('Allows selection of Rubycoin', function(done) {
};
testNetwork(done, params);
});
it('Allows selection of THORChain', function(done) {
var params = {
selectText: "RUNE - THORChain",
phrase: "flip vicious divorce angle toward say derive blue refuse load word creek once expire bounce",
firstAddress: "thor1zp3yx758t64vqvu8776vnwd0udrs2vwuxhc4ep",
firstPubKey: "02fa85b75ef37fe3a4f4a6d62352aa7de070d2b39af9c55be26f079d01f406851d",
firstPrivKey: "6020c0d5a9a8689c491c6a8f36beb70bf459e129e1428fed64aaf594beee54a6",
};
testNetwork(done, params);
});
it('Allows selection of Salus', function(done) {
var params = {
selectText: "SLS - Salus",
@@ -1875,9 +1938,9 @@ it('Allows selection of VeChain', function(done) {
};
testNetwork(done, params);
});
it('Allows selection of Whitecoin', function(done) {
it('Allows selection of Whitecoin Classic', function(done) {
var params = {
selectText: "XWC - Whitecoin",
selectText: "XWCC - Whitecoin Classic",
phrase: "abandon abandon ability",
firstAddress: "WcSwCAUqrSgeSYbsaS3SSWWhsx8KRYTFDR",
firstPubKey: "03d3f4fa758f6260bfb39664d248a32258b53a90a71224db056ee79abaa3e9f208",
@@ -1885,6 +1948,16 @@ it('Allows selection of Whitecoin', function(done) {
};
testNetwork(done, params);
});
it('Allows selection of Whitecoin', function(done) {
var params = {
selectText: "XWC - Whitecoin",
phrase: "abandon abandon ability",
firstAddress: "XWCNY5EQsC55ifxRVEbP7H28yc3TMXC2pqsb5",
firstPubKey: "XWC68fEy4cCc8G1UWyeMPnQ5NjEhMUFSvu1oz4gLKxvj3dPvh7v18",
firstPrivKey: "5K8toD6TYy5DMHkxjpywXNLj4M6CjZAT5h12uhRuVuBBRtci8Zw",
};
testNetwork(done, params);
});
it('Allows selection of Wincoin', function(done) {
var params = {
selectText: "WC - Wincoin",
@@ -2359,6 +2432,17 @@ it('Allows selection of ZooBlockchain', function(done) {
testNetwork(done, params);
});
it('Allows selection of Particl', function(done) {
var params = {
selectText: "PART - Particl",
phrase: "abandon abandon ability",
firstAddress: "Pjf2jj1E4GLJnyZA6jNN25Ajn4wHDahuL5",
firstPubKey: "039d803bfa8bd30c9e74c14a8785cee64b696b56e10d7545ad3fbf954c40cbfda2",
firstPrivKey: "H79cmSqW1uYVbi14c8VH5eH9UdpjhuvGmXFV8zhkcfR84TEUWfHp",
};
testNetwork(done, params);
});
// BIP39 seed is set from phrase
it('Sets the bip39 seed from the prhase', function(done) {
driver.findElement(By.css('.phrase'))
@@ -2995,6 +3079,25 @@ it('Uses the correct derivation for altcoins with root keys', function(done) {
});
});
// Changing the coin when only using a seed (without a mnemonic phrase) should
// work the same as the previous test.
// See https://github.com/iancoleman/bip39/pull/486
it('Uses the correct derivation for altcoins with seed and without mnemonic phrase', function(done) {
driver.findElement(By.css('.seed'))
.sendKeys("20da140d3dd1df8713cefcc4d54ce0e445b4151027a1ab567b832f6da5fcc5afc1c3a3f199ab78b8e0ab4652efd7f414ac2c9a3b81bceb879a70f377aa0a58f3");
driver.sleep(generateDelay).then(function() {
// 4) switch from bitcoin to viacoin
selectNetwork("VIA - Viacoin");
driver.sleep(generateDelay).then(function() {
// 5) ensure the derived address is correct
getFirstAddress(function(address) {
expect(address).toBe("Vq9Eq4N5SQnjqZvxtxzo7hZPW5XnyJsmXT");
done();
});
});
});
});
// Selecting a language with no existing phrase should generate a phrase in
// that language.
it('Generate a random phrase when language is selected and no current phrase', function(done) {