diff --git a/src/charsets.js b/src/charsets.js new file mode 100644 index 0000000..98683d2 --- /dev/null +++ b/src/charsets.js @@ -0,0 +1,6 @@ +const charsets = { + base58: '123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz', + bech32: 'qpzry9x8gf2tvdw0s3jn54khce6mua7l' +}; + +module.exports = charsets; diff --git a/src/index.js b/src/index.js index 44d92c7..6095b2b 100644 --- a/src/index.js +++ b/src/index.js @@ -12,6 +12,13 @@ class Vain extends Emitter { constructor({addressFormat = 'p2pkh', prefix}) { super(); this.addressFormat = addressFormats.get(addressFormat); + + prefix.split('').forEach(char => { + if (!this.addressFormat.charset.includes(char)) { + throw new Error(`Invalid characters for address format "${addressFormat}"`); + } + }); + this.prefix = `${this.addressFormat.prefix}${prefix}`; } diff --git a/src/p2pkh.js b/src/p2pkh.js index 52c88d8..a9cf33f 100644 --- a/src/p2pkh.js +++ b/src/p2pkh.js @@ -1,7 +1,9 @@ const bitcoin = require('bitcoinjs-lib'); +const {base58} = require('./charsets'); const p2pkh = { - prefix: '1' + prefix: '1', + charset: base58 }; p2pkh.derive = () => { diff --git a/src/p2wpkh-p2sh.js b/src/p2wpkh-p2sh.js index 12658ef..b531b41 100644 --- a/src/p2wpkh-p2sh.js +++ b/src/p2wpkh-p2sh.js @@ -1,7 +1,9 @@ const bitcoin = require('bitcoinjs-lib'); +const {base58} = require('./charsets'); const p2wpkhp2sh = { - prefix: '3' + prefix: '3', + charset: base58 }; p2wpkhp2sh.derive = () => { diff --git a/src/p2wpkh.js b/src/p2wpkh.js index 3c8a970..f844f18 100644 --- a/src/p2wpkh.js +++ b/src/p2wpkh.js @@ -1,7 +1,9 @@ const bitcoin = require('bitcoinjs-lib'); +const {bech32} = require('./charsets'); const p2wpkh = { - prefix: 'bc1q' + prefix: 'bc1q', + charset: bech32 }; p2wpkh.derive = () => { diff --git a/test/unit.js b/test/unit.js index f10aa8d..951c716 100644 --- a/test/unit.js +++ b/test/unit.js @@ -66,3 +66,25 @@ test('Vain defaults to p2pkh if no address format is set', async t => { t.true(address.startsWith(`1${options.prefix}`)); t.is(address, wifAddress); }); + +test('Vain throws on invalid charset', t => { + const optionsArray = [ + { + addressFormat: 'p2pkh', + prefix: '0' + }, + { + addressFormat: 'p2wpkh-p2sh', + prefix: '0' + }, + { + addressFormat: 'p2wpkh', + prefix: '1' + } + ]; + + optionsArray.forEach(options => { + const error = t.throws(() => new Vain(options)); + t.true(error.message.includes('Invalid characters for address format')); + }); +});