Remove ContractDoesNotExist error and replace it with more specific errors

This commit is contained in:
Leonid Logvinov 2017-11-23 14:29:49 -06:00
parent 8c54e9a873
commit c780d04cee
No known key found for this signature in database
GPG Key ID: 0DD294BFDE8C95D4
3 changed files with 21 additions and 6 deletions

View File

@ -2,9 +2,12 @@ import BigNumber from 'bignumber.js';
import * as Web3 from 'web3'; import * as Web3 from 'web3';
export enum ZeroExError { export enum ZeroExError {
ContractDoesNotExist = 'CONTRACT_DOES_NOT_EXIST',
ExchangeContractDoesNotExist = 'EXCHANGE_CONTRACT_DOES_NOT_EXIST', ExchangeContractDoesNotExist = 'EXCHANGE_CONTRACT_DOES_NOT_EXIST',
ZRXContractDoesNotExist = 'ZRX_CONTRACT_DOES_NOT_EXIST', ZRXContractDoesNotExist = 'ZRX_CONTRACT_DOES_NOT_EXIST',
EtherTokenContractDoesNotExist = 'ETHER_TOKEN_CONTRACT_DOES_NOT_EXIST',
TokenTransferProxyContractDoesNotExist = 'TOKEN_TRANSFER_PROXY_CONTRACT_DOES_NOT_EXIST',
TokenRegistryContractDoesNotExist = 'TOKEN_REGISTRY_CONTRACT_DOES_NOT_EXIST',
TokenContractDoesNotExist = 'TOKEN_CONTRACT_DOES_NOT_EXIST',
UnhandledError = 'UNHANDLED_ERROR', UnhandledError = 'UNHANDLED_ERROR',
UserHasNoAssociatedAddress = 'USER_HAS_NO_ASSOCIATED_ADDRESSES', UserHasNoAssociatedAddress = 'USER_HAS_NO_ASSOCIATED_ADDRESSES',
InvalidSignature = 'INVALID_SIGNATURE', InvalidSignature = 'INVALID_SIGNATURE',
@ -443,7 +446,10 @@ export interface TransactionReceiptWithDecodedLogs extends TransactionReceipt {
logs: Array<LogWithDecodedArgs<DecodedLogArgs>|Web3.LogEntry>; logs: Array<LogWithDecodedArgs<DecodedLogArgs>|Web3.LogEntry>;
} }
export type ArtifactContractName = 'ZRX'|'TokenTransferProxy'|'TokenRegistry'|'Token'|'Exchange'|'EtherToken';
export interface Artifact { export interface Artifact {
contract_name: ArtifactContractName;
abi: Web3.ContractAbi; abi: Web3.ContractAbi;
networks: { networks: {
[networkId: number]: { [networkId: number]: {

View File

@ -4,7 +4,7 @@ import * as _ from 'lodash';
import * as Web3 from 'web3'; import * as Web3 from 'web3';
import {Contract} from './contract'; import {Contract} from './contract';
import {Artifact, TransactionReceipt, ZeroExError} from './types'; import {Artifact, ArtifactContractName, TransactionReceipt, ZeroExError} from './types';
interface RawLogEntry { interface RawLogEntry {
logIndex: string|null; logIndex: string|null;
@ -17,6 +17,15 @@ interface RawLogEntry {
topics: string[]; topics: string[];
} }
const CONTRACT_NAME_TO_NOT_FOUND_ERROR: {[contractName: string]: ZeroExError} = {
ZRX: ZeroExError.ZRXContractDoesNotExist,
EtherToken: ZeroExError.EtherTokenContractDoesNotExist,
Token: ZeroExError.TokenContractDoesNotExist,
TokenRegistry: ZeroExError.TokenRegistryContractDoesNotExist,
TokenTransferProxy: ZeroExError.TokenTransferProxyContractDoesNotExist,
Exchange: ZeroExError.ExchangeContractDoesNotExist,
};
export class Web3Wrapper { export class Web3Wrapper {
private web3: Web3; private web3: Web3;
private networkId: number; private networkId: number;
@ -77,7 +86,7 @@ export class Web3Wrapper {
} }
const doesContractExist = await this.doesContractExistAtAddressAsync(contractAddress); const doesContractExist = await this.doesContractExistAtAddressAsync(contractAddress);
if (!doesContractExist) { if (!doesContractExist) {
throw new Error(ZeroExError.ContractDoesNotExist); throw new Error(CONTRACT_NAME_TO_NOT_FOUND_ERROR[artifact.contract_name]);
} }
const contractInstance = this.getContractInstance<A>( const contractInstance = this.getContractInstance<A>(
artifact.abi, contractAddress, artifact.abi, contractAddress,

View File

@ -86,7 +86,7 @@ describe('TokenWrapper', () => {
const toAddress = coinbase; const toAddress = coinbase;
return expect(zeroEx.token.transferAsync( return expect(zeroEx.token.transferAsync(
nonExistentTokenAddress, fromAddress, toAddress, transferAmount, nonExistentTokenAddress, fromAddress, toAddress, transferAmount,
)).to.be.rejectedWith(ZeroExError.ContractDoesNotExist); )).to.be.rejectedWith(ZeroExError.TokenContractDoesNotExist);
}); });
}); });
describe('#transferFromAsync', () => { describe('#transferFromAsync', () => {
@ -159,7 +159,7 @@ describe('TokenWrapper', () => {
const nonExistentTokenAddress = '0x9dd402f14d67e001d8efbe6583e51bf9706aa065'; const nonExistentTokenAddress = '0x9dd402f14d67e001d8efbe6583e51bf9706aa065';
return expect(zeroEx.token.transferFromAsync( return expect(zeroEx.token.transferFromAsync(
nonExistentTokenAddress, fromAddress, toAddress, senderAddress, new BigNumber(42), nonExistentTokenAddress, fromAddress, toAddress, senderAddress, new BigNumber(42),
)).to.be.rejectedWith(ZeroExError.ContractDoesNotExist); )).to.be.rejectedWith(ZeroExError.TokenContractDoesNotExist);
}); });
}); });
describe('#getBalanceAsync', () => { describe('#getBalanceAsync', () => {
@ -175,7 +175,7 @@ describe('TokenWrapper', () => {
const nonExistentTokenAddress = '0x9dd402f14d67e001d8efbe6583e51bf9706aa065'; const nonExistentTokenAddress = '0x9dd402f14d67e001d8efbe6583e51bf9706aa065';
const ownerAddress = coinbase; const ownerAddress = coinbase;
return expect(zeroEx.token.getBalanceAsync(nonExistentTokenAddress, ownerAddress)) return expect(zeroEx.token.getBalanceAsync(nonExistentTokenAddress, ownerAddress))
.to.be.rejectedWith(ZeroExError.ContractDoesNotExist); .to.be.rejectedWith(ZeroExError.TokenContractDoesNotExist);
}); });
it('should return a balance of 0 for a non-existent owner address', async () => { it('should return a balance of 0 for a non-existent owner address', async () => {
const token = tokens[0]; const token = tokens[0];