diff --git a/src/functions/address.js b/src/functions/address.js index b23391b..9d19484 100644 --- a/src/functions/address.js +++ b/src/functions/address.js @@ -69,6 +69,12 @@ module.exports = function (S) { S.addressToHash = (a, A = {}) => { ARGS(A, {hex: false}); if (!S.isString(a)) throw new Error('address invalid'); + let net = S.addressNetType(a); + try { + if (net === null || !S.isAddressValid(a, {testnet: net === "testnet"})) return null; + } catch (e) { + return null; + } let h; if (S.ADDRESS_PREFIX_LIST.includes(a[0])) { h = S.decodeBase58(a, {hex: false}); @@ -156,16 +162,21 @@ module.exports = function (S) { if (!S.isString(a)) throw new Error('address invalid'); let s; if ([S.TESTNET_SCRIPT_ADDRESS_PREFIX, S.MAINNET_SCRIPT_ADDRESS_PREFIX].includes(a[0])) { - s = BC([BF([O.OP_HASH160, 0x14]), S.addressToHash(a), BF([O.OP_EQUAL])]); + let h = S.addressToHash(a); + if (h === null) throw new Error('address invalid'); + s = BC([BF([O.OP_HASH160, 0x14]), h, BF([O.OP_EQUAL])]); return (A.hex) ? s.hex() : s; } if ([S.MAINNET_ADDRESS_PREFIX, S.TESTNET_ADDRESS_PREFIX, S.TESTNET_ADDRESS_PREFIX_2].includes(a[0])) { - s = BC([BF([O.OP_DUP, O.OP_HASH160, 0x14]), S.addressToHash(a), BF([O.OP_EQUALVERIFY, O.OP_CHECKSIG])]); + let h = S.addressToHash(a); + if (h === null) throw new Error('address invalid'); + s = BC([BF([O.OP_DUP, O.OP_HASH160, 0x14]), h, BF([O.OP_EQUALVERIFY, O.OP_CHECKSIG])]); return (A.hex) ? s.hex() : s; } if ([S.TESTNET_SEGWIT_ADDRESS_PREFIX, S.MAINNET_SEGWIT_ADDRESS_PREFIX].includes(a.split("1")[0])) { let h = S.addressToHash(a); - s = BC([BF([O.OP_0, h.length]), S.addressToHash(a)]); + if (h === null) throw new Error('address invalid'); + s = BC([BF([O.OP_0, h.length]), h]); return (A.hex) ? s.hex() : s; } throw new Error('address invalid'); diff --git a/test/jsbgl.test.js b/test/jsbgl.test.js index 30834cc..da73c03 100644 --- a/test/jsbgl.test.js +++ b/test/jsbgl.test.js @@ -753,6 +753,9 @@ describe(`${(browser) ? 'Browser' : 'Node'} test jsbgl library`, function () { expect(() => addressToHash(90)).to.throw('invalid'); equal(addressToHash("QM1u8y4mm4oF88yppDbUAAEwyBEPezrx7CLh"), null); + equal(addressToHash("1Fs2Xqrk4P2XADaJeZWykaGXJ4HEb6RyT2"), null); + equal(addressToHash("33am12q3Bncnn3BfvLYHczyv23Sq2Wbwjx"), null); + equal(addressToHash("bgl1qw508d6qejxtdg4y5r3zarvary0c5xw7k0fy5a4"), null); }); it('publicKeyToAddress', () => { @@ -831,6 +834,9 @@ describe(`${(browser) ? 'Browser' : 'Node'} test jsbgl library`, function () { 'a914130319921ecbcfa33fec2a8503c4ae1c86e4419387'); equal(addressToScript("bgl1qw508d6qejxtdg4y5r3zarvary0c5xw7k0fy5a3").hex(), '0014751e76e8199196d454941c45d1b3a323f1433bd6'); + expect(() => addressToScript("1Fs2Xqrk4P2XADaJeZWykaGXJ4HEb6RyT2").hex()).to.throw('address invalid'); + expect(() => addressToScript("33am12q3Bncnn3BfvLYHczyv23Sq2Wbwjx").hex()).to.throw('address invalid'); + expect(() => addressToScript("bgl1qw508d6qejxtdg4y5r3zarvary0c5xw7k0fy5a4").hex()).to.throw('address invalid'); expect(() => addressToScript("bd6qejxtdg4y5r3zarvary0c5xw7kv8f3t4").hex()).to.throw('address invalid'); expect(() => addressToScript(45)).to.throw('address invalid');