diff --git a/src/index.js b/src/index.js index e00ea9e..ea2caa6 100644 --- a/src/index.js +++ b/src/index.js @@ -16,6 +16,7 @@ const addressFormats = { class Vain extends Emitter { constructor({keyFormat = 'wif', addressFormat = 'p2pkh', prefix}) { super(); + this.generating = false; this.generateKey = keyFormats[keyFormat]; this.addressFormat = addressFormats[addressFormat]; @@ -33,6 +34,7 @@ class Vain extends Emitter { } generate() { + this.generating = true; const startTime = Date.now(); const {generateKey, addressFormat} = this; @@ -44,6 +46,10 @@ class Vain extends Emitter { let lastUpdate = Date.now(); while (!found) { + if (!this.generating) { + return {stopped: true}; + } + attempts++; keyData = generateKey({addressFormat}); @@ -51,6 +57,7 @@ class Vain extends Emitter { if (address.startsWith(this.prefix)) { found = true; + this.generating = false; } const now = Date.now(); diff --git a/test/events.js b/test/events.js new file mode 100644 index 0000000..c06f17f --- /dev/null +++ b/test/events.js @@ -0,0 +1,38 @@ +import test from 'ava'; +import * as bitcoin from 'bitcoinjs-lib'; +import Vain from '..'; + +test('Vain instance emits `found` event when vanity address is found', t => { + t.plan(2); + + const options = { + prefix: 'A' + }; + const vain = new Vain(options); + + vain.on('found', ({address, wif}) => { + const keyPair = bitcoin.ECPair.fromWIF(wif); + const {address: wifAddress} = bitcoin.payments.p2pkh({pubkey: keyPair.publicKey}); + + t.true(address.startsWith(`1${options.prefix}`)); + t.is(address, wifAddress); + }); + + vain.generate(); +}); + +test('Vain instance emits `update` event during address generation', t => { + t.plan(1); + + const options = { + prefix: '1BitcoinEaterAddressDontSend' + }; + const vain = new Vain(options); + + vain.on('update', () => { + vain.generating = false; + t.pass(); + }); + + vain.generate(); +});