Compare commits

...

39 Commits
0.2.9 ... 0.3.3

Author SHA1 Message Date
Ian Coleman
fcc7d12109 Release v0.3.3 2018-02-06 10:36:38 +11:00
Ian Coleman
5dfe77e4a3 Fix tests which generate more rows 2018-02-06 10:33:21 +11:00
Ian Coleman
e21e32da31 Add BIP38 test 2018-02-06 10:14:22 +11:00
Ian Coleman
ba678b1147 Allow initial number of rows to be set by user 2018-02-06 09:57:28 +11:00
Ian Coleman
0b39e9dca7 Add BIP38 interface elements 2018-02-06 09:57:23 +11:00
Ian Coleman
cc61ec30c5 Encrypt private keys with BIP38
with fakes for missing UI elements
2018-02-06 09:43:13 +11:00
Ian Coleman
0f0a888e13 Add bitcoinjs-bip38-2.0.2 library
Created using browserify:
git clone https://github.com/bitcoinjs/bip38.git
git checkout v2.0.2
npm install
npm run unit
browserify index.js --standalone bitcoinjs-bip38 > bitcoinjs-bip38-2.0.2.js
2018-02-06 09:42:10 +11:00
Ian Coleman
2ef27fb80b Remove commented-out lines of code from test 2018-01-16 10:37:37 +11:00
Ian Coleman
423fb969c6 Test AXE network 2018-01-16 10:34:42 +11:00
Ian Coleman
9fae1ffbcc Increase allowed rendering time tests
Firefox was only generating 15 of 20 rows in the address table
2018-01-16 10:33:08 +11:00
Ian Coleman
78db37f663 LeftPad ethereum private keys with zeros if needed 2018-01-16 10:33:08 +11:00
iancoleman
28e1cd455c Merge pull request #154 from AXErunners/master
Add AXE
2018-01-16 09:05:18 +11:00
-k
47debf07ed AXE support
prefix fixed
2018-01-07 00:55:48 -05:00
-k
cfc0c4d743 AXE support 2018-01-06 23:57:11 -05:00
Ian Coleman
de8e5bc11f Release v0.3.2 2018-01-03 10:54:10 +11:00
Ian Coleman
5c1003dde3 Fix test for komodo 2018-01-03 10:52:39 +11:00
Ian Coleman
a78f4e280c Add csv display of addresses 2018-01-03 10:33:22 +11:00
Ian Coleman
4e9b492ca4 Add BIP84 tab 2018-01-03 09:32:14 +11:00
Ian Coleman
91eb2cbcfd Fix typo game/komodo 2017-12-20 10:48:09 +11:00
Ian Coleman
c51bb4f9e5 Add test for Onixcoin 2017-12-20 10:42:55 +11:00
iancoleman
3fa0f4cbef Merge pull request #137 from AraguaneyBits/master
Add ONX (Onixcoin)
2017-12-20 10:38:14 +11:00
jestevez
92fb39311e FIX OnixCoin Correct BIP44 Code 174 2017-12-19 21:55:28 +01:00
jestevez
d00c719932 FIX OnixCoin Correct BIP44 Code 174 2017-12-19 21:50:55 +01:00
iancoleman
ab1bd64d52 Merge pull request #142 from ca333/master
[ADD] KMD - Komodo
2017-12-13 14:15:20 +11:00
ca333
aab3645f21 [ADD] KMD - Komodo 2017-12-04 05:01:53 +01:00
jestevez
66419cf39c Add ONX (Onixcoin) 2017-11-30 20:42:49 +01:00
Ian Coleman
26dd39fd0e Release v0.3.1 2017-11-29 10:32:58 +11:00
Ian Coleman
9225b805d6 Replace jquery.qrcode with kjua for QR codes
This handles UTF-8 content correctly
2017-11-29 10:28:09 +11:00
Ian Coleman
f2de7aa7d8 Move css specific to the app into own file 2017-11-29 10:28:09 +11:00
Ian Coleman
9a54f27efc Update bootstrap from minified 3.2.0 to 3.3.7 2017-11-29 10:28:09 +11:00
Ian Coleman
863fa61aaf Update jquery from minified 2.1.1 to 3.2.1 2017-11-29 10:28:09 +11:00
iancoleman
2f410ee66e Merge pull request #134 from dimitris-t/patch-2
Fixed typos
2017-11-28 10:30:36 +11:00
Dimitris Tsapakidis
2087192332 Fixed typos
addreses -> addresses
steet -> street
2017-11-24 18:01:19 +02:00
Ian Coleman
74ab4cbe90 Show entropy from PRNG and word indexes
see issue #132
2017-11-22 15:37:36 +11:00
Ian Coleman
cf6c204497 Release v0.3.0 2017-11-22 13:34:58 +11:00
Ian Coleman
c49e881294 Add BIP141 tab for full segwit compatibility 2017-11-22 13:03:47 +11:00
Ian Coleman
0fd67b5915 Remove segwit from bip32 tab
This option will be added in the future to a bip141 tab
2017-11-22 09:59:58 +11:00
Ian Coleman
1c2b8c6b2d Use ltub for litecoin by default instead of xprv
Introduced when upgrading from bitcoinjs-lib v3.3.0
2017-11-22 09:40:35 +11:00
Ian Coleman
9f59e99bec Update bitcoinjs from v3.1.1 to v3.3.0 2017-11-22 09:19:14 +11:00
18 changed files with 117637 additions and 3772 deletions

File diff suppressed because one or more lines are too long

View File

@@ -1,3 +1,34 @@
# 0.3.3
* Add AXE network
* Ethereum private key generation bugfix
* Add BIP38 support
* Allow initial number of rows to be set by the user
# 0.3.2
* Add Onixcoin
* Add Komodo
* BIP84 tab for derivation path
* CSV tab for derived addresses
# 0.3.1
* Populate entropy field with hex value used from PRNG
* Show list of word indexes
* Fix typos
* Update jquery from 2.1.1 to 3.2.1
* Update bootstrap from 3.2.0 to 3.3.7
* Move application-specific css into own file
* QR codes with accents work correctly by replacing jquery.qrcode with kjua
# 0.3.0
* Update bitcoinjs from 3.1.1 to 3.3.0
* Litecoin defaults to ltub instead of xpub
* Segwit option removed from bip32 tab
* BIP141 tab added for full segwit compatibility
# 0.2.9
* Update links from old site to new site

105
src/css/app.css Normal file
View File

@@ -0,0 +1,105 @@
body {
padding-bottom: 32px;
}
.form-control[readonly] {
cursor: text;
}
.feedback-container {
position: fixed;
top: 0;
width: 100%;
text-align: center;
z-index: 4;
}
.feedback {
display: table;
padding: 0.5em 1em;
background-color: orange;
margin: 0 auto;
font-size: 2em;
color: #444;
border: 2px solid #555;
border-top: 0;
border-bottom-left-radius: 20px 20px;
border-bottom-right-radius: 20px 20px;
}
.no-border {
border: 0;
box-shadow: inset 0 1px 1px rgba(0,0,0,.0);
-webkit-box-shadow: inset 0 1px 1px rgba(0,0,0,.0);
}
.phrase {
word-break: keep-all;
}
.generate-container .strength {
/* override mobile width from bootstrap */
width: auto!important;
display: inline-block;
}
.languages a {
padding-left: 10px;
}
.languages a:nth-of-type(1) {
margin-left: -12px;
padding-left: 0;
}
.monospace {
font-family: monospace;
}
.entropy-container .filtered,
.entropy-container .binary {
word-wrap: break-word;
}
.entropy-container li {
padding-bottom: 5px;
}
.card-suit {
font-size: 19px;
line-height: 0;
}
.card-suit.club {
color: #009F00;
}
.card-suit.diamond {
color: #3D5DC4;
}
.card-suit.heart {
color: #F00;
}
.card-suit.spade {
color: #000;
}
.qr-container {
position: fixed;
top: 0;
right: 0;
text-align: center;
background-color: #FFF;
border: 1px solid #CCC;
}
.qr-image {
margin: 5px;
}
.qr-hint,
.qr-warning {
padding: 2px;
max-width: 320px;
}
.more-info {
cursor: help;
border-bottom: 1px dashed #000;
text-decoration: none;
}
.version {
position: absolute;
top: 5px;
right: 5px;
}
.csv {
margin-top: 20px;
margin-bottom: 20px;
white-space: pre;
overflow-wrap: normal;
overflow-x: scroll;
font-family: monospace;
}

6757
src/css/bootstrap-3.3.7.css vendored Normal file

File diff suppressed because it is too large Load Diff

File diff suppressed because one or more lines are too long

View File

@@ -3,118 +3,19 @@
<head lang="en">
<meta charset="utf-8" />
<title>BIP39 - Mnemonic Code</title>
<link rel="stylesheet" href="css/bootstrap.min.css">
<link rel="stylesheet" href="css/bootstrap-3.3.7.css">
<link rel="stylesheet" href="css/app.css">
<meta content="Mnemonic code for generating deterministic keys" name="description"/>
<meta content="width=device-width, initial-scale=1.0" name="viewport" />
<meta content="bitcoin mnemonic converter" name="description" />
<meta content="Ian Coleman" name="author" />
<link type="image/x-icon" rel="icon" href="data:image/x-icon;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQEAYAAABPYyMiAAAABmJLR0T///////8JWPfcAAAACXBIWXMAAABIAAAASABGyWs+AAAAF0lEQVRIx2NgGAWjYBSMglEwCkbBSAcACBAAAeaR9cIAAAAASUVORK5CYII=" />
<style>
body {
padding-bottom: 32px;
}
.form-control[readonly] {
cursor: text;
}
.feedback-container {
position: fixed;
top: 0;
width: 100%;
text-align: center;
z-index: 4;
}
.feedback {
display: table;
padding: 0.5em 1em;
background-color: orange;
margin: 0 auto;
font-size: 2em;
color: #444;
border: 2px solid #555;
border-top: 0;
border-bottom-left-radius: 20px 20px;
border-bottom-right-radius: 20px 20px;
}
.no-border {
border: 0;
box-shadow: inset 0 1px 1px rgba(0,0,0,.0);
-webkit-box-shadow: inset 0 1px 1px rgba(0,0,0,.0);
}
.phrase {
word-break: keep-all;
}
.generate-container .strength {
/* override mobile width from bootstrap */
width: auto!important;
display: inline-block;
}
.languages a {
padding-left: 10px;
}
.languages a:nth-of-type(1) {
margin-left: -12px;
padding-left: 0;
}
.monospace {
font-family: monospace;
}
.entropy-container .filtered,
.entropy-container .binary {
word-wrap: break-word;
}
.entropy-container li {
padding-bottom: 5px;
}
.card-suit {
font-size: 19px;
line-height: 0;
}
.card-suit.club {
color: #009F00;
}
.card-suit.diamond {
color: #3D5DC4;
}
.card-suit.heart {
color: #F00;
}
.card-suit.spade {
color: #000;
}
.qr-container {
position: fixed;
top: 0;
right: 0;
text-align: center;
background-color: #FFF;
border: 1px solid #CCC;
}
.qr-image {
margin: 5px;
}
.qr-hint,
.qr-warning {
padding: 2px;
max-width: 150px;
}
.more-info {
cursor: help;
border-bottom: 1px dashed #000;
text-decoration: none;
}
.version {
position: absolute;
top: 5px;
right: 5px;
}
</style>
</head>
<body>
<div class="container">
<h1 class="text-center">Mnemonic Code Converter</h1>
<p class="version">v0.2.9</p>
<p class="version">v0.3.3</p>
<hr>
<div class="row">
<div class="col-md-12">
@@ -193,6 +94,8 @@
<div class="filtered col-sm-9 form-control-static"></div>
<label class="col-sm-3 control-label">Raw Binary</label>
<div class="binary col-sm-9 form-control-static"></div>
<label class="col-sm-3 control-label">Word Indexes</label>
<div class="word-indexes col-sm-9 form-control-static">&nbsp;</div>
<label class="col-sm-3 control-label">Mnemonic Length</label>
<div class="col-sm-9">
<select class="mnemonic-length form-control">
@@ -223,7 +126,7 @@
<div class="col-sm-10 checkbox">
<label>
<input type="checkbox" class="use-entropy">
<span>Supply my own source of entropy</span>
<span>Show entropy details</span>
</label>
</div>
</div>
@@ -277,7 +180,7 @@
<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">
<input type="checkbox" id="litecoin-use-ltub" class="litecoin-use-ltub" checked="checked">
Use <code>Ltpv / Ltub</code> instead of <code>xprv / xpub</code>
</label>
</div>
@@ -301,6 +204,12 @@
<li id="bip49-tab">
<a href="#bip49" role="tab" data-toggle="tab">BIP49</a>
</li>
<li id="bip84-tab">
<a href="#bip84" role="tab" data-toggle="tab">BIP84</a>
</li>
<li id="bip141-tab">
<a href="#bip141" role="tab" data-toggle="tab">BIP141</a>
</li>
</ul>
<div class="derivation-type tab-content">
<div id="bip44" class="tab-pane active">
@@ -415,13 +324,6 @@
<span>Use hardened addresses</span>
</label>
</div>
<div class="form-group">
<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">
@@ -551,6 +453,123 @@
</div>
</form>
</div>
<div id="bip141" 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>BIP141 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-0141.mediawiki" target="_blank">BIP141 spec</a>
</p>
</div>
<div class="form-group">
<label for="bip141-path" class="col-sm-2 control-label">BIP32 Derivation Path</label>
<div class="col-sm-10">
<input id="bip141-path" type="text" class="bip141-path form-control" value="m/0">
</div>
</div>
<div class="form-group">
<label class="col-sm-2 control-label">Script Semantics</label>
<div class="col-sm-10">
<select class="form-control bip141-semantics">
<option value="p2wpkh">P2WPKH</option>
<option value="p2wpkh-p2sh" selected>P2WPKH nested in P2SH</option>
</select>
</div>
</div>
</div>
</form>
</div>
<div id="bip84" class="tab-pane">
<form class="form-horizontal" role="form">
<br>
<div class="col-sm-2"></div>
<div class="col-sm-10">
<p>
For more info see the
<a href="https://github.com/bitcoin/bips/blob/master/bip-0084.mediawiki" target="_blank">BIP84 spec</a>.
</p>
</div>
<div class="form-group">
<label for="purpose" class="col-sm-2 control-label">
Purpose
</label>
<div class="col-sm-10">
<input id="purpose" type="text" class="purpose form-control" value="84" readonly>
</div>
</div>
<div class="form-group">
<label for="coin" class="col-sm-2 control-label">
Coin
</label>
<div class="col-sm-10">
<input id="coin" type="text" class="coin form-control" value="0" readonly>
</div>
</div>
<div class="form-group">
<label for="account" class="col-sm-2 control-label">
Account
</label>
<div class="col-sm-10">
<input id="account" type="text" class="account form-control" value="0">
</div>
</div>
<div class="form-group">
<label for="change" class="col-sm-2 control-label">
External / Internal
</label>
<div class="col-sm-10">
<input id="change" type="text" class="change form-control" value="0">
</div>
</div>
<div class="form-group">
<label class="col-sm-2 control-label">
</label>
<div class="col-sm-10">
<p>The account extended keys can be used for importing to most BIP84 compatible wallets.</p>
</div>
</div>
<div class="form-group">
<label for="account-xprv" class="col-sm-2 control-label">
<span>Account Extended Private Key</span>
</label>
<div class="col-sm-10">
<textarea id="account-xprv" type="text" class="account-xprv form-control" readonly data-show-qr></textarea>
</div>
</div>
<div class="form-group">
<label for="account-xpub" class="col-sm-2 control-label">
<span>Account Extended Public Key</span>
</label>
<div class="col-sm-10">
<textarea id="account-xpub" type="text" class="account-xpub form-control" readonly data-show-qr></textarea>
</div>
</div>
<div class="form-group">
<label class="col-sm-2 control-label">
</label>
<div class="col-sm-10">
<p>The BIP32 derivation path and extended keys are the basis for the derived addresses.</p>
</div>
</div>
<div class="form-group">
<label for="bip84-path" class="col-sm-2 control-label">BIP32 Derivation Path</label>
<div class="col-sm-10">
<input id="bip84-path" type="text" class="path form-control" value="m/84'/0'/0'/0" readonly="readonly">
</div>
</div>
</form>
</div>
</div>
<form class="form-horizontal" role="form">
<div class="form-group">
@@ -574,7 +593,7 @@
<div class="row">
<div class="col-md-12">
<h2>Derived Addresses</h2>
<p>Note these addreses are derived from the BIP32 Extended Key</p>
<p>Note these addresses are derived from the BIP32 Extended Key</p>
</div>
<div class="col-md-12 use-bitpay-addresses-container hidden">
<div class="checkbox">
@@ -585,41 +604,68 @@
</div>
</div>
<div class="col-md-12">
<table class="table table-striped">
<thead>
<th>
<div class="input-group">
<span>Path</span>&nbsp;&nbsp;
<button class="index-toggle">Toggle</button>
</div>
</th>
<th>
<div class="input-group">
<span>Address</span>&nbsp;&nbsp;
<button class="address-toggle">Toggle</button>
</div>
</th>
<th>
<div class="input-group">
<span>Public Key</span>&nbsp;&nbsp;
<button class="public-key-toggle">Toggle</button>
</div>
</th>
<th>
<div class="input-group">
<span>Private Key</span>&nbsp;&nbsp;
<button class="private-key-toggle">Toggle</button>
</div>
</th>
</thead>
<tbody class="addresses monospace">
<tr><td>&nbsp;</td><td>&nbsp;</td><td>&nbsp;</td><td>&nbsp;</td></tr>
<tr><td>&nbsp;</td><td>&nbsp;</td><td>&nbsp;</td><td>&nbsp;</td></tr>
<tr><td>&nbsp;</td><td>&nbsp;</td><td>&nbsp;</td><td>&nbsp;</td></tr>
<tr><td>&nbsp;</td><td>&nbsp;</td><td>&nbsp;</td><td>&nbsp;</td></tr>
<tr><td>&nbsp;</td><td>&nbsp;</td><td>&nbsp;</td><td>&nbsp;</td></tr>
</tbody>
</table>
<div class="checkbox">
<label>
<input type="checkbox" class="use-bip38">
<span>Encrypt private keys using BIP38 and this password:</span>
</label>
<input class="bip38-password">
<span>Enabling BIP38 means each key will take take several minutes to generate.</span>
</div>
</div>
<ul class="addresses-type nav nav-tabs" role="tablist">
<li id="table-tab" class="active">
<a href="#table" role="tab" data-toggle="tab">Table</a>
</li>
<li id="csv-tab">
<a href="#csv" role="tab" data-toggle="tab">CSV</a>
</li>
</ul>
<div class="addresses-type tab-content">
<div id="table" class="tab-pane active">
<div class="col-md-12">
<table class="table table-striped">
<thead>
<th>
<div class="input-group">
<span>Path</span>&nbsp;&nbsp;
<button class="index-toggle">Toggle</button>
</div>
</th>
<th>
<div class="input-group">
<span>Address</span>&nbsp;&nbsp;
<button class="address-toggle">Toggle</button>
</div>
</th>
<th>
<div class="input-group">
<span>Public Key</span>&nbsp;&nbsp;
<button class="public-key-toggle">Toggle</button>
</div>
</th>
<th>
<div class="input-group">
<span>Private Key</span>&nbsp;&nbsp;
<button class="private-key-toggle">Toggle</button>
</div>
</th>
</thead>
<tbody class="addresses monospace">
<tr><td>&nbsp;</td><td>&nbsp;</td><td>&nbsp;</td><td>&nbsp;</td></tr>
<tr><td>&nbsp;</td><td>&nbsp;</td><td>&nbsp;</td><td>&nbsp;</td></tr>
<tr><td>&nbsp;</td><td>&nbsp;</td><td>&nbsp;</td><td>&nbsp;</td></tr>
<tr><td>&nbsp;</td><td>&nbsp;</td><td>&nbsp;</td><td>&nbsp;</td></tr>
<tr><td>&nbsp;</td><td>&nbsp;</td><td>&nbsp;</td><td>&nbsp;</td></tr>
</tbody>
</table>
</div>
</div>
<div id="csv" class="tab-pane">
<div class="col-md-12">
<textarea class="csv form-control" rows="25" readonly></textarea>
</div>
</div>
</div>
</div>
<span>Show</span>
@@ -674,7 +720,7 @@
</span>
<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,
Do <strong>NOT</strong> use phrases from books, lyrics from songs, your birthday or street 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>
@@ -831,12 +877,14 @@
<script src="js/polyfill.es6.js"></script>
<script src="js/basex.js"></script>
<script src="js/unorm.js"></script>
<script src="js/jquery.min.js"></script>
<script src="js/bootstrap.min.js"></script>
<script src="js/jquery-3.2.1.js"></script>
<script src="js/bootstrap-3.3.7.js"></script>
<script src="js/levenshtein.js"></script>
<script src="js/jquery.qrcode.min.js"></script>
<script src="js/bitcoinjs-3-1-1.js"></script>
<script src="js/kjua-0.1.1.min.js"></script>
<script src="js/bitcoinjs-3.3.0.js"></script>
<script src="js/bitcoinjs-extensions.js"></script>
<script src="js/bitcoinjs-bip38-2.0.2.js"></script>
<script src="js/segwit-parameters.js"></script>
<script src="js/ethereumjs-util.js"></script>
<script src="js/ripple-util.js"></script>
<script src="js/sjcl-bip39.js"></script>

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@@ -108,6 +108,17 @@ bitcoinjs.bitcoin.networks.peercoin = {
wif: 0xb7
};
bitcoinjs.bitcoin.networks.axe = {
messagePrefix: 'unused',
bip32: {
public: 0x0488b21e,
private: 0x0488ade4
},
pubKeyHash: 0x4B,
scriptHash: 0xCB, // TODO set this correctly
wif: 0xCB
};
bitcoinjs.bitcoin.networks.slimcoin = {
messagePrefix: 'unused',
bip32: {
@@ -207,6 +218,18 @@ bitcoinjs.bitcoin.networks.myriadcoin = {
wif: 0xb2
};
bitcoinjs.bitcoin.networks.onixcoin = {
messagePrefix: 'unused',
bip32: {
public: 0x049d7cb2,
private: 0x049d7878
},
pubKeyHash: 0x4B,
scriptHash: 0x05,
wif: 0x80
};
bitcoinjs.bitcoin.networks.pivx = {
messagePrefix: 'unused',
bip32: {
@@ -284,35 +307,24 @@ bitcoinjs.bitcoin.networks.monacoin = {
wif: 0xb0
};
bitcoinjs.bitcoin.networks.bitcoinBip49 = {
messagePrefix: '\x18Bitcoin Signed Message:\n',
bip32: {
public: 0x049d7cb2,
private: 0x049d7878
},
pubKeyHash: 0x00,
scriptHash: 0x05,
wif: 0x80
};
bitcoinjs.bitcoin.networks.testnetBip49 = {
messagePrefix: '\x18Bitcoin Signed Message:\n',
bip32: {
public: 0x044a5262,
private: 0x044a4e28
},
pubKeyHash: 0x6f,
scriptHash: 0xc4,
wif: 0xef
};
bitcoinjs.bitcoin.networks.litecoinBip49 = {
bitcoinjs.bitcoin.networks.litecoinXprv = {
messagePrefix: '\x19Litecoin Signed Message:\n',
bip32: {
public: 0x01b26ef6,
private: 0x01b26792
public: 0x0488b21e,
private: 0x0488ade4,
},
pubKeyHash: 0x30,
scriptHash: 0x32,
wif: 0xb0
};
bitcoinjs.bitcoin.networks.komodo = {
messagePrefix: '\x18Komodo Signed Message:\n',
bip32: {
public: 0x0488B21E,
private: 0x0488ADE4
},
pubKeyHash: 0x3c,
scriptHash: 0x55,
wif: 0xbc
};

2377
src/js/bootstrap-3.3.7.js vendored Normal file

File diff suppressed because it is too large Load Diff

File diff suppressed because one or more lines are too long

View File

@@ -14,7 +14,7 @@
var showPubKey = true;
var showPrivKey = true;
var showQr = false;
var litecoinUseLtub = false;
var litecoinUseLtub = true;
var entropyChangeTimeoutEvent = null;
var phraseChangeTimeoutEvent = null;
@@ -37,6 +37,7 @@
DOM.entropyBitsPerEvent = DOM.entropyContainer.find(".bits-per-event");
DOM.entropyWordCount = DOM.entropyContainer.find(".word-count");
DOM.entropyBinary = DOM.entropyContainer.find(".binary");
DOM.entropyWordIndexes = DOM.entropyContainer.find(".word-indexes");
DOM.entropyMnemonicLength = DOM.entropyContainer.find(".mnemonic-length");
DOM.entropyFilterWarning = DOM.entropyContainer.find(".filter-warning");
DOM.phrase = $(".phrase");
@@ -52,6 +53,8 @@
DOM.bip32tab = $("#bip32-tab");
DOM.bip44tab = $("#bip44-tab");
DOM.bip49tab = $("#bip49-tab");
DOM.bip84tab = $("#bip84-tab");
DOM.bip141tab = $("#bip141-tab");
DOM.bip32panel = $("#bip32");
DOM.bip44panel = $("#bip44");
DOM.bip49panel = $("#bip49");
@@ -72,12 +75,26 @@
DOM.bip49accountXprv = $("#bip49 .account-xprv");
DOM.bip49accountXpub = $("#bip49 .account-xpub");
DOM.bip49change = $("#bip49 .change");
DOM.bip84path = $("#bip84-path");
DOM.bip84purpose = $("#bip84 .purpose");
DOM.bip84coin = $("#bip84 .coin");
DOM.bip84account = $("#bip84 .account");
DOM.bip84accountXprv = $("#bip84 .account-xprv");
DOM.bip84accountXpub = $("#bip84 .account-xpub");
DOM.bip84change = $("#bip84 .change");
DOM.bip141unavailable = $("#bip141 .unavailable");
DOM.bip141available = $("#bip141 .available");
DOM.bip141path = $("#bip141-path");
DOM.bip141semantics = $(".bip141-semantics");
DOM.generatedStrength = $(".generate-container .strength");
DOM.hardenedAddresses = $(".hardened-addresses");
DOM.useP2wpkhNestedInP2sh = $(".p2wpkh-nested-in-p2sh");
DOM.useBitpayAddressesContainer = $(".use-bitpay-addresses-container");
DOM.useBitpayAddresses = $(".use-bitpay-addresses");
DOM.useBip38 = $(".use-bip38");
DOM.bip38Password = $(".bip38-password");
DOM.addresses = $(".addresses");
DOM.csvTab = $("#csv-tab a");
DOM.csv = $(".csv");
DOM.rowsToAdd = $(".rows-to-add");
DOM.more = $(".more");
DOM.moreRowsStartIndex = $(".more-rows-start-index");
@@ -112,13 +129,19 @@
DOM.bip44change.on("input", calcForDerivationPath);
DOM.bip49account.on("input", calcForDerivationPath);
DOM.bip49change.on("input", calcForDerivationPath);
DOM.bip84account.on("input", calcForDerivationPath);
DOM.bip84change.on("input", calcForDerivationPath);
DOM.bip141path.on("input", calcForDerivationPath);
DOM.bip141semantics.on("change", tabChanged);
DOM.tab.on("shown.bs.tab", tabChanged);
DOM.hardenedAddresses.on("change", calcForDerivationPath);
DOM.useP2wpkhNestedInP2sh.on("change", calcForDerivationPath);
DOM.useBip38.on("change", calcForDerivationPath);
DOM.bip38Password.on("change", calcForDerivationPath);
DOM.indexToggle.on("click", toggleIndexes);
DOM.addressToggle.on("click", toggleAddresses);
DOM.publicKeyToggle.on("click", togglePublicKeys);
DOM.privateKeyToggle.on("click", togglePrivateKeys);
DOM.csvTab.on("click", updateCsv);
DOM.languages.on("click", languageChanged);
DOM.useBitpayAddresses.on("change", useBitpayAddressesChange);
setQrEvents(DOM.showQrEls);
@@ -139,11 +162,12 @@
var networkIndex = e.target.value;
var network = networks[networkIndex];
network.onSelect();
if (network.p2wpkhNestedInP2shAvailable) {
showP2wpkhNestedInP2shAvailable();
if (network.segwitAvailable) {
adjustNetworkForSegwit();
showSegwitAvailable();
}
else {
showP2wpkhNestedInP2shUnavailable();
showSegwitUnavailable();
}
if (seed != null) {
phraseChanged();
@@ -213,11 +237,13 @@
var passphrase = DOM.passphrase.val();
calcBip32RootKeyFromSeed(phrase, passphrase);
calcForDerivationPath();
// Show the word indexes
showWordIndexes();
}
function tabChanged() {
showPending();
adjustNetworkForBip49();
adjustNetworkForSegwit();
var phrase = DOM.phrase.val();
if (phrase != "") {
// Calculate and display for mnemonic
@@ -318,10 +344,10 @@
function litecoinUseLtubChanged() {
litecoinUseLtub = DOM.litecoinUseLtub.prop("checked");
if (litecoinUseLtub) {
network = bitcoinjs.bitcoin.networks.litecoinLtub;
network = bitcoinjs.bitcoin.networks.litecoin;
}
else {
network = bitcoinjs.bitcoin.networks.litecoin;
network = bitcoinjs.bitcoin.networks.litecoinXprv;
}
phraseChanged();
}
@@ -330,8 +356,8 @@
clearDerivedKeys();
clearAddressesList();
showPending();
// Don't show bip49 if it's selected but network doesn't support it
if (bip49TabSelected() && !networkHasBip49()) {
// Don't show segwit if it's selected but network doesn't support it
if (segwitSelected() && !networkHasSegwit()) {
return;
}
// Get the derivation path
@@ -345,9 +371,12 @@
if (bip44TabSelected()) {
displayBip44Info();
}
if (bip49TabSelected()) {
else if (bip49TabSelected()) {
displayBip49Info();
}
else if (bip84TabSelected()) {
displayBip84Info();
}
displayBip32Info();
}
@@ -414,10 +443,20 @@
showValidationError(errorText);
return;
}
// get the amount of entropy to use
var numWords = parseInt(DOM.generatedStrength.val());
var strength = numWords / 3 * 32;
var words = mnemonic.generate(strength);
var buffer = new Uint8Array(strength / 8);
// create secure entropy
var data = crypto.getRandomValues(buffer);
// show the words
var words = mnemonic.toMnemonic(data);
DOM.phrase.val(words);
// show the entropy
var entropyHex = uint8ArrayToHex(data);
DOM.entropy.val(entropyHex);
// ensure entropy fields are consistent with what is being displayed
DOM.entropyMnemonicLength.val("raw");
return words;
}
@@ -525,7 +564,7 @@
console.log("Using derivation path from BIP44 tab: " + derivationPath);
return derivationPath;
}
if (bip49TabSelected()) {
else if (bip49TabSelected()) {
var purpose = parseIntNoNaN(DOM.bip49purpose.val(), 49);
var coin = parseIntNoNaN(DOM.bip49coin.val(), 0);
var account = parseIntNoNaN(DOM.bip49account.val(), 0);
@@ -540,11 +579,31 @@
console.log("Using derivation path from BIP49 tab: " + derivationPath);
return derivationPath;
}
else if (bip84TabSelected()) {
var purpose = parseIntNoNaN(DOM.bip84purpose.val(), 84);
var coin = parseIntNoNaN(DOM.bip84coin.val(), 0);
var account = parseIntNoNaN(DOM.bip84account.val(), 0);
var change = parseIntNoNaN(DOM.bip84change.val(), 0);
var path = "m/";
path += purpose + "'/";
path += coin + "'/";
path += account + "'/";
path += change;
DOM.bip84path.val(path);
var derivationPath = DOM.bip84path.val();
console.log("Using derivation path from BIP84 tab: " + derivationPath);
return derivationPath;
}
else if (bip32TabSelected()) {
var derivationPath = DOM.bip32path.val();
console.log("Using derivation path from BIP32 tab: " + derivationPath);
return derivationPath;
}
else if (bip141TabSelected()) {
var derivationPath = DOM.bip141path.val();
console.log("Using derivation path from BIP141 tab: " + derivationPath);
return derivationPath;
}
else {
console.log("Unknown derivation path");
}
@@ -635,6 +694,24 @@
DOM.bip49accountXpub.val(accountXpub);
}
function displayBip84Info() {
// Get the derivation path for the account
var purpose = parseIntNoNaN(DOM.bip84purpose.val(), 84);
var coin = parseIntNoNaN(DOM.bip84coin.val(), 0);
var account = parseIntNoNaN(DOM.bip84account.val(), 0);
var path = "m/";
path += purpose + "'/";
path += coin + "'/";
path += account + "'/";
// Calculate the account extended keys
var accountExtendedKey = calcBip32ExtendedKey(path);
var accountXprv = accountExtendedKey.toBase58();
var accountXpub = accountExtendedKey.neutered().toBase58();
// Display the extended keys
DOM.bip84accountXprv.val(accountXprv);
DOM.bip84accountXpub.val(accountXpub);
}
function displayBip32Info() {
// Display the key
DOM.seed.val(seed);
@@ -650,7 +727,8 @@
DOM.extendedPubKey.val(extendedPubKey);
// Display the addresses and privkeys
clearAddressesList();
displayAddresses(0, 20);
var initialAddressCount = parseInt(DOM.rowsToAdd.val());
displayAddresses(0, initialAddressCount);
}
function displayAddresses(start, total) {
@@ -674,8 +752,18 @@
})());
}
function P2wpkhNestedInP2shSelected() {
return bip49TabSelected() || (bip32TabSelected() && useP2wpkhNestedInP2sh());
function segwitSelected() {
return bip49TabSelected() || bip84TabSelected() || bip141TabSelected();
}
function p2wpkhSelected() {
return bip84TabSelected() ||
bip141TabSelected() && DOM.bip141semantics.val() == "p2wpkh";
}
function p2wpkhInP2shSelected() {
return bip49TabSelected() ||
(bip141TabSelected() && DOM.bip141semantics.val() == "p2wpkh-p2sh");
}
function TableRow(index, isLast) {
@@ -683,8 +771,12 @@
var self = this;
this.shouldGenerate = true;
var useHardenedAddresses = DOM.hardenedAddresses.prop("checked");
var isP2wpkhNestedInP2sh = P2wpkhNestedInP2shSelected();
var p2wpkhNestedInP2shAvailable = networkHasBip49();
var useBip38 = DOM.useBip38.prop("checked");
var bip38password = DOM.bip38Password.val();
var isSegwit = segwitSelected();
var segwitAvailable = networkHasSegwit();
var isP2wpkh = p2wpkhSelected();
var isP2wpkhInP2sh = p2wpkhInP2shSelected();
function init() {
calculateValues();
@@ -695,6 +787,7 @@
if (!self.shouldGenerate) {
return;
}
// derive HDkey for this row of the table
var key = "NA";
if (useHardenedAddresses) {
key = bip32ExtendedKey.deriveHardened(index);
@@ -702,19 +795,36 @@
else {
key = bip32ExtendedKey.derive(index);
}
var address = key.getAddress().toString();
var privkey = "NA";
if (!key.isNeutered()) {
privkey = key.keyPair.toWIF(network);
// bip38 requires uncompressed keys
// see https://github.com/iancoleman/bip39/issues/140#issuecomment-352164035
var keyPair = key.keyPair;
var useUncompressed = useBip38;
if (useUncompressed) {
keyPair = new bitcoinjs.bitcoin.ECPair(keyPair.d, null, { compressed: false });
}
var pubkey = key.getPublicKeyBuffer().toString('hex');
// get address
var address = keyPair.getAddress().toString();
// get privkey
var hasPrivkey = !key.isNeutered();
var privkey = "NA";
if (hasPrivkey) {
privkey = keyPair.toWIF(network);
// BIP38 encode private key if required
if (useBip38) {
privkey = bitcoinjsBip38.encrypt(keyPair.d.toBuffer(), false, bip38password, function(p) {
console.log("Progressed " + p.percent.toFixed(1) + "% for index " + index);
});
}
}
// get pubkey
var pubkey = keyPair.getPublicKeyBuffer().toString('hex');
var indexText = getDerivationPath() + "/" + index;
if (useHardenedAddresses) {
indexText = indexText + "'";
}
// Ethereum values are different
if (networks[DOM.network.val()].name == "ETH - Ethereum") {
var privKeyBuffer = key.keyPair.d.toBuffer();
var privKeyBuffer = keyPair.d.toBuffer(32);
privkey = privKeyBuffer.toString('hex');
var addressBuffer = ethUtil.privateToAddress(privKeyBuffer);
var hexAddress = addressBuffer.toString('hex');
@@ -728,20 +838,28 @@
privkey = convertRipplePriv(privkey);
address = convertRippleAdrr(address);
}
// BIP49 addresses are different
if (isP2wpkhNestedInP2sh) {
if (!p2wpkhNestedInP2shAvailable) {
// Segwit addresses are different
if (isSegwit) {
if (!segwitAvailable) {
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)
if (isP2wpkh) {
var keyhash = bitcoinjs.bitcoin.crypto.hash160(key.getPublicKeyBuffer());
var scriptpubkey = bitcoinjs.bitcoin.script.witnessPubKeyHash.output.encode(keyhash);
address = bitcoinjs.bitcoin.address.fromOutputScript(scriptpubkey, network)
}
else if (isP2wpkhInP2sh) {
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();
updateCsv();
}
}, 50)
}
@@ -782,6 +900,7 @@
function clearAddressesList() {
DOM.addresses.empty();
DOM.csv.val("");
stopGenerating();
}
@@ -1074,6 +1193,8 @@
var phrase = mnemonic.toMnemonic(entropyArr);
// Set the mnemonic in the UI
DOM.phrase.val(phrase);
// Show the word indexes
showWordIndexes();
}
function clearEntropyFeedback() {
@@ -1196,8 +1317,13 @@
function createQr(e) {
var content = e.target.textContent || e.target.value;
if (content) {
var size = 130;
DOM.qrImage.qrcode({width: size, height: size, text: content});
var qrEl = kjua({
text: content,
render: "canvas",
size: 310,
ecLevel: 'H',
});
DOM.qrImage.append(qrEl);
if (!showQr) {
DOM.qrHider.addClass("hidden");
}
@@ -1227,34 +1353,40 @@
return DOM.bip32tab.hasClass("active");
}
function useP2wpkhNestedInP2sh() {
return DOM.useP2wpkhNestedInP2sh.prop("checked");
}
function networkHasBip49() {
return networks[DOM.network.val()].p2wpkhNestedInP2shAvailable;
function networkHasSegwit() {
return networks[DOM.network.val()].segwitAvailable;
}
function bip49TabSelected() {
return DOM.bip49tab.hasClass("active");
}
function bip84TabSelected() {
return DOM.bip84tab.hasClass("active");
}
function bip141TabSelected() {
return DOM.bip141tab.hasClass("active");
}
function setHdCoin(coinValue) {
DOM.bip44coin.val(coinValue);
DOM.bip49coin.val(coinValue);
DOM.bip84coin.val(coinValue);
}
function showP2wpkhNestedInP2shAvailable() {
function showSegwitAvailable() {
DOM.bip49unavailable.addClass("hidden");
DOM.bip49available.removeClass("hidden");
DOM.useP2wpkhNestedInP2sh.prop("disabled", false);
DOM.bip141unavailable.addClass("hidden");
DOM.bip141available.removeClass("hidden");
}
function showP2wpkhNestedInP2shUnavailable() {
function showSegwitUnavailable() {
DOM.bip49available.addClass("hidden");
DOM.bip49unavailable.removeClass("hidden");
DOM.useP2wpkhNestedInP2sh.prop("disabled", true);
DOM.useP2wpkhNestedInP2sh.prop("checked", false);
DOM.bip141available.addClass("hidden");
DOM.bip141unavailable.removeClass("hidden");
}
function useBitpayAddresses() {
@@ -1270,32 +1402,23 @@
}
}
function adjustNetworkForBip49() {
// If bip49 is selected the xpub/xprv prefixes need to be adjusted
function adjustNetworkForSegwit() {
// If segwit is selected the xpub/xprv prefixes need to be adjusted
// to avoid accidentally importing BIP49 xpub to BIP44 watch only
// wallet.
// See https://github.com/iancoleman/bip39/issues/125
if (P2wpkhNestedInP2shSelected()) {
if (network == bitcoinjs.bitcoin.networks.bitcoin) {
network = bitcoinjs.bitcoin.networks.bitcoinBip49;
}
else if (network == bitcoinjs.bitcoin.networks.testnet) {
network = bitcoinjs.bitcoin.networks.testnetBip49;
}
else if (network == bitcoinjs.bitcoin.networks.litecoin) {
network = bitcoinjs.bitcoin.networks.litecoinBip49;
}
var segwitNetworks = null;
// if a segwit network is alread selected, need to use base network to
// look up new parameters
if ("baseNetwork" in network) {
network = bitcoinjs.bitcoin.networks[network.baseNetwork];
}
else {
if (network == bitcoinjs.bitcoin.networks.bitcoinBip49) {
network = bitcoinjs.bitcoin.networks.bitcoin;
}
else if (network == bitcoinjs.bitcoin.networks.testnetBip49) {
network = bitcoinjs.bitcoin.networks.testnet;
}
else if (network == bitcoinjs.bitcoin.networks.litecoinBip49) {
network = bitcoinjs.bitcoin.networks.litecoin;
}
// choose the right segwit params
if (p2wpkhSelected() && "p2wpkh" in network) {
network = network.p2wpkh;
}
else if (p2wpkhInP2shSelected() && "p2wpkhInP2sh" in network) {
network = network.p2wpkhInP2sh;
}
}
@@ -1307,10 +1430,64 @@
return parseInt(lastBitClean);
}
function uint8ArrayToHex(a) {
var s = ""
for (var i=0; i<a.length; i++) {
var h = a[i].toString(16);
while (h.length < 2) {
h = "0" + h;
}
s = s + h;
}
return s;
}
function showWordIndexes() {
var phrase = DOM.phrase.val();
var words = phraseToWordArray(phrase);
var wordIndexes = [];
var language = getLanguage();
for (var i=0; i<words.length; i++) {
var word = words[i];
var wordIndex = WORDLISTS[language].indexOf(word);
wordIndexes.push(wordIndex);
}
var wordIndexesStr = wordIndexes.join(", ");
DOM.entropyWordIndexes.text(wordIndexesStr);
}
function updateCsv() {
var tableCsv = "path,address,public key,private key\n";
var rows = DOM.addresses.find("tr");
for (var i=0; i<rows.length; i++) {
var row = $(rows[i]);
var cells = row.find("td");
for (var j=0; j<cells.length; j++) {
var cell = $(cells[j]);
if (!cell.children().hasClass("invisible")) {
tableCsv = tableCsv + cell.text();
}
if (j != cells.length - 1) {
tableCsv = tableCsv + ",";
}
}
tableCsv = tableCsv + "\n";
}
DOM.csv.val(tableCsv);
}
var networks = [
{
name: "AXE - Axe",
segwitAvailable: false,
onSelect: function() {
network = bitcoinjs.bitcoin.networks.axe;
setHdCoin(0);
},
},
{
name: "BCH - Bitcoin Cash",
p2wpkhNestedInP2shAvailable: false,
segwitAvailable: false,
onSelect: function() {
DOM.useBitpayAddressesContainer.removeClass("hidden");
setBitcoinCashNetworkValues();
@@ -1319,7 +1496,7 @@
},
{
name: "BTC - Bitcoin",
p2wpkhNestedInP2shAvailable: true,
segwitAvailable: true,
onSelect: function() {
network = bitcoinjs.bitcoin.networks.bitcoin;
setHdCoin(0);
@@ -1327,7 +1504,7 @@
},
{
name: "BTC - Bitcoin Testnet",
p2wpkhNestedInP2shAvailable: true,
segwitAvailable: true,
onSelect: function() {
network = bitcoinjs.bitcoin.networks.testnet;
setHdCoin(1);
@@ -1335,7 +1512,7 @@
},
{
name: "BTG - Bitcoin Gold",
p2wpkhNestedInP2shAvailable: true,
segwitAvailable: true,
onSelect: function() {
network = bitcoinjs.bitcoin.networks.bgold;
setHdCoin(0);
@@ -1343,7 +1520,7 @@
},
{
name: "CLAM - Clams",
p2wpkhNestedInP2shAvailable: false,
segwitAvailable: false,
onSelect: function() {
network = bitcoinjs.bitcoin.networks.clam;
setHdCoin(23);
@@ -1351,7 +1528,7 @@
},
{
name: "CRW - Crown",
p2wpkhNestedInP2shAvailable: false,
segwitAvailable: false,
onSelect: function() {
network = bitcoinjs.bitcoin.networks.crown;
setHdCoin(72);
@@ -1359,7 +1536,7 @@
},
{
name: "DASH - Dash",
p2wpkhNestedInP2shAvailable: false,
segwitAvailable: false,
onSelect: function() {
network = bitcoinjs.bitcoin.networks.dash;
setHdCoin(5);
@@ -1367,7 +1544,7 @@
},
{
name: "DASH - Dash Testnet",
p2wpkhNestedInP2shAvailable: false,
segwitAvailable: false,
onSelect: function() {
network = bitcoinjs.bitcoin.networks.dashtn;
setHdCoin(1);
@@ -1375,7 +1552,7 @@
},
{
name: "DOGE - Dogecoin",
p2wpkhNestedInP2shAvailable: false,
segwitAvailable: false,
onSelect: function() {
network = bitcoinjs.bitcoin.networks.dogecoin;
setHdCoin(3);
@@ -1383,7 +1560,7 @@
},
{
name: "ETH - Ethereum",
p2wpkhNestedInP2shAvailable: false,
segwitAvailable: false,
onSelect: function() {
network = bitcoinjs.bitcoin.networks.bitcoin;
setHdCoin(60);
@@ -1391,7 +1568,7 @@
},
{
name: "FJC - Fujicoin",
p2wpkhNestedInP2shAvailable: false,
segwitAvailable: false,
onSelect: function() {
network = bitcoinjs.bitcoin.networks.fujicoin;
setHdCoin(75);
@@ -1399,7 +1576,7 @@
},
{
name: "GAME - GameCredits",
p2wpkhNestedInP2shAvailable: false,
segwitAvailable: false,
onSelect: function() {
network = bitcoinjs.bitcoin.networks.game;
setHdCoin(101);
@@ -1407,15 +1584,23 @@
},
{
name: "JBS - Jumbucks",
p2wpkhNestedInP2shAvailable: false,
segwitAvailable: false,
onSelect: function() {
network = bitcoinjs.bitcoin.networks.jumbucks;
setHdCoin(26);
},
},
{
name: "KMD - Komodo",
bip49available: false,
onSelect: function() {
network = bitcoinjs.bitcoin.networks.komodo;
setHdCoin(141);
},
},
{
name: "LTC - Litecoin",
p2wpkhNestedInP2shAvailable: true,
segwitAvailable: true,
onSelect: function() {
network = bitcoinjs.bitcoin.networks.litecoin;
setHdCoin(2);
@@ -1424,7 +1609,7 @@
},
{
name: "MAZA - Maza",
p2wpkhNestedInP2shAvailable: false,
segwitAvailable: false,
onSelect: function() {
network = bitcoinjs.bitcoin.networks.maza;
setHdCoin(13);
@@ -1432,7 +1617,7 @@
},
{
name: "MONA - Monacoin",
p2wpkhNestedInP2shAvailable: true,
segwitAvailable: true,
onSelect: function() {
network = bitcoinjs.bitcoin.networks.monacoin,
setHdCoin(22);
@@ -1440,15 +1625,23 @@
},
{
name: "NMC - Namecoin",
p2wpkhNestedInP2shAvailable: false,
segwitAvailable: false,
onSelect: function() {
network = bitcoinjs.bitcoin.networks.namecoin;
setHdCoin(7);
},
},
{
name: "ONX - Onixcoin",
segwitAvailable: false,
onSelect: function() {
network = bitcoinjs.bitcoin.networks.onixcoin;
setHdCoin(174);
},
},
{
name: "PIVX - PIVX",
p2wpkhNestedInP2shAvailable: false,
segwitAvailable: false,
onSelect: function() {
network = bitcoinjs.bitcoin.networks.pivx;
setHdCoin(119);
@@ -1456,7 +1649,7 @@
},
{
name: "PIVX - PIVX Testnet",
p2wpkhNestedInP2shAvailable: false,
segwitAvailable: false,
onSelect: function() {
network = bitcoinjs.bitcoin.networks.pivxtestnet;
setHdCoin(1);
@@ -1464,7 +1657,7 @@
},
{
name: "PPC - Peercoin",
p2wpkhNestedInP2shAvailable: false,
segwitAvailable: false,
onSelect: function() {
network = bitcoinjs.bitcoin.networks.peercoin;
setHdCoin(6);
@@ -1472,7 +1665,7 @@
},
{
name: "SDC - ShadowCash",
p2wpkhNestedInP2shAvailable: false,
segwitAvailable: false,
onSelect: function() {
network = bitcoinjs.bitcoin.networks.shadow;
setHdCoin(35);
@@ -1480,7 +1673,7 @@
},
{
name: "SDC - ShadowCash Testnet",
p2wpkhNestedInP2shAvailable: false,
segwitAvailable: false,
onSelect: function() {
network = bitcoinjs.bitcoin.networks.shadowtn;
setHdCoin(1);
@@ -1488,7 +1681,7 @@
},
{
name: "SLM - Slimcoin",
p2wpkhNestedInP2shAvailable: false,
segwitAvailable: false,
onSelect: function() {
network = bitcoinjs.bitcoin.networks.slimcoin;
setHdCoin(63);
@@ -1496,7 +1689,7 @@
},
{
name: "SLM - Slimcoin Testnet",
p2wpkhNestedInP2shAvailable: false,
segwitAvailable: false,
onSelect: function() {
network = bitcoinjs.bitcoin.networks.slimcointn;
setHdCoin(111);
@@ -1504,7 +1697,7 @@
},
{
name: "USNBT - NuBits",
p2wpkhNestedInP2shAvailable: false,
segwitAvailable: false,
onSelect: function() {
network = bitcoinjs.bitcoin.networks.nubits;
setHdCoin(12);
@@ -1512,7 +1705,7 @@
},
{
name: "VIA - Viacoin",
p2wpkhNestedInP2shAvailable: false,
segwitAvailable: false,
onSelect: function() {
network = bitcoinjs.bitcoin.networks.viacoin;
setHdCoin(14);
@@ -1520,7 +1713,7 @@
},
{
name: "VIA - Viacoin Testnet",
p2wpkhNestedInP2shAvailable: false,
segwitAvailable: false,
onSelect: function() {
network = bitcoinjs.bitcoin.networks.viacointestnet;
setHdCoin(1);
@@ -1528,7 +1721,7 @@
},
{
name: "XMY - Myriadcoin",
p2wpkhNestedInP2shAvailable: false,
segwitAvailable: false,
onSelect: function() {
network = bitcoinjs.bitcoin.networks.myriadcoin;
setHdCoin(90);
@@ -1536,7 +1729,7 @@
},
{
name: "XRP - Ripple",
p2wpkhNestedInP2shAvailable: false,
segwitAvailable: false,
onSelect: function() {
network = bitcoinjs.bitcoin.networks.bitcoin;
setHdCoin(144);

10253
src/js/jquery-3.2.1.js vendored Normal file

File diff suppressed because it is too large Load Diff

File diff suppressed because one or more lines are too long

View File

@@ -1,28 +0,0 @@
(function(r){r.fn.qrcode=function(h){var s;function u(a){this.mode=s;this.data=a}function o(a,c){this.typeNumber=a;this.errorCorrectLevel=c;this.modules=null;this.moduleCount=0;this.dataCache=null;this.dataList=[]}function q(a,c){if(void 0==a.length)throw Error(a.length+"/"+c);for(var d=0;d<a.length&&0==a[d];)d++;this.num=Array(a.length-d+c);for(var b=0;b<a.length-d;b++)this.num[b]=a[b+d]}function p(a,c){this.totalCount=a;this.dataCount=c}function t(){this.buffer=[];this.length=0}u.prototype={getLength:function(){return this.data.length},
write:function(a){for(var c=0;c<this.data.length;c++)a.put(this.data.charCodeAt(c),8)}};o.prototype={addData:function(a){this.dataList.push(new u(a));this.dataCache=null},isDark:function(a,c){if(0>a||this.moduleCount<=a||0>c||this.moduleCount<=c)throw Error(a+","+c);return this.modules[a][c]},getModuleCount:function(){return this.moduleCount},make:function(){if(1>this.typeNumber){for(var a=1,a=1;40>a;a++){for(var c=p.getRSBlocks(a,this.errorCorrectLevel),d=new t,b=0,e=0;e<c.length;e++)b+=c[e].dataCount;
for(e=0;e<this.dataList.length;e++)c=this.dataList[e],d.put(c.mode,4),d.put(c.getLength(),j.getLengthInBits(c.mode,a)),c.write(d);if(d.getLengthInBits()<=8*b)break}this.typeNumber=a}this.makeImpl(!1,this.getBestMaskPattern())},makeImpl:function(a,c){this.moduleCount=4*this.typeNumber+17;this.modules=Array(this.moduleCount);for(var d=0;d<this.moduleCount;d++){this.modules[d]=Array(this.moduleCount);for(var b=0;b<this.moduleCount;b++)this.modules[d][b]=null}this.setupPositionProbePattern(0,0);this.setupPositionProbePattern(this.moduleCount-
7,0);this.setupPositionProbePattern(0,this.moduleCount-7);this.setupPositionAdjustPattern();this.setupTimingPattern();this.setupTypeInfo(a,c);7<=this.typeNumber&&this.setupTypeNumber(a);null==this.dataCache&&(this.dataCache=o.createData(this.typeNumber,this.errorCorrectLevel,this.dataList));this.mapData(this.dataCache,c)},setupPositionProbePattern:function(a,c){for(var d=-1;7>=d;d++)if(!(-1>=a+d||this.moduleCount<=a+d))for(var b=-1;7>=b;b++)-1>=c+b||this.moduleCount<=c+b||(this.modules[a+d][c+b]=
0<=d&&6>=d&&(0==b||6==b)||0<=b&&6>=b&&(0==d||6==d)||2<=d&&4>=d&&2<=b&&4>=b?!0:!1)},getBestMaskPattern:function(){for(var a=0,c=0,d=0;8>d;d++){this.makeImpl(!0,d);var b=j.getLostPoint(this);if(0==d||a>b)a=b,c=d}return c},createMovieClip:function(a,c,d){a=a.createEmptyMovieClip(c,d);this.make();for(c=0;c<this.modules.length;c++)for(var d=1*c,b=0;b<this.modules[c].length;b++){var e=1*b;this.modules[c][b]&&(a.beginFill(0,100),a.moveTo(e,d),a.lineTo(e+1,d),a.lineTo(e+1,d+1),a.lineTo(e,d+1),a.endFill())}return a},
setupTimingPattern:function(){for(var a=8;a<this.moduleCount-8;a++)null==this.modules[a][6]&&(this.modules[a][6]=0==a%2);for(a=8;a<this.moduleCount-8;a++)null==this.modules[6][a]&&(this.modules[6][a]=0==a%2)},setupPositionAdjustPattern:function(){for(var a=j.getPatternPosition(this.typeNumber),c=0;c<a.length;c++)for(var d=0;d<a.length;d++){var b=a[c],e=a[d];if(null==this.modules[b][e])for(var f=-2;2>=f;f++)for(var i=-2;2>=i;i++)this.modules[b+f][e+i]=-2==f||2==f||-2==i||2==i||0==f&&0==i?!0:!1}},setupTypeNumber:function(a){for(var c=
j.getBCHTypeNumber(this.typeNumber),d=0;18>d;d++){var b=!a&&1==(c>>d&1);this.modules[Math.floor(d/3)][d%3+this.moduleCount-8-3]=b}for(d=0;18>d;d++)b=!a&&1==(c>>d&1),this.modules[d%3+this.moduleCount-8-3][Math.floor(d/3)]=b},setupTypeInfo:function(a,c){for(var d=j.getBCHTypeInfo(this.errorCorrectLevel<<3|c),b=0;15>b;b++){var e=!a&&1==(d>>b&1);6>b?this.modules[b][8]=e:8>b?this.modules[b+1][8]=e:this.modules[this.moduleCount-15+b][8]=e}for(b=0;15>b;b++)e=!a&&1==(d>>b&1),8>b?this.modules[8][this.moduleCount-
b-1]=e:9>b?this.modules[8][15-b-1+1]=e:this.modules[8][15-b-1]=e;this.modules[this.moduleCount-8][8]=!a},mapData:function(a,c){for(var d=-1,b=this.moduleCount-1,e=7,f=0,i=this.moduleCount-1;0<i;i-=2)for(6==i&&i--;;){for(var g=0;2>g;g++)if(null==this.modules[b][i-g]){var n=!1;f<a.length&&(n=1==(a[f]>>>e&1));j.getMask(c,b,i-g)&&(n=!n);this.modules[b][i-g]=n;e--; -1==e&&(f++,e=7)}b+=d;if(0>b||this.moduleCount<=b){b-=d;d=-d;break}}}};o.PAD0=236;o.PAD1=17;o.createData=function(a,c,d){for(var c=p.getRSBlocks(a,
c),b=new t,e=0;e<d.length;e++){var f=d[e];b.put(f.mode,4);b.put(f.getLength(),j.getLengthInBits(f.mode,a));f.write(b)}for(e=a=0;e<c.length;e++)a+=c[e].dataCount;if(b.getLengthInBits()>8*a)throw Error("code length overflow. ("+b.getLengthInBits()+">"+8*a+")");for(b.getLengthInBits()+4<=8*a&&b.put(0,4);0!=b.getLengthInBits()%8;)b.putBit(!1);for(;!(b.getLengthInBits()>=8*a);){b.put(o.PAD0,8);if(b.getLengthInBits()>=8*a)break;b.put(o.PAD1,8)}return o.createBytes(b,c)};o.createBytes=function(a,c){for(var d=
0,b=0,e=0,f=Array(c.length),i=Array(c.length),g=0;g<c.length;g++){var n=c[g].dataCount,h=c[g].totalCount-n,b=Math.max(b,n),e=Math.max(e,h);f[g]=Array(n);for(var k=0;k<f[g].length;k++)f[g][k]=255&a.buffer[k+d];d+=n;k=j.getErrorCorrectPolynomial(h);n=(new q(f[g],k.getLength()-1)).mod(k);i[g]=Array(k.getLength()-1);for(k=0;k<i[g].length;k++)h=k+n.getLength()-i[g].length,i[g][k]=0<=h?n.get(h):0}for(k=g=0;k<c.length;k++)g+=c[k].totalCount;d=Array(g);for(k=n=0;k<b;k++)for(g=0;g<c.length;g++)k<f[g].length&&
(d[n++]=f[g][k]);for(k=0;k<e;k++)for(g=0;g<c.length;g++)k<i[g].length&&(d[n++]=i[g][k]);return d};s=4;for(var j={PATTERN_POSITION_TABLE:[[],[6,18],[6,22],[6,26],[6,30],[6,34],[6,22,38],[6,24,42],[6,26,46],[6,28,50],[6,30,54],[6,32,58],[6,34,62],[6,26,46,66],[6,26,48,70],[6,26,50,74],[6,30,54,78],[6,30,56,82],[6,30,58,86],[6,34,62,90],[6,28,50,72,94],[6,26,50,74,98],[6,30,54,78,102],[6,28,54,80,106],[6,32,58,84,110],[6,30,58,86,114],[6,34,62,90,118],[6,26,50,74,98,122],[6,30,54,78,102,126],[6,26,52,
78,104,130],[6,30,56,82,108,134],[6,34,60,86,112,138],[6,30,58,86,114,142],[6,34,62,90,118,146],[6,30,54,78,102,126,150],[6,24,50,76,102,128,154],[6,28,54,80,106,132,158],[6,32,58,84,110,136,162],[6,26,54,82,110,138,166],[6,30,58,86,114,142,170]],G15:1335,G18:7973,G15_MASK:21522,getBCHTypeInfo:function(a){for(var c=a<<10;0<=j.getBCHDigit(c)-j.getBCHDigit(j.G15);)c^=j.G15<<j.getBCHDigit(c)-j.getBCHDigit(j.G15);return(a<<10|c)^j.G15_MASK},getBCHTypeNumber:function(a){for(var c=a<<12;0<=j.getBCHDigit(c)-
j.getBCHDigit(j.G18);)c^=j.G18<<j.getBCHDigit(c)-j.getBCHDigit(j.G18);return a<<12|c},getBCHDigit:function(a){for(var c=0;0!=a;)c++,a>>>=1;return c},getPatternPosition:function(a){return j.PATTERN_POSITION_TABLE[a-1]},getMask:function(a,c,d){switch(a){case 0:return 0==(c+d)%2;case 1:return 0==c%2;case 2:return 0==d%3;case 3:return 0==(c+d)%3;case 4:return 0==(Math.floor(c/2)+Math.floor(d/3))%2;case 5:return 0==c*d%2+c*d%3;case 6:return 0==(c*d%2+c*d%3)%2;case 7:return 0==(c*d%3+(c+d)%2)%2;default:throw Error("bad maskPattern:"+
a);}},getErrorCorrectPolynomial:function(a){for(var c=new q([1],0),d=0;d<a;d++)c=c.multiply(new q([1,l.gexp(d)],0));return c},getLengthInBits:function(a,c){if(1<=c&&10>c)switch(a){case 1:return 10;case 2:return 9;case s:return 8;case 8:return 8;default:throw Error("mode:"+a);}else if(27>c)switch(a){case 1:return 12;case 2:return 11;case s:return 16;case 8:return 10;default:throw Error("mode:"+a);}else if(41>c)switch(a){case 1:return 14;case 2:return 13;case s:return 16;case 8:return 12;default:throw Error("mode:"+
a);}else throw Error("type:"+c);},getLostPoint:function(a){for(var c=a.getModuleCount(),d=0,b=0;b<c;b++)for(var e=0;e<c;e++){for(var f=0,i=a.isDark(b,e),g=-1;1>=g;g++)if(!(0>b+g||c<=b+g))for(var h=-1;1>=h;h++)0>e+h||c<=e+h||0==g&&0==h||i==a.isDark(b+g,e+h)&&f++;5<f&&(d+=3+f-5)}for(b=0;b<c-1;b++)for(e=0;e<c-1;e++)if(f=0,a.isDark(b,e)&&f++,a.isDark(b+1,e)&&f++,a.isDark(b,e+1)&&f++,a.isDark(b+1,e+1)&&f++,0==f||4==f)d+=3;for(b=0;b<c;b++)for(e=0;e<c-6;e++)a.isDark(b,e)&&!a.isDark(b,e+1)&&a.isDark(b,e+
2)&&a.isDark(b,e+3)&&a.isDark(b,e+4)&&!a.isDark(b,e+5)&&a.isDark(b,e+6)&&(d+=40);for(e=0;e<c;e++)for(b=0;b<c-6;b++)a.isDark(b,e)&&!a.isDark(b+1,e)&&a.isDark(b+2,e)&&a.isDark(b+3,e)&&a.isDark(b+4,e)&&!a.isDark(b+5,e)&&a.isDark(b+6,e)&&(d+=40);for(e=f=0;e<c;e++)for(b=0;b<c;b++)a.isDark(b,e)&&f++;a=Math.abs(100*f/c/c-50)/5;return d+10*a}},l={glog:function(a){if(1>a)throw Error("glog("+a+")");return l.LOG_TABLE[a]},gexp:function(a){for(;0>a;)a+=255;for(;256<=a;)a-=255;return l.EXP_TABLE[a]},EXP_TABLE:Array(256),
LOG_TABLE:Array(256)},m=0;8>m;m++)l.EXP_TABLE[m]=1<<m;for(m=8;256>m;m++)l.EXP_TABLE[m]=l.EXP_TABLE[m-4]^l.EXP_TABLE[m-5]^l.EXP_TABLE[m-6]^l.EXP_TABLE[m-8];for(m=0;255>m;m++)l.LOG_TABLE[l.EXP_TABLE[m]]=m;q.prototype={get:function(a){return this.num[a]},getLength:function(){return this.num.length},multiply:function(a){for(var c=Array(this.getLength()+a.getLength()-1),d=0;d<this.getLength();d++)for(var b=0;b<a.getLength();b++)c[d+b]^=l.gexp(l.glog(this.get(d))+l.glog(a.get(b)));return new q(c,0)},mod:function(a){if(0>
this.getLength()-a.getLength())return this;for(var c=l.glog(this.get(0))-l.glog(a.get(0)),d=Array(this.getLength()),b=0;b<this.getLength();b++)d[b]=this.get(b);for(b=0;b<a.getLength();b++)d[b]^=l.gexp(l.glog(a.get(b))+c);return(new q(d,0)).mod(a)}};p.RS_BLOCK_TABLE=[[1,26,19],[1,26,16],[1,26,13],[1,26,9],[1,44,34],[1,44,28],[1,44,22],[1,44,16],[1,70,55],[1,70,44],[2,35,17],[2,35,13],[1,100,80],[2,50,32],[2,50,24],[4,25,9],[1,134,108],[2,67,43],[2,33,15,2,34,16],[2,33,11,2,34,12],[2,86,68],[4,43,27],
[4,43,19],[4,43,15],[2,98,78],[4,49,31],[2,32,14,4,33,15],[4,39,13,1,40,14],[2,121,97],[2,60,38,2,61,39],[4,40,18,2,41,19],[4,40,14,2,41,15],[2,146,116],[3,58,36,2,59,37],[4,36,16,4,37,17],[4,36,12,4,37,13],[2,86,68,2,87,69],[4,69,43,1,70,44],[6,43,19,2,44,20],[6,43,15,2,44,16],[4,101,81],[1,80,50,4,81,51],[4,50,22,4,51,23],[3,36,12,8,37,13],[2,116,92,2,117,93],[6,58,36,2,59,37],[4,46,20,6,47,21],[7,42,14,4,43,15],[4,133,107],[8,59,37,1,60,38],[8,44,20,4,45,21],[12,33,11,4,34,12],[3,145,115,1,146,
116],[4,64,40,5,65,41],[11,36,16,5,37,17],[11,36,12,5,37,13],[5,109,87,1,110,88],[5,65,41,5,66,42],[5,54,24,7,55,25],[11,36,12],[5,122,98,1,123,99],[7,73,45,3,74,46],[15,43,19,2,44,20],[3,45,15,13,46,16],[1,135,107,5,136,108],[10,74,46,1,75,47],[1,50,22,15,51,23],[2,42,14,17,43,15],[5,150,120,1,151,121],[9,69,43,4,70,44],[17,50,22,1,51,23],[2,42,14,19,43,15],[3,141,113,4,142,114],[3,70,44,11,71,45],[17,47,21,4,48,22],[9,39,13,16,40,14],[3,135,107,5,136,108],[3,67,41,13,68,42],[15,54,24,5,55,25],[15,
43,15,10,44,16],[4,144,116,4,145,117],[17,68,42],[17,50,22,6,51,23],[19,46,16,6,47,17],[2,139,111,7,140,112],[17,74,46],[7,54,24,16,55,25],[34,37,13],[4,151,121,5,152,122],[4,75,47,14,76,48],[11,54,24,14,55,25],[16,45,15,14,46,16],[6,147,117,4,148,118],[6,73,45,14,74,46],[11,54,24,16,55,25],[30,46,16,2,47,17],[8,132,106,4,133,107],[8,75,47,13,76,48],[7,54,24,22,55,25],[22,45,15,13,46,16],[10,142,114,2,143,115],[19,74,46,4,75,47],[28,50,22,6,51,23],[33,46,16,4,47,17],[8,152,122,4,153,123],[22,73,45,
3,74,46],[8,53,23,26,54,24],[12,45,15,28,46,16],[3,147,117,10,148,118],[3,73,45,23,74,46],[4,54,24,31,55,25],[11,45,15,31,46,16],[7,146,116,7,147,117],[21,73,45,7,74,46],[1,53,23,37,54,24],[19,45,15,26,46,16],[5,145,115,10,146,116],[19,75,47,10,76,48],[15,54,24,25,55,25],[23,45,15,25,46,16],[13,145,115,3,146,116],[2,74,46,29,75,47],[42,54,24,1,55,25],[23,45,15,28,46,16],[17,145,115],[10,74,46,23,75,47],[10,54,24,35,55,25],[19,45,15,35,46,16],[17,145,115,1,146,116],[14,74,46,21,75,47],[29,54,24,19,
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: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)})}})($);

2
src/js/kjua-0.1.1.min.js vendored Normal file

File diff suppressed because one or more lines are too long

View File

@@ -0,0 +1,58 @@
(function() {
// p2wpkh
bitcoinjs.bitcoin.networks.bitcoin.p2wpkh = {
baseNetwork: "bitcoin",
messagePrefix: '\x18Bitcoin Signed Message:\n',
bech32: 'bc',
bip32: {
public: 0x04b24746,
private: 0x04b2430c
},
pubKeyHash: 0x00,
scriptHash: 0x05,
wif: 0x80
};
// p2wpkh in p2sh
bitcoinjs.bitcoin.networks.bitcoin.p2wpkhInP2sh = {
baseNetwork: "bitcoin",
messagePrefix: '\x18Bitcoin Signed Message:\n',
bech32: 'bc',
bip32: {
public: 0x049d7cb2,
private: 0x049d7878
},
pubKeyHash: 0x00,
scriptHash: 0x05,
wif: 0x80
};
bitcoinjs.bitcoin.networks.testnet.p2wpkhInP2sh = {
baseNetwork: "testnet",
messagePrefix: '\x18Bitcoin Signed Message:\n',
bech32: 'tb',
bip32: {
public: 0x044a5262,
private: 0x044a4e28
},
pubKeyHash: 0x6f,
scriptHash: 0xc4,
wif: 0xef
};
bitcoinjs.bitcoin.networks.litecoin.p2wpkhInP2sh = {
baseNetwork: "litecoin",
messagePrefix: '\x19Litecoin Signed Message:\n',
bip32: {
public: 0x01b26ef6,
private: 0x01b26792
},
pubKeyHash: 0x30,
scriptHash: 0x32,
wif: 0xb0
};
})();

View File

@@ -30,9 +30,10 @@ var until = webdriver.until;
var newDriver = null;
var driver = null;
// Delays in ms
var generateDelay = 1000;
var generateDelay = 1500;
var feedbackDelay = 500;
var entropyFeedbackDelay = 500;
var bip38delay = 15000;
// url uses file:// scheme
var path = require('path')
@@ -492,6 +493,13 @@ it('Allows selection of game', function(done) {
};
testNetwork(done, params);
});
it('Allows selection of komodo', function(done) {
var params = {
selectText: "KMD - Komodo",
firstAddress: "RMPPzJwAjPVZZAwJvXivHJGGjdCx6WBD2t",
};
testNetwork(done, params);
});
it('Allows selection of namecoin', function(done) {
var params = {
selectText: "NMC - Namecoin",
@@ -499,6 +507,13 @@ it('Allows selection of namecoin', function(done) {
};
testNetwork(done, params);
});
it('Allows selection of onixcoin', function(done) {
var params = {
selectText: "ONX - Onixcoin",
firstAddress: "XGwMqddeKjT3ddgX73QokjVbCL3aK6Yxfk",
};
testNetwork(done, params);
});
it('Allows selection of peercoin', function(done) {
var params = {
selectText: "PPC - Peercoin",
@@ -591,6 +606,13 @@ it('Allows selection of monacoin', function(done) {
};
testNetwork(done, params);
});
it('Allows selection of AXE', function(done) {
var params = {
selectText: "AXE - Axe",
firstAddress: "XQ4HLxUVS3egk5ff1o9e2vJFJKSSsUH3B7",
};
testNetwork(done, params);
});
// BIP39 seed is set from phrase
it('Sets the bip39 seed from the prhase', function(done) {
@@ -919,13 +941,13 @@ it('Can generate more rows in the table', function(done) {
// A custom number of additional addresses can be generated
it('Can generate more rows in the table', function(done) {
driver.findElement(By.css('.rows-to-add'))
.clear();
driver.findElement(By.css('.rows-to-add'))
.sendKeys('1');
driver.findElement(By.css('.phrase'))
.sendKeys('abandon abandon ability');
driver.sleep(generateDelay).then(function() {
driver.findElement(By.css('.rows-to-add'))
.clear();
driver.findElement(By.css('.rows-to-add'))
.sendKeys('1');
driver.findElement(By.css('.more'))
.click();
driver.sleep(generateDelay).then(function() {
@@ -2145,10 +2167,11 @@ it('Can change details while old addresses are still being generated', function(
driver.findElement(By.css('.phrase'))
.sendKeys("abandon abandon ability");
driver.sleep(generateDelay).then(function() {
// generate more addresses
driver.findElement(By.css('.more'))
.click();
// change tabs which should cancel the previous generating
driver.findElement(By.css('.rows-to-add'))
.clear();
driver.findElement(By.css('.rows-to-add'))
.sendKeys('20');
driver.findElement(By.css('#bip32-tab a'))
.click()
driver.sleep(generateDelay).then(function() {
@@ -2161,7 +2184,7 @@ it('Can change details while old addresses are still being generated', function(
});
});
});
});
}, generateDelay + 5000);
// Github issue 49
// padding for binary should give length with multiple of 256
@@ -2473,11 +2496,11 @@ it('Shows error for hardened addresses with xpub root key', function(done) {
});
});
// Litecoin uses xprv by default, and can optionally be set to ltpv
// Litecoin uses ltub by default, and can optionally be set to xprv
// github issue 96
// https://github.com/iancoleman/bip39/issues/96
// Issue with extended keys on Litecoin
it('Uses xprv by default for litecoin, but can be set to ltpv', function(done) {
it('Uses ltub by default for litecoin, but can be set to xprv', function(done) {
driver.findElement(By.css('.phrase'))
.sendKeys("abandon abandon ability");
selectNetwork("LTC - Litecoin");
@@ -2486,17 +2509,17 @@ it('Uses xprv by default for litecoin, but can be set to ltpv', function(done) {
driver.findElement(By.css('.root-key'))
.getAttribute("value")
.then(function(rootKey) {
expect(rootKey).toBe("xprv9s21ZrQH143K2jkGDCeTLgRewT9F2pH5JZs2zDmmjXes34geVnFiuNa8KTvY5WoYvdn4Ag6oYRoB6cXtc43NgJAEqDXf51xPm6fhiMCKwpi");
expect(rootKey).toBe("Ltpv71G8qDifUiNesiPqf6h5V6eQ8ic77oxQiYtawiACjBEx3sTXNR2HGDGnHETYxESjqkMLFBkKhWVq67ey1B2MKQXannUqNy1RZVHbmrEjnEU");
// set litecoin to use ltub
driver.executeScript(function() {
$(".litecoin-use-ltub").prop("checked", true);
$(".litecoin-use-ltub").prop("checked", false);
$(".litecoin-use-ltub").trigger("change");
});
driver.sleep(generateDelay).then(function() {
driver.findElement(By.css('.root-key'))
.getAttribute("value")
.then(function(rootKey) {
expect(rootKey).toBe("Ltpv71G8qDifUiNesiPqf6h5V6eQ8ic77oxQiYtawiACjBEx3sTXNR2HGDGnHETYxESjqkMLFBkKhWVq67ey1B2MKQXannUqNy1RZVHbmrEjnEU");
expect(rootKey).toBe("xprv9s21ZrQH143K2jkGDCeTLgRewT9F2pH5JZs2zDmmjXes34geVnFiuNa8KTvY5WoYvdn4Ag6oYRoB6cXtc43NgJAEqDXf51xPm6fhiMCKwpi");
done();
});
})
@@ -2504,31 +2527,6 @@ it('Uses xprv by default for litecoin, but can be set to ltpv', function(done) {
});
});
// 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?
it('Uses xprv by default for litecoin, but can be set to ltpv', function(done) {
// use p2wpkh addresses
driver.executeScript(function() {
$(".p2wpkh-nested-in-p2sh").prop("checked", true);
});
// use bip32 tab
driver.findElement(By.css('#bip32-tab a'))
.click()
// use testnet
selectNetwork("BTC - Bitcoin Testnet");
// Set root xpub to BIP49 official test vector account 0
driver.findElement(By.css('.root-key'))
.sendKeys("tpubDD7tXK8KeQ3YY83yWq755fHY2JW8Ha8Q765tknUM5rSvjPcGWfUppDFMpQ1ScziKfW3ZNtZvAD7M3u7bSs7HofjTD3KP3YxPK7X6hwV8Rk2");
driver.sleep(generateDelay).then(function() {
getFirstAddress(function(address) {
expect(address).toBe("2Mww8dCYPUpKHofjgcXcBCEGmniw9CoaiD2");
done();
});
});
});
// 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
@@ -2621,4 +2619,293 @@ it('Can generate more addresses from a custom index', function(done) {
});
});
it('Can generate BIP141 addresses with P2WPKH-in-P2SH semanitcs', function(done) {
// Sourced from BIP49 official test specs
driver.findElement(By.css('#bip141-tab a'))
.click();
driver.findElement(By.css('.bip141-path'))
.clear();
driver.findElement(By.css('.bip141-path'))
.sendKeys("m/49'/1'/0'/0");
selectNetwork("BTC - Bitcoin Testnet");
driver.findElement(By.css(".phrase"))
.sendKeys("abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon about");
driver.sleep(generateDelay).then(function() {
getFirstAddress(function(address) {
expect(address).toBe("2Mww8dCYPUpKHofjgcXcBCEGmniw9CoaiD2");
done();
});
});
});
it('Can generate BIP141 addresses with P2WPKH semanitcs', function(done) {
// This result tested against bitcoinjs-lib test spec for segwit address
// using the first private key of this mnemonic and default path m/0
// https://github.com/bitcoinjs/bitcoinjs-lib/blob/9c8503cab0c6c30a95127042703bc18e8d28c76d/test/integration/addresses.js#L50
// so whilst not directly comparable, substituting the private key produces
// identical results between this tool and the bitcoinjs-lib test.
// Private key generated is:
// L3L8Nu9whawPBNLGtFqDhKut9DKKfG3CQoysupT7BimqVCZsLFNP
driver.findElement(By.css('#bip141-tab a'))
.click();
// Choose P2WPKH
driver.executeScript(function() {
$(".bip141-semantics option[selected]").removeAttr("selected");
$(".bip141-semantics option").filter(function(i,e) {
return $(e).html() == "P2WPKH";
}).prop("selected", true);
$(".bip141-semantics").trigger("change");
});
driver.findElement(By.css(".phrase"))
.sendKeys("abandon abandon ability");
driver.sleep(generateDelay).then(function() {
getFirstAddress(function(address) {
expect(address).toBe("bc1qfwu6a5a3evygrk8zvdxxvz4547lmpyx5vsfxe9");
done();
});
});
});
it('Shows the entropy used by the PRNG when clicking generate', function(done) {
driver.findElement(By.css('.generate')).click();
driver.sleep(generateDelay).then(function() {
driver.findElement(By.css('.entropy'))
.getAttribute("value")
.then(function(entropy) {
expect(entropy).not.toBe("");
done();
});
});
});
it('Shows the index of each word in the mnemonic', function(done) {
driver.findElement(By.css('.phrase'))
.sendKeys("abandon abandon ability");
driver.sleep(generateDelay).then(function() {
driver.findElement(By.css('.use-entropy'))
.click();
driver.findElement(By.css('.word-indexes'))
.getText()
.then(function(indexes) {
expect(indexes).toBe("0, 0, 1");
done();
});
});
});
it('Shows the derivation path for bip84 tab', function(done) {
driver.findElement(By.css('#bip84-tab a'))
.click()
driver.findElement(By.css('.phrase'))
.sendKeys('abandon abandon ability');
driver.sleep(generateDelay).then(function() {
driver.findElement(By.css('#bip84 .path'))
.getAttribute("value")
.then(function(path) {
expect(path).toBe("m/84'/0'/0'/0");
done();
})
});
});
it('Shows the extended private key for bip84 tab', function(done) {
driver.findElement(By.css('#bip84-tab a'))
.click()
driver.findElement(By.css('.phrase'))
.sendKeys('abandon abandon ability');
driver.sleep(generateDelay).then(function() {
driver.findElement(By.css('.extended-priv-key'))
.getAttribute("value")
.then(function(path) {
expect(path).toBe("zprvAev3RKrZ3QVKiUFCfdeMRen1BPDJgdNt1XpxiDy8acSs4kkAGTCvq7HeRYRNNpo8EtEjCFQBWavJwtCUR29y4TUCH4X5RXMcyq48uN8y9BP");
done();
})
});
});
it('Shows the extended public key for bip84 tab', function(done) {
driver.findElement(By.css('#bip84-tab a'))
.click()
driver.findElement(By.css('.phrase'))
.sendKeys('abandon abandon ability');
driver.sleep(generateDelay).then(function() {
driver.findElement(By.css('.extended-pub-key'))
.getAttribute("value")
.then(function(path) {
expect(path).toBe("zpub6suPpqPSsn3cvxKfmfBMnnijjR3o666jNkkZWcNk8wyqwZ5JozXBNuc8Gs7DB3uLwTDvGVTspVEAUQcEjKF3pZHgywVbubdTqbXTUg7usyx");
done();
})
});
});
it('Changes the address list if bip84 account is changed', function(done) {
driver.findElement(By.css('#bip84-tab a'))
.click()
driver.findElement(By.css('#bip84 .account'))
.sendKeys('1');
driver.findElement(By.css('.phrase'))
.sendKeys('abandon abandon ability');
driver.sleep(generateDelay).then(function() {
getFirstAddress(function(address) {
expect(address).toBe("bc1qp7vv669t2fy965jdzvqwrraana89ctd5ewc662");
done();
});
});
});
it('Changes the address list if bip84 change is changed', function(done) {
driver.findElement(By.css('#bip84-tab a'))
.click()
driver.findElement(By.css('#bip84 .change'))
.sendKeys('1');
driver.findElement(By.css('.phrase'))
.sendKeys('abandon abandon ability');
driver.sleep(generateDelay).then(function() {
getFirstAddress(function(address) {
expect(address).toBe("bc1qr39vj6rh06ff05m53uxq8uazehwhccswylhrs2");
done();
});
});
});
it('Passes the official BIP84 test spec for rootpriv', function(done) {
driver.findElement(By.css('#bip84-tab a'))
.click()
driver.findElement(By.css('.phrase'))
.sendKeys('abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon about');
driver.sleep(generateDelay).then(function() {
driver.findElement(By.css(".root-key"))
.getAttribute("value")
.then(function(rootKey) {
expect(rootKey).toBe("zprvAWgYBBk7JR8Gjrh4UJQ2uJdG1r3WNRRfURiABBE3RvMXYSrRJL62XuezvGdPvG6GFBZduosCc1YP5wixPox7zhZLfiUm8aunE96BBa4Kei5");
done();
})
});
});
it('Passes the official BIP84 test spec for account 0 xprv', function(done) {
driver.findElement(By.css('#bip84-tab a'))
.click()
driver.findElement(By.css('.phrase'))
.sendKeys('abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon about');
driver.sleep(generateDelay).then(function() {
driver.findElement(By.css("#bip84 .account-xprv"))
.getAttribute("value")
.then(function(rootKey) {
expect(rootKey).toBe("zprvAdG4iTXWBoARxkkzNpNh8r6Qag3irQB8PzEMkAFeTRXxHpbF9z4QgEvBRmfvqWvGp42t42nvgGpNgYSJA9iefm1yYNZKEm7z6qUWCroSQnE");
done();
})
});
});
it('Passes the official BIP84 test spec for account 0 xpub', function(done) {
driver.findElement(By.css('#bip84-tab a'))
.click()
driver.findElement(By.css('.phrase'))
.sendKeys('abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon about');
driver.sleep(generateDelay).then(function() {
driver.findElement(By.css("#bip84 .account-xpub"))
.getAttribute("value")
.then(function(rootKey) {
expect(rootKey).toBe("zpub6rFR7y4Q2AijBEqTUquhVz398htDFrtymD9xYYfG1m4wAcvPhXNfE3EfH1r1ADqtfSdVCToUG868RvUUkgDKf31mGDtKsAYz2oz2AGutZYs");
done();
})
});
});
it('Passes the official BIP84 test spec for account 0 first address', function(done) {
driver.findElement(By.css('#bip84-tab a'))
.click()
driver.findElement(By.css('.phrase'))
.sendKeys('abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon about');
driver.sleep(generateDelay).then(function() {
getFirstAddress(function(address) {
expect(address).toBe("bc1qcr8te4kr609gcawutmrza0j4xv80jy8z306fyu");
done();
});
});
});
it('Passes the official BIP84 test spec for account 0 first change address', function(done) {
driver.findElement(By.css('#bip84-tab a'))
.click()
driver.findElement(By.css('.phrase'))
.sendKeys('abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon about');
driver.findElement(By.css('#bip84 .change'))
.sendKeys('1');
driver.sleep(generateDelay).then(function() {
getFirstAddress(function(address) {
expect(address).toBe("bc1q8c6fshw2dlwun7ekn9qwf37cu2rn755upcp6el");
done();
});
});
});
it('Can display the table as csv', function(done) {
var headings = "path,address,public key,private key";
var row1 = "m/44'/0'/0'/0/0,1Di3Vp7tBWtyQaDABLAjfWtF6V7hYKJtug,033f5aed5f6cfbafaf223188095b5980814897295f723815fea5d3f4b648d0d0b3,L26cVSpWFkJ6aQkPkKmTzLqTdLJ923e6CzrVh9cmx21QHsoUmrEE";
var row20 = "m/44'/0'/0'/0/19,1KhBy28XLAciXnnRvm71PvQJaETyrxGV55,02b4b3e396434d8cdd20c03ac4aaa07387784d5d867b75987f516f5705ee68cb3a,L4GrDrjReMsCAu5DkLXn79jSb95qR7Zfx7eshybCQZ1qL32MXJab";
driver.findElement(By.css('.phrase'))
.sendKeys('abandon abandon ability');
driver.sleep(generateDelay).then(function() {
driver.findElement(By.css('.csv'))
.getAttribute("value")
.then(function(csv) {
expect(csv).toContain(headings);
expect(csv).toContain(row1);
expect(csv).toContain(row20);
done();
});
});
});
it('LeftPads ethereum keys that are less than 32 bytes', function(done) {
// see https://github.com/iancoleman/bip39/issues/155
selectNetwork("ETH - Ethereum");
driver.findElement(By.css('#bip32-tab a'))
.click()
driver.findElement(By.css('#bip32-path'))
.clear();
driver.findElement(By.css('#bip32-path'))
.sendKeys("m/44'/60'/0'");
driver.findElement(By.css('.phrase'))
.sendKeys('scout sort custom elite radar rare vivid thing trophy gesture cover snake change narrow kite list nation sustain buffalo erode open balance system young');
driver.sleep(generateDelay).then(function() {
getFirstAddress(function(address) {
expect(address).toBe("0x8943E785B4a5714FC87a3aFAad1eB1FeB602B118");
done();
});
});
});
it('Can encrypt private keys using BIP38', function(done) {
// see https://github.com/iancoleman/bip39/issues/140
driver.executeScript(function() {
$(".use-bip38").prop("checked", true);
});
driver.findElement(By.css('.bip38-password'))
.sendKeys('bip38password');
driver.findElement(By.css('.rows-to-add'))
.clear();
driver.findElement(By.css('.rows-to-add'))
.sendKeys('1');
driver.findElement(By.css('.phrase'))
.sendKeys('abandon abandon ability');
driver.sleep(bip38delay).then(function() {
// address
getFirstRowValue(function(address) {
expect(address).toBe("1NCvSdumA3ngMM9c4aqU56AM6rqXddfuXB");
// pubkey
getFirstRowValue(function(pubkey) {
expect(pubkey).toBe("043f5aed5f6cfbafaf223188095b5980814897295f723815fea5d3f4b648d0d0b3884a74447ea901729b1e73a999b7520e7cb55b4120e6432c64153ccab8a848e1");
// privkey
getFirstRowValue(function(privkey) {
expect(privkey).toBe("6PRNRiFnj1RoR3sXhymdCvoZCgnUHQpfupNdKkFbWJkwWQEKesWt1EDMDM");
done();
}, ".privkey");
}, ".pubkey");
}, ".address");
});
}, bip38delay + 5000);
});