Updated deployer to accept a list of contract directories as input. Contract directories are namespaced to a void clashes. Also in this commit is a fix for overloading contract functions.

This commit is contained in:
Greg Hysen
2018-04-03 17:39:55 -07:00
parent 073bf738dd
commit 61fc3346c2
27 changed files with 620 additions and 133 deletions

View File

@@ -1,13 +1,26 @@
import { ContractAbi, DataItem, Provider, TxData, TxDataPayable } from '@0xproject/types';
import { BigNumber } from '@0xproject/utils';
import {
AbiDefinition,
AbiType,
ContractAbi,
DataItem,
MethodAbi,
Provider,
TxData,
TxDataPayable,
} from '@0xproject/types';
import { abiUtils, BigNumber } from '@0xproject/utils';
import { Web3Wrapper } from '@0xproject/web3-wrapper';
import * as ethersContracts from 'ethers-contracts';
import * as _ from 'lodash';
import { formatABIDataItem } from './utils';
export interface EthersInterfaceByFunctionSignature {
[key: string]: ethersContracts.Interface;
}
export class BaseContract {
protected _ethersInterface: ethersContracts.Interface;
protected _ethersInterfacesByFunctionSignature: EthersInterfaceByFunctionSignature;
protected _web3Wrapper: Web3Wrapper;
public abi: ContractAbi;
public address: string;
@@ -49,10 +62,40 @@ export class BaseContract {
}
return txDataWithDefaults;
}
protected _lookupEthersInterface(functionSignature: string): ethersContracts.Interface {
const ethersInterface = this._ethersInterfacesByFunctionSignature[functionSignature];
if (_.isUndefined(ethersInterface)) {
throw new Error(`Failed to lookup method with function signature '${functionSignature}'`);
}
return ethersInterface;
}
protected _lookupAbi(functionSignature: string): MethodAbi {
const methodAbi = _.find(this.abi, (abiDefinition: AbiDefinition) => {
if (abiDefinition.type !== AbiType.Function) {
return false;
}
const abiFunctionSignature = abiUtils.getFunctionSignature(abiDefinition);
if (abiFunctionSignature === functionSignature) {
return true;
}
return false;
}) as MethodAbi;
return methodAbi;
}
constructor(abi: ContractAbi, address: string, provider: Provider, defaults?: Partial<TxData>) {
this._web3Wrapper = new Web3Wrapper(provider, defaults);
this.abi = abi;
this.address = address;
this._ethersInterface = new ethersContracts.Interface(abi);
const methodAbis = this.abi.filter(
(abiDefinition: AbiDefinition) => abiDefinition.type === AbiType.Function,
) as MethodAbi[];
this._ethersInterfacesByFunctionSignature = _.transform(
methodAbis,
(result: EthersInterfaceByFunctionSignature, methodAbi) => {
const functionSignature = abiUtils.getFunctionSignature(methodAbi);
result[functionSignature] = new ethersContracts.Interface([methodAbi]);
},
{},
);
}
}