mirror of
https://github.com/OneKeyHQ/bip39.git
synced 2026-04-06 19:03:49 +00:00
Compare commits
42 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
fca07769eb | ||
|
|
5028988195 | ||
|
|
139becaf2c | ||
|
|
0514c20b81 | ||
|
|
f8ca25c338 | ||
|
|
548d94994b | ||
|
|
09d63290a4 | ||
|
|
d6cade868f | ||
|
|
048721a6ff | ||
|
|
892ce76fed | ||
|
|
aaa82c097f | ||
|
|
05311e7f54 | ||
|
|
40209fd898 | ||
|
|
e5520bb859 | ||
|
|
e1d0cf4f72 | ||
|
|
e82a142872 | ||
|
|
fcc7d12109 | ||
|
|
5dfe77e4a3 | ||
|
|
e21e32da31 | ||
|
|
ba678b1147 | ||
|
|
0b39e9dca7 | ||
|
|
cc61ec30c5 | ||
|
|
0f0a888e13 | ||
|
|
2ef27fb80b | ||
|
|
423fb969c6 | ||
|
|
9fae1ffbcc | ||
|
|
78db37f663 | ||
|
|
28e1cd455c | ||
|
|
47debf07ed | ||
|
|
cfc0c4d743 | ||
|
|
de8e5bc11f | ||
|
|
5c1003dde3 | ||
|
|
a78f4e280c | ||
|
|
4e9b492ca4 | ||
|
|
91eb2cbcfd | ||
|
|
c51bb4f9e5 | ||
|
|
3fa0f4cbef | ||
|
|
92fb39311e | ||
|
|
d00c719932 | ||
|
|
ab1bd64d52 | ||
|
|
aab3645f21 | ||
|
|
66419cf39c |
30440
bip39-standalone.html
30440
bip39-standalone.html
File diff suppressed because it is too large
Load Diff
23
changelog.md
23
changelog.md
@@ -1,3 +1,26 @@
|
||||
# 0.3.4
|
||||
|
||||
* Add BlackCoin
|
||||
* Add Denarius
|
||||
* Raw entropy shows groupings with space every 11 bits
|
||||
* Checksum shown in entropy details
|
||||
* Warn that entropy values should exclude checksum
|
||||
* Add Korean language
|
||||
|
||||
# 0.3.3
|
||||
|
||||
* Add AXE network
|
||||
* Ethereum private key generation bugfix
|
||||
* Add BIP38 support
|
||||
* Allow initial number of rows to be set by the user
|
||||
|
||||
# 0.3.2
|
||||
|
||||
* Add Onixcoin
|
||||
* Add Komodo
|
||||
* BIP84 tab for derivation path
|
||||
* CSV tab for derived addresses
|
||||
|
||||
# 0.3.1
|
||||
|
||||
* Populate entropy field with hex value used from PRNG
|
||||
|
||||
@@ -95,3 +95,11 @@ body {
|
||||
top: 5px;
|
||||
right: 5px;
|
||||
}
|
||||
.csv {
|
||||
margin-top: 20px;
|
||||
margin-bottom: 20px;
|
||||
white-space: pre;
|
||||
overflow-wrap: normal;
|
||||
overflow-x: scroll;
|
||||
font-family: monospace;
|
||||
}
|
||||
|
||||
190
src/index.html
190
src/index.html
@@ -15,7 +15,7 @@
|
||||
<div class="container">
|
||||
|
||||
<h1 class="text-center">Mnemonic Code Converter</h1>
|
||||
<p class="version">v0.3.1</p>
|
||||
<p class="version">v0.3.4</p>
|
||||
<hr>
|
||||
<div class="row">
|
||||
<div class="col-md-12">
|
||||
@@ -94,6 +94,8 @@
|
||||
<div class="filtered col-sm-9 form-control-static"></div>
|
||||
<label class="col-sm-3 control-label">Raw Binary</label>
|
||||
<div class="binary col-sm-9 form-control-static"></div>
|
||||
<label class="col-sm-3 control-label">Binary Checksum</label>
|
||||
<div class="checksum col-sm-9 form-control-static"> </div>
|
||||
<label class="col-sm-3 control-label">Word Indexes</label>
|
||||
<div class="word-indexes col-sm-9 form-control-static"> </div>
|
||||
<label class="col-sm-3 control-label">Mnemonic Length</label>
|
||||
@@ -141,6 +143,7 @@
|
||||
<a href="#chinese_traditional" title="Chinese (Traditional)">中文(繁體)</a>
|
||||
<a href="#french" title="French">Français</a>
|
||||
<a href="#italian" title="Italian">Italiano</a>
|
||||
<a href="#korean" title="Korean">한국어</a>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
@@ -204,6 +207,9 @@
|
||||
<li id="bip49-tab">
|
||||
<a href="#bip49" role="tab" data-toggle="tab">BIP49</a>
|
||||
</li>
|
||||
<li id="bip84-tab">
|
||||
<a href="#bip84" role="tab" data-toggle="tab">BIP84</a>
|
||||
</li>
|
||||
<li id="bip141-tab">
|
||||
<a href="#bip141" role="tab" data-toggle="tab">BIP141</a>
|
||||
</li>
|
||||
@@ -487,6 +493,86 @@
|
||||
</div>
|
||||
</form>
|
||||
</div>
|
||||
<div id="bip84" class="tab-pane">
|
||||
<form class="form-horizontal" role="form">
|
||||
<br>
|
||||
<div class="col-sm-2"></div>
|
||||
<div class="col-sm-10">
|
||||
<p>
|
||||
For more info see the
|
||||
<a href="https://github.com/bitcoin/bips/blob/master/bip-0084.mediawiki" target="_blank">BIP84 spec</a>.
|
||||
</p>
|
||||
</div>
|
||||
<div class="form-group">
|
||||
<label for="purpose" class="col-sm-2 control-label">
|
||||
Purpose
|
||||
</label>
|
||||
<div class="col-sm-10">
|
||||
<input id="purpose" type="text" class="purpose form-control" value="84" readonly>
|
||||
</div>
|
||||
</div>
|
||||
<div class="form-group">
|
||||
<label for="coin" class="col-sm-2 control-label">
|
||||
Coin
|
||||
</label>
|
||||
<div class="col-sm-10">
|
||||
<input id="coin" type="text" class="coin form-control" value="0" readonly>
|
||||
</div>
|
||||
</div>
|
||||
<div class="form-group">
|
||||
<label for="account" class="col-sm-2 control-label">
|
||||
Account
|
||||
</label>
|
||||
<div class="col-sm-10">
|
||||
<input id="account" type="text" class="account form-control" value="0">
|
||||
</div>
|
||||
</div>
|
||||
<div class="form-group">
|
||||
<label for="change" class="col-sm-2 control-label">
|
||||
External / Internal
|
||||
</label>
|
||||
<div class="col-sm-10">
|
||||
<input id="change" type="text" class="change form-control" value="0">
|
||||
</div>
|
||||
</div>
|
||||
<div class="form-group">
|
||||
<label class="col-sm-2 control-label">
|
||||
</label>
|
||||
<div class="col-sm-10">
|
||||
<p>The account extended keys can be used for importing to most BIP84 compatible wallets.</p>
|
||||
</div>
|
||||
</div>
|
||||
<div class="form-group">
|
||||
<label for="account-xprv" class="col-sm-2 control-label">
|
||||
<span>Account Extended Private Key</span>
|
||||
</label>
|
||||
<div class="col-sm-10">
|
||||
<textarea id="account-xprv" type="text" class="account-xprv form-control" readonly data-show-qr></textarea>
|
||||
</div>
|
||||
</div>
|
||||
<div class="form-group">
|
||||
<label for="account-xpub" class="col-sm-2 control-label">
|
||||
<span>Account Extended Public Key</span>
|
||||
</label>
|
||||
<div class="col-sm-10">
|
||||
<textarea id="account-xpub" type="text" class="account-xpub form-control" readonly data-show-qr></textarea>
|
||||
</div>
|
||||
</div>
|
||||
<div class="form-group">
|
||||
<label class="col-sm-2 control-label">
|
||||
</label>
|
||||
<div class="col-sm-10">
|
||||
<p>The BIP32 derivation path and extended keys are the basis for the derived addresses.</p>
|
||||
</div>
|
||||
</div>
|
||||
<div class="form-group">
|
||||
<label for="bip84-path" class="col-sm-2 control-label">BIP32 Derivation Path</label>
|
||||
<div class="col-sm-10">
|
||||
<input id="bip84-path" type="text" class="path form-control" value="m/84'/0'/0'/0" readonly="readonly">
|
||||
</div>
|
||||
</div>
|
||||
</form>
|
||||
</div>
|
||||
</div>
|
||||
<form class="form-horizontal" role="form">
|
||||
<div class="form-group">
|
||||
@@ -521,41 +607,68 @@
|
||||
</div>
|
||||
</div>
|
||||
<div class="col-md-12">
|
||||
<table class="table table-striped">
|
||||
<thead>
|
||||
<th>
|
||||
<div class="input-group">
|
||||
<span>Path</span>
|
||||
<button class="index-toggle">Toggle</button>
|
||||
</div>
|
||||
</th>
|
||||
<th>
|
||||
<div class="input-group">
|
||||
<span>Address</span>
|
||||
<button class="address-toggle">Toggle</button>
|
||||
</div>
|
||||
</th>
|
||||
<th>
|
||||
<div class="input-group">
|
||||
<span>Public Key</span>
|
||||
<button class="public-key-toggle">Toggle</button>
|
||||
</div>
|
||||
</th>
|
||||
<th>
|
||||
<div class="input-group">
|
||||
<span>Private Key</span>
|
||||
<button class="private-key-toggle">Toggle</button>
|
||||
</div>
|
||||
</th>
|
||||
</thead>
|
||||
<tbody class="addresses monospace">
|
||||
<tr><td> </td><td> </td><td> </td><td> </td></tr>
|
||||
<tr><td> </td><td> </td><td> </td><td> </td></tr>
|
||||
<tr><td> </td><td> </td><td> </td><td> </td></tr>
|
||||
<tr><td> </td><td> </td><td> </td><td> </td></tr>
|
||||
<tr><td> </td><td> </td><td> </td><td> </td></tr>
|
||||
</tbody>
|
||||
</table>
|
||||
<div class="checkbox">
|
||||
<label>
|
||||
<input type="checkbox" class="use-bip38">
|
||||
<span>Encrypt private keys using BIP38 and this password:</span>
|
||||
</label>
|
||||
<input class="bip38-password">
|
||||
<span>Enabling BIP38 means each key will take take several minutes to generate.</span>
|
||||
</div>
|
||||
</div>
|
||||
<ul class="addresses-type nav nav-tabs" role="tablist">
|
||||
<li id="table-tab" class="active">
|
||||
<a href="#table" role="tab" data-toggle="tab">Table</a>
|
||||
</li>
|
||||
<li id="csv-tab">
|
||||
<a href="#csv" role="tab" data-toggle="tab">CSV</a>
|
||||
</li>
|
||||
</ul>
|
||||
<div class="addresses-type tab-content">
|
||||
<div id="table" class="tab-pane active">
|
||||
<div class="col-md-12">
|
||||
<table class="table table-striped">
|
||||
<thead>
|
||||
<th>
|
||||
<div class="input-group">
|
||||
<span>Path</span>
|
||||
<button class="index-toggle">Toggle</button>
|
||||
</div>
|
||||
</th>
|
||||
<th>
|
||||
<div class="input-group">
|
||||
<span>Address</span>
|
||||
<button class="address-toggle">Toggle</button>
|
||||
</div>
|
||||
</th>
|
||||
<th>
|
||||
<div class="input-group">
|
||||
<span>Public Key</span>
|
||||
<button class="public-key-toggle">Toggle</button>
|
||||
</div>
|
||||
</th>
|
||||
<th>
|
||||
<div class="input-group">
|
||||
<span>Private Key</span>
|
||||
<button class="private-key-toggle">Toggle</button>
|
||||
</div>
|
||||
</th>
|
||||
</thead>
|
||||
<tbody class="addresses monospace">
|
||||
<tr><td> </td><td> </td><td> </td><td> </td></tr>
|
||||
<tr><td> </td><td> </td><td> </td><td> </td></tr>
|
||||
<tr><td> </td><td> </td><td> </td><td> </td></tr>
|
||||
<tr><td> </td><td> </td><td> </td><td> </td></tr>
|
||||
<tr><td> </td><td> </td><td> </td><td> </td></tr>
|
||||
</tbody>
|
||||
</table>
|
||||
</div>
|
||||
</div>
|
||||
<div id="csv" class="tab-pane">
|
||||
<div class="col-md-12">
|
||||
<textarea class="csv form-control" rows="25" readonly></textarea>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<span>Show</span>
|
||||
@@ -603,6 +716,9 @@
|
||||
<span>Be careful - it can be easy to make mistakes if you don't know what you're doing.</span>
|
||||
</p>
|
||||
<h3 id="entropy-notes">Entropy</h3>
|
||||
<p>
|
||||
<span>Entropy values should not include the BIP39 checksum. This is automatically added by the tool.</span>
|
||||
</p>
|
||||
<p>
|
||||
<span>
|
||||
Entropy values must be sourced from a
|
||||
@@ -773,6 +889,7 @@
|
||||
<script src="js/kjua-0.1.1.min.js"></script>
|
||||
<script src="js/bitcoinjs-3.3.0.js"></script>
|
||||
<script src="js/bitcoinjs-extensions.js"></script>
|
||||
<script src="js/bitcoinjs-bip38-2.0.2.js"></script>
|
||||
<script src="js/segwit-parameters.js"></script>
|
||||
<script src="js/ethereumjs-util.js"></script>
|
||||
<script src="js/ripple-util.js"></script>
|
||||
@@ -784,6 +901,7 @@
|
||||
<script src="js/wordlist_chinese_traditional.js"></script>
|
||||
<script src="js/wordlist_french.js"></script>
|
||||
<script src="js/wordlist_italian.js"></script>
|
||||
<script src="js/wordlist_korean.js"></script>
|
||||
<script src="js/jsbip39.js"></script>
|
||||
<script src="js/biginteger.js"></script>
|
||||
<script src="js/zxcvbn.js"></script>
|
||||
|
||||
27917
src/js/bitcoinjs-bip38-2.0.2.js
Normal file
27917
src/js/bitcoinjs-bip38-2.0.2.js
Normal file
File diff suppressed because it is too large
Load Diff
@@ -108,6 +108,17 @@ bitcoinjs.bitcoin.networks.peercoin = {
|
||||
wif: 0xb7
|
||||
};
|
||||
|
||||
bitcoinjs.bitcoin.networks.axe = {
|
||||
messagePrefix: 'unused',
|
||||
bip32: {
|
||||
public: 0x0488b21e,
|
||||
private: 0x0488ade4
|
||||
},
|
||||
pubKeyHash: 0x4B,
|
||||
scriptHash: 0xCB, // TODO set this correctly
|
||||
wif: 0xCB
|
||||
};
|
||||
|
||||
bitcoinjs.bitcoin.networks.slimcoin = {
|
||||
messagePrefix: 'unused',
|
||||
bip32: {
|
||||
@@ -141,6 +152,17 @@ bitcoinjs.bitcoin.networks.dogecoin = {
|
||||
wif: 0x9e
|
||||
};
|
||||
|
||||
bitcoinjs.bitcoin.networks.denarius = {
|
||||
messagePrefix: '\x19Denarius Signed Message:\n',
|
||||
bip32: {
|
||||
public: 0x0488b21e,
|
||||
private: 0x0488ade4
|
||||
},
|
||||
pubKeyHash: 0x1e,
|
||||
scriptHash: 0x5a,
|
||||
wif: 0x9e
|
||||
};
|
||||
|
||||
bitcoinjs.bitcoin.networks.viacoin = {
|
||||
messagePrefix: '\x18Viacoin Signed Message:\n',
|
||||
bip32: {
|
||||
@@ -207,6 +229,18 @@ bitcoinjs.bitcoin.networks.myriadcoin = {
|
||||
wif: 0xb2
|
||||
};
|
||||
|
||||
|
||||
bitcoinjs.bitcoin.networks.onixcoin = {
|
||||
messagePrefix: 'unused',
|
||||
bip32: {
|
||||
public: 0x049d7cb2,
|
||||
private: 0x049d7878
|
||||
},
|
||||
pubKeyHash: 0x4B,
|
||||
scriptHash: 0x05,
|
||||
wif: 0x80
|
||||
};
|
||||
|
||||
bitcoinjs.bitcoin.networks.pivx = {
|
||||
messagePrefix: 'unused',
|
||||
bip32: {
|
||||
@@ -294,3 +328,25 @@ bitcoinjs.bitcoin.networks.litecoinXprv = {
|
||||
scriptHash: 0x32,
|
||||
wif: 0xb0
|
||||
};
|
||||
|
||||
bitcoinjs.bitcoin.networks.komodo = {
|
||||
messagePrefix: '\x18Komodo Signed Message:\n',
|
||||
bip32: {
|
||||
public: 0x0488B21E,
|
||||
private: 0x0488ADE4
|
||||
},
|
||||
pubKeyHash: 0x3c,
|
||||
scriptHash: 0x55,
|
||||
wif: 0xbc
|
||||
};
|
||||
|
||||
bitcoinjs.bitcoin.networks.blackcoin = {
|
||||
messagePrefix: '\x18BlackCoin Signed Message:\n',
|
||||
bip32: {
|
||||
public: 0x02CFBEDE,
|
||||
private: 0x02CFBF60
|
||||
},
|
||||
pubKeyHash: 0x19,
|
||||
scriptHash: 0x55,
|
||||
wif: 0x99
|
||||
};
|
||||
|
||||
203
src/js/index.js
203
src/js/index.js
@@ -38,6 +38,7 @@
|
||||
DOM.entropyWordCount = DOM.entropyContainer.find(".word-count");
|
||||
DOM.entropyBinary = DOM.entropyContainer.find(".binary");
|
||||
DOM.entropyWordIndexes = DOM.entropyContainer.find(".word-indexes");
|
||||
DOM.entropyChecksum = DOM.entropyContainer.find(".checksum");
|
||||
DOM.entropyMnemonicLength = DOM.entropyContainer.find(".mnemonic-length");
|
||||
DOM.entropyFilterWarning = DOM.entropyContainer.find(".filter-warning");
|
||||
DOM.phrase = $(".phrase");
|
||||
@@ -53,6 +54,7 @@
|
||||
DOM.bip32tab = $("#bip32-tab");
|
||||
DOM.bip44tab = $("#bip44-tab");
|
||||
DOM.bip49tab = $("#bip49-tab");
|
||||
DOM.bip84tab = $("#bip84-tab");
|
||||
DOM.bip141tab = $("#bip141-tab");
|
||||
DOM.bip32panel = $("#bip32");
|
||||
DOM.bip44panel = $("#bip44");
|
||||
@@ -74,6 +76,13 @@
|
||||
DOM.bip49accountXprv = $("#bip49 .account-xprv");
|
||||
DOM.bip49accountXpub = $("#bip49 .account-xpub");
|
||||
DOM.bip49change = $("#bip49 .change");
|
||||
DOM.bip84path = $("#bip84-path");
|
||||
DOM.bip84purpose = $("#bip84 .purpose");
|
||||
DOM.bip84coin = $("#bip84 .coin");
|
||||
DOM.bip84account = $("#bip84 .account");
|
||||
DOM.bip84accountXprv = $("#bip84 .account-xprv");
|
||||
DOM.bip84accountXpub = $("#bip84 .account-xpub");
|
||||
DOM.bip84change = $("#bip84 .change");
|
||||
DOM.bip141unavailable = $("#bip141 .unavailable");
|
||||
DOM.bip141available = $("#bip141 .available");
|
||||
DOM.bip141path = $("#bip141-path");
|
||||
@@ -82,7 +91,11 @@
|
||||
DOM.hardenedAddresses = $(".hardened-addresses");
|
||||
DOM.useBitpayAddressesContainer = $(".use-bitpay-addresses-container");
|
||||
DOM.useBitpayAddresses = $(".use-bitpay-addresses");
|
||||
DOM.useBip38 = $(".use-bip38");
|
||||
DOM.bip38Password = $(".bip38-password");
|
||||
DOM.addresses = $(".addresses");
|
||||
DOM.csvTab = $("#csv-tab a");
|
||||
DOM.csv = $(".csv");
|
||||
DOM.rowsToAdd = $(".rows-to-add");
|
||||
DOM.more = $(".more");
|
||||
DOM.moreRowsStartIndex = $(".more-rows-start-index");
|
||||
@@ -117,14 +130,19 @@
|
||||
DOM.bip44change.on("input", calcForDerivationPath);
|
||||
DOM.bip49account.on("input", calcForDerivationPath);
|
||||
DOM.bip49change.on("input", calcForDerivationPath);
|
||||
DOM.bip84account.on("input", calcForDerivationPath);
|
||||
DOM.bip84change.on("input", calcForDerivationPath);
|
||||
DOM.bip141path.on("input", calcForDerivationPath);
|
||||
DOM.bip141semantics.on("change", tabChanged);
|
||||
DOM.tab.on("shown.bs.tab", tabChanged);
|
||||
DOM.hardenedAddresses.on("change", calcForDerivationPath);
|
||||
DOM.useBip38.on("change", calcForDerivationPath);
|
||||
DOM.bip38Password.on("change", calcForDerivationPath);
|
||||
DOM.indexToggle.on("click", toggleIndexes);
|
||||
DOM.addressToggle.on("click", toggleAddresses);
|
||||
DOM.publicKeyToggle.on("click", togglePublicKeys);
|
||||
DOM.privateKeyToggle.on("click", togglePrivateKeys);
|
||||
DOM.csvTab.on("click", updateCsv);
|
||||
DOM.languages.on("click", languageChanged);
|
||||
DOM.useBitpayAddresses.on("change", useBitpayAddressesChange);
|
||||
setQrEvents(DOM.showQrEls);
|
||||
@@ -357,6 +375,9 @@
|
||||
else if (bip49TabSelected()) {
|
||||
displayBip49Info();
|
||||
}
|
||||
else if (bip84TabSelected()) {
|
||||
displayBip84Info();
|
||||
}
|
||||
displayBip32Info();
|
||||
}
|
||||
|
||||
@@ -559,6 +580,21 @@
|
||||
console.log("Using derivation path from BIP49 tab: " + derivationPath);
|
||||
return derivationPath;
|
||||
}
|
||||
else if (bip84TabSelected()) {
|
||||
var purpose = parseIntNoNaN(DOM.bip84purpose.val(), 84);
|
||||
var coin = parseIntNoNaN(DOM.bip84coin.val(), 0);
|
||||
var account = parseIntNoNaN(DOM.bip84account.val(), 0);
|
||||
var change = parseIntNoNaN(DOM.bip84change.val(), 0);
|
||||
var path = "m/";
|
||||
path += purpose + "'/";
|
||||
path += coin + "'/";
|
||||
path += account + "'/";
|
||||
path += change;
|
||||
DOM.bip84path.val(path);
|
||||
var derivationPath = DOM.bip84path.val();
|
||||
console.log("Using derivation path from BIP84 tab: " + derivationPath);
|
||||
return derivationPath;
|
||||
}
|
||||
else if (bip32TabSelected()) {
|
||||
var derivationPath = DOM.bip32path.val();
|
||||
console.log("Using derivation path from BIP32 tab: " + derivationPath);
|
||||
@@ -659,6 +695,24 @@
|
||||
DOM.bip49accountXpub.val(accountXpub);
|
||||
}
|
||||
|
||||
function displayBip84Info() {
|
||||
// Get the derivation path for the account
|
||||
var purpose = parseIntNoNaN(DOM.bip84purpose.val(), 84);
|
||||
var coin = parseIntNoNaN(DOM.bip84coin.val(), 0);
|
||||
var account = parseIntNoNaN(DOM.bip84account.val(), 0);
|
||||
var path = "m/";
|
||||
path += purpose + "'/";
|
||||
path += coin + "'/";
|
||||
path += account + "'/";
|
||||
// Calculate the account extended keys
|
||||
var accountExtendedKey = calcBip32ExtendedKey(path);
|
||||
var accountXprv = accountExtendedKey.toBase58();
|
||||
var accountXpub = accountExtendedKey.neutered().toBase58();
|
||||
// Display the extended keys
|
||||
DOM.bip84accountXprv.val(accountXprv);
|
||||
DOM.bip84accountXpub.val(accountXpub);
|
||||
}
|
||||
|
||||
function displayBip32Info() {
|
||||
// Display the key
|
||||
DOM.seed.val(seed);
|
||||
@@ -674,7 +728,8 @@
|
||||
DOM.extendedPubKey.val(extendedPubKey);
|
||||
// Display the addresses and privkeys
|
||||
clearAddressesList();
|
||||
displayAddresses(0, 20);
|
||||
var initialAddressCount = parseInt(DOM.rowsToAdd.val());
|
||||
displayAddresses(0, initialAddressCount);
|
||||
}
|
||||
|
||||
function displayAddresses(start, total) {
|
||||
@@ -699,11 +754,12 @@
|
||||
}
|
||||
|
||||
function segwitSelected() {
|
||||
return bip49TabSelected() || bip141TabSelected();
|
||||
return bip49TabSelected() || bip84TabSelected() || bip141TabSelected();
|
||||
}
|
||||
|
||||
function p2wpkhSelected() {
|
||||
return bip141TabSelected() && DOM.bip141semantics.val() == "p2wpkh";
|
||||
return bip84TabSelected() ||
|
||||
bip141TabSelected() && DOM.bip141semantics.val() == "p2wpkh";
|
||||
}
|
||||
|
||||
function p2wpkhInP2shSelected() {
|
||||
@@ -716,6 +772,8 @@
|
||||
var self = this;
|
||||
this.shouldGenerate = true;
|
||||
var useHardenedAddresses = DOM.hardenedAddresses.prop("checked");
|
||||
var useBip38 = DOM.useBip38.prop("checked");
|
||||
var bip38password = DOM.bip38Password.val();
|
||||
var isSegwit = segwitSelected();
|
||||
var segwitAvailable = networkHasSegwit();
|
||||
var isP2wpkh = p2wpkhSelected();
|
||||
@@ -730,6 +788,7 @@
|
||||
if (!self.shouldGenerate) {
|
||||
return;
|
||||
}
|
||||
// derive HDkey for this row of the table
|
||||
var key = "NA";
|
||||
if (useHardenedAddresses) {
|
||||
key = bip32ExtendedKey.deriveHardened(index);
|
||||
@@ -737,19 +796,36 @@
|
||||
else {
|
||||
key = bip32ExtendedKey.derive(index);
|
||||
}
|
||||
var address = key.getAddress().toString();
|
||||
var privkey = "NA";
|
||||
if (!key.isNeutered()) {
|
||||
privkey = key.keyPair.toWIF(network);
|
||||
// bip38 requires uncompressed keys
|
||||
// see https://github.com/iancoleman/bip39/issues/140#issuecomment-352164035
|
||||
var keyPair = key.keyPair;
|
||||
var useUncompressed = useBip38;
|
||||
if (useUncompressed) {
|
||||
keyPair = new bitcoinjs.bitcoin.ECPair(keyPair.d, null, { compressed: false });
|
||||
}
|
||||
var pubkey = key.getPublicKeyBuffer().toString('hex');
|
||||
// get address
|
||||
var address = keyPair.getAddress().toString();
|
||||
// get privkey
|
||||
var hasPrivkey = !key.isNeutered();
|
||||
var privkey = "NA";
|
||||
if (hasPrivkey) {
|
||||
privkey = keyPair.toWIF(network);
|
||||
// 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);
|
||||
});
|
||||
}
|
||||
}
|
||||
// get pubkey
|
||||
var pubkey = keyPair.getPublicKeyBuffer().toString('hex');
|
||||
var indexText = getDerivationPath() + "/" + index;
|
||||
if (useHardenedAddresses) {
|
||||
indexText = indexText + "'";
|
||||
}
|
||||
// Ethereum values are different
|
||||
if (networks[DOM.network.val()].name == "ETH - Ethereum") {
|
||||
var privKeyBuffer = key.keyPair.d.toBuffer();
|
||||
var privKeyBuffer = keyPair.d.toBuffer(32);
|
||||
privkey = privKeyBuffer.toString('hex');
|
||||
var addressBuffer = ethUtil.privateToAddress(privKeyBuffer);
|
||||
var hexAddress = addressBuffer.toString('hex');
|
||||
@@ -784,6 +860,7 @@
|
||||
addAddressToList(indexText, address, pubkey, privkey);
|
||||
if (isLast) {
|
||||
hidePending();
|
||||
updateCsv();
|
||||
}
|
||||
}, 50)
|
||||
}
|
||||
@@ -824,6 +901,7 @@
|
||||
|
||||
function clearAddressesList() {
|
||||
DOM.addresses.empty();
|
||||
DOM.csv.val("");
|
||||
stopGenerating();
|
||||
}
|
||||
|
||||
@@ -1064,7 +1142,7 @@
|
||||
function wordArrayToPhrase(words) {
|
||||
var phrase = words.join(" ");
|
||||
var language = getLanguageFromPhrase(phrase);
|
||||
if (language == "japanese") {
|
||||
if (language == "japanese" || language == "korean") {
|
||||
phrase = words.join("\u3000");
|
||||
}
|
||||
return phrase;
|
||||
@@ -1118,6 +1196,8 @@
|
||||
DOM.phrase.val(phrase);
|
||||
// Show the word indexes
|
||||
showWordIndexes();
|
||||
// Show the checksum
|
||||
showChecksum();
|
||||
}
|
||||
|
||||
function clearEntropyFeedback() {
|
||||
@@ -1148,13 +1228,14 @@
|
||||
var entropyTypeStr = getEntropyTypeStr(entropy);
|
||||
var wordCount = Math.floor(numberOfBits / 32) * 3;
|
||||
var bitsPerEvent = entropy.bitsPerEvent.toFixed(2);
|
||||
var spacedBinaryStr = addSpacesEveryElevenBits(entropy.binaryStr);
|
||||
DOM.entropyFiltered.html(entropy.cleanHtml);
|
||||
DOM.entropyType.text(entropyTypeStr);
|
||||
DOM.entropyCrackTime.text(timeToCrack);
|
||||
DOM.entropyEventCount.text(entropy.base.ints.length);
|
||||
DOM.entropyBits.text(numberOfBits);
|
||||
DOM.entropyWordCount.text(wordCount);
|
||||
DOM.entropyBinary.text(entropy.binaryStr);
|
||||
DOM.entropyBinary.text(spacedBinaryStr);
|
||||
DOM.entropyBitsPerEvent.text(bitsPerEvent);
|
||||
// detect and warn of filtering
|
||||
var rawNoSpaces = DOM.entropy.val().replace(/\s/g, "");
|
||||
@@ -1284,6 +1365,10 @@
|
||||
return DOM.bip49tab.hasClass("active");
|
||||
}
|
||||
|
||||
function bip84TabSelected() {
|
||||
return DOM.bip84tab.hasClass("active");
|
||||
}
|
||||
|
||||
function bip141TabSelected() {
|
||||
return DOM.bip141tab.hasClass("active");
|
||||
}
|
||||
@@ -1291,6 +1376,7 @@
|
||||
function setHdCoin(coinValue) {
|
||||
DOM.bip44coin.val(coinValue);
|
||||
DOM.bip49coin.val(coinValue);
|
||||
DOM.bip84coin.val(coinValue);
|
||||
}
|
||||
|
||||
function showSegwitAvailable() {
|
||||
@@ -1374,7 +1460,68 @@
|
||||
DOM.entropyWordIndexes.text(wordIndexesStr);
|
||||
}
|
||||
|
||||
function showChecksum() {
|
||||
var phrase = DOM.phrase.val();
|
||||
var words = phraseToWordArray(phrase);
|
||||
var checksumBitlength = words.length / 3;
|
||||
var checksum = "";
|
||||
var binaryStr = "";
|
||||
var language = getLanguage();
|
||||
for (var i=words.length-1; i>=0; i--) {
|
||||
var word = words[i];
|
||||
var wordIndex = WORDLISTS[language].indexOf(word);
|
||||
var wordBinary = wordIndex.toString(2);
|
||||
while (wordBinary.length < 11) {
|
||||
wordBinary = "0" + wordBinary;
|
||||
}
|
||||
var binaryStr = wordBinary + binaryStr;
|
||||
if (binaryStr.length >= checksumBitlength) {
|
||||
var start = binaryStr.length - checksumBitlength;
|
||||
var end = binaryStr.length;
|
||||
checksum = binaryStr.substring(start, end);
|
||||
// add spaces so the last group is 11 bits, not the first
|
||||
checksum = checksum.split("").reverse().join("")
|
||||
checksum = addSpacesEveryElevenBits(checksum);
|
||||
checksum = checksum.split("").reverse().join("")
|
||||
break;
|
||||
}
|
||||
}
|
||||
DOM.entropyChecksum.text(checksum);
|
||||
}
|
||||
|
||||
function updateCsv() {
|
||||
var tableCsv = "path,address,public key,private key\n";
|
||||
var rows = DOM.addresses.find("tr");
|
||||
for (var i=0; i<rows.length; i++) {
|
||||
var row = $(rows[i]);
|
||||
var cells = row.find("td");
|
||||
for (var j=0; j<cells.length; j++) {
|
||||
var cell = $(cells[j]);
|
||||
if (!cell.children().hasClass("invisible")) {
|
||||
tableCsv = tableCsv + cell.text();
|
||||
}
|
||||
if (j != cells.length - 1) {
|
||||
tableCsv = tableCsv + ",";
|
||||
}
|
||||
}
|
||||
tableCsv = tableCsv + "\n";
|
||||
}
|
||||
DOM.csv.val(tableCsv);
|
||||
}
|
||||
|
||||
function addSpacesEveryElevenBits(binaryStr) {
|
||||
return binaryStr.match(/.{1,11}/g).join(" ");
|
||||
}
|
||||
|
||||
var networks = [
|
||||
{
|
||||
name: "AXE - Axe",
|
||||
segwitAvailable: false,
|
||||
onSelect: function() {
|
||||
network = bitcoinjs.bitcoin.networks.axe;
|
||||
setHdCoin(0);
|
||||
},
|
||||
},
|
||||
{
|
||||
name: "BCH - Bitcoin Cash",
|
||||
segwitAvailable: false,
|
||||
@@ -1384,6 +1531,14 @@
|
||||
setHdCoin(145);
|
||||
},
|
||||
},
|
||||
{
|
||||
name: "BLK - BlackCoin",
|
||||
segwitAvailable: false,
|
||||
onSelect: function() {
|
||||
network = bitcoinjs.bitcoin.networks.blackcoin;
|
||||
setHdCoin(10);
|
||||
},
|
||||
},
|
||||
{
|
||||
name: "BTC - Bitcoin",
|
||||
segwitAvailable: true,
|
||||
@@ -1440,6 +1595,14 @@
|
||||
setHdCoin(1);
|
||||
},
|
||||
},
|
||||
{
|
||||
name: "DNR - Denarius",
|
||||
segwitAvailable: false,
|
||||
onSelect: function() {
|
||||
network = bitcoinjs.bitcoin.networks.denarius;
|
||||
setHdCoin(116);
|
||||
},
|
||||
},
|
||||
{
|
||||
name: "DOGE - Dogecoin",
|
||||
segwitAvailable: false,
|
||||
@@ -1480,6 +1643,14 @@
|
||||
setHdCoin(26);
|
||||
},
|
||||
},
|
||||
{
|
||||
name: "KMD - Komodo",
|
||||
bip49available: false,
|
||||
onSelect: function() {
|
||||
network = bitcoinjs.bitcoin.networks.komodo;
|
||||
setHdCoin(141);
|
||||
},
|
||||
},
|
||||
{
|
||||
name: "LTC - Litecoin",
|
||||
segwitAvailable: true,
|
||||
@@ -1513,6 +1684,14 @@
|
||||
setHdCoin(7);
|
||||
},
|
||||
},
|
||||
{
|
||||
name: "ONX - Onixcoin",
|
||||
segwitAvailable: false,
|
||||
onSelect: function() {
|
||||
network = bitcoinjs.bitcoin.networks.onixcoin;
|
||||
setHdCoin(174);
|
||||
},
|
||||
},
|
||||
{
|
||||
name: "PIVX - PIVX",
|
||||
segwitAvailable: false,
|
||||
@@ -1608,7 +1787,7 @@
|
||||
network = bitcoinjs.bitcoin.networks.bitcoin;
|
||||
setHdCoin(144);
|
||||
},
|
||||
}
|
||||
},
|
||||
]
|
||||
|
||||
var clients = [
|
||||
|
||||
@@ -149,21 +149,14 @@ var Mnemonic = function(language) {
|
||||
// Set space correctly depending on the language
|
||||
// see https://github.com/bitcoin/bips/blob/master/bip-0039/bip-0039-wordlists.md#japanese
|
||||
var space = " ";
|
||||
if (language == "japanese") {
|
||||
if (language == "japanese" || language == "korean") {
|
||||
space = "\u3000"; // ideographic space
|
||||
}
|
||||
return words.join(space);
|
||||
}
|
||||
|
||||
self.normalizeString = function(str) {
|
||||
if (typeof str.normalize == "function") {
|
||||
return str.normalize("NFKD");
|
||||
}
|
||||
else {
|
||||
// TODO decide how to handle this in the future.
|
||||
// https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/normalize
|
||||
return str;
|
||||
}
|
||||
return str.normalize("NFKD");
|
||||
}
|
||||
|
||||
function byteArrayToWordArray(data) {
|
||||
|
||||
@@ -1,3 +1,6 @@
|
||||
// Polyfill for NFKD normalization
|
||||
// See https://github.com/walling/unorm
|
||||
|
||||
(function (root) {
|
||||
"use strict";
|
||||
|
||||
|
||||
2051
src/js/wordlist_korean.js
Normal file
2051
src/js/wordlist_korean.js
Normal file
File diff suppressed because it is too large
Load Diff
@@ -30,9 +30,10 @@ var until = webdriver.until;
|
||||
var newDriver = null;
|
||||
var driver = null;
|
||||
// Delays in ms
|
||||
var generateDelay = 1000;
|
||||
var generateDelay = 1500;
|
||||
var feedbackDelay = 500;
|
||||
var entropyFeedbackDelay = 500;
|
||||
var bip38delay = 15000;
|
||||
|
||||
// url uses file:// scheme
|
||||
var path = require('path')
|
||||
@@ -422,6 +423,13 @@ it('Allows selection of dogecoin', function(done) {
|
||||
};
|
||||
testNetwork(done, params);
|
||||
});
|
||||
it('Allows selection of denarius', function(done) {
|
||||
var params = {
|
||||
selectText: "DNR - Denarius",
|
||||
firstAddress: "DFdFMVUMzU9xX88EywXvAGwjiwpxyh9vKb",
|
||||
};
|
||||
testNetwork(done, params);
|
||||
});
|
||||
it('Allows selection of shadowcash', function(done) {
|
||||
var params = {
|
||||
selectText: "SDC - ShadowCash",
|
||||
@@ -492,6 +500,13 @@ it('Allows selection of game', function(done) {
|
||||
};
|
||||
testNetwork(done, params);
|
||||
});
|
||||
it('Allows selection of komodo', function(done) {
|
||||
var params = {
|
||||
selectText: "KMD - Komodo",
|
||||
firstAddress: "RMPPzJwAjPVZZAwJvXivHJGGjdCx6WBD2t",
|
||||
};
|
||||
testNetwork(done, params);
|
||||
});
|
||||
it('Allows selection of namecoin', function(done) {
|
||||
var params = {
|
||||
selectText: "NMC - Namecoin",
|
||||
@@ -499,6 +514,13 @@ it('Allows selection of namecoin', function(done) {
|
||||
};
|
||||
testNetwork(done, params);
|
||||
});
|
||||
it('Allows selection of onixcoin', function(done) {
|
||||
var params = {
|
||||
selectText: "ONX - Onixcoin",
|
||||
firstAddress: "XGwMqddeKjT3ddgX73QokjVbCL3aK6Yxfk",
|
||||
};
|
||||
testNetwork(done, params);
|
||||
});
|
||||
it('Allows selection of peercoin', function(done) {
|
||||
var params = {
|
||||
selectText: "PPC - Peercoin",
|
||||
@@ -591,6 +613,20 @@ it('Allows selection of monacoin', function(done) {
|
||||
};
|
||||
testNetwork(done, params);
|
||||
});
|
||||
it('Allows selection of AXE', function(done) {
|
||||
var params = {
|
||||
selectText: "AXE - Axe",
|
||||
firstAddress: "XQ4HLxUVS3egk5ff1o9e2vJFJKSSsUH3B7",
|
||||
};
|
||||
testNetwork(done, params);
|
||||
});
|
||||
it('Allows selection of BlackCoin', function(done) {
|
||||
var params = {
|
||||
selectText: "BLK - BlackCoin",
|
||||
firstAddress: "B5MznAKwj7uQ42vDz3w4onhBXPcqhTwJ9z",
|
||||
};
|
||||
testNetwork(done, params);
|
||||
});
|
||||
|
||||
// BIP39 seed is set from phrase
|
||||
it('Sets the bip39 seed from the prhase', function(done) {
|
||||
@@ -919,13 +955,13 @@ it('Can generate more rows in the table', function(done) {
|
||||
|
||||
// A custom number of additional addresses can be generated
|
||||
it('Can generate more rows in the table', function(done) {
|
||||
driver.findElement(By.css('.rows-to-add'))
|
||||
.clear();
|
||||
driver.findElement(By.css('.rows-to-add'))
|
||||
.sendKeys('1');
|
||||
driver.findElement(By.css('.phrase'))
|
||||
.sendKeys('abandon abandon ability');
|
||||
driver.sleep(generateDelay).then(function() {
|
||||
driver.findElement(By.css('.rows-to-add'))
|
||||
.clear();
|
||||
driver.findElement(By.css('.rows-to-add'))
|
||||
.sendKeys('1');
|
||||
driver.findElement(By.css('.more'))
|
||||
.click();
|
||||
driver.sleep(generateDelay).then(function() {
|
||||
@@ -2145,10 +2181,11 @@ it('Can change details while old addresses are still being generated', function(
|
||||
driver.findElement(By.css('.phrase'))
|
||||
.sendKeys("abandon abandon ability");
|
||||
driver.sleep(generateDelay).then(function() {
|
||||
// generate more addresses
|
||||
driver.findElement(By.css('.more'))
|
||||
.click();
|
||||
// change tabs which should cancel the previous generating
|
||||
driver.findElement(By.css('.rows-to-add'))
|
||||
.clear();
|
||||
driver.findElement(By.css('.rows-to-add'))
|
||||
.sendKeys('20');
|
||||
driver.findElement(By.css('#bip32-tab a'))
|
||||
.click()
|
||||
driver.sleep(generateDelay).then(function() {
|
||||
@@ -2161,7 +2198,7 @@ it('Can change details while old addresses are still being generated', function(
|
||||
});
|
||||
});
|
||||
});
|
||||
});
|
||||
}, generateDelay + 5000);
|
||||
|
||||
// Github issue 49
|
||||
// padding for binary should give length with multiple of 256
|
||||
@@ -2670,4 +2707,251 @@ it('Shows the index of each word in the mnemonic', function(done) {
|
||||
});
|
||||
});
|
||||
|
||||
it('Shows the derivation path for bip84 tab', function(done) {
|
||||
driver.findElement(By.css('#bip84-tab a'))
|
||||
.click()
|
||||
driver.findElement(By.css('.phrase'))
|
||||
.sendKeys('abandon abandon ability');
|
||||
driver.sleep(generateDelay).then(function() {
|
||||
driver.findElement(By.css('#bip84 .path'))
|
||||
.getAttribute("value")
|
||||
.then(function(path) {
|
||||
expect(path).toBe("m/84'/0'/0'/0");
|
||||
done();
|
||||
})
|
||||
});
|
||||
});
|
||||
|
||||
it('Shows the extended private key for bip84 tab', function(done) {
|
||||
driver.findElement(By.css('#bip84-tab a'))
|
||||
.click()
|
||||
driver.findElement(By.css('.phrase'))
|
||||
.sendKeys('abandon abandon ability');
|
||||
driver.sleep(generateDelay).then(function() {
|
||||
driver.findElement(By.css('.extended-priv-key'))
|
||||
.getAttribute("value")
|
||||
.then(function(path) {
|
||||
expect(path).toBe("zprvAev3RKrZ3QVKiUFCfdeMRen1BPDJgdNt1XpxiDy8acSs4kkAGTCvq7HeRYRNNpo8EtEjCFQBWavJwtCUR29y4TUCH4X5RXMcyq48uN8y9BP");
|
||||
done();
|
||||
})
|
||||
});
|
||||
});
|
||||
|
||||
it('Shows the extended public key for bip84 tab', function(done) {
|
||||
driver.findElement(By.css('#bip84-tab a'))
|
||||
.click()
|
||||
driver.findElement(By.css('.phrase'))
|
||||
.sendKeys('abandon abandon ability');
|
||||
driver.sleep(generateDelay).then(function() {
|
||||
driver.findElement(By.css('.extended-pub-key'))
|
||||
.getAttribute("value")
|
||||
.then(function(path) {
|
||||
expect(path).toBe("zpub6suPpqPSsn3cvxKfmfBMnnijjR3o666jNkkZWcNk8wyqwZ5JozXBNuc8Gs7DB3uLwTDvGVTspVEAUQcEjKF3pZHgywVbubdTqbXTUg7usyx");
|
||||
done();
|
||||
})
|
||||
});
|
||||
});
|
||||
|
||||
it('Changes the address list if bip84 account is changed', function(done) {
|
||||
driver.findElement(By.css('#bip84-tab a'))
|
||||
.click()
|
||||
driver.findElement(By.css('#bip84 .account'))
|
||||
.sendKeys('1');
|
||||
driver.findElement(By.css('.phrase'))
|
||||
.sendKeys('abandon abandon ability');
|
||||
driver.sleep(generateDelay).then(function() {
|
||||
getFirstAddress(function(address) {
|
||||
expect(address).toBe("bc1qp7vv669t2fy965jdzvqwrraana89ctd5ewc662");
|
||||
done();
|
||||
});
|
||||
});
|
||||
});
|
||||
|
||||
it('Changes the address list if bip84 change is changed', function(done) {
|
||||
driver.findElement(By.css('#bip84-tab a'))
|
||||
.click()
|
||||
driver.findElement(By.css('#bip84 .change'))
|
||||
.sendKeys('1');
|
||||
driver.findElement(By.css('.phrase'))
|
||||
.sendKeys('abandon abandon ability');
|
||||
driver.sleep(generateDelay).then(function() {
|
||||
getFirstAddress(function(address) {
|
||||
expect(address).toBe("bc1qr39vj6rh06ff05m53uxq8uazehwhccswylhrs2");
|
||||
done();
|
||||
});
|
||||
});
|
||||
});
|
||||
|
||||
it('Passes the official BIP84 test spec for rootpriv', function(done) {
|
||||
driver.findElement(By.css('#bip84-tab a'))
|
||||
.click()
|
||||
driver.findElement(By.css('.phrase'))
|
||||
.sendKeys('abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon about');
|
||||
driver.sleep(generateDelay).then(function() {
|
||||
driver.findElement(By.css(".root-key"))
|
||||
.getAttribute("value")
|
||||
.then(function(rootKey) {
|
||||
expect(rootKey).toBe("zprvAWgYBBk7JR8Gjrh4UJQ2uJdG1r3WNRRfURiABBE3RvMXYSrRJL62XuezvGdPvG6GFBZduosCc1YP5wixPox7zhZLfiUm8aunE96BBa4Kei5");
|
||||
done();
|
||||
})
|
||||
});
|
||||
});
|
||||
|
||||
it('Passes the official BIP84 test spec for account 0 xprv', function(done) {
|
||||
driver.findElement(By.css('#bip84-tab a'))
|
||||
.click()
|
||||
driver.findElement(By.css('.phrase'))
|
||||
.sendKeys('abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon about');
|
||||
driver.sleep(generateDelay).then(function() {
|
||||
driver.findElement(By.css("#bip84 .account-xprv"))
|
||||
.getAttribute("value")
|
||||
.then(function(rootKey) {
|
||||
expect(rootKey).toBe("zprvAdG4iTXWBoARxkkzNpNh8r6Qag3irQB8PzEMkAFeTRXxHpbF9z4QgEvBRmfvqWvGp42t42nvgGpNgYSJA9iefm1yYNZKEm7z6qUWCroSQnE");
|
||||
done();
|
||||
})
|
||||
});
|
||||
});
|
||||
|
||||
it('Passes the official BIP84 test spec for account 0 xpub', function(done) {
|
||||
driver.findElement(By.css('#bip84-tab a'))
|
||||
.click()
|
||||
driver.findElement(By.css('.phrase'))
|
||||
.sendKeys('abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon about');
|
||||
driver.sleep(generateDelay).then(function() {
|
||||
driver.findElement(By.css("#bip84 .account-xpub"))
|
||||
.getAttribute("value")
|
||||
.then(function(rootKey) {
|
||||
expect(rootKey).toBe("zpub6rFR7y4Q2AijBEqTUquhVz398htDFrtymD9xYYfG1m4wAcvPhXNfE3EfH1r1ADqtfSdVCToUG868RvUUkgDKf31mGDtKsAYz2oz2AGutZYs");
|
||||
done();
|
||||
})
|
||||
});
|
||||
});
|
||||
|
||||
it('Passes the official BIP84 test spec for account 0 first address', function(done) {
|
||||
driver.findElement(By.css('#bip84-tab a'))
|
||||
.click()
|
||||
driver.findElement(By.css('.phrase'))
|
||||
.sendKeys('abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon about');
|
||||
driver.sleep(generateDelay).then(function() {
|
||||
getFirstAddress(function(address) {
|
||||
expect(address).toBe("bc1qcr8te4kr609gcawutmrza0j4xv80jy8z306fyu");
|
||||
done();
|
||||
});
|
||||
});
|
||||
});
|
||||
|
||||
it('Passes the official BIP84 test spec for account 0 first change address', function(done) {
|
||||
driver.findElement(By.css('#bip84-tab a'))
|
||||
.click()
|
||||
driver.findElement(By.css('.phrase'))
|
||||
.sendKeys('abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon about');
|
||||
driver.findElement(By.css('#bip84 .change'))
|
||||
.sendKeys('1');
|
||||
driver.sleep(generateDelay).then(function() {
|
||||
getFirstAddress(function(address) {
|
||||
expect(address).toBe("bc1q8c6fshw2dlwun7ekn9qwf37cu2rn755upcp6el");
|
||||
done();
|
||||
});
|
||||
});
|
||||
});
|
||||
|
||||
it('Can display the table as csv', function(done) {
|
||||
var headings = "path,address,public key,private key";
|
||||
var row1 = "m/44'/0'/0'/0/0,1Di3Vp7tBWtyQaDABLAjfWtF6V7hYKJtug,033f5aed5f6cfbafaf223188095b5980814897295f723815fea5d3f4b648d0d0b3,L26cVSpWFkJ6aQkPkKmTzLqTdLJ923e6CzrVh9cmx21QHsoUmrEE";
|
||||
var row20 = "m/44'/0'/0'/0/19,1KhBy28XLAciXnnRvm71PvQJaETyrxGV55,02b4b3e396434d8cdd20c03ac4aaa07387784d5d867b75987f516f5705ee68cb3a,L4GrDrjReMsCAu5DkLXn79jSb95qR7Zfx7eshybCQZ1qL32MXJab";
|
||||
driver.findElement(By.css('.phrase'))
|
||||
.sendKeys('abandon abandon ability');
|
||||
driver.sleep(generateDelay).then(function() {
|
||||
driver.findElement(By.css('.csv'))
|
||||
.getAttribute("value")
|
||||
.then(function(csv) {
|
||||
expect(csv).toContain(headings);
|
||||
expect(csv).toContain(row1);
|
||||
expect(csv).toContain(row20);
|
||||
done();
|
||||
});
|
||||
});
|
||||
});
|
||||
|
||||
it('LeftPads ethereum keys that are less than 32 bytes', function(done) {
|
||||
// see https://github.com/iancoleman/bip39/issues/155
|
||||
selectNetwork("ETH - Ethereum");
|
||||
driver.findElement(By.css('#bip32-tab a'))
|
||||
.click()
|
||||
driver.findElement(By.css('#bip32-path'))
|
||||
.clear();
|
||||
driver.findElement(By.css('#bip32-path'))
|
||||
.sendKeys("m/44'/60'/0'");
|
||||
driver.findElement(By.css('.phrase'))
|
||||
.sendKeys('scout sort custom elite radar rare vivid thing trophy gesture cover snake change narrow kite list nation sustain buffalo erode open balance system young');
|
||||
driver.sleep(generateDelay).then(function() {
|
||||
getFirstAddress(function(address) {
|
||||
expect(address).toBe("0x8943E785B4a5714FC87a3aFAad1eB1FeB602B118");
|
||||
done();
|
||||
});
|
||||
});
|
||||
});
|
||||
|
||||
it('Can encrypt private keys using BIP38', function(done) {
|
||||
// see https://github.com/iancoleman/bip39/issues/140
|
||||
driver.executeScript(function() {
|
||||
$(".use-bip38").prop("checked", true);
|
||||
});
|
||||
driver.findElement(By.css('.bip38-password'))
|
||||
.sendKeys('bip38password');
|
||||
driver.findElement(By.css('.rows-to-add'))
|
||||
.clear();
|
||||
driver.findElement(By.css('.rows-to-add'))
|
||||
.sendKeys('1');
|
||||
driver.findElement(By.css('.phrase'))
|
||||
.sendKeys('abandon abandon ability');
|
||||
driver.sleep(bip38delay).then(function() {
|
||||
// address
|
||||
getFirstRowValue(function(address) {
|
||||
expect(address).toBe("1NCvSdumA3ngMM9c4aqU56AM6rqXddfuXB");
|
||||
// pubkey
|
||||
getFirstRowValue(function(pubkey) {
|
||||
expect(pubkey).toBe("043f5aed5f6cfbafaf223188095b5980814897295f723815fea5d3f4b648d0d0b3884a74447ea901729b1e73a999b7520e7cb55b4120e6432c64153ccab8a848e1");
|
||||
// privkey
|
||||
getFirstRowValue(function(privkey) {
|
||||
expect(privkey).toBe("6PRNRiFnj1RoR3sXhymdCvoZCgnUHQpfupNdKkFbWJkwWQEKesWt1EDMDM");
|
||||
done();
|
||||
}, ".privkey");
|
||||
}, ".pubkey");
|
||||
}, ".address");
|
||||
});
|
||||
}, bip38delay + 5000);
|
||||
|
||||
it('Shows the checksum for the entropy', function(done) {
|
||||
driver.findElement(By.css('.use-entropy'))
|
||||
.click();
|
||||
driver.findElement(By.css('.entropy'))
|
||||
.sendKeys("00000000000000000000000000000000");
|
||||
driver.sleep(generateDelay).then(function() {
|
||||
driver.findElement(By.css('.checksum'))
|
||||
.getText()
|
||||
.then(function(text) {
|
||||
expect(text).toBe("1");
|
||||
done();
|
||||
});
|
||||
});
|
||||
});
|
||||
|
||||
it('Shows the checksum for the entropy with the correct groupings', function(done) {
|
||||
driver.findElement(By.css('.use-entropy'))
|
||||
.click();
|
||||
// create a checksum of 20 bits, which spans multiple words
|
||||
driver.findElement(By.css('.entropy'))
|
||||
.sendKeys("F000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000");
|
||||
driver.sleep(generateDelay).then(function() {
|
||||
driver.findElement(By.css('.checksum'))
|
||||
.getText()
|
||||
.then(function(text) {
|
||||
// first group is 9 bits, second group is 11
|
||||
expect(text).toBe("011010111 01110000110");
|
||||
done();
|
||||
});
|
||||
});
|
||||
});
|
||||
|
||||
});
|
||||
|
||||
Reference in New Issue
Block a user