Compare commits

...

93 Commits

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
Ian Coleman 924727ed26 Release v0.2.9 2017-11-21 12:17:28 +11:00
Ian Coleman 9183f9f658 Allow more rows to be generated at a custom index 2017-11-21 12:06:56 +11:00
Ian Coleman f487fea9b8 Fix ordering of networks to be alphabetical 2017-11-16 15:11:01 +11:00
Ian Coleman 5a10834a36 Add test for monacoin 2017-11-16 15:09:56 +11:00
Ian Coleman 1f354b0390 Add test for Bitcoin Gold network 2017-11-16 15:09:37 +11:00
Ian Coleman 0460b53f3a Use selenium for tests instead of phantomjs 2017-11-16 14:37:17 +11:00
iancoleman e8ee368f18 Merge pull request #129 from rsnel/bgold
add BTG (Bitcoin Gold/bgold)
2017-11-15 08:53:38 +11:00
iancoleman 107edb3454 Merge pull request #126 from monautils/master
add monacoin
2017-11-15 08:53:25 +11:00
Rik Snel 3960807353 add BTG (Bitcoin Gold/bgold) 2017-11-14 09:05:50 +01:00
you21979 214c584c40 fix new secret_key https://github.com/monacoinproject/monacoin/blob/master-0.14/src/chainparams.cpp#L135 2017-11-09 19:17:16 +09:00
you21979 c1396e87ed add monacoin 2017-11-09 17:21:07 +09:00
Ian Coleman b57b721e2c Fix web link from github.io to iancoleman.io 2017-11-01 09:32:18 +11:00
Ian Coleman 0f6b34d68b Release v0.2.8 2017-10-31 13:34:53 +11:00
Ian Coleman 2a01f39de7 Add P2WPKH-nested-in-P2SH to litecoin 2017-10-31 11:48:51 +11:00
Ian Coleman 93c3ef4757 Use correct prefixes for xprv/xpub with segwit 2017-10-31 11:44:42 +11:00
Ian Coleman fe8f2d140d Allow BitPay address format for bitcoin cash 2017-10-31 10:35:52 +11:00
Ian Coleman 0cca6e893a Add test for nubits network 2017-10-10 12:04:27 +11:00
iancoleman f2a1a8e67f Merge pull request #123 from alkley/master
Add nubits
2017-10-10 11:48:33 +11:00
alkley 8dd28f2cff Add nubits 2017-10-09 15:34:39 +02:00
iancoleman 4b1e5c340f Merge pull request #122 from dimitris-t/patch-1
Update changelog.md
2017-10-05 09:59:25 +11:00
Dimitris Tsapakidis 2be42f9dba Update changelog.md
Fixed markdown typo.
2017-10-04 19:22:49 +03:00
Ian Coleman 4aa771eb68 Add test for fujicoin 2017-10-03 14:40:56 +11:00
Ian Coleman 1102f20135 Release v0.2.7 2017-10-02 14:16:46 +11:00
Ian Coleman fb00a22d3f Remove hand-rolled translation library 2017-10-02 14:09:32 +11:00
Ian Coleman 73b8724a6f List alternative tools 2017-10-02 14:04:23 +11:00
iancoleman 8890d0f4c3 Merge pull request #120 from fujicoin/add-fujicoin
Add Fujicoin
2017-09-27 10:58:48 +10:00
motty 6e67990522 add Fujicoin 2017-09-26 11:54:56 +09:00
Ian Coleman 9ff30babbc Release v0.2.6 2017-09-20 11:39:06 +10:00
Ian Coleman ee0981f1ec Detect and warn of filtered entropy 2017-09-20 11:25:21 +10:00
Ian Coleman 6024e655a8 Update process for committing changes
Do not include changes in bip39-standalone.html
2017-09-19 11:15:25 +10:00
Ian Coleman 7e6bdc498e Reword entropy text to say one type, not multiple 2017-09-19 11:13:03 +10:00
iancoleman 16b4c2788a Merge pull request #117 from jonathancross/iancoleman-bip39-bip49
Adding BIP 49 to "More info" section.
2017-09-19 10:32:20 +10:00
iancoleman 0197de2795 Merge pull request #116 from jonathancross/iancoleman-bip39-compile
Allowing compilation with Python 2.x
2017-09-19 10:26:32 +10:00
Jonathan Cross 861750ae51 Adding BIP 49 to "More info" section. 2017-09-18 02:18:51 +02:00
Jonathan Cross a40d59d904 Allowing compilation with Python 2.x and 3. 2017-09-18 01:57:05 +02:00
iancoleman d933c3f731 Merge pull request #103 from Zwilla/patch-3
correctLevel from 2 to 3
2017-09-08 08:12:34 +10:00
iancoleman 408ecc184a Merge pull request #102 from Zwilla/patch-2
remove sourceMappingURL=zxcvbn.js.map
2017-09-08 08:07:51 +10:00
Zwilla 00114002fe correctLevel from 2 to 3
correctLevel 3 is generally recommended for industrial environments.

See also: https://github.com/iancoleman/bip39/issues/101
2017-09-07 14:32:42 +02:00
Zwilla e80955983d remove sourceMappingURL=zxcvbn.js.map
just remove this line, if not every time we run the converter it searches for the map file. It is not enough to uncomment this line.
thx
2017-09-07 09:42:54 +02:00
iancoleman f20b7e7128 Merge pull request #98 from Zwilla/patch-1
changed some wrong comma and ;
2017-09-04 10:03:05 +10:00
Zwilla 908dc06fe8 changed some wrong comma and ;
nothing else
2017-09-04 01:55:55 +02:00
Ian Coleman 3d548c6f9b Improve release process order and add details 2017-09-01 13:20:29 +10:00
Ian Coleman 0a8d06d03e Release v0.2.5 2017-09-01 12:35:42 +10:00
Ian Coleman 88311463c7 Allow P2WPKH nested in P2SH addresses on BIP32 tab 2017-09-01 12:28:27 +10:00
Ian Coleman cd7c8327b1 Validate root key correctly for alternate networks 2017-09-01 12:27:03 +10:00
Ian Coleman 0cda44d5f6 Rename bip49 to p2wpkhNestedInP2sh where suitable 2017-09-01 12:25:45 +10:00
Ian Coleman 7258b102c1 Add confirmation steps to the release process 2017-08-28 10:03:21 +10:00
Ian Coleman 8d18f379fd Release v0.2.4 2017-08-28 09:48:48 +10:00
Ian Coleman 3abab9b087 Add a checkbox to switch litecoin key prefixes 2017-08-28 09:45:38 +10:00
Ian Coleman b18eb97ae3 Show error when using xpub with hardened addresses 2017-08-24 09:37:21 +10:00
Ian Coleman 88ea3e40ee Release v0.2.3 2017-08-23 09:45:09 +10:00
Ian Coleman 8a9f391376 Test for Maza network 2017-08-23 09:41:53 +10:00
iancoleman e40acc3ab0 Merge pull request #92 from jonspock/master
Add maza coin, update PIVX in bip39-standalone.html
2017-08-23 09:30:43 +10:00
Jon Spock 56ad960105 Add maza coin 2017-08-21 17:13:44 -07:00
28 changed files with 121066 additions and 8483 deletions
+1
View File
@@ -0,0 +1 @@
node_modules
+59103 -2234
View File
File diff suppressed because one or more lines are too long
+77
View File
@@ -1,3 +1,80 @@
# 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
* Add Monacoin
* Add Bitcoin Gold
* Port test suite to selenium
* Allow more rows to be generated starting from a custom index
# 0.2.8
* Enable segwit for Litecoin
* BitPay-style addresses for Bitcoin Cash
* Use new xpub/xprv prefixes for Segwit BIP49
* Add nubits network
# 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 # 0.2.2
* Improve showing feedback for pending calculations * Improve showing feedback for pending calculations
+1
View File
@@ -1,6 +1,7 @@
import os import os
import re import re
import datetime import datetime
from io import open
# This script generates the bip39-standalone.html file. # This script generates the bip39-standalone.html file.
+20 -4
View File
@@ -4,7 +4,7 @@ A tool for converting BIP39 mnemonic phrases to addresses and private keys.
## Online Version ## Online Version
https://iancoleman.github.io/bip39/ https://iancoleman.io/bip39/
## Standalone offline version ## Standalone offline version
@@ -55,16 +55,32 @@ at 1PC9aZC4hNX2rmmrt7uHTfYAS3hRbph4UN
Please do not make modifications to `bip39-standalone.html`, since they will Please do not make modifications to `bip39-standalone.html`, since they will
be overwritten by `compile.py`. 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 # Tests
Tests depend on [phantomjs](http://phantomjs.org/). Tests depend on
* nodejs
* selenium webdriver - cd /path/to/bip39/tests; npm install
* selenium driver for firefox ([geckodriver](https://github.com/mozilla/geckodriver/releases)) and / or chrome ([chromedriver](https://sites.google.com/a/chromium.org/chromedriver/downloads))
* jasmine - npm install --global jasmine
Before running tests, the site must be served at http://localhost:8000.
```
$ cd /path/to/bip39/src
$ python -m http.server
```
Run tests from the command-line Run tests from the command-line
``` ```
$ phantomjs tests.js $ cd /path/to/bip39/tests
$ jasmine spec/tests.js
``` ```
# License # License
+7 -3
View File
@@ -7,13 +7,17 @@ created with the following steps:
1. Run `python compile.py` 1. Run `python compile.py`
1. Commit these changes with message `Release vX.Y.Z` 1. Commit these changes with message `Release vX.Y.Z`
1. Tag the commit `git tag X.Y.Z` 1. Tag the commit `git tag X.Y.Z`
1. Push the changes `git push`
1. Push the new tag `git push --tags`
1. Get the hash of the file `sha256sum bip39-standalone.html` 1. Get the hash of the file `sha256sum bip39-standalone.html`
1. Create the text for the release notes (see prior releases) 1. Create the text for the release notes (see prior releases)
1. Sign the release notes `gpg --clearsign /tmp/releasenotes.txt` 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. Create a release on github from the tagged commit
1. include the signed release notes as text for the release 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. attach the bip39-standalone.html file
1. Add a new post to twitter from @bip39tool with the version, link and hash 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. 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`
+105
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
View File
File diff suppressed because it is too large Load Diff
-5
View File
File diff suppressed because one or more lines are too long
+335 -233
View File
@@ -3,118 +3,19 @@
<head lang="en"> <head lang="en">
<meta charset="utf-8" /> <meta charset="utf-8" />
<title>BIP39 - Mnemonic Code</title> <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="Mnemonic code for generating deterministic keys" name="description"/>
<meta content="width=device-width, initial-scale=1.0" name="viewport" /> <meta content="width=device-width, initial-scale=1.0" name="viewport" />
<meta content="bitcoin mnemonic converter" name="description" /> <meta content="bitcoin mnemonic converter" name="description" />
<meta content="Ian Coleman" name="author" /> <meta content="Ian Coleman" name="author" />
<link type="image/x-icon" rel="icon" href="data:image/x-icon;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQEAYAAABPYyMiAAAABmJLR0T///////8JWPfcAAAACXBIWXMAAABIAAAASABGyWs+AAAAF0lEQVRIx2NgGAWjYBSMglEwCkbBSAcACBAAAeaR9cIAAAAASUVORK5CYII=" /> <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> </head>
<body> <body>
<div class="container"> <div class="container">
<h1 class="text-center">Mnemonic Code Converter</h1> <h1 class="text-center">Mnemonic Code Converter</h1>
<p class="version">v0.2.2</p> <p class="version">v0.3.3</p>
<hr> <hr>
<div class="row"> <div class="row">
<div class="col-md-12"> <div class="col-md-12">
@@ -123,8 +24,8 @@
<div class="form-group"> <div class="form-group">
<div class="col-sm-2"></div> <div class="col-sm-2"></div>
<div class="col-sm-10"> <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>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>
For more info see the For more info see the
<a href="https://github.com/bitcoin/bips/blob/master/bip-0039.mediawiki" target="_blank">BIP39 spec</a>. <a href="https://github.com/bitcoin/bips/blob/master/bip-0039.mediawiki" target="_blank">BIP39 spec</a>.
</p> </p>
@@ -135,7 +36,7 @@
<div class="col-sm-10"> <div class="col-sm-10">
<div class="form-inline"> <div class="form-inline">
<div class="input-group-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> <button class="btn generate">Generate</button>
<select id="strength" class="strength form-control"> <select id="strength" class="strength form-control">
<option value="3">3</option> <option value="3">3</option>
@@ -147,66 +48,75 @@
<option value="21">21</option> <option value="21">21</option>
<option value="24">24</option> <option value="24">24</option>
</select> </select>
<span data-translate>words</span> <span>words</span>
</div> </div>
</div> </div>
</div> </div>
</div> </div>
<div class="entropy-container hidden"> <div class="entropy-container hidden">
<div class="form-group text-danger"> <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"> <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> <span>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> <a href="#entropy-notes">Read more</a>
</div> </div>
</div> </div>
<div class="form-group"> <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"> <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"> <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> <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 class="event-count col-sm-3 form-control-static"></div>
</div> </div>
<div class="row"> <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> <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 class="bits-per-event col-sm-3 form-control-static"></div>
</div> </div>
<div class="row"> <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> <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 class="bits col-sm-3 form-control-static"></div>
</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> <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> <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">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"> <div class="col-sm-9">
<select class="mnemonic-length form-control"> <select class="mnemonic-length form-control">
<option value="raw" selected data-translate>Use Raw Entropy (3 words per 32 bits)</option> <option value="raw" selected>Use Raw Entropy (3 words per 32 bits)</option>
<option value="12">12 <span data-translate>Words</span></option> <option value="12">12 <span>Words</span></option>
<option value="15">15 <span data-translate>Words</option> <option value="15">15 <span>Words</option>
<option value="18">18 <span data-translate>Words</span></option> <option value="18">18 <span>Words</span></option>
<option value="21">21 <span data-translate>Words</span></option> <option value="21">21 <span>Words</span></option>
<option value="24">24 <span data-translate>Words</span></option> <option value="24">24 <span>Words</span></option>
</select> </select>
</div> </div>
</div> </div>
<div class="col-sm-3"> <div class="col-sm-3">
<p data-translate>Valid entropy values include:</p> <p>Valid entropy values include:</p>
<ul> <ul>
<li><strong data-translate>Binary</strong> [0-1]<br>101010011</li> <li><strong>Binary</strong> [0-1]<br>101010011</li>
<li><strong data-translate>Base 6</strong> [0-5]<br>123434014</li> <li><strong>Base 6</strong> [0-5]<br>123434014</li>
<li><strong data-translate>Dice</strong> [1-6]<br>62535634</li> <li><strong>Dice</strong> [1-6]<br>62535634</li>
<li><strong data-translate>Base 10</strong> [0-9]<br>90834528</li> <li><strong>Base 10</strong> [0-9]<br>90834528</li>
<li><strong data-translate>Hex</strong> [0-9A-F]<br>4187a8bfd9</li> <li><strong>Hex</strong> [0-9A-F]<br>4187a8bfd9</li>
<li><strong data-translate>Card</strong> [A2-9TJQK][CDHS]<br>ahqs9dtc</li> <li><strong>Card</strong> [A2-9TJQK][CDHS]<br>ahqs9dtc</li>
</ul> </ul>
</div> </div>
</div> </div>
@@ -216,12 +126,12 @@
<div class="col-sm-10 checkbox"> <div class="col-sm-10 checkbox">
<label> <label>
<input type="checkbox" class="use-entropy"> <input type="checkbox" class="use-entropy">
<span data-translate>Supply my own source of entropy</span> <span>Show entropy details</span>
</label> </label>
</div> </div>
</div> </div>
<div class="form-group"> <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="col-sm-10 languages">
<div class="form-control no-border"> <div class="form-control no-border">
<a href="#english">English</a> <a href="#english">English</a>
@@ -235,25 +145,25 @@
</div> </div>
</div> </div>
<div class="form-group"> <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"> <div class="col-sm-10">
<textarea id="phrase" class="phrase form-control" data-show-qr></textarea> <textarea id="phrase" class="phrase form-control" data-show-qr></textarea>
</div> </div>
</div> </div>
<div class="form-group"> <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"> <div class="col-sm-10">
<textarea id="passphrase" class="passphrase form-control"></textarea> <textarea id="passphrase" class="passphrase form-control"></textarea>
</div> </div>
</div> </div>
<div class="form-group"> <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"> <div class="col-sm-10">
<textarea id="seed" class="seed form-control" readonly="readonly" data-show-qr></textarea> <textarea id="seed" class="seed form-control" readonly="readonly" data-show-qr></textarea>
</div> </div>
</div> </div>
<div class="form-group"> <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"> <div class="col-sm-10">
<select id="network-phrase" class="network form-control"> <select id="network-phrase" class="network form-control">
<!-- populated by javascript --> <!-- populated by javascript -->
@@ -261,11 +171,20 @@
</div> </div>
</div> </div>
<div class="form-group"> <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"> <div class="col-sm-10">
<textarea id="root-key" class="root-key form-control" data-show-qr></textarea> <textarea id="root-key" class="root-key form-control" data-show-qr></textarea>
</div> </div>
</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" checked="checked">
Use <code>Ltpv / Ltub</code> instead of <code>xprv / xpub</code>
</label>
</div>
</div>
</form> </form>
</div> </div>
</div> </div>
@@ -285,6 +204,12 @@
<li id="bip49-tab"> <li id="bip49-tab">
<a href="#bip49" role="tab" data-toggle="tab">BIP49</a> <a href="#bip49" role="tab" data-toggle="tab">BIP49</a>
</li> </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> </ul>
<div class="derivation-type tab-content"> <div class="derivation-type tab-content">
<div id="bip44" class="tab-pane active"> <div id="bip44" class="tab-pane active">
@@ -292,14 +217,14 @@
<br> <br>
<div class="col-sm-2"></div> <div class="col-sm-2"></div>
<div class="col-sm-10"> <div class="col-sm-10">
<p data-translate-html> <p>
For more info see the For more info see the
<a href="https://github.com/bitcoin/bips/blob/master/bip-0044.mediawiki" target="_blank">BIP44 spec</a>. <a href="https://github.com/bitcoin/bips/blob/master/bip-0044.mediawiki" target="_blank">BIP44 spec</a>.
</p> </p>
</div> </div>
<div class="form-group"> <div class="form-group">
<label for="purpose" class="col-sm-2 control-label"> <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> </label>
<div class="col-sm-10"> <div class="col-sm-10">
<input id="purpose" type="text" class="purpose form-control" value="44" readonly> <input id="purpose" type="text" class="purpose form-control" value="44" readonly>
@@ -307,7 +232,7 @@
</div> </div>
<div class="form-group"> <div class="form-group">
<label for="coin" class="col-sm-2 control-label"> <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> </label>
<div class="col-sm-10"> <div class="col-sm-10">
<input id="coin" type="text" class="coin form-control" value="0" readonly> <input id="coin" type="text" class="coin form-control" value="0" readonly>
@@ -315,7 +240,7 @@
</div> </div>
<div class="form-group"> <div class="form-group">
<label for="account" class="col-sm-2 control-label"> <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> </label>
<div class="col-sm-10"> <div class="col-sm-10">
<input id="account" type="text" class="account form-control" value="0"> <input id="account" type="text" class="account form-control" value="0">
@@ -323,7 +248,7 @@
</div> </div>
<div class="form-group"> <div class="form-group">
<label for="change" class="col-sm-2 control-label"> <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> </label>
<div class="col-sm-10"> <div class="col-sm-10">
<input id="change" type="text" class="change form-control" value="0"> <input id="change" type="text" class="change form-control" value="0">
@@ -333,12 +258,12 @@
<label class="col-sm-2 control-label"> <label class="col-sm-2 control-label">
</label> </label>
<div class="col-sm-10"> <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> </div>
<div class="form-group"> <div class="form-group">
<label for="account-xprv" class="col-sm-2 control-label"> <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> </label>
<div class="col-sm-10"> <div class="col-sm-10">
<textarea id="account-xprv" type="text" class="account-xprv form-control" readonly data-show-qr></textarea> <textarea id="account-xprv" type="text" class="account-xprv form-control" readonly data-show-qr></textarea>
@@ -346,7 +271,7 @@
</div> </div>
<div class="form-group"> <div class="form-group">
<label for="account-xpub" class="col-sm-2 control-label"> <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> </label>
<div class="col-sm-10"> <div class="col-sm-10">
<textarea id="account-xpub" type="text" class="account-xpub form-control" readonly data-show-qr></textarea> <textarea id="account-xpub" type="text" class="account-xpub form-control" readonly data-show-qr></textarea>
@@ -356,11 +281,11 @@
<label class="col-sm-2 control-label"> <label class="col-sm-2 control-label">
</label> </label>
<div class="col-sm-10"> <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> </div>
<div class="form-group"> <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"> <div class="col-sm-10">
<input id="bip44-path" type="text" class="path form-control" value="m/44'/0'/0'/0" readonly="readonly"> <input id="bip44-path" type="text" class="path form-control" value="m/44'/0'/0'/0" readonly="readonly">
</div> </div>
@@ -372,13 +297,13 @@
<br> <br>
<div class="col-sm-2"></div> <div class="col-sm-2"></div>
<div class="col-sm-10"> <div class="col-sm-10">
<p data-translate> <p>
For more info see the For more info see the
<a href="https://github.com/bitcoin/bips/blob/master/bip-0032.mediawiki" target="_blank">BIP32 spec</a> <a href="https://github.com/bitcoin/bips/blob/master/bip-0032.mediawiki" target="_blank">BIP32 spec</a>
</p> </p>
</div> </div>
<div class="form-group"> <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"> <div class="col-sm-10">
<select id="bip32-client" class="client form-control"> <select id="bip32-client" class="client form-control">
<option value="custom">Custom derivation path</option> <option value="custom">Custom derivation path</option>
@@ -387,7 +312,7 @@
</div> </div>
</div> </div>
<div class="form-group"> <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"> <div class="col-sm-10">
<input id="bip32-path" type="text" class="path form-control" value="m/0"> <input id="bip32-path" type="text" class="path form-control" value="m/0">
</div> </div>
@@ -396,42 +321,42 @@
<div class="col-sm-2"></div> <div class="col-sm-2"></div>
<label class="col-sm-10"> <label class="col-sm-10">
<input class="hardened-addresses" type="checkbox"> <input class="hardened-addresses" type="checkbox">
<span data-translate>Use hardened addresses</span> <span>Use hardened addresses</span>
</label> </label>
</div> </div>
<div class="form-group"> <div class="form-group">
<label for="core-path" class="col-sm-2 control-label" data-translate>Bitcoin Core</label> <label for="core-path" class="col-sm-2 control-label">Bitcoin Core</label>
<div class="col-sm-10"> <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. Use path <code>m/0'/0'</code> with hardened addresses.
</p> </p>
<p class="form-control no-border" data-translate-html> <p class="form-control no-border">
For more info see the For more info see the
<a href="https://github.com/bitcoin/bitcoin/pull/8035" target="_blank">Bitcoin Core BIP32 implementation</a> <a href="https://github.com/bitcoin/bitcoin/pull/8035" target="_blank">Bitcoin Core BIP32 implementation</a>
</p> </p>
</div> </div>
</div> </div>
<div class="form-group"> <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"> <div class="col-sm-10">
<p class="form-control no-border"> <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>
<p class="form-control no-border"> <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> <a href="https://multibit.org/" target="_blank">MultiBit HD</a>
</p> </p>
</div> </div>
</div> </div>
<div class="form-group"> <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"> <div class="col-sm-10">
<p class="form-control no-border"> <p class="form-control no-border">
<span data-translate-html>Use path <code>m/44'/0'/0'</code>.</span> <span>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>Only enter the <code>xpub</code> extended key into block explorer search fields, never the <code>xprv</code> key.</span>
</p> </p>
<p class="form-control no-border"> <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> <a href="https://blockchain.info/" target="_blank">blockchain.info</a>
</p> </p>
</div> </div>
@@ -445,21 +370,21 @@
<div class="form-group"> <div class="form-group">
<div class="col-sm-2"></div> <div class="col-sm-2"></div>
<div class="col-sm-10"> <div class="col-sm-10">
<p data-translate>BIP49 is unavailable for this coin.</p> <p>BIP49 is unavailable for this coin.</p>
</div> </div>
</div> </div>
</div> </div>
<div class="available"> <div class="available">
<div class="col-sm-2"></div> <div class="col-sm-2"></div>
<div class="col-sm-10"> <div class="col-sm-10">
<p data-translate-html> <p>
For more info see the For more info see the
<a href="https://github.com/bitcoin/bips/blob/master/bip-0049.mediawiki" target="_blank">BIP49 spec</a>. <a href="https://github.com/bitcoin/bips/blob/master/bip-0049.mediawiki" target="_blank">BIP49 spec</a>.
</p> </p>
</div> </div>
<div class="form-group"> <div class="form-group">
<label for="purpose" class="col-sm-2 control-label"> <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> </label>
<div class="col-sm-10"> <div class="col-sm-10">
<input id="purpose" type="text" class="purpose form-control" value="49" readonly> <input id="purpose" type="text" class="purpose form-control" value="49" readonly>
@@ -467,7 +392,7 @@
</div> </div>
<div class="form-group"> <div class="form-group">
<label for="coin" class="col-sm-2 control-label"> <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> </label>
<div class="col-sm-10"> <div class="col-sm-10">
<input id="coin" type="text" class="coin form-control" value="0" readonly> <input id="coin" type="text" class="coin form-control" value="0" readonly>
@@ -475,7 +400,7 @@
</div> </div>
<div class="form-group"> <div class="form-group">
<label for="account" class="col-sm-2 control-label"> <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> </label>
<div class="col-sm-10"> <div class="col-sm-10">
<input id="account" type="text" class="account form-control" value="0"> <input id="account" type="text" class="account form-control" value="0">
@@ -483,7 +408,7 @@
</div> </div>
<div class="form-group"> <div class="form-group">
<label for="change" class="col-sm-2 control-label"> <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> </label>
<div class="col-sm-10"> <div class="col-sm-10">
<input id="change" type="text" class="change form-control" value="0"> <input id="change" type="text" class="change form-control" value="0">
@@ -493,12 +418,12 @@
<label class="col-sm-2 control-label"> <label class="col-sm-2 control-label">
</label> </label>
<div class="col-sm-10"> <div class="col-sm-10">
<p data-translate>The account extended keys can be used for importing to most BIP49 compatible wallets.</p> <p>The account extended keys can be used for importing to most BIP49 compatible wallets.</p>
</div> </div>
</div> </div>
<div class="form-group"> <div class="form-group">
<label for="account-xprv" class="col-sm-2 control-label"> <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> </label>
<div class="col-sm-10"> <div class="col-sm-10">
<textarea id="account-xprv" type="text" class="account-xprv form-control" readonly data-show-qr></textarea> <textarea id="account-xprv" type="text" class="account-xprv form-control" readonly data-show-qr></textarea>
@@ -506,7 +431,7 @@
</div> </div>
<div class="form-group"> <div class="form-group">
<label for="account-xpub" class="col-sm-2 control-label"> <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> </label>
<div class="col-sm-10"> <div class="col-sm-10">
<textarea id="account-xpub" type="text" class="account-xpub form-control" readonly data-show-qr></textarea> <textarea id="account-xpub" type="text" class="account-xpub form-control" readonly data-show-qr></textarea>
@@ -516,11 +441,11 @@
<label class="col-sm-2 control-label"> <label class="col-sm-2 control-label">
</label> </label>
<div class="col-sm-10"> <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> </div>
<div class="form-group"> <div class="form-group">
<label for="bip49-path" class="col-sm-2 control-label" data-translate>BIP32 Derivation Path</label> <label for="bip49-path" class="col-sm-2 control-label">BIP32 Derivation Path</label>
<div class="col-sm-10"> <div class="col-sm-10">
<input id="bip49-path" type="text" class="path form-control" value="m/49'/0'/0'/0" readonly="readonly"> <input id="bip49-path" type="text" class="path form-control" value="m/49'/0'/0'/0" readonly="readonly">
</div> </div>
@@ -528,16 +453,133 @@
</div> </div>
</form> </form>
</div> </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> </div>
<form class="form-horizontal" role="form"> <form class="form-horizontal" role="form">
<div class="form-group"> <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"> <div class="col-sm-10">
<textarea id="extended-priv-key" class="extended-priv-key form-control" readonly="readonly" data-show-qr></textarea> <textarea id="extended-priv-key" class="extended-priv-key form-control" readonly="readonly" data-show-qr></textarea>
</div> </div>
</div> </div>
<div class="form-group"> <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"> <div class="col-sm-10">
<textarea id="extended-pub-key" class="extended-pub-key form-control" readonly="readonly" data-show-qr></textarea> <textarea id="extended-pub-key" class="extended-pub-key form-control" readonly="readonly" data-show-qr></textarea>
</div> </div>
@@ -551,31 +593,61 @@
<div class="row"> <div class="row">
<div class="col-md-12"> <div class="col-md-12">
<h2>Derived Addresses</h2> <h2>Derived Addresses</h2>
<p data-translate>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">
<label>
<input type="checkbox" class="use-bitpay-addresses">
<span>Use BitPay-style addresses for Bitcoin Cash (ie starting with 'C' instead of '1')</span>
</label>
</div>
</div>
<div class="col-md-12">
<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"> <table class="table table-striped">
<thead> <thead>
<th> <th>
<div class="input-group"> <div class="input-group">
<span data-translate>Path</span>&nbsp;&nbsp; <span>Path</span>&nbsp;&nbsp;
<button class="index-toggle" data-translate>Toggle</button> <button class="index-toggle">Toggle</button>
</div> </div>
</th> </th>
<th> <th>
<div class="input-group"> <div class="input-group">
<span data-translate>Address</span>&nbsp;&nbsp; <span>Address</span>&nbsp;&nbsp;
<button class="address-toggle" data-translate>Toggle</button> <button class="address-toggle">Toggle</button>
</div> </div>
</th> </th>
<th> <th>
<div class="input-group"> <div class="input-group">
<span data-translate>Public Key</span>&nbsp;&nbsp; <span>Public Key</span>&nbsp;&nbsp;
<button class="public-key-toggle" data-translate>Toggle</button> <button class="public-key-toggle">Toggle</button>
</div> </div>
</th> </th>
<th> <th>
<div class="input-group"> <div class="input-group">
<span data-translate>Private Key</span>&nbsp;&nbsp; <span>Private Key</span>&nbsp;&nbsp;
<button class="private-key-toggle" data-translate>Toggle</button> <button class="private-key-toggle">Toggle</button>
</div> </div>
</th> </th>
</thead> </thead>
@@ -589,81 +661,111 @@
</table> </table>
</div> </div>
</div> </div>
<span data-translate>Show more rows</span>: <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>
<input type="number" class="rows-to-add" value="20"> <input type="number" class="rows-to-add" value="20">
<button class="more" data-translate>Show</button> <button class="more">more rows</button>
<span>starting from index</span>
<input type="number" class="more-rows-start-index">
<span>(leave blank to generate from next index)</span>
<hr> <hr>
<div class="row"> <div class="row">
<div class="col-md-12"> <div class="col-md-12">
<h2 data-translate>More info</h2> <h2>More info</h2>
<h3>BIP39 <span class="small" data-translate>Mnemonic code for generating deterministic keys</span></h3> <h3>BIP39 <span class="small">Mnemonic code for generating deterministic keys</span></h3>
<p data-translate-html> <p>
Read more at the Read more at the
<a href="https://github.com/bitcoin/bips/blob/master/bip-0039.mediawiki">official BIP39 spec</a> <a href="https://github.com/bitcoin/bips/blob/master/bip-0039.mediawiki">official BIP39 spec</a>
</p> </p>
<h3>BIP32 <span class="small" data-translate>Hierarchical Deterministic Wallets</span></h3> <h3>BIP32 <span class="small">Hierarchical Deterministic Wallets</span></h3>
<p data-translate-html> <p>
Read more at the Read more at the
<a href="https://github.com/bitcoin/bips/blob/master/bip-0032.mediawiki" target="_blank">official BIP32 spec</a> <a href="https://github.com/bitcoin/bips/blob/master/bip-0032.mediawiki" target="_blank">official BIP32 spec</a>
</p> </p>
<p data-translate-html> <p>
See the demo at See the demo at
<a href="http://bip32.org/" target="_blank">bip32.org</a> <a href="http://bip32.org/" target="_blank">bip32.org</a>
</p> </p>
<h3>BIP44 <span class="small" data-translate>Multi-Account Hierarchy for Deterministic Wallets</span></h3> <h3>BIP44 <span class="small">Multi-Account Hierarchy for Deterministic Wallets</span></h3>
<p data-translate-html> <p>
Read more at the Read more at the
<a href="https://github.com/bitcoin/bips/blob/master/bip-0044.mediawiki" target="_blank">official BIP44 spec</a> <a href="https://github.com/bitcoin/bips/blob/master/bip-0044.mediawiki" target="_blank">official BIP44 spec</a>
</p> </p>
<h3 data-translate>Private Keys</h3> <h3>BIP49 <span class="small">Derivation scheme for P2WPKH-nested-in-P2SH based accounts</span></h3>
<p> <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 Use private keys at
<a href="https://web.archive.org/web/20150707020924/https://brainwallet.org/" target="_blank">brainwallet.org</a>. <a href="https://web.archive.org/web/20150707020924/https://brainwallet.org/" target="_blank">brainwallet.org</a>.
</span> </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> </p>
<h3 id="entropy-notes" data-translate>Entropy</h3> <h3 id="entropy-notes">Entropy</h3>
<p> <p>
<span data-translate-html> <span>
Entropy values must be sourced from 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>. <a href="https://en.wikipedia.org/wiki/Random_number_generation" target="_blank">strong source of randomness</a>.
</span> </span>
<span data-translate>This means flipping a fair coin, rolling a fair dice, noise measurements etc.</span> <span>This means flipping a fair coin, rolling a fair dice, noise measurements etc.</span>
<span data-translate-html> <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 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. random enough for the needs of this tool.
</span> </span>
</p> </p>
<p> <p>
<strong><span data-translate>Do not store entropy.</span></strong> <strong><span>Do not store entropy.</span></strong>
</p> </p>
<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>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>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><a href="https://en.wikipedia.org/wiki/Steganography#Physical" target="_blank">Steganography</a> may be beneficial when storing the mnemonic.</span>
</p> </p>
<p> <p>
<span data-translate-html> <span>
The random mnemonic generator on this page uses 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>. <a href="https://developer.mozilla.org/en-US/docs/Web/API/RandomSource/getRandomValues" target="_blank">cryptographically secure random number generator</a>.
</span> </span>
<span data-translate>The built in random generator can generally be trusted more than your own intuition about randomness.</span> <span>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>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>In that case you might choose to use your own source of entropy.</span>
</p> </p>
<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> </p>
<h3 data-translate>License</h3> <h3>License</h3>
<p> <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> </span>
</p> </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>
</div> </div>
@@ -672,21 +774,21 @@
<div class="row"> <div class="row">
<div class="col-md-12"> <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. You can use this tool without having to be online.
</p> </p>
<p data-translate> <p>
In your browser, select file save-as, and save this page In your browser, select file save-as, and save this page
as a file. as a file.
</p> </p>
<p data-translate> <p>
Double-click that file to open it in a browser Double-click that file to open it in a browser
on any offline computer. on any offline computer.
</p> </p>
<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> <a href="https://github.com/iancoleman/bip39">https://github.com/iancoleman/bip39</a>
</p> </p>
@@ -699,17 +801,17 @@
<div class="row"> <div class="row">
<div class="col-md-12"> <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> <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"> <a href="https://github.com/iancoleman/bip39" target="_blank">
https://github.com/iancoleman/bip39 https://github.com/iancoleman/bip39
</a> </a>
</p> </p>
<h3 data-translate>Libraries</h3> <h3>Libraries</h3>
<p> <p>
<span>BitcoinJS - </span> <span>BitcoinJS - </span>
@@ -752,11 +854,11 @@
</div> </div>
<div class="qr-container hidden"> <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 hidden">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">Click field to show QR</div>
<div class="qr-hider hidden"> <div class="qr-hider hidden">
<div class="qr-image"></div> <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>
</div> </div>
@@ -775,17 +877,17 @@
<script src="js/polyfill.es6.js"></script> <script src="js/polyfill.es6.js"></script>
<script src="js/basex.js"></script> <script src="js/basex.js"></script>
<script src="js/unorm.js"></script> <script src="js/unorm.js"></script>
<script src="js/jquery.min.js"></script> <script src="js/jquery-3.2.1.js"></script>
<script src="js/bootstrap.min.js"></script> <script src="js/bootstrap-3.3.7.js"></script>
<script src="js/levenshtein.js"></script> <script src="js/levenshtein.js"></script>
<script src="js/jquery.qrcode.min.js"></script> <script src="js/kjua-0.1.1.min.js"></script>
<script src="js/bitcoinjs-3-1-1.js"></script> <script src="js/bitcoinjs-3.3.0.js"></script>
<script src="js/bitcoinjs-extensions.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/ethereumjs-util.js"></script>
<script src="js/ripple-util.js"></script> <script src="js/ripple-util.js"></script>
<script src="js/sjcl-bip39.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_english.js"></script>
<script src="js/wordlist_japanese.js"></script> <script src="js/wordlist_japanese.js"></script>
<script src="js/wordlist_spanish.js"></script> <script src="js/wordlist_spanish.js"></script>
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
+151 -40
View File
@@ -1,122 +1,144 @@
bitcoinjs.bitcoin.networks.shadow = { bitcoinjs.bitcoin.networks.shadow = {
messagePrefix: "unused", messagePrefix: 'unused',
bip32: { bip32: {
public: 0xEE80286A, public: 0xEE80286A,
private: 0xEE8031E8 private: 0xEE8031E8
}, },
pubKeyHash: 0x3f, pubKeyHash: 0x3f,
scriptHash: 0x7d, scriptHash: 0x7d,
wif: 0xbf, wif: 0xbf
}; };
bitcoinjs.bitcoin.networks.shadowtn = { bitcoinjs.bitcoin.networks.shadowtn = {
messagePrefix: "unused", messagePrefix: 'unused',
bip32: { bip32: {
public: 0x76C0FDFB, public: 0x76C0FDFB,
private: 0x76C1077A private: 0x76C1077A
}, },
pubKeyHash: 0x7f, pubKeyHash: 0x7f,
scriptHash: 0xc4, scriptHash: 0xc4,
wif: 0xff, wif: 0xff
}; };
bitcoinjs.bitcoin.networks.clam = { bitcoinjs.bitcoin.networks.clam = {
messagePrefix: "unused", messagePrefix: 'unused',
bip32: { bip32: {
public: 0xa8c26d64, public: 0xa8c26d64,
private: 0xa8c17826 private: 0xa8c17826
}, },
pubKeyHash: 0x89, pubKeyHash: 0x89,
scriptHash: 0x00, // TODO set this correctly scriptHash: 0x00, // TODO set this correctly
wif: 0x85, wif: 0x85
}; };
bitcoinjs.bitcoin.networks.crown = { bitcoinjs.bitcoin.networks.crown = {
messagePrefix: "unused", messagePrefix: 'unused',
bip32: { bip32: {
public: 0x0488b21e, public: 0x0488b21e,
private: 0x0488ade4 private: 0x0488ade4
}, },
pubKeyHash: 0x00, pubKeyHash: 0x00,
scriptHash: 0x05, scriptHash: 0x05,
wif: 0x80, wif: 0x80
}; };
bitcoinjs.bitcoin.networks.dash = { bitcoinjs.bitcoin.networks.dash = {
messagePrefix: "unused", messagePrefix: 'unused',
bip32: { bip32: {
public: 0x0488b21e, public: 0x0488b21e,
private: 0x0488ade4 private: 0x0488ade4
}, },
pubKeyHash: 0x4c, pubKeyHash: 0x4c,
scriptHash: 0x10, scriptHash: 0x10,
wif: 0xcc, wif: 0xcc
};
bitcoinjs.bitcoin.networks.maza = {
messagePrefix: 'unused',
bip32: {
public: 0x0488b21e,
private: 0x0488ade4
},
pubKeyHash: 0x32,
scriptHash: 0x09,
wif: 0xe0
}; };
bitcoinjs.bitcoin.networks.dashtn = { bitcoinjs.bitcoin.networks.dashtn = {
messagePrefix: "unused", messagePrefix: 'unused',
bip32: { bip32: {
public: 0x043587cf, public: 0x043587cf,
private: 0x04358394 private: 0x04358394
}, },
pubKeyHash: 0x8c, pubKeyHash: 0x8c,
scriptHash: 0x13, scriptHash: 0x13,
wif: 0xef, wif: 0xef
}; };
bitcoinjs.bitcoin.networks.game = { bitcoinjs.bitcoin.networks.game = {
messagePrefix: "unused", messagePrefix: 'unused',
bip32: { bip32: {
public: 0x0488b21e, public: 0x0488b21e,
private: 0x0488ade4 private: 0x0488ade4
}, },
pubKeyHash: 0x26, pubKeyHash: 0x26,
scriptHash: 0x05, scriptHash: 0x05,
wif: 0xa6, wif: 0xa6
}; };
bitcoinjs.bitcoin.networks.namecoin = { bitcoinjs.bitcoin.networks.namecoin = {
messagePrefix: "unused", messagePrefix: 'unused',
bip32: { bip32: {
public: 0x0488b21e, public: 0x0488b21e,
private: 0x0488ade4 private: 0x0488ade4
}, },
pubKeyHash: 0x34, pubKeyHash: 0x34,
scriptHash: 0x00, // TODO set this correctly scriptHash: 0x00, // TODO set this correctly
wif: 0x80, wif: 0x80
}; };
bitcoinjs.bitcoin.networks.peercoin = { bitcoinjs.bitcoin.networks.peercoin = {
messagePrefix: "unused", messagePrefix: 'unused',
bip32: { bip32: {
public: 0x0488b21e, public: 0x0488b21e,
private: 0x0488ade4 private: 0x0488ade4
}, },
pubKeyHash: 0x37, pubKeyHash: 0x37,
scriptHash: 0x00, // TODO set this correctly scriptHash: 0x00, // TODO set this correctly
wif: 0xb7, 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 = { bitcoinjs.bitcoin.networks.slimcoin = {
messagePrefix: "unused", messagePrefix: 'unused',
bip32: { bip32: {
public: 0xef6adf10, public: 0xef6adf10,
private: 0xef69ea80 private: 0xef69ea80
}, },
pubKeyHash: 0x3f, pubKeyHash: 0x3f,
scriptHash: 0x7d, scriptHash: 0x7d,
wif: 0x46, wif: 0x46
}; };
bitcoinjs.bitcoin.networks.slimcointn = { bitcoinjs.bitcoin.networks.slimcointn = {
messagePrefix: "unused", messagePrefix: 'unused',
bip32: { bip32: {
public: 0x043587CF, public: 0x043587CF,
private: 0x04358394 private: 0x04358394
}, },
pubKeyHash: 0x6f, pubKeyHash: 0x6f,
scriptHash: 0xc4, scriptHash: 0xc4,
wif: 0x57, wif: 0x57
}; };
bitcoinjs.bitcoin.networks.dogecoin = { bitcoinjs.bitcoin.networks.dogecoin = {
@@ -127,8 +149,8 @@ bitcoinjs.bitcoin.networks.dogecoin = {
}, },
pubKeyHash: 0x1e, pubKeyHash: 0x1e,
scriptHash: 0x16, scriptHash: 0x16,
wif: 0x9e, wif: 0x9e
}, };
bitcoinjs.bitcoin.networks.viacoin = { bitcoinjs.bitcoin.networks.viacoin = {
messagePrefix: '\x18Viacoin Signed Message:\n', messagePrefix: '\x18Viacoin Signed Message:\n',
@@ -138,8 +160,8 @@ bitcoinjs.bitcoin.networks.viacoin = {
}, },
pubKeyHash: 0x47, pubKeyHash: 0x47,
scriptHash: 0x21, scriptHash: 0x21,
wif: 0xc7, wif: 0xc7
}, };
bitcoinjs.bitcoin.networks.viacointestnet = { bitcoinjs.bitcoin.networks.viacointestnet = {
messagePrefix: '\x18Viacoin Signed Message:\n', messagePrefix: '\x18Viacoin Signed Message:\n',
@@ -149,8 +171,8 @@ bitcoinjs.bitcoin.networks.viacointestnet = {
}, },
pubKeyHash: 0x7f, pubKeyHash: 0x7f,
scriptHash: 0xc4, scriptHash: 0xc4,
wif: 0xff, wif: 0xff
}, };
bitcoinjs.bitcoin.networks.gamerscoin = { bitcoinjs.bitcoin.networks.gamerscoin = {
messagePrefix: '\x19Gamerscoin Signed Message:\n', messagePrefix: '\x19Gamerscoin Signed Message:\n',
@@ -160,8 +182,8 @@ bitcoinjs.bitcoin.networks.gamerscoin = {
}, },
pubKeyHash: 0x26, pubKeyHash: 0x26,
scriptHash: 0x05, scriptHash: 0x05,
wif: 0xA6, wif: 0xA6
}, };
bitcoinjs.bitcoin.networks.jumbucks = { bitcoinjs.bitcoin.networks.jumbucks = {
messagePrefix: '\x19Jumbucks Signed Message:\n', messagePrefix: '\x19Jumbucks Signed Message:\n',
@@ -171,8 +193,8 @@ bitcoinjs.bitcoin.networks.jumbucks = {
}, },
pubKeyHash: 0x2b, pubKeyHash: 0x2b,
scriptHash: 0x05, scriptHash: 0x05,
wif: 0xab, wif: 0xab
}, };
bitcoinjs.bitcoin.networks.zetacoin = { bitcoinjs.bitcoin.networks.zetacoin = {
messagePrefix: '\x18Zetacoin Signed Message:\n', messagePrefix: '\x18Zetacoin Signed Message:\n',
@@ -182,38 +204,127 @@ bitcoinjs.bitcoin.networks.zetacoin = {
}, },
pubKeyHash: 0x50, pubKeyHash: 0x50,
scriptHash: 0x09, scriptHash: 0x09,
wif: 0xe0, wif: 0xe0
} };
bitcoinjs.bitcoin.networks.myriadcoin = { bitcoinjs.bitcoin.networks.myriadcoin = {
messagePrefix: "unused", messagePrefix: 'unused',
bip32: { bip32: {
public: 0x0488b21e, public: 0x0488b21e,
private: 0x0488ade4 private: 0x0488ade4
}, },
pubKeyHash: 0x32, pubKeyHash: 0x32,
scriptHash: 0x00, // TODO set this correctly scriptHash: 0x00, // TODO set this correctly
wif: 0xb2, wif: 0xb2
};
bitcoinjs.bitcoin.networks.onixcoin = {
messagePrefix: 'unused',
bip32: {
public: 0x049d7cb2,
private: 0x049d7878
},
pubKeyHash: 0x4B,
scriptHash: 0x05,
wif: 0x80
}; };
bitcoinjs.bitcoin.networks.pivx = { bitcoinjs.bitcoin.networks.pivx = {
messagePrefix: "unused", messagePrefix: 'unused',
bip32: { bip32: {
public: 0x022d2533, public: 0x022d2533,
private: 0x0221312b private: 0x0221312b
}, },
pubKeyHash: 0x1e, pubKeyHash: 0x1e,
scriptHash: 0x0d, scriptHash: 0x0d,
wif: 0xd4, wif: 0xd4
}; };
bitcoinjs.bitcoin.networks.pivxtestnet = { bitcoinjs.bitcoin.networks.pivxtestnet = {
messagePrefix: "unused", messagePrefix: 'unused',
bip32: { bip32: {
public: 0x3a8061a0, public: 0x3a8061a0,
private: 0x3a805837 private: 0x3a805837
}, },
pubKeyHash: 0x8b, pubKeyHash: 0x8b,
scriptHash: 0x13, scriptHash: 0x13,
wif: 0xef, wif: 0xef
};
bitcoinjs.bitcoin.networks.fujicoin = {
messagePrefix: '\x19FujiCoin Signed Message:\n',
bip32: {
public: 0x0488b21e,
private: 0x0488ade4
},
pubKeyHash: 0x24,
scriptHash: 0x10,
wif: 0xa4
};
bitcoinjs.bitcoin.networks.nubits = {
messagePrefix: '\x18Nu Signed Message:\n',
bip32: {
public: 0x0488b21e,
private: 0x0488ade4
},
pubKeyHash: 0x19,
scriptHash: 0x1a,
wif: 0x96,
};
bitcoinjs.bitcoin.networks.bgold = {
messagePrefix: 'unused',
bip32: {
public: 0x0488b21e,
private: 0x0488ade4
},
pubKeyHash: 38,
scriptHash: 23,
wif: 128
};
bitcoinjs.bitcoin.networks.bitcoinCashBitbpay = {
messagePrefix: '\x18Bitcoin Signed Message:\n',
bip32: {
public: 0x0488b21e,
private: 0x0488ade4
},
pubKeyHash: 0x1c,
scriptHash: 0x28,
wif: 0x80
};
bitcoinjs.bitcoin.networks.monacoin = {
messagePrefix: '\x18Monacoin Signed Message:\n',
bip32: {
public: 0x0488b21e,
private: 0x0488ade4
},
pubKeyHash: 0x32,
scriptHash: 0x37,
wif: 0xb0
};
bitcoinjs.bitcoin.networks.litecoinXprv = {
messagePrefix: '\x19Litecoin Signed Message:\n',
bip32: {
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
View File
File diff suppressed because it is too large Load Diff
-6
View File
File diff suppressed because one or more lines are too long
+429 -57
View File
@@ -14,6 +14,7 @@
var showPubKey = true; var showPubKey = true;
var showPrivKey = true; var showPrivKey = true;
var showQr = false; var showQr = false;
var litecoinUseLtub = true;
var entropyChangeTimeoutEvent = null; var entropyChangeTimeoutEvent = null;
var phraseChangeTimeoutEvent = null; var phraseChangeTimeoutEvent = null;
@@ -36,18 +37,24 @@
DOM.entropyBitsPerEvent = DOM.entropyContainer.find(".bits-per-event"); DOM.entropyBitsPerEvent = DOM.entropyContainer.find(".bits-per-event");
DOM.entropyWordCount = DOM.entropyContainer.find(".word-count"); DOM.entropyWordCount = DOM.entropyContainer.find(".word-count");
DOM.entropyBinary = DOM.entropyContainer.find(".binary"); DOM.entropyBinary = DOM.entropyContainer.find(".binary");
DOM.entropyWordIndexes = DOM.entropyContainer.find(".word-indexes");
DOM.entropyMnemonicLength = DOM.entropyContainer.find(".mnemonic-length"); DOM.entropyMnemonicLength = DOM.entropyContainer.find(".mnemonic-length");
DOM.entropyFilterWarning = DOM.entropyContainer.find(".filter-warning");
DOM.phrase = $(".phrase"); DOM.phrase = $(".phrase");
DOM.passphrase = $(".passphrase"); DOM.passphrase = $(".passphrase");
DOM.generateContainer = $(".generate-container"); DOM.generateContainer = $(".generate-container");
DOM.generate = $(".generate"); DOM.generate = $(".generate");
DOM.seed = $(".seed"); DOM.seed = $(".seed");
DOM.rootKey = $(".root-key"); DOM.rootKey = $(".root-key");
DOM.litecoinLtubContainer = $(".litecoin-ltub-container");
DOM.litecoinUseLtub = $(".litecoin-use-ltub");
DOM.extendedPrivKey = $(".extended-priv-key"); DOM.extendedPrivKey = $(".extended-priv-key");
DOM.extendedPubKey = $(".extended-pub-key"); DOM.extendedPubKey = $(".extended-pub-key");
DOM.bip32tab = $("#bip32-tab"); DOM.bip32tab = $("#bip32-tab");
DOM.bip44tab = $("#bip44-tab"); DOM.bip44tab = $("#bip44-tab");
DOM.bip49tab = $("#bip49-tab"); DOM.bip49tab = $("#bip49-tab");
DOM.bip84tab = $("#bip84-tab");
DOM.bip141tab = $("#bip141-tab");
DOM.bip32panel = $("#bip32"); DOM.bip32panel = $("#bip32");
DOM.bip44panel = $("#bip44"); DOM.bip44panel = $("#bip44");
DOM.bip49panel = $("#bip49"); DOM.bip49panel = $("#bip49");
@@ -68,11 +75,29 @@
DOM.bip49accountXprv = $("#bip49 .account-xprv"); DOM.bip49accountXprv = $("#bip49 .account-xprv");
DOM.bip49accountXpub = $("#bip49 .account-xpub"); DOM.bip49accountXpub = $("#bip49 .account-xpub");
DOM.bip49change = $("#bip49 .change"); 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.generatedStrength = $(".generate-container .strength");
DOM.hardenedAddresses = $(".hardened-addresses"); DOM.hardenedAddresses = $(".hardened-addresses");
DOM.useBitpayAddressesContainer = $(".use-bitpay-addresses-container");
DOM.useBitpayAddresses = $(".use-bitpay-addresses");
DOM.useBip38 = $(".use-bip38");
DOM.bip38Password = $(".bip38-password");
DOM.addresses = $(".addresses"); DOM.addresses = $(".addresses");
DOM.csvTab = $("#csv-tab a");
DOM.csv = $(".csv");
DOM.rowsToAdd = $(".rows-to-add"); DOM.rowsToAdd = $(".rows-to-add");
DOM.more = $(".more"); DOM.more = $(".more");
DOM.moreRowsStartIndex = $(".more-rows-start-index");
DOM.feedback = $(".feedback"); DOM.feedback = $(".feedback");
DOM.tab = $(".derivation-type a"); DOM.tab = $(".derivation-type a");
DOM.indexToggle = $(".index-toggle"); DOM.indexToggle = $(".index-toggle");
@@ -98,18 +123,27 @@
DOM.generate.on("click", generateClicked); DOM.generate.on("click", generateClicked);
DOM.more.on("click", showMore); DOM.more.on("click", showMore);
DOM.rootKey.on("input", delayedRootKeyChanged); DOM.rootKey.on("input", delayedRootKeyChanged);
DOM.litecoinUseLtub.on("change", litecoinUseLtubChanged);
DOM.bip32path.on("input", calcForDerivationPath); DOM.bip32path.on("input", calcForDerivationPath);
DOM.bip44account.on("input", calcForDerivationPath); DOM.bip44account.on("input", calcForDerivationPath);
DOM.bip44change.on("input", calcForDerivationPath); DOM.bip44change.on("input", calcForDerivationPath);
DOM.bip49account.on("input", calcForDerivationPath); DOM.bip49account.on("input", calcForDerivationPath);
DOM.bip49change.on("input", calcForDerivationPath); DOM.bip49change.on("input", calcForDerivationPath);
DOM.tab.on("shown.bs.tab", 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.hardenedAddresses.on("change", calcForDerivationPath);
DOM.useBip38.on("change", calcForDerivationPath);
DOM.bip38Password.on("change", calcForDerivationPath);
DOM.indexToggle.on("click", toggleIndexes); DOM.indexToggle.on("click", toggleIndexes);
DOM.addressToggle.on("click", toggleAddresses); DOM.addressToggle.on("click", toggleAddresses);
DOM.publicKeyToggle.on("click", togglePublicKeys); DOM.publicKeyToggle.on("click", togglePublicKeys);
DOM.privateKeyToggle.on("click", togglePrivateKeys); DOM.privateKeyToggle.on("click", togglePrivateKeys);
DOM.csvTab.on("click", updateCsv);
DOM.languages.on("click", languageChanged); DOM.languages.on("click", languageChanged);
DOM.useBitpayAddresses.on("change", useBitpayAddressesChange);
setQrEvents(DOM.showQrEls); setQrEvents(DOM.showQrEls);
disableForms(); disableForms();
hidePending(); hidePending();
@@ -123,14 +157,17 @@
function networkChanged(e) { function networkChanged(e) {
clearDerivedKeys(); clearDerivedKeys();
clearAddressesList(); clearAddressesList();
DOM.litecoinLtubContainer.addClass("hidden");
DOM.useBitpayAddressesContainer.addClass("hidden");
var networkIndex = e.target.value; var networkIndex = e.target.value;
var network = networks[networkIndex]; var network = networks[networkIndex];
network.onSelect(); network.onSelect();
if (network.bip49available) { if (network.segwitAvailable) {
showBip49(); adjustNetworkForSegwit();
showSegwitAvailable();
} }
else { else {
hideBip49(); showSegwitUnavailable();
} }
if (seed != null) { if (seed != null) {
phraseChanged(); phraseChanged();
@@ -200,6 +237,37 @@
var passphrase = DOM.passphrase.val(); var passphrase = DOM.passphrase.val();
calcBip32RootKeyFromSeed(phrase, passphrase); calcBip32RootKeyFromSeed(phrase, passphrase);
calcForDerivationPath(); calcForDerivationPath();
// Show the word indexes
showWordIndexes();
}
function tabChanged() {
showPending();
adjustNetworkForSegwit();
var phrase = DOM.phrase.val();
if (phrase != "") {
// Calculate and display for mnemonic
var errorText = findPhraseErrors(phrase);
if (errorText) {
showValidationError(errorText);
return;
}
// Calculate and display
var passphrase = DOM.passphrase.val();
calcBip32RootKeyFromSeed(phrase, passphrase);
}
else {
// Calculate and display for root key
var rootKeyBase58 = DOM.rootKey.val();
var errorText = validateRootKey(rootKeyBase58);
if (errorText) {
showValidationError(errorText);
return;
}
// Calculate and display
calcBip32RootKeyFromBase58(rootKeyBase58);
}
calcForDerivationPath();
} }
function delayedEntropyChanged() { function delayedEntropyChanged() {
@@ -262,7 +330,6 @@
function rootKeyChanged() { function rootKeyChanged() {
showPending(); showPending();
hideValidationError(); hideValidationError();
// Validate the root key TODO
var rootKeyBase58 = DOM.rootKey.val(); var rootKeyBase58 = DOM.rootKey.val();
var errorText = validateRootKey(rootKeyBase58); var errorText = validateRootKey(rootKeyBase58);
if (errorText) { if (errorText) {
@@ -274,12 +341,23 @@
calcForDerivationPath(); calcForDerivationPath();
} }
function litecoinUseLtubChanged() {
litecoinUseLtub = DOM.litecoinUseLtub.prop("checked");
if (litecoinUseLtub) {
network = bitcoinjs.bitcoin.networks.litecoin;
}
else {
network = bitcoinjs.bitcoin.networks.litecoinXprv;
}
phraseChanged();
}
function calcForDerivationPath() { function calcForDerivationPath() {
clearDerivedKeys(); clearDerivedKeys();
clearAddressesList(); clearAddressesList();
showPending(); showPending();
// Don't show bip49 if it's selected but network doesn't support it // Don't show segwit if it's selected but network doesn't support it
if (bip49TabSelected() && !networkHasBip49()) { if (segwitSelected() && !networkHasSegwit()) {
return; return;
} }
// Get the derivation path // Get the derivation path
@@ -293,9 +371,12 @@
if (bip44TabSelected()) { if (bip44TabSelected()) {
displayBip44Info(); displayBip44Info();
} }
if (bip49TabSelected()) { else if (bip49TabSelected()) {
displayBip49Info(); displayBip49Info();
} }
else if (bip84TabSelected()) {
displayBip84Info();
}
displayBip32Info(); displayBip32Info();
} }
@@ -329,6 +410,11 @@
}, 50); }, 50);
} }
function useBitpayAddressesChange() {
setBitcoinCashNetworkValues();
phraseChanged();
}
function toggleIndexes() { function toggleIndexes() {
showIndex = !showIndex; showIndex = !showIndex;
$("td.index span").toggleClass("invisible"); $("td.index span").toggleClass("invisible");
@@ -357,10 +443,20 @@
showValidationError(errorText); showValidationError(errorText);
return; return;
} }
// get the amount of entropy to use
var numWords = parseInt(DOM.generatedStrength.val()); var numWords = parseInt(DOM.generatedStrength.val());
var strength = numWords / 3 * 32; 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); 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; return words;
} }
@@ -444,7 +540,7 @@
function validateRootKey(rootKeyBase58) { function validateRootKey(rootKeyBase58) {
try { try {
bitcoinjs.bitcoin.HDNode.fromBase58(rootKeyBase58); bitcoinjs.bitcoin.HDNode.fromBase58(rootKeyBase58, network);
} }
catch (e) { catch (e) {
return "Invalid root key"; return "Invalid root key";
@@ -468,7 +564,7 @@
console.log("Using derivation path from BIP44 tab: " + derivationPath); console.log("Using derivation path from BIP44 tab: " + derivationPath);
return derivationPath; return derivationPath;
} }
if (bip49TabSelected()) { else if (bip49TabSelected()) {
var purpose = parseIntNoNaN(DOM.bip49purpose.val(), 49); var purpose = parseIntNoNaN(DOM.bip49purpose.val(), 49);
var coin = parseIntNoNaN(DOM.bip49coin.val(), 0); var coin = parseIntNoNaN(DOM.bip49coin.val(), 0);
var account = parseIntNoNaN(DOM.bip49account.val(), 0); var account = parseIntNoNaN(DOM.bip49account.val(), 0);
@@ -483,11 +579,31 @@
console.log("Using derivation path from BIP49 tab: " + derivationPath); console.log("Using derivation path from BIP49 tab: " + derivationPath);
return 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()) { else if (bip32TabSelected()) {
var derivationPath = DOM.bip32path.val(); var derivationPath = DOM.bip32path.val();
console.log("Using derivation path from BIP32 tab: " + derivationPath); console.log("Using derivation path from BIP32 tab: " + derivationPath);
return derivationPath; return derivationPath;
} }
else if (bip141TabSelected()) {
var derivationPath = DOM.bip141path.val();
console.log("Using derivation path from BIP141 tab: " + derivationPath);
return derivationPath;
}
else { else {
console.log("Unknown derivation path"); console.log("Unknown derivation path");
} }
@@ -532,7 +648,9 @@
return "No root key"; return "No root key";
} }
// Check no hardened derivation path when using xpub keys // Check no hardened derivation path when using xpub keys
var hardened = path.indexOf("'") > -1; var hardenedPath = path.indexOf("'") > -1;
var hardenedAddresses = bip32TabSelected() && DOM.hardenedAddresses.prop("checked");
var hardened = hardenedPath || hardenedAddresses;
var isXpubkey = bip32RootKey.isNeutered(); var isXpubkey = bip32RootKey.isNeutered();
if (hardened && isXpubkey) { if (hardened && isXpubkey) {
return "Hardened derivation path is invalid with xpub key"; return "Hardened derivation path is invalid with xpub key";
@@ -576,6 +694,24 @@
DOM.bip49accountXpub.val(accountXpub); 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() { function displayBip32Info() {
// Display the key // Display the key
DOM.seed.val(seed); DOM.seed.val(seed);
@@ -591,7 +727,8 @@
DOM.extendedPubKey.val(extendedPubKey); DOM.extendedPubKey.val(extendedPubKey);
// Display the addresses and privkeys // Display the addresses and privkeys
clearAddressesList(); clearAddressesList();
displayAddresses(0, 20); var initialAddressCount = parseInt(DOM.rowsToAdd.val());
displayAddresses(0, initialAddressCount);
} }
function displayAddresses(start, total) { function displayAddresses(start, total) {
@@ -615,13 +752,31 @@
})()); })());
} }
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) { function TableRow(index, isLast) {
var self = this; var self = this;
this.shouldGenerate = true; this.shouldGenerate = true;
var useHardenedAddresses = DOM.hardenedAddresses.prop("checked"); var useHardenedAddresses = DOM.hardenedAddresses.prop("checked");
var isBip49 = bip49TabSelected(); var useBip38 = DOM.useBip38.prop("checked");
var bip49available = networkHasBip49(); var bip38password = DOM.bip38Password.val();
var isSegwit = segwitSelected();
var segwitAvailable = networkHasSegwit();
var isP2wpkh = p2wpkhSelected();
var isP2wpkhInP2sh = p2wpkhInP2shSelected();
function init() { function init() {
calculateValues(); calculateValues();
@@ -632,6 +787,7 @@
if (!self.shouldGenerate) { if (!self.shouldGenerate) {
return; return;
} }
// derive HDkey for this row of the table
var key = "NA"; var key = "NA";
if (useHardenedAddresses) { if (useHardenedAddresses) {
key = bip32ExtendedKey.deriveHardened(index); key = bip32ExtendedKey.deriveHardened(index);
@@ -639,19 +795,36 @@
else { else {
key = bip32ExtendedKey.derive(index); key = bip32ExtendedKey.derive(index);
} }
var address = key.getAddress().toString(); // bip38 requires uncompressed keys
var privkey = "NA"; // see https://github.com/iancoleman/bip39/issues/140#issuecomment-352164035
if (!key.isNeutered()) { var keyPair = key.keyPair;
privkey = key.keyPair.toWIF(network); 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; var indexText = getDerivationPath() + "/" + index;
if (useHardenedAddresses) { if (useHardenedAddresses) {
indexText = indexText + "'"; indexText = indexText + "'";
} }
// Ethereum values are different // Ethereum values are different
if (networks[DOM.network.val()].name == "ETH - Ethereum") { if (networks[DOM.network.val()].name == "ETH - Ethereum") {
var privKeyBuffer = key.keyPair.d.toBuffer(); var privKeyBuffer = keyPair.d.toBuffer(32);
privkey = privKeyBuffer.toString('hex'); privkey = privKeyBuffer.toString('hex');
var addressBuffer = ethUtil.privateToAddress(privKeyBuffer); var addressBuffer = ethUtil.privateToAddress(privKeyBuffer);
var hexAddress = addressBuffer.toString('hex'); var hexAddress = addressBuffer.toString('hex');
@@ -665,20 +838,28 @@
privkey = convertRipplePriv(privkey); privkey = convertRipplePriv(privkey);
address = convertRippleAdrr(address); address = convertRippleAdrr(address);
} }
// BIP49 addresses are different // Segwit addresses are different
if (isBip49) { if (isSegwit) {
if (!bip49available) { if (!segwitAvailable) {
return; return;
} }
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 keyhash = bitcoinjs.bitcoin.crypto.hash160(key.getPublicKeyBuffer());
var scriptsig = bitcoinjs.bitcoin.script.witnessPubKeyHash.output.encode(keyhash); var scriptsig = bitcoinjs.bitcoin.script.witnessPubKeyHash.output.encode(keyhash);
var addressbytes = bitcoinjs.bitcoin.crypto.hash160(scriptsig); var addressbytes = bitcoinjs.bitcoin.crypto.hash160(scriptsig);
var scriptpubkey = bitcoinjs.bitcoin.script.scriptHash.output.encode(addressbytes); var scriptpubkey = bitcoinjs.bitcoin.script.scriptHash.output.encode(addressbytes);
address = bitcoinjs.bitcoin.address.fromOutputScript(scriptpubkey, network) address = bitcoinjs.bitcoin.address.fromOutputScript(scriptpubkey, network)
} }
}
addAddressToList(indexText, address, pubkey, privkey); addAddressToList(indexText, address, pubkey, privkey);
if (isLast) { if (isLast) {
hidePending(); hidePending();
updateCsv();
} }
}, 50) }, 50)
} }
@@ -688,12 +869,19 @@
} }
function showMore() { function showMore() {
var start = DOM.addresses.children().length;
var rowsToAdd = parseInt(DOM.rowsToAdd.val()); var rowsToAdd = parseInt(DOM.rowsToAdd.val());
if (isNaN(rowsToAdd)) { if (isNaN(rowsToAdd)) {
rowsToAdd = 20; rowsToAdd = 20;
DOM.rowsToAdd.val("20"); DOM.rowsToAdd.val("20");
} }
var start = parseInt(DOM.moreRowsStartIndex.val())
if (isNaN(start)) {
start = lastIndexInTable() + 1;
}
else {
var newStart = start + rowsToAdd;
DOM.moreRowsStartIndex.val(newStart);
}
if (rowsToAdd > 200) { if (rowsToAdd > 200) {
var msg = "Generating " + rowsToAdd + " rows could take a while. "; var msg = "Generating " + rowsToAdd + " rows could take a while. ";
msg += "Do you want to continue?"; msg += "Do you want to continue?";
@@ -712,6 +900,7 @@
function clearAddressesList() { function clearAddressesList() {
DOM.addresses.empty(); DOM.addresses.empty();
DOM.csv.val("");
stopGenerating(); stopGenerating();
} }
@@ -1004,6 +1193,8 @@
var phrase = mnemonic.toMnemonic(entropyArr); var phrase = mnemonic.toMnemonic(entropyArr);
// Set the mnemonic in the UI // Set the mnemonic in the UI
DOM.phrase.val(phrase); DOM.phrase.val(phrase);
// Show the word indexes
showWordIndexes();
} }
function clearEntropyFeedback() { function clearEntropyFeedback() {
@@ -1042,6 +1233,16 @@
DOM.entropyWordCount.text(wordCount); DOM.entropyWordCount.text(wordCount);
DOM.entropyBinary.text(entropy.binaryStr); DOM.entropyBinary.text(entropy.binaryStr);
DOM.entropyBitsPerEvent.text(bitsPerEvent); 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) { function getEntropyTypeStr(entropy) {
@@ -1116,8 +1317,13 @@
function createQr(e) { function createQr(e) {
var content = e.target.textContent || e.target.value; var content = e.target.textContent || e.target.value;
if (content) { if (content) {
var size = 130; var qrEl = kjua({
DOM.qrImage.qrcode({width: size, height: size, text: content}); text: content,
render: "canvas",
size: 310,
ecLevel: 'H',
});
DOM.qrImage.append(qrEl);
if (!showQr) { if (!showQr) {
DOM.qrHider.addClass("hidden"); DOM.qrHider.addClass("hidden");
} }
@@ -1147,41 +1353,150 @@
return DOM.bip32tab.hasClass("active"); return DOM.bip32tab.hasClass("active");
} }
function networkHasBip49() { function networkHasSegwit() {
return networks[DOM.network.val()].bip49available; return networks[DOM.network.val()].segwitAvailable;
} }
function bip49TabSelected() { function bip49TabSelected() {
return DOM.bip49tab.hasClass("active"); return DOM.bip49tab.hasClass("active");
} }
function bip84TabSelected() {
return DOM.bip84tab.hasClass("active");
}
function bip141TabSelected() {
return DOM.bip141tab.hasClass("active");
}
function setHdCoin(coinValue) { function setHdCoin(coinValue) {
DOM.bip44coin.val(coinValue); DOM.bip44coin.val(coinValue);
DOM.bip49coin.val(coinValue); DOM.bip49coin.val(coinValue);
DOM.bip84coin.val(coinValue);
} }
function showBip49() { function showSegwitAvailable() {
DOM.bip49unavailable.addClass("hidden"); DOM.bip49unavailable.addClass("hidden");
DOM.bip49available.removeClass("hidden"); DOM.bip49available.removeClass("hidden");
DOM.bip141unavailable.addClass("hidden");
DOM.bip141available.removeClass("hidden");
} }
function hideBip49() { function showSegwitUnavailable() {
DOM.bip49available.addClass("hidden"); DOM.bip49available.addClass("hidden");
DOM.bip49unavailable.removeClass("hidden"); DOM.bip49unavailable.removeClass("hidden");
DOM.bip141available.addClass("hidden");
DOM.bip141unavailable.removeClass("hidden");
}
function useBitpayAddresses() {
return !(DOM.useBitpayAddresses.prop("checked"));
}
function setBitcoinCashNetworkValues() {
if (useBitpayAddresses()) {
network = bitcoinjs.bitcoin.networks.bitcoin;
}
else {
network = bitcoinjs.bitcoin.networks.bitcoinCashBitbpay;
}
}
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
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];
}
// choose the right segwit params
if (p2wpkhSelected() && "p2wpkh" in network) {
network = network.p2wpkh;
}
else if (p2wpkhInP2shSelected() && "p2wpkhInP2sh" in network) {
network = network.p2wpkhInP2sh;
}
}
function lastIndexInTable() {
var pathText = DOM.addresses.find(".index").last().text();
var pathBits = pathText.split("/");
var lastBit = pathBits[pathBits.length-1];
var lastBitClean = lastBit.replace("'", "");
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 = [ var networks = [
{ {
name: "BCH - Bitcoin Cash", name: "AXE - Axe",
bip49available: false, segwitAvailable: false,
onSelect: function() { onSelect: function() {
network = bitcoinjs.bitcoin.networks.bitcoin; network = bitcoinjs.bitcoin.networks.axe;
setHdCoin(0);
},
},
{
name: "BCH - Bitcoin Cash",
segwitAvailable: false,
onSelect: function() {
DOM.useBitpayAddressesContainer.removeClass("hidden");
setBitcoinCashNetworkValues();
setHdCoin(145); setHdCoin(145);
}, },
}, },
{ {
name: "BTC - Bitcoin", name: "BTC - Bitcoin",
bip49available: true, segwitAvailable: true,
onSelect: function() { onSelect: function() {
network = bitcoinjs.bitcoin.networks.bitcoin; network = bitcoinjs.bitcoin.networks.bitcoin;
setHdCoin(0); setHdCoin(0);
@@ -1189,15 +1504,23 @@
}, },
{ {
name: "BTC - Bitcoin Testnet", name: "BTC - Bitcoin Testnet",
bip49available: true, segwitAvailable: true,
onSelect: function() { onSelect: function() {
network = bitcoinjs.bitcoin.networks.testnet; network = bitcoinjs.bitcoin.networks.testnet;
setHdCoin(1); setHdCoin(1);
}, },
}, },
{
name: "BTG - Bitcoin Gold",
segwitAvailable: true,
onSelect: function() {
network = bitcoinjs.bitcoin.networks.bgold;
setHdCoin(0);
},
},
{ {
name: "CLAM - Clams", name: "CLAM - Clams",
bip49available: false, segwitAvailable: false,
onSelect: function() { onSelect: function() {
network = bitcoinjs.bitcoin.networks.clam; network = bitcoinjs.bitcoin.networks.clam;
setHdCoin(23); setHdCoin(23);
@@ -1205,7 +1528,7 @@
}, },
{ {
name: "CRW - Crown", name: "CRW - Crown",
bip49available: false, segwitAvailable: false,
onSelect: function() { onSelect: function() {
network = bitcoinjs.bitcoin.networks.crown; network = bitcoinjs.bitcoin.networks.crown;
setHdCoin(72); setHdCoin(72);
@@ -1213,7 +1536,7 @@
}, },
{ {
name: "DASH - Dash", name: "DASH - Dash",
bip49available: false, segwitAvailable: false,
onSelect: function() { onSelect: function() {
network = bitcoinjs.bitcoin.networks.dash; network = bitcoinjs.bitcoin.networks.dash;
setHdCoin(5); setHdCoin(5);
@@ -1221,7 +1544,7 @@
}, },
{ {
name: "DASH - Dash Testnet", name: "DASH - Dash Testnet",
bip49available: false, segwitAvailable: false,
onSelect: function() { onSelect: function() {
network = bitcoinjs.bitcoin.networks.dashtn; network = bitcoinjs.bitcoin.networks.dashtn;
setHdCoin(1); setHdCoin(1);
@@ -1229,7 +1552,7 @@
}, },
{ {
name: "DOGE - Dogecoin", name: "DOGE - Dogecoin",
bip49available: false, segwitAvailable: false,
onSelect: function() { onSelect: function() {
network = bitcoinjs.bitcoin.networks.dogecoin; network = bitcoinjs.bitcoin.networks.dogecoin;
setHdCoin(3); setHdCoin(3);
@@ -1237,15 +1560,23 @@
}, },
{ {
name: "ETH - Ethereum", name: "ETH - Ethereum",
bip49available: false, segwitAvailable: false,
onSelect: function() { onSelect: function() {
network = bitcoinjs.bitcoin.networks.bitcoin; network = bitcoinjs.bitcoin.networks.bitcoin;
setHdCoin(60); setHdCoin(60);
}, },
}, },
{
name: "FJC - Fujicoin",
segwitAvailable: false,
onSelect: function() {
network = bitcoinjs.bitcoin.networks.fujicoin;
setHdCoin(75);
},
},
{ {
name: "GAME - GameCredits", name: "GAME - GameCredits",
bip49available: false, segwitAvailable: false,
onSelect: function() { onSelect: function() {
network = bitcoinjs.bitcoin.networks.game; network = bitcoinjs.bitcoin.networks.game;
setHdCoin(101); setHdCoin(101);
@@ -1253,31 +1584,64 @@
}, },
{ {
name: "JBS - Jumbucks", name: "JBS - Jumbucks",
bip49available: false, segwitAvailable: false,
onSelect: function() { onSelect: function() {
network = bitcoinjs.bitcoin.networks.jumbucks; network = bitcoinjs.bitcoin.networks.jumbucks;
setHdCoin(26); setHdCoin(26);
}, },
}, },
{ {
name: "LTC - Litecoin", name: "KMD - Komodo",
bip49available: false, bip49available: false,
onSelect: function() {
network = bitcoinjs.bitcoin.networks.komodo;
setHdCoin(141);
},
},
{
name: "LTC - Litecoin",
segwitAvailable: true,
onSelect: function() { onSelect: function() {
network = bitcoinjs.bitcoin.networks.litecoin; network = bitcoinjs.bitcoin.networks.litecoin;
setHdCoin(2); setHdCoin(2);
DOM.litecoinLtubContainer.removeClass("hidden");
},
},
{
name: "MAZA - Maza",
segwitAvailable: false,
onSelect: function() {
network = bitcoinjs.bitcoin.networks.maza;
setHdCoin(13);
},
},
{
name: "MONA - Monacoin",
segwitAvailable: true,
onSelect: function() {
network = bitcoinjs.bitcoin.networks.monacoin,
setHdCoin(22);
}, },
}, },
{ {
name: "NMC - Namecoin", name: "NMC - Namecoin",
bip49available: false, segwitAvailable: false,
onSelect: function() { onSelect: function() {
network = bitcoinjs.bitcoin.networks.namecoin; network = bitcoinjs.bitcoin.networks.namecoin;
setHdCoin(7); setHdCoin(7);
}, },
}, },
{
name: "ONX - Onixcoin",
segwitAvailable: false,
onSelect: function() {
network = bitcoinjs.bitcoin.networks.onixcoin;
setHdCoin(174);
},
},
{ {
name: "PIVX - PIVX", name: "PIVX - PIVX",
bip49available: false, segwitAvailable: false,
onSelect: function() { onSelect: function() {
network = bitcoinjs.bitcoin.networks.pivx; network = bitcoinjs.bitcoin.networks.pivx;
setHdCoin(119); setHdCoin(119);
@@ -1285,7 +1649,7 @@
}, },
{ {
name: "PIVX - PIVX Testnet", name: "PIVX - PIVX Testnet",
bip49available: false, segwitAvailable: false,
onSelect: function() { onSelect: function() {
network = bitcoinjs.bitcoin.networks.pivxtestnet; network = bitcoinjs.bitcoin.networks.pivxtestnet;
setHdCoin(1); setHdCoin(1);
@@ -1293,7 +1657,7 @@
}, },
{ {
name: "PPC - Peercoin", name: "PPC - Peercoin",
bip49available: false, segwitAvailable: false,
onSelect: function() { onSelect: function() {
network = bitcoinjs.bitcoin.networks.peercoin; network = bitcoinjs.bitcoin.networks.peercoin;
setHdCoin(6); setHdCoin(6);
@@ -1301,7 +1665,7 @@
}, },
{ {
name: "SDC - ShadowCash", name: "SDC - ShadowCash",
bip49available: false, segwitAvailable: false,
onSelect: function() { onSelect: function() {
network = bitcoinjs.bitcoin.networks.shadow; network = bitcoinjs.bitcoin.networks.shadow;
setHdCoin(35); setHdCoin(35);
@@ -1309,7 +1673,7 @@
}, },
{ {
name: "SDC - ShadowCash Testnet", name: "SDC - ShadowCash Testnet",
bip49available: false, segwitAvailable: false,
onSelect: function() { onSelect: function() {
network = bitcoinjs.bitcoin.networks.shadowtn; network = bitcoinjs.bitcoin.networks.shadowtn;
setHdCoin(1); setHdCoin(1);
@@ -1317,7 +1681,7 @@
}, },
{ {
name: "SLM - Slimcoin", name: "SLM - Slimcoin",
bip49available: false, segwitAvailable: false,
onSelect: function() { onSelect: function() {
network = bitcoinjs.bitcoin.networks.slimcoin; network = bitcoinjs.bitcoin.networks.slimcoin;
setHdCoin(63); setHdCoin(63);
@@ -1325,15 +1689,23 @@
}, },
{ {
name: "SLM - Slimcoin Testnet", name: "SLM - Slimcoin Testnet",
bip49available: false, segwitAvailable: false,
onSelect: function() { onSelect: function() {
network = bitcoinjs.bitcoin.networks.slimcointn; network = bitcoinjs.bitcoin.networks.slimcointn;
setHdCoin(111); setHdCoin(111);
}, },
}, },
{
name: "USNBT - NuBits",
segwitAvailable: false,
onSelect: function() {
network = bitcoinjs.bitcoin.networks.nubits;
setHdCoin(12);
},
},
{ {
name: "VIA - Viacoin", name: "VIA - Viacoin",
bip49available: false, segwitAvailable: false,
onSelect: function() { onSelect: function() {
network = bitcoinjs.bitcoin.networks.viacoin; network = bitcoinjs.bitcoin.networks.viacoin;
setHdCoin(14); setHdCoin(14);
@@ -1341,7 +1713,7 @@
}, },
{ {
name: "VIA - Viacoin Testnet", name: "VIA - Viacoin Testnet",
bip49available: false, segwitAvailable: false,
onSelect: function() { onSelect: function() {
network = bitcoinjs.bitcoin.networks.viacointestnet; network = bitcoinjs.bitcoin.networks.viacointestnet;
setHdCoin(1); setHdCoin(1);
@@ -1349,7 +1721,7 @@
}, },
{ {
name: "XMY - Myriadcoin", name: "XMY - Myriadcoin",
bip49available: false, segwitAvailable: false,
onSelect: function() { onSelect: function() {
network = bitcoinjs.bitcoin.networks.myriadcoin; network = bitcoinjs.bitcoin.networks.myriadcoin;
setHdCoin(90); setHdCoin(90);
@@ -1357,7 +1729,7 @@
}, },
{ {
name: "XRP - Ripple", name: "XRP - Ripple",
bip49available: false, segwitAvailable: false,
onSelect: function() { onSelect: function() {
network = bitcoinjs.bitcoin.networks.bitcoin; network = bitcoinjs.bitcoin.networks.bitcoin;
setHdCoin(144); setHdCoin(144);
+10253
View File
File diff suppressed because it is too large Load Diff
-4
View File
File diff suppressed because one or more lines are too long
-28
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: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),
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
View File
File diff suppressed because one or more lines are too long
-94
View File
@@ -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"
}
);
+58
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
};
})();
-153
View File
@@ -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;
}
})();
+1 -1
View File
@@ -25,4 +25,4 @@ var time_estimates;time_estimates={estimate_attack_times:function(e){var t,n,s,o
},{}]},{},[4])(4) },{}]},{},[4])(4)
}); });
//# sourceMappingURL=zxcvbn.js.map
-4193
View File
File diff suppressed because it is too large Load Diff
+17
View File
@@ -0,0 +1,17 @@
{
"name": "tests",
"version": "1.0.0",
"scripts": {
"test": "node tests.js"
},
"author": "Ian coleman",
"description": "Tests for BIP39 tool",
"repository": {
"type": "git",
"url": "git://github.com/iancoleman/bip39.git"
},
"dependencies": {
"selenium-webdriver": "^3.6.0"
},
"license": "MIT"
}
+11
View File
@@ -0,0 +1,11 @@
{
"spec_dir": "spec",
"spec_files": [
"**/*[sS]pec.js"
],
"helpers": [
"helpers/**/*.js"
],
"stopSpecOnExpectationFailure": false,
"random": false
}
+2911
View File
File diff suppressed because it is too large Load Diff