diff --git a/contracts/integrations/CHANGELOG.json b/contracts/integrations/CHANGELOG.json index 719fba04c3..dfaf796354 100644 --- a/contracts/integrations/CHANGELOG.json +++ b/contracts/integrations/CHANGELOG.json @@ -1,4 +1,13 @@ [ + { + "version": "2.2.0", + "changes": [ + { + "note": "Add mainnet contract wrapper `callAsync()` revert behavior tests.", + "pr": 2433 + } + ] + }, { "version": "2.1.0", "changes": [ diff --git a/contracts/integrations/contracts/test/TestContractWrapper.sol b/contracts/integrations/contracts/test/TestContractWrapper.sol new file mode 100644 index 0000000000..6472327120 --- /dev/null +++ b/contracts/integrations/contracts/test/TestContractWrapper.sol @@ -0,0 +1,60 @@ +/* + + Copyright 2019 ZeroEx Intl. + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + +*/ + +pragma solidity ^0.5.9; + + +// solhint-disable no-empty-blocks +contract TestContractWrapper { + + uint256 constant public VALID_RETURN_VALUE = 0xf984f922a56ea9a20a32a32f0f60f2d216ff0c0a0d16c986a97a7f1897a6613b; + + function throwStringRevert() external returns (uint256) { + revert("ERROR"); + } + + function throwEmptyRevert() external returns (uint256) { + revert(); + } + + function throwInvalidOpcode() external returns (uint256) { + assembly { + invalid() + } + } + + function returnForcedEmpty() external returns (uint256) { + assembly { + return(0x60, 0) + } + } + + function returnTruncated() external returns (uint256) { + uint256 v = VALID_RETURN_VALUE; + assembly { + mstore(0x0, v) + return(0x0, 16) + } + } + + function returnEmpty() external { } + + function returnValid() external returns (uint256) { + return VALID_RETURN_VALUE; + } +} diff --git a/contracts/integrations/package.json b/contracts/integrations/package.json index dd36a2fb3c..b870feeb49 100644 --- a/contracts/integrations/package.json +++ b/contracts/integrations/package.json @@ -38,7 +38,7 @@ }, "config": { "publicInterfaceContracts": "TestFramework", - "abis": "./test/generated-artifacts/@(TestDydxUser|TestEth2Dai|TestEth2DaiBridge|TestFramework|TestMainnetAggregatorFills|TestSignatureValidationWallet|TestUniswapBridge|TestUniswapExchange|TestUniswapExchangeFactory).json", + "abis": "./test/generated-artifacts/@(TestContractWrapper|TestDydxUser|TestEth2Dai|TestEth2DaiBridge|TestFramework|TestMainnetAggregatorFills|TestSignatureValidationWallet|TestUniswapBridge|TestUniswapExchange|TestUniswapExchangeFactory).json", "abis:comment": "This list is auto-generated by contracts-gen. Don't edit manually." }, "repository": { diff --git a/contracts/integrations/test/artifacts.ts b/contracts/integrations/test/artifacts.ts index e809cb0a55..fe3112296c 100644 --- a/contracts/integrations/test/artifacts.ts +++ b/contracts/integrations/test/artifacts.ts @@ -5,6 +5,7 @@ */ import { ContractArtifact } from 'ethereum-types'; +import * as TestContractWrapper from '../test/generated-artifacts/TestContractWrapper.json'; import * as TestDydxUser from '../test/generated-artifacts/TestDydxUser.json'; import * as TestEth2Dai from '../test/generated-artifacts/TestEth2Dai.json'; import * as TestEth2DaiBridge from '../test/generated-artifacts/TestEth2DaiBridge.json'; @@ -15,6 +16,7 @@ import * as TestUniswapBridge from '../test/generated-artifacts/TestUniswapBridg import * as TestUniswapExchange from '../test/generated-artifacts/TestUniswapExchange.json'; import * as TestUniswapExchangeFactory from '../test/generated-artifacts/TestUniswapExchangeFactory.json'; export const artifacts = { + TestContractWrapper: TestContractWrapper as ContractArtifact, TestDydxUser: TestDydxUser as ContractArtifact, TestEth2Dai: TestEth2Dai as ContractArtifact, TestEth2DaiBridge: TestEth2DaiBridge as ContractArtifact, diff --git a/contracts/integrations/test/mainnet_contract_wrapper_test.ts b/contracts/integrations/test/mainnet_contract_wrapper_test.ts new file mode 100644 index 0000000000..e6b020c1ca --- /dev/null +++ b/contracts/integrations/test/mainnet_contract_wrapper_test.ts @@ -0,0 +1,53 @@ +import { blockchainTests, expect } from '@0x/contracts-test-utils'; +import { BigNumber } from '@0x/utils'; + +import { TestContractWrapperContract } from './wrappers'; + +blockchainTests.live('Contract wrapper mainnet callAsync revert behavior tests', env => { + // Mainnet address of the `TestContractWrapper` contract. + const TEST_CONTRACT_ADDRESS = '0x3C120F51aa2360E6C7078dbc849591dd14F21405'; + const REVERT_STRING = 'ERROR'; + const VALID_RESULT = new BigNumber('0xf984f922a56ea9a20a32a32f0f60f2d216ff0c0a0d16c986a97a7f1897a6613b'); + let testContract: TestContractWrapperContract; + + before(async () => { + testContract = new TestContractWrapperContract(TEST_CONTRACT_ADDRESS, env.provider, env.txDefaults); + }); + + describe('callAsync()', () => { + it('can decode valid result', async () => { + const result = await testContract.returnValid().callAsync(); + expect(result).to.bignumber.eq(VALID_RESULT); + }); + + it('can decode an empty result', async () => { + const result = await testContract.returnEmpty().callAsync(); + expect(result).to.eq(undefined); + }); + + it('catches a string revert', async () => { + const tx = testContract.throwStringRevert().callAsync(); + return expect(tx).to.revertWith(REVERT_STRING); + }); + + it('catches an empty revert', async () => { + const tx = testContract.throwEmptyRevert().callAsync(); + return expect(tx).to.be.rejectedWith('reverted with no data'); + }); + + it('catches invalid opcode', async () => { + const tx = testContract.throwInvalidOpcode().callAsync(); + return expect(tx).to.be.rejectedWith('reverted with no data'); + }); + + it('catches a forced empty result', async () => { + const tx = testContract.returnForcedEmpty().callAsync(); + return expect(tx).to.be.rejectedWith('reverted with no data'); + }); + + it('catches a truncated result', async () => { + const tx = testContract.returnTruncated().callAsync(); + return expect(tx).to.be.rejectedWith('decode beyond the end of calldata'); + }); + }); +}); diff --git a/contracts/integrations/test/wrappers.ts b/contracts/integrations/test/wrappers.ts index f466ee2b90..d9a1dad83d 100644 --- a/contracts/integrations/test/wrappers.ts +++ b/contracts/integrations/test/wrappers.ts @@ -3,6 +3,7 @@ * Warning: This file is auto-generated by contracts-gen. Don't edit manually. * ----------------------------------------------------------------------------- */ +export * from '../test/generated-wrappers/test_contract_wrapper'; export * from '../test/generated-wrappers/test_dydx_user'; export * from '../test/generated-wrappers/test_eth2_dai'; export * from '../test/generated-wrappers/test_eth2_dai_bridge'; diff --git a/contracts/integrations/tsconfig.json b/contracts/integrations/tsconfig.json index 8f879b58aa..081fefff5e 100644 --- a/contracts/integrations/tsconfig.json +++ b/contracts/integrations/tsconfig.json @@ -4,6 +4,7 @@ "include": ["./src/**/*", "./test/**/*", "./generated-wrappers/**/*"], "files": [ "generated-artifacts/TestFramework.json", + "test/generated-artifacts/TestContractWrapper.json", "test/generated-artifacts/TestDydxUser.json", "test/generated-artifacts/TestEth2Dai.json", "test/generated-artifacts/TestEth2DaiBridge.json", diff --git a/packages/abi-gen/CHANGELOG.json b/packages/abi-gen/CHANGELOG.json index 05e29f8212..e15b917869 100644 --- a/packages/abi-gen/CHANGELOG.json +++ b/packages/abi-gen/CHANGELOG.json @@ -1,4 +1,17 @@ [ + { + "version": "5.1.0", + "changes": [ + { + "note": "Catch empty call reverts on live networks.", + "pr": 2433 + }, + { + "note": "Regenerate test outputs.", + "pr": 2433 + } + ] + }, { "timestamp": 1578272714, "version": "5.0.3", diff --git a/packages/abi-gen/templates/TypeScript/partials/method_call.handlebars b/packages/abi-gen/templates/TypeScript/partials/method_call.handlebars index 687c8488a9..412ef1c931 100644 --- a/packages/abi-gen/templates/TypeScript/partials/method_call.handlebars +++ b/packages/abi-gen/templates/TypeScript/partials/method_call.handlebars @@ -9,6 +9,7 @@ async callAsync( const rawCallResult = await self._performCallAsync({ ...callData, data: this.getABIEncodedTransactionData() }, defaultBlock); {{/ifEquals}} const abiEncoder = self._lookupAbiEncoder(functionSignature); + BaseContract._throwIfUnexpectedEmptyCallResult(rawCallResult, abiEncoder); return abiEncoder.strictDecodeReturnValue<{{> return_type outputs=outputs}}>(rawCallResult); }, getABIEncodedTransactionData(): string { diff --git a/packages/abi-gen/test-cli/output/typescript/abi_gen_dummy.ts b/packages/abi-gen/test-cli/output/typescript/abi_gen_dummy.ts index ef6b852714..d408c9538c 100644 --- a/packages/abi-gen/test-cli/output/typescript/abi_gen_dummy.ts +++ b/packages/abi-gen/test-cli/output/typescript/abi_gen_dummy.ts @@ -846,6 +846,7 @@ export class AbiGenDummyContract extends BaseContract { BaseContract._assertCallParams(callData, defaultBlock); const rawCallResult = await self._evmExecAsync(this.getABIEncodedTransactionData()); const abiEncoder = self._lookupAbiEncoder(functionSignature); + BaseContract._throwIfUnexpectedEmptyCallResult(rawCallResult, abiEncoder); return abiEncoder.strictDecodeReturnValue(rawCallResult); }, getABIEncodedTransactionData(): string { @@ -863,6 +864,7 @@ export class AbiGenDummyContract extends BaseContract { BaseContract._assertCallParams(callData, defaultBlock); const rawCallResult = await self._evmExecAsync(this.getABIEncodedTransactionData()); const abiEncoder = self._lookupAbiEncoder(functionSignature); + BaseContract._throwIfUnexpectedEmptyCallResult(rawCallResult, abiEncoder); return abiEncoder.strictDecodeReturnValue(rawCallResult); }, getABIEncodedTransactionData(): string { @@ -900,6 +902,7 @@ export class AbiGenDummyContract extends BaseContract { BaseContract._assertCallParams(callData, defaultBlock); const rawCallResult = await self._evmExecAsync(this.getABIEncodedTransactionData()); const abiEncoder = self._lookupAbiEncoder(functionSignature); + BaseContract._throwIfUnexpectedEmptyCallResult(rawCallResult, abiEncoder); return abiEncoder.strictDecodeReturnValue<{ input: { foo: BigNumber; bar: string; car: string }; lorem: string; @@ -936,6 +939,7 @@ export class AbiGenDummyContract extends BaseContract { BaseContract._assertCallParams(callData, defaultBlock); const rawCallResult = await self._evmExecAsync(this.getABIEncodedTransactionData()); const abiEncoder = self._lookupAbiEncoder(functionSignature); + BaseContract._throwIfUnexpectedEmptyCallResult(rawCallResult, abiEncoder); return abiEncoder.strictDecodeReturnValue(rawCallResult); }, getABIEncodedTransactionData(): string { @@ -981,6 +985,7 @@ export class AbiGenDummyContract extends BaseContract { defaultBlock, ); const abiEncoder = self._lookupAbiEncoder(functionSignature); + BaseContract._throwIfUnexpectedEmptyCallResult(rawCallResult, abiEncoder); return abiEncoder.strictDecodeReturnValue(rawCallResult); }, getABIEncodedTransactionData(): string { @@ -1004,6 +1009,7 @@ export class AbiGenDummyContract extends BaseContract { BaseContract._assertCallParams(callData, defaultBlock); const rawCallResult = await self._evmExecAsync(this.getABIEncodedTransactionData()); const abiEncoder = self._lookupAbiEncoder(functionSignature); + BaseContract._throwIfUnexpectedEmptyCallResult(rawCallResult, abiEncoder); return abiEncoder.strictDecodeReturnValue< Array<{ someBytes: string; anInteger: number; aDynamicArrayOfBytes: string[]; aString: string }> >(rawCallResult); @@ -1022,6 +1028,7 @@ export class AbiGenDummyContract extends BaseContract { BaseContract._assertCallParams(callData, defaultBlock); const rawCallResult = await self._evmExecAsync(this.getABIEncodedTransactionData()); const abiEncoder = self._lookupAbiEncoder(functionSignature); + BaseContract._throwIfUnexpectedEmptyCallResult(rawCallResult, abiEncoder); return abiEncoder.strictDecodeReturnValue<[BigNumber, string]>(rawCallResult); }, getABIEncodedTransactionData(): string { @@ -1043,6 +1050,7 @@ export class AbiGenDummyContract extends BaseContract { BaseContract._assertCallParams(callData, defaultBlock); const rawCallResult = await self._evmExecAsync(this.getABIEncodedTransactionData()); const abiEncoder = self._lookupAbiEncoder(functionSignature); + BaseContract._throwIfUnexpectedEmptyCallResult(rawCallResult, abiEncoder); return abiEncoder.strictDecodeReturnValue<{ innerStruct: { aField: BigNumber } }>(rawCallResult); }, getABIEncodedTransactionData(): string { @@ -1072,6 +1080,7 @@ export class AbiGenDummyContract extends BaseContract { BaseContract._assertCallParams(callData, defaultBlock); const rawCallResult = await self._evmExecAsync(this.getABIEncodedTransactionData()); const abiEncoder = self._lookupAbiEncoder(functionSignature); + BaseContract._throwIfUnexpectedEmptyCallResult(rawCallResult, abiEncoder); return abiEncoder.strictDecodeReturnValue<[string, string, string]>(rawCallResult); }, getABIEncodedTransactionData(): string { @@ -1097,6 +1106,7 @@ export class AbiGenDummyContract extends BaseContract { BaseContract._assertCallParams(callData, defaultBlock); const rawCallResult = await self._evmExecAsync(this.getABIEncodedTransactionData()); const abiEncoder = self._lookupAbiEncoder(functionSignature); + BaseContract._throwIfUnexpectedEmptyCallResult(rawCallResult, abiEncoder); return abiEncoder.strictDecodeReturnValue(rawCallResult); }, getABIEncodedTransactionData(): string { @@ -1122,6 +1132,7 @@ export class AbiGenDummyContract extends BaseContract { BaseContract._assertCallParams(callData, defaultBlock); const rawCallResult = await self._evmExecAsync(this.getABIEncodedTransactionData()); const abiEncoder = self._lookupAbiEncoder(functionSignature); + BaseContract._throwIfUnexpectedEmptyCallResult(rawCallResult, abiEncoder); return abiEncoder.strictDecodeReturnValue<{ innerStruct: { someBytes: string; @@ -1149,6 +1160,7 @@ export class AbiGenDummyContract extends BaseContract { BaseContract._assertCallParams(callData, defaultBlock); const rawCallResult = await self._evmExecAsync(this.getABIEncodedTransactionData()); const abiEncoder = self._lookupAbiEncoder(functionSignature); + BaseContract._throwIfUnexpectedEmptyCallResult(rawCallResult, abiEncoder); return abiEncoder.strictDecodeReturnValue(rawCallResult); }, getABIEncodedTransactionData(): string { @@ -1168,6 +1180,7 @@ export class AbiGenDummyContract extends BaseContract { BaseContract._assertCallParams(callData, defaultBlock); const rawCallResult = await self._evmExecAsync(this.getABIEncodedTransactionData()); const abiEncoder = self._lookupAbiEncoder(functionSignature); + BaseContract._throwIfUnexpectedEmptyCallResult(rawCallResult, abiEncoder); return abiEncoder.strictDecodeReturnValue(rawCallResult); }, getABIEncodedTransactionData(): string { @@ -1213,6 +1226,7 @@ export class AbiGenDummyContract extends BaseContract { defaultBlock, ); const abiEncoder = self._lookupAbiEncoder(functionSignature); + BaseContract._throwIfUnexpectedEmptyCallResult(rawCallResult, abiEncoder); return abiEncoder.strictDecodeReturnValue(rawCallResult); }, getABIEncodedTransactionData(): string { @@ -1258,6 +1272,7 @@ export class AbiGenDummyContract extends BaseContract { defaultBlock, ); const abiEncoder = self._lookupAbiEncoder(functionSignature); + BaseContract._throwIfUnexpectedEmptyCallResult(rawCallResult, abiEncoder); return abiEncoder.strictDecodeReturnValue(rawCallResult); }, getABIEncodedTransactionData(): string { @@ -1275,6 +1290,7 @@ export class AbiGenDummyContract extends BaseContract { BaseContract._assertCallParams(callData, defaultBlock); const rawCallResult = await self._evmExecAsync(this.getABIEncodedTransactionData()); const abiEncoder = self._lookupAbiEncoder(functionSignature); + BaseContract._throwIfUnexpectedEmptyCallResult(rawCallResult, abiEncoder); return abiEncoder.strictDecodeReturnValue(rawCallResult); }, getABIEncodedTransactionData(): string { @@ -1292,6 +1308,7 @@ export class AbiGenDummyContract extends BaseContract { BaseContract._assertCallParams(callData, defaultBlock); const rawCallResult = await self._evmExecAsync(this.getABIEncodedTransactionData()); const abiEncoder = self._lookupAbiEncoder(functionSignature); + BaseContract._throwIfUnexpectedEmptyCallResult(rawCallResult, abiEncoder); return abiEncoder.strictDecodeReturnValue(rawCallResult); }, getABIEncodedTransactionData(): string { @@ -1308,6 +1325,7 @@ export class AbiGenDummyContract extends BaseContract { BaseContract._assertCallParams(callData, defaultBlock); const rawCallResult = await self._evmExecAsync(this.getABIEncodedTransactionData()); const abiEncoder = self._lookupAbiEncoder(functionSignature); + BaseContract._throwIfUnexpectedEmptyCallResult(rawCallResult, abiEncoder); return abiEncoder.strictDecodeReturnValue(rawCallResult); }, getABIEncodedTransactionData(): string { @@ -1324,6 +1342,7 @@ export class AbiGenDummyContract extends BaseContract { BaseContract._assertCallParams(callData, defaultBlock); const rawCallResult = await self._evmExecAsync(this.getABIEncodedTransactionData()); const abiEncoder = self._lookupAbiEncoder(functionSignature); + BaseContract._throwIfUnexpectedEmptyCallResult(rawCallResult, abiEncoder); return abiEncoder.strictDecodeReturnValue(rawCallResult); }, getABIEncodedTransactionData(): string { @@ -1340,6 +1359,7 @@ export class AbiGenDummyContract extends BaseContract { BaseContract._assertCallParams(callData, defaultBlock); const rawCallResult = await self._evmExecAsync(this.getABIEncodedTransactionData()); const abiEncoder = self._lookupAbiEncoder(functionSignature); + BaseContract._throwIfUnexpectedEmptyCallResult(rawCallResult, abiEncoder); return abiEncoder.strictDecodeReturnValue(rawCallResult); }, getABIEncodedTransactionData(): string { @@ -1360,6 +1380,7 @@ export class AbiGenDummyContract extends BaseContract { BaseContract._assertCallParams(callData, defaultBlock); const rawCallResult = await self._evmExecAsync(this.getABIEncodedTransactionData()); const abiEncoder = self._lookupAbiEncoder(functionSignature); + BaseContract._throwIfUnexpectedEmptyCallResult(rawCallResult, abiEncoder); return abiEncoder.strictDecodeReturnValue(rawCallResult); }, getABIEncodedTransactionData(): string { @@ -1380,6 +1401,7 @@ export class AbiGenDummyContract extends BaseContract { BaseContract._assertCallParams(callData, defaultBlock); const rawCallResult = await self._evmExecAsync(this.getABIEncodedTransactionData()); const abiEncoder = self._lookupAbiEncoder(functionSignature); + BaseContract._throwIfUnexpectedEmptyCallResult(rawCallResult, abiEncoder); return abiEncoder.strictDecodeReturnValue(rawCallResult); }, getABIEncodedTransactionData(): string { @@ -1396,6 +1418,7 @@ export class AbiGenDummyContract extends BaseContract { BaseContract._assertCallParams(callData, defaultBlock); const rawCallResult = await self._evmExecAsync(this.getABIEncodedTransactionData()); const abiEncoder = self._lookupAbiEncoder(functionSignature); + BaseContract._throwIfUnexpectedEmptyCallResult(rawCallResult, abiEncoder); return abiEncoder.strictDecodeReturnValue(rawCallResult); }, getABIEncodedTransactionData(): string { @@ -1413,6 +1436,7 @@ export class AbiGenDummyContract extends BaseContract { BaseContract._assertCallParams(callData, defaultBlock); const rawCallResult = await self._evmExecAsync(this.getABIEncodedTransactionData()); const abiEncoder = self._lookupAbiEncoder(functionSignature); + BaseContract._throwIfUnexpectedEmptyCallResult(rawCallResult, abiEncoder); return abiEncoder.strictDecodeReturnValue(rawCallResult); }, getABIEncodedTransactionData(): string { @@ -1429,6 +1453,7 @@ export class AbiGenDummyContract extends BaseContract { BaseContract._assertCallParams(callData, defaultBlock); const rawCallResult = await self._evmExecAsync(this.getABIEncodedTransactionData()); const abiEncoder = self._lookupAbiEncoder(functionSignature); + BaseContract._throwIfUnexpectedEmptyCallResult(rawCallResult, abiEncoder); return abiEncoder.strictDecodeReturnValue(rawCallResult); }, getABIEncodedTransactionData(): string { @@ -1445,6 +1470,7 @@ export class AbiGenDummyContract extends BaseContract { BaseContract._assertCallParams(callData, defaultBlock); const rawCallResult = await self._evmExecAsync(this.getABIEncodedTransactionData()); const abiEncoder = self._lookupAbiEncoder(functionSignature); + BaseContract._throwIfUnexpectedEmptyCallResult(rawCallResult, abiEncoder); return abiEncoder.strictDecodeReturnValue(rawCallResult); }, getABIEncodedTransactionData(): string { @@ -1467,6 +1493,7 @@ export class AbiGenDummyContract extends BaseContract { BaseContract._assertCallParams(callData, defaultBlock); const rawCallResult = await self._evmExecAsync(this.getABIEncodedTransactionData()); const abiEncoder = self._lookupAbiEncoder(functionSignature); + BaseContract._throwIfUnexpectedEmptyCallResult(rawCallResult, abiEncoder); return abiEncoder.strictDecodeReturnValue(rawCallResult); }, getABIEncodedTransactionData(): string { @@ -1495,6 +1522,7 @@ export class AbiGenDummyContract extends BaseContract { BaseContract._assertCallParams(callData, defaultBlock); const rawCallResult = await self._evmExecAsync(this.getABIEncodedTransactionData()); const abiEncoder = self._lookupAbiEncoder(functionSignature); + BaseContract._throwIfUnexpectedEmptyCallResult(rawCallResult, abiEncoder); return abiEncoder.strictDecodeReturnValue<{ someBytes: string; anInteger: number; @@ -1527,6 +1555,7 @@ export class AbiGenDummyContract extends BaseContract { BaseContract._assertCallParams(callData, defaultBlock); const rawCallResult = await self._evmExecAsync(this.getABIEncodedTransactionData()); const abiEncoder = self._lookupAbiEncoder(functionSignature); + BaseContract._throwIfUnexpectedEmptyCallResult(rawCallResult, abiEncoder); return abiEncoder.strictDecodeReturnValue(rawCallResult); }, getABIEncodedTransactionData(): string { @@ -1573,6 +1602,7 @@ export class AbiGenDummyContract extends BaseContract { defaultBlock, ); const abiEncoder = self._lookupAbiEncoder(functionSignature); + BaseContract._throwIfUnexpectedEmptyCallResult(rawCallResult, abiEncoder); return abiEncoder.strictDecodeReturnValue(rawCallResult); }, getABIEncodedTransactionData(): string { diff --git a/packages/abi-gen/test-cli/output/typescript/test_lib_dummy.ts b/packages/abi-gen/test-cli/output/typescript/test_lib_dummy.ts index 682624229f..bc9d9a0f1d 100644 --- a/packages/abi-gen/test-cli/output/typescript/test_lib_dummy.ts +++ b/packages/abi-gen/test-cli/output/typescript/test_lib_dummy.ts @@ -193,6 +193,7 @@ export class TestLibDummyContract extends BaseContract { BaseContract._assertCallParams(callData, defaultBlock); const rawCallResult = await self._evmExecAsync(this.getABIEncodedTransactionData()); const abiEncoder = self._lookupAbiEncoder(functionSignature); + BaseContract._throwIfUnexpectedEmptyCallResult(rawCallResult, abiEncoder); return abiEncoder.strictDecodeReturnValue(rawCallResult); }, getABIEncodedTransactionData(): string { @@ -210,6 +211,7 @@ export class TestLibDummyContract extends BaseContract { BaseContract._assertCallParams(callData, defaultBlock); const rawCallResult = await self._evmExecAsync(this.getABIEncodedTransactionData()); const abiEncoder = self._lookupAbiEncoder(functionSignature); + BaseContract._throwIfUnexpectedEmptyCallResult(rawCallResult, abiEncoder); return abiEncoder.strictDecodeReturnValue(rawCallResult); }, getABIEncodedTransactionData(): string { diff --git a/packages/base-contract/CHANGELOG.json b/packages/base-contract/CHANGELOG.json index 714e2774ab..d9aa906b81 100644 --- a/packages/base-contract/CHANGELOG.json +++ b/packages/base-contract/CHANGELOG.json @@ -1,4 +1,13 @@ [ + { + "version": "6.1.0", + "changes": [ + { + "note": "Support catching empty reverts on live networks.", + "pr": 2433 + } + ] + }, { "timestamp": 1578272714, "version": "6.0.3", diff --git a/packages/base-contract/src/index.ts b/packages/base-contract/src/index.ts index b22dedf20e..7728df12c1 100644 --- a/packages/base-contract/src/index.ts +++ b/packages/base-contract/src/index.ts @@ -152,6 +152,20 @@ export class BaseContract { } throw revertError; } + protected static _throwIfUnexpectedEmptyCallResult(rawCallResult: string, methodAbi: AbiEncoder.Method): void { + // With live nodes, we will receive an empty call result if: + // 1. The function has no return value. + // 2. The contract reverts without data. + // 3. The contract reverts with an invalid opcode (`assert(false)` or `invalid()`). + if (!rawCallResult || rawCallResult === '0x') { + const returnValueDataItem = methodAbi.getReturnValueDataItem(); + if (returnValueDataItem.components === undefined || returnValueDataItem.components.length === 0) { + // Expected no result (which makes it hard to tell if the call reverted). + return; + } + throw new Error(`Function "${methodAbi.getSignature()}" reverted with no data`); + } + } // Throws if the given arguments cannot be safely/correctly encoded based on // the given inputAbi. An argument may not be considered safely encodeable // if it overflows the corresponding Solidity type, there is a bug in the diff --git a/packages/contract-wrappers/CHANGELOG.json b/packages/contract-wrappers/CHANGELOG.json index 902e16c54b..caafd1c814 100644 --- a/packages/contract-wrappers/CHANGELOG.json +++ b/packages/contract-wrappers/CHANGELOG.json @@ -5,6 +5,10 @@ { "note": "Update all wrappers.", "pr": 2432 + }, + { + "note": "Regenerate wrappers to catch empty reverts on live networks.", + "pr": 2433 } ] }, diff --git a/packages/contract-wrappers/src/generated-wrappers/coordinator.ts b/packages/contract-wrappers/src/generated-wrappers/coordinator.ts index 4a680b7710..fdc8ae55df 100644 --- a/packages/contract-wrappers/src/generated-wrappers/coordinator.ts +++ b/packages/contract-wrappers/src/generated-wrappers/coordinator.ts @@ -495,6 +495,7 @@ export class CoordinatorContract extends BaseContract { defaultBlock, ); const abiEncoder = self._lookupAbiEncoder(functionSignature); + BaseContract._throwIfUnexpectedEmptyCallResult(rawCallResult, abiEncoder); return abiEncoder.strictDecodeReturnValue(rawCallResult); }, getABIEncodedTransactionData(): string { @@ -514,6 +515,7 @@ export class CoordinatorContract extends BaseContract { defaultBlock, ); const abiEncoder = self._lookupAbiEncoder(functionSignature); + BaseContract._throwIfUnexpectedEmptyCallResult(rawCallResult, abiEncoder); return abiEncoder.strictDecodeReturnValue(rawCallResult); }, getABIEncodedTransactionData(): string { @@ -533,6 +535,7 @@ export class CoordinatorContract extends BaseContract { defaultBlock, ); const abiEncoder = self._lookupAbiEncoder(functionSignature); + BaseContract._throwIfUnexpectedEmptyCallResult(rawCallResult, abiEncoder); return abiEncoder.strictDecodeReturnValue(rawCallResult); }, getABIEncodedTransactionData(): string { @@ -552,6 +555,7 @@ export class CoordinatorContract extends BaseContract { defaultBlock, ); const abiEncoder = self._lookupAbiEncoder(functionSignature); + BaseContract._throwIfUnexpectedEmptyCallResult(rawCallResult, abiEncoder); return abiEncoder.strictDecodeReturnValue(rawCallResult); }, getABIEncodedTransactionData(): string { @@ -571,6 +575,7 @@ export class CoordinatorContract extends BaseContract { defaultBlock, ); const abiEncoder = self._lookupAbiEncoder(functionSignature); + BaseContract._throwIfUnexpectedEmptyCallResult(rawCallResult, abiEncoder); return abiEncoder.strictDecodeReturnValue(rawCallResult); }, getABIEncodedTransactionData(): string { @@ -618,6 +623,7 @@ export class CoordinatorContract extends BaseContract { defaultBlock, ); const abiEncoder = self._lookupAbiEncoder(functionSignature); + BaseContract._throwIfUnexpectedEmptyCallResult(rawCallResult, abiEncoder); return abiEncoder.strictDecodeReturnValue(rawCallResult); }, getABIEncodedTransactionData(): string { @@ -684,6 +690,7 @@ export class CoordinatorContract extends BaseContract { BaseContract._assertCallParams(callData, defaultBlock); const rawCallResult = await self._evmExecAsync(this.getABIEncodedTransactionData()); const abiEncoder = self._lookupAbiEncoder(functionSignature); + BaseContract._throwIfUnexpectedEmptyCallResult(rawCallResult, abiEncoder); return abiEncoder.strictDecodeReturnValue< Array<{ makerAddress: string; @@ -773,6 +780,7 @@ export class CoordinatorContract extends BaseContract { defaultBlock, ); const abiEncoder = self._lookupAbiEncoder(functionSignature); + BaseContract._throwIfUnexpectedEmptyCallResult(rawCallResult, abiEncoder); return abiEncoder.strictDecodeReturnValue(rawCallResult); }, getABIEncodedTransactionData(): string { @@ -809,6 +817,7 @@ export class CoordinatorContract extends BaseContract { defaultBlock, ); const abiEncoder = self._lookupAbiEncoder(functionSignature); + BaseContract._throwIfUnexpectedEmptyCallResult(rawCallResult, abiEncoder); return abiEncoder.strictDecodeReturnValue(rawCallResult); }, getABIEncodedTransactionData(): string { @@ -833,6 +842,7 @@ export class CoordinatorContract extends BaseContract { BaseContract._assertCallParams(callData, defaultBlock); const rawCallResult = await self._evmExecAsync(this.getABIEncodedTransactionData()); const abiEncoder = self._lookupAbiEncoder(functionSignature); + BaseContract._throwIfUnexpectedEmptyCallResult(rawCallResult, abiEncoder); return abiEncoder.strictDecodeReturnValue(rawCallResult); }, getABIEncodedTransactionData(): string { diff --git a/packages/contract-wrappers/src/generated-wrappers/dev_utils.ts b/packages/contract-wrappers/src/generated-wrappers/dev_utils.ts index 1cc1823344..221a2fbcd2 100644 --- a/packages/contract-wrappers/src/generated-wrappers/dev_utils.ts +++ b/packages/contract-wrappers/src/generated-wrappers/dev_utils.ts @@ -1756,6 +1756,7 @@ export class DevUtilsContract extends BaseContract { defaultBlock, ); const abiEncoder = self._lookupAbiEncoder(functionSignature); + BaseContract._throwIfUnexpectedEmptyCallResult(rawCallResult, abiEncoder); return abiEncoder.strictDecodeReturnValue(rawCallResult); }, getABIEncodedTransactionData(): string { @@ -1781,6 +1782,7 @@ export class DevUtilsContract extends BaseContract { BaseContract._assertCallParams(callData, defaultBlock); const rawCallResult = await self._evmExecAsync(this.getABIEncodedTransactionData()); const abiEncoder = self._lookupAbiEncoder(functionSignature); + BaseContract._throwIfUnexpectedEmptyCallResult(rawCallResult, abiEncoder); return abiEncoder.strictDecodeReturnValue<[number, string, string]>(rawCallResult); }, getABIEncodedTransactionData(): string { @@ -1803,6 +1805,7 @@ export class DevUtilsContract extends BaseContract { BaseContract._assertCallParams(callData, defaultBlock); const rawCallResult = await self._evmExecAsync(this.getABIEncodedTransactionData()); const abiEncoder = self._lookupAbiEncoder(functionSignature); + BaseContract._throwIfUnexpectedEmptyCallResult(rawCallResult, abiEncoder); return abiEncoder.strictDecodeReturnValue<[string, string]>(rawCallResult); }, getABIEncodedTransactionData(): string { @@ -1826,6 +1829,7 @@ export class DevUtilsContract extends BaseContract { BaseContract._assertCallParams(callData, defaultBlock); const rawCallResult = await self._evmExecAsync(this.getABIEncodedTransactionData()); const abiEncoder = self._lookupAbiEncoder(functionSignature); + BaseContract._throwIfUnexpectedEmptyCallResult(rawCallResult, abiEncoder); return abiEncoder.strictDecodeReturnValue(rawCallResult); }, getABIEncodedTransactionData(): string { @@ -1851,6 +1855,7 @@ export class DevUtilsContract extends BaseContract { BaseContract._assertCallParams(callData, defaultBlock); const rawCallResult = await self._evmExecAsync(this.getABIEncodedTransactionData()); const abiEncoder = self._lookupAbiEncoder(functionSignature); + BaseContract._throwIfUnexpectedEmptyCallResult(rawCallResult, abiEncoder); return abiEncoder.strictDecodeReturnValue<[string, string, string]>(rawCallResult); }, getABIEncodedTransactionData(): string { @@ -1876,6 +1881,7 @@ export class DevUtilsContract extends BaseContract { BaseContract._assertCallParams(callData, defaultBlock); const rawCallResult = await self._evmExecAsync(this.getABIEncodedTransactionData()); const abiEncoder = self._lookupAbiEncoder(functionSignature); + BaseContract._throwIfUnexpectedEmptyCallResult(rawCallResult, abiEncoder); return abiEncoder.strictDecodeReturnValue<[string, string, string, string]>(rawCallResult); }, getABIEncodedTransactionData(): string { @@ -1904,6 +1910,7 @@ export class DevUtilsContract extends BaseContract { BaseContract._assertCallParams(callData, defaultBlock); const rawCallResult = await self._evmExecAsync(this.getABIEncodedTransactionData()); const abiEncoder = self._lookupAbiEncoder(functionSignature); + BaseContract._throwIfUnexpectedEmptyCallResult(rawCallResult, abiEncoder); return abiEncoder.strictDecodeReturnValue<[string, string, BigNumber[], BigNumber[], string]>( rawCallResult, ); @@ -1928,6 +1935,7 @@ export class DevUtilsContract extends BaseContract { BaseContract._assertCallParams(callData, defaultBlock); const rawCallResult = await self._evmExecAsync(this.getABIEncodedTransactionData()); const abiEncoder = self._lookupAbiEncoder(functionSignature); + BaseContract._throwIfUnexpectedEmptyCallResult(rawCallResult, abiEncoder); return abiEncoder.strictDecodeReturnValue<[string, string]>(rawCallResult); }, getABIEncodedTransactionData(): string { @@ -1954,6 +1962,7 @@ export class DevUtilsContract extends BaseContract { BaseContract._assertCallParams(callData, defaultBlock); const rawCallResult = await self._evmExecAsync(this.getABIEncodedTransactionData()); const abiEncoder = self._lookupAbiEncoder(functionSignature); + BaseContract._throwIfUnexpectedEmptyCallResult(rawCallResult, abiEncoder); return abiEncoder.strictDecodeReturnValue<[string, string, BigNumber]>(rawCallResult); }, getABIEncodedTransactionData(): string { @@ -1979,6 +1988,7 @@ export class DevUtilsContract extends BaseContract { BaseContract._assertCallParams(callData, defaultBlock); const rawCallResult = await self._evmExecAsync(this.getABIEncodedTransactionData()); const abiEncoder = self._lookupAbiEncoder(functionSignature); + BaseContract._throwIfUnexpectedEmptyCallResult(rawCallResult, abiEncoder); return abiEncoder.strictDecodeReturnValue<[number, string, string]>(rawCallResult); }, getABIEncodedTransactionData(): string { @@ -2001,6 +2011,7 @@ export class DevUtilsContract extends BaseContract { BaseContract._assertCallParams(callData, defaultBlock); const rawCallResult = await self._evmExecAsync(this.getABIEncodedTransactionData()); const abiEncoder = self._lookupAbiEncoder(functionSignature); + BaseContract._throwIfUnexpectedEmptyCallResult(rawCallResult, abiEncoder); return abiEncoder.strictDecodeReturnValue<[number, string]>(rawCallResult); }, getABIEncodedTransactionData(): string { @@ -2026,6 +2037,7 @@ export class DevUtilsContract extends BaseContract { BaseContract._assertCallParams(callData, defaultBlock); const rawCallResult = await self._evmExecAsync(this.getABIEncodedTransactionData()); const abiEncoder = self._lookupAbiEncoder(functionSignature); + BaseContract._throwIfUnexpectedEmptyCallResult(rawCallResult, abiEncoder); return abiEncoder.strictDecodeReturnValue<[number, BigNumber, BigNumber]>(rawCallResult); }, getABIEncodedTransactionData(): string { @@ -2051,6 +2063,7 @@ export class DevUtilsContract extends BaseContract { BaseContract._assertCallParams(callData, defaultBlock); const rawCallResult = await self._evmExecAsync(this.getABIEncodedTransactionData()); const abiEncoder = self._lookupAbiEncoder(functionSignature); + BaseContract._throwIfUnexpectedEmptyCallResult(rawCallResult, abiEncoder); return abiEncoder.strictDecodeReturnValue<[string, BigNumber[], string[]]>(rawCallResult); }, getABIEncodedTransactionData(): string { @@ -2073,6 +2086,7 @@ export class DevUtilsContract extends BaseContract { BaseContract._assertCallParams(callData, defaultBlock); const rawCallResult = await self._evmExecAsync(this.getABIEncodedTransactionData()); const abiEncoder = self._lookupAbiEncoder(functionSignature); + BaseContract._throwIfUnexpectedEmptyCallResult(rawCallResult, abiEncoder); return abiEncoder.strictDecodeReturnValue<[string, string]>(rawCallResult); }, getABIEncodedTransactionData(): string { @@ -2098,6 +2112,7 @@ export class DevUtilsContract extends BaseContract { BaseContract._assertCallParams(callData, defaultBlock); const rawCallResult = await self._evmExecAsync(this.getABIEncodedTransactionData()); const abiEncoder = self._lookupAbiEncoder(functionSignature); + BaseContract._throwIfUnexpectedEmptyCallResult(rawCallResult, abiEncoder); return abiEncoder.strictDecodeReturnValue<[string, string, BigNumber]>(rawCallResult); }, getABIEncodedTransactionData(): string { @@ -2120,6 +2135,7 @@ export class DevUtilsContract extends BaseContract { BaseContract._assertCallParams(callData, defaultBlock); const rawCallResult = await self._evmExecAsync(this.getABIEncodedTransactionData()); const abiEncoder = self._lookupAbiEncoder(functionSignature); + BaseContract._throwIfUnexpectedEmptyCallResult(rawCallResult, abiEncoder); return abiEncoder.strictDecodeReturnValue<[string, number]>(rawCallResult); }, getABIEncodedTransactionData(): string { @@ -2145,6 +2161,7 @@ export class DevUtilsContract extends BaseContract { BaseContract._assertCallParams(callData, defaultBlock); const rawCallResult = await self._evmExecAsync(this.getABIEncodedTransactionData()); const abiEncoder = self._lookupAbiEncoder(functionSignature); + BaseContract._throwIfUnexpectedEmptyCallResult(rawCallResult, abiEncoder); return abiEncoder.strictDecodeReturnValue<[number, string, string, string]>(rawCallResult); }, getABIEncodedTransactionData(): string { @@ -2167,6 +2184,7 @@ export class DevUtilsContract extends BaseContract { BaseContract._assertCallParams(callData, defaultBlock); const rawCallResult = await self._evmExecAsync(this.getABIEncodedTransactionData()); const abiEncoder = self._lookupAbiEncoder(functionSignature); + BaseContract._throwIfUnexpectedEmptyCallResult(rawCallResult, abiEncoder); return abiEncoder.strictDecodeReturnValue<[string, string]>(rawCallResult); }, getABIEncodedTransactionData(): string { @@ -2192,6 +2210,7 @@ export class DevUtilsContract extends BaseContract { BaseContract._assertCallParams(callData, defaultBlock); const rawCallResult = await self._evmExecAsync(this.getABIEncodedTransactionData()); const abiEncoder = self._lookupAbiEncoder(functionSignature); + BaseContract._throwIfUnexpectedEmptyCallResult(rawCallResult, abiEncoder); return abiEncoder.strictDecodeReturnValue<[string, string, string, string]>(rawCallResult); }, getABIEncodedTransactionData(): string { @@ -2218,6 +2237,7 @@ export class DevUtilsContract extends BaseContract { BaseContract._assertCallParams(callData, defaultBlock); const rawCallResult = await self._evmExecAsync(this.getABIEncodedTransactionData()); const abiEncoder = self._lookupAbiEncoder(functionSignature); + BaseContract._throwIfUnexpectedEmptyCallResult(rawCallResult, abiEncoder); return abiEncoder.strictDecodeReturnValue<[string, string, string, string]>(rawCallResult); }, getABIEncodedTransactionData(): string { @@ -2240,6 +2260,7 @@ export class DevUtilsContract extends BaseContract { BaseContract._assertCallParams(callData, defaultBlock); const rawCallResult = await self._evmExecAsync(this.getABIEncodedTransactionData()); const abiEncoder = self._lookupAbiEncoder(functionSignature); + BaseContract._throwIfUnexpectedEmptyCallResult(rawCallResult, abiEncoder); return abiEncoder.strictDecodeReturnValue<[number, string]>(rawCallResult); }, getABIEncodedTransactionData(): string { @@ -2262,6 +2283,7 @@ export class DevUtilsContract extends BaseContract { BaseContract._assertCallParams(callData, defaultBlock); const rawCallResult = await self._evmExecAsync(this.getABIEncodedTransactionData()); const abiEncoder = self._lookupAbiEncoder(functionSignature); + BaseContract._throwIfUnexpectedEmptyCallResult(rawCallResult, abiEncoder); return abiEncoder.strictDecodeReturnValue<[string, string]>(rawCallResult); }, getABIEncodedTransactionData(): string { @@ -2334,6 +2356,7 @@ export class DevUtilsContract extends BaseContract { BaseContract._assertCallParams(callData, defaultBlock); const rawCallResult = await self._evmExecAsync(this.getABIEncodedTransactionData()); const abiEncoder = self._lookupAbiEncoder(functionSignature); + BaseContract._throwIfUnexpectedEmptyCallResult(rawCallResult, abiEncoder); return abiEncoder.strictDecodeReturnValue< [ string, @@ -2391,6 +2414,7 @@ export class DevUtilsContract extends BaseContract { BaseContract._assertCallParams(callData, defaultBlock); const rawCallResult = await self._evmExecAsync(this.getABIEncodedTransactionData()); const abiEncoder = self._lookupAbiEncoder(functionSignature); + BaseContract._throwIfUnexpectedEmptyCallResult(rawCallResult, abiEncoder); return abiEncoder.strictDecodeReturnValue(rawCallResult); }, getABIEncodedTransactionData(): string { @@ -2419,6 +2443,7 @@ export class DevUtilsContract extends BaseContract { BaseContract._assertCallParams(callData, defaultBlock); const rawCallResult = await self._evmExecAsync(this.getABIEncodedTransactionData()); const abiEncoder = self._lookupAbiEncoder(functionSignature); + BaseContract._throwIfUnexpectedEmptyCallResult(rawCallResult, abiEncoder); return abiEncoder.strictDecodeReturnValue(rawCallResult); }, getABIEncodedTransactionData(): string { @@ -2444,6 +2469,7 @@ export class DevUtilsContract extends BaseContract { BaseContract._assertCallParams(callData, defaultBlock); const rawCallResult = await self._evmExecAsync(this.getABIEncodedTransactionData()); const abiEncoder = self._lookupAbiEncoder(functionSignature); + BaseContract._throwIfUnexpectedEmptyCallResult(rawCallResult, abiEncoder); return abiEncoder.strictDecodeReturnValue(rawCallResult); }, getABIEncodedTransactionData(): string { @@ -2469,6 +2495,7 @@ export class DevUtilsContract extends BaseContract { BaseContract._assertCallParams(callData, defaultBlock); const rawCallResult = await self._evmExecAsync(this.getABIEncodedTransactionData()); const abiEncoder = self._lookupAbiEncoder(functionSignature); + BaseContract._throwIfUnexpectedEmptyCallResult(rawCallResult, abiEncoder); return abiEncoder.strictDecodeReturnValue(rawCallResult); }, getABIEncodedTransactionData(): string { @@ -2501,6 +2528,7 @@ export class DevUtilsContract extends BaseContract { BaseContract._assertCallParams(callData, defaultBlock); const rawCallResult = await self._evmExecAsync(this.getABIEncodedTransactionData()); const abiEncoder = self._lookupAbiEncoder(functionSignature); + BaseContract._throwIfUnexpectedEmptyCallResult(rawCallResult, abiEncoder); return abiEncoder.strictDecodeReturnValue(rawCallResult); }, getABIEncodedTransactionData(): string { @@ -2533,6 +2561,7 @@ export class DevUtilsContract extends BaseContract { defaultBlock, ); const abiEncoder = self._lookupAbiEncoder(functionSignature); + BaseContract._throwIfUnexpectedEmptyCallResult(rawCallResult, abiEncoder); return abiEncoder.strictDecodeReturnValue(rawCallResult); }, getABIEncodedTransactionData(): string { @@ -2561,6 +2590,7 @@ export class DevUtilsContract extends BaseContract { defaultBlock, ); const abiEncoder = self._lookupAbiEncoder(functionSignature); + BaseContract._throwIfUnexpectedEmptyCallResult(rawCallResult, abiEncoder); return abiEncoder.strictDecodeReturnValue(rawCallResult); }, getABIEncodedTransactionData(): string { @@ -2595,6 +2625,7 @@ export class DevUtilsContract extends BaseContract { defaultBlock, ); const abiEncoder = self._lookupAbiEncoder(functionSignature); + BaseContract._throwIfUnexpectedEmptyCallResult(rawCallResult, abiEncoder); return abiEncoder.strictDecodeReturnValue<[BigNumber, BigNumber]>(rawCallResult); }, getABIEncodedTransactionData(): string { @@ -2623,6 +2654,7 @@ export class DevUtilsContract extends BaseContract { defaultBlock, ); const abiEncoder = self._lookupAbiEncoder(functionSignature); + BaseContract._throwIfUnexpectedEmptyCallResult(rawCallResult, abiEncoder); return abiEncoder.strictDecodeReturnValue(rawCallResult); }, getABIEncodedTransactionData(): string { @@ -2651,6 +2683,7 @@ export class DevUtilsContract extends BaseContract { defaultBlock, ); const abiEncoder = self._lookupAbiEncoder(functionSignature); + BaseContract._throwIfUnexpectedEmptyCallResult(rawCallResult, abiEncoder); return abiEncoder.strictDecodeReturnValue(rawCallResult); }, getABIEncodedTransactionData(): string { @@ -2685,6 +2718,7 @@ export class DevUtilsContract extends BaseContract { defaultBlock, ); const abiEncoder = self._lookupAbiEncoder(functionSignature); + BaseContract._throwIfUnexpectedEmptyCallResult(rawCallResult, abiEncoder); return abiEncoder.strictDecodeReturnValue<[BigNumber[], BigNumber[]]>(rawCallResult); }, getABIEncodedTransactionData(): string { @@ -2710,6 +2744,7 @@ export class DevUtilsContract extends BaseContract { defaultBlock, ); const abiEncoder = self._lookupAbiEncoder(functionSignature); + BaseContract._throwIfUnexpectedEmptyCallResult(rawCallResult, abiEncoder); return abiEncoder.strictDecodeReturnValue(rawCallResult); }, getABIEncodedTransactionData(): string { @@ -2749,6 +2784,7 @@ export class DevUtilsContract extends BaseContract { BaseContract._assertCallParams(callData, defaultBlock); const rawCallResult = await self._evmExecAsync(this.getABIEncodedTransactionData()); const abiEncoder = self._lookupAbiEncoder(functionSignature); + BaseContract._throwIfUnexpectedEmptyCallResult(rawCallResult, abiEncoder); return abiEncoder.strictDecodeReturnValue(rawCallResult); }, getABIEncodedTransactionData(): string { @@ -2830,6 +2866,7 @@ export class DevUtilsContract extends BaseContract { defaultBlock, ); const abiEncoder = self._lookupAbiEncoder(functionSignature); + BaseContract._throwIfUnexpectedEmptyCallResult(rawCallResult, abiEncoder); return abiEncoder.strictDecodeReturnValue< [ { orderStatus: number; orderHash: string; orderTakerAssetFilledAmount: BigNumber }, @@ -2925,6 +2962,7 @@ export class DevUtilsContract extends BaseContract { defaultBlock, ); const abiEncoder = self._lookupAbiEncoder(functionSignature); + BaseContract._throwIfUnexpectedEmptyCallResult(rawCallResult, abiEncoder); return abiEncoder.strictDecodeReturnValue< [ Array<{ orderStatus: number; orderHash: string; orderTakerAssetFilledAmount: BigNumber }>, @@ -3007,6 +3045,7 @@ export class DevUtilsContract extends BaseContract { defaultBlock, ); const abiEncoder = self._lookupAbiEncoder(functionSignature); + BaseContract._throwIfUnexpectedEmptyCallResult(rawCallResult, abiEncoder); return abiEncoder.strictDecodeReturnValue(rawCallResult); }, getABIEncodedTransactionData(): string { @@ -3087,6 +3126,7 @@ export class DevUtilsContract extends BaseContract { defaultBlock, ); const abiEncoder = self._lookupAbiEncoder(functionSignature); + BaseContract._throwIfUnexpectedEmptyCallResult(rawCallResult, abiEncoder); return abiEncoder.strictDecodeReturnValue(rawCallResult); }, getABIEncodedTransactionData(): string { @@ -3168,6 +3208,7 @@ export class DevUtilsContract extends BaseContract { defaultBlock, ); const abiEncoder = self._lookupAbiEncoder(functionSignature); + BaseContract._throwIfUnexpectedEmptyCallResult(rawCallResult, abiEncoder); return abiEncoder.strictDecodeReturnValue(rawCallResult); }, getABIEncodedTransactionData(): string { @@ -3197,6 +3238,7 @@ export class DevUtilsContract extends BaseContract { BaseContract._assertCallParams(callData, defaultBlock); const rawCallResult = await self._evmExecAsync(this.getABIEncodedTransactionData()); const abiEncoder = self._lookupAbiEncoder(functionSignature); + BaseContract._throwIfUnexpectedEmptyCallResult(rawCallResult, abiEncoder); return abiEncoder.strictDecodeReturnValue(rawCallResult); }, getABIEncodedTransactionData(): string { @@ -3225,6 +3267,7 @@ export class DevUtilsContract extends BaseContract { defaultBlock, ); const abiEncoder = self._lookupAbiEncoder(functionSignature); + BaseContract._throwIfUnexpectedEmptyCallResult(rawCallResult, abiEncoder); return abiEncoder.strictDecodeReturnValue(rawCallResult); }, getABIEncodedTransactionData(): string { @@ -3242,6 +3285,7 @@ export class DevUtilsContract extends BaseContract { BaseContract._assertCallParams(callData, defaultBlock); const rawCallResult = await self._evmExecAsync(this.getABIEncodedTransactionData()); const abiEncoder = self._lookupAbiEncoder(functionSignature); + BaseContract._throwIfUnexpectedEmptyCallResult(rawCallResult, abiEncoder); return abiEncoder.strictDecodeReturnValue(rawCallResult); }, getABIEncodedTransactionData(): string { diff --git a/packages/contract-wrappers/src/generated-wrappers/erc20_token.ts b/packages/contract-wrappers/src/generated-wrappers/erc20_token.ts index 88b7dc636c..419c4c21ef 100644 --- a/packages/contract-wrappers/src/generated-wrappers/erc20_token.ts +++ b/packages/contract-wrappers/src/generated-wrappers/erc20_token.ts @@ -355,6 +355,7 @@ export class ERC20TokenContract extends BaseContract { defaultBlock, ); const abiEncoder = self._lookupAbiEncoder(functionSignature); + BaseContract._throwIfUnexpectedEmptyCallResult(rawCallResult, abiEncoder); return abiEncoder.strictDecodeReturnValue(rawCallResult); }, getABIEncodedTransactionData(): string { @@ -408,6 +409,7 @@ export class ERC20TokenContract extends BaseContract { defaultBlock, ); const abiEncoder = self._lookupAbiEncoder(functionSignature); + BaseContract._throwIfUnexpectedEmptyCallResult(rawCallResult, abiEncoder); return abiEncoder.strictDecodeReturnValue(rawCallResult); }, getABIEncodedTransactionData(): string { @@ -433,6 +435,7 @@ export class ERC20TokenContract extends BaseContract { defaultBlock, ); const abiEncoder = self._lookupAbiEncoder(functionSignature); + BaseContract._throwIfUnexpectedEmptyCallResult(rawCallResult, abiEncoder); return abiEncoder.strictDecodeReturnValue(rawCallResult); }, getABIEncodedTransactionData(): string { @@ -456,6 +459,7 @@ export class ERC20TokenContract extends BaseContract { defaultBlock, ); const abiEncoder = self._lookupAbiEncoder(functionSignature); + BaseContract._throwIfUnexpectedEmptyCallResult(rawCallResult, abiEncoder); return abiEncoder.strictDecodeReturnValue(rawCallResult); }, getABIEncodedTransactionData(): string { @@ -509,6 +513,7 @@ export class ERC20TokenContract extends BaseContract { defaultBlock, ); const abiEncoder = self._lookupAbiEncoder(functionSignature); + BaseContract._throwIfUnexpectedEmptyCallResult(rawCallResult, abiEncoder); return abiEncoder.strictDecodeReturnValue(rawCallResult); }, getABIEncodedTransactionData(): string { @@ -564,6 +569,7 @@ export class ERC20TokenContract extends BaseContract { defaultBlock, ); const abiEncoder = self._lookupAbiEncoder(functionSignature); + BaseContract._throwIfUnexpectedEmptyCallResult(rawCallResult, abiEncoder); return abiEncoder.strictDecodeReturnValue(rawCallResult); }, getABIEncodedTransactionData(): string { diff --git a/packages/contract-wrappers/src/generated-wrappers/erc721_token.ts b/packages/contract-wrappers/src/generated-wrappers/erc721_token.ts index 8487cf0da3..1a7996d3c3 100644 --- a/packages/contract-wrappers/src/generated-wrappers/erc721_token.ts +++ b/packages/contract-wrappers/src/generated-wrappers/erc721_token.ts @@ -478,6 +478,7 @@ export class ERC721TokenContract extends BaseContract { defaultBlock, ); const abiEncoder = self._lookupAbiEncoder(functionSignature); + BaseContract._throwIfUnexpectedEmptyCallResult(rawCallResult, abiEncoder); return abiEncoder.strictDecodeReturnValue(rawCallResult); }, getABIEncodedTransactionData(): string { @@ -504,6 +505,7 @@ export class ERC721TokenContract extends BaseContract { defaultBlock, ); const abiEncoder = self._lookupAbiEncoder(functionSignature); + BaseContract._throwIfUnexpectedEmptyCallResult(rawCallResult, abiEncoder); return abiEncoder.strictDecodeReturnValue(rawCallResult); }, getABIEncodedTransactionData(): string { @@ -529,6 +531,7 @@ export class ERC721TokenContract extends BaseContract { defaultBlock, ); const abiEncoder = self._lookupAbiEncoder(functionSignature); + BaseContract._throwIfUnexpectedEmptyCallResult(rawCallResult, abiEncoder); return abiEncoder.strictDecodeReturnValue(rawCallResult); }, getABIEncodedTransactionData(): string { @@ -550,6 +553,7 @@ export class ERC721TokenContract extends BaseContract { defaultBlock, ); const abiEncoder = self._lookupAbiEncoder(functionSignature); + BaseContract._throwIfUnexpectedEmptyCallResult(rawCallResult, abiEncoder); return abiEncoder.strictDecodeReturnValue(rawCallResult); }, getABIEncodedTransactionData(): string { @@ -576,6 +580,7 @@ export class ERC721TokenContract extends BaseContract { defaultBlock, ); const abiEncoder = self._lookupAbiEncoder(functionSignature); + BaseContract._throwIfUnexpectedEmptyCallResult(rawCallResult, abiEncoder); return abiEncoder.strictDecodeReturnValue(rawCallResult); }, getABIEncodedTransactionData(): string { @@ -631,6 +636,7 @@ export class ERC721TokenContract extends BaseContract { defaultBlock, ); const abiEncoder = self._lookupAbiEncoder(functionSignature); + BaseContract._throwIfUnexpectedEmptyCallResult(rawCallResult, abiEncoder); return abiEncoder.strictDecodeReturnValue(rawCallResult); }, getABIEncodedTransactionData(): string { @@ -702,6 +708,7 @@ export class ERC721TokenContract extends BaseContract { defaultBlock, ); const abiEncoder = self._lookupAbiEncoder(functionSignature); + BaseContract._throwIfUnexpectedEmptyCallResult(rawCallResult, abiEncoder); return abiEncoder.strictDecodeReturnValue(rawCallResult); }, getABIEncodedTransactionData(): string { @@ -760,6 +767,7 @@ export class ERC721TokenContract extends BaseContract { defaultBlock, ); const abiEncoder = self._lookupAbiEncoder(functionSignature); + BaseContract._throwIfUnexpectedEmptyCallResult(rawCallResult, abiEncoder); return abiEncoder.strictDecodeReturnValue(rawCallResult); }, getABIEncodedTransactionData(): string { @@ -817,6 +825,7 @@ export class ERC721TokenContract extends BaseContract { defaultBlock, ); const abiEncoder = self._lookupAbiEncoder(functionSignature); + BaseContract._throwIfUnexpectedEmptyCallResult(rawCallResult, abiEncoder); return abiEncoder.strictDecodeReturnValue(rawCallResult); }, getABIEncodedTransactionData(): string { diff --git a/packages/contract-wrappers/src/generated-wrappers/exchange.ts b/packages/contract-wrappers/src/generated-wrappers/exchange.ts index a21c5fbca4..f044bb0e09 100644 --- a/packages/contract-wrappers/src/generated-wrappers/exchange.ts +++ b/packages/contract-wrappers/src/generated-wrappers/exchange.ts @@ -3152,6 +3152,7 @@ export class ExchangeContract extends BaseContract { defaultBlock, ); const abiEncoder = self._lookupAbiEncoder(functionSignature); + BaseContract._throwIfUnexpectedEmptyCallResult(rawCallResult, abiEncoder); return abiEncoder.strictDecodeReturnValue(rawCallResult); }, getABIEncodedTransactionData(): string { @@ -3171,6 +3172,7 @@ export class ExchangeContract extends BaseContract { defaultBlock, ); const abiEncoder = self._lookupAbiEncoder(functionSignature); + BaseContract._throwIfUnexpectedEmptyCallResult(rawCallResult, abiEncoder); return abiEncoder.strictDecodeReturnValue(rawCallResult); }, getABIEncodedTransactionData(): string { @@ -3192,6 +3194,7 @@ export class ExchangeContract extends BaseContract { defaultBlock, ); const abiEncoder = self._lookupAbiEncoder(functionSignature); + BaseContract._throwIfUnexpectedEmptyCallResult(rawCallResult, abiEncoder); return abiEncoder.strictDecodeReturnValue(rawCallResult); }, getABIEncodedTransactionData(): string { @@ -3260,6 +3263,7 @@ export class ExchangeContract extends BaseContract { defaultBlock, ); const abiEncoder = self._lookupAbiEncoder(functionSignature); + BaseContract._throwIfUnexpectedEmptyCallResult(rawCallResult, abiEncoder); return abiEncoder.strictDecodeReturnValue(rawCallResult); }, getABIEncodedTransactionData(): string { @@ -3323,6 +3327,7 @@ export class ExchangeContract extends BaseContract { defaultBlock, ); const abiEncoder = self._lookupAbiEncoder(functionSignature); + BaseContract._throwIfUnexpectedEmptyCallResult(rawCallResult, abiEncoder); return abiEncoder.strictDecodeReturnValue(rawCallResult); }, getABIEncodedTransactionData(): string { @@ -3418,6 +3423,7 @@ export class ExchangeContract extends BaseContract { defaultBlock, ); const abiEncoder = self._lookupAbiEncoder(functionSignature); + BaseContract._throwIfUnexpectedEmptyCallResult(rawCallResult, abiEncoder); return abiEncoder.strictDecodeReturnValue< Array<{ makerAssetFilledAmount: BigNumber; @@ -3521,6 +3527,7 @@ export class ExchangeContract extends BaseContract { defaultBlock, ); const abiEncoder = self._lookupAbiEncoder(functionSignature); + BaseContract._throwIfUnexpectedEmptyCallResult(rawCallResult, abiEncoder); return abiEncoder.strictDecodeReturnValue< Array<{ makerAssetFilledAmount: BigNumber; @@ -3624,6 +3631,7 @@ export class ExchangeContract extends BaseContract { defaultBlock, ); const abiEncoder = self._lookupAbiEncoder(functionSignature); + BaseContract._throwIfUnexpectedEmptyCallResult(rawCallResult, abiEncoder); return abiEncoder.strictDecodeReturnValue< Array<{ makerAssetFilledAmount: BigNumber; @@ -3766,6 +3774,7 @@ export class ExchangeContract extends BaseContract { defaultBlock, ); const abiEncoder = self._lookupAbiEncoder(functionSignature); + BaseContract._throwIfUnexpectedEmptyCallResult(rawCallResult, abiEncoder); return abiEncoder.strictDecodeReturnValue<{ left: Array<{ makerAssetFilledAmount: BigNumber; @@ -3923,6 +3932,7 @@ export class ExchangeContract extends BaseContract { defaultBlock, ); const abiEncoder = self._lookupAbiEncoder(functionSignature); + BaseContract._throwIfUnexpectedEmptyCallResult(rawCallResult, abiEncoder); return abiEncoder.strictDecodeReturnValue<{ left: Array<{ makerAssetFilledAmount: BigNumber; @@ -4011,6 +4021,7 @@ export class ExchangeContract extends BaseContract { defaultBlock, ); const abiEncoder = self._lookupAbiEncoder(functionSignature); + BaseContract._throwIfUnexpectedEmptyCallResult(rawCallResult, abiEncoder); return abiEncoder.strictDecodeReturnValue(rawCallResult); }, getABIEncodedTransactionData(): string { @@ -4063,6 +4074,7 @@ export class ExchangeContract extends BaseContract { defaultBlock, ); const abiEncoder = self._lookupAbiEncoder(functionSignature); + BaseContract._throwIfUnexpectedEmptyCallResult(rawCallResult, abiEncoder); return abiEncoder.strictDecodeReturnValue(rawCallResult); }, getABIEncodedTransactionData(): string { @@ -4083,6 +4095,7 @@ export class ExchangeContract extends BaseContract { defaultBlock, ); const abiEncoder = self._lookupAbiEncoder(functionSignature); + BaseContract._throwIfUnexpectedEmptyCallResult(rawCallResult, abiEncoder); return abiEncoder.strictDecodeReturnValue(rawCallResult); }, getABIEncodedTransactionData(): string { @@ -4102,6 +4115,7 @@ export class ExchangeContract extends BaseContract { defaultBlock, ); const abiEncoder = self._lookupAbiEncoder(functionSignature); + BaseContract._throwIfUnexpectedEmptyCallResult(rawCallResult, abiEncoder); return abiEncoder.strictDecodeReturnValue(rawCallResult); }, getABIEncodedTransactionData(): string { @@ -4151,6 +4165,7 @@ export class ExchangeContract extends BaseContract { defaultBlock, ); const abiEncoder = self._lookupAbiEncoder(functionSignature); + BaseContract._throwIfUnexpectedEmptyCallResult(rawCallResult, abiEncoder); return abiEncoder.strictDecodeReturnValue(rawCallResult); }, getABIEncodedTransactionData(): string { @@ -4213,6 +4228,7 @@ export class ExchangeContract extends BaseContract { defaultBlock, ); const abiEncoder = self._lookupAbiEncoder(functionSignature); + BaseContract._throwIfUnexpectedEmptyCallResult(rawCallResult, abiEncoder); return abiEncoder.strictDecodeReturnValue(rawCallResult); }, getABIEncodedTransactionData(): string { @@ -4303,6 +4319,7 @@ export class ExchangeContract extends BaseContract { defaultBlock, ); const abiEncoder = self._lookupAbiEncoder(functionSignature); + BaseContract._throwIfUnexpectedEmptyCallResult(rawCallResult, abiEncoder); return abiEncoder.strictDecodeReturnValue<{ makerAssetFilledAmount: BigNumber; takerAssetFilledAmount: BigNumber; @@ -4399,6 +4416,7 @@ export class ExchangeContract extends BaseContract { defaultBlock, ); const abiEncoder = self._lookupAbiEncoder(functionSignature); + BaseContract._throwIfUnexpectedEmptyCallResult(rawCallResult, abiEncoder); return abiEncoder.strictDecodeReturnValue<{ makerAssetFilledAmount: BigNumber; takerAssetFilledAmount: BigNumber; @@ -4425,6 +4443,7 @@ export class ExchangeContract extends BaseContract { defaultBlock, ); const abiEncoder = self._lookupAbiEncoder(functionSignature); + BaseContract._throwIfUnexpectedEmptyCallResult(rawCallResult, abiEncoder); return abiEncoder.strictDecodeReturnValue(rawCallResult); }, getABIEncodedTransactionData(): string { @@ -4450,6 +4469,7 @@ export class ExchangeContract extends BaseContract { defaultBlock, ); const abiEncoder = self._lookupAbiEncoder(functionSignature); + BaseContract._throwIfUnexpectedEmptyCallResult(rawCallResult, abiEncoder); return abiEncoder.strictDecodeReturnValue(rawCallResult); }, getABIEncodedTransactionData(): string { @@ -4494,6 +4514,7 @@ export class ExchangeContract extends BaseContract { defaultBlock, ); const abiEncoder = self._lookupAbiEncoder(functionSignature); + BaseContract._throwIfUnexpectedEmptyCallResult(rawCallResult, abiEncoder); return abiEncoder.strictDecodeReturnValue<{ orderStatus: number; orderHash: string; @@ -4527,6 +4548,7 @@ export class ExchangeContract extends BaseContract { defaultBlock, ); const abiEncoder = self._lookupAbiEncoder(functionSignature); + BaseContract._throwIfUnexpectedEmptyCallResult(rawCallResult, abiEncoder); return abiEncoder.strictDecodeReturnValue(rawCallResult); }, getABIEncodedTransactionData(): string { @@ -4573,6 +4595,7 @@ export class ExchangeContract extends BaseContract { defaultBlock, ); const abiEncoder = self._lookupAbiEncoder(functionSignature); + BaseContract._throwIfUnexpectedEmptyCallResult(rawCallResult, abiEncoder); return abiEncoder.strictDecodeReturnValue(rawCallResult); }, getABIEncodedTransactionData(): string { @@ -4609,6 +4632,7 @@ export class ExchangeContract extends BaseContract { defaultBlock, ); const abiEncoder = self._lookupAbiEncoder(functionSignature); + BaseContract._throwIfUnexpectedEmptyCallResult(rawCallResult, abiEncoder); return abiEncoder.strictDecodeReturnValue(rawCallResult); }, getABIEncodedTransactionData(): string { @@ -4700,6 +4724,7 @@ export class ExchangeContract extends BaseContract { defaultBlock, ); const abiEncoder = self._lookupAbiEncoder(functionSignature); + BaseContract._throwIfUnexpectedEmptyCallResult(rawCallResult, abiEncoder); return abiEncoder.strictDecodeReturnValue<{ makerAssetFilledAmount: BigNumber; takerAssetFilledAmount: BigNumber; @@ -4798,6 +4823,7 @@ export class ExchangeContract extends BaseContract { defaultBlock, ); const abiEncoder = self._lookupAbiEncoder(functionSignature); + BaseContract._throwIfUnexpectedEmptyCallResult(rawCallResult, abiEncoder); return abiEncoder.strictDecodeReturnValue<{ makerAssetFilledAmount: BigNumber; takerAssetFilledAmount: BigNumber; @@ -4895,6 +4921,7 @@ export class ExchangeContract extends BaseContract { defaultBlock, ); const abiEncoder = self._lookupAbiEncoder(functionSignature); + BaseContract._throwIfUnexpectedEmptyCallResult(rawCallResult, abiEncoder); return abiEncoder.strictDecodeReturnValue<{ makerAssetFilledAmount: BigNumber; takerAssetFilledAmount: BigNumber; @@ -4993,6 +5020,7 @@ export class ExchangeContract extends BaseContract { defaultBlock, ); const abiEncoder = self._lookupAbiEncoder(functionSignature); + BaseContract._throwIfUnexpectedEmptyCallResult(rawCallResult, abiEncoder); return abiEncoder.strictDecodeReturnValue<{ makerAssetFilledAmount: BigNumber; takerAssetFilledAmount: BigNumber; @@ -5131,6 +5159,7 @@ export class ExchangeContract extends BaseContract { defaultBlock, ); const abiEncoder = self._lookupAbiEncoder(functionSignature); + BaseContract._throwIfUnexpectedEmptyCallResult(rawCallResult, abiEncoder); return abiEncoder.strictDecodeReturnValue<{ left: { makerAssetFilledAmount: BigNumber; @@ -5285,6 +5314,7 @@ export class ExchangeContract extends BaseContract { defaultBlock, ); const abiEncoder = self._lookupAbiEncoder(functionSignature); + BaseContract._throwIfUnexpectedEmptyCallResult(rawCallResult, abiEncoder); return abiEncoder.strictDecodeReturnValue<{ left: { makerAssetFilledAmount: BigNumber; @@ -5328,6 +5358,7 @@ export class ExchangeContract extends BaseContract { defaultBlock, ); const abiEncoder = self._lookupAbiEncoder(functionSignature); + BaseContract._throwIfUnexpectedEmptyCallResult(rawCallResult, abiEncoder); return abiEncoder.strictDecodeReturnValue(rawCallResult); }, getABIEncodedTransactionData(): string { @@ -5347,6 +5378,7 @@ export class ExchangeContract extends BaseContract { defaultBlock, ); const abiEncoder = self._lookupAbiEncoder(functionSignature); + BaseContract._throwIfUnexpectedEmptyCallResult(rawCallResult, abiEncoder); return abiEncoder.strictDecodeReturnValue(rawCallResult); }, getABIEncodedTransactionData(): string { @@ -5398,6 +5430,7 @@ export class ExchangeContract extends BaseContract { defaultBlock, ); const abiEncoder = self._lookupAbiEncoder(functionSignature); + BaseContract._throwIfUnexpectedEmptyCallResult(rawCallResult, abiEncoder); return abiEncoder.strictDecodeReturnValue(rawCallResult); }, getABIEncodedTransactionData(): string { @@ -5419,6 +5452,7 @@ export class ExchangeContract extends BaseContract { defaultBlock, ); const abiEncoder = self._lookupAbiEncoder(functionSignature); + BaseContract._throwIfUnexpectedEmptyCallResult(rawCallResult, abiEncoder); return abiEncoder.strictDecodeReturnValue(rawCallResult); }, getABIEncodedTransactionData(): string { @@ -5438,6 +5472,7 @@ export class ExchangeContract extends BaseContract { defaultBlock, ); const abiEncoder = self._lookupAbiEncoder(functionSignature); + BaseContract._throwIfUnexpectedEmptyCallResult(rawCallResult, abiEncoder); return abiEncoder.strictDecodeReturnValue(rawCallResult); }, getABIEncodedTransactionData(): string { @@ -5457,6 +5492,7 @@ export class ExchangeContract extends BaseContract { defaultBlock, ); const abiEncoder = self._lookupAbiEncoder(functionSignature); + BaseContract._throwIfUnexpectedEmptyCallResult(rawCallResult, abiEncoder); return abiEncoder.strictDecodeReturnValue(rawCallResult); }, getABIEncodedTransactionData(): string { @@ -5508,6 +5544,7 @@ export class ExchangeContract extends BaseContract { defaultBlock, ); const abiEncoder = self._lookupAbiEncoder(functionSignature); + BaseContract._throwIfUnexpectedEmptyCallResult(rawCallResult, abiEncoder); return abiEncoder.strictDecodeReturnValue(rawCallResult); }, getABIEncodedTransactionData(): string { @@ -5559,6 +5596,7 @@ export class ExchangeContract extends BaseContract { defaultBlock, ); const abiEncoder = self._lookupAbiEncoder(functionSignature); + BaseContract._throwIfUnexpectedEmptyCallResult(rawCallResult, abiEncoder); return abiEncoder.strictDecodeReturnValue(rawCallResult); }, getABIEncodedTransactionData(): string { @@ -5609,6 +5647,7 @@ export class ExchangeContract extends BaseContract { defaultBlock, ); const abiEncoder = self._lookupAbiEncoder(functionSignature); + BaseContract._throwIfUnexpectedEmptyCallResult(rawCallResult, abiEncoder); return abiEncoder.strictDecodeReturnValue(rawCallResult); }, getABIEncodedTransactionData(): string { @@ -5662,6 +5701,7 @@ export class ExchangeContract extends BaseContract { defaultBlock, ); const abiEncoder = self._lookupAbiEncoder(functionSignature); + BaseContract._throwIfUnexpectedEmptyCallResult(rawCallResult, abiEncoder); return abiEncoder.strictDecodeReturnValue(rawCallResult); }, getABIEncodedTransactionData(): string { @@ -5728,6 +5768,7 @@ export class ExchangeContract extends BaseContract { defaultBlock, ); const abiEncoder = self._lookupAbiEncoder(functionSignature); + BaseContract._throwIfUnexpectedEmptyCallResult(rawCallResult, abiEncoder); return abiEncoder.strictDecodeReturnValue(rawCallResult); }, getABIEncodedTransactionData(): string { @@ -5748,6 +5789,7 @@ export class ExchangeContract extends BaseContract { defaultBlock, ); const abiEncoder = self._lookupAbiEncoder(functionSignature); + BaseContract._throwIfUnexpectedEmptyCallResult(rawCallResult, abiEncoder); return abiEncoder.strictDecodeReturnValue(rawCallResult); }, getABIEncodedTransactionData(): string { @@ -5798,6 +5840,7 @@ export class ExchangeContract extends BaseContract { defaultBlock, ); const abiEncoder = self._lookupAbiEncoder(functionSignature); + BaseContract._throwIfUnexpectedEmptyCallResult(rawCallResult, abiEncoder); return abiEncoder.strictDecodeReturnValue(rawCallResult); }, getABIEncodedTransactionData(): string { diff --git a/packages/contract-wrappers/src/generated-wrappers/forwarder.ts b/packages/contract-wrappers/src/generated-wrappers/forwarder.ts index 4e8ea20277..5f12fccbc1 100644 --- a/packages/contract-wrappers/src/generated-wrappers/forwarder.ts +++ b/packages/contract-wrappers/src/generated-wrappers/forwarder.ts @@ -498,6 +498,7 @@ export class ForwarderContract extends BaseContract { defaultBlock, ); const abiEncoder = self._lookupAbiEncoder(functionSignature); + BaseContract._throwIfUnexpectedEmptyCallResult(rawCallResult, abiEncoder); return abiEncoder.strictDecodeReturnValue(rawCallResult); }, getABIEncodedTransactionData(): string { @@ -552,6 +553,7 @@ export class ForwarderContract extends BaseContract { defaultBlock, ); const abiEncoder = self._lookupAbiEncoder(functionSignature); + BaseContract._throwIfUnexpectedEmptyCallResult(rawCallResult, abiEncoder); return abiEncoder.strictDecodeReturnValue(rawCallResult); }, getABIEncodedTransactionData(): string { @@ -641,6 +643,7 @@ export class ForwarderContract extends BaseContract { defaultBlock, ); const abiEncoder = self._lookupAbiEncoder(functionSignature); + BaseContract._throwIfUnexpectedEmptyCallResult(rawCallResult, abiEncoder); return abiEncoder.strictDecodeReturnValue<[BigNumber, BigNumber]>(rawCallResult); }, getABIEncodedTransactionData(): string { @@ -731,6 +734,7 @@ export class ForwarderContract extends BaseContract { defaultBlock, ); const abiEncoder = self._lookupAbiEncoder(functionSignature); + BaseContract._throwIfUnexpectedEmptyCallResult(rawCallResult, abiEncoder); return abiEncoder.strictDecodeReturnValue<[BigNumber, BigNumber]>(rawCallResult); }, getABIEncodedTransactionData(): string { @@ -755,6 +759,7 @@ export class ForwarderContract extends BaseContract { defaultBlock, ); const abiEncoder = self._lookupAbiEncoder(functionSignature); + BaseContract._throwIfUnexpectedEmptyCallResult(rawCallResult, abiEncoder); return abiEncoder.strictDecodeReturnValue(rawCallResult); }, getABIEncodedTransactionData(): string { @@ -805,6 +810,7 @@ export class ForwarderContract extends BaseContract { defaultBlock, ); const abiEncoder = self._lookupAbiEncoder(functionSignature); + BaseContract._throwIfUnexpectedEmptyCallResult(rawCallResult, abiEncoder); return abiEncoder.strictDecodeReturnValue(rawCallResult); }, getABIEncodedTransactionData(): string { @@ -858,6 +864,7 @@ export class ForwarderContract extends BaseContract { defaultBlock, ); const abiEncoder = self._lookupAbiEncoder(functionSignature); + BaseContract._throwIfUnexpectedEmptyCallResult(rawCallResult, abiEncoder); return abiEncoder.strictDecodeReturnValue(rawCallResult); }, getABIEncodedTransactionData(): string { diff --git a/packages/contract-wrappers/src/generated-wrappers/i_asset_data.ts b/packages/contract-wrappers/src/generated-wrappers/i_asset_data.ts index f30674d199..bbe382d072 100644 --- a/packages/contract-wrappers/src/generated-wrappers/i_asset_data.ts +++ b/packages/contract-wrappers/src/generated-wrappers/i_asset_data.ts @@ -321,6 +321,7 @@ export class IAssetDataContract extends BaseContract { defaultBlock, ); const abiEncoder = self._lookupAbiEncoder(functionSignature); + BaseContract._throwIfUnexpectedEmptyCallResult(rawCallResult, abiEncoder); return abiEncoder.strictDecodeReturnValue(rawCallResult); }, getABIEncodedTransactionData(): string { @@ -380,6 +381,7 @@ export class IAssetDataContract extends BaseContract { defaultBlock, ); const abiEncoder = self._lookupAbiEncoder(functionSignature); + BaseContract._throwIfUnexpectedEmptyCallResult(rawCallResult, abiEncoder); return abiEncoder.strictDecodeReturnValue(rawCallResult); }, getABIEncodedTransactionData(): string { @@ -434,6 +436,7 @@ export class IAssetDataContract extends BaseContract { defaultBlock, ); const abiEncoder = self._lookupAbiEncoder(functionSignature); + BaseContract._throwIfUnexpectedEmptyCallResult(rawCallResult, abiEncoder); return abiEncoder.strictDecodeReturnValue(rawCallResult); }, getABIEncodedTransactionData(): string { @@ -486,6 +489,7 @@ export class IAssetDataContract extends BaseContract { defaultBlock, ); const abiEncoder = self._lookupAbiEncoder(functionSignature); + BaseContract._throwIfUnexpectedEmptyCallResult(rawCallResult, abiEncoder); return abiEncoder.strictDecodeReturnValue(rawCallResult); }, getABIEncodedTransactionData(): string { @@ -541,6 +545,7 @@ export class IAssetDataContract extends BaseContract { defaultBlock, ); const abiEncoder = self._lookupAbiEncoder(functionSignature); + BaseContract._throwIfUnexpectedEmptyCallResult(rawCallResult, abiEncoder); return abiEncoder.strictDecodeReturnValue(rawCallResult); }, getABIEncodedTransactionData(): string { @@ -601,6 +606,7 @@ export class IAssetDataContract extends BaseContract { defaultBlock, ); const abiEncoder = self._lookupAbiEncoder(functionSignature); + BaseContract._throwIfUnexpectedEmptyCallResult(rawCallResult, abiEncoder); return abiEncoder.strictDecodeReturnValue(rawCallResult); }, getABIEncodedTransactionData(): string { diff --git a/packages/contract-wrappers/src/generated-wrappers/i_erc20_bridge_sampler.ts b/packages/contract-wrappers/src/generated-wrappers/i_erc20_bridge_sampler.ts index 338d7f3e6d..9080ebcb6a 100644 --- a/packages/contract-wrappers/src/generated-wrappers/i_erc20_bridge_sampler.ts +++ b/packages/contract-wrappers/src/generated-wrappers/i_erc20_bridge_sampler.ts @@ -599,6 +599,7 @@ export class IERC20BridgeSamplerContract extends BaseContract { defaultBlock, ); const abiEncoder = self._lookupAbiEncoder(functionSignature); + BaseContract._throwIfUnexpectedEmptyCallResult(rawCallResult, abiEncoder); return abiEncoder.strictDecodeReturnValue(rawCallResult); }, getABIEncodedTransactionData(): string { @@ -645,6 +646,7 @@ export class IERC20BridgeSamplerContract extends BaseContract { defaultBlock, ); const abiEncoder = self._lookupAbiEncoder(functionSignature); + BaseContract._throwIfUnexpectedEmptyCallResult(rawCallResult, abiEncoder); return abiEncoder.strictDecodeReturnValue(rawCallResult); }, getABIEncodedTransactionData(): string { @@ -701,6 +703,7 @@ export class IERC20BridgeSamplerContract extends BaseContract { defaultBlock, ); const abiEncoder = self._lookupAbiEncoder(functionSignature); + BaseContract._throwIfUnexpectedEmptyCallResult(rawCallResult, abiEncoder); return abiEncoder.strictDecodeReturnValue<[BigNumber[], BigNumber[][]]>(rawCallResult); }, getABIEncodedTransactionData(): string { @@ -762,6 +765,7 @@ export class IERC20BridgeSamplerContract extends BaseContract { defaultBlock, ); const abiEncoder = self._lookupAbiEncoder(functionSignature); + BaseContract._throwIfUnexpectedEmptyCallResult(rawCallResult, abiEncoder); return abiEncoder.strictDecodeReturnValue<[BigNumber[], BigNumber[][]]>(rawCallResult); }, getABIEncodedTransactionData(): string { @@ -804,6 +808,7 @@ export class IERC20BridgeSamplerContract extends BaseContract { defaultBlock, ); const abiEncoder = self._lookupAbiEncoder(functionSignature); + BaseContract._throwIfUnexpectedEmptyCallResult(rawCallResult, abiEncoder); return abiEncoder.strictDecodeReturnValue(rawCallResult); }, getABIEncodedTransactionData(): string { @@ -846,6 +851,7 @@ export class IERC20BridgeSamplerContract extends BaseContract { defaultBlock, ); const abiEncoder = self._lookupAbiEncoder(functionSignature); + BaseContract._throwIfUnexpectedEmptyCallResult(rawCallResult, abiEncoder); return abiEncoder.strictDecodeReturnValue(rawCallResult); }, getABIEncodedTransactionData(): string { diff --git a/packages/contract-wrappers/src/generated-wrappers/staking.ts b/packages/contract-wrappers/src/generated-wrappers/staking.ts index a9952207b3..585af60e1e 100644 --- a/packages/contract-wrappers/src/generated-wrappers/staking.ts +++ b/packages/contract-wrappers/src/generated-wrappers/staking.ts @@ -1653,6 +1653,7 @@ export class StakingContract extends BaseContract { defaultBlock, ); const abiEncoder = self._lookupAbiEncoder(functionSignature); + BaseContract._throwIfUnexpectedEmptyCallResult(rawCallResult, abiEncoder); return abiEncoder.strictDecodeReturnValue(rawCallResult); }, getABIEncodedTransactionData(): string { @@ -1703,6 +1704,7 @@ export class StakingContract extends BaseContract { defaultBlock, ); const abiEncoder = self._lookupAbiEncoder(functionSignature); + BaseContract._throwIfUnexpectedEmptyCallResult(rawCallResult, abiEncoder); return abiEncoder.strictDecodeReturnValue(rawCallResult); }, getABIEncodedTransactionData(): string { @@ -1728,6 +1730,7 @@ export class StakingContract extends BaseContract { defaultBlock, ); const abiEncoder = self._lookupAbiEncoder(functionSignature); + BaseContract._throwIfUnexpectedEmptyCallResult(rawCallResult, abiEncoder); return abiEncoder.strictDecodeReturnValue<[BigNumber, BigNumber, BigNumber, BigNumber, BigNumber]>( rawCallResult, ); @@ -1750,6 +1753,7 @@ export class StakingContract extends BaseContract { defaultBlock, ); const abiEncoder = self._lookupAbiEncoder(functionSignature); + BaseContract._throwIfUnexpectedEmptyCallResult(rawCallResult, abiEncoder); return abiEncoder.strictDecodeReturnValue(rawCallResult); }, getABIEncodedTransactionData(): string { @@ -1770,6 +1774,7 @@ export class StakingContract extends BaseContract { defaultBlock, ); const abiEncoder = self._lookupAbiEncoder(functionSignature); + BaseContract._throwIfUnexpectedEmptyCallResult(rawCallResult, abiEncoder); return abiEncoder.strictDecodeReturnValue(rawCallResult); }, getABIEncodedTransactionData(): string { @@ -1789,6 +1794,7 @@ export class StakingContract extends BaseContract { defaultBlock, ); const abiEncoder = self._lookupAbiEncoder(functionSignature); + BaseContract._throwIfUnexpectedEmptyCallResult(rawCallResult, abiEncoder); return abiEncoder.strictDecodeReturnValue(rawCallResult); }, getABIEncodedTransactionData(): string { @@ -1808,6 +1814,7 @@ export class StakingContract extends BaseContract { defaultBlock, ); const abiEncoder = self._lookupAbiEncoder(functionSignature); + BaseContract._throwIfUnexpectedEmptyCallResult(rawCallResult, abiEncoder); return abiEncoder.strictDecodeReturnValue(rawCallResult); }, getABIEncodedTransactionData(): string { @@ -1835,6 +1842,7 @@ export class StakingContract extends BaseContract { defaultBlock, ); const abiEncoder = self._lookupAbiEncoder(functionSignature); + BaseContract._throwIfUnexpectedEmptyCallResult(rawCallResult, abiEncoder); return abiEncoder.strictDecodeReturnValue(rawCallResult); }, getABIEncodedTransactionData(): string { @@ -1860,6 +1868,7 @@ export class StakingContract extends BaseContract { defaultBlock, ); const abiEncoder = self._lookupAbiEncoder(functionSignature); + BaseContract._throwIfUnexpectedEmptyCallResult(rawCallResult, abiEncoder); return abiEncoder.strictDecodeReturnValue(rawCallResult); }, getABIEncodedTransactionData(): string { @@ -1917,6 +1926,7 @@ export class StakingContract extends BaseContract { defaultBlock, ); const abiEncoder = self._lookupAbiEncoder(functionSignature); + BaseContract._throwIfUnexpectedEmptyCallResult(rawCallResult, abiEncoder); return abiEncoder.strictDecodeReturnValue(rawCallResult); }, getABIEncodedTransactionData(): string { @@ -1936,6 +1946,7 @@ export class StakingContract extends BaseContract { defaultBlock, ); const abiEncoder = self._lookupAbiEncoder(functionSignature); + BaseContract._throwIfUnexpectedEmptyCallResult(rawCallResult, abiEncoder); return abiEncoder.strictDecodeReturnValue(rawCallResult); }, getABIEncodedTransactionData(): string { @@ -1955,6 +1966,7 @@ export class StakingContract extends BaseContract { defaultBlock, ); const abiEncoder = self._lookupAbiEncoder(functionSignature); + BaseContract._throwIfUnexpectedEmptyCallResult(rawCallResult, abiEncoder); return abiEncoder.strictDecodeReturnValue(rawCallResult); }, getABIEncodedTransactionData(): string { @@ -2011,6 +2023,7 @@ export class StakingContract extends BaseContract { defaultBlock, ); const abiEncoder = self._lookupAbiEncoder(functionSignature); + BaseContract._throwIfUnexpectedEmptyCallResult(rawCallResult, abiEncoder); return abiEncoder.strictDecodeReturnValue(rawCallResult); }, getABIEncodedTransactionData(): string { @@ -2062,6 +2075,7 @@ export class StakingContract extends BaseContract { defaultBlock, ); const abiEncoder = self._lookupAbiEncoder(functionSignature); + BaseContract._throwIfUnexpectedEmptyCallResult(rawCallResult, abiEncoder); return abiEncoder.strictDecodeReturnValue(rawCallResult); }, getABIEncodedTransactionData(): string { @@ -2081,6 +2095,7 @@ export class StakingContract extends BaseContract { defaultBlock, ); const abiEncoder = self._lookupAbiEncoder(functionSignature); + BaseContract._throwIfUnexpectedEmptyCallResult(rawCallResult, abiEncoder); return abiEncoder.strictDecodeReturnValue(rawCallResult); }, getABIEncodedTransactionData(): string { @@ -2135,6 +2150,7 @@ export class StakingContract extends BaseContract { defaultBlock, ); const abiEncoder = self._lookupAbiEncoder(functionSignature); + BaseContract._throwIfUnexpectedEmptyCallResult(rawCallResult, abiEncoder); return abiEncoder.strictDecodeReturnValue(rawCallResult); }, getABIEncodedTransactionData(): string { @@ -2158,6 +2174,7 @@ export class StakingContract extends BaseContract { defaultBlock, ); const abiEncoder = self._lookupAbiEncoder(functionSignature); + BaseContract._throwIfUnexpectedEmptyCallResult(rawCallResult, abiEncoder); return abiEncoder.strictDecodeReturnValue(rawCallResult); }, getABIEncodedTransactionData(): string { @@ -2183,6 +2200,7 @@ export class StakingContract extends BaseContract { defaultBlock, ); const abiEncoder = self._lookupAbiEncoder(functionSignature); + BaseContract._throwIfUnexpectedEmptyCallResult(rawCallResult, abiEncoder); return abiEncoder.strictDecodeReturnValue(rawCallResult); }, getABIEncodedTransactionData(): string { @@ -2213,6 +2231,7 @@ export class StakingContract extends BaseContract { defaultBlock, ); const abiEncoder = self._lookupAbiEncoder(functionSignature); + BaseContract._throwIfUnexpectedEmptyCallResult(rawCallResult, abiEncoder); return abiEncoder.strictDecodeReturnValue<{ currentEpoch: BigNumber; currentEpochBalance: BigNumber; @@ -2250,6 +2269,7 @@ export class StakingContract extends BaseContract { defaultBlock, ); const abiEncoder = self._lookupAbiEncoder(functionSignature); + BaseContract._throwIfUnexpectedEmptyCallResult(rawCallResult, abiEncoder); return abiEncoder.strictDecodeReturnValue<{ currentEpoch: BigNumber; currentEpochBalance: BigNumber; @@ -2280,6 +2300,7 @@ export class StakingContract extends BaseContract { defaultBlock, ); const abiEncoder = self._lookupAbiEncoder(functionSignature); + BaseContract._throwIfUnexpectedEmptyCallResult(rawCallResult, abiEncoder); return abiEncoder.strictDecodeReturnValue<[BigNumber, number, BigNumber, number, number]>( rawCallResult, ); @@ -2315,6 +2336,7 @@ export class StakingContract extends BaseContract { defaultBlock, ); const abiEncoder = self._lookupAbiEncoder(functionSignature); + BaseContract._throwIfUnexpectedEmptyCallResult(rawCallResult, abiEncoder); return abiEncoder.strictDecodeReturnValue<{ currentEpoch: BigNumber; currentEpochBalance: BigNumber; @@ -2346,6 +2368,7 @@ export class StakingContract extends BaseContract { defaultBlock, ); const abiEncoder = self._lookupAbiEncoder(functionSignature); + BaseContract._throwIfUnexpectedEmptyCallResult(rawCallResult, abiEncoder); return abiEncoder.strictDecodeReturnValue<{ operator: string; operatorShare: number }>(rawCallResult); }, getABIEncodedTransactionData(): string { @@ -2376,6 +2399,7 @@ export class StakingContract extends BaseContract { defaultBlock, ); const abiEncoder = self._lookupAbiEncoder(functionSignature); + BaseContract._throwIfUnexpectedEmptyCallResult(rawCallResult, abiEncoder); return abiEncoder.strictDecodeReturnValue<{ feesCollected: BigNumber; weightedStake: BigNumber; @@ -2405,6 +2429,7 @@ export class StakingContract extends BaseContract { defaultBlock, ); const abiEncoder = self._lookupAbiEncoder(functionSignature); + BaseContract._throwIfUnexpectedEmptyCallResult(rawCallResult, abiEncoder); return abiEncoder.strictDecodeReturnValue(rawCallResult); }, getABIEncodedTransactionData(): string { @@ -2436,6 +2461,7 @@ export class StakingContract extends BaseContract { defaultBlock, ); const abiEncoder = self._lookupAbiEncoder(functionSignature); + BaseContract._throwIfUnexpectedEmptyCallResult(rawCallResult, abiEncoder); return abiEncoder.strictDecodeReturnValue<{ currentEpoch: BigNumber; currentEpochBalance: BigNumber; @@ -2464,6 +2490,7 @@ export class StakingContract extends BaseContract { defaultBlock, ); const abiEncoder = self._lookupAbiEncoder(functionSignature); + BaseContract._throwIfUnexpectedEmptyCallResult(rawCallResult, abiEncoder); return abiEncoder.strictDecodeReturnValue(rawCallResult); }, getABIEncodedTransactionData(): string { @@ -2488,6 +2515,7 @@ export class StakingContract extends BaseContract { defaultBlock, ); const abiEncoder = self._lookupAbiEncoder(functionSignature); + BaseContract._throwIfUnexpectedEmptyCallResult(rawCallResult, abiEncoder); return abiEncoder.strictDecodeReturnValue(rawCallResult); }, getABIEncodedTransactionData(): string { @@ -2538,6 +2566,7 @@ export class StakingContract extends BaseContract { defaultBlock, ); const abiEncoder = self._lookupAbiEncoder(functionSignature); + BaseContract._throwIfUnexpectedEmptyCallResult(rawCallResult, abiEncoder); return abiEncoder.strictDecodeReturnValue(rawCallResult); }, getABIEncodedTransactionData(): string { @@ -2588,6 +2617,7 @@ export class StakingContract extends BaseContract { defaultBlock, ); const abiEncoder = self._lookupAbiEncoder(functionSignature); + BaseContract._throwIfUnexpectedEmptyCallResult(rawCallResult, abiEncoder); return abiEncoder.strictDecodeReturnValue(rawCallResult); }, getABIEncodedTransactionData(): string { @@ -2607,6 +2637,7 @@ export class StakingContract extends BaseContract { defaultBlock, ); const abiEncoder = self._lookupAbiEncoder(functionSignature); + BaseContract._throwIfUnexpectedEmptyCallResult(rawCallResult, abiEncoder); return abiEncoder.strictDecodeReturnValue(rawCallResult); }, getABIEncodedTransactionData(): string { @@ -2626,6 +2657,7 @@ export class StakingContract extends BaseContract { defaultBlock, ); const abiEncoder = self._lookupAbiEncoder(functionSignature); + BaseContract._throwIfUnexpectedEmptyCallResult(rawCallResult, abiEncoder); return abiEncoder.strictDecodeReturnValue(rawCallResult); }, getABIEncodedTransactionData(): string { @@ -2685,6 +2717,7 @@ export class StakingContract extends BaseContract { defaultBlock, ); const abiEncoder = self._lookupAbiEncoder(functionSignature); + BaseContract._throwIfUnexpectedEmptyCallResult(rawCallResult, abiEncoder); return abiEncoder.strictDecodeReturnValue(rawCallResult); }, getABIEncodedTransactionData(): string { @@ -2704,6 +2737,7 @@ export class StakingContract extends BaseContract { defaultBlock, ); const abiEncoder = self._lookupAbiEncoder(functionSignature); + BaseContract._throwIfUnexpectedEmptyCallResult(rawCallResult, abiEncoder); return abiEncoder.strictDecodeReturnValue(rawCallResult); }, getABIEncodedTransactionData(): string { @@ -2765,6 +2799,7 @@ export class StakingContract extends BaseContract { defaultBlock, ); const abiEncoder = self._lookupAbiEncoder(functionSignature); + BaseContract._throwIfUnexpectedEmptyCallResult(rawCallResult, abiEncoder); return abiEncoder.strictDecodeReturnValue(rawCallResult); }, getABIEncodedTransactionData(): string { @@ -2789,6 +2824,7 @@ export class StakingContract extends BaseContract { defaultBlock, ); const abiEncoder = self._lookupAbiEncoder(functionSignature); + BaseContract._throwIfUnexpectedEmptyCallResult(rawCallResult, abiEncoder); return abiEncoder.strictDecodeReturnValue(rawCallResult); }, getABIEncodedTransactionData(): string { @@ -2816,6 +2852,7 @@ export class StakingContract extends BaseContract { defaultBlock, ); const abiEncoder = self._lookupAbiEncoder(functionSignature); + BaseContract._throwIfUnexpectedEmptyCallResult(rawCallResult, abiEncoder); return abiEncoder.strictDecodeReturnValue<[BigNumber, BigNumber, BigNumber]>(rawCallResult); }, getABIEncodedTransactionData(): string { @@ -2866,6 +2903,7 @@ export class StakingContract extends BaseContract { defaultBlock, ); const abiEncoder = self._lookupAbiEncoder(functionSignature); + BaseContract._throwIfUnexpectedEmptyCallResult(rawCallResult, abiEncoder); return abiEncoder.strictDecodeReturnValue(rawCallResult); }, getABIEncodedTransactionData(): string { @@ -2918,6 +2956,7 @@ export class StakingContract extends BaseContract { defaultBlock, ); const abiEncoder = self._lookupAbiEncoder(functionSignature); + BaseContract._throwIfUnexpectedEmptyCallResult(rawCallResult, abiEncoder); return abiEncoder.strictDecodeReturnValue(rawCallResult); }, getABIEncodedTransactionData(): string { @@ -2968,6 +3007,7 @@ export class StakingContract extends BaseContract { defaultBlock, ); const abiEncoder = self._lookupAbiEncoder(functionSignature); + BaseContract._throwIfUnexpectedEmptyCallResult(rawCallResult, abiEncoder); return abiEncoder.strictDecodeReturnValue(rawCallResult); }, getABIEncodedTransactionData(): string { @@ -2987,6 +3027,7 @@ export class StakingContract extends BaseContract { defaultBlock, ); const abiEncoder = self._lookupAbiEncoder(functionSignature); + BaseContract._throwIfUnexpectedEmptyCallResult(rawCallResult, abiEncoder); return abiEncoder.strictDecodeReturnValue(rawCallResult); }, getABIEncodedTransactionData(): string { @@ -3007,6 +3048,7 @@ export class StakingContract extends BaseContract { defaultBlock, ); const abiEncoder = self._lookupAbiEncoder(functionSignature); + BaseContract._throwIfUnexpectedEmptyCallResult(rawCallResult, abiEncoder); return abiEncoder.strictDecodeReturnValue(rawCallResult); }, getABIEncodedTransactionData(): string { @@ -3074,6 +3116,7 @@ export class StakingContract extends BaseContract { defaultBlock, ); const abiEncoder = self._lookupAbiEncoder(functionSignature); + BaseContract._throwIfUnexpectedEmptyCallResult(rawCallResult, abiEncoder); return abiEncoder.strictDecodeReturnValue(rawCallResult); }, getABIEncodedTransactionData(): string { @@ -3131,6 +3174,7 @@ export class StakingContract extends BaseContract { defaultBlock, ); const abiEncoder = self._lookupAbiEncoder(functionSignature); + BaseContract._throwIfUnexpectedEmptyCallResult(rawCallResult, abiEncoder); return abiEncoder.strictDecodeReturnValue(rawCallResult); }, getABIEncodedTransactionData(): string { @@ -3150,6 +3194,7 @@ export class StakingContract extends BaseContract { defaultBlock, ); const abiEncoder = self._lookupAbiEncoder(functionSignature); + BaseContract._throwIfUnexpectedEmptyCallResult(rawCallResult, abiEncoder); return abiEncoder.strictDecodeReturnValue(rawCallResult); }, getABIEncodedTransactionData(): string { @@ -3200,6 +3245,7 @@ export class StakingContract extends BaseContract { defaultBlock, ); const abiEncoder = self._lookupAbiEncoder(functionSignature); + BaseContract._throwIfUnexpectedEmptyCallResult(rawCallResult, abiEncoder); return abiEncoder.strictDecodeReturnValue(rawCallResult); }, getABIEncodedTransactionData(): string { @@ -3252,6 +3298,7 @@ export class StakingContract extends BaseContract { defaultBlock, ); const abiEncoder = self._lookupAbiEncoder(functionSignature); + BaseContract._throwIfUnexpectedEmptyCallResult(rawCallResult, abiEncoder); return abiEncoder.strictDecodeReturnValue(rawCallResult); }, getABIEncodedTransactionData(): string { @@ -3272,6 +3319,7 @@ export class StakingContract extends BaseContract { defaultBlock, ); const abiEncoder = self._lookupAbiEncoder(functionSignature); + BaseContract._throwIfUnexpectedEmptyCallResult(rawCallResult, abiEncoder); return abiEncoder.strictDecodeReturnValue(rawCallResult); }, getABIEncodedTransactionData(): string { @@ -3291,6 +3339,7 @@ export class StakingContract extends BaseContract { defaultBlock, ); const abiEncoder = self._lookupAbiEncoder(functionSignature); + BaseContract._throwIfUnexpectedEmptyCallResult(rawCallResult, abiEncoder); return abiEncoder.strictDecodeReturnValue(rawCallResult); }, getABIEncodedTransactionData(): string { @@ -3342,6 +3391,7 @@ export class StakingContract extends BaseContract { defaultBlock, ); const abiEncoder = self._lookupAbiEncoder(functionSignature); + BaseContract._throwIfUnexpectedEmptyCallResult(rawCallResult, abiEncoder); return abiEncoder.strictDecodeReturnValue(rawCallResult); }, getABIEncodedTransactionData(): string { diff --git a/packages/contract-wrappers/src/generated-wrappers/staking_proxy.ts b/packages/contract-wrappers/src/generated-wrappers/staking_proxy.ts index 92159b5ec9..4c962c3771 100644 --- a/packages/contract-wrappers/src/generated-wrappers/staking_proxy.ts +++ b/packages/contract-wrappers/src/generated-wrappers/staking_proxy.ts @@ -772,6 +772,7 @@ export class StakingProxyContract extends BaseContract { defaultBlock, ); const abiEncoder = self._lookupAbiEncoder(functionSignature); + BaseContract._throwIfUnexpectedEmptyCallResult(rawCallResult, abiEncoder); return abiEncoder.strictDecodeReturnValue(rawCallResult); }, getABIEncodedTransactionData(): string { @@ -797,6 +798,7 @@ export class StakingProxyContract extends BaseContract { defaultBlock, ); const abiEncoder = self._lookupAbiEncoder(functionSignature); + BaseContract._throwIfUnexpectedEmptyCallResult(rawCallResult, abiEncoder); return abiEncoder.strictDecodeReturnValue<[BigNumber, BigNumber, BigNumber, BigNumber, BigNumber]>( rawCallResult, ); @@ -821,6 +823,7 @@ export class StakingProxyContract extends BaseContract { defaultBlock, ); const abiEncoder = self._lookupAbiEncoder(functionSignature); + BaseContract._throwIfUnexpectedEmptyCallResult(rawCallResult, abiEncoder); return abiEncoder.strictDecodeReturnValue(rawCallResult); }, getABIEncodedTransactionData(): string { @@ -871,6 +874,7 @@ export class StakingProxyContract extends BaseContract { defaultBlock, ); const abiEncoder = self._lookupAbiEncoder(functionSignature); + BaseContract._throwIfUnexpectedEmptyCallResult(rawCallResult, abiEncoder); return abiEncoder.strictDecodeReturnValue(rawCallResult); }, getABIEncodedTransactionData(): string { @@ -891,6 +895,7 @@ export class StakingProxyContract extends BaseContract { defaultBlock, ); const abiEncoder = self._lookupAbiEncoder(functionSignature); + BaseContract._throwIfUnexpectedEmptyCallResult(rawCallResult, abiEncoder); return abiEncoder.strictDecodeReturnValue(rawCallResult); }, getABIEncodedTransactionData(): string { @@ -911,6 +916,7 @@ export class StakingProxyContract extends BaseContract { defaultBlock, ); const abiEncoder = self._lookupAbiEncoder(functionSignature); + BaseContract._throwIfUnexpectedEmptyCallResult(rawCallResult, abiEncoder); return abiEncoder.strictDecodeReturnValue(rawCallResult); }, getABIEncodedTransactionData(): string { @@ -962,6 +968,7 @@ export class StakingProxyContract extends BaseContract { defaultBlock, ); const abiEncoder = self._lookupAbiEncoder(functionSignature); + BaseContract._throwIfUnexpectedEmptyCallResult(rawCallResult, abiEncoder); return abiEncoder.strictDecodeReturnValue(rawCallResult); }, getABIEncodedTransactionData(): string { @@ -981,6 +988,7 @@ export class StakingProxyContract extends BaseContract { defaultBlock, ); const abiEncoder = self._lookupAbiEncoder(functionSignature); + BaseContract._throwIfUnexpectedEmptyCallResult(rawCallResult, abiEncoder); return abiEncoder.strictDecodeReturnValue(rawCallResult); }, getABIEncodedTransactionData(): string { @@ -1000,6 +1008,7 @@ export class StakingProxyContract extends BaseContract { defaultBlock, ); const abiEncoder = self._lookupAbiEncoder(functionSignature); + BaseContract._throwIfUnexpectedEmptyCallResult(rawCallResult, abiEncoder); return abiEncoder.strictDecodeReturnValue(rawCallResult); }, getABIEncodedTransactionData(): string { @@ -1019,6 +1028,7 @@ export class StakingProxyContract extends BaseContract { defaultBlock, ); const abiEncoder = self._lookupAbiEncoder(functionSignature); + BaseContract._throwIfUnexpectedEmptyCallResult(rawCallResult, abiEncoder); return abiEncoder.strictDecodeReturnValue(rawCallResult); }, getABIEncodedTransactionData(): string { @@ -1038,6 +1048,7 @@ export class StakingProxyContract extends BaseContract { defaultBlock, ); const abiEncoder = self._lookupAbiEncoder(functionSignature); + BaseContract._throwIfUnexpectedEmptyCallResult(rawCallResult, abiEncoder); return abiEncoder.strictDecodeReturnValue(rawCallResult); }, getABIEncodedTransactionData(): string { @@ -1086,6 +1097,7 @@ export class StakingProxyContract extends BaseContract { defaultBlock, ); const abiEncoder = self._lookupAbiEncoder(functionSignature); + BaseContract._throwIfUnexpectedEmptyCallResult(rawCallResult, abiEncoder); return abiEncoder.strictDecodeReturnValue(rawCallResult); }, getABIEncodedTransactionData(): string { @@ -1105,6 +1117,7 @@ export class StakingProxyContract extends BaseContract { defaultBlock, ); const abiEncoder = self._lookupAbiEncoder(functionSignature); + BaseContract._throwIfUnexpectedEmptyCallResult(rawCallResult, abiEncoder); return abiEncoder.strictDecodeReturnValue(rawCallResult); }, getABIEncodedTransactionData(): string { @@ -1128,6 +1141,7 @@ export class StakingProxyContract extends BaseContract { defaultBlock, ); const abiEncoder = self._lookupAbiEncoder(functionSignature); + BaseContract._throwIfUnexpectedEmptyCallResult(rawCallResult, abiEncoder); return abiEncoder.strictDecodeReturnValue(rawCallResult); }, getABIEncodedTransactionData(): string { @@ -1147,6 +1161,7 @@ export class StakingProxyContract extends BaseContract { defaultBlock, ); const abiEncoder = self._lookupAbiEncoder(functionSignature); + BaseContract._throwIfUnexpectedEmptyCallResult(rawCallResult, abiEncoder); return abiEncoder.strictDecodeReturnValue(rawCallResult); }, getABIEncodedTransactionData(): string { @@ -1166,6 +1181,7 @@ export class StakingProxyContract extends BaseContract { defaultBlock, ); const abiEncoder = self._lookupAbiEncoder(functionSignature); + BaseContract._throwIfUnexpectedEmptyCallResult(rawCallResult, abiEncoder); return abiEncoder.strictDecodeReturnValue(rawCallResult); }, getABIEncodedTransactionData(): string { @@ -1185,6 +1201,7 @@ export class StakingProxyContract extends BaseContract { defaultBlock, ); const abiEncoder = self._lookupAbiEncoder(functionSignature); + BaseContract._throwIfUnexpectedEmptyCallResult(rawCallResult, abiEncoder); return abiEncoder.strictDecodeReturnValue(rawCallResult); }, getABIEncodedTransactionData(): string { @@ -1205,6 +1222,7 @@ export class StakingProxyContract extends BaseContract { defaultBlock, ); const abiEncoder = self._lookupAbiEncoder(functionSignature); + BaseContract._throwIfUnexpectedEmptyCallResult(rawCallResult, abiEncoder); return abiEncoder.strictDecodeReturnValue(rawCallResult); }, getABIEncodedTransactionData(): string { @@ -1232,6 +1250,7 @@ export class StakingProxyContract extends BaseContract { defaultBlock, ); const abiEncoder = self._lookupAbiEncoder(functionSignature); + BaseContract._throwIfUnexpectedEmptyCallResult(rawCallResult, abiEncoder); return abiEncoder.strictDecodeReturnValue<[BigNumber, BigNumber, BigNumber]>(rawCallResult); }, getABIEncodedTransactionData(): string { @@ -1282,6 +1301,7 @@ export class StakingProxyContract extends BaseContract { defaultBlock, ); const abiEncoder = self._lookupAbiEncoder(functionSignature); + BaseContract._throwIfUnexpectedEmptyCallResult(rawCallResult, abiEncoder); return abiEncoder.strictDecodeReturnValue(rawCallResult); }, getABIEncodedTransactionData(): string { @@ -1334,6 +1354,7 @@ export class StakingProxyContract extends BaseContract { defaultBlock, ); const abiEncoder = self._lookupAbiEncoder(functionSignature); + BaseContract._throwIfUnexpectedEmptyCallResult(rawCallResult, abiEncoder); return abiEncoder.strictDecodeReturnValue(rawCallResult); }, getABIEncodedTransactionData(): string { @@ -1353,6 +1374,7 @@ export class StakingProxyContract extends BaseContract { defaultBlock, ); const abiEncoder = self._lookupAbiEncoder(functionSignature); + BaseContract._throwIfUnexpectedEmptyCallResult(rawCallResult, abiEncoder); return abiEncoder.strictDecodeReturnValue(rawCallResult); }, getABIEncodedTransactionData(): string { @@ -1373,6 +1395,7 @@ export class StakingProxyContract extends BaseContract { defaultBlock, ); const abiEncoder = self._lookupAbiEncoder(functionSignature); + BaseContract._throwIfUnexpectedEmptyCallResult(rawCallResult, abiEncoder); return abiEncoder.strictDecodeReturnValue(rawCallResult); }, getABIEncodedTransactionData(): string { @@ -1392,6 +1415,7 @@ export class StakingProxyContract extends BaseContract { defaultBlock, ); const abiEncoder = self._lookupAbiEncoder(functionSignature); + BaseContract._throwIfUnexpectedEmptyCallResult(rawCallResult, abiEncoder); return abiEncoder.strictDecodeReturnValue(rawCallResult); }, getABIEncodedTransactionData(): string { @@ -1442,6 +1466,7 @@ export class StakingProxyContract extends BaseContract { defaultBlock, ); const abiEncoder = self._lookupAbiEncoder(functionSignature); + BaseContract._throwIfUnexpectedEmptyCallResult(rawCallResult, abiEncoder); return abiEncoder.strictDecodeReturnValue(rawCallResult); }, getABIEncodedTransactionData(): string { @@ -1462,6 +1487,7 @@ export class StakingProxyContract extends BaseContract { defaultBlock, ); const abiEncoder = self._lookupAbiEncoder(functionSignature); + BaseContract._throwIfUnexpectedEmptyCallResult(rawCallResult, abiEncoder); return abiEncoder.strictDecodeReturnValue(rawCallResult); }, getABIEncodedTransactionData(): string { @@ -1481,6 +1507,7 @@ export class StakingProxyContract extends BaseContract { defaultBlock, ); const abiEncoder = self._lookupAbiEncoder(functionSignature); + BaseContract._throwIfUnexpectedEmptyCallResult(rawCallResult, abiEncoder); return abiEncoder.strictDecodeReturnValue(rawCallResult); }, getABIEncodedTransactionData(): string { diff --git a/packages/contract-wrappers/src/generated-wrappers/weth9.ts b/packages/contract-wrappers/src/generated-wrappers/weth9.ts index 25e6aad296..1a6d7cf648 100644 --- a/packages/contract-wrappers/src/generated-wrappers/weth9.ts +++ b/packages/contract-wrappers/src/generated-wrappers/weth9.ts @@ -479,6 +479,7 @@ export class WETH9Contract extends BaseContract { defaultBlock, ); const abiEncoder = self._lookupAbiEncoder(functionSignature); + BaseContract._throwIfUnexpectedEmptyCallResult(rawCallResult, abiEncoder); return abiEncoder.strictDecodeReturnValue(rawCallResult); }, getABIEncodedTransactionData(): string { @@ -526,6 +527,7 @@ export class WETH9Contract extends BaseContract { defaultBlock, ); const abiEncoder = self._lookupAbiEncoder(functionSignature); + BaseContract._throwIfUnexpectedEmptyCallResult(rawCallResult, abiEncoder); return abiEncoder.strictDecodeReturnValue(rawCallResult); }, getABIEncodedTransactionData(): string { @@ -546,6 +548,7 @@ export class WETH9Contract extends BaseContract { defaultBlock, ); const abiEncoder = self._lookupAbiEncoder(functionSignature); + BaseContract._throwIfUnexpectedEmptyCallResult(rawCallResult, abiEncoder); return abiEncoder.strictDecodeReturnValue(rawCallResult); }, getABIEncodedTransactionData(): string { @@ -565,6 +568,7 @@ export class WETH9Contract extends BaseContract { defaultBlock, ); const abiEncoder = self._lookupAbiEncoder(functionSignature); + BaseContract._throwIfUnexpectedEmptyCallResult(rawCallResult, abiEncoder); return abiEncoder.strictDecodeReturnValue(rawCallResult); }, getABIEncodedTransactionData(): string { @@ -610,6 +614,7 @@ export class WETH9Contract extends BaseContract { defaultBlock, ); const abiEncoder = self._lookupAbiEncoder(functionSignature); + BaseContract._throwIfUnexpectedEmptyCallResult(rawCallResult, abiEncoder); return abiEncoder.strictDecodeReturnValue(rawCallResult); }, getABIEncodedTransactionData(): string { @@ -629,6 +634,7 @@ export class WETH9Contract extends BaseContract { defaultBlock, ); const abiEncoder = self._lookupAbiEncoder(functionSignature); + BaseContract._throwIfUnexpectedEmptyCallResult(rawCallResult, abiEncoder); return abiEncoder.strictDecodeReturnValue(rawCallResult); }, getABIEncodedTransactionData(): string { @@ -648,6 +654,7 @@ export class WETH9Contract extends BaseContract { defaultBlock, ); const abiEncoder = self._lookupAbiEncoder(functionSignature); + BaseContract._throwIfUnexpectedEmptyCallResult(rawCallResult, abiEncoder); return abiEncoder.strictDecodeReturnValue(rawCallResult); }, getABIEncodedTransactionData(): string { @@ -667,6 +674,7 @@ export class WETH9Contract extends BaseContract { defaultBlock, ); const abiEncoder = self._lookupAbiEncoder(functionSignature); + BaseContract._throwIfUnexpectedEmptyCallResult(rawCallResult, abiEncoder); return abiEncoder.strictDecodeReturnValue(rawCallResult); }, getABIEncodedTransactionData(): string { @@ -714,6 +722,7 @@ export class WETH9Contract extends BaseContract { defaultBlock, ); const abiEncoder = self._lookupAbiEncoder(functionSignature); + BaseContract._throwIfUnexpectedEmptyCallResult(rawCallResult, abiEncoder); return abiEncoder.strictDecodeReturnValue(rawCallResult); }, getABIEncodedTransactionData(): string { @@ -762,6 +771,7 @@ export class WETH9Contract extends BaseContract { defaultBlock, ); const abiEncoder = self._lookupAbiEncoder(functionSignature); + BaseContract._throwIfUnexpectedEmptyCallResult(rawCallResult, abiEncoder); return abiEncoder.strictDecodeReturnValue(rawCallResult); }, getABIEncodedTransactionData(): string { @@ -808,6 +818,7 @@ export class WETH9Contract extends BaseContract { defaultBlock, ); const abiEncoder = self._lookupAbiEncoder(functionSignature); + BaseContract._throwIfUnexpectedEmptyCallResult(rawCallResult, abiEncoder); return abiEncoder.strictDecodeReturnValue(rawCallResult); }, getABIEncodedTransactionData(): string { diff --git a/packages/utils/CHANGELOG.json b/packages/utils/CHANGELOG.json index 709d7a1ccf..277ddc1a6f 100644 --- a/packages/utils/CHANGELOG.json +++ b/packages/utils/CHANGELOG.json @@ -1,4 +1,13 @@ [ + { + "version": "5.2.0", + "changes": [ + { + "note": "Allow for strict decoding of return values.", + "pr": 2433 + } + ] + }, { "timestamp": 1578272714, "version": "5.1.2", diff --git a/packages/utils/src/abi_encoder/abstract_data_types/data_type.ts b/packages/utils/src/abi_encoder/abstract_data_types/data_type.ts index ac2ce061e6..d7caf5d5a0 100644 --- a/packages/utils/src/abi_encoder/abstract_data_types/data_type.ts +++ b/packages/utils/src/abi_encoder/abstract_data_types/data_type.ts @@ -26,8 +26,8 @@ export abstract class DataType { return this._factory; } - public encode(value: any, rules?: EncodingRules, selector?: string): string { - const rules_ = rules === undefined ? constants.DEFAULT_ENCODING_RULES : rules; + public encode(value: any, rules?: Partial, selector?: string): string { + const rules_ = { ...constants.DEFAULT_ENCODING_RULES, ...rules }; const calldata = new Calldata(rules_); if (selector !== undefined) { calldata.setSelector(selector); @@ -38,7 +38,7 @@ export abstract class DataType { return encodedCalldata; } - public decode(calldata: string, rules?: DecodingRules, selector?: string): any { + public decode(calldata: string, rules?: Partial, selector?: string): any { if (selector !== undefined && !_.startsWith(calldata, selector)) { throw new Error( `Tried to decode calldata, but it was missing the function selector. Expected prefix '${selector}'. Got '${calldata}'.`, @@ -46,13 +46,15 @@ export abstract class DataType { } const hasSelector = selector !== undefined; const rawCalldata = new RawCalldata(calldata, hasSelector); - const rules_ = rules === undefined ? constants.DEFAULT_DECODING_RULES : rules; + const rules_ = { ...constants.DEFAULT_DECODING_RULES, ...rules }; const value = - rawCalldata.getSizeInBytes() > 0 ? this.generateValue(rawCalldata, rules_) : this.getDefaultValue(rules_); + rules_.isStrictMode || rawCalldata.getSizeInBytes() > 0 + ? this.generateValue(rawCalldata, rules_) + : this.getDefaultValue(rules_); return value; } - public decodeAsArray(returndata: string, rules?: DecodingRules): any[] { + public decodeAsArray(returndata: string, rules?: Partial): any[] { const value = this.decode(returndata, rules); const valuesAsArray = _.isObject(value) ? _.values(value) : [value]; return valuesAsArray; diff --git a/packages/utils/src/abi_encoder/evm_data_types/method.ts b/packages/utils/src/abi_encoder/evm_data_types/method.ts index 803fe77d89..e50009d344 100644 --- a/packages/utils/src/abi_encoder/evm_data_types/method.ts +++ b/packages/utils/src/abi_encoder/evm_data_types/method.ts @@ -29,13 +29,13 @@ export class MethodDataType extends AbstractSetDataType { return calldata; } - public decode(calldata: string, rules?: DecodingRules): any[] | object { + public decode(calldata: string, rules?: Partial): any[] | object { const value = super.decode(calldata, rules, this._methodSelector); return value; } - public strictDecode(calldata: string, rules?: DecodingRules): T { - const value = super.decode(calldata, rules, this._methodSelector); + public strictDecode(calldata: string, rules?: Partial): T { + const value = super.decode(calldata, { ...rules, isStrictMode: true }, this._methodSelector); const valueAsArray: any = _.isObject(value) ? _.values(value) : [value]; switch (valueAsArray.length) { case 0: @@ -52,13 +52,13 @@ export class MethodDataType extends AbstractSetDataType { return returnData; } - public decodeReturnValues(returndata: string, rules?: DecodingRules): any { + public decodeReturnValues(returndata: string, rules?: Partial): any { const returnValues = this._returnDataType.decode(returndata, rules); return returnValues; } - public strictDecodeReturnValue(returndata: string, rules?: DecodingRules): T { - const returnValues = this._returnDataType.decode(returndata, rules); + public strictDecodeReturnValue(returndata: string, rules?: Partial): T { + const returnValues = this._returnDataType.decode(returndata, { ...rules, isStrictMode: true }); const returnValuesAsArray: any = _.isObject(returnValues) ? _.values(returnValues) : [returnValues]; switch (returnValuesAsArray.length) { case 0: diff --git a/packages/utils/src/abi_encoder/utils/constants.ts b/packages/utils/src/abi_encoder/utils/constants.ts index b45b5b8e8b..2ed83ab7fc 100644 --- a/packages/utils/src/abi_encoder/utils/constants.ts +++ b/packages/utils/src/abi_encoder/utils/constants.ts @@ -13,7 +13,7 @@ export const constants = { HEX_SELECTOR_BYTE_OFFSET_IN_CALLDATA: 0, // Disable no-object-literal-type-assertion so we can enforce cast /* tslint:disable no-object-literal-type-assertion */ - DEFAULT_DECODING_RULES: { shouldConvertStructsToObjects: true } as DecodingRules, + DEFAULT_DECODING_RULES: { shouldConvertStructsToObjects: true, isStrictMode: false } as DecodingRules, DEFAULT_ENCODING_RULES: { shouldOptimize: true, shouldAnnotate: false } as EncodingRules, /* tslint:enable no-object-literal-type-assertion */ EMPTY_EVM_WORD_STRING: '0x0000000000000000000000000000000000000000000000000000000000000000', diff --git a/packages/utils/src/abi_encoder/utils/rules.ts b/packages/utils/src/abi_encoder/utils/rules.ts index c8d83c3ba8..9239305742 100644 --- a/packages/utils/src/abi_encoder/utils/rules.ts +++ b/packages/utils/src/abi_encoder/utils/rules.ts @@ -1,5 +1,6 @@ export interface DecodingRules { shouldConvertStructsToObjects: boolean; + isStrictMode: boolean; } export interface EncodingRules { diff --git a/packages/utils/test/abi_encoder/evm_data_types_test.ts b/packages/utils/test/abi_encoder/evm_data_types_test.ts index 9271abb263..d47d49b77d 100644 --- a/packages/utils/test/abi_encoder/evm_data_types_test.ts +++ b/packages/utils/test/abi_encoder/evm_data_types_test.ts @@ -272,7 +272,7 @@ describe('ABI Encoder: EVM Data Type Encoding/Decoding', () => { '0xfffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb0000000000000000000000000000000000000000000000000000000000000001'; expect(encodedArgs).to.be.equal(expectedEncodedArgs); // Decode Encoded Args and validate result - const decodingRules: AbiEncoder.DecodingRules = { shouldConvertStructsToObjects: true }; + const decodingRules = { shouldConvertStructsToObjects: true }; const decodedArgs = dataType.decode(encodedArgs, decodingRules); expect(decodedArgs).to.be.deep.equal(args); // Validate signature @@ -296,7 +296,7 @@ describe('ABI Encoder: EVM Data Type Encoding/Decoding', () => { '0x00000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000000000000000000000000d48656c6c6f2c20576f726c6421000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008abcdef0123456789000000000000000000000000000000000000000000000000'; expect(encodedArgs).to.be.equal(expectedEncodedArgs); // Decode Encoded Args and validate result - const decodingRules: AbiEncoder.DecodingRules = { shouldConvertStructsToObjects: true }; + const decodingRules = { shouldConvertStructsToObjects: true }; const decodedArgs = dataType.decode(encodedArgs, decodingRules); expect(decodedArgs).to.be.deep.equal(args); // Validate signature @@ -320,7 +320,7 @@ describe('ABI Encoder: EVM Data Type Encoding/Decoding', () => { '0x00000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000002'; expect(encodedArgs).to.be.equal(expectedEncodedArgs); // Decode Encoded Args and validate result - const decodingRules: AbiEncoder.DecodingRules = { shouldConvertStructsToObjects: true }; + const decodingRules = { shouldConvertStructsToObjects: true }; const decodedArgs = dataType.decode(encodedArgs, decodingRules); expect(decodedArgs).to.be.deep.equal(args); // Validate signature @@ -344,7 +344,7 @@ describe('ABI Encoder: EVM Data Type Encoding/Decoding', () => { '0x0000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000002'; expect(encodedArgs).to.be.equal(expectedEncodedArgs); // Decode Encoded Args and validate result - const decodingRules: AbiEncoder.DecodingRules = { shouldConvertStructsToObjects: true }; + const decodingRules = { shouldConvertStructsToObjects: true }; const decodedArgs = dataType.decode(encodedArgs, decodingRules); expect(decodedArgs).to.be.deep.equal(args); // Validate signature @@ -370,7 +370,7 @@ describe('ABI Encoder: EVM Data Type Encoding/Decoding', () => { '0x0102030400000000000000000000000000000000000000000000000000000000050607080000000000000000000000000000000000000000000000000000000009101112000000000000000000000000000000000000000000000000000000001314151600000000000000000000000000000000000000000000000000000000'; expect(encodedArgs).to.be.equal(expectedEncodedArgs); // Decode Encoded Args and validate result - const decodingRules: AbiEncoder.DecodingRules = { shouldConvertStructsToObjects: true }; + const decodingRules = { shouldConvertStructsToObjects: true }; const decodedArgs = dataType.decode(encodedArgs, decodingRules); expect(decodedArgs).to.be.deep.equal(args); // Validate signature @@ -396,7 +396,7 @@ describe('ABI Encoder: EVM Data Type Encoding/Decoding', () => { '0x000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000004010203040000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000040506070800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000004091011120000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000041314151600000000000000000000000000000000000000000000000000000000'; expect(encodedArgs).to.be.equal(expectedEncodedArgs); // Decode Encoded Args and validate result - const decodingRules: AbiEncoder.DecodingRules = { shouldConvertStructsToObjects: true }; + const decodingRules = { shouldConvertStructsToObjects: true }; const decodedArgs = dataType.decode(encodedArgs, decodingRules); expect(decodedArgs).to.be.deep.equal(args); // Validate signature @@ -430,7 +430,7 @@ describe('ABI Encoder: EVM Data Type Encoding/Decoding', () => { '0xfffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb0000000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000c0000000000000000000000000000000000000000000000000000000000000000d48656c6c6f2c20576f726c6421000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008abcdef0123456789000000000000000000000000000000000000000000000000'; expect(encodedArgs).to.be.equal(expectedEncodedArgs); // Decode Encoded Args and validate result - const decodingRules: AbiEncoder.DecodingRules = { shouldConvertStructsToObjects: true }; + const decodingRules = { shouldConvertStructsToObjects: true }; const decodedArgs = dataType.decode(encodedArgs, decodingRules); expect(decodedArgs).to.be.deep.equal(args); // Validate signature @@ -464,7 +464,7 @@ describe('ABI Encoder: EVM Data Type Encoding/Decoding', () => { // Construct args to be encoded const args = { field_1: new BigNumber(0), field_2: false }; // Decode Encoded Args and validate result - const decodingRules: AbiEncoder.DecodingRules = { shouldConvertStructsToObjects: true }; + const decodingRules = { shouldConvertStructsToObjects: true }; const decodedArgs = dataType.decode(nullEncodedArgs, decodingRules); expect(decodedArgs).to.be.deep.equal(args); }); @@ -489,7 +489,7 @@ describe('ABI Encoder: EVM Data Type Encoding/Decoding', () => { field_4: '0x', }; // Decode Encoded Args and validate result - const decodingRules: AbiEncoder.DecodingRules = { shouldConvertStructsToObjects: true }; + const decodingRules = { shouldConvertStructsToObjects: true }; const decodedArgs = dataType.decode(nullEncodedArgs, decodingRules); expect(decodedArgs).to.be.deep.equal(args); }); diff --git a/packages/utils/test/abi_encoder/methods_test.ts b/packages/utils/test/abi_encoder/methods_test.ts index 4f9b2d94d1..227ff5aa44 100644 --- a/packages/utils/test/abi_encoder/methods_test.ts +++ b/packages/utils/test/abi_encoder/methods_test.ts @@ -11,14 +11,14 @@ chaiSetup.configure(); const expect = chai.expect; describe('ABI Encoder: Method Encoding / Decoding', () => { - const defaultEncodingRules: AbiEncoder.EncodingRules = { shouldOptimize: false }; // optimizer is tested separately. - const defaultDecodingRules: AbiEncoder.DecodingRules = { shouldConvertStructsToObjects: false }; + const defaultEncodingRules = { shouldOptimize: false }; // optimizer is tested separately. + const defaultDecodingRules = { shouldConvertStructsToObjects: false }; const runTest = ( encoder: AbiEncoder.Method, methodArgs: any, expectedEncoding: string, - encodingRules: AbiEncoder.EncodingRules = defaultEncodingRules, - decodingRules: AbiEncoder.DecodingRules = defaultDecodingRules, + encodingRules = defaultEncodingRules, + decodingRules = defaultDecodingRules, ) => { // Validate encoding // note - the encoder takes an array of parameters as input; diff --git a/packages/utils/test/abi_encoder/return_values_test.ts b/packages/utils/test/abi_encoder/return_values_test.ts index ccdac510dc..e36e65fbf9 100644 --- a/packages/utils/test/abi_encoder/return_values_test.ts +++ b/packages/utils/test/abi_encoder/return_values_test.ts @@ -10,6 +10,7 @@ chaiSetup.configure(); const expect = chai.expect; describe('ABI Encoder: Return Value Encoding/Decoding', () => { + const DECODE_BEYOND_CALL_DATA_ERROR = 'Tried to decode beyond the end of calldata'; const encodingRules: AbiEncoder.EncodingRules = { shouldOptimize: false }; // optimizer is tested separately. const nullEncodedReturnValue = '0x'; describe('Standard encoding/decoding', () => { @@ -173,32 +174,29 @@ describe('ABI Encoder: Return Value Encoding/Decoding', () => { // This is by design, as only a struct's contents are encoded and returned by a funciton call. expect(decodedReturnValue).to.be.deep.equal(returnValue.fillResults); }); - it('Should decode NULL as default value (single; static)', async () => { + it('Should fail to decode NULL (single; static)', async () => { // Generate Return Value const method = new AbiEncoder.Method(ReturnValueAbis.singleStaticReturnValue); - const returnValue = '0x00000000'; const encodedReturnValue = '0x'; - const decodedReturnValue = method.strictDecodeReturnValue(encodedReturnValue); + const decodeReturnValue = () => method.strictDecodeReturnValue(encodedReturnValue); // Validate decoded return value - expect(decodedReturnValue).to.be.deep.equal(returnValue); + expect(decodeReturnValue).to.throws(DECODE_BEYOND_CALL_DATA_ERROR); }); - it('Should decode NULL as default value (multiple; static)', async () => { + it('Should fail to decode NULL (multiple; static)', async () => { // Generate Return Value const method = new AbiEncoder.Method(ReturnValueAbis.multipleStaticReturnValues); - const returnValue = ['0x00000000', '0x00000000']; const encodedReturnValue = '0x'; - const decodedReturnValue = method.strictDecodeReturnValue<[string, string]>(encodedReturnValue); + const decodeReturnValue = () => method.strictDecodeReturnValue<[string, string]>(encodedReturnValue); // Validate decoded return value - expect(decodedReturnValue).to.be.deep.equal(returnValue); + expect(decodeReturnValue).to.throws(DECODE_BEYOND_CALL_DATA_ERROR); }); - it('Should decode NULL as default value (single; dynamic)', async () => { + it('Should fail to decode NULL (single; dynamic)', async () => { // Generate Return Value const method = new AbiEncoder.Method(ReturnValueAbis.singleDynamicReturnValue); - const returnValue = '0x'; const encodedReturnValue = '0x'; - const decodedReturnValue = method.strictDecodeReturnValue(encodedReturnValue); + const decodeReturnValue = () => method.strictDecodeReturnValue(encodedReturnValue); // Validate decoded return value - expect(decodedReturnValue).to.be.deep.equal(returnValue); + expect(decodeReturnValue).to.throws(DECODE_BEYOND_CALL_DATA_ERROR); }); }); });