Compare commits

..

20 Commits
0.2.4 ... 0.2.6

Author SHA1 Message Date
Ian Coleman
9ff30babbc Release v0.2.6 2017-09-20 11:39:06 +10:00
Ian Coleman
ee0981f1ec Detect and warn of filtered entropy 2017-09-20 11:25:21 +10:00
Ian Coleman
6024e655a8 Update process for committing changes
Do not include changes in bip39-standalone.html
2017-09-19 11:15:25 +10:00
Ian Coleman
7e6bdc498e Reword entropy text to say one type, not multiple 2017-09-19 11:13:03 +10:00
iancoleman
16b4c2788a Merge pull request #117 from jonathancross/iancoleman-bip39-bip49
Adding BIP 49 to "More info" section.
2017-09-19 10:32:20 +10:00
iancoleman
0197de2795 Merge pull request #116 from jonathancross/iancoleman-bip39-compile
Allowing compilation with Python 2.x
2017-09-19 10:26:32 +10:00
Jonathan Cross
861750ae51 Adding BIP 49 to "More info" section. 2017-09-18 02:18:51 +02:00
Jonathan Cross
a40d59d904 Allowing compilation with Python 2.x and 3. 2017-09-18 01:57:05 +02:00
iancoleman
d933c3f731 Merge pull request #103 from Zwilla/patch-3
correctLevel from 2 to 3
2017-09-08 08:12:34 +10:00
iancoleman
408ecc184a Merge pull request #102 from Zwilla/patch-2
remove sourceMappingURL=zxcvbn.js.map
2017-09-08 08:07:51 +10:00
Zwilla
00114002fe correctLevel from 2 to 3
correctLevel 3 is generally recommended for industrial environments.

See also: https://github.com/iancoleman/bip39/issues/101
2017-09-07 14:32:42 +02:00
Zwilla
e80955983d remove sourceMappingURL=zxcvbn.js.map
just remove this line, if not every time we run the converter it searches for the map file. It is not enough to uncomment this line.
thx
2017-09-07 09:42:54 +02:00
iancoleman
f20b7e7128 Merge pull request #98 from Zwilla/patch-1
changed some wrong comma and ;
2017-09-04 10:03:05 +10:00
Zwilla
908dc06fe8 changed some wrong comma and ;
nothing else
2017-09-04 01:55:55 +02:00
Ian Coleman
3d548c6f9b Improve release process order and add details 2017-09-01 13:20:29 +10:00
Ian Coleman
0a8d06d03e Release v0.2.5 2017-09-01 12:35:42 +10:00
Ian Coleman
88311463c7 Allow P2WPKH nested in P2SH addresses on BIP32 tab 2017-09-01 12:28:27 +10:00
Ian Coleman
cd7c8327b1 Validate root key correctly for alternate networks 2017-09-01 12:27:03 +10:00
Ian Coleman
0cda44d5f6 Rename bip49 to p2wpkhNestedInP2sh where suitable 2017-09-01 12:25:45 +10:00
Ian Coleman
7258b102c1 Add confirmation steps to the release process 2017-08-28 10:03:21 +10:00
11 changed files with 347 additions and 170 deletions

View File

@@ -118,7 +118,7 @@
<div class="container">
<h1 class="text-center">Mnemonic Code Converter</h1>
<p class="version">v0.2.4</p>
<p class="version">v0.2.6</p>
<hr>
<div class="row">
<div class="col-md-12">
@@ -167,7 +167,14 @@
<div class="form-group">
<label for="entropy" class="col-sm-2 control-label" data-translate>Entropy</label>
<div class="col-sm-7">
<textarea id="entropy" rows="2" class="entropy form-control" placeholder="Accepts binary, base 6, 6-sided dice, base 10, hexadecimal, cards" data-translate-placeholder></textarea>
<textarea id="entropy" rows="2" class="entropy form-control" placeholder="Accepts either binary, base 6, 6-sided dice, base 10, hexadecimal or cards" data-translate-placeholder></textarea>
<div class="row filter-warning text-danger hidden">
<p class="col-sm-12">
<strong>
Some characters have been discarded
</strong>
</p>
</div>
<div class="row">
<label class="col-sm-3 control-label" data-translate><span class="more-info" data-translate-title title="Based on estimates from zxcvbn using Filtered Entropy">Time To Crack</span></label>
<div class="crack-time col-sm-3 form-control-static"></div>
@@ -412,6 +419,13 @@
<span data-translate>Use hardened addresses</span>
</label>
</div>
<div class="form-group">
<div class="col-sm-2"></div>
<label class="col-sm-10">
<input class="p2wpkh-nested-in-p2sh" type="checkbox">
<span data-translate>Use SegWit addresses (ie P2WPKH Nested In P2SH)</span>
</label>
</div>
<div class="form-group">
<label for="core-path" class="col-sm-2 control-label" data-translate>Bitcoin Core</label>
<div class="col-sm-10">
@@ -630,6 +644,11 @@
Read more at the
<a href="https://github.com/bitcoin/bips/blob/master/bip-0044.mediawiki" target="_blank">official BIP44 spec</a>
</p>
<h3>BIP49 <span class="small" data-translate>Derivation scheme for P2WPKH-nested-in-P2SH based accounts</span></h3>
<p data-translate-html>
Read more at the
<a href="https://github.com/bitcoin/bips/blob/master/bip-0049.mediawiki" target="_blank">official BIP49 spec</a>
</p>
<h3 data-translate>Private Keys</h3>
<p>
<span data-translate-html>
@@ -7280,7 +7299,7 @@ this.getLength()-a.getLength())return this;for(var c=l.glog(this.get(0))-l.glog(
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),
correctLevel:3,background:"#ffffff",foreground:"#000000"},h);return this.each(function(){var a;if("canvas"==h.render){a=new o(h.typeNumber,h.correctLevel);a.addData(h.text);a.make();var c=document.createElement("canvas");c.width=h.width;c.height=h.height;for(var d=c.getContext("2d"),b=h.width/a.getModuleCount(),e=h.height/a.getModuleCount(),f=0;f<a.getModuleCount();f++)for(var i=0;i<a.getModuleCount();i++){d.fillStyle=a.isDark(f,i)?h.foreground:h.background;var g=Math.ceil((i+1)*b)-Math.floor(i*b),
j=Math.ceil((f+1)*b)-Math.floor(f*b);d.fillRect(Math.round(i*b),Math.round(f*e),g,j)}}else{a=new o(h.typeNumber,h.correctLevel);a.addData(h.text);a.make();c=r("<table></table>").css("width",h.width+"px").css("height",h.height+"px").css("border","0px").css("border-collapse","collapse").css("background-color",h.background);d=h.width/a.getModuleCount();b=h.height/a.getModuleCount();for(e=0;e<a.getModuleCount();e++){f=r("<tr></tr>").css("height",b+"px").appendTo(c);for(i=0;i<a.getModuleCount();i++)r("<td></td>").css("width",
d+"px").css("background-color",a.isDark(e,i)?h.foreground:h.background).appendTo(f)}}a=c;$(a).appendTo(this)})}})($);
</script>
@@ -22126,135 +22145,135 @@ module.exports = {
});
</script>
<script>bitcoinjs.bitcoin.networks.shadow = {
messagePrefix: "unused",
messagePrefix: 'unused',
bip32: {
public: 0xEE80286A,
private: 0xEE8031E8
},
pubKeyHash: 0x3f,
scriptHash: 0x7d,
wif: 0xbf,
wif: 0xbf
};
bitcoinjs.bitcoin.networks.shadowtn = {
messagePrefix: "unused",
messagePrefix: 'unused',
bip32: {
public: 0x76C0FDFB,
private: 0x76C1077A
},
pubKeyHash: 0x7f,
scriptHash: 0xc4,
wif: 0xff,
wif: 0xff
};
bitcoinjs.bitcoin.networks.clam = {
messagePrefix: "unused",
messagePrefix: 'unused',
bip32: {
public: 0xa8c26d64,
private: 0xa8c17826
},
pubKeyHash: 0x89,
scriptHash: 0x00, // TODO set this correctly
wif: 0x85,
wif: 0x85
};
bitcoinjs.bitcoin.networks.crown = {
messagePrefix: "unused",
messagePrefix: 'unused',
bip32: {
public: 0x0488b21e,
private: 0x0488ade4
},
pubKeyHash: 0x00,
scriptHash: 0x05,
wif: 0x80,
wif: 0x80
};
bitcoinjs.bitcoin.networks.dash = {
messagePrefix: "unused",
messagePrefix: 'unused',
bip32: {
public: 0x0488b21e,
private: 0x0488ade4
},
pubKeyHash: 0x4c,
scriptHash: 0x10,
wif: 0xcc,
wif: 0xcc
};
bitcoinjs.bitcoin.networks.maza = {
messagePrefix: "unused",
messagePrefix: 'unused',
bip32: {
public: 0x0488b21e,
private: 0x0488ade4
},
pubKeyHash: 0x32,
scriptHash: 0x09,
wif: 0xe0,
wif: 0xe0
};
bitcoinjs.bitcoin.networks.dashtn = {
messagePrefix: "unused",
messagePrefix: 'unused',
bip32: {
public: 0x043587cf,
private: 0x04358394
},
pubKeyHash: 0x8c,
scriptHash: 0x13,
wif: 0xef,
wif: 0xef
};
bitcoinjs.bitcoin.networks.game = {
messagePrefix: "unused",
messagePrefix: 'unused',
bip32: {
public: 0x0488b21e,
private: 0x0488ade4
},
pubKeyHash: 0x26,
scriptHash: 0x05,
wif: 0xa6,
wif: 0xa6
};
bitcoinjs.bitcoin.networks.namecoin = {
messagePrefix: "unused",
messagePrefix: 'unused',
bip32: {
public: 0x0488b21e,
private: 0x0488ade4
},
pubKeyHash: 0x34,
scriptHash: 0x00, // TODO set this correctly
wif: 0x80,
wif: 0x80
};
bitcoinjs.bitcoin.networks.peercoin = {
messagePrefix: "unused",
messagePrefix: 'unused',
bip32: {
public: 0x0488b21e,
private: 0x0488ade4
},
pubKeyHash: 0x37,
scriptHash: 0x00, // TODO set this correctly
wif: 0xb7,
wif: 0xb7
};
bitcoinjs.bitcoin.networks.slimcoin = {
messagePrefix: "unused",
messagePrefix: 'unused',
bip32: {
public: 0xef6adf10,
private: 0xef69ea80
},
pubKeyHash: 0x3f,
scriptHash: 0x7d,
wif: 0x46,
wif: 0x46
};
bitcoinjs.bitcoin.networks.slimcointn = {
messagePrefix: "unused",
messagePrefix: 'unused',
bip32: {
public: 0x043587CF,
private: 0x04358394
},
pubKeyHash: 0x6f,
scriptHash: 0xc4,
wif: 0x57,
wif: 0x57
};
bitcoinjs.bitcoin.networks.dogecoin = {
@@ -22265,8 +22284,8 @@ bitcoinjs.bitcoin.networks.dogecoin = {
},
pubKeyHash: 0x1e,
scriptHash: 0x16,
wif: 0x9e,
},
wif: 0x9e
};
bitcoinjs.bitcoin.networks.viacoin = {
messagePrefix: '\x18Viacoin Signed Message:\n',
@@ -22276,8 +22295,8 @@ bitcoinjs.bitcoin.networks.viacoin = {
},
pubKeyHash: 0x47,
scriptHash: 0x21,
wif: 0xc7,
},
wif: 0xc7
};
bitcoinjs.bitcoin.networks.viacointestnet = {
messagePrefix: '\x18Viacoin Signed Message:\n',
@@ -22287,8 +22306,8 @@ bitcoinjs.bitcoin.networks.viacointestnet = {
},
pubKeyHash: 0x7f,
scriptHash: 0xc4,
wif: 0xff,
},
wif: 0xff
};
bitcoinjs.bitcoin.networks.gamerscoin = {
messagePrefix: '\x19Gamerscoin Signed Message:\n',
@@ -22298,8 +22317,8 @@ bitcoinjs.bitcoin.networks.gamerscoin = {
},
pubKeyHash: 0x26,
scriptHash: 0x05,
wif: 0xA6,
},
wif: 0xA6
};
bitcoinjs.bitcoin.networks.jumbucks = {
messagePrefix: '\x19Jumbucks Signed Message:\n',
@@ -22309,8 +22328,8 @@ bitcoinjs.bitcoin.networks.jumbucks = {
},
pubKeyHash: 0x2b,
scriptHash: 0x05,
wif: 0xab,
},
wif: 0xab
};
bitcoinjs.bitcoin.networks.zetacoin = {
messagePrefix: '\x18Zetacoin Signed Message:\n',
@@ -22320,40 +22339,40 @@ bitcoinjs.bitcoin.networks.zetacoin = {
},
pubKeyHash: 0x50,
scriptHash: 0x09,
wif: 0xe0,
}
wif: 0xe0
};
bitcoinjs.bitcoin.networks.myriadcoin = {
messagePrefix: "unused",
messagePrefix: 'unused',
bip32: {
public: 0x0488b21e,
private: 0x0488ade4
},
pubKeyHash: 0x32,
scriptHash: 0x00, // TODO set this correctly
wif: 0xb2,
wif: 0xb2
};
bitcoinjs.bitcoin.networks.pivx = {
messagePrefix: "unused",
messagePrefix: 'unused',
bip32: {
public: 0x022d2533,
private: 0x0221312b
},
pubKeyHash: 0x1e,
scriptHash: 0x0d,
wif: 0xd4,
wif: 0xd4
};
bitcoinjs.bitcoin.networks.pivxtestnet = {
messagePrefix: "unused",
messagePrefix: 'unused',
bip32: {
public: 0x3a8061a0,
private: 0x3a805837
},
pubKeyHash: 0x8b,
scriptHash: 0x13,
wif: 0xef,
wif: 0xef
};
</script>
<script>(function(f){if(typeof exports==="object"&&typeof module!=="undefined"){module.exports=f()}else if(typeof define==="function"&&define.amd){define([],f)}else{var g;if(typeof window!=="undefined"){g=window}else if(typeof global!=="undefined"){g=global}else if(typeof self!=="undefined"){g=self}else{g=this}g.ethUtil = f()}})(function(){var define,module,exports;return (function e(t,n,r){function s(o,u){if(!n[o]){if(!t[o]){var a=typeof require=="function"&&require;if(!u&&a)return a(o,!0);if(i)return i(o,!0);var f=new Error("Cannot find module '"+o+"'");throw f.code="MODULE_NOT_FOUND",f}var l=n[o]={exports:{}};t[o][0].call(l.exports,function(e){var n=t[o][1][e];return s(n?n:e)},l,l.exports,e,t,n,r)}return n[o].exports}var i=typeof require=="function"&&require;for(var o=0;o<r.length;o++)s(r[o]);return s})({1:[function(require,module,exports){
@@ -45767,7 +45786,7 @@ var time_estimates;time_estimates={estimate_attack_times:function(e){var t,n,s,o
},{}]},{},[4])(4)
});
//# sourceMappingURL=zxcvbn.js.map
</script>
<script>/*
* Detects entropy from a string.
@@ -46155,6 +46174,7 @@ window.Entropy = new (function() {
DOM.entropyWordCount = DOM.entropyContainer.find(".word-count");
DOM.entropyBinary = DOM.entropyContainer.find(".binary");
DOM.entropyMnemonicLength = DOM.entropyContainer.find(".mnemonic-length");
DOM.entropyFilterWarning = DOM.entropyContainer.find(".filter-warning");
DOM.phrase = $(".phrase");
DOM.passphrase = $(".passphrase");
DOM.generateContainer = $(".generate-container");
@@ -46190,6 +46210,7 @@ window.Entropy = new (function() {
DOM.bip49change = $("#bip49 .change");
DOM.generatedStrength = $(".generate-container .strength");
DOM.hardenedAddresses = $(".hardened-addresses");
DOM.useP2wpkhNestedInP2sh = $(".p2wpkh-nested-in-p2sh");
DOM.addresses = $(".addresses");
DOM.rowsToAdd = $(".rows-to-add");
DOM.more = $(".more");
@@ -46226,6 +46247,7 @@ window.Entropy = new (function() {
DOM.bip49change.on("input", calcForDerivationPath);
DOM.tab.on("shown.bs.tab", calcForDerivationPath);
DOM.hardenedAddresses.on("change", calcForDerivationPath);
DOM.useP2wpkhNestedInP2sh.on("change", calcForDerivationPath);
DOM.indexToggle.on("click", toggleIndexes);
DOM.addressToggle.on("click", toggleAddresses);
DOM.publicKeyToggle.on("click", togglePublicKeys);
@@ -46248,11 +46270,11 @@ window.Entropy = new (function() {
var networkIndex = e.target.value;
var network = networks[networkIndex];
network.onSelect();
if (network.bip49available) {
showBip49();
if (network.p2wpkhNestedInP2shAvailable) {
showP2wpkhNestedInP2shAvailable();
}
else {
hideBip49();
showP2wpkhNestedInP2shUnavailable();
}
if (seed != null) {
phraseChanged();
@@ -46384,7 +46406,6 @@ window.Entropy = new (function() {
function rootKeyChanged() {
showPending();
hideValidationError();
// Validate the root key TODO
var rootKeyBase58 = DOM.rootKey.val();
var errorText = validateRootKey(rootKeyBase58);
if (errorText) {
@@ -46577,7 +46598,7 @@ window.Entropy = new (function() {
function validateRootKey(rootKeyBase58) {
try {
bitcoinjs.bitcoin.HDNode.fromBase58(rootKeyBase58);
bitcoinjs.bitcoin.HDNode.fromBase58(rootKeyBase58, network);
}
catch (e) {
return "Invalid root key";
@@ -46755,8 +46776,8 @@ window.Entropy = new (function() {
var self = this;
this.shouldGenerate = true;
var useHardenedAddresses = DOM.hardenedAddresses.prop("checked");
var isBip49 = bip49TabSelected();
var bip49available = networkHasBip49();
var isP2wpkhNestedInP2sh = bip49TabSelected() || (bip32TabSelected() && useP2wpkhNestedInP2sh());
var p2wpkhNestedInP2shAvailable = networkHasBip49();
function init() {
calculateValues();
@@ -46801,8 +46822,8 @@ window.Entropy = new (function() {
address = convertRippleAdrr(address);
}
// BIP49 addresses are different
if (isBip49) {
if (!bip49available) {
if (isP2wpkhNestedInP2sh) {
if (!p2wpkhNestedInP2shAvailable) {
return;
}
var keyhash = bitcoinjs.bitcoin.crypto.hash160(key.getPublicKeyBuffer());
@@ -47177,6 +47198,16 @@ window.Entropy = new (function() {
DOM.entropyWordCount.text(wordCount);
DOM.entropyBinary.text(entropy.binaryStr);
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) {
@@ -47282,8 +47313,12 @@ window.Entropy = new (function() {
return DOM.bip32tab.hasClass("active");
}
function useP2wpkhNestedInP2sh() {
return DOM.useP2wpkhNestedInP2sh.prop("checked");
}
function networkHasBip49() {
return networks[DOM.network.val()].bip49available;
return networks[DOM.network.val()].p2wpkhNestedInP2shAvailable;
}
function bip49TabSelected() {
@@ -47295,20 +47330,23 @@ window.Entropy = new (function() {
DOM.bip49coin.val(coinValue);
}
function showBip49() {
function showP2wpkhNestedInP2shAvailable() {
DOM.bip49unavailable.addClass("hidden");
DOM.bip49available.removeClass("hidden");
DOM.useP2wpkhNestedInP2sh.prop("disabled", false);
}
function hideBip49() {
function showP2wpkhNestedInP2shUnavailable() {
DOM.bip49available.addClass("hidden");
DOM.bip49unavailable.removeClass("hidden");
DOM.useP2wpkhNestedInP2sh.prop("disabled", true);
DOM.useP2wpkhNestedInP2sh.prop("checked", false);
}
var networks = [
{
name: "BCH - Bitcoin Cash",
bip49available: false,
p2wpkhNestedInP2shAvailable: false,
onSelect: function() {
network = bitcoinjs.bitcoin.networks.bitcoin;
setHdCoin(145);
@@ -47316,7 +47354,7 @@ window.Entropy = new (function() {
},
{
name: "BTC - Bitcoin",
bip49available: true,
p2wpkhNestedInP2shAvailable: true,
onSelect: function() {
network = bitcoinjs.bitcoin.networks.bitcoin;
setHdCoin(0);
@@ -47324,7 +47362,7 @@ window.Entropy = new (function() {
},
{
name: "BTC - Bitcoin Testnet",
bip49available: true,
p2wpkhNestedInP2shAvailable: true,
onSelect: function() {
network = bitcoinjs.bitcoin.networks.testnet;
setHdCoin(1);
@@ -47332,7 +47370,7 @@ window.Entropy = new (function() {
},
{
name: "CLAM - Clams",
bip49available: false,
p2wpkhNestedInP2shAvailable: false,
onSelect: function() {
network = bitcoinjs.bitcoin.networks.clam;
setHdCoin(23);
@@ -47340,7 +47378,7 @@ window.Entropy = new (function() {
},
{
name: "CRW - Crown",
bip49available: false,
p2wpkhNestedInP2shAvailable: false,
onSelect: function() {
network = bitcoinjs.bitcoin.networks.crown;
setHdCoin(72);
@@ -47348,7 +47386,7 @@ window.Entropy = new (function() {
},
{
name: "DASH - Dash",
bip49available: false,
p2wpkhNestedInP2shAvailable: false,
onSelect: function() {
network = bitcoinjs.bitcoin.networks.dash;
setHdCoin(5);
@@ -47356,7 +47394,7 @@ window.Entropy = new (function() {
},
{
name: "DASH - Dash Testnet",
bip49available: false,
p2wpkhNestedInP2shAvailable: false,
onSelect: function() {
network = bitcoinjs.bitcoin.networks.dashtn;
setHdCoin(1);
@@ -47364,7 +47402,7 @@ window.Entropy = new (function() {
},
{
name: "DOGE - Dogecoin",
bip49available: false,
p2wpkhNestedInP2shAvailable: false,
onSelect: function() {
network = bitcoinjs.bitcoin.networks.dogecoin;
setHdCoin(3);
@@ -47372,7 +47410,7 @@ window.Entropy = new (function() {
},
{
name: "ETH - Ethereum",
bip49available: false,
p2wpkhNestedInP2shAvailable: false,
onSelect: function() {
network = bitcoinjs.bitcoin.networks.bitcoin;
setHdCoin(60);
@@ -47380,7 +47418,7 @@ window.Entropy = new (function() {
},
{
name: "GAME - GameCredits",
bip49available: false,
p2wpkhNestedInP2shAvailable: false,
onSelect: function() {
network = bitcoinjs.bitcoin.networks.game;
setHdCoin(101);
@@ -47388,7 +47426,7 @@ window.Entropy = new (function() {
},
{
name: "JBS - Jumbucks",
bip49available: false,
p2wpkhNestedInP2shAvailable: false,
onSelect: function() {
network = bitcoinjs.bitcoin.networks.jumbucks;
setHdCoin(26);
@@ -47396,7 +47434,7 @@ window.Entropy = new (function() {
},
{
name: "LTC - Litecoin",
bip49available: false,
p2wpkhNestedInP2shAvailable: false,
onSelect: function() {
network = bitcoinjs.bitcoin.networks.litecoin;
setHdCoin(2);
@@ -47405,7 +47443,7 @@ window.Entropy = new (function() {
},
{
name: "MAZA - Maza",
bip49available: false,
p2wpkhNestedInP2shAvailable: false,
onSelect: function() {
network = bitcoinjs.bitcoin.networks.maza;
setHdCoin(13);
@@ -47414,7 +47452,7 @@ window.Entropy = new (function() {
{
name: "NMC - Namecoin",
bip49available: false,
p2wpkhNestedInP2shAvailable: false,
onSelect: function() {
network = bitcoinjs.bitcoin.networks.namecoin;
setHdCoin(7);
@@ -47422,7 +47460,7 @@ window.Entropy = new (function() {
},
{
name: "PIVX - PIVX",
bip49available: false,
p2wpkhNestedInP2shAvailable: false,
onSelect: function() {
network = bitcoinjs.bitcoin.networks.pivx;
setHdCoin(119);
@@ -47430,7 +47468,7 @@ window.Entropy = new (function() {
},
{
name: "PIVX - PIVX Testnet",
bip49available: false,
p2wpkhNestedInP2shAvailable: false,
onSelect: function() {
network = bitcoinjs.bitcoin.networks.pivxtestnet;
setHdCoin(1);
@@ -47438,7 +47476,7 @@ window.Entropy = new (function() {
},
{
name: "PPC - Peercoin",
bip49available: false,
p2wpkhNestedInP2shAvailable: false,
onSelect: function() {
network = bitcoinjs.bitcoin.networks.peercoin;
setHdCoin(6);
@@ -47446,7 +47484,7 @@ window.Entropy = new (function() {
},
{
name: "SDC - ShadowCash",
bip49available: false,
p2wpkhNestedInP2shAvailable: false,
onSelect: function() {
network = bitcoinjs.bitcoin.networks.shadow;
setHdCoin(35);
@@ -47454,7 +47492,7 @@ window.Entropy = new (function() {
},
{
name: "SDC - ShadowCash Testnet",
bip49available: false,
p2wpkhNestedInP2shAvailable: false,
onSelect: function() {
network = bitcoinjs.bitcoin.networks.shadowtn;
setHdCoin(1);
@@ -47462,7 +47500,7 @@ window.Entropy = new (function() {
},
{
name: "SLM - Slimcoin",
bip49available: false,
p2wpkhNestedInP2shAvailable: false,
onSelect: function() {
network = bitcoinjs.bitcoin.networks.slimcoin;
setHdCoin(63);
@@ -47470,7 +47508,7 @@ window.Entropy = new (function() {
},
{
name: "SLM - Slimcoin Testnet",
bip49available: false,
p2wpkhNestedInP2shAvailable: false,
onSelect: function() {
network = bitcoinjs.bitcoin.networks.slimcointn;
setHdCoin(111);
@@ -47478,7 +47516,7 @@ window.Entropy = new (function() {
},
{
name: "VIA - Viacoin",
bip49available: false,
p2wpkhNestedInP2shAvailable: false,
onSelect: function() {
network = bitcoinjs.bitcoin.networks.viacoin;
setHdCoin(14);
@@ -47486,7 +47524,7 @@ window.Entropy = new (function() {
},
{
name: "VIA - Viacoin Testnet",
bip49available: false,
p2wpkhNestedInP2shAvailable: false,
onSelect: function() {
network = bitcoinjs.bitcoin.networks.viacointestnet;
setHdCoin(1);
@@ -47494,7 +47532,7 @@ window.Entropy = new (function() {
},
{
name: "XMY - Myriadcoin",
bip49available: false,
p2wpkhNestedInP2shAvailable: false,
onSelect: function() {
network = bitcoinjs.bitcoin.networks.myriadcoin;
setHdCoin(90);
@@ -47502,7 +47540,7 @@ window.Entropy = new (function() {
},
{
name: "XRP - Ripple",
bip49available: false,
p2wpkhNestedInP2shAvailable: false,
onSelect: function() {
network = bitcoinjs.bitcoin.networks.bitcoin;
setHdCoin(144);

View File

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

View File

@@ -1,6 +1,7 @@
import os
import re
import datetime
from io import open
# This script generates the bip39-standalone.html file.

View File

@@ -55,7 +55,10 @@ at 1PC9aZC4hNX2rmmrt7uHTfYAS3hRbph4UN
Please do not make modifications to `bip39-standalone.html`, since they will
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

View File

@@ -7,13 +7,17 @@ created with the following steps:
1. Run `python compile.py`
1. Commit these changes with message `Release vX.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. 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. 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. 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. 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`

View File

@@ -114,7 +114,7 @@
<div class="container">
<h1 class="text-center">Mnemonic Code Converter</h1>
<p class="version">v0.2.4</p>
<p class="version">v0.2.6</p>
<hr>
<div class="row">
<div class="col-md-12">
@@ -163,7 +163,14 @@
<div class="form-group">
<label for="entropy" class="col-sm-2 control-label" data-translate>Entropy</label>
<div class="col-sm-7">
<textarea id="entropy" rows="2" class="entropy form-control" placeholder="Accepts binary, base 6, 6-sided dice, base 10, hexadecimal, cards" data-translate-placeholder></textarea>
<textarea id="entropy" rows="2" class="entropy form-control" placeholder="Accepts either binary, base 6, 6-sided dice, base 10, hexadecimal or cards" data-translate-placeholder></textarea>
<div class="row filter-warning text-danger hidden">
<p class="col-sm-12">
<strong>
Some characters have been discarded
</strong>
</p>
</div>
<div class="row">
<label class="col-sm-3 control-label" data-translate><span class="more-info" data-translate-title title="Based on estimates from zxcvbn using Filtered Entropy">Time To Crack</span></label>
<div class="crack-time col-sm-3 form-control-static"></div>
@@ -408,6 +415,13 @@
<span data-translate>Use hardened addresses</span>
</label>
</div>
<div class="form-group">
<div class="col-sm-2"></div>
<label class="col-sm-10">
<input class="p2wpkh-nested-in-p2sh" type="checkbox">
<span data-translate>Use SegWit addresses (ie P2WPKH Nested In P2SH)</span>
</label>
</div>
<div class="form-group">
<label for="core-path" class="col-sm-2 control-label" data-translate>Bitcoin Core</label>
<div class="col-sm-10">
@@ -626,6 +640,11 @@
Read more at the
<a href="https://github.com/bitcoin/bips/blob/master/bip-0044.mediawiki" target="_blank">official BIP44 spec</a>
</p>
<h3>BIP49 <span class="small" data-translate>Derivation scheme for P2WPKH-nested-in-P2SH based accounts</span></h3>
<p data-translate-html>
Read more at the
<a href="https://github.com/bitcoin/bips/blob/master/bip-0049.mediawiki" target="_blank">official BIP49 spec</a>
</p>
<h3 data-translate>Private Keys</h3>
<p>
<span data-translate-html>

View File

@@ -1,133 +1,133 @@
bitcoinjs.bitcoin.networks.shadow = {
messagePrefix: "unused",
messagePrefix: 'unused',
bip32: {
public: 0xEE80286A,
private: 0xEE8031E8
},
pubKeyHash: 0x3f,
scriptHash: 0x7d,
wif: 0xbf,
wif: 0xbf
};
bitcoinjs.bitcoin.networks.shadowtn = {
messagePrefix: "unused",
messagePrefix: 'unused',
bip32: {
public: 0x76C0FDFB,
private: 0x76C1077A
},
pubKeyHash: 0x7f,
scriptHash: 0xc4,
wif: 0xff,
wif: 0xff
};
bitcoinjs.bitcoin.networks.clam = {
messagePrefix: "unused",
messagePrefix: 'unused',
bip32: {
public: 0xa8c26d64,
private: 0xa8c17826
},
pubKeyHash: 0x89,
scriptHash: 0x00, // TODO set this correctly
wif: 0x85,
wif: 0x85
};
bitcoinjs.bitcoin.networks.crown = {
messagePrefix: "unused",
messagePrefix: 'unused',
bip32: {
public: 0x0488b21e,
private: 0x0488ade4
},
pubKeyHash: 0x00,
scriptHash: 0x05,
wif: 0x80,
wif: 0x80
};
bitcoinjs.bitcoin.networks.dash = {
messagePrefix: "unused",
messagePrefix: 'unused',
bip32: {
public: 0x0488b21e,
private: 0x0488ade4
},
pubKeyHash: 0x4c,
scriptHash: 0x10,
wif: 0xcc,
wif: 0xcc
};
bitcoinjs.bitcoin.networks.maza = {
messagePrefix: "unused",
messagePrefix: 'unused',
bip32: {
public: 0x0488b21e,
private: 0x0488ade4
},
pubKeyHash: 0x32,
scriptHash: 0x09,
wif: 0xe0,
wif: 0xe0
};
bitcoinjs.bitcoin.networks.dashtn = {
messagePrefix: "unused",
messagePrefix: 'unused',
bip32: {
public: 0x043587cf,
private: 0x04358394
},
pubKeyHash: 0x8c,
scriptHash: 0x13,
wif: 0xef,
wif: 0xef
};
bitcoinjs.bitcoin.networks.game = {
messagePrefix: "unused",
messagePrefix: 'unused',
bip32: {
public: 0x0488b21e,
private: 0x0488ade4
},
pubKeyHash: 0x26,
scriptHash: 0x05,
wif: 0xa6,
wif: 0xa6
};
bitcoinjs.bitcoin.networks.namecoin = {
messagePrefix: "unused",
messagePrefix: 'unused',
bip32: {
public: 0x0488b21e,
private: 0x0488ade4
},
pubKeyHash: 0x34,
scriptHash: 0x00, // TODO set this correctly
wif: 0x80,
wif: 0x80
};
bitcoinjs.bitcoin.networks.peercoin = {
messagePrefix: "unused",
messagePrefix: 'unused',
bip32: {
public: 0x0488b21e,
private: 0x0488ade4
},
pubKeyHash: 0x37,
scriptHash: 0x00, // TODO set this correctly
wif: 0xb7,
wif: 0xb7
};
bitcoinjs.bitcoin.networks.slimcoin = {
messagePrefix: "unused",
messagePrefix: 'unused',
bip32: {
public: 0xef6adf10,
private: 0xef69ea80
},
pubKeyHash: 0x3f,
scriptHash: 0x7d,
wif: 0x46,
wif: 0x46
};
bitcoinjs.bitcoin.networks.slimcointn = {
messagePrefix: "unused",
messagePrefix: 'unused',
bip32: {
public: 0x043587CF,
private: 0x04358394
},
pubKeyHash: 0x6f,
scriptHash: 0xc4,
wif: 0x57,
wif: 0x57
};
bitcoinjs.bitcoin.networks.dogecoin = {
@@ -138,8 +138,8 @@ bitcoinjs.bitcoin.networks.dogecoin = {
},
pubKeyHash: 0x1e,
scriptHash: 0x16,
wif: 0x9e,
},
wif: 0x9e
};
bitcoinjs.bitcoin.networks.viacoin = {
messagePrefix: '\x18Viacoin Signed Message:\n',
@@ -149,8 +149,8 @@ bitcoinjs.bitcoin.networks.viacoin = {
},
pubKeyHash: 0x47,
scriptHash: 0x21,
wif: 0xc7,
},
wif: 0xc7
};
bitcoinjs.bitcoin.networks.viacointestnet = {
messagePrefix: '\x18Viacoin Signed Message:\n',
@@ -160,8 +160,8 @@ bitcoinjs.bitcoin.networks.viacointestnet = {
},
pubKeyHash: 0x7f,
scriptHash: 0xc4,
wif: 0xff,
},
wif: 0xff
};
bitcoinjs.bitcoin.networks.gamerscoin = {
messagePrefix: '\x19Gamerscoin Signed Message:\n',
@@ -171,8 +171,8 @@ bitcoinjs.bitcoin.networks.gamerscoin = {
},
pubKeyHash: 0x26,
scriptHash: 0x05,
wif: 0xA6,
},
wif: 0xA6
};
bitcoinjs.bitcoin.networks.jumbucks = {
messagePrefix: '\x19Jumbucks Signed Message:\n',
@@ -182,8 +182,8 @@ bitcoinjs.bitcoin.networks.jumbucks = {
},
pubKeyHash: 0x2b,
scriptHash: 0x05,
wif: 0xab,
},
wif: 0xab
};
bitcoinjs.bitcoin.networks.zetacoin = {
messagePrefix: '\x18Zetacoin Signed Message:\n',
@@ -193,38 +193,38 @@ bitcoinjs.bitcoin.networks.zetacoin = {
},
pubKeyHash: 0x50,
scriptHash: 0x09,
wif: 0xe0,
}
wif: 0xe0
};
bitcoinjs.bitcoin.networks.myriadcoin = {
messagePrefix: "unused",
messagePrefix: 'unused',
bip32: {
public: 0x0488b21e,
private: 0x0488ade4
},
pubKeyHash: 0x32,
scriptHash: 0x00, // TODO set this correctly
wif: 0xb2,
wif: 0xb2
};
bitcoinjs.bitcoin.networks.pivx = {
messagePrefix: "unused",
messagePrefix: 'unused',
bip32: {
public: 0x022d2533,
private: 0x0221312b
},
pubKeyHash: 0x1e,
scriptHash: 0x0d,
wif: 0xd4,
wif: 0xd4
};
bitcoinjs.bitcoin.networks.pivxtestnet = {
messagePrefix: "unused",
messagePrefix: 'unused',
bip32: {
public: 0x3a8061a0,
private: 0x3a805837
},
pubKeyHash: 0x8b,
scriptHash: 0x13,
wif: 0xef,
wif: 0xef
};

View File

@@ -38,6 +38,7 @@
DOM.entropyWordCount = DOM.entropyContainer.find(".word-count");
DOM.entropyBinary = DOM.entropyContainer.find(".binary");
DOM.entropyMnemonicLength = DOM.entropyContainer.find(".mnemonic-length");
DOM.entropyFilterWarning = DOM.entropyContainer.find(".filter-warning");
DOM.phrase = $(".phrase");
DOM.passphrase = $(".passphrase");
DOM.generateContainer = $(".generate-container");
@@ -73,6 +74,7 @@
DOM.bip49change = $("#bip49 .change");
DOM.generatedStrength = $(".generate-container .strength");
DOM.hardenedAddresses = $(".hardened-addresses");
DOM.useP2wpkhNestedInP2sh = $(".p2wpkh-nested-in-p2sh");
DOM.addresses = $(".addresses");
DOM.rowsToAdd = $(".rows-to-add");
DOM.more = $(".more");
@@ -109,6 +111,7 @@
DOM.bip49change.on("input", calcForDerivationPath);
DOM.tab.on("shown.bs.tab", calcForDerivationPath);
DOM.hardenedAddresses.on("change", calcForDerivationPath);
DOM.useP2wpkhNestedInP2sh.on("change", calcForDerivationPath);
DOM.indexToggle.on("click", toggleIndexes);
DOM.addressToggle.on("click", toggleAddresses);
DOM.publicKeyToggle.on("click", togglePublicKeys);
@@ -131,11 +134,11 @@
var networkIndex = e.target.value;
var network = networks[networkIndex];
network.onSelect();
if (network.bip49available) {
showBip49();
if (network.p2wpkhNestedInP2shAvailable) {
showP2wpkhNestedInP2shAvailable();
}
else {
hideBip49();
showP2wpkhNestedInP2shUnavailable();
}
if (seed != null) {
phraseChanged();
@@ -267,7 +270,6 @@
function rootKeyChanged() {
showPending();
hideValidationError();
// Validate the root key TODO
var rootKeyBase58 = DOM.rootKey.val();
var errorText = validateRootKey(rootKeyBase58);
if (errorText) {
@@ -460,7 +462,7 @@
function validateRootKey(rootKeyBase58) {
try {
bitcoinjs.bitcoin.HDNode.fromBase58(rootKeyBase58);
bitcoinjs.bitcoin.HDNode.fromBase58(rootKeyBase58, network);
}
catch (e) {
return "Invalid root key";
@@ -638,8 +640,8 @@
var self = this;
this.shouldGenerate = true;
var useHardenedAddresses = DOM.hardenedAddresses.prop("checked");
var isBip49 = bip49TabSelected();
var bip49available = networkHasBip49();
var isP2wpkhNestedInP2sh = bip49TabSelected() || (bip32TabSelected() && useP2wpkhNestedInP2sh());
var p2wpkhNestedInP2shAvailable = networkHasBip49();
function init() {
calculateValues();
@@ -684,8 +686,8 @@
address = convertRippleAdrr(address);
}
// BIP49 addresses are different
if (isBip49) {
if (!bip49available) {
if (isP2wpkhNestedInP2sh) {
if (!p2wpkhNestedInP2shAvailable) {
return;
}
var keyhash = bitcoinjs.bitcoin.crypto.hash160(key.getPublicKeyBuffer());
@@ -1060,6 +1062,16 @@
DOM.entropyWordCount.text(wordCount);
DOM.entropyBinary.text(entropy.binaryStr);
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) {
@@ -1165,8 +1177,12 @@
return DOM.bip32tab.hasClass("active");
}
function useP2wpkhNestedInP2sh() {
return DOM.useP2wpkhNestedInP2sh.prop("checked");
}
function networkHasBip49() {
return networks[DOM.network.val()].bip49available;
return networks[DOM.network.val()].p2wpkhNestedInP2shAvailable;
}
function bip49TabSelected() {
@@ -1178,20 +1194,23 @@
DOM.bip49coin.val(coinValue);
}
function showBip49() {
function showP2wpkhNestedInP2shAvailable() {
DOM.bip49unavailable.addClass("hidden");
DOM.bip49available.removeClass("hidden");
DOM.useP2wpkhNestedInP2sh.prop("disabled", false);
}
function hideBip49() {
function showP2wpkhNestedInP2shUnavailable() {
DOM.bip49available.addClass("hidden");
DOM.bip49unavailable.removeClass("hidden");
DOM.useP2wpkhNestedInP2sh.prop("disabled", true);
DOM.useP2wpkhNestedInP2sh.prop("checked", false);
}
var networks = [
{
name: "BCH - Bitcoin Cash",
bip49available: false,
p2wpkhNestedInP2shAvailable: false,
onSelect: function() {
network = bitcoinjs.bitcoin.networks.bitcoin;
setHdCoin(145);
@@ -1199,7 +1218,7 @@
},
{
name: "BTC - Bitcoin",
bip49available: true,
p2wpkhNestedInP2shAvailable: true,
onSelect: function() {
network = bitcoinjs.bitcoin.networks.bitcoin;
setHdCoin(0);
@@ -1207,7 +1226,7 @@
},
{
name: "BTC - Bitcoin Testnet",
bip49available: true,
p2wpkhNestedInP2shAvailable: true,
onSelect: function() {
network = bitcoinjs.bitcoin.networks.testnet;
setHdCoin(1);
@@ -1215,7 +1234,7 @@
},
{
name: "CLAM - Clams",
bip49available: false,
p2wpkhNestedInP2shAvailable: false,
onSelect: function() {
network = bitcoinjs.bitcoin.networks.clam;
setHdCoin(23);
@@ -1223,7 +1242,7 @@
},
{
name: "CRW - Crown",
bip49available: false,
p2wpkhNestedInP2shAvailable: false,
onSelect: function() {
network = bitcoinjs.bitcoin.networks.crown;
setHdCoin(72);
@@ -1231,7 +1250,7 @@
},
{
name: "DASH - Dash",
bip49available: false,
p2wpkhNestedInP2shAvailable: false,
onSelect: function() {
network = bitcoinjs.bitcoin.networks.dash;
setHdCoin(5);
@@ -1239,7 +1258,7 @@
},
{
name: "DASH - Dash Testnet",
bip49available: false,
p2wpkhNestedInP2shAvailable: false,
onSelect: function() {
network = bitcoinjs.bitcoin.networks.dashtn;
setHdCoin(1);
@@ -1247,7 +1266,7 @@
},
{
name: "DOGE - Dogecoin",
bip49available: false,
p2wpkhNestedInP2shAvailable: false,
onSelect: function() {
network = bitcoinjs.bitcoin.networks.dogecoin;
setHdCoin(3);
@@ -1255,7 +1274,7 @@
},
{
name: "ETH - Ethereum",
bip49available: false,
p2wpkhNestedInP2shAvailable: false,
onSelect: function() {
network = bitcoinjs.bitcoin.networks.bitcoin;
setHdCoin(60);
@@ -1263,7 +1282,7 @@
},
{
name: "GAME - GameCredits",
bip49available: false,
p2wpkhNestedInP2shAvailable: false,
onSelect: function() {
network = bitcoinjs.bitcoin.networks.game;
setHdCoin(101);
@@ -1271,7 +1290,7 @@
},
{
name: "JBS - Jumbucks",
bip49available: false,
p2wpkhNestedInP2shAvailable: false,
onSelect: function() {
network = bitcoinjs.bitcoin.networks.jumbucks;
setHdCoin(26);
@@ -1279,7 +1298,7 @@
},
{
name: "LTC - Litecoin",
bip49available: false,
p2wpkhNestedInP2shAvailable: false,
onSelect: function() {
network = bitcoinjs.bitcoin.networks.litecoin;
setHdCoin(2);
@@ -1288,7 +1307,7 @@
},
{
name: "MAZA - Maza",
bip49available: false,
p2wpkhNestedInP2shAvailable: false,
onSelect: function() {
network = bitcoinjs.bitcoin.networks.maza;
setHdCoin(13);
@@ -1297,7 +1316,7 @@
{
name: "NMC - Namecoin",
bip49available: false,
p2wpkhNestedInP2shAvailable: false,
onSelect: function() {
network = bitcoinjs.bitcoin.networks.namecoin;
setHdCoin(7);
@@ -1305,7 +1324,7 @@
},
{
name: "PIVX - PIVX",
bip49available: false,
p2wpkhNestedInP2shAvailable: false,
onSelect: function() {
network = bitcoinjs.bitcoin.networks.pivx;
setHdCoin(119);
@@ -1313,7 +1332,7 @@
},
{
name: "PIVX - PIVX Testnet",
bip49available: false,
p2wpkhNestedInP2shAvailable: false,
onSelect: function() {
network = bitcoinjs.bitcoin.networks.pivxtestnet;
setHdCoin(1);
@@ -1321,7 +1340,7 @@
},
{
name: "PPC - Peercoin",
bip49available: false,
p2wpkhNestedInP2shAvailable: false,
onSelect: function() {
network = bitcoinjs.bitcoin.networks.peercoin;
setHdCoin(6);
@@ -1329,7 +1348,7 @@
},
{
name: "SDC - ShadowCash",
bip49available: false,
p2wpkhNestedInP2shAvailable: false,
onSelect: function() {
network = bitcoinjs.bitcoin.networks.shadow;
setHdCoin(35);
@@ -1337,7 +1356,7 @@
},
{
name: "SDC - ShadowCash Testnet",
bip49available: false,
p2wpkhNestedInP2shAvailable: false,
onSelect: function() {
network = bitcoinjs.bitcoin.networks.shadowtn;
setHdCoin(1);
@@ -1345,7 +1364,7 @@
},
{
name: "SLM - Slimcoin",
bip49available: false,
p2wpkhNestedInP2shAvailable: false,
onSelect: function() {
network = bitcoinjs.bitcoin.networks.slimcoin;
setHdCoin(63);
@@ -1353,7 +1372,7 @@
},
{
name: "SLM - Slimcoin Testnet",
bip49available: false,
p2wpkhNestedInP2shAvailable: false,
onSelect: function() {
network = bitcoinjs.bitcoin.networks.slimcointn;
setHdCoin(111);
@@ -1361,7 +1380,7 @@
},
{
name: "VIA - Viacoin",
bip49available: false,
p2wpkhNestedInP2shAvailable: false,
onSelect: function() {
network = bitcoinjs.bitcoin.networks.viacoin;
setHdCoin(14);
@@ -1369,7 +1388,7 @@
},
{
name: "VIA - Viacoin Testnet",
bip49available: false,
p2wpkhNestedInP2shAvailable: false,
onSelect: function() {
network = bitcoinjs.bitcoin.networks.viacointestnet;
setHdCoin(1);
@@ -1377,7 +1396,7 @@
},
{
name: "XMY - Myriadcoin",
bip49available: false,
p2wpkhNestedInP2shAvailable: false,
onSelect: function() {
network = bitcoinjs.bitcoin.networks.myriadcoin;
setHdCoin(90);
@@ -1385,7 +1404,7 @@
},
{
name: "XRP - Ripple",
bip49available: false,
p2wpkhNestedInP2shAvailable: false,
onSelect: function() {
network = bitcoinjs.bitcoin.networks.bitcoin;
setHdCoin(144);

View File

@@ -23,6 +23,6 @@ this.getLength()-a.getLength())return this;for(var c=l.glog(this.get(0))-l.glog(
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),
correctLevel:3,background:"#ffffff",foreground:"#000000"},h);return this.each(function(){var a;if("canvas"==h.render){a=new o(h.typeNumber,h.correctLevel);a.addData(h.text);a.make();var c=document.createElement("canvas");c.width=h.width;c.height=h.height;for(var d=c.getContext("2d"),b=h.width/a.getModuleCount(),e=h.height/a.getModuleCount(),f=0;f<a.getModuleCount();f++)for(var i=0;i<a.getModuleCount();i++){d.fillStyle=a.isDark(f,i)?h.foreground:h.background;var g=Math.ceil((i+1)*b)-Math.floor(i*b),
j=Math.ceil((f+1)*b)-Math.floor(f*b);d.fillRect(Math.round(i*b),Math.round(f*e),g,j)}}else{a=new o(h.typeNumber,h.correctLevel);a.addData(h.text);a.make();c=r("<table></table>").css("width",h.width+"px").css("height",h.height+"px").css("border","0px").css("border-collapse","collapse").css("background-color",h.background);d=h.width/a.getModuleCount();b=h.height/a.getModuleCount();for(e=0;e<a.getModuleCount();e++){f=r("<tr></tr>").css("height",b+"px").appendTo(c);for(i=0;i<a.getModuleCount();i++)r("<td></td>").css("width",
d+"px").css("background-color",a.isDark(e,i)?h.foreground:h.background).appendTo(f)}}a=c;$(a).appendTo(this)})}})($);

View File

@@ -25,4 +25,4 @@ var time_estimates;time_estimates={estimate_attack_times:function(e){var t,n,s,o
},{}]},{},[4])(4)
});
//# sourceMappingURL=zxcvbn.js.map

View File

@@ -4267,6 +4267,83 @@ page.open(url, function(status) {
});
},
// BIP32 tab can use P2WPKH Nested In P2SH
// github issue 91 part 2
// https://github.com/iancoleman/bip39/issues/91
// generate new addresses from xpub?
function() {
page.open(url, function(status) {
// set the xpub and coin and select bip32 tab with p2wpkh addresses
page.evaluate(function() {
// use p2wpkh addresses
$(".p2wpkh-nested-in-p2sh").prop("checked", true);
// use bip32 tab
$("#bip32-tab a").click();
// use testnet
$(".network option[selected]").removeAttr("selected");
$(".network option").filter(function() {
return $(this).html() == "BTC - Bitcoin Testnet";
}).prop("selected", true);
$(".network").trigger("change");
// Set root xpub to BIP49 official test vector account 0
$(".root-key").val("tpubDD7tXK8KeQ3YY83yWq755fHY2JW8Ha8Q765tknUM5rSvjPcGWfUppDFMpQ1ScziKfW3ZNtZvAD7M3u7bSs7HofjTD3KP3YxPK7X6hwV8Rk2");
$(".root-key").trigger("input");
});
// check the address is generated correctly
waitForGenerate(function() {
var expected = "2Mww8dCYPUpKHofjgcXcBCEGmniw9CoaiD2";
var actual = page.evaluate(function() {
return $(".address:first").text();
});
if (actual != expected) {
console.log("BIP32 tab cannot generate P2WPKH Nested In P2SH addresses");
console.log("Expected: " + expected);
console.log("Actual: " + actual);
fail();
}
next();
});
});
},
// github issue 99
// https://github.com/iancoleman/bip39/issues/99#issuecomment-327094159
// "warn me emphatically when they have detected invalid input" to the entropy field
// A warning is shown when entropy is filtered and discarded
function() {
page.open(url, function(status) {
// use entropy
page.evaluate(function() {
$(".use-entropy").prop("checked", true).trigger("change");
$(".entropy").val("00000000 00000000 00000000 00000000").trigger("input");
});
// check the filter warning does not show
waitForGenerate(function() {
var warningIsHidden = page.evaluate(function() {
return $(".entropy-container .filter-warning").hasClass("hidden");
});
if (!warningIsHidden) {
console.log("Entropy filter warning is showing when it should not");
fail();
}
page.evaluate(function() {
$(".entropy").val("10000000 zxcvbn 00000000 00000000 00000000").trigger("input");
});
// check the filter warning shows
waitForEntropyFeedback(function() {
var warningIsHidden = page.evaluate(function() {
return $(".entropy-container .filter-warning").hasClass("hidden");
});
if (warningIsHidden) {
console.log("Entropy filter warning is not showing when it should");
fail();
}
next();
});
});
});
},
// If you wish to add more tests, do so here...
// Here is a blank test template