<label for="strength" class="col-sm-2 control-label">Number of words</label>
<div class="col-sm-10">
<div class="input-group">
- <input type="number" class="strength form-control" id="strength" value="12">
+ <select id="strength" class="strength form-control">
+ <option val="3">3</option>
+ <option val="6">6</option>
+ <option val="9">9</option>
+ <option val="12">12</option>
+ <option val="15" selected>15</option>
+ <option val="18">18</option>
+ <option val="21">21</option>
+ <option val="24">24</option>
+ </select>
<span class="input-group-btn">
<button class="btn generate">Generate Random Mnemonic</button>
</span>
<textarea id="passphrase" class="passphrase 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"></textarea>
+ </div>
+ </div>
<div class="form-group">
<label for="network-phrase" class="col-sm-2 control-label">Coin</label>
<div class="col-sm-10">
feePerKb: 1000,
estimateFee: function() { return "unused in this app" },
};
+
+bitcoin.networks.clam = {
+ bip32: {
+ public: 0xa8c26d64,
+ private: 0xa8c17826
+ },
+ pubKeyHash: 0x89,
+ wif: 0x85,
+};
</script>
<script>// Select components from sjcl to suit the crypto operations bip39 requires.
self.toSeed = function(mnemonic, passphrase) {
passphrase = passphrase || '';
- mnemonic = self.normalizeString(mnemonic)
+ mnemonic = self.normalizeString(mnemonic).split(' ').filter(function(x) { return x.length; }).join(' ');
passphrase = self.normalizeString(passphrase)
passphrase = "mnemonic" + passphrase;
var mnemonicBits = sjcl.codec.utf8String.toBits(mnemonic);
<script>(function() {
var mnemonic = new Mnemonic("english");
+ var seed = null
var bip32RootKey = null;
var bip32ExtendedKey = null;
var network = bitcoin.networks.bitcoin;
DOM.phrase = $(".phrase");
DOM.passphrase = $(".passphrase");
DOM.generate = $(".generate");
+ DOM.seed = $(".seed");
DOM.rootKey = $(".root-key");
DOM.extendedPrivKey = $(".extended-priv-key");
DOM.extendedPubKey = $(".extended-pub-key");
function networkChanged(e) {
var network = e.target.value;
networks[network].onSelect();
- setBip44DerivationPath();
delayedPhraseChanged();
}
function bip44Changed() {
setBip44DerivationPath();
- derivationPath = DOM.bip44path.val();
derivationChanged();
}
return;
}
var numWords = parseInt(DOM.strength.val());
- // Check strength is an integer
- if (isNaN(numWords)) {
- DOM.strength.val("12");
- numWords = 12;
- }
- // Check strength is a multiple of 32, if not round it down
- if (numWords % 3 != 0) {
- numWords = Math.floor(numWords / 3) * 3;
- DOM.strength.val(numWords);
- }
- // Check strength is at least 32
- if (numWords == 0) {
- numWords = 3;
- DOM.strength.val(numWords);
- }
var strength = numWords / 3 * 32;
var words = mnemonic.generate(strength);
DOM.phrase.val(words);
}
function calcBip32Seed(phrase, passphrase, path) {
- var seed = mnemonic.toSeed(phrase, passphrase);
+ seed = mnemonic.toSeed(phrase, passphrase);
bip32RootKey = bitcoin.HDNode.fromSeedHex(seed, network);
bip32ExtendedKey = bip32RootKey;
// Derive the key from the path
function displayBip32Info() {
// Display the key
+ DOM.seed.val(seed);
var rootKey = bip32RootKey.toBase58();
DOM.rootKey.val(rootKey);
var extendedPrivKey = bip32ExtendedKey.toBase58();
addressCell.addClass("invisible");
}
if (!showPrivKey) {
- privkeCell.addClass("invisible");
+ privkeyCell.addClass("invisible");
}
DOM.addresses.append(row);
}
path += account + "'/";
path += change;
DOM.bip44path.val(path);
+ derivationPath = DOM.bip44path.val();
}
function parseIntNoNaN(val, defaultVal) {
DOM.bip44coin.val(26);
},
},
+ {
+ name: "CLAM",
+ onSelect: function() {
+ network = bitcoin.networks.clam;
+ DOM.bip44coin.val(23);
+ },
+ },
]
init();