diff --git a/__snapshots__/DumbContract.spec.ts.js b/__snapshots__/DumbContract.spec.ts.js index 9b0ff3d2f..fb4d0527c 100644 --- a/__snapshots__/DumbContract.spec.ts.js +++ b/__snapshots__/DumbContract.spec.ts.js @@ -112,6 +112,15 @@ export class DumbContract extends TC.TypeChainContract { stateMutability: "nonpayable", type: "function", }, + { + constant: true, + inputs: [{ name: "boolArrayParam", type: "bool[]" }], + name: "callWithBooleanArray", + outputs: [{ name: "", type: "bool[]" }], + payable: false, + stateMutability: "pure", + type: "function", + }, { constant: true, inputs: [{ name: "", type: "uint256" }], @@ -226,12 +235,12 @@ export class DumbContract extends TC.TypeChainContract { } public callWithBoolean(boolParam: boolean): Promise { - return TC.promisify(this.rawWeb3Contract.callWithBoolean, [boolParam.toString()]); + return TC.promisify(this.rawWeb3Contract.callWithBoolean, [boolParam]); } public callWithArray2(arrayParam: BigNumber[]): Promise { return TC.promisify(this.rawWeb3Contract.callWithArray2, [ - arrayParam.map(val => val.toString()), + arrayParam.map(arrayParamElem => arrayParamElem.toString()), ]); } @@ -243,6 +252,12 @@ export class DumbContract extends TC.TypeChainContract { return TC.promisify(this.rawWeb3Contract.testString, [a.toString()]); } + public callWithBooleanArray(boolArrayParam: boolean[]): Promise { + return TC.promisify(this.rawWeb3Contract.callWithBooleanArray, [ + boolArrayParam.map(boolArrayParamElem => boolArrayParamElem), + ]); + } + public counterArray(arg0: BigNumber | number): Promise { return TC.promisify(this.rawWeb3Contract.counterArray, [arg0.toString()]); } @@ -279,7 +294,7 @@ export class DumbContract extends TC.TypeChainContract { } public callWithArrayTx(arrayParam: BigNumber[]): TC.DeferredTransactionWrapper { return new TC.DeferredTransactionWrapper(this, "callWithArray", [ - arrayParam.map(val => val.toString()), + arrayParam.map(arrayParamElem => arrayParamElem.toString()), ]); } diff --git a/lib/targets/legacy/generation.ts b/lib/targets/legacy/generation.ts index a078a0c3a..18be9e4f6 100644 --- a/lib/targets/legacy/generation.ts +++ b/lib/targets/legacy/generation.ts @@ -146,9 +146,13 @@ function codeGenForParams(param: AbiParameter, index: number): string { } function codeGenForArgs(param: AbiParameter, index: number): string { - const isArray = param.type instanceof ArrayType; const paramName = param.name || `arg${index}`; - return isArray ? `${paramName}.map(val => val.toString())` : `${paramName}.toString()`; + if (param.type instanceof ArrayType) { + const elemParam = { name: `${paramName}Elem`, type: param.type.itemType }; + return `${paramName}.map(${elemParam.name} => ${codeGenForArgs(elemParam, 0)})`; + } + if (param.type instanceof BooleanType) return paramName; + return `${paramName}.toString()`; } function codeGenForOutputTypeList(output: Array): string { diff --git a/scripts/test.sh b/scripts/test.sh index cc060ad22..1dd131ccd 100755 --- a/scripts/test.sh +++ b/scripts/test.sh @@ -32,4 +32,4 @@ yarn tsc:truffle if [ "$mode" = "COVERAGE" ]; then echo "Sending coverage report" yarn coveralls -fi \ No newline at end of file +fi diff --git a/test/integration/contracts/DumbContract.sol b/test/integration/contracts/DumbContract.sol index 642e0d642..e817e4e5c 100644 --- a/test/integration/contracts/DumbContract.sol +++ b/test/integration/contracts/DumbContract.sol @@ -67,6 +67,11 @@ contract DumbContract { return boolParam; } + function callWithBooleanArray(bool[] boolArrayParam) public pure returns (bool[]) { + boolArrayParam = boolArrayParam; + return boolArrayParam; + } + function testAddress(address a) pure public returns (address) { return a; } diff --git a/test/integration/targets/legacy/DumbContract.spec.ts b/test/integration/targets/legacy/DumbContract.spec.ts index a2c3f8548..7ed029731 100644 --- a/test/integration/targets/legacy/DumbContract.spec.ts +++ b/test/integration/targets/legacy/DumbContract.spec.ts @@ -195,13 +195,27 @@ describe("DumbContract", () => { expect(result).to.eq(byteString); }); + it("should correctly pass both boolean values in args", async () => { + const dumbContract = await DumbContract.createAndValidate(web3, contractAddress); + + expect(await dumbContract.callWithBoolean(true)).to.be.deep.eq(true); + expect(await dumbContract.callWithBoolean(false)).to.be.deep.eq(false); + }); + + it("should correctly pass a boolean array argument", async () => { + const dumbContract = await DumbContract.createAndValidate(web3, contractAddress); + const array = [true, false]; + + expect(await dumbContract.callWithBooleanArray(array)).to.be.deep.eq(array); + }); + describe("estimateGas", () => { it("should work", async () => { const dumbContract = await DumbContract.createAndValidate(web3, contractAddress); const estimatedGas = await dumbContract.countupTx(1).estimateGas({ from: accounts[0] }); - expect(estimatedGas).to.be.eq(82683); + expect(estimatedGas).to.be.eq(82705); }); }); });