mirror of
https://github.com/OneKeyHQ/bip39.git
synced 2026-04-29 13:36:01 +00:00
Compare commits
93 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| fcc7d12109 | |||
| 5dfe77e4a3 | |||
| e21e32da31 | |||
| ba678b1147 | |||
| 0b39e9dca7 | |||
| cc61ec30c5 | |||
| 0f0a888e13 | |||
| 2ef27fb80b | |||
| 423fb969c6 | |||
| 9fae1ffbcc | |||
| 78db37f663 | |||
| 28e1cd455c | |||
| 47debf07ed | |||
| cfc0c4d743 | |||
| de8e5bc11f | |||
| 5c1003dde3 | |||
| a78f4e280c | |||
| 4e9b492ca4 | |||
| 91eb2cbcfd | |||
| c51bb4f9e5 | |||
| 3fa0f4cbef | |||
| 92fb39311e | |||
| d00c719932 | |||
| ab1bd64d52 | |||
| aab3645f21 | |||
| 66419cf39c | |||
| 26dd39fd0e | |||
| 9225b805d6 | |||
| f2de7aa7d8 | |||
| 9a54f27efc | |||
| 863fa61aaf | |||
| 2f410ee66e | |||
| 2087192332 | |||
| 74ab4cbe90 | |||
| cf6c204497 | |||
| c49e881294 | |||
| 0fd67b5915 | |||
| 1c2b8c6b2d | |||
| 9f59e99bec | |||
| 924727ed26 | |||
| 9183f9f658 | |||
| f487fea9b8 | |||
| 5a10834a36 | |||
| 1f354b0390 | |||
| 0460b53f3a | |||
| e8ee368f18 | |||
| 107edb3454 | |||
| 3960807353 | |||
| 214c584c40 | |||
| c1396e87ed | |||
| b57b721e2c | |||
| 0f6b34d68b | |||
| 2a01f39de7 | |||
| 93c3ef4757 | |||
| fe8f2d140d | |||
| 0cca6e893a | |||
| f2a1a8e67f | |||
| 8dd28f2cff | |||
| 4b1e5c340f | |||
| 2be42f9dba | |||
| 4aa771eb68 | |||
| 1102f20135 | |||
| fb00a22d3f | |||
| 73b8724a6f | |||
| 8890d0f4c3 | |||
| 6e67990522 | |||
| 9ff30babbc | |||
| ee0981f1ec | |||
| 6024e655a8 | |||
| 7e6bdc498e | |||
| 16b4c2788a | |||
| 0197de2795 | |||
| 861750ae51 | |||
| a40d59d904 | |||
| d933c3f731 | |||
| 408ecc184a | |||
| 00114002fe | |||
| e80955983d | |||
| f20b7e7128 | |||
| 908dc06fe8 | |||
| 3d548c6f9b | |||
| 0a8d06d03e | |||
| 88311463c7 | |||
| cd7c8327b1 | |||
| 0cda44d5f6 | |||
| 7258b102c1 | |||
| 8d18f379fd | |||
| 3abab9b087 | |||
| b18eb97ae3 | |||
| 88ea3e40ee | |||
| 8a9f391376 | |||
| e40acc3ab0 | |||
| 56ad960105 |
@@ -0,0 +1 @@
|
|||||||
|
node_modules
|
||||||
+59299
-2430
File diff suppressed because one or more lines are too long
@@ -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,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.
|
||||||
|
|
||||||
|
|||||||
@@ -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
@@ -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
@@ -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;
|
||||||
|
}
|
||||||
Vendored
+6757
File diff suppressed because it is too large
Load Diff
Vendored
-5
File diff suppressed because one or more lines are too long
+362
-260
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
+151
-40
@@ -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
|
||||||
};
|
};
|
||||||
|
|||||||
Vendored
+2377
File diff suppressed because it is too large
Load Diff
Vendored
-6
File diff suppressed because one or more lines are too long
+434
-62
@@ -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;
|
||||||
}
|
}
|
||||||
var keyhash = bitcoinjs.bitcoin.crypto.hash160(key.getPublicKeyBuffer());
|
if (isP2wpkh) {
|
||||||
var scriptsig = bitcoinjs.bitcoin.script.witnessPubKeyHash.output.encode(keyhash);
|
var keyhash = bitcoinjs.bitcoin.crypto.hash160(key.getPublicKeyBuffer());
|
||||||
var addressbytes = bitcoinjs.bitcoin.crypto.hash160(scriptsig);
|
var scriptpubkey = bitcoinjs.bitcoin.script.witnessPubKeyHash.output.encode(keyhash);
|
||||||
var scriptpubkey = bitcoinjs.bitcoin.script.scriptHash.output.encode(addressbytes);
|
address = bitcoinjs.bitcoin.address.fromOutputScript(scriptpubkey, network)
|
||||||
address = bitcoinjs.bitcoin.address.fromOutputScript(scriptpubkey, network)
|
}
|
||||||
|
else if (isP2wpkhInP2sh) {
|
||||||
|
var keyhash = bitcoinjs.bitcoin.crypto.hash160(key.getPublicKeyBuffer());
|
||||||
|
var scriptsig = bitcoinjs.bitcoin.script.witnessPubKeyHash.output.encode(keyhash);
|
||||||
|
var addressbytes = bitcoinjs.bitcoin.crypto.hash160(scriptsig);
|
||||||
|
var scriptpubkey = bitcoinjs.bitcoin.script.scriptHash.output.encode(addressbytes);
|
||||||
|
address = bitcoinjs.bitcoin.address.fromOutputScript(scriptpubkey, network)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
addAddressToList(indexText, address, pubkey, privkey);
|
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);
|
||||||
|
|||||||
Vendored
+10253
File diff suppressed because it is too large
Load Diff
Vendored
-4
File diff suppressed because one or more lines are too long
Vendored
-28
@@ -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)})}})($);
|
|
||||||
Vendored
+2
File diff suppressed because one or more lines are too long
@@ -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"
|
|
||||||
}
|
|
||||||
);
|
|
||||||
@@ -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
|
||||||
|
};
|
||||||
|
|
||||||
|
})();
|
||||||
@@ -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
@@ -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
|
|
||||||
|
|||||||
@@ -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"
|
||||||
|
}
|
||||||
@@ -0,0 +1,11 @@
|
|||||||
|
{
|
||||||
|
"spec_dir": "spec",
|
||||||
|
"spec_files": [
|
||||||
|
"**/*[sS]pec.js"
|
||||||
|
],
|
||||||
|
"helpers": [
|
||||||
|
"helpers/**/*.js"
|
||||||
|
],
|
||||||
|
"stopSpecOnExpectationFailure": false,
|
||||||
|
"random": false
|
||||||
|
}
|
||||||
+2911
File diff suppressed because it is too large
Load Diff
Reference in New Issue
Block a user