Fix geth tests

This commit is contained in:
Amir Bandeali 2018-08-29 15:35:09 -07:00
parent bf3ab1127d
commit d80701c277
8 changed files with 83 additions and 47 deletions

View File

@ -68,7 +68,10 @@ contract AssetProxyOwner is
{ {
for (uint256 i = 0; i < _assetProxyContracts.length; i++) { for (uint256 i = 0; i < _assetProxyContracts.length; i++) {
address assetProxy = _assetProxyContracts[i]; address assetProxy = _assetProxyContracts[i];
require(assetProxy != address(0)); require(
assetProxy != address(0),
"INVALID_ASSET_PROXY"
);
isAssetProxyRegistered[assetProxy] = true; isAssetProxyRegistered[assetProxy] = true;
} }
} }

View File

@ -14,7 +14,7 @@ import { ValidatorContract } from '../../generated_contract_wrappers/validator';
import { WalletContract } from '../../generated_contract_wrappers/wallet'; import { WalletContract } from '../../generated_contract_wrappers/wallet';
import { addressUtils } from '../utils/address_utils'; import { addressUtils } from '../utils/address_utils';
import { artifacts } from '../utils/artifacts'; import { artifacts } from '../utils/artifacts';
import { expectContractCallFailed, expectContractCallFailedWithoutReasonAsync } from '../utils/assertions'; import { expectContractCallFailedAsync, expectContractCallFailedWithoutReasonAsync } from '../utils/assertions';
import { chaiSetup } from '../utils/chai_setup'; import { chaiSetup } from '../utils/chai_setup';
import { constants } from '../utils/constants'; import { constants } from '../utils/constants';
import { LogDecoder } from '../utils/log_decoder'; import { LogDecoder } from '../utils/log_decoder';
@ -119,7 +119,7 @@ describe('MixinSignatureValidator', () => {
it('should revert when signature is empty', async () => { it('should revert when signature is empty', async () => {
const emptySignature = '0x'; const emptySignature = '0x';
const orderHashHex = orderHashUtils.getOrderHashHex(signedOrder); const orderHashHex = orderHashUtils.getOrderHashHex(signedOrder);
return expectContractCallFailed( return expectContractCallFailedAsync(
signatureValidator.publicIsValidSignature.callAsync( signatureValidator.publicIsValidSignature.callAsync(
orderHashHex, orderHashHex,
signedOrder.makerAddress, signedOrder.makerAddress,
@ -133,7 +133,7 @@ describe('MixinSignatureValidator', () => {
const unsupportedSignatureType = SignatureType.NSignatureTypes; const unsupportedSignatureType = SignatureType.NSignatureTypes;
const unsupportedSignatureHex = '0x' + Buffer.from([unsupportedSignatureType]).toString('hex'); const unsupportedSignatureHex = '0x' + Buffer.from([unsupportedSignatureType]).toString('hex');
const orderHashHex = orderHashUtils.getOrderHashHex(signedOrder); const orderHashHex = orderHashUtils.getOrderHashHex(signedOrder);
return expectContractCallFailed( return expectContractCallFailedAsync(
signatureValidator.publicIsValidSignature.callAsync( signatureValidator.publicIsValidSignature.callAsync(
orderHashHex, orderHashHex,
signedOrder.makerAddress, signedOrder.makerAddress,
@ -146,7 +146,7 @@ describe('MixinSignatureValidator', () => {
it('should revert when SignatureType=Illegal', async () => { it('should revert when SignatureType=Illegal', async () => {
const unsupportedSignatureHex = '0x' + Buffer.from([SignatureType.Illegal]).toString('hex'); const unsupportedSignatureHex = '0x' + Buffer.from([SignatureType.Illegal]).toString('hex');
const orderHashHex = orderHashUtils.getOrderHashHex(signedOrder); const orderHashHex = orderHashUtils.getOrderHashHex(signedOrder);
return expectContractCallFailed( return expectContractCallFailedAsync(
signatureValidator.publicIsValidSignature.callAsync( signatureValidator.publicIsValidSignature.callAsync(
orderHashHex, orderHashHex,
signedOrder.makerAddress, signedOrder.makerAddress,
@ -173,7 +173,7 @@ describe('MixinSignatureValidator', () => {
const signatureBuffer = Buffer.concat([fillerData, signatureType]); const signatureBuffer = Buffer.concat([fillerData, signatureType]);
const signatureHex = ethUtil.bufferToHex(signatureBuffer); const signatureHex = ethUtil.bufferToHex(signatureBuffer);
const orderHashHex = orderHashUtils.getOrderHashHex(signedOrder); const orderHashHex = orderHashUtils.getOrderHashHex(signedOrder);
return expectContractCallFailed( return expectContractCallFailedAsync(
signatureValidator.publicIsValidSignature.callAsync( signatureValidator.publicIsValidSignature.callAsync(
orderHashHex, orderHashHex,
signedOrder.makerAddress, signedOrder.makerAddress,
@ -339,7 +339,7 @@ describe('MixinSignatureValidator', () => {
ethUtil.toBuffer(`0x${SignatureType.Wallet}`), ethUtil.toBuffer(`0x${SignatureType.Wallet}`),
]); ]);
const signatureHex = ethUtil.bufferToHex(signature); const signatureHex = ethUtil.bufferToHex(signature);
await expectContractCallFailed( await expectContractCallFailedAsync(
signatureValidator.publicIsValidSignature.callAsync( signatureValidator.publicIsValidSignature.callAsync(
orderHashHex, orderHashHex,
maliciousWallet.address, maliciousWallet.address,
@ -385,7 +385,7 @@ describe('MixinSignatureValidator', () => {
const signature = Buffer.concat([validatorAddress, signatureType]); const signature = Buffer.concat([validatorAddress, signatureType]);
const signatureHex = ethUtil.bufferToHex(signature); const signatureHex = ethUtil.bufferToHex(signature);
const orderHashHex = orderHashUtils.getOrderHashHex(signedOrder); const orderHashHex = orderHashUtils.getOrderHashHex(signedOrder);
await expectContractCallFailed( await expectContractCallFailedAsync(
signatureValidator.publicIsValidSignature.callAsync(orderHashHex, signerAddress, signatureHex), signatureValidator.publicIsValidSignature.callAsync(orderHashHex, signerAddress, signatureHex),
RevertReason.ValidatorError, RevertReason.ValidatorError,
); );

View File

@ -9,7 +9,7 @@ import * as _ from 'lodash';
import { TestLibBytesContract } from '../../generated_contract_wrappers/test_lib_bytes'; import { TestLibBytesContract } from '../../generated_contract_wrappers/test_lib_bytes';
import { artifacts } from '../utils/artifacts'; import { artifacts } from '../utils/artifacts';
import { expectContractCallFailed } from '../utils/assertions'; import { expectContractCallFailedAsync } from '../utils/assertions';
import { chaiSetup } from '../utils/chai_setup'; import { chaiSetup } from '../utils/chai_setup';
import { constants } from '../utils/constants'; import { constants } from '../utils/constants';
import { typeEncodingUtils } from '../utils/type_encoding_utils'; import { typeEncodingUtils } from '../utils/type_encoding_utils';
@ -103,7 +103,7 @@ describe('LibBytes', () => {
describe('popLastByte', () => { describe('popLastByte', () => {
it('should revert if length is 0', async () => { it('should revert if length is 0', async () => {
return expectContractCallFailed( return expectContractCallFailedAsync(
libBytes.publicPopLastByte.callAsync(constants.NULL_BYTES), libBytes.publicPopLastByte.callAsync(constants.NULL_BYTES),
RevertReason.LibBytesGreaterThanZeroLengthRequired, RevertReason.LibBytesGreaterThanZeroLengthRequired,
); );
@ -125,7 +125,7 @@ describe('LibBytes', () => {
describe('popLast20Bytes', () => { describe('popLast20Bytes', () => {
it('should revert if length is less than 20', async () => { it('should revert if length is less than 20', async () => {
return expectContractCallFailed( return expectContractCallFailedAsync(
libBytes.publicPopLast20Bytes.callAsync(byteArrayShorterThan20Bytes), libBytes.publicPopLast20Bytes.callAsync(byteArrayShorterThan20Bytes),
RevertReason.LibBytesGreaterOrEqualTo20LengthRequired, RevertReason.LibBytesGreaterOrEqualTo20LengthRequired,
); );
@ -200,7 +200,7 @@ describe('LibBytes', () => {
describe('deepCopyBytes', () => { describe('deepCopyBytes', () => {
it('should revert if dest is shorter than source', async () => { it('should revert if dest is shorter than source', async () => {
return expectContractCallFailed( return expectContractCallFailedAsync(
libBytes.publicDeepCopyBytes.callAsync(byteArrayShorterThan32Bytes, byteArrayLongerThan32Bytes), libBytes.publicDeepCopyBytes.callAsync(byteArrayShorterThan32Bytes, byteArrayLongerThan32Bytes),
RevertReason.LibBytesGreaterOrEqualToSourceBytesLengthRequired, RevertReason.LibBytesGreaterOrEqualToSourceBytesLengthRequired,
); );
@ -253,7 +253,7 @@ describe('LibBytes', () => {
it('should fail if the byte array is too short to hold an address', async () => { it('should fail if the byte array is too short to hold an address', async () => {
const shortByteArray = '0xabcdef'; const shortByteArray = '0xabcdef';
const offset = new BigNumber(0); const offset = new BigNumber(0);
return expectContractCallFailed( return expectContractCallFailedAsync(
libBytes.publicReadAddress.callAsync(shortByteArray, offset), libBytes.publicReadAddress.callAsync(shortByteArray, offset),
RevertReason.LibBytesGreaterOrEqualTo20LengthRequired, RevertReason.LibBytesGreaterOrEqualTo20LengthRequired,
); );
@ -261,7 +261,7 @@ describe('LibBytes', () => {
it('should fail if the length between the offset and end of the byte array is too short to hold an address', async () => { it('should fail if the length between the offset and end of the byte array is too short to hold an address', async () => {
const byteArray = testAddress; const byteArray = testAddress;
const badOffset = new BigNumber(ethUtil.toBuffer(byteArray).byteLength); const badOffset = new BigNumber(ethUtil.toBuffer(byteArray).byteLength);
return expectContractCallFailed( return expectContractCallFailedAsync(
libBytes.publicReadAddress.callAsync(byteArray, badOffset), libBytes.publicReadAddress.callAsync(byteArray, badOffset),
RevertReason.LibBytesGreaterOrEqualTo20LengthRequired, RevertReason.LibBytesGreaterOrEqualTo20LengthRequired,
); );
@ -297,7 +297,7 @@ describe('LibBytes', () => {
}); });
it('should fail if the byte array is too short to hold an address', async () => { it('should fail if the byte array is too short to hold an address', async () => {
const offset = new BigNumber(0); const offset = new BigNumber(0);
return expectContractCallFailed( return expectContractCallFailedAsync(
libBytes.publicWriteAddress.callAsync(byteArrayShorterThan20Bytes, offset, testAddress), libBytes.publicWriteAddress.callAsync(byteArrayShorterThan20Bytes, offset, testAddress),
RevertReason.LibBytesGreaterOrEqualTo20LengthRequired, RevertReason.LibBytesGreaterOrEqualTo20LengthRequired,
); );
@ -305,7 +305,7 @@ describe('LibBytes', () => {
it('should fail if the length between the offset and end of the byte array is too short to hold an address', async () => { it('should fail if the length between the offset and end of the byte array is too short to hold an address', async () => {
const byteArray = byteArrayLongerThan32Bytes; const byteArray = byteArrayLongerThan32Bytes;
const badOffset = new BigNumber(ethUtil.toBuffer(byteArray).byteLength); const badOffset = new BigNumber(ethUtil.toBuffer(byteArray).byteLength);
return expectContractCallFailed( return expectContractCallFailedAsync(
libBytes.publicWriteAddress.callAsync(byteArray, badOffset, testAddress), libBytes.publicWriteAddress.callAsync(byteArray, badOffset, testAddress),
RevertReason.LibBytesGreaterOrEqualTo20LengthRequired, RevertReason.LibBytesGreaterOrEqualTo20LengthRequired,
); );
@ -329,14 +329,14 @@ describe('LibBytes', () => {
}); });
it('should fail if the byte array is too short to hold a bytes32', async () => { it('should fail if the byte array is too short to hold a bytes32', async () => {
const offset = new BigNumber(0); const offset = new BigNumber(0);
return expectContractCallFailed( return expectContractCallFailedAsync(
libBytes.publicReadBytes32.callAsync(byteArrayShorterThan32Bytes, offset), libBytes.publicReadBytes32.callAsync(byteArrayShorterThan32Bytes, offset),
RevertReason.LibBytesGreaterOrEqualTo32LengthRequired, RevertReason.LibBytesGreaterOrEqualTo32LengthRequired,
); );
}); });
it('should fail if the length between the offset and end of the byte array is too short to hold a bytes32', async () => { it('should fail if the length between the offset and end of the byte array is too short to hold a bytes32', async () => {
const badOffset = new BigNumber(ethUtil.toBuffer(testBytes32).byteLength); const badOffset = new BigNumber(ethUtil.toBuffer(testBytes32).byteLength);
return expectContractCallFailed( return expectContractCallFailedAsync(
libBytes.publicReadBytes32.callAsync(testBytes32, badOffset), libBytes.publicReadBytes32.callAsync(testBytes32, badOffset),
RevertReason.LibBytesGreaterOrEqualTo32LengthRequired, RevertReason.LibBytesGreaterOrEqualTo32LengthRequired,
); );
@ -372,7 +372,7 @@ describe('LibBytes', () => {
}); });
it('should fail if the byte array is too short to hold a bytes32', async () => { it('should fail if the byte array is too short to hold a bytes32', async () => {
const offset = new BigNumber(0); const offset = new BigNumber(0);
return expectContractCallFailed( return expectContractCallFailedAsync(
libBytes.publicWriteBytes32.callAsync(byteArrayShorterThan32Bytes, offset, testBytes32), libBytes.publicWriteBytes32.callAsync(byteArrayShorterThan32Bytes, offset, testBytes32),
RevertReason.LibBytesGreaterOrEqualTo32LengthRequired, RevertReason.LibBytesGreaterOrEqualTo32LengthRequired,
); );
@ -380,7 +380,7 @@ describe('LibBytes', () => {
it('should fail if the length between the offset and end of the byte array is too short to hold a bytes32', async () => { it('should fail if the length between the offset and end of the byte array is too short to hold a bytes32', async () => {
const byteArray = byteArrayLongerThan32Bytes; const byteArray = byteArrayLongerThan32Bytes;
const badOffset = new BigNumber(ethUtil.toBuffer(byteArray).byteLength); const badOffset = new BigNumber(ethUtil.toBuffer(byteArray).byteLength);
return expectContractCallFailed( return expectContractCallFailedAsync(
libBytes.publicWriteBytes32.callAsync(byteArray, badOffset, testBytes32), libBytes.publicWriteBytes32.callAsync(byteArray, badOffset, testBytes32),
RevertReason.LibBytesGreaterOrEqualTo32LengthRequired, RevertReason.LibBytesGreaterOrEqualTo32LengthRequired,
); );
@ -408,7 +408,7 @@ describe('LibBytes', () => {
}); });
it('should fail if the byte array is too short to hold a uint256', async () => { it('should fail if the byte array is too short to hold a uint256', async () => {
const offset = new BigNumber(0); const offset = new BigNumber(0);
return expectContractCallFailed( return expectContractCallFailedAsync(
libBytes.publicReadUint256.callAsync(byteArrayShorterThan32Bytes, offset), libBytes.publicReadUint256.callAsync(byteArrayShorterThan32Bytes, offset),
RevertReason.LibBytesGreaterOrEqualTo32LengthRequired, RevertReason.LibBytesGreaterOrEqualTo32LengthRequired,
); );
@ -418,7 +418,7 @@ describe('LibBytes', () => {
const testUint256AsBuffer = ethUtil.toBuffer(formattedTestUint256); const testUint256AsBuffer = ethUtil.toBuffer(formattedTestUint256);
const byteArray = ethUtil.bufferToHex(testUint256AsBuffer); const byteArray = ethUtil.bufferToHex(testUint256AsBuffer);
const badOffset = new BigNumber(testUint256AsBuffer.byteLength); const badOffset = new BigNumber(testUint256AsBuffer.byteLength);
return expectContractCallFailed( return expectContractCallFailedAsync(
libBytes.publicReadUint256.callAsync(byteArray, badOffset), libBytes.publicReadUint256.callAsync(byteArray, badOffset),
RevertReason.LibBytesGreaterOrEqualTo32LengthRequired, RevertReason.LibBytesGreaterOrEqualTo32LengthRequired,
); );
@ -458,7 +458,7 @@ describe('LibBytes', () => {
}); });
it('should fail if the byte array is too short to hold a uint256', async () => { it('should fail if the byte array is too short to hold a uint256', async () => {
const offset = new BigNumber(0); const offset = new BigNumber(0);
return expectContractCallFailed( return expectContractCallFailedAsync(
libBytes.publicWriteUint256.callAsync(byteArrayShorterThan32Bytes, offset, testUint256), libBytes.publicWriteUint256.callAsync(byteArrayShorterThan32Bytes, offset, testUint256),
RevertReason.LibBytesGreaterOrEqualTo32LengthRequired, RevertReason.LibBytesGreaterOrEqualTo32LengthRequired,
); );
@ -466,7 +466,7 @@ describe('LibBytes', () => {
it('should fail if the length between the offset and end of the byte array is too short to hold a uint256', async () => { it('should fail if the length between the offset and end of the byte array is too short to hold a uint256', async () => {
const byteArray = byteArrayLongerThan32Bytes; const byteArray = byteArrayLongerThan32Bytes;
const badOffset = new BigNumber(ethUtil.toBuffer(byteArray).byteLength); const badOffset = new BigNumber(ethUtil.toBuffer(byteArray).byteLength);
return expectContractCallFailed( return expectContractCallFailedAsync(
libBytes.publicWriteUint256.callAsync(byteArray, badOffset, testUint256), libBytes.publicWriteUint256.callAsync(byteArray, badOffset, testUint256),
RevertReason.LibBytesGreaterOrEqualTo32LengthRequired, RevertReason.LibBytesGreaterOrEqualTo32LengthRequired,
); );
@ -478,7 +478,7 @@ describe('LibBytes', () => {
it('should revert if byte array has a length < 4', async () => { it('should revert if byte array has a length < 4', async () => {
const byteArrayLessThan4Bytes = '0x010101'; const byteArrayLessThan4Bytes = '0x010101';
const offset = new BigNumber(0); const offset = new BigNumber(0);
return expectContractCallFailed( return expectContractCallFailedAsync(
libBytes.publicReadBytes4.callAsync(byteArrayLessThan4Bytes, offset), libBytes.publicReadBytes4.callAsync(byteArrayLessThan4Bytes, offset),
RevertReason.LibBytesGreaterOrEqualTo4LengthRequired, RevertReason.LibBytesGreaterOrEqualTo4LengthRequired,
); );
@ -504,7 +504,7 @@ describe('LibBytes', () => {
}); });
it('should fail if the length between the offset and end of the byte array is too short to hold a bytes4', async () => { it('should fail if the length between the offset and end of the byte array is too short to hold a bytes4', async () => {
const badOffset = new BigNumber(ethUtil.toBuffer(testBytes4).byteLength); const badOffset = new BigNumber(ethUtil.toBuffer(testBytes4).byteLength);
return expectContractCallFailed( return expectContractCallFailedAsync(
libBytes.publicReadBytes4.callAsync(testBytes4, badOffset), libBytes.publicReadBytes4.callAsync(testBytes4, badOffset),
RevertReason.LibBytesGreaterOrEqualTo4LengthRequired, RevertReason.LibBytesGreaterOrEqualTo4LengthRequired,
); );
@ -554,28 +554,28 @@ describe('LibBytes', () => {
it('should fail if the byte array is too short to hold the length of a nested byte array', async () => { it('should fail if the byte array is too short to hold the length of a nested byte array', async () => {
// The length of the nested array is 32 bytes. By storing less than 32 bytes, a length cannot be read. // The length of the nested array is 32 bytes. By storing less than 32 bytes, a length cannot be read.
const offset = new BigNumber(0); const offset = new BigNumber(0);
return expectContractCallFailed( return expectContractCallFailedAsync(
libBytes.publicReadBytesWithLength.callAsync(byteArrayShorterThan32Bytes, offset), libBytes.publicReadBytesWithLength.callAsync(byteArrayShorterThan32Bytes, offset),
RevertReason.LibBytesGreaterOrEqualTo32LengthRequired, RevertReason.LibBytesGreaterOrEqualTo32LengthRequired,
); );
}); });
it('should fail if we store a nested byte array length, without a nested byte array', async () => { it('should fail if we store a nested byte array length, without a nested byte array', async () => {
const offset = new BigNumber(0); const offset = new BigNumber(0);
return expectContractCallFailed( return expectContractCallFailedAsync(
libBytes.publicReadBytesWithLength.callAsync(testBytes32, offset), libBytes.publicReadBytesWithLength.callAsync(testBytes32, offset),
RevertReason.LibBytesGreaterOrEqualToNestedBytesLengthRequired, RevertReason.LibBytesGreaterOrEqualToNestedBytesLengthRequired,
); );
}); });
it('should fail if the length between the offset and end of the byte array is too short to hold the length of a nested byte array', async () => { it('should fail if the length between the offset and end of the byte array is too short to hold the length of a nested byte array', async () => {
const badOffset = new BigNumber(ethUtil.toBuffer(byteArrayShorterThan32Bytes).byteLength); const badOffset = new BigNumber(ethUtil.toBuffer(byteArrayShorterThan32Bytes).byteLength);
return expectContractCallFailed( return expectContractCallFailedAsync(
libBytes.publicReadBytesWithLength.callAsync(byteArrayShorterThan32Bytes, badOffset), libBytes.publicReadBytesWithLength.callAsync(byteArrayShorterThan32Bytes, badOffset),
RevertReason.LibBytesGreaterOrEqualTo32LengthRequired, RevertReason.LibBytesGreaterOrEqualTo32LengthRequired,
); );
}); });
it('should fail if the length between the offset and end of the byte array is too short to hold the nested byte array', async () => { it('should fail if the length between the offset and end of the byte array is too short to hold the nested byte array', async () => {
const badOffset = new BigNumber(ethUtil.toBuffer(testBytes32).byteLength); const badOffset = new BigNumber(ethUtil.toBuffer(testBytes32).byteLength);
return expectContractCallFailed( return expectContractCallFailedAsync(
libBytes.publicReadBytesWithLength.callAsync(testBytes32, badOffset), libBytes.publicReadBytesWithLength.callAsync(testBytes32, badOffset),
RevertReason.LibBytesGreaterOrEqualTo32LengthRequired, RevertReason.LibBytesGreaterOrEqualTo32LengthRequired,
); );
@ -687,7 +687,7 @@ describe('LibBytes', () => {
it('should fail if the byte array is too short to hold the length of a nested byte array', async () => { it('should fail if the byte array is too short to hold the length of a nested byte array', async () => {
const offset = new BigNumber(0); const offset = new BigNumber(0);
const emptyByteArray = ethUtil.bufferToHex(new Buffer(1)); const emptyByteArray = ethUtil.bufferToHex(new Buffer(1));
return expectContractCallFailed( return expectContractCallFailedAsync(
libBytes.publicWriteBytesWithLength.callAsync(emptyByteArray, offset, longData), libBytes.publicWriteBytesWithLength.callAsync(emptyByteArray, offset, longData),
RevertReason.LibBytesGreaterOrEqualToNestedBytesLengthRequired, RevertReason.LibBytesGreaterOrEqualToNestedBytesLengthRequired,
); );
@ -695,7 +695,7 @@ describe('LibBytes', () => {
it('should fail if the length between the offset and end of the byte array is too short to hold the length of a nested byte array', async () => { it('should fail if the length between the offset and end of the byte array is too short to hold the length of a nested byte array', async () => {
const emptyByteArray = ethUtil.bufferToHex(new Buffer(shortTestBytesAsBuffer.byteLength)); const emptyByteArray = ethUtil.bufferToHex(new Buffer(shortTestBytesAsBuffer.byteLength));
const badOffset = new BigNumber(ethUtil.toBuffer(shortTestBytesAsBuffer).byteLength); const badOffset = new BigNumber(ethUtil.toBuffer(shortTestBytesAsBuffer).byteLength);
return expectContractCallFailed( return expectContractCallFailedAsync(
libBytes.publicWriteBytesWithLength.callAsync(emptyByteArray, badOffset, shortData), libBytes.publicWriteBytesWithLength.callAsync(emptyByteArray, badOffset, shortData),
RevertReason.LibBytesGreaterOrEqualToNestedBytesLengthRequired, RevertReason.LibBytesGreaterOrEqualToNestedBytesLengthRequired,
); );

View File

@ -1,4 +1,5 @@
import { BlockchainLifecycle } from '@0xproject/dev-utils'; import { BlockchainLifecycle } from '@0xproject/dev-utils';
import { RevertReason } from '@0xproject/types';
import { BigNumber } from '@0xproject/utils'; import { BigNumber } from '@0xproject/utils';
import * as chai from 'chai'; import * as chai from 'chai';
import { LogWithDecodedArgs } from 'ethereum-types'; import { LogWithDecodedArgs } from 'ethereum-types';
@ -14,9 +15,11 @@ import { MixinAuthorizableContract } from '../../generated_contract_wrappers/mix
import { TestAssetProxyOwnerContract } from '../../generated_contract_wrappers/test_asset_proxy_owner'; import { TestAssetProxyOwnerContract } from '../../generated_contract_wrappers/test_asset_proxy_owner';
import { artifacts } from '../utils/artifacts'; import { artifacts } from '../utils/artifacts';
import { import {
expectContractCallFailedWithoutReasonAsync, expectContractCallFailedAsync,
expectContractCreationFailedWithoutReason, expectContractCreationFailedAsync,
expectTransactionFailedAsync,
expectTransactionFailedWithoutReasonAsync, expectTransactionFailedWithoutReasonAsync,
sendTransactionResult,
} from '../utils/assertions'; } from '../utils/assertions';
import { increaseTimeAndMineBlockAsync } from '../utils/block_timestamp'; import { increaseTimeAndMineBlockAsync } from '../utils/block_timestamp';
import { chaiSetup } from '../utils/chai_setup'; import { chaiSetup } from '../utils/chai_setup';
@ -109,8 +112,8 @@ describe('AssetProxyOwner', () => {
}); });
it('should throw if a null address is included in assetProxyContracts', async () => { it('should throw if a null address is included in assetProxyContracts', async () => {
const assetProxyContractAddresses = [erc20Proxy.address, constants.NULL_ADDRESS]; const assetProxyContractAddresses = [erc20Proxy.address, constants.NULL_ADDRESS];
return expectContractCreationFailedWithoutReason( return expectContractCreationFailedAsync(
AssetProxyOwnerContract.deployFrom0xArtifactAsync( (AssetProxyOwnerContract.deployFrom0xArtifactAsync(
artifacts.AssetProxyOwner, artifacts.AssetProxyOwner,
provider, provider,
txDefaults, txDefaults,
@ -118,7 +121,8 @@ describe('AssetProxyOwner', () => {
assetProxyContractAddresses, assetProxyContractAddresses,
REQUIRED_APPROVALS, REQUIRED_APPROVALS,
SECONDS_TIME_LOCKED, SECONDS_TIME_LOCKED,
), ) as any) as sendTransactionResult,
RevertReason.InvalidAssetProxy,
); );
}); });
}); });
@ -281,8 +285,9 @@ describe('AssetProxyOwner', () => {
); );
const log = submitTxRes.logs[0] as LogWithDecodedArgs<AssetProxyOwnerSubmissionEventArgs>; const log = submitTxRes.logs[0] as LogWithDecodedArgs<AssetProxyOwnerSubmissionEventArgs>;
const txId = log.args.transactionId; const txId = log.args.transactionId;
return expectContractCallFailedWithoutReasonAsync( return expectContractCallFailedAsync(
testAssetProxyOwner.testValidRemoveAuthorizedAddressAtIndexTx.callAsync(txId), testAssetProxyOwner.testValidRemoveAuthorizedAddressAtIndexTx.callAsync(txId),
RevertReason.InvalidFunctionSelector,
); );
}); });
@ -316,8 +321,9 @@ describe('AssetProxyOwner', () => {
); );
const log = submitTxRes.logs[0] as LogWithDecodedArgs<AssetProxyOwnerSubmissionEventArgs>; const log = submitTxRes.logs[0] as LogWithDecodedArgs<AssetProxyOwnerSubmissionEventArgs>;
const txId = log.args.transactionId; const txId = log.args.transactionId;
return expectContractCallFailedWithoutReasonAsync( return expectContractCallFailedAsync(
testAssetProxyOwner.testValidRemoveAuthorizedAddressAtIndexTx.callAsync(txId), testAssetProxyOwner.testValidRemoveAuthorizedAddressAtIndexTx.callAsync(txId),
RevertReason.UnregisteredAssetProxy,
); );
}); });
}); });
@ -358,10 +364,11 @@ describe('AssetProxyOwner', () => {
await multiSigWrapper.confirmTransactionAsync(txId, owners[1]); await multiSigWrapper.confirmTransactionAsync(txId, owners[1]);
return expectTransactionFailedWithoutReasonAsync( return expectTransactionFailedAsync(
testAssetProxyOwner.executeRemoveAuthorizedAddressAtIndex.sendTransactionAsync(txId, { testAssetProxyOwner.executeRemoveAuthorizedAddressAtIndex.sendTransactionAsync(txId, {
from: owners[1], from: owners[1],
}), }),
RevertReason.UnregisteredAssetProxy,
); );
}); });
@ -380,10 +387,11 @@ describe('AssetProxyOwner', () => {
await multiSigWrapper.confirmTransactionAsync(txId, owners[1]); await multiSigWrapper.confirmTransactionAsync(txId, owners[1]);
return expectTransactionFailedWithoutReasonAsync( return expectTransactionFailedAsync(
testAssetProxyOwner.executeRemoveAuthorizedAddressAtIndex.sendTransactionAsync(txId, { testAssetProxyOwner.executeRemoveAuthorizedAddressAtIndex.sendTransactionAsync(txId, {
from: owners[1], from: owners[1],
}), }),
RevertReason.InvalidFunctionSelector,
); );
}); });

View File

@ -5,7 +5,7 @@ import * as chai from 'chai';
import { DummyERC20TokenContract } from '../../generated_contract_wrappers/dummy_erc20_token'; import { DummyERC20TokenContract } from '../../generated_contract_wrappers/dummy_erc20_token';
import { artifacts } from '../utils/artifacts'; import { artifacts } from '../utils/artifacts';
import { expectContractCallFailed } from '../utils/assertions'; import { expectContractCallFailedAsync } from '../utils/assertions';
import { chaiSetup } from '../utils/chai_setup'; import { chaiSetup } from '../utils/chai_setup';
import { constants } from '../utils/constants'; import { constants } from '../utils/constants';
import { provider, txDefaults, web3Wrapper } from '../utils/web3_wrapper'; import { provider, txDefaults, web3Wrapper } from '../utils/web3_wrapper';
@ -54,7 +54,7 @@ describe('UnlimitedAllowanceToken', () => {
it('should throw if owner has insufficient balance', async () => { it('should throw if owner has insufficient balance', async () => {
const ownerBalance = await token.balanceOf.callAsync(owner); const ownerBalance = await token.balanceOf.callAsync(owner);
const amountToTransfer = ownerBalance.plus(1); const amountToTransfer = ownerBalance.plus(1);
return expectContractCallFailed( return expectContractCallFailedAsync(
token.transfer.callAsync(spender, amountToTransfer, { from: owner }), token.transfer.callAsync(spender, amountToTransfer, { from: owner }),
RevertReason.Erc20InsufficientBalance, RevertReason.Erc20InsufficientBalance,
); );
@ -93,7 +93,7 @@ describe('UnlimitedAllowanceToken', () => {
await token.approve.sendTransactionAsync(spender, amountToTransfer, { from: owner }), await token.approve.sendTransactionAsync(spender, amountToTransfer, { from: owner }),
constants.AWAIT_TRANSACTION_MINED_MS, constants.AWAIT_TRANSACTION_MINED_MS,
); );
return expectContractCallFailed( return expectContractCallFailedAsync(
token.transferFrom.callAsync(owner, spender, amountToTransfer, { token.transferFrom.callAsync(owner, spender, amountToTransfer, {
from: spender, from: spender,
}), }),
@ -109,7 +109,7 @@ describe('UnlimitedAllowanceToken', () => {
const isSpenderAllowanceInsufficient = spenderAllowance.cmp(amountToTransfer) < 0; const isSpenderAllowanceInsufficient = spenderAllowance.cmp(amountToTransfer) < 0;
expect(isSpenderAllowanceInsufficient).to.be.true(); expect(isSpenderAllowanceInsufficient).to.be.true();
return expectContractCallFailed( return expectContractCallFailedAsync(
token.transferFrom.callAsync(owner, spender, amountToTransfer, { token.transferFrom.callAsync(owner, spender, amountToTransfer, {
from: spender, from: spender,
}), }),

View File

@ -159,7 +159,7 @@ export async function expectTransactionFailedWithoutReasonAsync(p: sendTransacti
* @returns a new Promise which will reject if the conditions are not met and * @returns a new Promise which will reject if the conditions are not met and
* otherwise resolve with no value. * otherwise resolve with no value.
*/ */
export async function expectContractCallFailed<T>(p: Promise<T>, reason: RevertReason): Promise<void> { export async function expectContractCallFailedAsync<T>(p: Promise<T>, reason: RevertReason): Promise<void> {
return expect(p).to.be.rejectedWith(reason); return expect(p).to.be.rejectedWith(reason);
} }
@ -180,7 +180,20 @@ export async function expectContractCallFailedWithoutReasonAsync<T>(p: Promise<T
* @returns a new Promise which will reject if the conditions are not met and * @returns a new Promise which will reject if the conditions are not met and
* otherwise resolve with no value. * otherwise resolve with no value.
*/ */
export async function expectContractCreationFailedWithoutReason<T>(p: Promise<T>): Promise<void> { export async function expectContractCreationFailedAsync<T>(
p: sendTransactionResult,
reason: RevertReason,
): Promise<void> {
return expectTransactionFailedAsync(p, reason);
}
/**
* Resolves if the contract creation/deployment fails without a revert reason.
* @param p a Promise resulting from a contract creation/deployment
* @returns a new Promise which will reject if the conditions are not met and
* otherwise resolve with no value.
*/
export async function expectContractCreationFailedWithoutReasonAsync<T>(p: Promise<T>): Promise<void> {
const errMessage = await _getTransactionFailedErrorMessageAsync(); const errMessage = await _getTransactionFailedErrorMessageAsync();
return expect(p).to.be.rejectedWith(errMessage); return expect(p).to.be.rejectedWith(errMessage);
} }

View File

@ -1,4 +1,13 @@
[ [
{
"version": "1.0.1-rc.7",
"changes": [
{
"note": "Add AssetProxyOwner revert reasons",
"pr": 1041
}
]
},
{ {
"version": "1.0.1-rc.6", "version": "1.0.1-rc.6",
"changes": [ "changes": [

View File

@ -224,6 +224,9 @@ export enum RevertReason {
Erc721InvalidSelector = 'ERC721_INVALID_SELECTOR', Erc721InvalidSelector = 'ERC721_INVALID_SELECTOR',
WalletError = 'WALLET_ERROR', WalletError = 'WALLET_ERROR',
ValidatorError = 'VALIDATOR_ERROR', ValidatorError = 'VALIDATOR_ERROR',
InvalidFunctionSelector = 'INVALID_FUNCTION_SELECTOR',
InvalidAssetProxy = 'INVALID_ASSET_PROXY',
UnregisteredAssetProxy = 'UNREGISTERED_ASSET_PROXY',
} }
export enum StatusCodes { export enum StatusCodes {