Skip to content

Commit

Permalink
Add entropy option for setting bip39 entropy
Browse files Browse the repository at this point in the history
  • Loading branch information
lukechilds committed May 11, 2019
1 parent ee11391 commit deff42e
Show file tree
Hide file tree
Showing 3 changed files with 34 additions and 11 deletions.
25 changes: 16 additions & 9 deletions src/index.js
Expand Up @@ -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;
Expand All @@ -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)) {
Expand Down
4 changes: 2 additions & 2 deletions 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);
Expand Down
16 changes: 16 additions & 0 deletions test/options.js
Expand Up @@ -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);
});

0 comments on commit deff42e

Please sign in to comment.