aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAlex Browne <stephenalexbrowne@gmail.com>2018-06-05 09:10:42 +0800
committerAlex Browne <stephenalexbrowne@gmail.com>2018-06-07 03:40:30 +0800
commitbca62c813d2e821c56968916615861366402435b (patch)
tree041ea056d813b0db32520f7ca9e25e9799530c47
parentae1cf74dcd84b0a39a5781f63c1c3f2beb0e1857 (diff)
downloaddexon-sol-tools-bca62c813d2e821c56968916615861366402435b.tar
dexon-sol-tools-bca62c813d2e821c56968916615861366402435b.tar.gz
dexon-sol-tools-bca62c813d2e821c56968916615861366402435b.tar.bz2
dexon-sol-tools-bca62c813d2e821c56968916615861366402435b.tar.lz
dexon-sol-tools-bca62c813d2e821c56968916615861366402435b.tar.xz
dexon-sol-tools-bca62c813d2e821c56968916615861366402435b.tar.zst
dexon-sol-tools-bca62c813d2e821c56968916615861366402435b.zip
Throw in web3-wrapper when rawCallResult is '0x'
-rw-r--r--packages/contracts/src/utils/assertions.ts12
-rw-r--r--packages/contracts/src/utils/constants.ts1
-rw-r--r--packages/contracts/test/asset_proxy_owner.ts10
-rw-r--r--packages/web3-wrapper/src/web3_wrapper.ts3
4 files changed, 20 insertions, 6 deletions
diff --git a/packages/contracts/src/utils/assertions.ts b/packages/contracts/src/utils/assertions.ts
index 1e8d58b9f..4fc410363 100644
--- a/packages/contracts/src/utils/assertions.ts
+++ b/packages/contracts/src/utils/assertions.ts
@@ -30,3 +30,15 @@ export function expectInsufficientFunds<T>(p: Promise<T>): PromiseLike<void> {
);
});
}
+
+export function expectRevertOrContractCallFailed<T>(p: Promise<T>): PromiseLike<void> {
+ return expect(p)
+ .to.be.rejected()
+ .then(e => {
+ expect(e).to.satisfy(
+ (err: Error) =>
+ _.includes(err.message, constants.REVERT) ||
+ _.includes(err.message, constants.CONTRACT_CALL_FAILED),
+ );
+ });
+}
diff --git a/packages/contracts/src/utils/constants.ts b/packages/contracts/src/utils/constants.ts
index 60f41b51b..a21ca29ed 100644
--- a/packages/contracts/src/utils/constants.ts
+++ b/packages/contracts/src/utils/constants.ts
@@ -20,6 +20,7 @@ export const constants = {
INVALID_OPCODE: 'invalid opcode',
REVERT: 'revert',
ALWAYS_FAILING_TRANSACTION: 'always failing transaction',
+ CONTRACT_CALL_FAILED: 'Contract call failed',
LIB_BYTES_GT_ZERO_LENGTH_REQUIRED: 'Length must be greater than 0.',
LIB_BYTES_GTE_4_LENGTH_REQUIRED: 'Length must be greater than or equal to 4.',
LIB_BYTES_GTE_20_LENGTH_REQUIRED: 'Length must be greater than or equal to 20.',
diff --git a/packages/contracts/test/asset_proxy_owner.ts b/packages/contracts/test/asset_proxy_owner.ts
index c7d4e08ed..c4085cb41 100644
--- a/packages/contracts/test/asset_proxy_owner.ts
+++ b/packages/contracts/test/asset_proxy_owner.ts
@@ -15,7 +15,7 @@ import {
} from '../src/contract_wrappers/generated/asset_proxy_owner';
import { MixinAuthorizableContract } from '../src/contract_wrappers/generated/mixin_authorizable';
import { artifacts } from '../src/utils/artifacts';
-import { expectRevertOrAlwaysFailingTransaction } from '../src/utils/assertions';
+import { expectRevertOrAlwaysFailingTransaction, expectRevertOrContractCallFailed } from '../src/utils/assertions';
import { chaiSetup } from '../src/utils/chai_setup';
import { constants } from '../src/utils/constants';
import { increaseTimeAndMineBlockAsync } from '../src/utils/increase_time';
@@ -118,15 +118,13 @@ describe('AssetProxyOwner', () => {
});
describe('isFunctionRemoveAuthorizedAddress', () => {
- // TODO(albrow):
- // AssertionError: expected promise to be rejected with an error including 'revert' but got 'invalid data for function output (arg="data", errorArg=null, errorValue="0x", value="0x", reason="insufficient data for boolean type")'
- it.skip('should throw if data is not for removeAuthorizedAddress', async () => {
+ it('should throw if data is not for removeAuthorizedAddress', async () => {
const notRemoveAuthorizedAddressData = erc20Proxy.addAuthorizedAddress.getABIEncodedTransactionData(
owners[0],
);
- return expect(
+ return expectRevertOrContractCallFailed(
multiSig.isFunctionRemoveAuthorizedAddress.callAsync(notRemoveAuthorizedAddressData),
- ).to.be.rejectedWith(constants.REVERT);
+ );
});
it('should return true if data is for removeAuthorizedAddress', async () => {
diff --git a/packages/web3-wrapper/src/web3_wrapper.ts b/packages/web3-wrapper/src/web3_wrapper.ts
index ace6a2d61..ed2d0a119 100644
--- a/packages/web3-wrapper/src/web3_wrapper.ts
+++ b/packages/web3-wrapper/src/web3_wrapper.ts
@@ -315,6 +315,9 @@ export class Web3Wrapper {
*/
public async callAsync(callData: CallData, defaultBlock?: BlockParam): Promise<string> {
const rawCallResult = await promisify<string>(this._web3.eth.call)(callData, defaultBlock);
+ if (rawCallResult === '0x') {
+ throw new Error('Contract call failed (returned null)');
+ }
return rawCallResult;
}
/**