Browse Source

Add entropy option for setting bip39 entropy

master
Luke Childs 6 years ago
parent
commit
deff42e1f4
  1. 25
      src/index.js
  2. 4
      src/key-formats/bip39.js
  3. 16
      test/options.js

25
src/index.js

@ -14,30 +14,37 @@ const addressFormats = {
};
class Vain extends Emitter {
constructor({keyFormat = 'wif', addressFormat = 'p2pkh', prefix}) {
constructor(options = {}) {
super();
this.options = {
keyFormat: 'wif',
addressFormat: 'p2pkh',
...options
};
this.generating = false;
this.generateKey = keyFormats[keyFormat];
this.addressFormat = addressFormats[addressFormat];
this.generateKey = keyFormats[this.options.keyFormat];
this.addressFormat = addressFormats[this.options.addressFormat];
if (typeof prefix !== 'string' || prefix.length === 0) {
if (typeof this.options.prefix !== 'string' || this.options.prefix.length === 0) {
throw new Error('Prefix must be set');
}
prefix.split('').forEach(char => {
this.options.prefix.split('').forEach(char => {
if (!this.addressFormat.charset.includes(char)) {
throw new Error(`Invalid characters for address format "${addressFormat}"`);
throw new Error(`Invalid characters for address format "${this.options.prefix.addressFormat}"`);
}
});
this.prefix = `${this.addressFormat.prefix}${prefix}`;
this.prefix = `${this.addressFormat.prefix}${this.options.prefix}`;
}
generate() {
this.generating = true;
const startTime = Date.now();
const {generateKey, addressFormat} = this;
const {generateKey, addressFormat, options} = this;
let found;
let attempts = 0;
@ -52,7 +59,7 @@ class Vain extends Emitter {
attempts++;
keyData = generateKey({addressFormat});
keyData = generateKey({addressFormat, options});
address = addressFormat.derive(keyData.publicKey);
if (address.startsWith(this.prefix)) {

4
src/key-formats/bip39.js

@ -1,8 +1,8 @@
const bip39 = require('bip39');
const bitcoin = require('bitcoinjs-lib');
const generatebip39Key = ({addressFormat}) => {
const mnemonic = bip39.generateMnemonic();
const generatebip39Key = ({addressFormat, options}) => {
const mnemonic = bip39.generateMnemonic(options.entropy);
const seed = bip39.mnemonicToSeedSync(mnemonic);
const node = bitcoin.bip32.fromSeed(seed);

16
test/options.js

@ -15,3 +15,19 @@ test('Vain defaults to p2pkh if no address format is set', t => {
t.true(address.startsWith(`1${options.prefix}`));
t.is(address, wifAddress);
});
test('Vain allows setting bip39 entropy via `options.entropy`', t => {
const options = {
prefix: 'A',
keyFormat: 'bip39',
entropy: 128
};
let vain = new Vain(options);
let {mnemonic} = vain.generate();
t.is(mnemonic.split(' ').length, 12);
options.entropy = 256;
vain = new Vain(options);
({mnemonic} = vain.generate());
t.is(mnemonic.split(' ').length, 24);
});

Loading…
Cancel
Save