mirror of
https://github.com/OneKeyHQ/bip39.git
synced 2026-04-06 19:03:49 +00:00
Compare commits
59 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
1102f20135 | ||
|
|
fb00a22d3f | ||
|
|
73b8724a6f | ||
|
|
8890d0f4c3 | ||
|
|
6e67990522 | ||
|
|
9ff30babbc | ||
|
|
ee0981f1ec | ||
|
|
6024e655a8 | ||
|
|
7e6bdc498e | ||
|
|
16b4c2788a | ||
|
|
0197de2795 | ||
|
|
861750ae51 | ||
|
|
a40d59d904 | ||
|
|
d933c3f731 | ||
|
|
408ecc184a | ||
|
|
00114002fe | ||
|
|
e80955983d | ||
|
|
f20b7e7128 | ||
|
|
908dc06fe8 | ||
|
|
3d548c6f9b | ||
|
|
0a8d06d03e | ||
|
|
88311463c7 | ||
|
|
cd7c8327b1 | ||
|
|
0cda44d5f6 | ||
|
|
7258b102c1 | ||
|
|
8d18f379fd | ||
|
|
3abab9b087 | ||
|
|
b18eb97ae3 | ||
|
|
88ea3e40ee | ||
|
|
8a9f391376 | ||
|
|
e40acc3ab0 | ||
|
|
56ad960105 | ||
|
|
f128bd58c4 | ||
|
|
0eda54f5a7 | ||
|
|
ed6d9d3905 | ||
|
|
47b64d3ee1 | ||
|
|
bc33f5ee53 | ||
|
|
c0df01895d | ||
|
|
b3cc3930d0 | ||
|
|
c18511dd0d | ||
|
|
7ebdf61c99 | ||
|
|
daab55dc61 | ||
|
|
7b742f87d3 | ||
|
|
4d9c184a84 | ||
|
|
d5e01cc6e2 | ||
|
|
adedbf9169 | ||
|
|
f36d10080a | ||
|
|
8335cf17bc | ||
|
|
9987f0c184 | ||
|
|
d2fea262c3 | ||
|
|
6c08f364b3 | ||
|
|
fa2e4e936e | ||
|
|
684624b522 | ||
|
|
33b3dd47aa | ||
|
|
a0091a40c4 | ||
|
|
039a98ba5a | ||
|
|
9dab7e5d0c | ||
|
|
534481b628 | ||
|
|
0921f37077 |
23782
bip39-standalone.html
23782
bip39-standalone.html
File diff suppressed because it is too large
Load Diff
57
changelog.md
57
changelog.md
@@ -1,3 +1,60 @@
|
||||
#0.2.7
|
||||
|
||||
* Add Fujicoin
|
||||
* List alternative tools
|
||||
* Remove unused translations and library
|
||||
|
||||
# 0.2.6
|
||||
|
||||
* Detect and warn when entropy is filtered / discarded
|
||||
* Reword entropy text to indicate using a single source only
|
||||
* Add BIP49 to More Info section
|
||||
* Update compile script to work across python 2 and 3
|
||||
* QR Codes use correctLevel 3 instead of 2
|
||||
* Source map removed from zxcvbn
|
||||
* Tidy up code with consistent use of commas and semicolons
|
||||
|
||||
# 0.2.5
|
||||
|
||||
* Rename variables for clarity between BIP49 and P2WPKH Nested In P2SH
|
||||
* Fix bug for validation of root key when using non-bitcoin networks
|
||||
* Add option to use P2WPKH Nested In P2SH addresses on BIP32 tab
|
||||
|
||||
# 0.2.4
|
||||
|
||||
* Show error when using xpub with hardened addresses
|
||||
* Allow switching litecoin prefixes between xprv and Ltpv
|
||||
|
||||
# 0.2.3
|
||||
|
||||
* Add maza coin
|
||||
|
||||
# 0.2.2
|
||||
|
||||
* Improve showing feedback for pending calculations
|
||||
* Bugfix: Clear old seed when mnemonic is changed
|
||||
* Add PIVX network
|
||||
|
||||
# 0.2.1
|
||||
|
||||
* BTC is the default coin
|
||||
* Add myriadcoin
|
||||
* Add Bitcon Cash
|
||||
|
||||
# 0.2.0
|
||||
|
||||
* BitcoinJS library upgrded to v3.1.1
|
||||
* Tab order is alphabetical
|
||||
* BIP44 'purpose' and 'coin' fields are readonly
|
||||
* Refactor method to clear old data from the display
|
||||
* BIP49 support
|
||||
* Release process is documented
|
||||
|
||||
# 0.1.2
|
||||
|
||||
* Add Crown network
|
||||
* Network names are displayed with currency code
|
||||
|
||||
# 0.1.1
|
||||
|
||||
* Add DASH Testnet
|
||||
|
||||
@@ -1,6 +1,7 @@
|
||||
import os
|
||||
import re
|
||||
import datetime
|
||||
from io import open
|
||||
|
||||
# This script generates the bip39-standalone.html file.
|
||||
|
||||
|
||||
@@ -55,7 +55,10 @@ at 1PC9aZC4hNX2rmmrt7uHTfYAS3hRbph4UN
|
||||
Please do not make modifications to `bip39-standalone.html`, since they will
|
||||
be overwritten by `compile.py`.
|
||||
|
||||
Make changes in `src/*` and apply them using the command `python compile.py`
|
||||
Make changes in `src/*`.
|
||||
|
||||
Changes are applied during release using the command `python compile.py`, so
|
||||
please do not commit changes to `bip39-standalone.html`
|
||||
|
||||
# Tests
|
||||
|
||||
|
||||
23
release_process.md
Normal file
23
release_process.md
Normal file
@@ -0,0 +1,23 @@
|
||||
Once all code changes for this version have been committed, a release can be
|
||||
created with the following steps:
|
||||
|
||||
1. Run tests and ensure all tests pass
|
||||
1. Set the version in index.html
|
||||
1. Update changelog
|
||||
1. Run `python compile.py`
|
||||
1. Commit these changes with message `Release vX.Y.Z`
|
||||
1. Tag the commit `git tag X.Y.Z`
|
||||
1. Get the hash of the file `sha256sum bip39-standalone.html`
|
||||
1. Create the text for the release notes (see prior releases)
|
||||
1. Sign the release notes `gpg --clearsign /tmp/signature.txt`
|
||||
1. Push the changes `git push`
|
||||
1. Push the new tag `git push --tags`
|
||||
1. Create a release on github from the tagged commit
|
||||
1. include the signed release notes as text for the release
|
||||
1. include the changelog for this release as text for the release
|
||||
1. attach signature.txt.asc
|
||||
1. attach the bip39-standalone.html file
|
||||
1. Add a new post to twitter from @bip39tool with the version, link and hash
|
||||
1. Publish to any hosted locations (eg iancoleman.github.io/bip39)
|
||||
1. Download the file from the release and confirm it hashes to the expected value `sha256sum bip39-standalone.html`
|
||||
1. Download the signature from the release and verify it. `gpg --verify signature.txt.asc`
|
||||
376
src/index.html
376
src/index.html
@@ -114,7 +114,7 @@
|
||||
<div class="container">
|
||||
|
||||
<h1 class="text-center">Mnemonic Code Converter</h1>
|
||||
<p class="version">v0.1.1</p>
|
||||
<p class="version">v0.2.7</p>
|
||||
<hr>
|
||||
<div class="row">
|
||||
<div class="col-md-12">
|
||||
@@ -123,8 +123,8 @@
|
||||
<div class="form-group">
|
||||
<div class="col-sm-2"></div>
|
||||
<div class="col-sm-10">
|
||||
<p data-translate>You can enter an existing BIP39 mnemonic, or generate a new random one. Typing your own twelve words will probably not work how you expect, since the words require a particular structure (the last word is a checksum).</p>
|
||||
<p data-translate-html>
|
||||
<p>You can enter an existing BIP39 mnemonic, or generate a new random one. Typing your own twelve words will probably not work how you expect, since the words require a particular structure (the last word is a checksum).</p>
|
||||
<p>
|
||||
For more info see the
|
||||
<a href="https://github.com/bitcoin/bips/blob/master/bip-0039.mediawiki" target="_blank">BIP39 spec</a>.
|
||||
</p>
|
||||
@@ -135,7 +135,7 @@
|
||||
<div class="col-sm-10">
|
||||
<div class="form-inline">
|
||||
<div class="input-group-inline">
|
||||
<span data-translate>Generate a random mnemonic, or enter your own below</span>:
|
||||
<span>Generate a random mnemonic, or enter your own below</span>:
|
||||
<button class="btn generate">Generate</button>
|
||||
<select id="strength" class="strength form-control">
|
||||
<option value="3">3</option>
|
||||
@@ -147,66 +147,73 @@
|
||||
<option value="21">21</option>
|
||||
<option value="24">24</option>
|
||||
</select>
|
||||
<span data-translate>words</span>
|
||||
<span>words</span>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="entropy-container hidden">
|
||||
<div class="form-group text-danger">
|
||||
<label class="col-sm-2 control-label" data-translate>Warning</label>
|
||||
<label class="col-sm-2 control-label">Warning</label>
|
||||
<div class="col-sm-10 form-control-static">
|
||||
<span data-translate>Entropy is an advanced feature. Your mnemonic may be insecure if this feature is used incorrectly.</span>
|
||||
<a href="#entropy-notes" data-translate>Read more</a>
|
||||
<span>Entropy is an advanced feature. Your mnemonic may be insecure if this feature is used incorrectly.</span>
|
||||
<a href="#entropy-notes">Read more</a>
|
||||
</div>
|
||||
</div>
|
||||
<div class="form-group">
|
||||
<label for="entropy" class="col-sm-2 control-label" data-translate>Entropy</label>
|
||||
<label for="entropy" class="col-sm-2 control-label">Entropy</label>
|
||||
<div class="col-sm-7">
|
||||
<textarea id="entropy" rows="2" class="entropy form-control" placeholder="Accepts binary, base 6, 6-sided dice, base 10, hexadecimal, cards" data-translate-placeholder></textarea>
|
||||
<textarea id="entropy" rows="2" class="entropy form-control" placeholder="Accepts either binary, base 6, 6-sided dice, base 10, hexadecimal or cards"></textarea>
|
||||
<div class="row filter-warning text-danger hidden">
|
||||
<p class="col-sm-12">
|
||||
<strong>
|
||||
Some characters have been discarded
|
||||
</strong>
|
||||
</p>
|
||||
</div>
|
||||
<div class="row">
|
||||
<label class="col-sm-3 control-label" data-translate><span class="more-info" data-translate-title title="Based on estimates from zxcvbn using Filtered Entropy">Time To Crack</span></label>
|
||||
<label class="col-sm-3 control-label"><span class="more-info" title="Based on estimates from zxcvbn using Filtered Entropy">Time To Crack</span></label>
|
||||
<div class="crack-time col-sm-3 form-control-static"></div>
|
||||
<label class="col-sm-3 control-label" data-translate>Event Count</label>
|
||||
<label class="col-sm-3 control-label">Event Count</label>
|
||||
<div class="event-count col-sm-3 form-control-static"></div>
|
||||
</div>
|
||||
<div class="row">
|
||||
<label class="col-sm-3 control-label" data-translate>Entropy Type</label>
|
||||
<label class="col-sm-3 control-label">Entropy Type</label>
|
||||
<div class="type col-sm-3 form-control-static"></div>
|
||||
<label class="col-sm-3 control-label" data-translate>Bits Per Event</label>
|
||||
<label class="col-sm-3 control-label">Bits Per Event</label>
|
||||
<div class="bits-per-event col-sm-3 form-control-static"></div>
|
||||
</div>
|
||||
<div class="row">
|
||||
<label class="col-sm-3 control-label" data-translate>Raw Entropy Words</label>
|
||||
<label class="col-sm-3 control-label">Raw Entropy Words</label>
|
||||
<div class="word-count col-sm-3 form-control-static"></div>
|
||||
<label class="col-sm-3 control-label" data-translate><span class="more-info" data-translate-title title="Total bits of entropy may be less than indicated if any entropy event uses a weak source.">Total Bits</span></label>
|
||||
<label class="col-sm-3 control-label"><span class="more-info" title="Total bits of entropy may be less than indicated if any entropy event uses a weak source.">Total Bits</span></label>
|
||||
<div class="bits col-sm-3 form-control-static"></div>
|
||||
</div>
|
||||
<label class="col-sm-3 control-label" data-translate>Filtered Entropy</label>
|
||||
<label class="col-sm-3 control-label">Filtered Entropy</label>
|
||||
<div class="filtered col-sm-9 form-control-static"></div>
|
||||
<label class="col-sm-3 control-label" data-translate>Raw Binary</label>
|
||||
<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" data-translate>Mnemonic Length</label>
|
||||
<label class="col-sm-3 control-label">Mnemonic Length</label>
|
||||
<div class="col-sm-9">
|
||||
<select class="mnemonic-length form-control">
|
||||
<option value="raw" selected data-translate>Use Raw Entropy (3 words per 32 bits)</option>
|
||||
<option value="12">12 <span data-translate>Words</span></option>
|
||||
<option value="15">15 <span data-translate>Words</option>
|
||||
<option value="18">18 <span data-translate>Words</span></option>
|
||||
<option value="21">21 <span data-translate>Words</span></option>
|
||||
<option value="24">24 <span data-translate>Words</span></option>
|
||||
<option value="raw" selected>Use Raw Entropy (3 words per 32 bits)</option>
|
||||
<option value="12">12 <span>Words</span></option>
|
||||
<option value="15">15 <span>Words</option>
|
||||
<option value="18">18 <span>Words</span></option>
|
||||
<option value="21">21 <span>Words</span></option>
|
||||
<option value="24">24 <span>Words</span></option>
|
||||
</select>
|
||||
</div>
|
||||
</div>
|
||||
<div class="col-sm-3">
|
||||
<p data-translate>Valid entropy values include:</p>
|
||||
<p>Valid entropy values include:</p>
|
||||
<ul>
|
||||
<li><strong data-translate>Binary</strong> [0-1]<br>101010011</li>
|
||||
<li><strong data-translate>Base 6</strong> [0-5]<br>123434014</li>
|
||||
<li><strong data-translate>Dice</strong> [1-6]<br>62535634</li>
|
||||
<li><strong data-translate>Base 10</strong> [0-9]<br>90834528</li>
|
||||
<li><strong data-translate>Hex</strong> [0-9A-F]<br>4187a8bfd9</li>
|
||||
<li><strong data-translate>Card</strong> [A2-9TJQK][CDHS]<br>ahqs9dtc</li>
|
||||
<li><strong>Binary</strong> [0-1]<br>101010011</li>
|
||||
<li><strong>Base 6</strong> [0-5]<br>123434014</li>
|
||||
<li><strong>Dice</strong> [1-6]<br>62535634</li>
|
||||
<li><strong>Base 10</strong> [0-9]<br>90834528</li>
|
||||
<li><strong>Hex</strong> [0-9A-F]<br>4187a8bfd9</li>
|
||||
<li><strong>Card</strong> [A2-9TJQK][CDHS]<br>ahqs9dtc</li>
|
||||
</ul>
|
||||
</div>
|
||||
</div>
|
||||
@@ -216,12 +223,12 @@
|
||||
<div class="col-sm-10 checkbox">
|
||||
<label>
|
||||
<input type="checkbox" class="use-entropy">
|
||||
<span data-translate>Supply my own source of entropy</span>
|
||||
<span>Supply my own source of entropy</span>
|
||||
</label>
|
||||
</div>
|
||||
</div>
|
||||
<div class="form-group">
|
||||
<label class="col-sm-2 control-label" data-translate>Mnemonic Language</label>
|
||||
<label class="col-sm-2 control-label">Mnemonic Language</label>
|
||||
<div class="col-sm-10 languages">
|
||||
<div class="form-control no-border">
|
||||
<a href="#english">English</a>
|
||||
@@ -235,25 +242,25 @@
|
||||
</div>
|
||||
</div>
|
||||
<div class="form-group">
|
||||
<label for="phrase" class="col-sm-2 control-label" data-translate>BIP39 Mnemonic</label>
|
||||
<label for="phrase" class="col-sm-2 control-label">BIP39 Mnemonic</label>
|
||||
<div class="col-sm-10">
|
||||
<textarea id="phrase" class="phrase form-control" data-show-qr></textarea>
|
||||
</div>
|
||||
</div>
|
||||
<div class="form-group">
|
||||
<label for="passphrase" class="col-sm-2 control-label" data-translate>BIP39 Passphrase (optional)</label>
|
||||
<label for="passphrase" class="col-sm-2 control-label">BIP39 Passphrase (optional)</label>
|
||||
<div class="col-sm-10">
|
||||
<textarea id="passphrase" class="passphrase form-control"></textarea>
|
||||
</div>
|
||||
</div>
|
||||
<div class="form-group">
|
||||
<label for="seed" class="col-sm-2 control-label" data-translate>BIP39 Seed</label>
|
||||
<label for="seed" class="col-sm-2 control-label">BIP39 Seed</label>
|
||||
<div class="col-sm-10">
|
||||
<textarea id="seed" class="seed form-control" readonly="readonly" data-show-qr></textarea>
|
||||
</div>
|
||||
</div>
|
||||
<div class="form-group">
|
||||
<label for="network-phrase" class="col-sm-2 control-label" data-translate>Coin</label>
|
||||
<label for="network-phrase" class="col-sm-2 control-label">Coin</label>
|
||||
<div class="col-sm-10">
|
||||
<select id="network-phrase" class="network form-control">
|
||||
<!-- populated by javascript -->
|
||||
@@ -261,11 +268,20 @@
|
||||
</div>
|
||||
</div>
|
||||
<div class="form-group">
|
||||
<label for="root-key" class="col-sm-2 control-label" data-translate>BIP32 Root Key</label>
|
||||
<label for="root-key" class="col-sm-2 control-label">BIP32 Root Key</label>
|
||||
<div class="col-sm-10">
|
||||
<textarea id="root-key" class="root-key form-control" data-show-qr></textarea>
|
||||
</div>
|
||||
</div>
|
||||
<div class="form-group litecoin-ltub-container hidden">
|
||||
<label for="litecoin-use-ltub" class="col-sm-2 control-label">Prefixes</label>
|
||||
<div class="col-sm-10 checkbox">
|
||||
<label>
|
||||
<input type="checkbox" id="litecoin-use-ltub" class="litecoin-use-ltub">
|
||||
Use <code>Ltpv / Ltub</code> instead of <code>xprv / xpub</code>
|
||||
</label>
|
||||
</div>
|
||||
</div>
|
||||
</form>
|
||||
</div>
|
||||
</div>
|
||||
@@ -276,11 +292,14 @@
|
||||
<div class="col-md-12">
|
||||
<h2>Derivation Path</h2>
|
||||
<ul class="derivation-type nav nav-tabs" role="tablist">
|
||||
<li id="bip32-tab">
|
||||
<a href="#bip32" role="tab" data-toggle="tab">BIP32</a>
|
||||
</li>
|
||||
<li id="bip44-tab" class="active">
|
||||
<a href="#bip44" role="tab" data-toggle="tab">BIP44</a>
|
||||
</li>
|
||||
<li id="bip32-tab">
|
||||
<a href="#bip32" role="tab" data-toggle="tab">BIP32</a>
|
||||
<li id="bip49-tab">
|
||||
<a href="#bip49" role="tab" data-toggle="tab">BIP49</a>
|
||||
</li>
|
||||
</ul>
|
||||
<div class="derivation-type tab-content">
|
||||
@@ -289,30 +308,30 @@
|
||||
<br>
|
||||
<div class="col-sm-2"></div>
|
||||
<div class="col-sm-10">
|
||||
<p data-translate-html>
|
||||
<p>
|
||||
For more info see the
|
||||
<a href="https://github.com/bitcoin/bips/blob/master/bip-0044.mediawiki" target="_blank">BIP44 spec</a>.
|
||||
</p>
|
||||
</div>
|
||||
<div class="form-group">
|
||||
<label for="purpose" class="col-sm-2 control-label">
|
||||
<a href="https://github.com/bitcoin/bips/blob/master/bip-0044.mediawiki#purpose" target="_blank" data-translate>Purpose</a>
|
||||
<a href="https://github.com/bitcoin/bips/blob/master/bip-0044.mediawiki#purpose" target="_blank">Purpose</a>
|
||||
</label>
|
||||
<div class="col-sm-10">
|
||||
<input id="purpose" type="text" class="purpose form-control" value="44">
|
||||
<input id="purpose" type="text" class="purpose form-control" value="44" readonly>
|
||||
</div>
|
||||
</div>
|
||||
<div class="form-group">
|
||||
<label for="coin" class="col-sm-2 control-label">
|
||||
<a href="https://github.com/bitcoin/bips/blob/master/bip-0044.mediawiki#registered-coin-types" target="_blank" data-translate>Coin</a>
|
||||
<a href="https://github.com/bitcoin/bips/blob/master/bip-0044.mediawiki#registered-coin-types" target="_blank">Coin</a>
|
||||
</label>
|
||||
<div class="col-sm-10">
|
||||
<input id="coin" type="text" class="coin form-control" value="0">
|
||||
<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">
|
||||
<a href="https://github.com/bitcoin/bips/blob/master/bip-0044.mediawiki#account" target="_blank" data-translate>Account</a>
|
||||
<a href="https://github.com/bitcoin/bips/blob/master/bip-0044.mediawiki#account" target="_blank">Account</a>
|
||||
</label>
|
||||
<div class="col-sm-10">
|
||||
<input id="account" type="text" class="account form-control" value="0">
|
||||
@@ -320,7 +339,7 @@
|
||||
</div>
|
||||
<div class="form-group">
|
||||
<label for="change" class="col-sm-2 control-label">
|
||||
<a href="https://github.com/bitcoin/bips/blob/master/bip-0044.mediawiki#change" target="_blank" data-translate>External / Internal</a>
|
||||
<a href="https://github.com/bitcoin/bips/blob/master/bip-0044.mediawiki#change" target="_blank">External / Internal</a>
|
||||
</label>
|
||||
<div class="col-sm-10">
|
||||
<input id="change" type="text" class="change form-control" value="0">
|
||||
@@ -330,12 +349,12 @@
|
||||
<label class="col-sm-2 control-label">
|
||||
</label>
|
||||
<div class="col-sm-10">
|
||||
<p data-translate>The account extended keys can be used for importing to most BIP44 compatible wallets, such as mycelium or electrum.</p>
|
||||
<p>The account extended keys can be used for importing to most BIP44 compatible wallets, such as mycelium or electrum.</p>
|
||||
</div>
|
||||
</div>
|
||||
<div class="form-group">
|
||||
<label for="account-xprv" class="col-sm-2 control-label">
|
||||
<span data-translate>Account Extended Private Key</span>
|
||||
<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>
|
||||
@@ -343,7 +362,7 @@
|
||||
</div>
|
||||
<div class="form-group">
|
||||
<label for="account-xpub" class="col-sm-2 control-label">
|
||||
<span data-translate>Account Extended Public Key</span>
|
||||
<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>
|
||||
@@ -353,11 +372,11 @@
|
||||
<label class="col-sm-2 control-label">
|
||||
</label>
|
||||
<div class="col-sm-10">
|
||||
<p data-translate>The BIP32 derivation path and extended keys are the basis for the derived addresses.</p>
|
||||
<p>The BIP32 derivation path and extended keys are the basis for the derived addresses.</p>
|
||||
</div>
|
||||
</div>
|
||||
<div class="form-group">
|
||||
<label for="bip44-path" class="col-sm-2 control-label" data-translate>BIP32 Derivation Path</label>
|
||||
<label for="bip44-path" class="col-sm-2 control-label">BIP32 Derivation Path</label>
|
||||
<div class="col-sm-10">
|
||||
<input id="bip44-path" type="text" class="path form-control" value="m/44'/0'/0'/0" readonly="readonly">
|
||||
</div>
|
||||
@@ -369,13 +388,13 @@
|
||||
<br>
|
||||
<div class="col-sm-2"></div>
|
||||
<div class="col-sm-10">
|
||||
<p data-translate>
|
||||
<p>
|
||||
For more info see the
|
||||
<a href="https://github.com/bitcoin/bips/blob/master/bip-0032.mediawiki" target="_blank">BIP32 spec</a>
|
||||
</p>
|
||||
</div>
|
||||
<div class="form-group">
|
||||
<label for="bip32-client" class="col-sm-2 control-label" data-translate>Client</label>
|
||||
<label for="bip32-client" class="col-sm-2 control-label">Client</label>
|
||||
<div class="col-sm-10">
|
||||
<select id="bip32-client" class="client form-control">
|
||||
<option value="custom">Custom derivation path</option>
|
||||
@@ -384,7 +403,7 @@
|
||||
</div>
|
||||
</div>
|
||||
<div class="form-group">
|
||||
<label for="bip32-path" class="col-sm-2 control-label" data-translate>BIP32 Derivation Path</label>
|
||||
<label for="bip32-path" class="col-sm-2 control-label">BIP32 Derivation Path</label>
|
||||
<div class="col-sm-10">
|
||||
<input id="bip32-path" type="text" class="path form-control" value="m/0">
|
||||
</div>
|
||||
@@ -393,58 +412,155 @@
|
||||
<div class="col-sm-2"></div>
|
||||
<label class="col-sm-10">
|
||||
<input class="hardened-addresses" type="checkbox">
|
||||
<span data-translate>Use hardened addresses</span>
|
||||
<span>Use hardened addresses</span>
|
||||
</label>
|
||||
</div>
|
||||
<div class="form-group">
|
||||
<label for="core-path" class="col-sm-2 control-label" data-translate>Bitcoin Core</label>
|
||||
<div class="col-sm-2"></div>
|
||||
<label class="col-sm-10">
|
||||
<input class="p2wpkh-nested-in-p2sh" type="checkbox">
|
||||
<span>Use SegWit addresses (ie P2WPKH Nested In P2SH)</span>
|
||||
</label>
|
||||
</div>
|
||||
<div class="form-group">
|
||||
<label for="core-path" class="col-sm-2 control-label">Bitcoin Core</label>
|
||||
<div class="col-sm-10">
|
||||
<p class="form-control no-border" data-translate-html>
|
||||
<p class="form-control no-border">
|
||||
Use path <code>m/0'/0'</code> with hardened addresses.
|
||||
</p>
|
||||
<p class="form-control no-border" data-translate-html>
|
||||
<p class="form-control no-border">
|
||||
For more info see the
|
||||
<a href="https://github.com/bitcoin/bitcoin/pull/8035" target="_blank">Bitcoin Core BIP32 implementation</a>
|
||||
</p>
|
||||
</div>
|
||||
</div>
|
||||
<div class="form-group">
|
||||
<label for="core-path" class="col-sm-2 control-label" data-translate>Multibit</label>
|
||||
<label for="core-path" class="col-sm-2 control-label">Multibit</label>
|
||||
<div class="col-sm-10">
|
||||
<p class="form-control no-border">
|
||||
<span data-translate-html>Use path <code>m/0'/0</code>.</span>
|
||||
<span>Use path <code>m/0'/0</code>.</span>
|
||||
</p>
|
||||
<p class="form-control no-border">
|
||||
<span data-translate>For more info see</span>
|
||||
<span>For more info see</span>
|
||||
<a href="https://multibit.org/" target="_blank">MultiBit HD</a>
|
||||
</p>
|
||||
</div>
|
||||
</div>
|
||||
<div class="form-group">
|
||||
<label class="col-sm-2 control-label" data-translate>Block Explorers</label>
|
||||
<label class="col-sm-2 control-label">Block Explorers</label>
|
||||
<div class="col-sm-10">
|
||||
<p class="form-control no-border">
|
||||
<span data-translate-html>Use path <code>m/44'/0'/0'</code>.</span>
|
||||
<span data-translate-html>Only enter the <code>xpub</code> extended key into block explorer search fields, never the <code>xprv</code> key.</span>
|
||||
<span>Use path <code>m/44'/0'/0'</code>.</span>
|
||||
<span>Only enter the <code>xpub</code> extended key into block explorer search fields, never the <code>xprv</code> key.</span>
|
||||
</p>
|
||||
<p class="form-control no-border">
|
||||
<span data-translate>Can be used with</span>:
|
||||
<span>Can be used with</span>:
|
||||
<a href="https://blockchain.info/" target="_blank">blockchain.info</a>
|
||||
</p>
|
||||
</div>
|
||||
</div>
|
||||
</form>
|
||||
</div>
|
||||
<div id="bip49" class="tab-pane">
|
||||
<form class="form-horizontal" role="form">
|
||||
<br>
|
||||
<div class="unavailable hidden">
|
||||
<div class="form-group">
|
||||
<div class="col-sm-2"></div>
|
||||
<div class="col-sm-10">
|
||||
<p>BIP49 is unavailable for this coin.</p>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="available">
|
||||
<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-0049.mediawiki" target="_blank">BIP49 spec</a>.
|
||||
</p>
|
||||
</div>
|
||||
<div class="form-group">
|
||||
<label for="purpose" class="col-sm-2 control-label">
|
||||
<a href="https://github.com/bitcoin/bips/blob/master/bip-0044.mediawiki#purpose" target="_blank">Purpose</a>
|
||||
</label>
|
||||
<div class="col-sm-10">
|
||||
<input id="purpose" type="text" class="purpose form-control" value="49" readonly>
|
||||
</div>
|
||||
</div>
|
||||
<div class="form-group">
|
||||
<label for="coin" class="col-sm-2 control-label">
|
||||
<a href="https://github.com/bitcoin/bips/blob/master/bip-0044.mediawiki#registered-coin-types" target="_blank">Coin</a>
|
||||
</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">
|
||||
<a href="https://github.com/bitcoin/bips/blob/master/bip-0044.mediawiki#account" target="_blank">Account</a>
|
||||
</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">
|
||||
<a href="https://github.com/bitcoin/bips/blob/master/bip-0044.mediawiki#change" target="_blank">External / Internal</a>
|
||||
</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 BIP49 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="bip49-path" class="col-sm-2 control-label">BIP32 Derivation Path</label>
|
||||
<div class="col-sm-10">
|
||||
<input id="bip49-path" type="text" class="path form-control" value="m/49'/0'/0'/0" readonly="readonly">
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</form>
|
||||
</div>
|
||||
</div>
|
||||
<form class="form-horizontal" role="form">
|
||||
<div class="form-group">
|
||||
<label for="extended-priv-key" class="col-sm-2 control-label" data-translate>BIP32 Extended Private Key</label>
|
||||
<label for="extended-priv-key" class="col-sm-2 control-label">BIP32 Extended Private Key</label>
|
||||
<div class="col-sm-10">
|
||||
<textarea id="extended-priv-key" class="extended-priv-key form-control" readonly="readonly" data-show-qr></textarea>
|
||||
</div>
|
||||
</div>
|
||||
<div class="form-group">
|
||||
<label for="extended-pub-key" class="col-sm-2 control-label" data-translate>BIP32 Extended Public Key</label>
|
||||
<label for="extended-pub-key" class="col-sm-2 control-label">BIP32 Extended Public Key</label>
|
||||
<div class="col-sm-10">
|
||||
<textarea id="extended-pub-key" class="extended-pub-key form-control" readonly="readonly" data-show-qr></textarea>
|
||||
</div>
|
||||
@@ -458,31 +574,31 @@
|
||||
<div class="row">
|
||||
<div class="col-md-12">
|
||||
<h2>Derived Addresses</h2>
|
||||
<p data-translate>Note these addreses are derived from the BIP32 Extended Key</p>
|
||||
<p>Note these addreses are derived from the BIP32 Extended Key</p>
|
||||
<table class="table table-striped">
|
||||
<thead>
|
||||
<th>
|
||||
<div class="input-group">
|
||||
<span data-translate>Path</span>
|
||||
<button class="index-toggle" data-translate>Toggle</button>
|
||||
<span>Path</span>
|
||||
<button class="index-toggle">Toggle</button>
|
||||
</div>
|
||||
</th>
|
||||
<th>
|
||||
<div class="input-group">
|
||||
<span data-translate>Address</span>
|
||||
<button class="address-toggle" data-translate>Toggle</button>
|
||||
<span>Address</span>
|
||||
<button class="address-toggle">Toggle</button>
|
||||
</div>
|
||||
</th>
|
||||
<th>
|
||||
<div class="input-group">
|
||||
<span data-translate>Public Key</span>
|
||||
<button class="public-key-toggle" data-translate>Toggle</button>
|
||||
<span>Public Key</span>
|
||||
<button class="public-key-toggle">Toggle</button>
|
||||
</div>
|
||||
</th>
|
||||
<th>
|
||||
<div class="input-group">
|
||||
<span data-translate>Private Key</span>
|
||||
<button class="private-key-toggle" data-translate>Toggle</button>
|
||||
<span>Private Key</span>
|
||||
<button class="private-key-toggle">Toggle</button>
|
||||
</div>
|
||||
</th>
|
||||
</thead>
|
||||
@@ -496,81 +612,101 @@
|
||||
</table>
|
||||
</div>
|
||||
</div>
|
||||
<span data-translate>Show more rows</span>:
|
||||
<span>Show more rows</span>:
|
||||
<input type="number" class="rows-to-add" value="20">
|
||||
<button class="more" data-translate>Show</button>
|
||||
<button class="more">Show</button>
|
||||
|
||||
<hr>
|
||||
|
||||
<div class="row">
|
||||
<div class="col-md-12">
|
||||
<h2 data-translate>More info</h2>
|
||||
<h3>BIP39 <span class="small" data-translate>Mnemonic code for generating deterministic keys</span></h3>
|
||||
<p data-translate-html>
|
||||
<h2>More info</h2>
|
||||
<h3>BIP39 <span class="small">Mnemonic code for generating deterministic keys</span></h3>
|
||||
<p>
|
||||
Read more at the
|
||||
<a href="https://github.com/bitcoin/bips/blob/master/bip-0039.mediawiki">official BIP39 spec</a>
|
||||
</p>
|
||||
<h3>BIP32 <span class="small" data-translate>Hierarchical Deterministic Wallets</span></h3>
|
||||
<p data-translate-html>
|
||||
<h3>BIP32 <span class="small">Hierarchical Deterministic Wallets</span></h3>
|
||||
<p>
|
||||
Read more at the
|
||||
<a href="https://github.com/bitcoin/bips/blob/master/bip-0032.mediawiki" target="_blank">official BIP32 spec</a>
|
||||
</p>
|
||||
<p data-translate-html>
|
||||
<p>
|
||||
See the demo at
|
||||
<a href="http://bip32.org/" target="_blank">bip32.org</a>
|
||||
</p>
|
||||
<h3>BIP44 <span class="small" data-translate>Multi-Account Hierarchy for Deterministic Wallets</span></h3>
|
||||
<p data-translate-html>
|
||||
<h3>BIP44 <span class="small">Multi-Account Hierarchy for Deterministic Wallets</span></h3>
|
||||
<p>
|
||||
Read more at the
|
||||
<a href="https://github.com/bitcoin/bips/blob/master/bip-0044.mediawiki" target="_blank">official BIP44 spec</a>
|
||||
</p>
|
||||
<h3 data-translate>Private Keys</h3>
|
||||
<h3>BIP49 <span class="small">Derivation scheme for P2WPKH-nested-in-P2SH based accounts</span></h3>
|
||||
<p>
|
||||
<span data-translate-html>
|
||||
Read more at the
|
||||
<a href="https://github.com/bitcoin/bips/blob/master/bip-0049.mediawiki" target="_blank">official BIP49 spec</a>
|
||||
</p>
|
||||
<h3>Private Keys</h3>
|
||||
<p>
|
||||
<span>
|
||||
Use private keys at
|
||||
<a href="https://web.archive.org/web/20150707020924/https://brainwallet.org/" target="_blank">brainwallet.org</a>.
|
||||
</span>
|
||||
<span data-translate>Be careful - it can be easy to make mistakes if you don't know what you're doing.</span>
|
||||
<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" data-translate>Entropy</h3>
|
||||
<h3 id="entropy-notes">Entropy</h3>
|
||||
<p>
|
||||
<span data-translate-html>
|
||||
<span>
|
||||
Entropy values must be sourced from a
|
||||
<a href="https://en.wikipedia.org/wiki/Random_number_generation" target="_blank">strong source of randomness</a>.
|
||||
</span>
|
||||
<span data-translate>This means flipping a fair coin, rolling a fair dice, noise measurements etc.</span>
|
||||
<span data-translate-html>
|
||||
<span>This means flipping a fair coin, rolling a fair dice, noise measurements etc.</span>
|
||||
<span>
|
||||
Do <strong>NOT</strong> use phrases from books, lyrics from songs, your birthday or steet address,
|
||||
keyboard mashing, or anything you <i>think</i> is random, because chances are overwhelming it isn't
|
||||
random enough for the needs of this tool.
|
||||
</span>
|
||||
</p>
|
||||
<p>
|
||||
<strong><span data-translate>Do not store entropy.</span></strong>
|
||||
<strong><span>Do not store entropy.</span></strong>
|
||||
</p>
|
||||
<p>
|
||||
<span data-translate>Storing entropy (such as keeping a deck of cards in a specific shuffled order) is unreliable compared to storing a mnemonic.</span>
|
||||
<span data-translate>Instead of storing entropy, store the mnemonic generated from the entropy.</span>
|
||||
<span data-translate-html><a href="https://en.wikipedia.org/wiki/Steganography#Physical" target="_blank">Steganography</a> may be beneficial when storing the mnemonic.</span>
|
||||
<span>Storing entropy (such as keeping a deck of cards in a specific shuffled order) is unreliable compared to storing a mnemonic.</span>
|
||||
<span>Instead of storing entropy, store the mnemonic generated from the entropy.</span>
|
||||
<span><a href="https://en.wikipedia.org/wiki/Steganography#Physical" target="_blank">Steganography</a> may be beneficial when storing the mnemonic.</span>
|
||||
</p>
|
||||
<p>
|
||||
<span data-translate-html>
|
||||
<span>
|
||||
The random mnemonic generator on this page uses a
|
||||
<a href="https://developer.mozilla.org/en-US/docs/Web/API/RandomSource/getRandomValues" target="_blank">cryptographically secure random number generator</a>.
|
||||
</span>
|
||||
<span data-translate>The built in random generator can generally be trusted more than your own intuition about randomness.</span>
|
||||
<span data-translate>If cryptographic randomness isn't available in your browser, this page will show a warning and the generate button will not work.</span>
|
||||
<span data-translate>In that case you might choose to use your own source of entropy.</span>
|
||||
<span>The built in random generator can generally be trusted more than your own intuition about randomness.</span>
|
||||
<span>If cryptographic randomness isn't available in your browser, this page will show a warning and the generate button will not work.</span>
|
||||
<span>In that case you might choose to use your own source of entropy.</span>
|
||||
</p>
|
||||
<p>
|
||||
<a href="https://bitcointalk.org/index.php?topic=311000.msg3345309#msg3345309" target="_blank" data-translate>You are not a good source of entropy.</a>
|
||||
<a href="https://bitcointalk.org/index.php?topic=311000.msg3345309#msg3345309" target="_blank">You are not a good source of entropy.</a>
|
||||
</p>
|
||||
<h3 data-translate>License</h3>
|
||||
<h3>License</h3>
|
||||
<p>
|
||||
<span data-translate-html>Please refer to <a href="https://github.com/iancoleman/bip39/blob/master/LICENSE" target="_blank">the software license</a> for more detail.
|
||||
<span>Please refer to <a href="https://github.com/iancoleman/bip39/blob/master/LICENSE" target="_blank">the software license</a> for more detail.
|
||||
</span>
|
||||
</p>
|
||||
<p data-translate>The software is provided "as is", without warranty of any kind, express or implied, including but not limited to the warranties of merchantability, fitness for a particular purpose and noninfringement. In no event shall the authors or copyright holders be liable for any claim, damages or other liability, whether in an action of contract, tort or otherwise, arising from, out of or in connection with the software or the use or other dealings in the software.</p>
|
||||
<p>The software is provided "as is", without warranty of any kind, express or implied, including but not limited to the warranties of merchantability, fitness for a particular purpose and noninfringement. In no event shall the authors or copyright holders be liable for any claim, damages or other liability, whether in an action of contract, tort or otherwise, arising from, out of or in connection with the software or the use or other dealings in the software.</p>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<hr>
|
||||
|
||||
<div class="row">
|
||||
<div class="col-md-12">
|
||||
<h2>Alternative Tools</h2>
|
||||
<p>This tool is interoperable with any BIP39 wallet.</p>
|
||||
<p>Some similar tools to this one (ie not consumer wallets) are</p>
|
||||
<p>
|
||||
<a href="https://bip32jp.github.io/english/">
|
||||
https://bip32jp.github.io/english/
|
||||
</a>
|
||||
</p>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
@@ -579,21 +715,21 @@
|
||||
<div class="row">
|
||||
<div class="col-md-12">
|
||||
|
||||
<h2 data-translate>Offline Usage</h2>
|
||||
<h2>Offline Usage</h2>
|
||||
|
||||
<p data-translate>
|
||||
<p>
|
||||
You can use this tool without having to be online.
|
||||
</p>
|
||||
<p data-translate>
|
||||
<p>
|
||||
In your browser, select file save-as, and save this page
|
||||
as a file.
|
||||
</p>
|
||||
<p data-translate>
|
||||
<p>
|
||||
Double-click that file to open it in a browser
|
||||
on any offline computer.
|
||||
</p>
|
||||
<p>
|
||||
<span data-translate>Alternatively, download the file from the repository</span>
|
||||
<span>Alternatively, download the file from the repository</span>
|
||||
-
|
||||
<a href="https://github.com/iancoleman/bip39">https://github.com/iancoleman/bip39</a>
|
||||
</p>
|
||||
@@ -606,17 +742,17 @@
|
||||
<div class="row">
|
||||
<div class="col-md-12">
|
||||
|
||||
<h2 data-translate>This project is 100% open-source code</h2>
|
||||
<h2>This project is 100% open-source code</h2>
|
||||
|
||||
<p>
|
||||
<span data-translate>Get the source code from the repository</span>
|
||||
<span>Get the source code from the repository</span>
|
||||
-
|
||||
<a href="https://github.com/iancoleman/bip39" target="_blank">
|
||||
https://github.com/iancoleman/bip39
|
||||
</a>
|
||||
</p>
|
||||
|
||||
<h3 data-translate>Libraries</h3>
|
||||
<h3>Libraries</h3>
|
||||
|
||||
<p>
|
||||
<span>BitcoinJS - </span>
|
||||
@@ -659,11 +795,11 @@
|
||||
</div>
|
||||
|
||||
<div class="qr-container hidden">
|
||||
<div class="qr-hint bg-primary hidden" data-translate>Click field to hide QR</div>
|
||||
<div class="qr-hint bg-primary" data-translate>Click field to show QR</div>
|
||||
<div class="qr-hint bg-primary hidden">Click field to hide QR</div>
|
||||
<div class="qr-hint bg-primary">Click field to show QR</div>
|
||||
<div class="qr-hider hidden">
|
||||
<div class="qr-image"></div>
|
||||
<div class="qr-warning bg-primary" data-translate>Caution: Scanner may keep history</div>
|
||||
<div class="qr-warning bg-primary">Caution: Scanner may keep history</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
@@ -686,13 +822,11 @@
|
||||
<script src="js/bootstrap.min.js"></script>
|
||||
<script src="js/levenshtein.js"></script>
|
||||
<script src="js/jquery.qrcode.min.js"></script>
|
||||
<script src="js/bitcoinjs-1-5-7.js"></script>
|
||||
<script src="js/bitcoinjs-3-1-1.js"></script>
|
||||
<script src="js/bitcoinjs-extensions.js"></script>
|
||||
<script src="js/ethereumjs-util.js"></script>
|
||||
<script src="js/ripple-util.js"></script>
|
||||
<script src="js/sjcl-bip39.js"></script>
|
||||
<script src="js/translate.js"></script>
|
||||
<script src="js/phrases_en.js"></script>
|
||||
<script src="js/wordlist_english.js"></script>
|
||||
<script src="js/wordlist_japanese.js"></script>
|
||||
<script src="js/wordlist_spanish.js"></script>
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
14840
src/js/bitcoinjs-3-1-1.js
Normal file
14840
src/js/bitcoinjs-3-1-1.js
Normal file
File diff suppressed because it is too large
Load Diff
@@ -1,107 +1,241 @@
|
||||
bitcoin.networks.shadow = {
|
||||
magicPrefix: '\x19ShadowCash Signed Message:\n',
|
||||
bitcoinjs.bitcoin.networks.shadow = {
|
||||
messagePrefix: 'unused',
|
||||
bip32: {
|
||||
public: 0xEE80286A,
|
||||
private: 0xEE8031E8
|
||||
},
|
||||
pubKeyHash: 0x3f,
|
||||
scriptHash: 0x7d,
|
||||
wif: 0xbf,
|
||||
dustThreshold: 0,
|
||||
feePerKb: 1000,
|
||||
estimateFee: function() { return "unused in this app" },
|
||||
wif: 0xbf
|
||||
};
|
||||
|
||||
bitcoin.networks.shadowtn = {
|
||||
magicPrefix: '\x19ShadowCash Signed Message:\n',
|
||||
bitcoinjs.bitcoin.networks.shadowtn = {
|
||||
messagePrefix: 'unused',
|
||||
bip32: {
|
||||
public: 0x76C0FDFB,
|
||||
private: 0x76C1077A
|
||||
},
|
||||
pubKeyHash: 0x7f,
|
||||
scriptHash: 0xc4,
|
||||
wif: 0xff,
|
||||
dustThreshold: 0,
|
||||
feePerKb: 1000,
|
||||
estimateFee: function() { return "unused in this app" },
|
||||
wif: 0xff
|
||||
};
|
||||
|
||||
bitcoin.networks.clam = {
|
||||
bitcoinjs.bitcoin.networks.clam = {
|
||||
messagePrefix: 'unused',
|
||||
bip32: {
|
||||
public: 0xa8c26d64,
|
||||
private: 0xa8c17826
|
||||
},
|
||||
pubKeyHash: 0x89,
|
||||
wif: 0x85,
|
||||
scriptHash: 0x00, // TODO set this correctly
|
||||
wif: 0x85
|
||||
};
|
||||
|
||||
bitcoin.networks.dash = {
|
||||
bitcoinjs.bitcoin.networks.crown = {
|
||||
messagePrefix: 'unused',
|
||||
bip32: {
|
||||
public: 0x0488b21e,
|
||||
private: 0x0488ade4
|
||||
},
|
||||
pubKeyHash: 0x00,
|
||||
scriptHash: 0x05,
|
||||
wif: 0x80
|
||||
};
|
||||
|
||||
bitcoinjs.bitcoin.networks.dash = {
|
||||
messagePrefix: 'unused',
|
||||
bip32: {
|
||||
public: 0x0488b21e,
|
||||
private: 0x0488ade4
|
||||
},
|
||||
pubKeyHash: 0x4c,
|
||||
scriptHash: 0x10,
|
||||
wif: 0xcc,
|
||||
wif: 0xcc
|
||||
};
|
||||
|
||||
bitcoin.networks.dashtn = {
|
||||
bitcoinjs.bitcoin.networks.maza = {
|
||||
messagePrefix: 'unused',
|
||||
bip32: {
|
||||
public: 0x0488b21e,
|
||||
private: 0x0488ade4
|
||||
},
|
||||
pubKeyHash: 0x32,
|
||||
scriptHash: 0x09,
|
||||
wif: 0xe0
|
||||
};
|
||||
|
||||
bitcoinjs.bitcoin.networks.dashtn = {
|
||||
messagePrefix: 'unused',
|
||||
bip32: {
|
||||
public: 0x043587cf,
|
||||
private: 0x04358394
|
||||
},
|
||||
pubKeyHash: 0x8c,
|
||||
scriptHash: 0x13,
|
||||
wif: 0xef,
|
||||
wif: 0xef
|
||||
};
|
||||
|
||||
bitcoin.networks.game = {
|
||||
bitcoinjs.bitcoin.networks.game = {
|
||||
messagePrefix: 'unused',
|
||||
bip32: {
|
||||
public: 0x0488b21e,
|
||||
private: 0x0488ade4
|
||||
},
|
||||
pubKeyHash: 0x26,
|
||||
scriptHash: 0x05,
|
||||
wif: 0xa6,
|
||||
wif: 0xa6
|
||||
};
|
||||
|
||||
bitcoin.networks.namecoin = {
|
||||
bitcoinjs.bitcoin.networks.namecoin = {
|
||||
messagePrefix: 'unused',
|
||||
bip32: {
|
||||
public: 0x0488b21e,
|
||||
private: 0x0488ade4
|
||||
},
|
||||
pubKeyHash: 0x34,
|
||||
//scriptHash: 0x10,
|
||||
wif: 0x80,
|
||||
scriptHash: 0x00, // TODO set this correctly
|
||||
wif: 0x80
|
||||
};
|
||||
|
||||
bitcoin.networks.peercoin = {
|
||||
bitcoinjs.bitcoin.networks.peercoin = {
|
||||
messagePrefix: 'unused',
|
||||
bip32: {
|
||||
public: 0x0488b21e,
|
||||
private: 0x0488ade4
|
||||
},
|
||||
pubKeyHash: 0x37,
|
||||
//scriptHash: 0x10,
|
||||
wif: 0xb7,
|
||||
scriptHash: 0x00, // TODO set this correctly
|
||||
wif: 0xb7
|
||||
};
|
||||
|
||||
bitcoin.networks.slimcoin = {
|
||||
bitcoinjs.bitcoin.networks.slimcoin = {
|
||||
messagePrefix: 'unused',
|
||||
bip32: {
|
||||
public: 0xef6adf10,
|
||||
private: 0xef69ea80
|
||||
},
|
||||
pubKeyHash: 0x3f,
|
||||
scriptHash: 0x7d,
|
||||
wif: 0x46,
|
||||
wif: 0x46
|
||||
};
|
||||
|
||||
bitcoin.networks.slimcointn = {
|
||||
bitcoinjs.bitcoin.networks.slimcointn = {
|
||||
messagePrefix: 'unused',
|
||||
bip32: {
|
||||
public: 0x043587CF,
|
||||
private: 0x04358394
|
||||
},
|
||||
pubKeyHash: 0x6f,
|
||||
scriptHash: 0xc4,
|
||||
wif: 0x57,
|
||||
wif: 0x57
|
||||
};
|
||||
|
||||
bitcoinjs.bitcoin.networks.dogecoin = {
|
||||
messagePrefix: '\x19Dogecoin Signed Message:\n',
|
||||
bip32: {
|
||||
public: 0x02facafd,
|
||||
private: 0x02fac398
|
||||
},
|
||||
pubKeyHash: 0x1e,
|
||||
scriptHash: 0x16,
|
||||
wif: 0x9e
|
||||
};
|
||||
|
||||
bitcoinjs.bitcoin.networks.viacoin = {
|
||||
messagePrefix: '\x18Viacoin Signed Message:\n',
|
||||
bip32: {
|
||||
public: 0x0488b21e,
|
||||
private: 0x0488ade4
|
||||
},
|
||||
pubKeyHash: 0x47,
|
||||
scriptHash: 0x21,
|
||||
wif: 0xc7
|
||||
};
|
||||
|
||||
bitcoinjs.bitcoin.networks.viacointestnet = {
|
||||
messagePrefix: '\x18Viacoin Signed Message:\n',
|
||||
bip32: {
|
||||
public: 0x043587cf,
|
||||
private: 0x04358394
|
||||
},
|
||||
pubKeyHash: 0x7f,
|
||||
scriptHash: 0xc4,
|
||||
wif: 0xff
|
||||
};
|
||||
|
||||
bitcoinjs.bitcoin.networks.gamerscoin = {
|
||||
messagePrefix: '\x19Gamerscoin Signed Message:\n',
|
||||
bip32: {
|
||||
public: 0x019da462,
|
||||
private: 0x019d9cfe
|
||||
},
|
||||
pubKeyHash: 0x26,
|
||||
scriptHash: 0x05,
|
||||
wif: 0xA6
|
||||
};
|
||||
|
||||
bitcoinjs.bitcoin.networks.jumbucks = {
|
||||
messagePrefix: '\x19Jumbucks Signed Message:\n',
|
||||
bip32: {
|
||||
public: 0x037a689a,
|
||||
private: 0x037a6460
|
||||
},
|
||||
pubKeyHash: 0x2b,
|
||||
scriptHash: 0x05,
|
||||
wif: 0xab
|
||||
};
|
||||
|
||||
bitcoinjs.bitcoin.networks.zetacoin = {
|
||||
messagePrefix: '\x18Zetacoin Signed Message:\n',
|
||||
bip32: {
|
||||
public: 0x0488b21e,
|
||||
private: 0x0488ade4
|
||||
},
|
||||
pubKeyHash: 0x50,
|
||||
scriptHash: 0x09,
|
||||
wif: 0xe0
|
||||
};
|
||||
|
||||
bitcoinjs.bitcoin.networks.myriadcoin = {
|
||||
messagePrefix: 'unused',
|
||||
bip32: {
|
||||
public: 0x0488b21e,
|
||||
private: 0x0488ade4
|
||||
},
|
||||
pubKeyHash: 0x32,
|
||||
scriptHash: 0x00, // TODO set this correctly
|
||||
wif: 0xb2
|
||||
};
|
||||
|
||||
bitcoinjs.bitcoin.networks.pivx = {
|
||||
messagePrefix: 'unused',
|
||||
bip32: {
|
||||
public: 0x022d2533,
|
||||
private: 0x0221312b
|
||||
},
|
||||
pubKeyHash: 0x1e,
|
||||
scriptHash: 0x0d,
|
||||
wif: 0xd4
|
||||
};
|
||||
|
||||
bitcoinjs.bitcoin.networks.pivxtestnet = {
|
||||
messagePrefix: 'unused',
|
||||
bip32: {
|
||||
public: 0x3a8061a0,
|
||||
private: 0x3a805837
|
||||
},
|
||||
pubKeyHash: 0x8b,
|
||||
scriptHash: 0x13,
|
||||
wif: 0xef
|
||||
};
|
||||
|
||||
bitcoinjs.bitcoin.networks.fujicoin = {
|
||||
messagePrefix: '\x19FujiCoin Signed Message:\n',
|
||||
bip32: {
|
||||
public: 0x0488b21e,
|
||||
private: 0x0488ade4
|
||||
},
|
||||
pubKeyHash: 0x24,
|
||||
scriptHash: 0x10,
|
||||
wif: 0xa4
|
||||
};
|
||||
|
||||
403
src/js/index.js
403
src/js/index.js
@@ -6,7 +6,7 @@
|
||||
var seed = null;
|
||||
var bip32RootKey = null;
|
||||
var bip32ExtendedKey = null;
|
||||
var network = bitcoin.networks.bitcoin;
|
||||
var network = bitcoinjs.bitcoin.networks.bitcoin;
|
||||
var addressRowTemplate = $("#address-row-template");
|
||||
|
||||
var showIndex = true;
|
||||
@@ -14,6 +14,7 @@
|
||||
var showPubKey = true;
|
||||
var showPrivKey = true;
|
||||
var showQr = false;
|
||||
var litecoinUseLtub = false;
|
||||
|
||||
var entropyChangeTimeoutEvent = null;
|
||||
var phraseChangeTimeoutEvent = null;
|
||||
@@ -37,18 +38,23 @@
|
||||
DOM.entropyWordCount = DOM.entropyContainer.find(".word-count");
|
||||
DOM.entropyBinary = DOM.entropyContainer.find(".binary");
|
||||
DOM.entropyMnemonicLength = DOM.entropyContainer.find(".mnemonic-length");
|
||||
DOM.entropyFilterWarning = DOM.entropyContainer.find(".filter-warning");
|
||||
DOM.phrase = $(".phrase");
|
||||
DOM.passphrase = $(".passphrase");
|
||||
DOM.generateContainer = $(".generate-container");
|
||||
DOM.generate = $(".generate");
|
||||
DOM.seed = $(".seed");
|
||||
DOM.rootKey = $(".root-key");
|
||||
DOM.litecoinLtubContainer = $(".litecoin-ltub-container");
|
||||
DOM.litecoinUseLtub = $(".litecoin-use-ltub");
|
||||
DOM.extendedPrivKey = $(".extended-priv-key");
|
||||
DOM.extendedPubKey = $(".extended-pub-key");
|
||||
DOM.bip32tab = $("#bip32-tab");
|
||||
DOM.bip44tab = $("#bip44-tab");
|
||||
DOM.bip49tab = $("#bip49-tab");
|
||||
DOM.bip32panel = $("#bip32");
|
||||
DOM.bip44panel = $("#bip44");
|
||||
DOM.bip49panel = $("#bip49");
|
||||
DOM.bip32path = $("#bip32-path");
|
||||
DOM.bip44path = $("#bip44-path");
|
||||
DOM.bip44purpose = $("#bip44 .purpose");
|
||||
@@ -57,8 +63,18 @@
|
||||
DOM.bip44accountXprv = $("#bip44 .account-xprv");
|
||||
DOM.bip44accountXpub = $("#bip44 .account-xpub");
|
||||
DOM.bip44change = $("#bip44 .change");
|
||||
DOM.bip49unavailable = $("#bip49 .unavailable");
|
||||
DOM.bip49available = $("#bip49 .available");
|
||||
DOM.bip49path = $("#bip49-path");
|
||||
DOM.bip49purpose = $("#bip49 .purpose");
|
||||
DOM.bip49coin = $("#bip49 .coin");
|
||||
DOM.bip49account = $("#bip49 .account");
|
||||
DOM.bip49accountXprv = $("#bip49 .account-xprv");
|
||||
DOM.bip49accountXpub = $("#bip49 .account-xpub");
|
||||
DOM.bip49change = $("#bip49 .change");
|
||||
DOM.generatedStrength = $(".generate-container .strength");
|
||||
DOM.hardenedAddresses = $(".hardened-addresses");
|
||||
DOM.useP2wpkhNestedInP2sh = $(".p2wpkh-nested-in-p2sh");
|
||||
DOM.addresses = $(".addresses");
|
||||
DOM.rowsToAdd = $(".rows-to-add");
|
||||
DOM.more = $(".more");
|
||||
@@ -87,13 +103,15 @@
|
||||
DOM.generate.on("click", generateClicked);
|
||||
DOM.more.on("click", showMore);
|
||||
DOM.rootKey.on("input", delayedRootKeyChanged);
|
||||
DOM.litecoinUseLtub.on("change", litecoinUseLtubChanged);
|
||||
DOM.bip32path.on("input", calcForDerivationPath);
|
||||
DOM.bip44purpose.on("input", calcForDerivationPath);
|
||||
DOM.bip44coin.on("input", calcForDerivationPath);
|
||||
DOM.bip44account.on("input", calcForDerivationPath);
|
||||
DOM.bip44change.on("input", calcForDerivationPath);
|
||||
DOM.bip49account.on("input", calcForDerivationPath);
|
||||
DOM.bip49change.on("input", calcForDerivationPath);
|
||||
DOM.tab.on("shown.bs.tab", calcForDerivationPath);
|
||||
DOM.hardenedAddresses.on("change", calcForDerivationPath);
|
||||
DOM.useP2wpkhNestedInP2sh.on("change", calcForDerivationPath);
|
||||
DOM.indexToggle.on("click", toggleIndexes);
|
||||
DOM.addressToggle.on("click", toggleAddresses);
|
||||
DOM.publicKeyToggle.on("click", togglePublicKeys);
|
||||
@@ -110,8 +128,18 @@
|
||||
// Event handlers
|
||||
|
||||
function networkChanged(e) {
|
||||
clearDerivedKeys();
|
||||
clearAddressesList();
|
||||
DOM.litecoinLtubContainer.addClass("hidden");
|
||||
var networkIndex = e.target.value;
|
||||
networks[networkIndex].onSelect();
|
||||
var network = networks[networkIndex];
|
||||
network.onSelect();
|
||||
if (network.p2wpkhNestedInP2shAvailable) {
|
||||
showP2wpkhNestedInP2shAvailable();
|
||||
}
|
||||
else {
|
||||
showP2wpkhNestedInP2shUnavailable();
|
||||
}
|
||||
if (seed != null) {
|
||||
phraseChanged();
|
||||
}
|
||||
@@ -155,6 +183,10 @@
|
||||
|
||||
function delayedPhraseChanged() {
|
||||
hideValidationError();
|
||||
seed = null;
|
||||
bip32RootKey = null;
|
||||
bip32ExtendedKey = null;
|
||||
clearAddressesList();
|
||||
showPending();
|
||||
if (phraseChangeTimeoutEvent != null) {
|
||||
clearTimeout(phraseChangeTimeoutEvent);
|
||||
@@ -164,7 +196,6 @@
|
||||
|
||||
function phraseChanged() {
|
||||
showPending();
|
||||
hideValidationError();
|
||||
setMnemonicLanguage();
|
||||
// Get the mnemonic phrase
|
||||
var phrase = DOM.phrase.val();
|
||||
@@ -177,7 +208,6 @@
|
||||
var passphrase = DOM.passphrase.val();
|
||||
calcBip32RootKeyFromSeed(phrase, passphrase);
|
||||
calcForDerivationPath();
|
||||
hidePending();
|
||||
}
|
||||
|
||||
function delayedEntropyChanged() {
|
||||
@@ -240,7 +270,6 @@
|
||||
function rootKeyChanged() {
|
||||
showPending();
|
||||
hideValidationError();
|
||||
// Validate the root key TODO
|
||||
var rootKeyBase58 = DOM.rootKey.val();
|
||||
var errorText = validateRootKey(rootKeyBase58);
|
||||
if (errorText) {
|
||||
@@ -252,10 +281,25 @@
|
||||
calcForDerivationPath();
|
||||
}
|
||||
|
||||
function litecoinUseLtubChanged() {
|
||||
litecoinUseLtub = DOM.litecoinUseLtub.prop("checked");
|
||||
if (litecoinUseLtub) {
|
||||
network = bitcoinjs.bitcoin.networks.litecoinLtub;
|
||||
}
|
||||
else {
|
||||
network = bitcoinjs.bitcoin.networks.litecoin;
|
||||
}
|
||||
phraseChanged();
|
||||
}
|
||||
|
||||
function calcForDerivationPath() {
|
||||
showPending();
|
||||
clearDerivedKeys();
|
||||
clearAddressesList();
|
||||
hideValidationError();
|
||||
showPending();
|
||||
// Don't show bip49 if it's selected but network doesn't support it
|
||||
if (bip49TabSelected() && !networkHasBip49()) {
|
||||
return;
|
||||
}
|
||||
// Get the derivation path
|
||||
var derivationPath = getDerivationPath();
|
||||
var errorText = findDerivationPathErrors(derivationPath);
|
||||
@@ -267,8 +311,10 @@
|
||||
if (bip44TabSelected()) {
|
||||
displayBip44Info();
|
||||
}
|
||||
if (bip49TabSelected()) {
|
||||
displayBip49Info();
|
||||
}
|
||||
displayBip32Info();
|
||||
hidePending();
|
||||
}
|
||||
|
||||
function generateClicked() {
|
||||
@@ -338,11 +384,11 @@
|
||||
|
||||
function calcBip32RootKeyFromSeed(phrase, passphrase) {
|
||||
seed = mnemonic.toSeed(phrase, passphrase);
|
||||
bip32RootKey = bitcoin.HDNode.fromSeedHex(seed, network);
|
||||
bip32RootKey = bitcoinjs.bitcoin.HDNode.fromSeedHex(seed, network);
|
||||
}
|
||||
|
||||
function calcBip32RootKeyFromBase58(rootKeyBase58) {
|
||||
bip32RootKey = bitcoin.HDNode.fromBase58(rootKeyBase58, network);
|
||||
bip32RootKey = bitcoinjs.bitcoin.HDNode.fromBase58(rootKeyBase58, network);
|
||||
}
|
||||
|
||||
function calcBip32ExtendedKey(path) {
|
||||
@@ -360,7 +406,7 @@
|
||||
continue;
|
||||
}
|
||||
var hardened = bit[bit.length-1] == "'";
|
||||
var isPriv = "privKey" in extendedKey;
|
||||
var isPriv = !(extendedKey.isNeutered());
|
||||
var invalidDerivationPath = hardened && !isPriv;
|
||||
if (invalidDerivationPath) {
|
||||
extendedKey = null;
|
||||
@@ -416,7 +462,7 @@
|
||||
|
||||
function validateRootKey(rootKeyBase58) {
|
||||
try {
|
||||
bitcoin.HDNode.fromBase58(rootKeyBase58);
|
||||
bitcoinjs.bitcoin.HDNode.fromBase58(rootKeyBase58, network);
|
||||
}
|
||||
catch (e) {
|
||||
return "Invalid root key";
|
||||
@@ -440,6 +486,21 @@
|
||||
console.log("Using derivation path from BIP44 tab: " + derivationPath);
|
||||
return derivationPath;
|
||||
}
|
||||
if (bip49TabSelected()) {
|
||||
var purpose = parseIntNoNaN(DOM.bip49purpose.val(), 49);
|
||||
var coin = parseIntNoNaN(DOM.bip49coin.val(), 0);
|
||||
var account = parseIntNoNaN(DOM.bip49account.val(), 0);
|
||||
var change = parseIntNoNaN(DOM.bip49change.val(), 0);
|
||||
var path = "m/";
|
||||
path += purpose + "'/";
|
||||
path += coin + "'/";
|
||||
path += account + "'/";
|
||||
path += change;
|
||||
DOM.bip49path.val(path);
|
||||
var derivationPath = DOM.bip49path.val();
|
||||
console.log("Using derivation path from BIP49 tab: " + derivationPath);
|
||||
return derivationPath;
|
||||
}
|
||||
else if (bip32TabSelected()) {
|
||||
var derivationPath = DOM.bip32path.val();
|
||||
console.log("Using derivation path from BIP32 tab: " + derivationPath);
|
||||
@@ -489,8 +550,10 @@
|
||||
return "No root key";
|
||||
}
|
||||
// Check no hardened derivation path when using xpub keys
|
||||
var hardened = path.indexOf("'") > -1;
|
||||
var isXpubkey = !("privKey" in bip32RootKey);
|
||||
var hardenedPath = path.indexOf("'") > -1;
|
||||
var hardenedAddresses = bip32TabSelected() && DOM.hardenedAddresses.prop("checked");
|
||||
var hardened = hardenedPath || hardenedAddresses;
|
||||
var isXpubkey = bip32RootKey.isNeutered();
|
||||
if (hardened && isXpubkey) {
|
||||
return "Hardened derivation path is invalid with xpub key";
|
||||
}
|
||||
@@ -509,24 +572,42 @@
|
||||
// Calculate the account extended keys
|
||||
var accountExtendedKey = calcBip32ExtendedKey(path);
|
||||
var accountXprv = accountExtendedKey.toBase58();
|
||||
var accountXpub = accountExtendedKey.toBase58(false);
|
||||
var accountXpub = accountExtendedKey.neutered().toBase58();
|
||||
// Display the extended keys
|
||||
DOM.bip44accountXprv.val(accountXprv);
|
||||
DOM.bip44accountXpub.val(accountXpub);
|
||||
}
|
||||
|
||||
function displayBip49Info() {
|
||||
// Get the derivation path for the account
|
||||
var purpose = parseIntNoNaN(DOM.bip49purpose.val(), 49);
|
||||
var coin = parseIntNoNaN(DOM.bip49coin.val(), 0);
|
||||
var account = parseIntNoNaN(DOM.bip49account.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.bip49accountXprv.val(accountXprv);
|
||||
DOM.bip49accountXpub.val(accountXpub);
|
||||
}
|
||||
|
||||
function displayBip32Info() {
|
||||
// Display the key
|
||||
DOM.seed.val(seed);
|
||||
var rootKey = bip32RootKey.toBase58();
|
||||
DOM.rootKey.val(rootKey);
|
||||
var xprvkeyB58 = "NA";
|
||||
if (bip32ExtendedKey.privKey) {
|
||||
if (!bip32ExtendedKey.isNeutered()) {
|
||||
xprvkeyB58 = bip32ExtendedKey.toBase58();
|
||||
}
|
||||
var extendedPrivKey = xprvkeyB58;
|
||||
DOM.extendedPrivKey.val(extendedPrivKey);
|
||||
var extendedPubKey = bip32ExtendedKey.toBase58(false);
|
||||
var extendedPubKey = bip32ExtendedKey.neutered().toBase58();
|
||||
DOM.extendedPubKey.val(extendedPubKey);
|
||||
// Display the addresses and privkeys
|
||||
clearAddressesList();
|
||||
@@ -542,21 +623,25 @@
|
||||
for (var i=0; i<rows.length; i++) {
|
||||
rows[i].shouldGenerate = false;
|
||||
}
|
||||
hidePending();
|
||||
}
|
||||
|
||||
for (var i=0; i<total; i++) {
|
||||
var index = i + start;
|
||||
rows.push(new TableRow(index));
|
||||
var isLast = i == total - 1;
|
||||
rows.push(new TableRow(index, isLast));
|
||||
}
|
||||
|
||||
})());
|
||||
}
|
||||
|
||||
function TableRow(index) {
|
||||
function TableRow(index, isLast) {
|
||||
|
||||
var self = this;
|
||||
this.shouldGenerate = true;
|
||||
var useHardenedAddresses = DOM.hardenedAddresses.prop("checked");
|
||||
var isP2wpkhNestedInP2sh = bip49TabSelected() || (bip32TabSelected() && useP2wpkhNestedInP2sh());
|
||||
var p2wpkhNestedInP2shAvailable = networkHasBip49();
|
||||
|
||||
function init() {
|
||||
calculateValues();
|
||||
@@ -567,7 +652,7 @@
|
||||
if (!self.shouldGenerate) {
|
||||
return;
|
||||
}
|
||||
var key = "";
|
||||
var key = "NA";
|
||||
if (useHardenedAddresses) {
|
||||
key = bip32ExtendedKey.deriveHardened(index);
|
||||
}
|
||||
@@ -576,17 +661,17 @@
|
||||
}
|
||||
var address = key.getAddress().toString();
|
||||
var privkey = "NA";
|
||||
if (key.privKey) {
|
||||
privkey = key.privKey.toWIF(network);
|
||||
if (!key.isNeutered()) {
|
||||
privkey = key.keyPair.toWIF(network);
|
||||
}
|
||||
var pubkey = key.pubKey.toHex();
|
||||
var pubkey = key.getPublicKeyBuffer().toString('hex');
|
||||
var indexText = getDerivationPath() + "/" + index;
|
||||
if (useHardenedAddresses) {
|
||||
indexText = indexText + "'";
|
||||
}
|
||||
// Ethereum values are different
|
||||
if (networks[DOM.network.val()].name == "Ethereum") {
|
||||
var privKeyBuffer = key.privKey.d.toBuffer();
|
||||
if (networks[DOM.network.val()].name == "ETH - Ethereum") {
|
||||
var privKeyBuffer = key.keyPair.d.toBuffer();
|
||||
privkey = privKeyBuffer.toString('hex');
|
||||
var addressBuffer = ethUtil.privateToAddress(privKeyBuffer);
|
||||
var hexAddress = addressBuffer.toString('hex');
|
||||
@@ -596,11 +681,25 @@
|
||||
pubkey = ethUtil.addHexPrefix(pubkey);
|
||||
}
|
||||
// Ripple values are different
|
||||
if (networks[DOM.network.val()].name == "Ripple") {
|
||||
if (networks[DOM.network.val()].name == "XRP - Ripple") {
|
||||
privkey = convertRipplePriv(privkey);
|
||||
address = convertRippleAdrr(address);
|
||||
}
|
||||
// BIP49 addresses are different
|
||||
if (isP2wpkhNestedInP2sh) {
|
||||
if (!p2wpkhNestedInP2shAvailable) {
|
||||
return;
|
||||
}
|
||||
var keyhash = bitcoinjs.bitcoin.crypto.hash160(key.getPublicKeyBuffer());
|
||||
var scriptsig = bitcoinjs.bitcoin.script.witnessPubKeyHash.output.encode(keyhash);
|
||||
var addressbytes = bitcoinjs.bitcoin.crypto.hash160(scriptsig);
|
||||
var scriptpubkey = bitcoinjs.bitcoin.script.scriptHash.output.encode(addressbytes);
|
||||
address = bitcoinjs.bitcoin.address.fromOutputScript(scriptpubkey, network)
|
||||
}
|
||||
addAddressToList(indexText, address, pubkey, privkey);
|
||||
if (isLast) {
|
||||
hidePending();
|
||||
}
|
||||
}, 50)
|
||||
}
|
||||
|
||||
@@ -627,7 +726,7 @@
|
||||
|
||||
function clearDisplay() {
|
||||
clearAddressesList();
|
||||
clearKey();
|
||||
clearKeys();
|
||||
hideValidationError();
|
||||
}
|
||||
|
||||
@@ -643,10 +742,20 @@
|
||||
}
|
||||
}
|
||||
|
||||
function clearKey() {
|
||||
function clearKeys() {
|
||||
clearRootKey();
|
||||
clearDerivedKeys();
|
||||
}
|
||||
|
||||
function clearRootKey() {
|
||||
DOM.rootKey.val("");
|
||||
}
|
||||
|
||||
function clearDerivedKeys() {
|
||||
DOM.extendedPrivKey.val("");
|
||||
DOM.extendedPubKey.val("");
|
||||
DOM.bip44accountXprv.val("");
|
||||
DOM.bip44accountXpub.val("");
|
||||
}
|
||||
|
||||
function addAddressToList(indexText, address, pubkey, privkey) {
|
||||
@@ -734,6 +843,9 @@
|
||||
var option = $("<option>");
|
||||
option.attr("value", i);
|
||||
option.text(network.name);
|
||||
if (network.name == "BTC - Bitcoin") {
|
||||
option.prop("selected", true);
|
||||
}
|
||||
DOM.phraseNetwork.append(option);
|
||||
}
|
||||
}
|
||||
@@ -950,6 +1062,16 @@
|
||||
DOM.entropyWordCount.text(wordCount);
|
||||
DOM.entropyBinary.text(entropy.binaryStr);
|
||||
DOM.entropyBitsPerEvent.text(bitsPerEvent);
|
||||
// detect and warn of filtering
|
||||
var rawNoSpaces = DOM.entropy.val().replace(/\s/g, "");
|
||||
var cleanNoSpaces = entropy.cleanStr.replace(/\s/g, "");
|
||||
var isFiltered = rawNoSpaces.length != cleanNoSpaces.length;
|
||||
if (isFiltered) {
|
||||
DOM.entropyFilterWarning.removeClass('hidden');
|
||||
}
|
||||
else {
|
||||
DOM.entropyFilterWarning.addClass('hidden');
|
||||
}
|
||||
}
|
||||
|
||||
function getEntropyTypeStr(entropy) {
|
||||
@@ -1055,140 +1177,247 @@
|
||||
return DOM.bip32tab.hasClass("active");
|
||||
}
|
||||
|
||||
function useP2wpkhNestedInP2sh() {
|
||||
return DOM.useP2wpkhNestedInP2sh.prop("checked");
|
||||
}
|
||||
|
||||
function networkHasBip49() {
|
||||
return networks[DOM.network.val()].p2wpkhNestedInP2shAvailable;
|
||||
}
|
||||
|
||||
function bip49TabSelected() {
|
||||
return DOM.bip49tab.hasClass("active");
|
||||
}
|
||||
|
||||
function setHdCoin(coinValue) {
|
||||
DOM.bip44coin.val(coinValue);
|
||||
DOM.bip49coin.val(coinValue);
|
||||
}
|
||||
|
||||
function showP2wpkhNestedInP2shAvailable() {
|
||||
DOM.bip49unavailable.addClass("hidden");
|
||||
DOM.bip49available.removeClass("hidden");
|
||||
DOM.useP2wpkhNestedInP2sh.prop("disabled", false);
|
||||
}
|
||||
|
||||
function showP2wpkhNestedInP2shUnavailable() {
|
||||
DOM.bip49available.addClass("hidden");
|
||||
DOM.bip49unavailable.removeClass("hidden");
|
||||
DOM.useP2wpkhNestedInP2sh.prop("disabled", true);
|
||||
DOM.useP2wpkhNestedInP2sh.prop("checked", false);
|
||||
}
|
||||
|
||||
var networks = [
|
||||
{
|
||||
name: "Bitcoin",
|
||||
name: "BCH - Bitcoin Cash",
|
||||
p2wpkhNestedInP2shAvailable: false,
|
||||
onSelect: function() {
|
||||
network = bitcoin.networks.bitcoin;
|
||||
DOM.bip44coin.val(0);
|
||||
network = bitcoinjs.bitcoin.networks.bitcoin;
|
||||
setHdCoin(145);
|
||||
},
|
||||
},
|
||||
{
|
||||
name: "Bitcoin Testnet",
|
||||
name: "BTC - Bitcoin",
|
||||
p2wpkhNestedInP2shAvailable: true,
|
||||
onSelect: function() {
|
||||
network = bitcoin.networks.testnet;
|
||||
DOM.bip44coin.val(1);
|
||||
network = bitcoinjs.bitcoin.networks.bitcoin;
|
||||
setHdCoin(0);
|
||||
},
|
||||
},
|
||||
{
|
||||
name: "CLAM",
|
||||
name: "BTC - Bitcoin Testnet",
|
||||
p2wpkhNestedInP2shAvailable: true,
|
||||
onSelect: function() {
|
||||
network = bitcoin.networks.clam;
|
||||
DOM.bip44coin.val(23);
|
||||
network = bitcoinjs.bitcoin.networks.testnet;
|
||||
setHdCoin(1);
|
||||
},
|
||||
},
|
||||
{
|
||||
name: "Dogecoin",
|
||||
name: "CLAM - Clams",
|
||||
p2wpkhNestedInP2shAvailable: false,
|
||||
onSelect: function() {
|
||||
network = bitcoin.networks.dogecoin;
|
||||
DOM.bip44coin.val(3);
|
||||
network = bitcoinjs.bitcoin.networks.clam;
|
||||
setHdCoin(23);
|
||||
},
|
||||
},
|
||||
{
|
||||
name: "DASH",
|
||||
name: "CRW - Crown",
|
||||
p2wpkhNestedInP2shAvailable: false,
|
||||
onSelect: function() {
|
||||
network = bitcoin.networks.dash;
|
||||
DOM.bip44coin.val(5);
|
||||
network = bitcoinjs.bitcoin.networks.crown;
|
||||
setHdCoin(72);
|
||||
},
|
||||
},
|
||||
{
|
||||
name: "DASH Testnet",
|
||||
name: "DASH - Dash",
|
||||
p2wpkhNestedInP2shAvailable: false,
|
||||
onSelect: function() {
|
||||
network = bitcoin.networks.dashtn;
|
||||
DOM.bip44coin.val(1);
|
||||
network = bitcoinjs.bitcoin.networks.dash;
|
||||
setHdCoin(5);
|
||||
},
|
||||
},
|
||||
{
|
||||
name: "Ethereum",
|
||||
name: "DASH - Dash Testnet",
|
||||
p2wpkhNestedInP2shAvailable: false,
|
||||
onSelect: function() {
|
||||
network = bitcoin.networks.bitcoin;
|
||||
DOM.bip44coin.val(60);
|
||||
network = bitcoinjs.bitcoin.networks.dashtn;
|
||||
setHdCoin(1);
|
||||
},
|
||||
},
|
||||
{
|
||||
name: "GAME",
|
||||
name: "DOGE - Dogecoin",
|
||||
p2wpkhNestedInP2shAvailable: false,
|
||||
onSelect: function() {
|
||||
network = bitcoin.networks.game;
|
||||
DOM.bip44coin.val(101);
|
||||
network = bitcoinjs.bitcoin.networks.dogecoin;
|
||||
setHdCoin(3);
|
||||
},
|
||||
},
|
||||
{
|
||||
name: "Jumbucks",
|
||||
name: "ETH - Ethereum",
|
||||
p2wpkhNestedInP2shAvailable: false,
|
||||
onSelect: function() {
|
||||
network = bitcoin.networks.jumbucks;
|
||||
DOM.bip44coin.val(26);
|
||||
network = bitcoinjs.bitcoin.networks.bitcoin;
|
||||
setHdCoin(60);
|
||||
},
|
||||
},
|
||||
{
|
||||
name: "Litecoin",
|
||||
name: "FJC - Fujicoin",
|
||||
p2wpkhNestedInP2shAvailable: false,
|
||||
onSelect: function() {
|
||||
network = bitcoin.networks.litecoin;
|
||||
DOM.bip44coin.val(2);
|
||||
network = bitcoinjs.bitcoin.networks.fujicoin;
|
||||
setHdCoin(75);
|
||||
},
|
||||
},
|
||||
{
|
||||
name: "Namecoin",
|
||||
name: "GAME - GameCredits",
|
||||
p2wpkhNestedInP2shAvailable: false,
|
||||
onSelect: function() {
|
||||
network = bitcoin.networks.namecoin;
|
||||
DOM.bip44coin.val(7);
|
||||
network = bitcoinjs.bitcoin.networks.game;
|
||||
setHdCoin(101);
|
||||
},
|
||||
},
|
||||
{
|
||||
name: "Peercoin",
|
||||
name: "JBS - Jumbucks",
|
||||
p2wpkhNestedInP2shAvailable: false,
|
||||
onSelect: function() {
|
||||
network = bitcoin.networks.peercoin;
|
||||
DOM.bip44coin.val(6);
|
||||
network = bitcoinjs.bitcoin.networks.jumbucks;
|
||||
setHdCoin(26);
|
||||
},
|
||||
},
|
||||
{
|
||||
name: "Ripple",
|
||||
name: "LTC - Litecoin",
|
||||
p2wpkhNestedInP2shAvailable: false,
|
||||
onSelect: function() {
|
||||
network = bitcoin.networks.bitcoin;
|
||||
DOM.bip44coin.val(144);
|
||||
network = bitcoinjs.bitcoin.networks.litecoin;
|
||||
setHdCoin(2);
|
||||
DOM.litecoinLtubContainer.removeClass("hidden");
|
||||
},
|
||||
},
|
||||
{
|
||||
name: "ShadowCash",
|
||||
name: "MAZA - Maza",
|
||||
p2wpkhNestedInP2shAvailable: false,
|
||||
onSelect: function() {
|
||||
network = bitcoin.networks.shadow;
|
||||
DOM.bip44coin.val(35);
|
||||
network = bitcoinjs.bitcoin.networks.maza;
|
||||
setHdCoin(13);
|
||||
},
|
||||
},
|
||||
|
||||
{
|
||||
name: "NMC - Namecoin",
|
||||
p2wpkhNestedInP2shAvailable: false,
|
||||
onSelect: function() {
|
||||
network = bitcoinjs.bitcoin.networks.namecoin;
|
||||
setHdCoin(7);
|
||||
},
|
||||
},
|
||||
{
|
||||
name: "ShadowCash Testnet",
|
||||
name: "PIVX - PIVX",
|
||||
p2wpkhNestedInP2shAvailable: false,
|
||||
onSelect: function() {
|
||||
network = bitcoin.networks.shadowtn;
|
||||
DOM.bip44coin.val(1);
|
||||
network = bitcoinjs.bitcoin.networks.pivx;
|
||||
setHdCoin(119);
|
||||
},
|
||||
},
|
||||
{
|
||||
name: "Slimcoin",
|
||||
name: "PIVX - PIVX Testnet",
|
||||
p2wpkhNestedInP2shAvailable: false,
|
||||
onSelect: function() {
|
||||
network = bitcoin.networks.slimcoin;
|
||||
DOM.bip44coin.val(63);
|
||||
network = bitcoinjs.bitcoin.networks.pivxtestnet;
|
||||
setHdCoin(1);
|
||||
},
|
||||
},
|
||||
{
|
||||
name: "Slimcoin Testnet",
|
||||
name: "PPC - Peercoin",
|
||||
p2wpkhNestedInP2shAvailable: false,
|
||||
onSelect: function() {
|
||||
network = bitcoin.networks.slimcointn;
|
||||
DOM.bip44coin.val(111);
|
||||
network = bitcoinjs.bitcoin.networks.peercoin;
|
||||
setHdCoin(6);
|
||||
},
|
||||
},
|
||||
{
|
||||
name: "Viacoin",
|
||||
name: "SDC - ShadowCash",
|
||||
p2wpkhNestedInP2shAvailable: false,
|
||||
onSelect: function() {
|
||||
network = bitcoin.networks.viacoin;
|
||||
DOM.bip44coin.val(14);
|
||||
network = bitcoinjs.bitcoin.networks.shadow;
|
||||
setHdCoin(35);
|
||||
},
|
||||
},
|
||||
{
|
||||
name: "Viacoin Testnet",
|
||||
name: "SDC - ShadowCash Testnet",
|
||||
p2wpkhNestedInP2shAvailable: false,
|
||||
onSelect: function() {
|
||||
network = bitcoin.networks.viacointestnet;
|
||||
DOM.bip44coin.val(1);
|
||||
network = bitcoinjs.bitcoin.networks.shadowtn;
|
||||
setHdCoin(1);
|
||||
},
|
||||
},
|
||||
{
|
||||
name: "SLM - Slimcoin",
|
||||
p2wpkhNestedInP2shAvailable: false,
|
||||
onSelect: function() {
|
||||
network = bitcoinjs.bitcoin.networks.slimcoin;
|
||||
setHdCoin(63);
|
||||
},
|
||||
},
|
||||
{
|
||||
name: "SLM - Slimcoin Testnet",
|
||||
p2wpkhNestedInP2shAvailable: false,
|
||||
onSelect: function() {
|
||||
network = bitcoinjs.bitcoin.networks.slimcointn;
|
||||
setHdCoin(111);
|
||||
},
|
||||
},
|
||||
{
|
||||
name: "VIA - Viacoin",
|
||||
p2wpkhNestedInP2shAvailable: false,
|
||||
onSelect: function() {
|
||||
network = bitcoinjs.bitcoin.networks.viacoin;
|
||||
setHdCoin(14);
|
||||
},
|
||||
},
|
||||
{
|
||||
name: "VIA - Viacoin Testnet",
|
||||
p2wpkhNestedInP2shAvailable: false,
|
||||
onSelect: function() {
|
||||
network = bitcoinjs.bitcoin.networks.viacointestnet;
|
||||
setHdCoin(1);
|
||||
},
|
||||
},
|
||||
{
|
||||
name: "XMY - Myriadcoin",
|
||||
p2wpkhNestedInP2shAvailable: false,
|
||||
onSelect: function() {
|
||||
network = bitcoinjs.bitcoin.networks.myriadcoin;
|
||||
setHdCoin(90);
|
||||
},
|
||||
},
|
||||
{
|
||||
name: "XRP - Ripple",
|
||||
p2wpkhNestedInP2shAvailable: false,
|
||||
onSelect: function() {
|
||||
network = bitcoinjs.bitcoin.networks.bitcoin;
|
||||
setHdCoin(144);
|
||||
},
|
||||
}
|
||||
]
|
||||
|
||||
var clients = [
|
||||
|
||||
2
src/js/jquery.qrcode.min.js
vendored
2
src/js/jquery.qrcode.min.js
vendored
@@ -23,6 +23,6 @@ this.getLength()-a.getLength())return this;for(var c=l.glog(this.get(0))-l.glog(
|
||||
55,25],[11,45,15,46,46,16],[13,145,115,6,146,116],[14,74,46,23,75,47],[44,54,24,7,55,25],[59,46,16,1,47,17],[12,151,121,7,152,122],[12,75,47,26,76,48],[39,54,24,14,55,25],[22,45,15,41,46,16],[6,151,121,14,152,122],[6,75,47,34,76,48],[46,54,24,10,55,25],[2,45,15,64,46,16],[17,152,122,4,153,123],[29,74,46,14,75,47],[49,54,24,10,55,25],[24,45,15,46,46,16],[4,152,122,18,153,123],[13,74,46,32,75,47],[48,54,24,14,55,25],[42,45,15,32,46,16],[20,147,117,4,148,118],[40,75,47,7,76,48],[43,54,24,22,55,25],[10,
|
||||
45,15,67,46,16],[19,148,118,6,149,119],[18,75,47,31,76,48],[34,54,24,34,55,25],[20,45,15,61,46,16]];p.getRSBlocks=function(a,c){var d=p.getRsBlockTable(a,c);if(void 0==d)throw Error("bad rs block @ typeNumber:"+a+"/errorCorrectLevel:"+c);for(var b=d.length/3,e=[],f=0;f<b;f++)for(var h=d[3*f+0],g=d[3*f+1],j=d[3*f+2],l=0;l<h;l++)e.push(new p(g,j));return e};p.getRsBlockTable=function(a,c){switch(c){case 1:return p.RS_BLOCK_TABLE[4*(a-1)+0];case 0:return p.RS_BLOCK_TABLE[4*(a-1)+1];case 3:return p.RS_BLOCK_TABLE[4*
|
||||
(a-1)+2];case 2:return p.RS_BLOCK_TABLE[4*(a-1)+3]}};t.prototype={get:function(a){return 1==(this.buffer[Math.floor(a/8)]>>>7-a%8&1)},put:function(a,c){for(var d=0;d<c;d++)this.putBit(1==(a>>>c-d-1&1))},getLengthInBits:function(){return this.length},putBit:function(a){var c=Math.floor(this.length/8);this.buffer.length<=c&&this.buffer.push(0);a&&(this.buffer[c]|=128>>>this.length%8);this.length++}};"string"===typeof h&&(h={text:h});h=r.extend({},{render:"canvas",width:256,height:256,typeNumber:-1,
|
||||
correctLevel:2,background:"#ffffff",foreground:"#000000"},h);return this.each(function(){var a;if("canvas"==h.render){a=new o(h.typeNumber,h.correctLevel);a.addData(h.text);a.make();var c=document.createElement("canvas");c.width=h.width;c.height=h.height;for(var d=c.getContext("2d"),b=h.width/a.getModuleCount(),e=h.height/a.getModuleCount(),f=0;f<a.getModuleCount();f++)for(var i=0;i<a.getModuleCount();i++){d.fillStyle=a.isDark(f,i)?h.foreground:h.background;var g=Math.ceil((i+1)*b)-Math.floor(i*b),
|
||||
correctLevel:3,background:"#ffffff",foreground:"#000000"},h);return this.each(function(){var a;if("canvas"==h.render){a=new o(h.typeNumber,h.correctLevel);a.addData(h.text);a.make();var c=document.createElement("canvas");c.width=h.width;c.height=h.height;for(var d=c.getContext("2d"),b=h.width/a.getModuleCount(),e=h.height/a.getModuleCount(),f=0;f<a.getModuleCount();f++)for(var i=0;i<a.getModuleCount();i++){d.fillStyle=a.isDark(f,i)?h.foreground:h.background;var g=Math.ceil((i+1)*b)-Math.floor(i*b),
|
||||
j=Math.ceil((f+1)*b)-Math.floor(f*b);d.fillRect(Math.round(i*b),Math.round(f*e),g,j)}}else{a=new o(h.typeNumber,h.correctLevel);a.addData(h.text);a.make();c=r("<table></table>").css("width",h.width+"px").css("height",h.height+"px").css("border","0px").css("border-collapse","collapse").css("background-color",h.background);d=h.width/a.getModuleCount();b=h.height/a.getModuleCount();for(e=0;e<a.getModuleCount();e++){f=r("<tr></tr>").css("height",b+"px").appendTo(c);for(i=0;i<a.getModuleCount();i++)r("<td></td>").css("width",
|
||||
d+"px").css("background-color",a.isDark(e,i)?h.foreground:h.background).appendTo(f)}}a=c;$(a).appendTo(this)})}})($);
|
||||
|
||||
@@ -1,94 +0,0 @@
|
||||
Translate.loadForeignPhrases("en",
|
||||
{
|
||||
"<code>m/44'/0'/0'/0</code> generates public addresses": "<code>m/44'/0'/0'/0</code> generates public addresses",
|
||||
"<code>m/44'/0'/0'/1</code> generates change addresses": "<code>m/44'/0'/0'/1</code> generates change addresses",
|
||||
"<code>m/44'/0'/0'</code> generates extended keys for import / export": "<code>m/44'/0'/0'</code> generates extended keys for import / export",
|
||||
"<code>m/44'/0'/1'</code> for the next account. Continue incrementing for more accounts (most use a single account).": "<code>m/44'/0'/1'</code> for the next account. Continue incrementing for more accounts (most use a single account).",
|
||||
"Accepts binary, base 6, 6-sided dice, base 10, hexadecimal, cards": "Accepts binary, base 6, 6-sided dice, base 10, hexadecimal, cards",
|
||||
"Account": "Account",
|
||||
"Address": "Address",
|
||||
"Alternatively, download the file from the repository": "Alternatively, download the file from the repository",
|
||||
"BIP32 Derivation Path": "BIP32 Derivation Path",
|
||||
"BIP32 Extended Key": "BIP32 Extended Key",
|
||||
"BIP32 Extended Key (addresses only)": "BIP32 Extended Key (addresses only)",
|
||||
"BIP32 Root Key": "BIP32 Root Key",
|
||||
"BIP39 Mnemonic": "BIP39 Mnemonic",
|
||||
"BIP39 Passphrase (optional)": "BIP39 Passphrase (optional)",
|
||||
"BIP39 Seed": "BIP39 Seed",
|
||||
"Base 10": "Base 10",
|
||||
"Base 6": "Base 6",
|
||||
"Be careful - it can be easy to make mistakes if you don't know what you're doing.": "Be careful - it can be easy to make mistakes if you don't know what you're doing.",
|
||||
"Binary": "Binary",
|
||||
"Bitcoin Core": "Bitcoin Core",
|
||||
"Bits Per Event": "Bits Per Event",
|
||||
"Block Explorers": "Block Explorers",
|
||||
"Can be used with": "Can be used with",
|
||||
"Card": "Card",
|
||||
"Coin": "Coin",
|
||||
"Dice": "Dice",
|
||||
"Do <strong>NOT</strong> use phrases from books, lyrics from songs, your birthday or steet address, keyboard mashing, or anything you <i>think</i> is random, because chances are overwhelming it isn't random enough for the needs of this tool.": "Do <strong>NOT</strong> use phrases from books, lyrics from songs, your birthday or steet address, keyboard mashing, or anything you <i>think</i> is random, because chances are overwhelming it isn't random enough for the needs of this tool.",
|
||||
"Double-click that file to open it in a browser on any offline computer.": "Double-click that file to open it in a browser on any offline computer.",
|
||||
"Entropy": "Entropy",
|
||||
"Entropy Type": "Entropy Type",
|
||||
"Entropy is an advanced feature. Your mnemonic may be insecure if this feature is used incorrectly.": "Entropy is an advanced feature. Your mnemonic may be insecure if this feature is used incorrectly.",
|
||||
"Entropy values must be sourced from a <a href=\"https://en.wikipedia.org/wiki/Random_number_generation\" target=\"_blank\">strong source of randomness</a>.": "Entropy values must be sourced from a <a href=\"https://en.wikipedia.org/wiki/Random_number_generation\" target=\"_blank\">strong source of randomness</a>.",
|
||||
"Event Count": "Event Count",
|
||||
"External / Internal": "External / Internal",
|
||||
"Filtered Entropy": "Filtered Entropy",
|
||||
"For more info see the <a href=\"http://www.mycelium.com/\" target=\"_blank\">Mycelium Wallet homepage</a>": "For more info see the <a href=\"http://www.mycelium.com/\" target=\"_blank\">Mycelium Wallet homepage</a>",
|
||||
"For more info see the <a href=\"https://github.com/bitcoin/bips/blob/master/bip-0039.mediawiki\" target=\"_blank\">BIP39 spec</a>.": "For more info see the <a href=\"https://github.com/bitcoin/bips/blob/master/bip-0039.mediawiki\" target=\"_blank\">BIP39 spec</a>.",
|
||||
"For more info see the <a href=\"https://github.com/bitcoin/bips/blob/master/bip-0044.mediawiki\" target=\"_blank\">BIP44 spec</a>.": "For more info see the <a href=\"https://github.com/bitcoin/bips/blob/master/bip-0044.mediawiki\" target=\"_blank\">BIP44 spec</a>.",
|
||||
"For more info see the <a href=\"https://github.com/bitcoin/bitcoin/pull/8035\" target=\"_blank\">Bitcoin Core BIP32 implementation</a>": "For more info see the <a href=\"https://github.com/bitcoin/bitcoin/pull/8035\" target=\"_blank\">Bitcoin Core BIP32 implementation</a>",
|
||||
"For more info see the BIP32 spec": "For more info see the BIP32 spec",
|
||||
"From entropy length (3 words per 32 bits)": "From entropy length (3 words per 32 bits)",
|
||||
"Generate a random mnemonic, or enter your own below": "Generate a random mnemonic, or enter your own below",
|
||||
"Get the source code from the repository": "Get the source code from the repository",
|
||||
"Hex": "Hex",
|
||||
"Hierarchical Deterministic Wallets": "Hierarchical Deterministic Wallets",
|
||||
"If cryptographic randomness isn't available in your browser, this page will show a warning and the generate button will not work.": "If cryptographic randomness isn't available in your browser, this page will show a warning and the generate button will not work.",
|
||||
"In that case you might choose to use your own source of entropy.": "In that case you might choose to use your own source of entropy.",
|
||||
"In your browser, select file save-as, and save this page as a file.": "In your browser, select file save-as, and save this page as a file.",
|
||||
"Libraries": "Libraries",
|
||||
"Mnemonic Language": "Mnemonic Language",
|
||||
"Mnemonic Length": "Mnemonic Length",
|
||||
"Mnemonic code for generating deterministic keys": "Mnemonic code for generating deterministic keys",
|
||||
"More info": "More info",
|
||||
"Multi-Account Hierarchy for Deterministic Wallets": "Multi-Account Hierarchy for Deterministic Wallets",
|
||||
"Mycelium Wallet": "Mycelium Wallet",
|
||||
"Note these addreses are derived from the BIP32 Extended Key": "Note these addreses are derived from the BIP32 Extended Key",
|
||||
"Offline Usage": "Offline Usage",
|
||||
"Only enter the <code>xpub</code> extended key into block explorer search fields, never the <code>xprv</code> key.": "Only enter the <code>xpub</code> extended key into block explorer search fields, never the <code>xprv</code> key.",
|
||||
"Path": "Path",
|
||||
"Private Key": "Private Key",
|
||||
"Private Keys": "Private Keys",
|
||||
"Public Key": "Public Key",
|
||||
"Purpose": "Purpose",
|
||||
"Raw Binary": "Raw Binary",
|
||||
"Read more": "Read more",
|
||||
"Read more at the <a href=\"https://github.com/bitcoin/bips/blob/master/bip-0032.mediawiki\" target=\"_blank\">official BIP32 spec</a>": "Read more at the <a href=\"https://github.com/bitcoin/bips/blob/master/bip-0032.mediawiki\" target=\"_blank\">official BIP32 spec</a>",
|
||||
"Read more at the <a href=\"https://github.com/bitcoin/bips/blob/master/bip-0039.mediawiki\">official BIP39 spec</a>": "Read more at the <a href=\"https://github.com/bitcoin/bips/blob/master/bip-0039.mediawiki\">official BIP39 spec</a>",
|
||||
"Read more at the <a href=\"https://github.com/bitcoin/bips/blob/master/bip-0044.mediawiki\" target=\"_blank\">official BIP44 spec</a>": "Read more at the <a href=\"https://github.com/bitcoin/bips/blob/master/bip-0044.mediawiki\" target=\"_blank\">official BIP44 spec</a>",
|
||||
"See the demo at <a href=\"http://bip32.org/\" target=\"_blank\">bip32.org</a>": "See the demo at <a href=\"http://bip32.org/\" target=\"_blank\">bip32.org</a>",
|
||||
"Show": "Show",
|
||||
"Show more rows": "Show more rows",
|
||||
"Strength": "Strength",
|
||||
"Supply my own source of entropy": "Supply my own source of entropy",
|
||||
"The built in random generator can generally be trusted more than your own intuition about randomness.": "The built in random generator can generally be trusted more than your own intuition about randomness.",
|
||||
"The random mnemonic generator on this page uses a <a href=\"https://developer.mozilla.org/en-US/docs/Web/API/RandomSource/getRandomValues\" target=\"_blank\">cryptographically secure random number generator</a>.": "The random mnemonic generator on this page uses a <a href=\"https://developer.mozilla.org/en-US/docs/Web/API/RandomSource/getRandomValues\" target=\"_blank\">cryptographically secure random number generator</a>.",
|
||||
"This means flipping a fair coin, rolling a fair dice, noise measurements etc.": "This means flipping a fair coin, rolling a fair dice, noise measurements etc.",
|
||||
"This project is 100% open-source code": "This project is 100% open-source code",
|
||||
"Toggle": "Toggle",
|
||||
"Total Bits": "Total Bits",
|
||||
"Use hardened addresses": "Use hardened addresses",
|
||||
"Use path <code>m/0'/0'</code> with hardened addresses.": "Use path <code>m/0'/0'</code> with hardened addresses.",
|
||||
"Use path <code>m/44'/0'/0'</code>.": "Use path <code>m/44'/0'/0'</code>.",
|
||||
"Use private keys at <a href=\"https://web.archive.org/web/20150707020924/https://brainwallet.org/\" target=\"_blank\">brainwallet.org</a>.": "Use private keys at <a href=\"https://web.archive.org/web/20150707020924/https://brainwallet.org/\" target=\"_blank\">brainwallet.org</a>.",
|
||||
"Valid entropy values include:": "Valid entropy values include:",
|
||||
"Warning": "Warning",
|
||||
"Word Count": "Word Count",
|
||||
"You are not a good source of entropy.": "You are not a good source of entropy.",
|
||||
"You can enter an existing BIP39 mnemonic, or generate a new random one. Typing your own twelve words will probably not work how you expect, since the words require a particular structure (the last word is a checksum).": "You can enter an existing BIP39 mnemonic, or generate a new random one. Typing your own twelve words will probably not work how you expect, since the words require a particular structure (the last word is a checksum).",
|
||||
"You can use this tool without having to be online.": "You can use this tool without having to be online.",
|
||||
"words": "words"
|
||||
}
|
||||
);
|
||||
@@ -1,153 +0,0 @@
|
||||
// An extremely basic translation library
|
||||
//
|
||||
// Example usage:
|
||||
//
|
||||
// Set some html to be translated. Do this using the 'data-translate' attribute:
|
||||
//
|
||||
// <div data-translate>Test</div>
|
||||
// <div data-translate-html><em>keep em tag</em></div>
|
||||
// <input data-translate-placeholder placeholder="Example placeholder">
|
||||
// <span data-translate-title title="Example title"></span>
|
||||
//
|
||||
// Obtain all the phrases to be translated via js debug console:
|
||||
//
|
||||
// Translate.phrasesAsJson();
|
||||
//
|
||||
// Use that template to translate the phrases into another language.
|
||||
// Leave the key the same. Change the value to the new language.
|
||||
//
|
||||
// Create a js file to load the new phrases. In this example for Spanish,
|
||||
// es.js will contain the following code:
|
||||
//
|
||||
// Translate.loadForeignPhrases("es", {
|
||||
// "Test": "Test in Spanish",
|
||||
// "<em>keep em tag</em>": "<em>keep em tag in Spanish</em>",
|
||||
// "Example placeholder": "Example placeholder in Spanish"
|
||||
// "Example title": "Example title in Spanish"
|
||||
// });
|
||||
//
|
||||
// In your UI put a listener for clicking on the Spanish button:
|
||||
//
|
||||
// mySpanishButton.addEventListener("click", function() {
|
||||
// Translate.setLanguage("es");
|
||||
// });
|
||||
// myEnglishButton.addEventListener("click", function() {
|
||||
// Translate.setLanguage("en");
|
||||
// });
|
||||
|
||||
Translate = new (function() {
|
||||
|
||||
var defaultLanguage = "en";
|
||||
|
||||
var allPhrases = {};
|
||||
allPhrases[defaultLanguage] = {};
|
||||
|
||||
// Node types
|
||||
|
||||
var text = {
|
||||
selector: "[data-translate]",
|
||||
getKey: function() {
|
||||
return this.textContent.trim().replace(/\s+/g, " ");
|
||||
},
|
||||
setPhrase: function(p) {
|
||||
this.textContent = p;
|
||||
},
|
||||
}
|
||||
|
||||
var html = {
|
||||
selector: "[data-translate-html]",
|
||||
getKey: function() {
|
||||
return this.innerHTML.trim().replace(/\s+/g, " ");
|
||||
},
|
||||
setPhrase: function(p) {
|
||||
this.innerHTML = p;
|
||||
},
|
||||
}
|
||||
|
||||
var placeholder = {
|
||||
selector: "[data-translate-placeholder]",
|
||||
getKey: function() {
|
||||
return this.getAttribute("placeholder").trim().replace(/\s+/g, " ");
|
||||
},
|
||||
setPhrase: function(p) {
|
||||
this.setAttribute("placeholder", p);
|
||||
},
|
||||
}
|
||||
|
||||
var title = {
|
||||
selector: "[data-translate-title]",
|
||||
getKey: function() {
|
||||
return this.getAttribute("title").trim().replace(/\s+/g, " ");
|
||||
},
|
||||
setPhrase: function(p) {
|
||||
this.setAttribute("title", p);
|
||||
},
|
||||
}
|
||||
|
||||
// Get elements to be translated
|
||||
var allEls = getEls(text)
|
||||
.concat(getEls(html))
|
||||
.concat(getEls(placeholder))
|
||||
.concat(getEls(title));
|
||||
|
||||
// Provides access to phrases from a non-default language.
|
||||
// See phrases_en.js for example usage.
|
||||
this.loadForeignPhrases = function(language, phrases) {
|
||||
allPhrases[language] = phrases;
|
||||
}
|
||||
|
||||
// Displays a different language, eg "en" or "fr"
|
||||
this.setLanguage = function(language) {
|
||||
for (var i=0; i<allEls.length; i++) {
|
||||
var el = allEls[i];
|
||||
var key = el.key;
|
||||
if (!(language in allPhrases)) {
|
||||
console.log(language + " not in allPhrases");
|
||||
return;
|
||||
}
|
||||
if (!(key in allPhrases[language])) {
|
||||
console.log(language + " does not contain phrase: " + key);
|
||||
return;
|
||||
}
|
||||
var phrase = allPhrases[language][key];
|
||||
el.setPhrase(phrase);
|
||||
}
|
||||
}
|
||||
|
||||
// Converts the phrases to a key-pair json file.
|
||||
// This is a good way to export phrases for use in translation tools.
|
||||
this.phrasesAsJson = function(language) {
|
||||
var keys = [];
|
||||
for (var i=0; i<allEls.length; i++) {
|
||||
var el = allEls[i];
|
||||
var key = el.key;
|
||||
keys.push(key);
|
||||
}
|
||||
keys.sort();
|
||||
var output = {};
|
||||
for (var i=0; i<keys.length; i++) {
|
||||
var key = keys[i];
|
||||
var translated = "";
|
||||
if (language in allPhrases && key in allPhrases[language]) {
|
||||
translated = allPhrases[language][key];
|
||||
}
|
||||
output[key] = translated;
|
||||
}
|
||||
return JSON.stringify(output, null, 2);
|
||||
}
|
||||
|
||||
function getEls(nodeType) {
|
||||
var nodes = document.querySelectorAll(nodeType.selector);
|
||||
var els = [];
|
||||
for (var i=0; i<nodes.length; i++) {
|
||||
var node = nodes[i];
|
||||
node.getKey = nodeType.getKey;
|
||||
node.setPhrase = nodeType.setPhrase;
|
||||
node.key = node.getKey();
|
||||
allPhrases[defaultLanguage][node.key] = node.key;
|
||||
els.push(node);
|
||||
}
|
||||
return els;
|
||||
}
|
||||
|
||||
})();
|
||||
@@ -25,4 +25,4 @@ var time_estimates;time_estimates={estimate_attack_times:function(e){var t,n,s,o
|
||||
|
||||
},{}]},{},[4])(4)
|
||||
});
|
||||
//# sourceMappingURL=zxcvbn.js.map
|
||||
|
||||
|
||||
758
tests.js
758
tests.js
@@ -281,7 +281,7 @@ page.open(url, function(status) {
|
||||
$(".phrase").trigger("input");
|
||||
$(".network option[selected]").removeAttr("selected");
|
||||
$(".network option").filter(function() {
|
||||
return $(this).html() == "Bitcoin Testnet";
|
||||
return $(this).html() == "BTC - Bitcoin Testnet";
|
||||
}).prop("selected", true);
|
||||
$(".network").trigger("change");
|
||||
});
|
||||
@@ -311,7 +311,7 @@ page.open(url, function(status) {
|
||||
$(".phrase").trigger("input");
|
||||
$(".network option[selected]").removeAttr("selected");
|
||||
$(".network option").filter(function() {
|
||||
return $(this).html() == "Litecoin";
|
||||
return $(this).html() == "LTC - Litecoin";
|
||||
}).prop("selected", true);
|
||||
$(".network").trigger("change");
|
||||
});
|
||||
@@ -341,7 +341,7 @@ page.open(url, function(status) {
|
||||
$(".phrase").trigger("input");
|
||||
$(".network option[selected]").removeAttr("selected");
|
||||
$(".network option").filter(function() {
|
||||
return $(this).html() == "Ripple";
|
||||
return $(this).html() == "XRP - Ripple";
|
||||
}).prop("selected", true);
|
||||
$(".network").trigger("change");
|
||||
});
|
||||
@@ -371,7 +371,7 @@ page.open(url, function(status) {
|
||||
$(".phrase").trigger("input");
|
||||
$(".network option[selected]").removeAttr("selected");
|
||||
$(".network option").filter(function() {
|
||||
return $(this).html() == "Dogecoin";
|
||||
return $(this).html() == "DOGE - Dogecoin";
|
||||
}).prop("selected", true);
|
||||
$(".network").trigger("change");
|
||||
});
|
||||
@@ -401,7 +401,7 @@ page.open(url, function(status) {
|
||||
$(".phrase").trigger("input");
|
||||
$(".network option[selected]").removeAttr("selected");
|
||||
$(".network option").filter(function() {
|
||||
return $(this).html() == "ShadowCash";
|
||||
return $(this).html() == "SDC - ShadowCash";
|
||||
}).prop("selected", true);
|
||||
$(".network").trigger("change");
|
||||
});
|
||||
@@ -431,7 +431,7 @@ page.open(url, function(status) {
|
||||
$(".phrase").trigger("input");
|
||||
$(".network option[selected]").removeAttr("selected");
|
||||
$(".network option").filter(function() {
|
||||
return $(this).html() == "ShadowCash Testnet";
|
||||
return $(this).html() == "SDC - ShadowCash Testnet";
|
||||
}).prop("selected", true);
|
||||
$(".network").trigger("change");
|
||||
});
|
||||
@@ -461,7 +461,7 @@ page.open(url, function(status) {
|
||||
$(".phrase").trigger("input");
|
||||
$(".network option[selected]").removeAttr("selected");
|
||||
$(".network option").filter(function() {
|
||||
return $(this).html() == "Viacoin";
|
||||
return $(this).html() == "VIA - Viacoin";
|
||||
}).prop("selected", true);
|
||||
$(".network").trigger("change");
|
||||
});
|
||||
@@ -491,7 +491,7 @@ page.open(url, function(status) {
|
||||
$(".phrase").trigger("input");
|
||||
$(".network option[selected]").removeAttr("selected");
|
||||
$(".network option").filter(function() {
|
||||
return $(this).html() == "Viacoin Testnet";
|
||||
return $(this).html() == "VIA - Viacoin Testnet";
|
||||
}).prop("selected", true);
|
||||
$(".network").trigger("change");
|
||||
});
|
||||
@@ -521,7 +521,7 @@ page.open(url, function(status) {
|
||||
$(".phrase").trigger("input");
|
||||
$(".network option[selected]").removeAttr("selected");
|
||||
$(".network option").filter(function() {
|
||||
return $(this).html() == "Jumbucks";
|
||||
return $(this).html() == "JBS - Jumbucks";
|
||||
}).prop("selected", true);
|
||||
$(".network").trigger("change");
|
||||
});
|
||||
@@ -551,7 +551,7 @@ page.open(url, function(status) {
|
||||
$(".phrase").trigger("input");
|
||||
$(".network option[selected]").removeAttr("selected");
|
||||
$(".network option").filter(function() {
|
||||
return $(this).html() == "CLAM";
|
||||
return $(this).html() == "CLAM - Clams";
|
||||
}).prop("selected", true);
|
||||
$(".network").trigger("change");
|
||||
});
|
||||
@@ -571,6 +571,36 @@ page.open(url, function(status) {
|
||||
});
|
||||
},
|
||||
|
||||
// Network can be set to crown
|
||||
function() {
|
||||
page.open(url, function(status) {
|
||||
// set the phrase and coin
|
||||
var expected = "18pWSwSUAQdiwMHUfFZB1fM2xue9X1FqE5";
|
||||
page.evaluate(function() {
|
||||
$(".phrase").val("abandon abandon ability");
|
||||
$(".phrase").trigger("input");
|
||||
$(".network option[selected]").removeAttr("selected");
|
||||
$(".network option").filter(function() {
|
||||
return $(this).html() == "CRW - Crown";
|
||||
}).prop("selected", true);
|
||||
$(".network").trigger("change");
|
||||
});
|
||||
// check the address is generated correctly
|
||||
waitForGenerate(function() {
|
||||
var actual = page.evaluate(function() {
|
||||
return $(".address:first").text();
|
||||
});
|
||||
if (actual != expected) {
|
||||
console.log("CRW address is incorrect");
|
||||
console.log("Expected: " + expected);
|
||||
console.log("Actual: " + actual);
|
||||
fail();
|
||||
}
|
||||
next();
|
||||
});
|
||||
});
|
||||
},
|
||||
|
||||
// Network can be set to dash
|
||||
function() {
|
||||
page.open(url, function(status) {
|
||||
@@ -581,7 +611,7 @@ page.open(url, function(status) {
|
||||
$(".phrase").trigger("input");
|
||||
$(".network option[selected]").removeAttr("selected");
|
||||
$(".network option").filter(function() {
|
||||
return $(this).html() == "DASH";
|
||||
return $(this).html() == "DASH - Dash";
|
||||
}).prop("selected", true);
|
||||
$(".network").trigger("change");
|
||||
});
|
||||
@@ -610,7 +640,7 @@ page.open(url, function(status) {
|
||||
$(".phrase").trigger("input");
|
||||
$(".network option[selected]").removeAttr("selected");
|
||||
$(".network option").filter(function() {
|
||||
return $(this).html() == "DASH Testnet";
|
||||
return $(this).html() == "DASH - Dash Testnet";
|
||||
}).prop("selected", true);
|
||||
$(".network").trigger("change");
|
||||
});
|
||||
@@ -640,7 +670,7 @@ page.open(url, function(status) {
|
||||
$(".phrase").trigger("input");
|
||||
$(".network option[selected]").removeAttr("selected");
|
||||
$(".network option").filter(function() {
|
||||
return $(this).html() == "GAME";
|
||||
return $(this).html() == "GAME - GameCredits";
|
||||
}).prop("selected", true);
|
||||
$(".network").trigger("change");
|
||||
});
|
||||
@@ -670,7 +700,7 @@ page.open(url, function(status) {
|
||||
$(".phrase").trigger("input");
|
||||
$(".network option[selected]").removeAttr("selected");
|
||||
$(".network option").filter(function() {
|
||||
return $(this).html() == "Namecoin";
|
||||
return $(this).html() == "NMC - Namecoin";
|
||||
}).prop("selected", true);
|
||||
$(".network").trigger("change");
|
||||
});
|
||||
@@ -700,7 +730,7 @@ page.open(url, function(status) {
|
||||
$(".phrase").trigger("input");
|
||||
$(".network option[selected]").removeAttr("selected");
|
||||
$(".network option").filter(function() {
|
||||
return $(this).html() == "Peercoin";
|
||||
return $(this).html() == "PPC - Peercoin";
|
||||
}).prop("selected", true);
|
||||
$(".network").trigger("change");
|
||||
});
|
||||
@@ -731,7 +761,7 @@ page.open(url, function(status) {
|
||||
$(".phrase").trigger("input");
|
||||
$(".network option[selected]").removeAttr("selected");
|
||||
$(".network option").filter(function() {
|
||||
return $(this).html() == "Ethereum";
|
||||
return $(this).html() == "ETH - Ethereum";
|
||||
}).prop("selected", true);
|
||||
$(".network").trigger("change");
|
||||
});
|
||||
@@ -792,7 +822,7 @@ page.open(url, function(status) {
|
||||
$(".phrase").trigger("input");
|
||||
$(".network option[selected]").removeAttr("selected");
|
||||
$(".network option").filter(function() {
|
||||
return $(this).html() == "Slimcoin";
|
||||
return $(this).html() == "SLM - Slimcoin";
|
||||
}).prop("selected", true);
|
||||
$(".network").trigger("change");
|
||||
});
|
||||
@@ -822,7 +852,7 @@ page.open(url, function(status) {
|
||||
$(".phrase").trigger("input");
|
||||
$(".network option[selected]").removeAttr("selected");
|
||||
$(".network option").filter(function() {
|
||||
return $(this).html() == "Slimcoin Testnet";
|
||||
return $(this).html() == "SLM - Slimcoin Testnet";
|
||||
}).prop("selected", true);
|
||||
$(".network").trigger("change");
|
||||
});
|
||||
@@ -842,6 +872,156 @@ page.open(url, function(status) {
|
||||
});
|
||||
},
|
||||
|
||||
// Network can be set to bitcoin cash
|
||||
function() {
|
||||
page.open(url, function(status) {
|
||||
// set the phrase and coin
|
||||
var expected = "1JKvb6wKtsjNoCRxpZ4DGrbniML7z5U16A";
|
||||
page.evaluate(function() {
|
||||
$(".phrase").val("abandon abandon ability");
|
||||
$(".phrase").trigger("input");
|
||||
$(".network option[selected]").removeAttr("selected");
|
||||
$(".network option").filter(function() {
|
||||
return $(this).html() == "BCH - Bitcoin Cash";
|
||||
}).prop("selected", true);
|
||||
$(".network").trigger("change");
|
||||
});
|
||||
// check the address is generated correctly
|
||||
waitForGenerate(function() {
|
||||
var actual = page.evaluate(function() {
|
||||
return $(".address:first").text();
|
||||
});
|
||||
if (actual != expected) {
|
||||
console.log("Bitcoin Cash address is incorrect");
|
||||
console.log("Expected: " + expected);
|
||||
console.log("Actual: " + actual);
|
||||
fail();
|
||||
}
|
||||
next();
|
||||
});
|
||||
});
|
||||
},
|
||||
|
||||
// Network can be set to myriadcoin
|
||||
function() {
|
||||
page.open(url, function(status) {
|
||||
// set the phrase and coin
|
||||
var expected = "MJEswvRR46wh9BoiVj9DzKYMBkCramhoBV";
|
||||
page.evaluate(function() {
|
||||
$(".phrase").val("abandon abandon ability");
|
||||
$(".phrase").trigger("input");
|
||||
$(".network option[selected]").removeAttr("selected");
|
||||
$(".network option").filter(function() {
|
||||
return $(this).html() == "XMY - Myriadcoin";
|
||||
}).prop("selected", true);
|
||||
$(".network").trigger("change");
|
||||
});
|
||||
// check the address is generated correctly
|
||||
waitForGenerate(function() {
|
||||
var actual = page.evaluate(function() {
|
||||
return $(".address:first").text();
|
||||
});
|
||||
if (actual != expected) {
|
||||
console.log("Myriadcoin address is incorrect");
|
||||
console.log("Expected: " + expected);
|
||||
console.log("Actual: " + actual);
|
||||
fail();
|
||||
}
|
||||
next();
|
||||
});
|
||||
});
|
||||
},
|
||||
|
||||
// Network can be set to pivx
|
||||
function() {
|
||||
page.open(url, function(status) {
|
||||
// set the phrase and coin
|
||||
var expected = "DBxgT7faCuno7jmtKuu6KWCiwqsVPqh1tS";
|
||||
page.evaluate(function() {
|
||||
$(".phrase").val("abandon abandon ability");
|
||||
$(".phrase").trigger("input");
|
||||
$(".network option[selected]").removeAttr("selected");
|
||||
$(".network option").filter(function() {
|
||||
return $(this).html() == "PIVX - PIVX";
|
||||
}).prop("selected", true);
|
||||
$(".network").trigger("change");
|
||||
});
|
||||
// check the address is generated correctly
|
||||
waitForGenerate(function() {
|
||||
var actual = page.evaluate(function() {
|
||||
return $(".address:first").text();
|
||||
});
|
||||
if (actual != expected) {
|
||||
console.log("PIVX address is incorrect");
|
||||
console.log("Expected: " + expected);
|
||||
console.log("Actual: " + actual);
|
||||
fail();
|
||||
}
|
||||
next();
|
||||
});
|
||||
});
|
||||
},
|
||||
|
||||
// Network can be set to pivx testnet
|
||||
function() {
|
||||
page.open(url, function(status) {
|
||||
// set the phrase and coin
|
||||
var expected = "yB5U384n6dGkVE3by5y9VdvHHPwPg68fQj";
|
||||
page.evaluate(function() {
|
||||
$(".phrase").val("abandon abandon ability");
|
||||
$(".phrase").trigger("input");
|
||||
$(".network option[selected]").removeAttr("selected");
|
||||
$(".network option").filter(function() {
|
||||
return $(this).html() == "PIVX - PIVX Testnet";
|
||||
}).prop("selected", true);
|
||||
$(".network").trigger("change");
|
||||
});
|
||||
// check the address is generated correctly
|
||||
waitForGenerate(function() {
|
||||
var actual = page.evaluate(function() {
|
||||
return $(".address:first").text();
|
||||
});
|
||||
if (actual != expected) {
|
||||
console.log("PIVX Testnet address is incorrect");
|
||||
console.log("Expected: " + expected);
|
||||
console.log("Actual: " + actual);
|
||||
fail();
|
||||
}
|
||||
next();
|
||||
});
|
||||
});
|
||||
},
|
||||
|
||||
// Network can be set to maza
|
||||
function() {
|
||||
page.open(url, function(status) {
|
||||
// set the phrase and coin
|
||||
var expected = "MGW4Bmi2NEm4PxSjgeFwhP9vg18JHoRnfw";
|
||||
page.evaluate(function() {
|
||||
$(".phrase").val("abandon abandon ability");
|
||||
$(".phrase").trigger("input");
|
||||
$(".network option[selected]").removeAttr("selected");
|
||||
$(".network option").filter(function() {
|
||||
return $(this).html() == "MAZA - Maza";
|
||||
}).prop("selected", true);
|
||||
$(".network").trigger("change");
|
||||
});
|
||||
// check the address is generated correctly
|
||||
waitForGenerate(function() {
|
||||
var actual = page.evaluate(function() {
|
||||
return $(".address:first").text();
|
||||
});
|
||||
if (actual != expected) {
|
||||
console.log("Maza address is incorrect");
|
||||
console.log("Expected: " + expected);
|
||||
console.log("Actual: " + actual);
|
||||
fail();
|
||||
}
|
||||
next();
|
||||
});
|
||||
});
|
||||
},
|
||||
|
||||
// BIP39 seed is set from phrase
|
||||
function() {
|
||||
page.open(url, function(status) {
|
||||
@@ -998,70 +1178,6 @@ page.open(url, function(status) {
|
||||
});
|
||||
},
|
||||
|
||||
// BIP44 purpose field changes address list
|
||||
function() {
|
||||
page.open(url, function(status) {
|
||||
// set the phrase
|
||||
var expected = "1JbDzRJ2cDT8aat2xwKd6Pb2zzavow5MhF";
|
||||
page.evaluate(function() {
|
||||
$(".phrase").val("abandon abandon ability");
|
||||
$(".phrase").trigger("input");
|
||||
});
|
||||
waitForGenerate(function() {
|
||||
// change the bip44 purpose field to 45
|
||||
page.evaluate(function() {
|
||||
$("#bip44 .purpose").val("45");
|
||||
$("#bip44 .purpose").trigger("input");
|
||||
});
|
||||
waitForGenerate(function() {
|
||||
// check the address for the new derivation path
|
||||
var actual = page.evaluate(function() {
|
||||
return $(".address:first").text();
|
||||
});
|
||||
if (actual != expected) {
|
||||
console.log("BIP44 purpose field generates incorrect address");
|
||||
console.log("Expected: " + expected);
|
||||
console.log("Actual: " + actual);
|
||||
fail();
|
||||
}
|
||||
next();
|
||||
});
|
||||
});
|
||||
});
|
||||
},
|
||||
|
||||
// BIP44 coin field changes address list
|
||||
function() {
|
||||
page.open(url, function(status) {
|
||||
// set the phrase
|
||||
var expected = "1F6dB2djQYrxoyfZZmfr6D5voH8GkJTghk";
|
||||
page.evaluate(function() {
|
||||
$(".phrase").val("abandon abandon ability");
|
||||
$(".phrase").trigger("input");
|
||||
});
|
||||
waitForGenerate(function() {
|
||||
// change the bip44 purpose field to 45
|
||||
page.evaluate(function() {
|
||||
$("#bip44 .coin").val("1");
|
||||
$("#bip44 .coin").trigger("input");
|
||||
});
|
||||
waitForGenerate(function() {
|
||||
// check the address for the new derivation path
|
||||
var actual = page.evaluate(function() {
|
||||
return $(".address:first").text();
|
||||
});
|
||||
if (actual != expected) {
|
||||
console.log("BIP44 coin field generates incorrect address");
|
||||
console.log("Expected: " + expected);
|
||||
console.log("Actual: " + actual);
|
||||
fail();
|
||||
}
|
||||
next();
|
||||
});
|
||||
});
|
||||
});
|
||||
},
|
||||
|
||||
// BIP44 account field changes address list
|
||||
function() {
|
||||
page.open(url, function(status) {
|
||||
@@ -2014,7 +2130,7 @@ page.open(url, function(status) {
|
||||
// 4) switch from bitcoin to litecoin
|
||||
page.evaluate(function() {
|
||||
$(".network option").filter(function() {
|
||||
return $(this).html() == "Litecoin";
|
||||
return $(this).html() == "LTC - Litecoin";
|
||||
}).prop("selected", true);
|
||||
$(".network").trigger("change");
|
||||
});
|
||||
@@ -2060,7 +2176,7 @@ page.open(url, function(status) {
|
||||
// switch from bitcoin to clam
|
||||
page.evaluate(function() {
|
||||
$(".network option").filter(function() {
|
||||
return $(this).html() == "CLAM";
|
||||
return $(this).html() == "CLAM - Clams";
|
||||
}).prop("selected", true);
|
||||
$(".network").trigger("change");
|
||||
});
|
||||
@@ -2094,7 +2210,7 @@ page.open(url, function(status) {
|
||||
// 4) switch from bitcoin to viacoin
|
||||
page.evaluate(function() {
|
||||
$(".network option").filter(function() {
|
||||
return $(this).html() == "Viacoin";
|
||||
return $(this).html() == "VIA - Viacoin";
|
||||
}).prop("selected", true);
|
||||
$(".network").trigger("change");
|
||||
});
|
||||
@@ -3362,7 +3478,7 @@ page.open(url, function(status) {
|
||||
// check the BIP44 account extended private key
|
||||
waitForGenerate(function() {
|
||||
var actual = page.evaluate(function() {
|
||||
return $(".account-xprv").val();
|
||||
return $("#bip44 .account-xprv").val();
|
||||
});
|
||||
if (actual != expected) {
|
||||
console.log("BIP44 account extended private key is incorrect");
|
||||
@@ -3388,7 +3504,7 @@ page.open(url, function(status) {
|
||||
// check the BIP44 account extended public key
|
||||
waitForGenerate(function() {
|
||||
var actual = page.evaluate(function() {
|
||||
return $(".account-xpub").val();
|
||||
return $("#bip44 .account-xpub").val();
|
||||
});
|
||||
if (actual != expected) {
|
||||
console.log("BIP44 account extended public key is incorrect");
|
||||
@@ -3760,6 +3876,474 @@ page.open(url, function(status) {
|
||||
});
|
||||
},
|
||||
|
||||
// BIP49 official test vectors
|
||||
// https://github.com/bitcoin/bips/blob/master/bip-0049.mediawiki#test-vectors
|
||||
function() {
|
||||
page.open(url, function(status) {
|
||||
// set the phrase and select bitcoin testnet
|
||||
var expected = "2Mww8dCYPUpKHofjgcXcBCEGmniw9CoaiD2";
|
||||
page.evaluate(function() {
|
||||
$("#bip49-tab a").click();
|
||||
$(".phrase").val("abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon about");
|
||||
$(".network option[selected]").removeAttr("selected");
|
||||
$(".network option").filter(function() {
|
||||
return $(this).html() == "BTC - Bitcoin Testnet";
|
||||
}).prop("selected", true);
|
||||
$(".network").trigger("change");
|
||||
$(".phrase").trigger("input");
|
||||
});
|
||||
// check the first address
|
||||
waitForGenerate(function() {
|
||||
var actual = page.evaluate(function() {
|
||||
return $(".address:first").text();
|
||||
});
|
||||
if (actual != expected) {
|
||||
console.log("BIP49 address is incorrect");
|
||||
console.log("Expected: " + expected);
|
||||
console.log("Actual: " + actual);
|
||||
fail();
|
||||
}
|
||||
next();
|
||||
});
|
||||
});
|
||||
},
|
||||
|
||||
// BIP49 derivation path is shown
|
||||
function() {
|
||||
page.open(url, function(status) {
|
||||
// set the phrase
|
||||
var expected = "m/49'/0'/0'/0";
|
||||
page.evaluate(function() {
|
||||
$("#bip49-tab a").click();
|
||||
$(".phrase").val("abandon abandon ability").trigger("input");
|
||||
});
|
||||
// check the derivation path of the first address
|
||||
waitForGenerate(function() {
|
||||
var actual = page.evaluate(function() {
|
||||
return $("#bip49 .path").val();
|
||||
});
|
||||
if (actual != expected) {
|
||||
console.log("BIP49 derivation path is incorrect");
|
||||
console.log("Expected: " + expected);
|
||||
console.log("Actual: " + actual);
|
||||
fail();
|
||||
}
|
||||
next();
|
||||
});
|
||||
});
|
||||
},
|
||||
|
||||
// BIP49 extended private key is shown
|
||||
function() {
|
||||
page.open(url, function(status) {
|
||||
// set the phrase
|
||||
var expected = "xprvA1hukYsW7QfX9CVsaDAKde4eryajKa4DKWb6m9YjSnqkiZHrahFwwTJfEQTwBQ5kptWT5pZMkkusT1oK8dc1efQ8VFfq4SLSPAWd7Cpt423";
|
||||
page.evaluate(function() {
|
||||
$("#bip49-tab a").click();
|
||||
$(".phrase").val("abandon abandon ability").trigger("input");
|
||||
});
|
||||
// check the BIP49 extended private key
|
||||
waitForGenerate(function() {
|
||||
var actual = page.evaluate(function() {
|
||||
return $(".extended-priv-key").val();
|
||||
});
|
||||
if (actual != expected) {
|
||||
console.log("BIP49 extended private key is incorrect");
|
||||
console.log("Expected: " + expected);
|
||||
console.log("Actual: " + actual);
|
||||
fail();
|
||||
}
|
||||
next();
|
||||
});
|
||||
});
|
||||
},
|
||||
|
||||
// BIP49 extended public key is shown
|
||||
function() {
|
||||
page.open(url, function(status) {
|
||||
// set the phrase
|
||||
var expected = "xpub6EhGA4QPwnDpMgaLgEhKzn1PR1RDj2n4gjWhZXxM18NjbMd18EaCVFd95gkLARJaBD2rXAYJED2gdkUbGn1KkrSzCKR554AdABUELoainnt";
|
||||
page.evaluate(function() {
|
||||
$("#bip49-tab a").click();
|
||||
$(".phrase").val("abandon abandon ability").trigger("input");
|
||||
});
|
||||
// check the BIP49 extended public key
|
||||
waitForGenerate(function() {
|
||||
var actual = page.evaluate(function() {
|
||||
return $(".extended-pub-key").val();
|
||||
});
|
||||
if (actual != expected) {
|
||||
console.log("BIP49 extended public key is incorrect");
|
||||
console.log("Expected: " + expected);
|
||||
console.log("Actual: " + actual);
|
||||
fail();
|
||||
}
|
||||
next();
|
||||
});
|
||||
});
|
||||
},
|
||||
|
||||
// BIP49 account field changes address list
|
||||
function() {
|
||||
page.open(url, function(status) {
|
||||
// set the phrase
|
||||
var expected = "381wg1GGN4rP88rNC9v7QWsiww63yLVPsn";
|
||||
page.evaluate(function() {
|
||||
$("#bip49-tab a").click();
|
||||
$(".phrase").val("abandon abandon ability").trigger("input");
|
||||
});
|
||||
waitForGenerate(function() {
|
||||
// change the bip49 account field to 1
|
||||
page.evaluate(function() {
|
||||
$("#bip49 .account").val("1");
|
||||
$("#bip49 .account").trigger("input");
|
||||
});
|
||||
waitForGenerate(function() {
|
||||
// check the address for the new derivation path
|
||||
var actual = page.evaluate(function() {
|
||||
return $(".address:first").text();
|
||||
});
|
||||
if (actual != expected) {
|
||||
console.log("BIP49 account field generates incorrect address");
|
||||
console.log("Expected: " + expected);
|
||||
console.log("Actual: " + actual);
|
||||
fail();
|
||||
}
|
||||
next();
|
||||
});
|
||||
});
|
||||
});
|
||||
},
|
||||
|
||||
// BIP49 change field changes address list
|
||||
function() {
|
||||
page.open(url, function(status) {
|
||||
// set the phrase
|
||||
var expected = "3PEM7MiKed5konBoN66PQhK8r3hjGhy9dT";
|
||||
page.evaluate(function() {
|
||||
$("#bip49-tab a").click();
|
||||
$(".phrase").val("abandon abandon ability").trigger("input");
|
||||
});
|
||||
waitForGenerate(function() {
|
||||
// change the bip49 change field to 1
|
||||
page.evaluate(function() {
|
||||
$("#bip49 .change").val("1");
|
||||
$("#bip49 .change").trigger("input");
|
||||
});
|
||||
waitForGenerate(function() {
|
||||
// check the address for the new derivation path
|
||||
var actual = page.evaluate(function() {
|
||||
return $(".address:first").text();
|
||||
});
|
||||
if (actual != expected) {
|
||||
console.log("BIP49 change field generates incorrect address");
|
||||
console.log("Expected: " + expected);
|
||||
console.log("Actual: " + actual);
|
||||
fail();
|
||||
}
|
||||
next();
|
||||
});
|
||||
});
|
||||
});
|
||||
},
|
||||
|
||||
// BIP49 account extendend private key is shown
|
||||
function() {
|
||||
page.open(url, function(status) {
|
||||
// set the phrase
|
||||
var expected = "xprv9y3uhgQbfQZbj3o98nfgLDwGGuCJjUn7GKArSAZXjKgMjSdYHjQmTyf78s22g6jsGrxXvHB6HJeFyvFSPkuYZajeTGMZVXV6aNLWw2fagCn";
|
||||
page.evaluate(function() {
|
||||
$("#bip49-tab a").click();
|
||||
$(".phrase").val("abandon abandon ability");
|
||||
$(".phrase").trigger("input");
|
||||
});
|
||||
// check the BIP49 account extended private key
|
||||
waitForGenerate(function() {
|
||||
var actual = page.evaluate(function() {
|
||||
return $("#bip49 .account-xprv").val();
|
||||
});
|
||||
if (actual != expected) {
|
||||
console.log("BIP49 account extended private key is incorrect");
|
||||
console.log("Expected: " + expected);
|
||||
console.log("Actual: " + actual);
|
||||
fail();
|
||||
}
|
||||
next();
|
||||
});
|
||||
});
|
||||
},
|
||||
|
||||
// BIP49 account extendend public key is shown
|
||||
function() {
|
||||
page.open(url, function(status) {
|
||||
// set the phrase
|
||||
var expected = "xpub6C3G7BwVVn7twXscEpCghMszpw2o8wVxdY6TEYy9HfDLcExgqGj21myazAiq6HSmW2F1cBiFqJa3D1cqcDpSh8pbZF5x4iqpd4PyJvd3gjB";
|
||||
page.evaluate(function() {
|
||||
$("#bip49-tab a").click();
|
||||
$(".phrase").val("abandon abandon ability");
|
||||
$(".phrase").trigger("input");
|
||||
});
|
||||
// check the BIP49 account extended public key
|
||||
waitForGenerate(function() {
|
||||
var actual = page.evaluate(function() {
|
||||
return $("#bip49 .account-xpub").val();
|
||||
});
|
||||
if (actual != expected) {
|
||||
console.log("BIP49 account extended public key is incorrect");
|
||||
console.log("Expected: " + expected);
|
||||
console.log("Actual: " + actual);
|
||||
fail();
|
||||
}
|
||||
next();
|
||||
});
|
||||
});
|
||||
},
|
||||
|
||||
// Test selecting coin where bip49 is unavailable (eg CLAM)
|
||||
function() {
|
||||
page.open(url, function(status) {
|
||||
// set the phrase
|
||||
page.evaluate(function() {
|
||||
$("#bip49-tab a").click();
|
||||
$(".phrase").val("abandon abandon ability");
|
||||
$(".phrase").trigger("input");
|
||||
});
|
||||
waitForGenerate(function() {
|
||||
// select non-bip49 network, ie CLAM network
|
||||
page.evaluate(function() {
|
||||
$(".network option[selected]").removeAttr("selected");
|
||||
$(".network option").filter(function() {
|
||||
return $(this).html() == "CLAM - Clams";
|
||||
}).prop("selected", true);
|
||||
$(".network").trigger("change");
|
||||
});
|
||||
// check the BIP49 error is shown
|
||||
var bip49ErrorShown = page.evaluate(function() {
|
||||
var bip49hidden = $("#bip49 .available").hasClass("hidden");
|
||||
bip49hidden = bip49hidden && !($("#bip49 .unavailable").hasClass("hidden"));
|
||||
return bip49hidden;
|
||||
});
|
||||
if (!bip49ErrorShown) {
|
||||
console.log("BIP49 error not shown for non-bip49 network");
|
||||
fail();
|
||||
}
|
||||
// check there are no addresses shown
|
||||
var addressCount = page.evaluate(function() {
|
||||
return $(".address").length;
|
||||
});
|
||||
if (addressCount != 0) {
|
||||
console.log("BIP49 address count for non-bip49 network is " + addressCount);
|
||||
fail();
|
||||
}
|
||||
// check the derived keys are blank
|
||||
var areBlank = page.evaluate(function() {
|
||||
var prvKeyIsBlank = $(".extended-priv-key").val().length == 0;
|
||||
var pubKeyIsBlank = $(".extended-pub-key").val().length == 0;
|
||||
return prvKeyIsBlank && pubKeyIsBlank;
|
||||
});
|
||||
if (!areBlank) {
|
||||
console.log("BIP49 extended keys for non-bip49 network are not blank ");
|
||||
fail();
|
||||
}
|
||||
next();
|
||||
});
|
||||
});
|
||||
},
|
||||
|
||||
// github issue 43
|
||||
// Cleared mnemonic and root key still allows addresses to be generated
|
||||
// https://github.com/iancoleman/bip39/issues/43
|
||||
function() {
|
||||
page.open(url, function(status) {
|
||||
// set the phrase
|
||||
page.evaluate(function() {
|
||||
$("#bip49-tab a").click();
|
||||
$(".phrase").val("abandon abandon ability");
|
||||
$(".phrase").trigger("input");
|
||||
});
|
||||
waitForGenerate(function() {
|
||||
// clear the mnemonic and root key
|
||||
page.evaluate(function() {
|
||||
$(".phrase").val("");
|
||||
$(".phrase").trigger("input");
|
||||
$(".root-key").val("");
|
||||
$(".root-key").trigger("input");
|
||||
$(".more").click();
|
||||
});
|
||||
waitForFeedback(function() {
|
||||
// check there are no addresses shown
|
||||
var addressCount = page.evaluate(function() {
|
||||
return $(".address").length;
|
||||
});
|
||||
if (addressCount != 0) {
|
||||
console.log("Clearing mnemonic should not allow addresses to be generated");
|
||||
fail();
|
||||
}
|
||||
next();
|
||||
});
|
||||
});
|
||||
});
|
||||
},
|
||||
|
||||
// Github issue 95
|
||||
// error trying to generate addresses from xpub with hardened derivation
|
||||
function() {
|
||||
page.open(url, function(status) {
|
||||
// set the phrase
|
||||
page.evaluate(function() {
|
||||
// Use bip32 tab with hardened addresses
|
||||
$(".hardened-addresses").prop("checked", true);
|
||||
$("#bip32-tab a").click();
|
||||
// set xpub for account 0 of bip44 for 'abandon abandon ability'
|
||||
var bip44AccountXpub = "xpub6CzDCPbtLrrn4VpVbyyQLHbdSMpZoHN4iuW64VswCyEpfjM2mJGdaHJ2DyuZwtst96E16VvcERb8BBeJdHSCVmAq9RhtRQg6eAZFrTKCNqf";
|
||||
$("#root-key").val(bip44AccountXpub);
|
||||
$("#root-key").trigger("input");
|
||||
});
|
||||
waitForFeedback(function() {
|
||||
// check the error message shows
|
||||
var expected = "Hardened derivation path is invalid with xpub key";
|
||||
var actual = page.evaluate(function() {
|
||||
return $(".feedback").text();
|
||||
});
|
||||
if (actual != expected) {
|
||||
console.log("xpub key with hardened addresses does not show feedback");
|
||||
console.log("Expected: " + expected);
|
||||
console.log("Actual: " + actual);
|
||||
fail();
|
||||
}
|
||||
next();
|
||||
});
|
||||
});
|
||||
},
|
||||
|
||||
// Litecoin uses xprv by default, and can optionally be set to ltpv
|
||||
// github issue 96
|
||||
// https://github.com/iancoleman/bip39/issues/96
|
||||
// Issue with extended keys on Litecoin
|
||||
function() {
|
||||
page.open(url, function(status) {
|
||||
// set the phrase and coin
|
||||
page.evaluate(function() {
|
||||
$(".phrase").val("abandon abandon ability");
|
||||
$(".network option[selected]").removeAttr("selected");
|
||||
$(".network option").filter(function() {
|
||||
return $(this).html() == "LTC - Litecoin";
|
||||
}).prop("selected", true);
|
||||
$(".network").trigger("change");
|
||||
$(".phrase").trigger("input");
|
||||
});
|
||||
// check the extended key is generated correctly
|
||||
waitForGenerate(function() {
|
||||
var expected = "xprv9s21ZrQH143K2jkGDCeTLgRewT9F2pH5JZs2zDmmjXes34geVnFiuNa8KTvY5WoYvdn4Ag6oYRoB6cXtc43NgJAEqDXf51xPm6fhiMCKwpi";
|
||||
var actual = page.evaluate(function() {
|
||||
return $(".root-key").val();
|
||||
});
|
||||
if (actual != expected) {
|
||||
console.log("Litecoin root key does not default to xprv");
|
||||
console.log("Expected: " + expected);
|
||||
console.log("Actual: " + actual);
|
||||
fail();
|
||||
}
|
||||
// set litecoin to use ltub
|
||||
page.evaluate(function() {
|
||||
$(".addresses").empty();
|
||||
$(".litecoin-use-ltub").prop("checked", true);
|
||||
$(".litecoin-use-ltub").trigger("change");
|
||||
});
|
||||
waitForGenerate(function() {
|
||||
var expected = "Ltpv71G8qDifUiNesiPqf6h5V6eQ8ic77oxQiYtawiACjBEx3sTXNR2HGDGnHETYxESjqkMLFBkKhWVq67ey1B2MKQXannUqNy1RZVHbmrEjnEU";
|
||||
var actual = page.evaluate(function() {
|
||||
return $(".root-key").val();
|
||||
});
|
||||
if (actual != expected) {
|
||||
console.log("Litecoin root key cannot be set to use ltub");
|
||||
console.log("Expected: " + expected);
|
||||
console.log("Actual: " + actual);
|
||||
fail();
|
||||
}
|
||||
next();
|
||||
});
|
||||
});
|
||||
});
|
||||
},
|
||||
|
||||
// BIP32 tab can use P2WPKH Nested In P2SH
|
||||
// github issue 91 part 2
|
||||
// https://github.com/iancoleman/bip39/issues/91
|
||||
// generate new addresses from xpub?
|
||||
function() {
|
||||
page.open(url, function(status) {
|
||||
// set the xpub and coin and select bip32 tab with p2wpkh addresses
|
||||
page.evaluate(function() {
|
||||
// use p2wpkh addresses
|
||||
$(".p2wpkh-nested-in-p2sh").prop("checked", true);
|
||||
// use bip32 tab
|
||||
$("#bip32-tab a").click();
|
||||
// use testnet
|
||||
$(".network option[selected]").removeAttr("selected");
|
||||
$(".network option").filter(function() {
|
||||
return $(this).html() == "BTC - Bitcoin Testnet";
|
||||
}).prop("selected", true);
|
||||
$(".network").trigger("change");
|
||||
// Set root xpub to BIP49 official test vector account 0
|
||||
$(".root-key").val("tpubDD7tXK8KeQ3YY83yWq755fHY2JW8Ha8Q765tknUM5rSvjPcGWfUppDFMpQ1ScziKfW3ZNtZvAD7M3u7bSs7HofjTD3KP3YxPK7X6hwV8Rk2");
|
||||
$(".root-key").trigger("input");
|
||||
});
|
||||
// check the address is generated correctly
|
||||
waitForGenerate(function() {
|
||||
var expected = "2Mww8dCYPUpKHofjgcXcBCEGmniw9CoaiD2";
|
||||
var actual = page.evaluate(function() {
|
||||
return $(".address:first").text();
|
||||
});
|
||||
if (actual != expected) {
|
||||
console.log("BIP32 tab cannot generate P2WPKH Nested In P2SH addresses");
|
||||
console.log("Expected: " + expected);
|
||||
console.log("Actual: " + actual);
|
||||
fail();
|
||||
}
|
||||
next();
|
||||
});
|
||||
});
|
||||
},
|
||||
|
||||
// github issue 99
|
||||
// https://github.com/iancoleman/bip39/issues/99#issuecomment-327094159
|
||||
// "warn me emphatically when they have detected invalid input" to the entropy field
|
||||
// A warning is shown when entropy is filtered and discarded
|
||||
function() {
|
||||
page.open(url, function(status) {
|
||||
// use entropy
|
||||
page.evaluate(function() {
|
||||
$(".use-entropy").prop("checked", true).trigger("change");
|
||||
$(".entropy").val("00000000 00000000 00000000 00000000").trigger("input");
|
||||
});
|
||||
// check the filter warning does not show
|
||||
waitForGenerate(function() {
|
||||
var warningIsHidden = page.evaluate(function() {
|
||||
return $(".entropy-container .filter-warning").hasClass("hidden");
|
||||
});
|
||||
if (!warningIsHidden) {
|
||||
console.log("Entropy filter warning is showing when it should not");
|
||||
fail();
|
||||
}
|
||||
page.evaluate(function() {
|
||||
$(".entropy").val("10000000 zxcvbn 00000000 00000000 00000000").trigger("input");
|
||||
});
|
||||
// check the filter warning shows
|
||||
waitForEntropyFeedback(function() {
|
||||
var warningIsHidden = page.evaluate(function() {
|
||||
return $(".entropy-container .filter-warning").hasClass("hidden");
|
||||
});
|
||||
if (warningIsHidden) {
|
||||
console.log("Entropy filter warning is not showing when it should");
|
||||
fail();
|
||||
}
|
||||
next();
|
||||
});
|
||||
});
|
||||
});
|
||||
},
|
||||
|
||||
// If you wish to add more tests, do so here...
|
||||
|
||||
// Here is a blank test template
|
||||
|
||||
Reference in New Issue
Block a user