Merge branch 'master' into ethereum-like

This commit is contained in:
xarakas
2018-06-18 17:17:49 +03:00
committed by GitHub
7 changed files with 604 additions and 412 deletions

File diff suppressed because it is too large Load Diff

View File

@@ -1,3 +1,15 @@
# 0.3.7
* Update AXE network parameters
* Add new networks - Xuez, BTCP, BTCZ, ZCL, ZEN
* Add litecoin bech32 params
* Fix BIP38 for altcoins
* Fix missing span closing tag
* Add indicator to UI for when BIP84 is unavailable
* Replace hasSegwit variable with test for segwit params
* Allow xpub to be used as root key for segwit derivations
* Add visual privacy safeguard
# 0.3.6
* Add Kobocoin

View File

@@ -103,3 +103,6 @@ body {
overflow-x: scroll;
font-family: monospace;
}
.visual-privacy .private-data {
display: none;
}

View File

@@ -15,7 +15,7 @@
<div class="container">
<h1 class="text-center">Mnemonic Code Converter</h1>
<p class="version">v0.3.6</p>
<p class="version">v0.3.7</p>
<hr>
<div class="row">
<div class="col-md-12">
@@ -69,7 +69,7 @@
<div class="form-group">
<label for="entropy" class="col-sm-2 control-label">Entropy</label>
<div class="col-sm-7">
<textarea id="entropy" rows="2" class="entropy form-control" placeholder="Accepts either binary, base 6, 6-sided dice, base 10, hexadecimal or cards"></textarea>
<textarea id="entropy" rows="2" class="entropy private-data form-control" placeholder="Accepts either binary, base 6, 6-sided dice, base 10, hexadecimal or cards"></textarea>
<div class="row filter-warning text-danger hidden">
<p class="col-sm-12">
<strong>
@@ -96,19 +96,19 @@
<div class="bits col-sm-3 form-control-static"></div>
</div>
<label class="col-sm-3 control-label">Filtered Entropy</label>
<div class="filtered col-sm-9 form-control-static"></div>
<div class="filtered private-data col-sm-9 form-control-static"></div>
<label class="col-sm-3 control-label">Raw Binary</label>
<div class="binary col-sm-9 form-control-static"></div>
<div class="binary private-data col-sm-9 form-control-static"></div>
<label class="col-sm-3 control-label">Binary Checksum</label>
<div class="checksum col-sm-9 form-control-static">&nbsp;</div>
<div class="checksum private-data col-sm-9 form-control-static">&nbsp;</div>
<label class="col-sm-3 control-label">Word Indexes</label>
<div class="word-indexes col-sm-9 form-control-static">&nbsp;</div>
<div class="word-indexes private-data col-sm-9 form-control-static">&nbsp;</div>
<label class="col-sm-3 control-label">Mnemonic Length</label>
<div class="col-sm-9">
<select class="mnemonic-length form-control">
<option value="raw" selected>Use Raw Entropy (3 words per 32 bits)</option>
<option value="12">12 <span>Words</span></option>
<option value="15">15 <span>Words</option>
<option value="15">15 <span>Words</span></option>
<option value="18">18 <span>Words</span></option>
<option value="21">21 <span>Words</span></option>
<option value="24">24 <span>Words</span></option>
@@ -142,6 +142,15 @@
</label>
</div>
</div>
<div class="form-group">
<div class="col-sm-2"></div>
<div class="col-sm-10 checkbox">
<label>
<input type="checkbox" class="privacy-screen-toggle">
<span>Hide all private info</span>
</label>
</div>
</div>
<div class="form-group">
<label class="col-sm-2 control-label">Mnemonic Language</label>
<div class="col-sm-10 languages">
@@ -160,19 +169,19 @@
<div class="form-group">
<label for="phrase" class="col-sm-2 control-label">BIP39 Mnemonic</label>
<div class="col-sm-10">
<textarea id="phrase" class="phrase form-control" data-show-qr></textarea>
<textarea id="phrase" class="phrase private-data form-control" data-show-qr></textarea>
</div>
</div>
<div class="form-group">
<label for="passphrase" class="col-sm-2 control-label">BIP39 Passphrase (optional)</label>
<div class="col-sm-10">
<textarea id="passphrase" class="passphrase form-control"></textarea>
<textarea id="passphrase" class="passphrase private-data form-control"></textarea>
</div>
</div>
<div class="form-group">
<label for="seed" class="col-sm-2 control-label">BIP39 Seed</label>
<div class="col-sm-10">
<textarea id="seed" class="seed form-control" readonly="readonly" data-show-qr></textarea>
<textarea id="seed" class="seed private-data form-control" readonly="readonly" data-show-qr></textarea>
</div>
</div>
<div class="form-group">
@@ -186,7 +195,7 @@
<div class="form-group">
<label for="root-key" class="col-sm-2 control-label">BIP32 Root Key</label>
<div class="col-sm-10">
<textarea id="root-key" class="root-key form-control" data-show-qr></textarea>
<textarea id="root-key" class="root-key private-data form-control" data-show-qr></textarea>
</div>
</div>
<div class="form-group litecoin-ltub-container hidden">
@@ -279,7 +288,7 @@
<span>Account Extended Private Key</span>
</label>
<div class="col-sm-10">
<textarea id="account-xprv" type="text" class="account-xprv form-control" readonly data-show-qr></textarea>
<textarea id="account-xprv" type="text" class="account-xprv private-data form-control" readonly data-show-qr></textarea>
</div>
</div>
<div class="form-group">
@@ -439,7 +448,7 @@
<span>Account Extended Private Key</span>
</label>
<div class="col-sm-10">
<textarea id="account-xprv" type="text" class="account-xprv form-control" readonly data-show-qr></textarea>
<textarea id="account-xprv" type="text" class="account-xprv private-data form-control" readonly data-show-qr></textarea>
</div>
</div>
<div class="form-group">
@@ -506,79 +515,89 @@
<div id="bip84" class="tab-pane">
<form class="form-horizontal" role="form">
<br>
<div class="col-sm-2"></div>
<div class="col-sm-10">
<p>
For more info see the
<a href="https://github.com/bitcoin/bips/blob/master/bip-0084.mediawiki" target="_blank">BIP84 spec</a>.
</p>
</div>
<div class="form-group">
<label for="purpose" class="col-sm-2 control-label">
Purpose
</label>
<div class="col-sm-10">
<input id="purpose" type="text" class="purpose form-control" value="84" readonly>
<div class="unavailable hidden">
<div class="form-group">
<div class="col-sm-2"></div>
<div class="col-sm-10">
<p>BIP84 is unavailable for this coin.</p>
</div>
</div>
</div>
<div class="form-group">
<label for="coin" class="col-sm-2 control-label">
Coin
</label>
<div class="available">
<div class="col-sm-2"></div>
<div class="col-sm-10">
<input id="coin" type="text" class="coin form-control" value="0" readonly>
<p>
For more info see the
<a href="https://github.com/bitcoin/bips/blob/master/bip-0084.mediawiki" target="_blank">BIP84 spec</a>.
</p>
</div>
</div>
<div class="form-group">
<label for="account" class="col-sm-2 control-label">
Account
</label>
<div class="col-sm-10">
<input id="account" type="text" class="account form-control" value="0">
<div class="form-group">
<label for="purpose" class="col-sm-2 control-label">
Purpose
</label>
<div class="col-sm-10">
<input id="purpose" type="text" class="purpose form-control" value="84" readonly>
</div>
</div>
</div>
<div class="form-group">
<label for="change" class="col-sm-2 control-label">
External / Internal
</label>
<div class="col-sm-10">
<input id="change" type="text" class="change form-control" value="0">
<div class="form-group">
<label for="coin" class="col-sm-2 control-label">
Coin
</label>
<div class="col-sm-10">
<input id="coin" type="text" class="coin form-control" value="0" readonly>
</div>
</div>
</div>
<div class="form-group">
<label class="col-sm-2 control-label">
</label>
<div class="col-sm-10">
<p>The account extended keys can be used for importing to most BIP84 compatible wallets.</p>
<div class="form-group">
<label for="account" class="col-sm-2 control-label">
Account
</label>
<div class="col-sm-10">
<input id="account" type="text" class="account form-control" value="0">
</div>
</div>
</div>
<div class="form-group">
<label for="account-xprv" class="col-sm-2 control-label">
<span>Account Extended Private Key</span>
</label>
<div class="col-sm-10">
<textarea id="account-xprv" type="text" class="account-xprv form-control" readonly data-show-qr></textarea>
<div class="form-group">
<label for="change" class="col-sm-2 control-label">
External / Internal
</label>
<div class="col-sm-10">
<input id="change" type="text" class="change form-control" value="0">
</div>
</div>
</div>
<div class="form-group">
<label for="account-xpub" class="col-sm-2 control-label">
<span>Account Extended Public Key</span>
</label>
<div class="col-sm-10">
<textarea id="account-xpub" type="text" class="account-xpub form-control" readonly data-show-qr></textarea>
<div class="form-group">
<label class="col-sm-2 control-label">
</label>
<div class="col-sm-10">
<p>The account extended keys can be used for importing to most BIP84 compatible wallets.</p>
</div>
</div>
</div>
<div class="form-group">
<label class="col-sm-2 control-label">
</label>
<div class="col-sm-10">
<p>The BIP32 derivation path and extended keys are the basis for the derived addresses.</p>
<div class="form-group">
<label for="account-xprv" class="col-sm-2 control-label">
<span>Account Extended Private Key</span>
</label>
<div class="col-sm-10">
<textarea id="account-xprv" type="text" class="account-xprv private-data form-control" readonly data-show-qr></textarea>
</div>
</div>
</div>
<div class="form-group">
<label for="bip84-path" class="col-sm-2 control-label">BIP32 Derivation Path</label>
<div class="col-sm-10">
<input id="bip84-path" type="text" class="path form-control" value="m/84'/0'/0'/0" readonly="readonly">
<div class="form-group">
<label for="account-xpub" class="col-sm-2 control-label">
<span>Account Extended Public Key</span>
</label>
<div class="col-sm-10">
<textarea id="account-xpub" type="text" class="account-xpub form-control" readonly data-show-qr></textarea>
</div>
</div>
<div class="form-group">
<label class="col-sm-2 control-label">
</label>
<div class="col-sm-10">
<p>The BIP32 derivation path and extended keys are the basis for the derived addresses.</p>
</div>
</div>
<div class="form-group">
<label for="bip84-path" class="col-sm-2 control-label">BIP32 Derivation Path</label>
<div class="col-sm-10">
<input id="bip84-path" type="text" class="path form-control" value="m/84'/0'/0'/0" readonly="readonly">
</div>
</div>
</div>
</form>
@@ -588,7 +607,7 @@
<div class="form-group">
<label for="extended-priv-key" class="col-sm-2 control-label">BIP32 Extended Private Key</label>
<div class="col-sm-10">
<textarea id="extended-priv-key" class="extended-priv-key form-control" readonly="readonly" data-show-qr></textarea>
<textarea id="extended-priv-key" class="extended-priv-key private-data form-control" readonly="readonly" data-show-qr></textarea>
</div>
</div>
<div class="form-group">
@@ -634,7 +653,7 @@
<input type="checkbox" class="use-bip38">
<span>Encrypt private keys using BIP38 and this password:</span>
</label>
<input class="bip38-password">
<input class="bip38-password private-data">
<span>Enabling BIP38 means each key will take several minutes to generate.</span>
</div>
</div>
@@ -899,7 +918,7 @@
<td class="index"><span></span></td>
<td class="address"><span data-show-qr></span></td>
<td class="pubkey"><span data-show-qr></span></td>
<td class="privkey"><span data-show-qr></span></td>
<td class="privkey private-data"><span data-show-qr></span></td>
</tr>
</script>
<script src="js/polyfill.es6.js"></script>

View File

@@ -23,6 +23,7 @@
var generationProcesses = [];
var DOM = {};
DOM.privacyScreenToggle = $(".privacy-screen-toggle");
DOM.network = $(".network");
DOM.bip32Client = $("#bip32-client");
DOM.phraseNetwork = $("#network-phrase");
@@ -77,6 +78,8 @@
DOM.bip49accountXprv = $("#bip49 .account-xprv");
DOM.bip49accountXpub = $("#bip49 .account-xpub");
DOM.bip49change = $("#bip49 .change");
DOM.bip84unavailable = $("#bip84 .unavailable");
DOM.bip84available = $("#bip84 .available");
DOM.bip84path = $("#bip84-path");
DOM.bip84purpose = $("#bip84 .purpose");
DOM.bip84coin = $("#bip84 .coin");
@@ -116,6 +119,7 @@
function init() {
// Events
DOM.privacyScreenToggle.on("change", privacyScreenToggled);
DOM.generatedStrength.on("change", generatedStrengthChanged);
DOM.network.on("change", networkChanged);
DOM.bip32Client.on("change", bip32ClientChanged);
@@ -176,13 +180,7 @@
var networkIndex = e.target.value;
var network = networks[networkIndex];
network.onSelect();
if (network.segwitAvailable) {
adjustNetworkForSegwit();
showSegwitAvailable();
}
else {
showSegwitUnavailable();
}
adjustNetworkForSegwit();
if (seed != null) {
phraseChanged();
}
@@ -372,8 +370,11 @@
showPending();
// Don't show segwit if it's selected but network doesn't support it
if (segwitSelected() && !networkHasSegwit()) {
showSegwitUnavailable();
hidePending();
return;
}
showSegwitAvailable();
// Get the derivation path
var derivationPath = getDerivationPath();
var errorText = findDerivationPathErrors(derivationPath);
@@ -448,6 +449,17 @@
$("td.privkey span").toggleClass("invisible");
}
function privacyScreenToggled() {
// private-data contains elements added to DOM at runtime
// so catch all by adding visual privacy class to the root of the DOM
if (DOM.privacyScreenToggle.prop("checked")) {
$("body").addClass("visual-privacy");
}
else {
$("body").removeClass("visual-privacy");
}
}
// Private methods
function generateRandomPhrase() {
@@ -479,6 +491,37 @@
}
function calcBip32RootKeyFromBase58(rootKeyBase58) {
// try parsing with various segwit network params since this extended
// key may be from any one of them.
if (networkHasSegwit()) {
var n = network;
if ("baseNetwork" in n) {
n = bitcoinjs.bitcoin.networks[n.baseNetwork];
}
// try parsing using base network params
try {
bip32RootKey = bitcoinjs.bitcoin.HDNode.fromBase58(rootKeyBase58, n);
return;
}
catch (e) {}
// try parsing using p2wpkh params
if ("p2wpkh" in n) {
try {
bip32RootKey = bitcoinjs.bitcoin.HDNode.fromBase58(rootKeyBase58, n.p2wpkh);
return;
}
catch (e) {}
}
// try parsing using p2wpkh-in-p2sh network params
if ("p2wpkhInP2sh" in n) {
try {
bip32RootKey = bitcoinjs.bitcoin.HDNode.fromBase58(rootKeyBase58, n.p2wpkhInP2sh);
return;
}
catch (e) {}
}
}
// try the network params as currently specified
bip32RootKey = bitcoinjs.bitcoin.HDNode.fromBase58(rootKeyBase58, network);
}
@@ -552,6 +595,37 @@
}
function validateRootKey(rootKeyBase58) {
// try various segwit network params since this extended key may be from
// any one of them.
if (networkHasSegwit()) {
var n = network;
if ("baseNetwork" in n) {
n = bitcoinjs.bitcoin.networks[n.baseNetwork];
}
// try parsing using base network params
try {
bitcoinjs.bitcoin.HDNode.fromBase58(rootKeyBase58, n);
return "";
}
catch (e) {}
// try parsing using p2wpkh params
if ("p2wpkh" in n) {
try {
bitcoinjs.bitcoin.HDNode.fromBase58(rootKeyBase58, n.p2wpkh);
return "";
}
catch (e) {}
}
// try parsing using p2wpkh-in-p2sh network params
if ("p2wpkhInP2sh" in n) {
try {
bitcoinjs.bitcoin.HDNode.fromBase58(rootKeyBase58, n.p2wpkhInP2sh);
return "";
}
catch (e) {}
}
}
// try the network params as currently specified
try {
bitcoinjs.bitcoin.HDNode.fromBase58(rootKeyBase58, network);
}
@@ -813,7 +887,7 @@
var keyPair = key.keyPair;
var useUncompressed = useBip38;
if (useUncompressed) {
keyPair = new bitcoinjs.bitcoin.ECPair(keyPair.d, null, { compressed: false });
keyPair = new bitcoinjs.bitcoin.ECPair(keyPair.d, null, { network: network, compressed: false });
}
// get address
var address = keyPair.getAddress().toString();
@@ -821,7 +895,7 @@
var hasPrivkey = !key.isNeutered();
var privkey = "NA";
if (hasPrivkey) {
privkey = keyPair.toWIF(network);
privkey = keyPair.toWIF();
// BIP38 encode private key if required
if (useBip38) {
privkey = bitcoinjsBip38.encrypt(keyPair.d.toBuffer(), false, bip38password, function(p) {
@@ -1398,7 +1472,20 @@
}
function networkHasSegwit() {
return networks[DOM.network.val()].segwitAvailable;
var n = network;
if ("baseNetwork" in network) {
n = bitcoinjs.bitcoin.networks[network.baseNetwork];
}
// check if only p2wpkh params are required
if (p2wpkhSelected()) {
return "p2wpkh" in n;
}
// check if only p2wpkh-in-p2sh params are required
else if (p2wpkhInP2shSelected()) {
return "p2wpkhInP2sh" in n;
}
// require both if it's unclear which params are required
return "p2wpkh" in n && "p2wpkhInP2sh" in n;
}
function bip49TabSelected() {
@@ -1422,6 +1509,8 @@
function showSegwitAvailable() {
DOM.bip49unavailable.addClass("hidden");
DOM.bip49available.removeClass("hidden");
DOM.bip84unavailable.addClass("hidden");
DOM.bip84available.removeClass("hidden");
DOM.bip141unavailable.addClass("hidden");
DOM.bip141available.removeClass("hidden");
}
@@ -1429,6 +1518,8 @@
function showSegwitUnavailable() {
DOM.bip49available.addClass("hidden");
DOM.bip49unavailable.removeClass("hidden");
DOM.bip84available.addClass("hidden");
DOM.bip84unavailable.removeClass("hidden");
DOM.bip141available.addClass("hidden");
DOM.bip141unavailable.removeClass("hidden");
}
@@ -1543,7 +1634,6 @@
var networks = [
{
name: "AC - Asiacoin",
segwitAvailable: false,
onSelect: function() {
network = bitcoinjs.bitcoin.networks.asiacoin;
setHdCoin(51);
@@ -1551,7 +1641,6 @@
},
{
name: "ACC - Adcoin",
segwitAvailable: true,
onSelect: function() {
network = bitcoinjs.bitcoin.networks.adcoin;
setHdCoin(161);
@@ -1559,7 +1648,6 @@
},
{
name: "AUR - Auroracoin",
segwitAvailable: false,
onSelect: function() {
network = bitcoinjs.bitcoin.networks.auroracoin;
setHdCoin(85);
@@ -1567,7 +1655,6 @@
},
{
name: "AXE - Axe",
segwitAvailable: false,
onSelect: function() {
network = bitcoinjs.bitcoin.networks.axe;
setHdCoin(4242);
@@ -1575,7 +1662,6 @@
},
{
name: "BCA - Bitcoin Atom",
segwitAvailable: true,
onSelect: function() {
network = bitcoinjs.bitcoin.networks.atom;
setHdCoin(185);
@@ -1583,7 +1669,6 @@
},
{
name: "BCH - Bitcoin Cash",
segwitAvailable: false,
onSelect: function() {
DOM.bitcoinCashAddressTypeContainer.removeClass("hidden");
setHdCoin(145);
@@ -1591,7 +1676,6 @@
},
{
name: "BEET - Beetlecoin",
segwitAvailable: false,
onSelect: function() {
network = bitcoinjs.bitcoin.networks.beetlecoin;
setHdCoin(800);
@@ -1599,7 +1683,6 @@
},
{
name: "BELA - Belacoin",
segwitAvailable: false,
onSelect: function() {
network = bitcoinjs.bitcoin.networks.belacoin;
setHdCoin(73);
@@ -1607,7 +1690,6 @@
},
{
name: "BLK - BlackCoin",
segwitAvailable: false,
onSelect: function() {
network = bitcoinjs.bitcoin.networks.blackcoin;
setHdCoin(10);
@@ -1615,7 +1697,6 @@
},
{
name: "BRIT - Britcoin",
segwitAvailable: false,
onSelect: function() {
network = bitcoinjs.bitcoin.networks.britcoin;
setHdCoin(70);
@@ -1623,7 +1704,6 @@
},
{
name: "BSD - Bitsend",
segwitAvailable: true,
onSelect: function() {
network = bitcoinjs.bitcoin.networks.bitsend;
setHdCoin(91);
@@ -1631,7 +1711,6 @@
},
{
name: "BTA - Bata",
segwitAvailable: false,
onSelect: function() {
network = bitcoinjs.bitcoin.networks.bata;
setHdCoin(89);
@@ -1639,7 +1718,6 @@
},
{
name: "BTC - Bitcoin",
segwitAvailable: true,
onSelect: function() {
network = bitcoinjs.bitcoin.networks.bitcoin;
setHdCoin(0);
@@ -1647,7 +1725,6 @@
},
{
name: "BTC - Bitcoin Testnet",
segwitAvailable: true,
onSelect: function() {
network = bitcoinjs.bitcoin.networks.testnet;
setHdCoin(1);
@@ -1655,7 +1732,6 @@
},
{
name: "BTCP - Bitcoin Private",
segwitAvailable: true,
onSelect: function() {
network = bitcoinjs.bitcoin.networks.bitcoinprivate;
setHdCoin(183);
@@ -1663,7 +1739,6 @@
},
{
name: "BTCZ - Bitcoinz",
segwitAvailable: false,
onSelect: function() {
network = bitcoinjs.bitcoin.networks.bitcoinz;
setHdCoin(177);
@@ -1671,7 +1746,6 @@
},
{
name: "BTG - Bitcoin Gold",
segwitAvailable: true,
onSelect: function() {
network = bitcoinjs.bitcoin.networks.bgold;
setHdCoin(156);
@@ -1679,7 +1753,6 @@
},
{
name: "BTX - Bitcore",
segwitAvailable: true,
onSelect: function() {
network = bitcoinjs.bitcoin.networks.bitcore;
setHdCoin(160);
@@ -1687,7 +1760,6 @@
},
{
name: "CCN - Cannacoin",
segwitAvailable: false,
onSelect: function() {
network = bitcoinjs.bitcoin.networks.cannacoin;
setHdCoin(19);
@@ -1695,7 +1767,6 @@
},
{
name: "CDN - Canadaecoin",
segwitAvailable: false,
onSelect: function() {
network = bitcoinjs.bitcoin.networks.canadaecoin;
setHdCoin(34);
@@ -1703,7 +1774,6 @@
},
{
name: "CLAM - Clams",
segwitAvailable: false,
onSelect: function() {
network = bitcoinjs.bitcoin.networks.clam;
setHdCoin(23);
@@ -1719,7 +1789,6 @@
},
{
name: "CLUB - Clubcoin",
segwitAvailable: false,
onSelect: function() {
network = bitcoinjs.bitcoin.networks.clubcoin;
setHdCoin(79);
@@ -1727,7 +1796,6 @@
},
{
name: "CMP - Compcoin",
segwitAvailable: false,
onSelect: function() {
network = bitcoinjs.bitcoin.networks.compcoin;
setHdCoin(71);
@@ -1735,7 +1803,6 @@
},
{
name: "CRAVE - Crave",
segwitAvailable: false,
onSelect: function() {
network = bitcoinjs.bitcoin.networks.crave;
setHdCoin(186);
@@ -1743,7 +1810,6 @@
},
{
name: "CRW - Crown",
segwitAvailable: false,
onSelect: function() {
network = bitcoinjs.bitcoin.networks.crown;
setHdCoin(72);
@@ -1751,7 +1817,6 @@
},
{
name: "DASH - Dash",
segwitAvailable: false,
onSelect: function() {
network = bitcoinjs.bitcoin.networks.dash;
setHdCoin(5);
@@ -1759,7 +1824,6 @@
},
{
name: "DASH - Dash Testnet",
segwitAvailable: false,
onSelect: function() {
network = bitcoinjs.bitcoin.networks.dashtn;
setHdCoin(1);
@@ -1767,7 +1831,6 @@
},
{
name: "DFC - Defcoin",
segwitAvailable: false,
onSelect: function() {
network = bitcoinjs.bitcoin.networks.defcoin;
setHdCoin(1337);
@@ -1775,7 +1838,6 @@
},
{
name: "DGB - Digibyte",
segwitAvailable: true,
onSelect: function() {
network = bitcoinjs.bitcoin.networks.digibyte;
setHdCoin(20);
@@ -1783,7 +1845,6 @@
},
{
name: "DGC - Digitalcoin",
segwitAvailable: false,
onSelect: function() {
network = bitcoinjs.bitcoin.networks.digitalcoin;
setHdCoin(18);
@@ -1791,7 +1852,6 @@
},
{
name: "DMD - Diamond",
segwitAvailable: false,
onSelect: function() {
network = bitcoinjs.bitcoin.networks.diamond;
setHdCoin(152);
@@ -1799,7 +1859,6 @@
},
{
name: "DNR - Denarius",
segwitAvailable: false,
onSelect: function() {
network = bitcoinjs.bitcoin.networks.denarius;
setHdCoin(116);
@@ -1807,7 +1866,6 @@
},
{
name: "DOGE - Dogecoin",
segwitAvailable: false,
onSelect: function() {
network = bitcoinjs.bitcoin.networks.dogecoin;
setHdCoin(3);
@@ -1815,7 +1873,6 @@
},
{
name: "ECN - Ecoin",
segwitAvailable: false,
onSelect: function() {
network = bitcoinjs.bitcoin.networks.ecoin;
setHdCoin(115);
@@ -1823,7 +1880,6 @@
},
{
name: "EDRC - Edrcoin",
segwitAvailable: false,
onSelect: function() {
network = bitcoinjs.bitcoin.networks.edrcoin;
setHdCoin(56);
@@ -1831,7 +1887,6 @@
},
{
name: "EFL - Egulden",
segwitAvailable: true,
onSelect: function() {
network = bitcoinjs.bitcoin.networks.egulden;
setHdCoin(78);
@@ -1839,7 +1894,6 @@
},
{
name: "EMC2 - Einsteinium",
segwitAvailable: false,
onSelect: function() {
network = bitcoinjs.bitcoin.networks.einsteinium;
setHdCoin(41);
@@ -1847,7 +1901,6 @@
},
{
name: "ERC - Europecoin",
segwitAvailable: false,
onSelect: function() {
network = bitcoinjs.bitcoin.networks.europecoin;
setHdCoin(151);
@@ -1863,7 +1916,6 @@
},
{
name: "ETH - Ethereum",
segwitAvailable: false,
onSelect: function() {
network = bitcoinjs.bitcoin.networks.bitcoin;
setHdCoin(60);
@@ -1871,7 +1923,6 @@
},
{
name: "EXCL - Exclusivecoin",
segwitAvailable: false,
onSelect: function() {
network = bitcoinjs.bitcoin.networks.exclusivecoin;
setHdCoin(190);
@@ -1887,7 +1938,6 @@
},
{
name: "FJC - Fujicoin",
segwitAvailable: true,
onSelect: function() {
network = bitcoinjs.bitcoin.networks.fujicoin;
setHdCoin(75);
@@ -1895,7 +1945,6 @@
},
{
name: "FLASH - Flashcoin",
segwitAvailable: false,
onSelect: function() {
network = bitcoinjs.bitcoin.networks.flashcoin;
setHdCoin(120);
@@ -1903,7 +1952,6 @@
},
{
name: "FRST - Firstcoin",
segwitAvailable: false,
onSelect: function() {
network = bitcoinjs.bitcoin.networks.firstcoin;
setHdCoin(167);
@@ -1911,7 +1959,6 @@
},
{
name: "FTC - Feathercoin",
segwitAvailable: true,
onSelect: function() {
network = bitcoinjs.bitcoin.networks.feathercoin;
setHdCoin(8);
@@ -1919,7 +1966,6 @@
},
{
name: "GAME - GameCredits",
segwitAvailable: false,
onSelect: function() {
network = bitcoinjs.bitcoin.networks.game;
setHdCoin(101);
@@ -1927,7 +1973,6 @@
},
{
name: "GBX - Gobyte",
segwitAvailable: false,
onSelect: function() {
network = bitcoinjs.bitcoin.networks.gobyte;
setHdCoin(176);
@@ -1935,7 +1980,6 @@
},
{
name: "GCR - GCRCoin",
segwitAvailable: false,
onSelect: function() {
network = bitcoinjs.bitcoin.networks.gcr;
setHdCoin(79);
@@ -1943,7 +1987,6 @@
},
{
name: "GRC - Gridcoin",
segwitAvailable: false,
onSelect: function() {
network = bitcoinjs.bitcoin.networks.gridcoin;
setHdCoin(84);
@@ -1951,7 +1994,6 @@
},
{
name: "HNC - Helleniccoin",
segwitAvailable: false,
onSelect: function() {
network = bitcoinjs.bitcoin.networks.helleniccoin;
setHdCoin(168);
@@ -1959,7 +2001,6 @@
},
{
name: "INSN - Insane",
segwitAvailable: false,
onSelect: function() {
network = bitcoinjs.bitcoin.networks.insane;
setHdCoin(68);
@@ -1967,7 +2008,6 @@
},
{
name: "IOP - Iop",
segwitAvailable: true,
onSelect: function() {
network = bitcoinjs.bitcoin.networks.iop;
setHdCoin(66);
@@ -1975,7 +2015,6 @@
},
{
name: "IXC - Ixcoin",
segwitAvailable: false,
onSelect: function() {
network = bitcoinjs.bitcoin.networks.ixcoin;
setHdCoin(86);
@@ -1983,7 +2022,6 @@
},
{
name: "JBS - Jumbucks",
segwitAvailable: false,
onSelect: function() {
network = bitcoinjs.bitcoin.networks.jumbucks;
setHdCoin(26);
@@ -2007,7 +2045,6 @@
},
{
name: "LBC - Library Credits",
segwitAvailable: false,
onSelect: function() {
network = bitcoinjs.bitcoin.networks.lbry;
setHdCoin(140);
@@ -2015,7 +2052,6 @@
},
{
name: "LCC - Litecoincash",
segwitAvailable: true,
onSelect: function() {
network = bitcoinjs.bitcoin.networks.litecoincash;
setHdCoin(192);
@@ -2023,7 +2059,6 @@
},
{
name: "LDCN - Landcoin",
segwitAvailable: false,
onSelect: function() {
network = bitcoinjs.bitcoin.networks.landcoin;
setHdCoin(63);
@@ -2031,7 +2066,6 @@
},
{
name: "LINX - Linx",
segwitAvailable: false,
onSelect: function() {
network = bitcoinjs.bitcoin.networks.linx;
setHdCoin(114);
@@ -2039,7 +2073,6 @@
},
{
name: "LTC - Litecoin",
segwitAvailable: true,
onSelect: function() {
network = bitcoinjs.bitcoin.networks.litecoin;
setHdCoin(2);
@@ -2048,7 +2081,6 @@
},
{
name: "LYNX - Lynx",
segwitAvailable: false,
onSelect: function() {
network = bitcoinjs.bitcoin.networks.lynx;
setHdCoin(191);
@@ -2056,7 +2088,6 @@
},
{
name: "MAZA - Maza",
segwitAvailable: false,
onSelect: function() {
network = bitcoinjs.bitcoin.networks.maza;
setHdCoin(13);
@@ -2072,7 +2103,6 @@
},
{
name: "MNX - Minexcoin",
segwitAvailable: true,
onSelect: function() {
network = bitcoinjs.bitcoin.networks.minexcoin;
setHdCoin(182);
@@ -2080,7 +2110,6 @@
},
{
name: "MONA - Monacoin",
segwitAvailable: true,
onSelect: function() {
network = bitcoinjs.bitcoin.networks.monacoin,
setHdCoin(22);
@@ -2096,7 +2125,6 @@
},
{
name: "NAV - Navcoin",
segwitAvailable: true,
onSelect: function() {
network = bitcoinjs.bitcoin.networks.navcoin;
setHdCoin(130);
@@ -2104,7 +2132,6 @@
},
{
name: "NEBL - Neblio",
segwitAvailable: false,
onSelect: function() {
network = bitcoinjs.bitcoin.networks.neblio;
setHdCoin(146);
@@ -2112,7 +2139,6 @@
},
{
name: "NEOS - Neoscoin",
segwitAvailable: false,
onSelect: function() {
network = bitcoinjs.bitcoin.networks.neoscoin;
setHdCoin(25);
@@ -2120,7 +2146,6 @@
},
{
name: "NLG - Gulden",
segwitAvailable: false,
onSelect: function() {
network = bitcoinjs.bitcoin.networks.gulden;
setHdCoin(87);
@@ -2128,7 +2153,6 @@
},
{
name: "NMC - Namecoin",
segwitAvailable: false,
onSelect: function() {
network = bitcoinjs.bitcoin.networks.namecoin;
setHdCoin(7);
@@ -2136,7 +2160,6 @@
},
{
name: "NRG - Energi",
segwitAvailable: false,
onSelect: function() {
network = bitcoinjs.bitcoin.networks.energi;
setHdCoin(204);
@@ -2144,7 +2167,6 @@
},
{
name: "NRO - Neurocoin",
segwitAvailable: false,
onSelect: function() {
network = bitcoinjs.bitcoin.networks.neurocoin;
setHdCoin(110);
@@ -2152,7 +2174,6 @@
},
{
name: "NSR - Nushares",
segwitAvailable: false,
onSelect: function() {
network = bitcoinjs.bitcoin.networks.nushares;
setHdCoin(11);
@@ -2160,7 +2181,6 @@
},
{
name: "NYC - Newyorkc",
segwitAvailable: false,
onSelect: function() {
network = bitcoinjs.bitcoin.networks.newyorkc;
setHdCoin(179);
@@ -2168,7 +2188,6 @@
},
{
name: "NVC - Novacoin",
segwitAvailable: false,
onSelect: function() {
network = bitcoinjs.bitcoin.networks.novacoin;
setHdCoin(50);
@@ -2176,7 +2195,6 @@
},
{
name: "OK - Okcash",
segwitAvailable: false,
onSelect: function() {
network = bitcoinjs.bitcoin.networks.okcash;
setHdCoin(69);
@@ -2184,7 +2202,6 @@
},
{
name: "OMNI - Omnicore",
segwitAvailable: true,
onSelect: function() {
network = bitcoinjs.bitcoin.networks.omnicore;
setHdCoin(200);
@@ -2192,7 +2209,6 @@
},
{
name: "ONX - Onixcoin",
segwitAvailable: false,
onSelect: function() {
network = bitcoinjs.bitcoin.networks.onixcoin;
setHdCoin(174);
@@ -2200,7 +2216,6 @@
},
{
name: "PINK - Pinkcoin",
segwitAvailable: false,
onSelect: function() {
network = bitcoinjs.bitcoin.networks.pinkcoin;
setHdCoin(117);
@@ -2216,7 +2231,6 @@
},
{
name: "PIVX - PIVX",
segwitAvailable: false,
onSelect: function() {
network = bitcoinjs.bitcoin.networks.pivx;
setHdCoin(119);
@@ -2224,7 +2238,6 @@
},
{
name: "PIVX - PIVX Testnet",
segwitAvailable: false,
onSelect: function() {
network = bitcoinjs.bitcoin.networks.pivxtestnet;
setHdCoin(1);
@@ -2240,7 +2253,6 @@
},
{
name: "POSW - POSWcoin",
segwitAvailable: false,
onSelect: function() {
network = bitcoinjs.bitcoin.networks.poswcoin;
setHdCoin(47);
@@ -2248,7 +2260,6 @@
},
{
name: "POT - Potcoin",
segwitAvailable: false,
onSelect: function() {
network = bitcoinjs.bitcoin.networks.potcoin;
setHdCoin(81);
@@ -2256,7 +2267,6 @@
},
{
name: "PPC - Peercoin",
segwitAvailable: false,
onSelect: function() {
network = bitcoinjs.bitcoin.networks.peercoin;
setHdCoin(6);
@@ -2264,7 +2274,6 @@
},
{
name: "PSB - Pesobit",
segwitAvailable: false,
onSelect: function() {
network = bitcoinjs.bitcoin.networks.pesobit;
setHdCoin(62);
@@ -2272,7 +2281,6 @@
},
{
name: "PUT - Putincoin",
segwitAvailable: false,
onSelect: function() {
network = bitcoinjs.bitcoin.networks.putincoin;
setHdCoin(122);
@@ -2280,7 +2288,6 @@
},
{
name: "RBY - Rubycoin",
segwitAvailable: false,
onSelect: function() {
network = bitcoinjs.bitcoin.networks.rubycoin;
setHdCoin(16);
@@ -2288,15 +2295,13 @@
},
{
name: "RDD - Reddcoin",
segwitAvailable: false,
onSelect: function() {
network = bitcoinjs.bitcoin.networks.reddoin;
network = bitcoinjs.bitcoin.networks.reddcoin;
setHdCoin(4);
},
},
{
name: "RVR - RevolutionVR",
segwitAvailable: false,
onSelect: function() {
network = bitcoinjs.bitcoin.networks.revolutionvr;
setHdCoin(129);
@@ -2304,7 +2309,6 @@
},
{
name: "SDC - ShadowCash",
segwitAvailable: false,
onSelect: function() {
network = bitcoinjs.bitcoin.networks.shadow;
setHdCoin(35);
@@ -2312,7 +2316,6 @@
},
{
name: "SDC - ShadowCash Testnet",
segwitAvailable: false,
onSelect: function() {
network = bitcoinjs.bitcoin.networks.shadowtn;
setHdCoin(1);
@@ -2320,7 +2323,6 @@
},
{
name: "SLM - Slimcoin",
segwitAvailable: false,
onSelect: function() {
network = bitcoinjs.bitcoin.networks.slimcoin;
setHdCoin(63);
@@ -2328,7 +2330,6 @@
},
{
name: "SLM - Slimcoin Testnet",
segwitAvailable: false,
onSelect: function() {
network = bitcoinjs.bitcoin.networks.slimcointn;
setHdCoin(111);
@@ -2336,7 +2337,6 @@
},
{
name: "SLR - Solarcoin",
segwitAvailable: false,
onSelect: function() {
network = bitcoinjs.bitcoin.networks.solarcoin;
setHdCoin(58);
@@ -2344,7 +2344,6 @@
},
{
name: "SMLY - Smileycoin",
segwitAvailable: false,
onSelect: function() {
network = bitcoinjs.bitcoin.networks.smileycoin;
setHdCoin(59);
@@ -2352,7 +2351,6 @@
},
{
name: "STRAT - Stratis",
segwitAvailable: false,
onSelect: function() {
network = bitcoinjs.bitcoin.networks.stratis;
setHdCoin(105);
@@ -2360,7 +2358,6 @@
},
{
name: "SYS - Syscoin",
segwitAvailable: true,
onSelect: function() {
network = bitcoinjs.bitcoin.networks.syscoin;
setHdCoin(57);
@@ -2368,7 +2365,6 @@
},
{
name: "THC - Hempcoin",
segwitAvailable: false,
onSelect: function() {
network = bitcoinjs.bitcoin.networks.hempcoin;
setHdCoin(113);
@@ -2376,7 +2372,6 @@
},
{
name: "TOA - Toa",
segwitAvailable: false,
onSelect: function() {
network = bitcoinjs.bitcoin.networks.toa;
setHdCoin(159);
@@ -2384,7 +2379,6 @@
},
{
name: "USC - Ultimatesecurecash",
segwitAvailable: false,
onSelect: function() {
network = bitcoinjs.bitcoin.networks.ultimatesecurecash;
setHdCoin(112);
@@ -2392,7 +2386,6 @@
},
{
name: "USNBT - NuBits",
segwitAvailable: false,
onSelect: function() {
network = bitcoinjs.bitcoin.networks.nubits;
setHdCoin(12);
@@ -2400,7 +2393,6 @@
},
{
name: "UNO - Unobtanium",
segwitAvailable: false,
onSelect: function() {
network = bitcoinjs.bitcoin.networks.unobtanium;
setHdCoin(92);
@@ -2408,7 +2400,6 @@
},
{
name: "VASH - Vpncoin",
segwitAvailable: false,
onSelect: function() {
network = bitcoinjs.bitcoin.networks.vpncoin;
setHdCoin(33);
@@ -2416,7 +2407,6 @@
},
{
name: "VIA - Viacoin",
segwitAvailable: false,
onSelect: function() {
network = bitcoinjs.bitcoin.networks.viacoin;
setHdCoin(14);
@@ -2424,7 +2414,6 @@
},
{
name: "VIA - Viacoin Testnet",
segwitAvailable: false,
onSelect: function() {
network = bitcoinjs.bitcoin.networks.viacointestnet;
setHdCoin(1);
@@ -2432,7 +2421,6 @@
},
{
name: "VIVO - Vivo",
segwitAvailable: false,
onSelect: function() {
network = bitcoinjs.bitcoin.networks.vivo;
setHdCoin(166);
@@ -2440,7 +2428,6 @@
},
{
name: "VTC - Vertcoin",
segwitAvailable: true,
onSelect: function() {
network = bitcoinjs.bitcoin.networks.vertcoin;
setHdCoin(28);
@@ -2448,7 +2435,6 @@
},
{
name: "WC - Wincoin",
segwitAvailable: false,
onSelect: function() {
network = bitcoinjs.bitcoin.networks.wincoin;
setHdCoin(181);
@@ -2456,7 +2442,6 @@
},
{
name: "XBC - Bitcoinplus",
segwitAvailable: false,
onSelect: function() {
network = bitcoinjs.bitcoin.networks.bitcoinplus;
setHdCoin(65);
@@ -2464,7 +2449,6 @@
},
{
name: "XMY - Myriadcoin",
segwitAvailable: false,
onSelect: function() {
network = bitcoinjs.bitcoin.networks.myriadcoin;
setHdCoin(90);
@@ -2472,7 +2456,6 @@
},
{
name: "XRP - Ripple",
segwitAvailable: false,
onSelect: function() {
network = bitcoinjs.bitcoin.networks.bitcoin;
setHdCoin(144);
@@ -2480,7 +2463,6 @@
},
{
name: "XVC - Vcash",
segwitAvailable: false,
onSelect: function() {
network = bitcoinjs.bitcoin.networks.vcash;
setHdCoin(127);
@@ -2488,7 +2470,6 @@
},
{
name: "XVG - Verge",
segwitAvailable: false,
onSelect: function() {
network = bitcoinjs.bitcoin.networks.verge;
setHdCoin(77);
@@ -2504,7 +2485,6 @@
},
{
name: "XWC - Whitecoin",
segwitAvailable: false,
onSelect: function() {
network = bitcoinjs.bitcoin.networks.whitecoin;
setHdCoin(155);
@@ -2512,7 +2492,6 @@
},
{
name: "XZC - Zcoin",
segwitAvailable: true,
onSelect: function() {
network = bitcoinjs.bitcoin.networks.zcoin;
setHdCoin(136);
@@ -2520,7 +2499,6 @@
},
{
name: "ZCL - Zclassic",
segwitAvailable: false,
onSelect: function() {
network = bitcoinjs.bitcoin.networks.zclassic;
setHdCoin(147);
@@ -2528,7 +2506,6 @@
},
{
name: "ZEC - Zcash",
segwitAvailable: false,
onSelect: function() {
network = bitcoinjs.bitcoin.networks.zcash;
setHdCoin(133);
@@ -2536,7 +2513,6 @@
},
{
name: "ZEN - Zencash",
segwitAvailable: false,
onSelect: function() {
network = bitcoinjs.bitcoin.networks.zencash;
setHdCoin(121);

View File

@@ -56,9 +56,23 @@ bitcoinjs.bitcoin.networks.testnet.p2wpkhInP2sh = {
wif: 0xef
};
bitcoinjs.bitcoin.networks.litecoin.p2wpkh = {
baseNetwork: "litecoin",
messagePrefix: '\x19Litecoin Signed Message:\n',
bech32: 'ltc',
bip32: {
public: 0x04b24746,
private: 0x04b2430c
},
pubKeyHash: 0x30,
scriptHash: 0x32,
wif: 0xb0
};
bitcoinjs.bitcoin.networks.litecoin.p2wpkhInP2sh = {
baseNetwork: "litecoin",
messagePrefix: '\x19Litecoin Signed Message:\n',
bech32: 'ltc',
bip32: {
public: 0x01b26ef6,
private: 0x01b26792

View File

@@ -616,7 +616,7 @@ it('Allows selection of monacoin', function(done) {
it('Allows selection of AXE', function(done) {
var params = {
selectText: "AXE - Axe",
firstAddress: "XQ4HLxUVS3egk5ff1o9e2vJFJKSSsUH3B7",
firstAddress: "PScwtLUyPiGrqtKXrHF37DGETLXLZdw4up",
};
testNetwork(done, params);
});
@@ -1057,7 +1057,7 @@ it('Allows selection of Putincoin', function(done) {
it('Allows selection of Reddcoin', function(done) {
var params = {
selectText: "RDD - Reddcoin",
firstAddress: "1M4druAcUfkXBaAcQ4cCgCLPHChiaib6kL",
firstAddress: "RtgRvXMBng1y51ftteveFqwNfyRG18HpxQ",
};
testNetwork(done, params);
});
@@ -3692,4 +3692,61 @@ it('Does not show a warning if entropy is stronger than mnemonic length', functi
});
});
it('Shows a warning for litecoin BIP84 (which does not have p2wpkh params)', function(done) {
driver.findElement(By.css('.phrase'))
.sendKeys('abandon abandon ability');
selectNetwork("LTC - Litecoin");
driver.findElement(By.css('#bip84-tab a'))
.click()
// bip84 unavailable is shown
driver.sleep(feedbackDelay).then(function() {
driver.findElement(By.css('#bip84 .unavailable'))
.getAttribute("class")
.then(function(classes) {
expect(classes).not.toContain("hidden");
done();
});
});
});
it('Shows litecoin BIP49 addresses', function(done) {
driver.findElement(By.css('.phrase'))
.sendKeys('abandon abandon ability');
selectNetwork("LTC - Litecoin");
driver.findElement(By.css('#bip49-tab a'))
.click()
// bip49 addresses are shown
driver.sleep(generateDelay).then(function() {
driver.findElement(By.css('#bip49 .available'))
.getAttribute("class")
.then(function(classes) {
expect(classes).not.toContain("hidden");
// check first address
getFirstAddress(function(address) {
expect(address).toBe("MFwLPhsXoBuSLL8cLmW9uK6tChkzduV8qN");
done();
});
});
});
});
it('Can use root keys to generate segwit table rows', function(done) {
// segwit uses ypub / zpub instead of xpub but the root key should still
// be valid regardless of the encoding used to import that key.
// Maybe this breaks the reason for the different extended key prefixes, but
// since the parsed root key is used behind the scenes anyhow this should be
// allowed.
driver.findElement(By.css('#root-key'))
.sendKeys('xprv9s21ZrQH143K2jkGDCeTLgRewT9F2pH5JZs2zDmmjXes34geVnFiuNa8KTvY5WoYvdn4Ag6oYRoB6cXtc43NgJAEqDXf51xPm6fhiMCKwpi');
driver.findElement(By.css('#bip49-tab a'))
.click()
// bip49 addresses are shown
driver.sleep(generateDelay).then(function() {
getFirstAddress(function(address) {
expect(address).toBe("3QG2Y9AA4xZ846gKHZqNf7mvVKbLqMKxr2");
done();
});
});
});
});