diff --git a/packages/web3-eth-abi/src/index.js b/packages/web3-eth-abi/src/index.js index 8eaebdc35d2..600b993c289 100644 --- a/packages/web3-eth-abi/src/index.js +++ b/packages/web3-eth-abi/src/index.js @@ -115,12 +115,14 @@ ABICoder.prototype.encodeParameters = function (types, params) { const coder = ethersAbiCoder._getCoder(ParamType.from(type)); const modifyParams = (coder, param) => { if (coder.name === 'array') { - return param.map(p => - modifyParams( - ethersAbiCoder._getCoder(ParamType.from(coder.type.replace('[]', ''))), - p - ) - ); + if (!coder.type.match(/\[(\d+)\]/)) { + return param.map(p => modifyParams(ethersAbiCoder._getCoder(ParamType.from(coder.type.replace('[]', ''))), p)); + } + const arrayLength = parseInt(coder.type.match(/\[(\d+)\]/)[1]); + if (param.length !== arrayLength) { + throw new Error('Array length does not matches with the given input'); + } + return param.map(p => modifyParams(ethersAbiCoder._getCoder(ParamType.from(coder.type.replace(/\[\d+\]/, ''))), p)); } coder.coders.forEach((c, i) => { if (c.name === 'tuple') { diff --git a/test/abi.encodeParameter.js b/test/abi.encodeParameter.js index a27f3018ec0..9df8f4f6da9 100644 --- a/test/abi.encodeParameter.js +++ b/test/abi.encodeParameter.js @@ -8,8 +8,8 @@ var coder = require('../packages/web3-eth-abi'); describe('lib/solidity/coder', function () { describe('encodeParameter', function () { var test = function (t) { - it('should turn ' + t.value + ' to ' + t.expected + ' for '+ t.type, function () { - assert.equal(coder.encodeParameter(t.type, t.value).replace('0x',''), t.expected); + it('should turn ' + (typeof t.value === 'object' ? JSON.stringify(t.value) : t.value) + ' to ' + t.expected + ' for ' + (typeof t.type === 'object' ? JSON.stringify(t.type) : t.type), function () { + assert.equal(coder.encodeParameter(t.type, t.value).replace('0x', ''), t.expected); }); }; @@ -363,6 +363,11 @@ describe('lib/solidity/coder', function () { '000000000000000000000000000000000000000000000000000000000000002a' + '000000000000000000000000000000000000000000000000000000000000002a' }); + test({ + type: { components: [{ name: "a", type: "uint256" }], type: "tuple[1]" }, + value: [{ a: 2 }], + expected: '0000000000000000000000000000000000000000000000000000000000000002' + }) }); });