diff --git a/package.json b/package.json index 4998be3a..203c818e 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "ethers", - "version": "3.0.6", + "version": "3.0.7", "description": "Ethereum wallet library.", "main": "index.js", "scripts": { diff --git a/tests/test-contract-interface.js b/tests/test-contract-interface.js index fb511de3..1b7cf204 100644 --- a/tests/test-contract-interface.js +++ b/tests/test-contract-interface.js @@ -228,3 +228,16 @@ describe('Test Interface Signatures', function() { }) }); }); + +describe('Test Invalid Input', function() { + var coder = ethers.utils.AbiCoder.defaultCoder; + it('null input failed', function() { + assert.throws(function() { + var result = coder.decode([ 'bool' ], '0x'); + console.log(result); + }, function(error) { + assert.equal(error.message, 'invalid bool', 'got invalid bool'); + return true; + }, 'null bytes throws an error'); + }); +}); diff --git a/utils/abi-coder.js b/utils/abi-coder.js index d70027f9..107c0711 100644 --- a/utils/abi-coder.js +++ b/utils/abi-coder.js @@ -70,6 +70,7 @@ var coderNumber = function(coerceFunc, size, signed, localName) { return utils.padZeros(utils.arrayify(value), 32); }, decode: function(data, offset) { + if (data.length < offset + 32) { throwError('invalid ' + name); } var junkLength = 32 - size; var value = utils.bigNumberify(data.slice(offset + junkLength, offset + 32)); if (signed) { @@ -98,7 +99,14 @@ var coderBoolean = function(coerceFunc, localName) { return uint256Coder.encode(value ? 1: 0); }, decode: function(data, offset) { - var result = uint256Coder.decode(data, offset); + try { + var result = uint256Coder.decode(data, offset); + } catch (error) { + if (error.message === 'invalid uint256') { + throwError('invalid bool'); + } + throw error; + } return { consumed: result.consumed, value: coerceFunc('boolean', !result.value.isZero())