Compare commits

...

12 Commits
0.3.1 ... 0.3.2

Author SHA1 Message Date
Ian Coleman
de8e5bc11f Release v0.3.2 2018-01-03 10:54:10 +11:00
Ian Coleman
5c1003dde3 Fix test for komodo 2018-01-03 10:52:39 +11:00
Ian Coleman
a78f4e280c Add csv display of addresses 2018-01-03 10:33:22 +11:00
Ian Coleman
4e9b492ca4 Add BIP84 tab 2018-01-03 09:32:14 +11:00
Ian Coleman
91eb2cbcfd Fix typo game/komodo 2017-12-20 10:48:09 +11:00
Ian Coleman
c51bb4f9e5 Add test for Onixcoin 2017-12-20 10:42:55 +11:00
iancoleman
3fa0f4cbef Merge pull request #137 from AraguaneyBits/master
Add ONX (Onixcoin)
2017-12-20 10:38:14 +11:00
jestevez
92fb39311e FIX OnixCoin Correct BIP44 Code 174 2017-12-19 21:55:28 +01:00
jestevez
d00c719932 FIX OnixCoin Correct BIP44 Code 174 2017-12-19 21:50:55 +01:00
iancoleman
ab1bd64d52 Merge pull request #142 from ca333/master
[ADD] KMD - Komodo
2017-12-13 14:15:20 +11:00
ca333
aab3645f21 [ADD] KMD - Komodo 2017-12-04 05:01:53 +01:00
jestevez
66419cf39c Add ONX (Onixcoin) 2017-11-30 20:42:49 +01:00
7 changed files with 713 additions and 78 deletions

View File

@@ -6858,6 +6858,14 @@ button.close {
top: 5px;
right: 5px;
}
.csv {
margin-top: 20px;
margin-bottom: 20px;
white-space: pre;
overflow-wrap: normal;
overflow-x: scroll;
font-family: monospace;
}
</style>
<meta content="Mnemonic code for generating deterministic keys" name="description"/>
<meta content="width=device-width, initial-scale=1.0" name="viewport" />
@@ -6869,7 +6877,7 @@ button.close {
<div class="container">
<h1 class="text-center">Mnemonic Code Converter</h1>
<p class="version">v0.3.1</p>
<p class="version">v0.3.2</p>
<hr>
<div class="row">
<div class="col-md-12">
@@ -7058,6 +7066,9 @@ button.close {
<li id="bip49-tab">
<a href="#bip49" role="tab" data-toggle="tab">BIP49</a>
</li>
<li id="bip84-tab">
<a href="#bip84" role="tab" data-toggle="tab">BIP84</a>
</li>
<li id="bip141-tab">
<a href="#bip141" role="tab" data-toggle="tab">BIP141</a>
</li>
@@ -7341,6 +7352,86 @@ button.close {
</div>
</form>
</div>
<div id="bip84" class="tab-pane">
<form class="form-horizontal" role="form">
<br>
<div class="col-sm-2"></div>
<div class="col-sm-10">
<p>
For more info see the
<a href="https://github.com/bitcoin/bips/blob/master/bip-0084.mediawiki" target="_blank">BIP84 spec</a>.
</p>
</div>
<div class="form-group">
<label for="purpose" class="col-sm-2 control-label">
Purpose
</label>
<div class="col-sm-10">
<input id="purpose" type="text" class="purpose form-control" value="84" readonly>
</div>
</div>
<div class="form-group">
<label for="coin" class="col-sm-2 control-label">
Coin
</label>
<div class="col-sm-10">
<input id="coin" type="text" class="coin form-control" value="0" readonly>
</div>
</div>
<div class="form-group">
<label for="account" class="col-sm-2 control-label">
Account
</label>
<div class="col-sm-10">
<input id="account" type="text" class="account form-control" value="0">
</div>
</div>
<div class="form-group">
<label for="change" class="col-sm-2 control-label">
External / Internal
</label>
<div class="col-sm-10">
<input id="change" type="text" class="change form-control" value="0">
</div>
</div>
<div class="form-group">
<label class="col-sm-2 control-label">
</label>
<div class="col-sm-10">
<p>The account extended keys can be used for importing to most BIP84 compatible wallets.</p>
</div>
</div>
<div class="form-group">
<label for="account-xprv" class="col-sm-2 control-label">
<span>Account Extended Private Key</span>
</label>
<div class="col-sm-10">
<textarea id="account-xprv" type="text" class="account-xprv form-control" readonly data-show-qr></textarea>
</div>
</div>
<div class="form-group">
<label for="account-xpub" class="col-sm-2 control-label">
<span>Account Extended Public Key</span>
</label>
<div class="col-sm-10">
<textarea id="account-xpub" type="text" class="account-xpub form-control" readonly data-show-qr></textarea>
</div>
</div>
<div class="form-group">
<label class="col-sm-2 control-label">
</label>
<div class="col-sm-10">
<p>The BIP32 derivation path and extended keys are the basis for the derived addresses.</p>
</div>
</div>
<div class="form-group">
<label for="bip84-path" class="col-sm-2 control-label">BIP32 Derivation Path</label>
<div class="col-sm-10">
<input id="bip84-path" type="text" class="path form-control" value="m/84'/0'/0'/0" readonly="readonly">
</div>
</div>
</form>
</div>
</div>
<form class="form-horizontal" role="form">
<div class="form-group">
@@ -7374,42 +7465,59 @@ button.close {
</label>
</div>
</div>
<div class="col-md-12">
<table class="table table-striped">
<thead>
<th>
<div class="input-group">
<span>Path</span>&nbsp;&nbsp;
<button class="index-toggle">Toggle</button>
</div>
</th>
<th>
<div class="input-group">
<span>Address</span>&nbsp;&nbsp;
<button class="address-toggle">Toggle</button>
</div>
</th>
<th>
<div class="input-group">
<span>Public Key</span>&nbsp;&nbsp;
<button class="public-key-toggle">Toggle</button>
</div>
</th>
<th>
<div class="input-group">
<span>Private Key</span>&nbsp;&nbsp;
<button class="private-key-toggle">Toggle</button>
</div>
</th>
</thead>
<tbody class="addresses monospace">
<tr><td>&nbsp;</td><td>&nbsp;</td><td>&nbsp;</td><td>&nbsp;</td></tr>
<tr><td>&nbsp;</td><td>&nbsp;</td><td>&nbsp;</td><td>&nbsp;</td></tr>
<tr><td>&nbsp;</td><td>&nbsp;</td><td>&nbsp;</td><td>&nbsp;</td></tr>
<tr><td>&nbsp;</td><td>&nbsp;</td><td>&nbsp;</td><td>&nbsp;</td></tr>
<tr><td>&nbsp;</td><td>&nbsp;</td><td>&nbsp;</td><td>&nbsp;</td></tr>
</tbody>
</table>
<ul class="addresses-type nav nav-tabs" role="tablist">
<li id="table-tab" class="active">
<a href="#table" role="tab" data-toggle="tab">Table</a>
</li>
<li id="csv-tab">
<a href="#csv" role="tab" data-toggle="tab">CSV</a>
</li>
</ul>
<div class="addresses-type tab-content">
<div id="table" class="tab-pane active">
<div class="col-md-12">
<table class="table table-striped">
<thead>
<th>
<div class="input-group">
<span>Path</span>&nbsp;&nbsp;
<button class="index-toggle">Toggle</button>
</div>
</th>
<th>
<div class="input-group">
<span>Address</span>&nbsp;&nbsp;
<button class="address-toggle">Toggle</button>
</div>
</th>
<th>
<div class="input-group">
<span>Public Key</span>&nbsp;&nbsp;
<button class="public-key-toggle">Toggle</button>
</div>
</th>
<th>
<div class="input-group">
<span>Private Key</span>&nbsp;&nbsp;
<button class="private-key-toggle">Toggle</button>
</div>
</th>
</thead>
<tbody class="addresses monospace">
<tr><td>&nbsp;</td><td>&nbsp;</td><td>&nbsp;</td><td>&nbsp;</td></tr>
<tr><td>&nbsp;</td><td>&nbsp;</td><td>&nbsp;</td><td>&nbsp;</td></tr>
<tr><td>&nbsp;</td><td>&nbsp;</td><td>&nbsp;</td><td>&nbsp;</td></tr>
<tr><td>&nbsp;</td><td>&nbsp;</td><td>&nbsp;</td><td>&nbsp;</td></tr>
<tr><td>&nbsp;</td><td>&nbsp;</td><td>&nbsp;</td><td>&nbsp;</td></tr>
</tbody>
</table>
</div>
</div>
<div id="csv" class="tab-pane">
<div class="col-md-12">
<textarea class="csv form-control" rows="25" readonly></textarea>
</div>
</div>
</div>
</div>
<span>Show</span>
@@ -50855,6 +50963,18 @@ bitcoinjs.bitcoin.networks.myriadcoin = {
wif: 0xb2
};
bitcoinjs.bitcoin.networks.onixcoin = {
messagePrefix: 'unused',
bip32: {
public: 0x049d7cb2,
private: 0x049d7878
},
pubKeyHash: 0x4B,
scriptHash: 0x05,
wif: 0x80
};
bitcoinjs.bitcoin.networks.pivx = {
messagePrefix: 'unused',
bip32: {
@@ -50942,6 +51062,17 @@ bitcoinjs.bitcoin.networks.litecoinXprv = {
scriptHash: 0x32,
wif: 0xb0
};
bitcoinjs.bitcoin.networks.komodo = {
messagePrefix: '\x18Komodo Signed Message:\n',
bip32: {
public: 0x0488B21E,
private: 0x0488ADE4
},
pubKeyHash: 0x3c,
scriptHash: 0x55,
wif: 0xbc
};
</script>
<script>(function() {
@@ -74567,6 +74698,7 @@ window.Entropy = new (function() {
DOM.bip32tab = $("#bip32-tab");
DOM.bip44tab = $("#bip44-tab");
DOM.bip49tab = $("#bip49-tab");
DOM.bip84tab = $("#bip84-tab");
DOM.bip141tab = $("#bip141-tab");
DOM.bip32panel = $("#bip32");
DOM.bip44panel = $("#bip44");
@@ -74588,6 +74720,13 @@ window.Entropy = new (function() {
DOM.bip49accountXprv = $("#bip49 .account-xprv");
DOM.bip49accountXpub = $("#bip49 .account-xpub");
DOM.bip49change = $("#bip49 .change");
DOM.bip84path = $("#bip84-path");
DOM.bip84purpose = $("#bip84 .purpose");
DOM.bip84coin = $("#bip84 .coin");
DOM.bip84account = $("#bip84 .account");
DOM.bip84accountXprv = $("#bip84 .account-xprv");
DOM.bip84accountXpub = $("#bip84 .account-xpub");
DOM.bip84change = $("#bip84 .change");
DOM.bip141unavailable = $("#bip141 .unavailable");
DOM.bip141available = $("#bip141 .available");
DOM.bip141path = $("#bip141-path");
@@ -74597,6 +74736,8 @@ window.Entropy = new (function() {
DOM.useBitpayAddressesContainer = $(".use-bitpay-addresses-container");
DOM.useBitpayAddresses = $(".use-bitpay-addresses");
DOM.addresses = $(".addresses");
DOM.csvTab = $("#csv-tab a");
DOM.csv = $(".csv");
DOM.rowsToAdd = $(".rows-to-add");
DOM.more = $(".more");
DOM.moreRowsStartIndex = $(".more-rows-start-index");
@@ -74631,6 +74772,8 @@ window.Entropy = new (function() {
DOM.bip44change.on("input", calcForDerivationPath);
DOM.bip49account.on("input", calcForDerivationPath);
DOM.bip49change.on("input", calcForDerivationPath);
DOM.bip84account.on("input", calcForDerivationPath);
DOM.bip84change.on("input", calcForDerivationPath);
DOM.bip141path.on("input", calcForDerivationPath);
DOM.bip141semantics.on("change", tabChanged);
DOM.tab.on("shown.bs.tab", tabChanged);
@@ -74639,6 +74782,7 @@ window.Entropy = new (function() {
DOM.addressToggle.on("click", toggleAddresses);
DOM.publicKeyToggle.on("click", togglePublicKeys);
DOM.privateKeyToggle.on("click", togglePrivateKeys);
DOM.csvTab.on("click", updateCsv);
DOM.languages.on("click", languageChanged);
DOM.useBitpayAddresses.on("change", useBitpayAddressesChange);
setQrEvents(DOM.showQrEls);
@@ -74871,6 +75015,9 @@ window.Entropy = new (function() {
else if (bip49TabSelected()) {
displayBip49Info();
}
else if (bip84TabSelected()) {
displayBip84Info();
}
displayBip32Info();
}
@@ -75073,6 +75220,21 @@ window.Entropy = new (function() {
console.log("Using derivation path from BIP49 tab: " + derivationPath);
return derivationPath;
}
else if (bip84TabSelected()) {
var purpose = parseIntNoNaN(DOM.bip84purpose.val(), 84);
var coin = parseIntNoNaN(DOM.bip84coin.val(), 0);
var account = parseIntNoNaN(DOM.bip84account.val(), 0);
var change = parseIntNoNaN(DOM.bip84change.val(), 0);
var path = "m/";
path += purpose + "'/";
path += coin + "'/";
path += account + "'/";
path += change;
DOM.bip84path.val(path);
var derivationPath = DOM.bip84path.val();
console.log("Using derivation path from BIP84 tab: " + derivationPath);
return derivationPath;
}
else if (bip32TabSelected()) {
var derivationPath = DOM.bip32path.val();
console.log("Using derivation path from BIP32 tab: " + derivationPath);
@@ -75173,6 +75335,24 @@ window.Entropy = new (function() {
DOM.bip49accountXpub.val(accountXpub);
}
function displayBip84Info() {
// Get the derivation path for the account
var purpose = parseIntNoNaN(DOM.bip84purpose.val(), 84);
var coin = parseIntNoNaN(DOM.bip84coin.val(), 0);
var account = parseIntNoNaN(DOM.bip84account.val(), 0);
var path = "m/";
path += purpose + "'/";
path += coin + "'/";
path += account + "'/";
// Calculate the account extended keys
var accountExtendedKey = calcBip32ExtendedKey(path);
var accountXprv = accountExtendedKey.toBase58();
var accountXpub = accountExtendedKey.neutered().toBase58();
// Display the extended keys
DOM.bip84accountXprv.val(accountXprv);
DOM.bip84accountXpub.val(accountXpub);
}
function displayBip32Info() {
// Display the key
DOM.seed.val(seed);
@@ -75213,11 +75393,12 @@ window.Entropy = new (function() {
}
function segwitSelected() {
return bip49TabSelected() || bip141TabSelected();
return bip49TabSelected() || bip84TabSelected() || bip141TabSelected();
}
function p2wpkhSelected() {
return bip141TabSelected() && DOM.bip141semantics.val() == "p2wpkh";
return bip84TabSelected() ||
bip141TabSelected() && DOM.bip141semantics.val() == "p2wpkh";
}
function p2wpkhInP2shSelected() {
@@ -75298,6 +75479,7 @@ window.Entropy = new (function() {
addAddressToList(indexText, address, pubkey, privkey);
if (isLast) {
hidePending();
updateCsv();
}
}, 50)
}
@@ -75338,6 +75520,7 @@ window.Entropy = new (function() {
function clearAddressesList() {
DOM.addresses.empty();
DOM.csv.val("");
stopGenerating();
}
@@ -75798,6 +75981,10 @@ window.Entropy = new (function() {
return DOM.bip49tab.hasClass("active");
}
function bip84TabSelected() {
return DOM.bip84tab.hasClass("active");
}
function bip141TabSelected() {
return DOM.bip141tab.hasClass("active");
}
@@ -75805,6 +75992,7 @@ window.Entropy = new (function() {
function setHdCoin(coinValue) {
DOM.bip44coin.val(coinValue);
DOM.bip49coin.val(coinValue);
DOM.bip84coin.val(coinValue);
}
function showSegwitAvailable() {
@@ -75888,6 +76076,26 @@ window.Entropy = new (function() {
DOM.entropyWordIndexes.text(wordIndexesStr);
}
function updateCsv() {
var tableCsv = "path,address,public key,private key\n";
var rows = DOM.addresses.find("tr");
for (var i=0; i<rows.length; i++) {
var row = $(rows[i]);
var cells = row.find("td");
for (var j=0; j<cells.length; j++) {
var cell = $(cells[j]);
if (!cell.children().hasClass("invisible")) {
tableCsv = tableCsv + cell.text();
}
if (j != cells.length - 1) {
tableCsv = tableCsv + ",";
}
}
tableCsv = tableCsv + "\n";
}
DOM.csv.val(tableCsv);
}
var networks = [
{
name: "BCH - Bitcoin Cash",
@@ -75994,6 +76202,14 @@ window.Entropy = new (function() {
setHdCoin(26);
},
},
{
name: "KMD - Komodo",
bip49available: false,
onSelect: function() {
network = bitcoinjs.bitcoin.networks.komodo;
setHdCoin(141);
},
},
{
name: "LTC - Litecoin",
segwitAvailable: true,
@@ -76027,6 +76243,14 @@ window.Entropy = new (function() {
setHdCoin(7);
},
},
{
name: "ONX - Onixcoin",
segwitAvailable: false,
onSelect: function() {
network = bitcoinjs.bitcoin.networks.onixcoin;
setHdCoin(174);
},
},
{
name: "PIVX - PIVX",
segwitAvailable: false,

View File

@@ -1,3 +1,10 @@
# 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

View File

@@ -95,3 +95,11 @@ body {
top: 5px;
right: 5px;
}
.csv {
margin-top: 20px;
margin-bottom: 20px;
white-space: pre;
overflow-wrap: normal;
overflow-x: scroll;
font-family: monospace;
}

View File

@@ -15,7 +15,7 @@
<div class="container">
<h1 class="text-center">Mnemonic Code Converter</h1>
<p class="version">v0.3.1</p>
<p class="version">v0.3.2</p>
<hr>
<div class="row">
<div class="col-md-12">
@@ -204,6 +204,9 @@
<li id="bip49-tab">
<a href="#bip49" role="tab" data-toggle="tab">BIP49</a>
</li>
<li id="bip84-tab">
<a href="#bip84" role="tab" data-toggle="tab">BIP84</a>
</li>
<li id="bip141-tab">
<a href="#bip141" role="tab" data-toggle="tab">BIP141</a>
</li>
@@ -487,6 +490,86 @@
</div>
</form>
</div>
<div id="bip84" class="tab-pane">
<form class="form-horizontal" role="form">
<br>
<div class="col-sm-2"></div>
<div class="col-sm-10">
<p>
For more info see the
<a href="https://github.com/bitcoin/bips/blob/master/bip-0084.mediawiki" target="_blank">BIP84 spec</a>.
</p>
</div>
<div class="form-group">
<label for="purpose" class="col-sm-2 control-label">
Purpose
</label>
<div class="col-sm-10">
<input id="purpose" type="text" class="purpose form-control" value="84" readonly>
</div>
</div>
<div class="form-group">
<label for="coin" class="col-sm-2 control-label">
Coin
</label>
<div class="col-sm-10">
<input id="coin" type="text" class="coin form-control" value="0" readonly>
</div>
</div>
<div class="form-group">
<label for="account" class="col-sm-2 control-label">
Account
</label>
<div class="col-sm-10">
<input id="account" type="text" class="account form-control" value="0">
</div>
</div>
<div class="form-group">
<label for="change" class="col-sm-2 control-label">
External / Internal
</label>
<div class="col-sm-10">
<input id="change" type="text" class="change form-control" value="0">
</div>
</div>
<div class="form-group">
<label class="col-sm-2 control-label">
</label>
<div class="col-sm-10">
<p>The account extended keys can be used for importing to most BIP84 compatible wallets.</p>
</div>
</div>
<div class="form-group">
<label for="account-xprv" class="col-sm-2 control-label">
<span>Account Extended Private Key</span>
</label>
<div class="col-sm-10">
<textarea id="account-xprv" type="text" class="account-xprv form-control" readonly data-show-qr></textarea>
</div>
</div>
<div class="form-group">
<label for="account-xpub" class="col-sm-2 control-label">
<span>Account Extended Public Key</span>
</label>
<div class="col-sm-10">
<textarea id="account-xpub" type="text" class="account-xpub form-control" readonly data-show-qr></textarea>
</div>
</div>
<div class="form-group">
<label class="col-sm-2 control-label">
</label>
<div class="col-sm-10">
<p>The BIP32 derivation path and extended keys are the basis for the derived addresses.</p>
</div>
</div>
<div class="form-group">
<label for="bip84-path" class="col-sm-2 control-label">BIP32 Derivation Path</label>
<div class="col-sm-10">
<input id="bip84-path" type="text" class="path form-control" value="m/84'/0'/0'/0" readonly="readonly">
</div>
</div>
</form>
</div>
</div>
<form class="form-horizontal" role="form">
<div class="form-group">
@@ -520,42 +603,59 @@
</label>
</div>
</div>
<div class="col-md-12">
<table class="table table-striped">
<thead>
<th>
<div class="input-group">
<span>Path</span>&nbsp;&nbsp;
<button class="index-toggle">Toggle</button>
</div>
</th>
<th>
<div class="input-group">
<span>Address</span>&nbsp;&nbsp;
<button class="address-toggle">Toggle</button>
</div>
</th>
<th>
<div class="input-group">
<span>Public Key</span>&nbsp;&nbsp;
<button class="public-key-toggle">Toggle</button>
</div>
</th>
<th>
<div class="input-group">
<span>Private Key</span>&nbsp;&nbsp;
<button class="private-key-toggle">Toggle</button>
</div>
</th>
</thead>
<tbody class="addresses monospace">
<tr><td>&nbsp;</td><td>&nbsp;</td><td>&nbsp;</td><td>&nbsp;</td></tr>
<tr><td>&nbsp;</td><td>&nbsp;</td><td>&nbsp;</td><td>&nbsp;</td></tr>
<tr><td>&nbsp;</td><td>&nbsp;</td><td>&nbsp;</td><td>&nbsp;</td></tr>
<tr><td>&nbsp;</td><td>&nbsp;</td><td>&nbsp;</td><td>&nbsp;</td></tr>
<tr><td>&nbsp;</td><td>&nbsp;</td><td>&nbsp;</td><td>&nbsp;</td></tr>
</tbody>
</table>
<ul class="addresses-type nav nav-tabs" role="tablist">
<li id="table-tab" class="active">
<a href="#table" role="tab" data-toggle="tab">Table</a>
</li>
<li id="csv-tab">
<a href="#csv" role="tab" data-toggle="tab">CSV</a>
</li>
</ul>
<div class="addresses-type tab-content">
<div id="table" class="tab-pane active">
<div class="col-md-12">
<table class="table table-striped">
<thead>
<th>
<div class="input-group">
<span>Path</span>&nbsp;&nbsp;
<button class="index-toggle">Toggle</button>
</div>
</th>
<th>
<div class="input-group">
<span>Address</span>&nbsp;&nbsp;
<button class="address-toggle">Toggle</button>
</div>
</th>
<th>
<div class="input-group">
<span>Public Key</span>&nbsp;&nbsp;
<button class="public-key-toggle">Toggle</button>
</div>
</th>
<th>
<div class="input-group">
<span>Private Key</span>&nbsp;&nbsp;
<button class="private-key-toggle">Toggle</button>
</div>
</th>
</thead>
<tbody class="addresses monospace">
<tr><td>&nbsp;</td><td>&nbsp;</td><td>&nbsp;</td><td>&nbsp;</td></tr>
<tr><td>&nbsp;</td><td>&nbsp;</td><td>&nbsp;</td><td>&nbsp;</td></tr>
<tr><td>&nbsp;</td><td>&nbsp;</td><td>&nbsp;</td><td>&nbsp;</td></tr>
<tr><td>&nbsp;</td><td>&nbsp;</td><td>&nbsp;</td><td>&nbsp;</td></tr>
<tr><td>&nbsp;</td><td>&nbsp;</td><td>&nbsp;</td><td>&nbsp;</td></tr>
</tbody>
</table>
</div>
</div>
<div id="csv" class="tab-pane">
<div class="col-md-12">
<textarea class="csv form-control" rows="25" readonly></textarea>
</div>
</div>
</div>
</div>
<span>Show</span>

View File

@@ -207,6 +207,18 @@ bitcoinjs.bitcoin.networks.myriadcoin = {
wif: 0xb2
};
bitcoinjs.bitcoin.networks.onixcoin = {
messagePrefix: 'unused',
bip32: {
public: 0x049d7cb2,
private: 0x049d7878
},
pubKeyHash: 0x4B,
scriptHash: 0x05,
wif: 0x80
};
bitcoinjs.bitcoin.networks.pivx = {
messagePrefix: 'unused',
bip32: {
@@ -294,3 +306,14 @@ bitcoinjs.bitcoin.networks.litecoinXprv = {
scriptHash: 0x32,
wif: 0xb0
};
bitcoinjs.bitcoin.networks.komodo = {
messagePrefix: '\x18Komodo Signed Message:\n',
bip32: {
public: 0x0488B21E,
private: 0x0488ADE4
},
pubKeyHash: 0x3c,
scriptHash: 0x55,
wif: 0xbc
};

View File

@@ -53,6 +53,7 @@
DOM.bip32tab = $("#bip32-tab");
DOM.bip44tab = $("#bip44-tab");
DOM.bip49tab = $("#bip49-tab");
DOM.bip84tab = $("#bip84-tab");
DOM.bip141tab = $("#bip141-tab");
DOM.bip32panel = $("#bip32");
DOM.bip44panel = $("#bip44");
@@ -74,6 +75,13 @@
DOM.bip49accountXprv = $("#bip49 .account-xprv");
DOM.bip49accountXpub = $("#bip49 .account-xpub");
DOM.bip49change = $("#bip49 .change");
DOM.bip84path = $("#bip84-path");
DOM.bip84purpose = $("#bip84 .purpose");
DOM.bip84coin = $("#bip84 .coin");
DOM.bip84account = $("#bip84 .account");
DOM.bip84accountXprv = $("#bip84 .account-xprv");
DOM.bip84accountXpub = $("#bip84 .account-xpub");
DOM.bip84change = $("#bip84 .change");
DOM.bip141unavailable = $("#bip141 .unavailable");
DOM.bip141available = $("#bip141 .available");
DOM.bip141path = $("#bip141-path");
@@ -83,6 +91,8 @@
DOM.useBitpayAddressesContainer = $(".use-bitpay-addresses-container");
DOM.useBitpayAddresses = $(".use-bitpay-addresses");
DOM.addresses = $(".addresses");
DOM.csvTab = $("#csv-tab a");
DOM.csv = $(".csv");
DOM.rowsToAdd = $(".rows-to-add");
DOM.more = $(".more");
DOM.moreRowsStartIndex = $(".more-rows-start-index");
@@ -117,6 +127,8 @@
DOM.bip44change.on("input", calcForDerivationPath);
DOM.bip49account.on("input", calcForDerivationPath);
DOM.bip49change.on("input", calcForDerivationPath);
DOM.bip84account.on("input", calcForDerivationPath);
DOM.bip84change.on("input", calcForDerivationPath);
DOM.bip141path.on("input", calcForDerivationPath);
DOM.bip141semantics.on("change", tabChanged);
DOM.tab.on("shown.bs.tab", tabChanged);
@@ -125,6 +137,7 @@
DOM.addressToggle.on("click", toggleAddresses);
DOM.publicKeyToggle.on("click", togglePublicKeys);
DOM.privateKeyToggle.on("click", togglePrivateKeys);
DOM.csvTab.on("click", updateCsv);
DOM.languages.on("click", languageChanged);
DOM.useBitpayAddresses.on("change", useBitpayAddressesChange);
setQrEvents(DOM.showQrEls);
@@ -357,6 +370,9 @@
else if (bip49TabSelected()) {
displayBip49Info();
}
else if (bip84TabSelected()) {
displayBip84Info();
}
displayBip32Info();
}
@@ -559,6 +575,21 @@
console.log("Using derivation path from BIP49 tab: " + derivationPath);
return derivationPath;
}
else if (bip84TabSelected()) {
var purpose = parseIntNoNaN(DOM.bip84purpose.val(), 84);
var coin = parseIntNoNaN(DOM.bip84coin.val(), 0);
var account = parseIntNoNaN(DOM.bip84account.val(), 0);
var change = parseIntNoNaN(DOM.bip84change.val(), 0);
var path = "m/";
path += purpose + "'/";
path += coin + "'/";
path += account + "'/";
path += change;
DOM.bip84path.val(path);
var derivationPath = DOM.bip84path.val();
console.log("Using derivation path from BIP84 tab: " + derivationPath);
return derivationPath;
}
else if (bip32TabSelected()) {
var derivationPath = DOM.bip32path.val();
console.log("Using derivation path from BIP32 tab: " + derivationPath);
@@ -659,6 +690,24 @@
DOM.bip49accountXpub.val(accountXpub);
}
function displayBip84Info() {
// Get the derivation path for the account
var purpose = parseIntNoNaN(DOM.bip84purpose.val(), 84);
var coin = parseIntNoNaN(DOM.bip84coin.val(), 0);
var account = parseIntNoNaN(DOM.bip84account.val(), 0);
var path = "m/";
path += purpose + "'/";
path += coin + "'/";
path += account + "'/";
// Calculate the account extended keys
var accountExtendedKey = calcBip32ExtendedKey(path);
var accountXprv = accountExtendedKey.toBase58();
var accountXpub = accountExtendedKey.neutered().toBase58();
// Display the extended keys
DOM.bip84accountXprv.val(accountXprv);
DOM.bip84accountXpub.val(accountXpub);
}
function displayBip32Info() {
// Display the key
DOM.seed.val(seed);
@@ -699,11 +748,12 @@
}
function segwitSelected() {
return bip49TabSelected() || bip141TabSelected();
return bip49TabSelected() || bip84TabSelected() || bip141TabSelected();
}
function p2wpkhSelected() {
return bip141TabSelected() && DOM.bip141semantics.val() == "p2wpkh";
return bip84TabSelected() ||
bip141TabSelected() && DOM.bip141semantics.val() == "p2wpkh";
}
function p2wpkhInP2shSelected() {
@@ -784,6 +834,7 @@
addAddressToList(indexText, address, pubkey, privkey);
if (isLast) {
hidePending();
updateCsv();
}
}, 50)
}
@@ -824,6 +875,7 @@
function clearAddressesList() {
DOM.addresses.empty();
DOM.csv.val("");
stopGenerating();
}
@@ -1284,6 +1336,10 @@
return DOM.bip49tab.hasClass("active");
}
function bip84TabSelected() {
return DOM.bip84tab.hasClass("active");
}
function bip141TabSelected() {
return DOM.bip141tab.hasClass("active");
}
@@ -1291,6 +1347,7 @@
function setHdCoin(coinValue) {
DOM.bip44coin.val(coinValue);
DOM.bip49coin.val(coinValue);
DOM.bip84coin.val(coinValue);
}
function showSegwitAvailable() {
@@ -1374,6 +1431,26 @@
DOM.entropyWordIndexes.text(wordIndexesStr);
}
function updateCsv() {
var tableCsv = "path,address,public key,private key\n";
var rows = DOM.addresses.find("tr");
for (var i=0; i<rows.length; i++) {
var row = $(rows[i]);
var cells = row.find("td");
for (var j=0; j<cells.length; j++) {
var cell = $(cells[j]);
if (!cell.children().hasClass("invisible")) {
tableCsv = tableCsv + cell.text();
}
if (j != cells.length - 1) {
tableCsv = tableCsv + ",";
}
}
tableCsv = tableCsv + "\n";
}
DOM.csv.val(tableCsv);
}
var networks = [
{
name: "BCH - Bitcoin Cash",
@@ -1480,6 +1557,14 @@
setHdCoin(26);
},
},
{
name: "KMD - Komodo",
bip49available: false,
onSelect: function() {
network = bitcoinjs.bitcoin.networks.komodo;
setHdCoin(141);
},
},
{
name: "LTC - Litecoin",
segwitAvailable: true,
@@ -1513,6 +1598,14 @@
setHdCoin(7);
},
},
{
name: "ONX - Onixcoin",
segwitAvailable: false,
onSelect: function() {
network = bitcoinjs.bitcoin.networks.onixcoin;
setHdCoin(174);
},
},
{
name: "PIVX - PIVX",
segwitAvailable: false,

View File

@@ -492,6 +492,13 @@ it('Allows selection of game', function(done) {
};
testNetwork(done, params);
});
it('Allows selection of komodo', function(done) {
var params = {
selectText: "KMD - Komodo",
firstAddress: "RMPPzJwAjPVZZAwJvXivHJGGjdCx6WBD2t",
};
testNetwork(done, params);
});
it('Allows selection of namecoin', function(done) {
var params = {
selectText: "NMC - Namecoin",
@@ -499,6 +506,13 @@ it('Allows selection of namecoin', function(done) {
};
testNetwork(done, params);
});
it('Allows selection of onixcoin', function(done) {
var params = {
selectText: "ONX - Onixcoin",
firstAddress: "XGwMqddeKjT3ddgX73QokjVbCL3aK6Yxfk",
};
testNetwork(done, params);
});
it('Allows selection of peercoin', function(done) {
var params = {
selectText: "PPC - Peercoin",
@@ -2670,4 +2684,170 @@ it('Shows the index of each word in the mnemonic', function(done) {
});
});
it('Shows the derivation path for bip84 tab', function(done) {
driver.findElement(By.css('#bip84-tab a'))
.click()
driver.findElement(By.css('.phrase'))
.sendKeys('abandon abandon ability');
driver.sleep(generateDelay).then(function() {
driver.findElement(By.css('#bip84 .path'))
.getAttribute("value")
.then(function(path) {
expect(path).toBe("m/84'/0'/0'/0");
done();
})
});
});
it('Shows the extended private key for bip84 tab', function(done) {
driver.findElement(By.css('#bip84-tab a'))
.click()
driver.findElement(By.css('.phrase'))
.sendKeys('abandon abandon ability');
driver.sleep(generateDelay).then(function() {
driver.findElement(By.css('.extended-priv-key'))
.getAttribute("value")
.then(function(path) {
expect(path).toBe("zprvAev3RKrZ3QVKiUFCfdeMRen1BPDJgdNt1XpxiDy8acSs4kkAGTCvq7HeRYRNNpo8EtEjCFQBWavJwtCUR29y4TUCH4X5RXMcyq48uN8y9BP");
done();
})
});
});
it('Shows the extended public key for bip84 tab', function(done) {
driver.findElement(By.css('#bip84-tab a'))
.click()
driver.findElement(By.css('.phrase'))
.sendKeys('abandon abandon ability');
driver.sleep(generateDelay).then(function() {
driver.findElement(By.css('.extended-pub-key'))
.getAttribute("value")
.then(function(path) {
expect(path).toBe("zpub6suPpqPSsn3cvxKfmfBMnnijjR3o666jNkkZWcNk8wyqwZ5JozXBNuc8Gs7DB3uLwTDvGVTspVEAUQcEjKF3pZHgywVbubdTqbXTUg7usyx");
done();
})
});
});
it('Changes the address list if bip84 account is changed', function(done) {
driver.findElement(By.css('#bip84-tab a'))
.click()
driver.findElement(By.css('#bip84 .account'))
.sendKeys('1');
driver.findElement(By.css('.phrase'))
.sendKeys('abandon abandon ability');
driver.sleep(generateDelay).then(function() {
getFirstAddress(function(address) {
expect(address).toBe("bc1qp7vv669t2fy965jdzvqwrraana89ctd5ewc662");
done();
});
});
});
it('Changes the address list if bip84 change is changed', function(done) {
driver.findElement(By.css('#bip84-tab a'))
.click()
driver.findElement(By.css('#bip84 .change'))
.sendKeys('1');
driver.findElement(By.css('.phrase'))
.sendKeys('abandon abandon ability');
driver.sleep(generateDelay).then(function() {
getFirstAddress(function(address) {
expect(address).toBe("bc1qr39vj6rh06ff05m53uxq8uazehwhccswylhrs2");
done();
});
});
});
it('Passes the official BIP84 test spec for rootpriv', function(done) {
driver.findElement(By.css('#bip84-tab a'))
.click()
driver.findElement(By.css('.phrase'))
.sendKeys('abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon about');
driver.sleep(generateDelay).then(function() {
driver.findElement(By.css(".root-key"))
.getAttribute("value")
.then(function(rootKey) {
expect(rootKey).toBe("zprvAWgYBBk7JR8Gjrh4UJQ2uJdG1r3WNRRfURiABBE3RvMXYSrRJL62XuezvGdPvG6GFBZduosCc1YP5wixPox7zhZLfiUm8aunE96BBa4Kei5");
done();
})
});
});
it('Passes the official BIP84 test spec for account 0 xprv', function(done) {
driver.findElement(By.css('#bip84-tab a'))
.click()
driver.findElement(By.css('.phrase'))
.sendKeys('abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon about');
driver.sleep(generateDelay).then(function() {
driver.findElement(By.css("#bip84 .account-xprv"))
.getAttribute("value")
.then(function(rootKey) {
expect(rootKey).toBe("zprvAdG4iTXWBoARxkkzNpNh8r6Qag3irQB8PzEMkAFeTRXxHpbF9z4QgEvBRmfvqWvGp42t42nvgGpNgYSJA9iefm1yYNZKEm7z6qUWCroSQnE");
done();
})
});
});
it('Passes the official BIP84 test spec for account 0 xpub', function(done) {
driver.findElement(By.css('#bip84-tab a'))
.click()
driver.findElement(By.css('.phrase'))
.sendKeys('abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon about');
driver.sleep(generateDelay).then(function() {
driver.findElement(By.css("#bip84 .account-xpub"))
.getAttribute("value")
.then(function(rootKey) {
expect(rootKey).toBe("zpub6rFR7y4Q2AijBEqTUquhVz398htDFrtymD9xYYfG1m4wAcvPhXNfE3EfH1r1ADqtfSdVCToUG868RvUUkgDKf31mGDtKsAYz2oz2AGutZYs");
done();
})
});
});
it('Passes the official BIP84 test spec for account 0 first address', function(done) {
driver.findElement(By.css('#bip84-tab a'))
.click()
driver.findElement(By.css('.phrase'))
.sendKeys('abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon about');
driver.sleep(generateDelay).then(function() {
getFirstAddress(function(address) {
expect(address).toBe("bc1qcr8te4kr609gcawutmrza0j4xv80jy8z306fyu");
done();
});
});
});
it('Passes the official BIP84 test spec for account 0 first change address', function(done) {
driver.findElement(By.css('#bip84-tab a'))
.click()
driver.findElement(By.css('.phrase'))
.sendKeys('abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon about');
driver.findElement(By.css('#bip84 .change'))
.sendKeys('1');
driver.sleep(generateDelay).then(function() {
getFirstAddress(function(address) {
expect(address).toBe("bc1q8c6fshw2dlwun7ekn9qwf37cu2rn755upcp6el");
done();
});
});
});
it('Can display the table as csv', function(done) {
var headings = "path,address,public key,private key";
var row1 = "m/44'/0'/0'/0/0,1Di3Vp7tBWtyQaDABLAjfWtF6V7hYKJtug,033f5aed5f6cfbafaf223188095b5980814897295f723815fea5d3f4b648d0d0b3,L26cVSpWFkJ6aQkPkKmTzLqTdLJ923e6CzrVh9cmx21QHsoUmrEE";
var row20 = "m/44'/0'/0'/0/19,1KhBy28XLAciXnnRvm71PvQJaETyrxGV55,02b4b3e396434d8cdd20c03ac4aaa07387784d5d867b75987f516f5705ee68cb3a,L4GrDrjReMsCAu5DkLXn79jSb95qR7Zfx7eshybCQZ1qL32MXJab";
driver.findElement(By.css('.phrase'))
.sendKeys('abandon abandon ability');
driver.sleep(generateDelay).then(function() {
driver.findElement(By.css('.csv'))
.getAttribute("value")
.then(function(csv) {
expect(csv).toContain(headings);
expect(csv).toContain(row1);
expect(csv).toContain(row20);
done();
});
});
});
});