Use the same templates as 0x.js
This commit is contained in:
@@ -17,7 +17,7 @@
|
||||
"build": "run-p build:umd:prod build:commonjs; exit 0;",
|
||||
"docs:json": "typedoc --excludePrivate --excludeExternals --target ES5 --json $JSON_FILE_PATH $PROJECT_DIR",
|
||||
"upload_docs_json": "aws s3 cp generated_docs/index.json $S3_URL --profile 0xproject --grants read=uri=http://acs.amazonaws.com/groups/global/AllUsers --content-type application/json",
|
||||
"generate_contract_wrappers": "node ../abi-gen/lib/index.js --abis 'src/artifacts/@(Exchange|Token|TokenTransferProxy|EtherToken|TokenRegistry|DummyToken).json' --template contract_templates/contract.handlebars --partials 'contract_templates/partials/**/*.handlebars' --output src/contract_wrappers/generated --backend ethers && prettier --write 'src/contract_wrappers/generated/**.ts'",
|
||||
"generate_contract_wrappers": "node ../abi-gen/lib/index.js --abis 'src/artifacts/@(Exchange|Token|TokenTransferProxy|EtherToken|TokenRegistry|DummyToken).json' --template ../contract_templates/contract.handlebars --partials '../contract_templates/partials/**/*.handlebars' --output src/contract_wrappers/generated --backend ethers && prettier --write 'src/contract_wrappers/generated/**.ts'",
|
||||
"lint": "tslint --project . 'src/**/*.ts' 'test/**/*.ts'",
|
||||
"test:circleci": "run-s test:coverage report_test_coverage",
|
||||
"test": "run-s clean test:commonjs",
|
||||
|
||||
@@ -4,7 +4,7 @@ public {{this.name}} = {
|
||||
defaultBlock?: Web3.BlockParam,
|
||||
): Promise<{{> return_type outputs=outputs}}> {
|
||||
const self = this as {{contractName}}Contract;
|
||||
const inputAbi = _.find(this._abi, {name: '{{this.name}}'}).inputs;
|
||||
const inputAbi = _.find(this.abi, {name: '{{this.name}}'}).inputs;
|
||||
[{{> params inputs=inputs}}] = BaseContract._transformABIData(inputAbi, [{{> params inputs=inputs}}], BaseContract._bigNumberToString.bind(this));
|
||||
const callDescription = self._ethersInterface.functions.{{this.name}}(
|
||||
{{> params inputs=inputs}}
|
||||
@@ -16,7 +16,7 @@ public {{this.name}} = {
|
||||
)
|
||||
const rawCallResult = await self._web3Wrapper.callAsync(callData);
|
||||
let resultArray = callDescription.parse(rawCallResult);
|
||||
const outputAbi = _.find(this._abi, {name: '{{this.name}}'}).outputs;
|
||||
const outputAbi = _.find(this.abi, {name: '{{this.name}}'}).outputs;
|
||||
resultArray = BaseContract._transformABIData(outputAbi, resultArray, BaseContract._lowercaseAddress.bind(this));
|
||||
return resultArray{{#singleReturnValue}}[0]{{/singleReturnValue}};
|
||||
},
|
||||
@@ -1,6 +1,10 @@
|
||||
{{#if outputs.length}}
|
||||
{{#singleReturnValue}}
|
||||
{{#returnType outputs.0.type outputs.0.components}}{{/returnType}}
|
||||
{{#returnType outputs.0.type components}}{{/returnType}}
|
||||
{{/singleReturnValue}}
|
||||
{{^singleReturnValue}}
|
||||
[{{#each outputs}}{{#returnType type components}}{{/returnType}}{{#unless @last}}, {{/unless}}{{/each}}]
|
||||
{{/singleReturnValue}}
|
||||
{{else}}
|
||||
void
|
||||
{{/if}}
|
||||
@@ -9,15 +9,15 @@ public {{this.name}} = {
|
||||
{{/this.payable}}
|
||||
): Promise<string> {
|
||||
const self = this as {{contractName}}Contract;
|
||||
const inputAbi = _.find(this._abi, {name: '{{this.name}}'}).inputs;
|
||||
const inputAbi = _.find(this.abi, {name: '{{this.name}}'}).inputs;
|
||||
[{{> params inputs=inputs}}] = BaseContract._transformABIData(inputAbi, [{{> params inputs=inputs}}], BaseContract._bigNumberToString.bind(this));
|
||||
const data = this._ethersInterface.functions.{{this.name}}(
|
||||
const encodedData = this._ethersInterface.functions.{{this.name}}(
|
||||
{{> params inputs=inputs}}
|
||||
).data
|
||||
const txDataWithDefaults = await self._applyDefaultsToTxDataAsync(
|
||||
{
|
||||
...txData,
|
||||
data,
|
||||
data: encodedData,
|
||||
},
|
||||
self.{{this.name}}.estimateGasAsync.bind(
|
||||
self,
|
||||
@@ -32,13 +32,13 @@ public {{this.name}} = {
|
||||
txData: TxData = {},
|
||||
): Promise<number> {
|
||||
const self = this as {{contractName}}Contract;
|
||||
const data = this._ethersInterface.functions.{{this.name}}(
|
||||
const encodedData = this._ethersInterface.functions.{{this.name}}(
|
||||
{{> params inputs=inputs}}
|
||||
).data
|
||||
const txDataWithDefaults = await self._applyDefaultsToTxDataAsync(
|
||||
{
|
||||
...txData,
|
||||
data,
|
||||
data: encodedData,
|
||||
}
|
||||
);
|
||||
const gas = await this._web3Wrapper.estimateGasAsync(txDataWithDefaults);
|
||||
@@ -54,4 +54,30 @@ public {{this.name}} = {
|
||||
).data
|
||||
return abiEncodedTransactionData;
|
||||
},
|
||||
async callAsync(
|
||||
{{> typed_params inputs=inputs}}
|
||||
{{#this.payable}}
|
||||
txData: TxDataPayable = {},
|
||||
{{/this.payable}}
|
||||
{{^this.payable}}
|
||||
txData: TxData = {},
|
||||
{{/this.payable}}
|
||||
): Promise<{{> return_type outputs=outputs}}> {
|
||||
const self = this as {{contractName}}Contract;
|
||||
const inputAbi = _.find(this.abi, {name: '{{this.name}}'}).inputs;
|
||||
[{{> params inputs=inputs}}] = BaseContract._transformABIData(inputAbi, [{{> params inputs=inputs}}], BaseContract._bigNumberToString.bind(this));
|
||||
const callDescription = self._ethersInterface.functions.{{this.name}}(
|
||||
{{> params inputs=inputs}}
|
||||
) as ethersContracts.CallDescription;
|
||||
const callData = await self._applyDefaultsToTxDataAsync(
|
||||
{
|
||||
data: callDescription.data,
|
||||
}
|
||||
)
|
||||
const rawCallResult = await self._web3Wrapper.callAsync(callData);
|
||||
let resultArray = callDescription.parse(rawCallResult);
|
||||
const outputAbi = _.find(this.abi, {name: '{{this.name}}'}).outputs;
|
||||
resultArray = BaseContract._transformABIData(outputAbi, resultArray, BaseContract._lowercaseAddress.bind(this));
|
||||
return resultArray{{#singleReturnValue}}[0]{{/singleReturnValue}};
|
||||
},
|
||||
};
|
||||
@@ -1,44 +0,0 @@
|
||||
/**
|
||||
* This file is auto-generated using abi-gen. Don't edit directly.
|
||||
* Templates can be found at https://github.com/0xProject/0x.js/tree/development/packages/abi-gen-templates.
|
||||
*/
|
||||
// tslint:disable:async-suffix member-ordering no-consecutive-blank-lines
|
||||
// tslint:disable-next-line:no-unused-variable
|
||||
import { TxData, TxDataPayable } from '@0xproject/types';
|
||||
import { BigNumber, classUtils, promisify } from '@0xproject/utils';
|
||||
import * as Web3 from 'web3';
|
||||
|
||||
import {BaseContract} from './base_contract';
|
||||
|
||||
{{#if events}}
|
||||
export type {{contractName}}ContractEventArgs =
|
||||
{{#each events}}
|
||||
| {{name}}ContractEventArgs{{#if @last}};{{/if}}
|
||||
{{/each}}
|
||||
|
||||
export enum {{contractName}}Events {
|
||||
{{#each events}}
|
||||
{{name}} = '{{name}}',
|
||||
{{/each}}
|
||||
}
|
||||
|
||||
{{#each events}}
|
||||
{{> event}}
|
||||
|
||||
{{/each}}
|
||||
{{/if}}
|
||||
|
||||
export class {{contractName}}Contract extends BaseContract {
|
||||
{{#each methods}}
|
||||
{{#this.constant}}
|
||||
{{> call contractName=../contractName}}
|
||||
{{/this.constant}}
|
||||
{{^this.constant}}
|
||||
{{> tx contractName=../contractName}}
|
||||
{{/this.constant}}
|
||||
{{/each}}
|
||||
constructor(web3ContractInstance: Web3.ContractInstance, defaults?: Partial<TxData>) {
|
||||
super(web3ContractInstance, defaults);
|
||||
classUtils.bindAll(this, ['_web3ContractInstance', '_defaults']);
|
||||
}
|
||||
} // tslint:disable:max-file-line-count
|
||||
@@ -1,10 +0,0 @@
|
||||
public async {{this.name}}(
|
||||
{{> typed_params inputs=inputs}}
|
||||
defaultBlock?: Web3.BlockParam,
|
||||
): Promise<{{> return_type outputs=outputs}}> {
|
||||
const self = this as {{contractName}}Contract;
|
||||
const result = await self._web3ContractInstance.{{this.name}}.call(
|
||||
{{> params inputs=inputs}}
|
||||
);
|
||||
return result;
|
||||
}
|
||||
@@ -1,5 +0,0 @@
|
||||
export interface {{name}}ContractEventArgs {
|
||||
{{#each inputs}}
|
||||
{{name}}: {{#returnType type components}}{{/returnType}};
|
||||
{{/each}}
|
||||
}
|
||||
@@ -1,3 +0,0 @@
|
||||
{{#each inputs}}
|
||||
{{name}},
|
||||
{{/each}}
|
||||
@@ -1,10 +0,0 @@
|
||||
{{#if outputs.length}}
|
||||
{{#singleReturnValue}}
|
||||
{{#returnType outputs.0.type}}{{/returnType}}
|
||||
{{/singleReturnValue}}
|
||||
{{^singleReturnValue}}
|
||||
[{{#each outputs}}{{#returnType type}}{{/returnType}}{{#unless @last}}, {{/unless}}{{/each}}]
|
||||
{{/singleReturnValue}}
|
||||
{{else}}
|
||||
void
|
||||
{{/if}}
|
||||
@@ -1,36 +0,0 @@
|
||||
public {{this.name}} = {
|
||||
async sendTransactionAsync(
|
||||
{{> typed_params inputs=inputs}}
|
||||
{{#this.payable}}
|
||||
txData: TxDataPayable = {},
|
||||
{{/this.payable}}
|
||||
{{^this.payable}}
|
||||
txData: TxData = {},
|
||||
{{/this.payable}}
|
||||
): Promise<string> {
|
||||
const self = this as {{contractName}}Contract;
|
||||
const txDataWithDefaults = await self._applyDefaultsToTxDataAsync(txData);
|
||||
const txHash = await self._web3ContractInstance.{{this.name}}(
|
||||
{{> params inputs=inputs}}
|
||||
txDataWithDefaults,
|
||||
);
|
||||
return txHash;
|
||||
},
|
||||
async callAsync(
|
||||
{{> typed_params inputs=inputs}}
|
||||
{{#this.payable}}
|
||||
txData: TxDataPayable = {},
|
||||
{{/this.payable}}
|
||||
{{^this.payable}}
|
||||
txData: TxData = {},
|
||||
{{/this.payable}}
|
||||
): Promise<{{> return_type outputs=outputs}}> {
|
||||
const self = this as {{contractName}}Contract;
|
||||
const txDataWithDefaults = await self._applyDefaultsToTxDataAsync(txData);
|
||||
const returnValue = await self._web3ContractInstance.{{this.name}}.call(
|
||||
{{> params inputs=inputs}}
|
||||
txDataWithDefaults,
|
||||
);
|
||||
return returnValue;
|
||||
},
|
||||
};
|
||||
@@ -1,3 +0,0 @@
|
||||
{{#each inputs}}
|
||||
{{name}}: {{#parameterType type components}}{{/parameterType}},
|
||||
{{/each}}
|
||||
@@ -17,7 +17,7 @@
|
||||
"compile:comment": "Yarn workspaces do not link binaries correctly so we need to reference them directly https://github.com/yarnpkg/yarn/issues/3846",
|
||||
"compile": "node ../deployer/lib/src/cli.js compile --contracts ${npm_package_config_contracts} --contracts-dir src/contracts --artifacts-dir src/artifacts",
|
||||
"clean": "shx rm -rf ./lib",
|
||||
"generate_contract_wrappers": "node ../abi-gen/lib/index.js --abis 'src/artifacts/@(DummyToken|TokenTransferProxy|Exchange|TokenRegistry|MultiSigWallet|MultiSigWalletWithTimeLock|MultiSigWalletWithTimeLockExceptRemoveAuthorizedAddress|TokenRegistry|ZRXToken).json' --template contract_templates/contract.handlebars --partials 'contract_templates/partials/**/*.handlebars' --output src/contract_wrappers/generated --backend web3 && prettier --write 'src/contract_wrappers/generated/**.ts'",
|
||||
"generate_contract_wrappers": "node ../abi-gen/lib/index.js --abis 'src/artifacts/@(DummyToken|TokenTransferProxy|Exchange|TokenRegistry|MultiSigWallet|MultiSigWalletWithTimeLock|MultiSigWalletWithTimeLockExceptRemoveAuthorizedAddress|TokenRegistry|ZRXToken).json' --template ../contract_templates/contract.handlebars --partials '../contract_templates/partials/**/*.handlebars' --output src/contract_wrappers/generated --backend web3 && prettier --write 'src/contract_wrappers/generated/**.ts'",
|
||||
"migrate": "node ../deployer/lib/src/cli.js migrate",
|
||||
"lint": "tslint --project . 'migrations/**/*.ts' 'test/**/*.ts' 'util/**/*.ts' 'deploy/**/*.ts'",
|
||||
"test:circleci": "yarn test"
|
||||
|
||||
@@ -1,12 +1,45 @@
|
||||
import { TxData, TxDataPayable } from '@0xproject/types';
|
||||
import { Web3Wrapper } from '@0xproject/web3-wrapper';
|
||||
import * as ethersContracts from 'ethers-contracts';
|
||||
import * as _ from 'lodash';
|
||||
import * as Web3 from 'web3';
|
||||
|
||||
export class BaseContract {
|
||||
protected _ethersInterface: ethersContracts.Interface;
|
||||
protected _web3Wrapper: Web3Wrapper;
|
||||
public abi: Web3.ContractAbi;
|
||||
public address: string;
|
||||
protected _web3ContractInstance: Web3.ContractInstance;
|
||||
protected _defaults: Partial<TxData>;
|
||||
protected async _applyDefaultsToTxDataAsync<T extends TxData | TxDataPayable>(
|
||||
protected static _transformABIData(
|
||||
abis: Web3.DataItem[],
|
||||
values: any[],
|
||||
transformation: (type: string, value: any) => any,
|
||||
): any {
|
||||
return _.map(values, (value: any, i: number) =>
|
||||
BaseContract._transformTypedData(abis[i].type, value, transformation),
|
||||
);
|
||||
}
|
||||
protected static _lowercaseAddress(type: string, value: string): string {
|
||||
return type === 'address' ? value.toLowerCase() : value;
|
||||
}
|
||||
protected static _bigNumberToString(type: string, value: string): string {
|
||||
return _.isObject(value) && (value as any).isBigNumber ? value.toString() : value;
|
||||
}
|
||||
private static _transformTypedData(
|
||||
type: string,
|
||||
values: any,
|
||||
transformation: (type: string, value: any) => any,
|
||||
): any {
|
||||
const trailingArrayRegex = /\[\d*\]$/;
|
||||
if (type.match(trailingArrayRegex)) {
|
||||
const arrayItemType = type.replace(trailingArrayRegex, '');
|
||||
return _.map(values, (value: any, i: number) =>
|
||||
this._transformTypedData(arrayItemType, value, transformation),
|
||||
);
|
||||
} else {
|
||||
return transformation(type, values);
|
||||
}
|
||||
}
|
||||
protected async _applyDefaultsToTxDataAsync<T extends Partial<TxData | TxDataPayable>>(
|
||||
txData: T,
|
||||
estimateGasAsync?: (txData: T) => Promise<number>,
|
||||
): Promise<TxData> {
|
||||
@@ -16,7 +49,8 @@ export class BaseContract {
|
||||
// 3. Gas estimate calculation + safety margin
|
||||
const removeUndefinedProperties = _.pickBy;
|
||||
const txDataWithDefaults = {
|
||||
...removeUndefinedProperties(this._defaults),
|
||||
to: this.address,
|
||||
...removeUndefinedProperties(this._web3Wrapper.getContractDefaults()),
|
||||
...removeUndefinedProperties(txData as any),
|
||||
// HACK: TS can't prove that T is spreadable.
|
||||
// Awaiting https://github.com/Microsoft/TypeScript/pull/13288 to be merged
|
||||
@@ -27,9 +61,10 @@ export class BaseContract {
|
||||
}
|
||||
return txDataWithDefaults;
|
||||
}
|
||||
constructor(web3ContractInstance: Web3.ContractInstance, defaults?: Partial<TxData>) {
|
||||
this.address = web3ContractInstance.address;
|
||||
this._web3ContractInstance = web3ContractInstance;
|
||||
this._defaults = defaults || {};
|
||||
constructor(web3Wrapper: Web3Wrapper, abi: Web3.ContractAbi, address: string) {
|
||||
this._web3Wrapper = web3Wrapper;
|
||||
this.abi = abi;
|
||||
this.address = address;
|
||||
this._ethersInterface = new ethersContracts.Interface(abi);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -60,16 +60,20 @@ describe('Exchange', () => {
|
||||
deployer.deployAsync(ContractName.DummyToken),
|
||||
deployer.deployAsync(ContractName.DummyToken),
|
||||
]);
|
||||
rep = new DummyTokenContract(repInstance);
|
||||
dgd = new DummyTokenContract(dgdInstance);
|
||||
zrx = new DummyTokenContract(zrxInstance);
|
||||
rep = new DummyTokenContract(web3Wrapper, repInstance.abi, repInstance.address);
|
||||
dgd = new DummyTokenContract(web3Wrapper, dgdInstance.abi, dgdInstance.address);
|
||||
zrx = new DummyTokenContract(web3Wrapper, zrxInstance.abi, zrxInstance.address);
|
||||
const tokenTransferProxyInstance = await deployer.deployAsync(ContractName.TokenTransferProxy);
|
||||
tokenTransferProxy = new TokenTransferProxyContract(tokenTransferProxyInstance);
|
||||
tokenTransferProxy = new TokenTransferProxyContract(
|
||||
web3Wrapper,
|
||||
tokenTransferProxyInstance.abi,
|
||||
tokenTransferProxyInstance.address,
|
||||
);
|
||||
const exchangeInstance = await deployer.deployAsync(ContractName.Exchange, [
|
||||
zrx.address,
|
||||
tokenTransferProxy.address,
|
||||
]);
|
||||
exchange = new ExchangeContract(exchangeInstance);
|
||||
exchange = new ExchangeContract(web3Wrapper, exchangeInstance.abi, exchangeInstance.address);
|
||||
await tokenTransferProxy.addAuthorizedAddress.sendTransactionAsync(exchange.address, { from: accounts[0] });
|
||||
zeroEx = new ZeroEx(web3.currentProvider, {
|
||||
exchangeContractAddress: exchange.address,
|
||||
@@ -647,7 +651,7 @@ describe('Exchange', () => {
|
||||
|
||||
it('should not change balances if makerTokenAddress is ZRX, makerTokenAmount + makerFee > maker allowance, \
|
||||
and shouldThrowOnInsufficientBalanceOrAllowance = false', async () => {
|
||||
const makerZRXAllowance = await zrx.allowance(maker, tokenTransferProxy.address);
|
||||
const makerZRXAllowance = await zrx.allowance.callAsync(maker, tokenTransferProxy.address);
|
||||
signedOrder = await orderFactory.newSignedOrderAsync({
|
||||
makerTokenAddress: zrx.address,
|
||||
makerTokenAmount: new BigNumber(makerZRXAllowance),
|
||||
@@ -673,7 +677,7 @@ describe('Exchange', () => {
|
||||
|
||||
it('should not change balances if takerTokenAddress is ZRX, takerTokenAmount + takerFee > taker allowance, \
|
||||
and shouldThrowOnInsufficientBalanceOrAllowance = false', async () => {
|
||||
const takerZRXAllowance = await zrx.allowance(taker, tokenTransferProxy.address);
|
||||
const takerZRXAllowance = await zrx.allowance.callAsync(taker, tokenTransferProxy.address);
|
||||
signedOrder = await orderFactory.newSignedOrderAsync({
|
||||
takerTokenAddress: zrx.address,
|
||||
takerTokenAmount: new BigNumber(takerZRXAllowance),
|
||||
|
||||
@@ -47,7 +47,7 @@ describe('Exchange', () => {
|
||||
zrx.address,
|
||||
tokenTransferProxy.address,
|
||||
]);
|
||||
const exchange = new ExchangeContract(exchangeInstance);
|
||||
const exchange = new ExchangeContract(web3Wrapper, exchangeInstance.abi, exchangeInstance.address);
|
||||
await tokenTransferProxy.addAuthorizedAddress(exchange.address, { from: accounts[0] });
|
||||
const zeroEx = new ZeroEx(web3.currentProvider, { networkId: constants.TESTRPC_NETWORK_ID });
|
||||
exchangeWrapper = new ExchangeWrapper(exchange, zeroEx);
|
||||
|
||||
@@ -60,18 +60,26 @@ describe('Exchange', () => {
|
||||
deployer.deployAsync(ContractName.DummyToken),
|
||||
deployer.deployAsync(ContractName.DummyToken),
|
||||
]);
|
||||
rep = new DummyTokenContract(repInstance);
|
||||
dgd = new DummyTokenContract(dgdInstance);
|
||||
zrx = new DummyTokenContract(zrxInstance);
|
||||
rep = new DummyTokenContract(web3Wrapper, repInstance.abi, repInstance.address);
|
||||
dgd = new DummyTokenContract(web3Wrapper, dgdInstance.abi, dgdInstance.address);
|
||||
zrx = new DummyTokenContract(web3Wrapper, zrxInstance.abi, zrxInstance.address);
|
||||
const tokenRegistryInstance = await deployer.deployAsync(ContractName.TokenRegistry);
|
||||
tokenRegistry = new TokenRegistryContract(tokenRegistryInstance);
|
||||
tokenRegistry = new TokenRegistryContract(
|
||||
web3Wrapper,
|
||||
tokenRegistryInstance.abi,
|
||||
tokenRegistryInstance.address,
|
||||
);
|
||||
const tokenTransferProxyInstance = await deployer.deployAsync(ContractName.TokenTransferProxy);
|
||||
tokenTransferProxy = new TokenTransferProxyContract(tokenTransferProxyInstance);
|
||||
tokenTransferProxy = new TokenTransferProxyContract(
|
||||
web3Wrapper,
|
||||
tokenTransferProxyInstance.abi,
|
||||
tokenTransferProxyInstance.address,
|
||||
);
|
||||
const exchangeInstance = await deployer.deployAsync(ContractName.Exchange, [
|
||||
zrx.address,
|
||||
tokenTransferProxy.address,
|
||||
]);
|
||||
exchange = new ExchangeContract(exchangeInstance);
|
||||
exchange = new ExchangeContract(web3Wrapper, exchangeInstance.abi, exchangeInstance.address);
|
||||
await tokenTransferProxy.addAuthorizedAddress.sendTransactionAsync(exchange.address, { from: accounts[0] });
|
||||
const zeroEx = new ZeroEx(web3.currentProvider, { networkId: constants.TESTRPC_NETWORK_ID });
|
||||
exWrapper = new ExchangeWrapper(exchange, zeroEx);
|
||||
|
||||
@@ -59,10 +59,14 @@ describe('MultiSigWalletWithTimeLock', () => {
|
||||
SIGNATURES_REQUIRED,
|
||||
0,
|
||||
]);
|
||||
multiSig = new MultiSigWalletWithTimeLockContract(multiSigInstance);
|
||||
multiSig = new MultiSigWalletWithTimeLockContract(
|
||||
web3Wrapper,
|
||||
multiSigInstance.abi,
|
||||
multiSigInstance.address,
|
||||
);
|
||||
multiSigWrapper = new MultiSigWrapper((multiSig as any) as MultiSigWalletContract);
|
||||
|
||||
const secondsTimeLocked = await multiSig.secondsTimeLocked();
|
||||
const secondsTimeLocked = await multiSig.secondsTimeLocked.callAsync();
|
||||
initialSecondsTimeLocked = secondsTimeLocked.toNumber();
|
||||
});
|
||||
it('should throw when not called by wallet', async () => {
|
||||
@@ -113,7 +117,7 @@ describe('MultiSigWalletWithTimeLock', () => {
|
||||
const blockNum = await web3Wrapper.getBlockNumberAsync();
|
||||
const blockInfo = await web3Wrapper.getBlockAsync(blockNum);
|
||||
const timestamp = new BigNumber(blockInfo.timestamp);
|
||||
const confirmationTimeBigNum = new BigNumber(await multiSig.confirmationTimes(txId));
|
||||
const confirmationTimeBigNum = new BigNumber(await multiSig.confirmationTimes.callAsync(txId));
|
||||
|
||||
expect(timestamp).to.be.bignumber.equal(confirmationTimeBigNum);
|
||||
});
|
||||
@@ -141,7 +145,7 @@ describe('MultiSigWalletWithTimeLock', () => {
|
||||
const res = await zeroEx.awaitTransactionMinedAsync(txHash);
|
||||
expect(res.logs).to.have.length(2);
|
||||
|
||||
const secondsTimeLocked = new BigNumber(await multiSig.secondsTimeLocked());
|
||||
const secondsTimeLocked = new BigNumber(await multiSig.secondsTimeLocked.callAsync());
|
||||
expect(secondsTimeLocked).to.be.bignumber.equal(SECONDS_TIME_LOCKED);
|
||||
});
|
||||
});
|
||||
@@ -152,10 +156,14 @@ describe('MultiSigWalletWithTimeLock', () => {
|
||||
SIGNATURES_REQUIRED,
|
||||
SECONDS_TIME_LOCKED,
|
||||
]);
|
||||
multiSig = new MultiSigWalletWithTimeLockContract(multiSigInstance);
|
||||
multiSig = new MultiSigWalletWithTimeLockContract(
|
||||
web3Wrapper,
|
||||
multiSigInstance.abi,
|
||||
multiSigInstance.address,
|
||||
);
|
||||
multiSigWrapper = new MultiSigWrapper((multiSig as any) as MultiSigWalletContract);
|
||||
|
||||
const secondsTimeLocked = await multiSig.secondsTimeLocked();
|
||||
const secondsTimeLocked = await multiSig.secondsTimeLocked.callAsync();
|
||||
initialSecondsTimeLocked = secondsTimeLocked.toNumber();
|
||||
const destination = multiSig.address;
|
||||
const from = owners[0];
|
||||
@@ -187,7 +195,7 @@ describe('MultiSigWalletWithTimeLock', () => {
|
||||
await rpc.increaseTimeAsync(SECONDS_TIME_LOCKED.toNumber());
|
||||
await multiSig.executeTransaction.sendTransactionAsync(txId, { from: owners[0] });
|
||||
|
||||
const secondsTimeLocked = new BigNumber(await multiSig.secondsTimeLocked());
|
||||
const secondsTimeLocked = new BigNumber(await multiSig.secondsTimeLocked.callAsync());
|
||||
expect(secondsTimeLocked).to.be.bignumber.equal(newSecondsTimeLocked);
|
||||
});
|
||||
});
|
||||
|
||||
@@ -49,7 +49,11 @@ describe('MultiSigWalletWithTimeLockExceptRemoveAuthorizedAddress', () => {
|
||||
[authorizedAddress, unauthorizedAddress] = accounts;
|
||||
const initialOwner = accounts[0];
|
||||
const tokenTransferProxyInstance = await deployer.deployAsync(ContractName.TokenTransferProxy);
|
||||
tokenTransferProxy = new TokenTransferProxyContract(tokenTransferProxyInstance);
|
||||
tokenTransferProxy = new TokenTransferProxyContract(
|
||||
web3Wrapper,
|
||||
tokenTransferProxyInstance.abi,
|
||||
tokenTransferProxyInstance.address,
|
||||
);
|
||||
await tokenTransferProxy.addAuthorizedAddress.sendTransactionAsync(authorizedAddress, {
|
||||
from: initialOwner,
|
||||
});
|
||||
@@ -57,7 +61,11 @@ describe('MultiSigWalletWithTimeLockExceptRemoveAuthorizedAddress', () => {
|
||||
ContractName.MultiSigWalletWithTimeLockExceptRemoveAuthorizedAddress,
|
||||
[owners, requiredApprovals, SECONDS_TIME_LOCKED, tokenTransferProxy.address],
|
||||
);
|
||||
multiSig = new MultiSigWalletWithTimeLockExceptRemoveAuthorizedAddressContract(multiSigInstance);
|
||||
multiSig = new MultiSigWalletWithTimeLockExceptRemoveAuthorizedAddressContract(
|
||||
web3Wrapper,
|
||||
multiSigInstance.abi,
|
||||
multiSigInstance.address,
|
||||
);
|
||||
await tokenTransferProxy.transferOwnership.sendTransactionAsync(multiSig.address, {
|
||||
from: initialOwner,
|
||||
});
|
||||
@@ -74,12 +82,14 @@ describe('MultiSigWalletWithTimeLockExceptRemoveAuthorizedAddress', () => {
|
||||
describe('isFunctionRemoveAuthorizedAddress', () => {
|
||||
it('should throw if data is not for removeAuthorizedAddress', async () => {
|
||||
const data = MultiSigWrapper.encodeFnArgs('addAuthorizedAddress', PROXY_ABI, [owners[0]]);
|
||||
return expect(multiSig.isFunctionRemoveAuthorizedAddress(data)).to.be.rejectedWith(constants.REVERT);
|
||||
return expect(multiSig.isFunctionRemoveAuthorizedAddress.callAsync(data)).to.be.rejectedWith(
|
||||
constants.REVERT,
|
||||
);
|
||||
});
|
||||
|
||||
it('should return true if data is for removeAuthorizedAddress', async () => {
|
||||
const data = MultiSigWrapper.encodeFnArgs('removeAuthorizedAddress', PROXY_ABI, [owners[0]]);
|
||||
const isFunctionRemoveAuthorizedAddress = await multiSig.isFunctionRemoveAuthorizedAddress(data);
|
||||
const isFunctionRemoveAuthorizedAddress = await multiSig.isFunctionRemoveAuthorizedAddress.callAsync(data);
|
||||
expect(isFunctionRemoveAuthorizedAddress).to.be.true();
|
||||
});
|
||||
});
|
||||
@@ -114,7 +124,7 @@ describe('MultiSigWalletWithTimeLockExceptRemoveAuthorizedAddress', () => {
|
||||
const log = abiDecoder.tryToDecodeLogOrNoop(res.logs[0]) as LogWithDecodedArgs<SubmissionContractEventArgs>;
|
||||
const txId = log.args.transactionId;
|
||||
await multiSig.confirmTransaction.sendTransactionAsync(txId, { from: owners[1] });
|
||||
const isConfirmed = await multiSig.isConfirmed(txId);
|
||||
const isConfirmed = await multiSig.isConfirmed.callAsync(txId);
|
||||
expect(isConfirmed).to.be.true();
|
||||
|
||||
return expect(
|
||||
@@ -133,7 +143,7 @@ describe('MultiSigWalletWithTimeLockExceptRemoveAuthorizedAddress', () => {
|
||||
const log = abiDecoder.tryToDecodeLogOrNoop(res.logs[0]) as LogWithDecodedArgs<SubmissionContractEventArgs>;
|
||||
const txId = log.args.transactionId;
|
||||
await multiSig.confirmTransaction.sendTransactionAsync(txId, { from: owners[1] });
|
||||
const isConfirmed = await multiSig.isConfirmed(txId);
|
||||
const isConfirmed = await multiSig.isConfirmed.callAsync(txId);
|
||||
expect(isConfirmed).to.be.true();
|
||||
|
||||
return expect(
|
||||
@@ -152,10 +162,10 @@ describe('MultiSigWalletWithTimeLockExceptRemoveAuthorizedAddress', () => {
|
||||
const log = abiDecoder.tryToDecodeLogOrNoop(res.logs[0]) as LogWithDecodedArgs<SubmissionContractEventArgs>;
|
||||
const txId = log.args.transactionId;
|
||||
await multiSig.confirmTransaction.sendTransactionAsync(txId, { from: owners[1] });
|
||||
const isConfirmed = await multiSig.isConfirmed(txId);
|
||||
const isConfirmed = await multiSig.isConfirmed.callAsync(txId);
|
||||
expect(isConfirmed).to.be.true();
|
||||
await multiSig.executeRemoveAuthorizedAddress.sendTransactionAsync(txId, { from: owners[1] });
|
||||
const isAuthorized = await tokenTransferProxy.authorized(authorizedAddress);
|
||||
const isAuthorized = await tokenTransferProxy.authorized.callAsync(authorizedAddress);
|
||||
expect(isAuthorized).to.be.false();
|
||||
});
|
||||
|
||||
@@ -170,10 +180,10 @@ describe('MultiSigWalletWithTimeLockExceptRemoveAuthorizedAddress', () => {
|
||||
const log = abiDecoder.tryToDecodeLogOrNoop(res.logs[0]) as LogWithDecodedArgs<SubmissionContractEventArgs>;
|
||||
const txId = log.args.transactionId;
|
||||
await multiSig.confirmTransaction.sendTransactionAsync(txId, { from: owners[1] });
|
||||
const isConfirmed = await multiSig.isConfirmed(txId);
|
||||
const isConfirmed = await multiSig.isConfirmed.callAsync(txId);
|
||||
expect(isConfirmed).to.be.true();
|
||||
await multiSig.executeRemoveAuthorizedAddress.sendTransactionAsync(txId, { from: owners[1] });
|
||||
const tx = await multiSig.transactions(txId);
|
||||
const tx = await multiSig.transactions.callAsync(txId);
|
||||
const isExecuted = tx[3];
|
||||
expect(isExecuted).to.be.true();
|
||||
return expect(
|
||||
|
||||
@@ -31,7 +31,7 @@ describe('TokenRegistry', () => {
|
||||
owner = accounts[0];
|
||||
notOwner = accounts[1];
|
||||
const tokenRegInstance = await deployer.deployAsync(ContractName.TokenRegistry);
|
||||
tokenReg = new TokenRegistryContract(tokenRegInstance);
|
||||
tokenReg = new TokenRegistryContract(web3Wrapper, tokenRegInstance.abi, tokenRegInstance.address);
|
||||
tokenRegWrapper = new TokenRegWrapper(tokenReg);
|
||||
});
|
||||
beforeEach(async () => {
|
||||
|
||||
@@ -25,7 +25,11 @@ describe('TokenTransferProxy', () => {
|
||||
owner = address = accounts[0];
|
||||
notOwner = accounts[1];
|
||||
const tokenTransferProxyInstance = await deployer.deployAsync(ContractName.TokenTransferProxy);
|
||||
tokenTransferProxy = new TokenTransferProxyContract(tokenTransferProxyInstance);
|
||||
tokenTransferProxy = new TokenTransferProxyContract(
|
||||
web3Wrapper,
|
||||
tokenTransferProxyInstance.abi,
|
||||
tokenTransferProxyInstance.address,
|
||||
);
|
||||
});
|
||||
beforeEach(async () => {
|
||||
await blockchainLifecycle.startAsync();
|
||||
@@ -41,7 +45,7 @@ describe('TokenTransferProxy', () => {
|
||||
});
|
||||
it('should allow owner to add an authorized address', async () => {
|
||||
await tokenTransferProxy.addAuthorizedAddress.sendTransactionAsync(address, { from: owner });
|
||||
const isAuthorized = await tokenTransferProxy.authorized(address);
|
||||
const isAuthorized = await tokenTransferProxy.authorized.callAsync(address);
|
||||
expect(isAuthorized).to.be.true();
|
||||
});
|
||||
it('should throw if owner attempts to authorize a duplicate address', async () => {
|
||||
@@ -67,7 +71,7 @@ describe('TokenTransferProxy', () => {
|
||||
await tokenTransferProxy.removeAuthorizedAddress.sendTransactionAsync(address, {
|
||||
from: owner,
|
||||
});
|
||||
const isAuthorized = await tokenTransferProxy.authorized(address);
|
||||
const isAuthorized = await tokenTransferProxy.authorized.callAsync(address);
|
||||
expect(isAuthorized).to.be.false();
|
||||
});
|
||||
|
||||
@@ -82,19 +86,19 @@ describe('TokenTransferProxy', () => {
|
||||
|
||||
describe('getAuthorizedAddresses', () => {
|
||||
it('should return all authorized addresses', async () => {
|
||||
const initial = await tokenTransferProxy.getAuthorizedAddresses();
|
||||
const initial = await tokenTransferProxy.getAuthorizedAddresses.callAsync();
|
||||
expect(initial).to.have.length(0);
|
||||
await tokenTransferProxy.addAuthorizedAddress.sendTransactionAsync(address, {
|
||||
from: owner,
|
||||
});
|
||||
const afterAdd = await tokenTransferProxy.getAuthorizedAddresses();
|
||||
const afterAdd = await tokenTransferProxy.getAuthorizedAddresses.callAsync();
|
||||
expect(afterAdd).to.have.length(1);
|
||||
expect(afterAdd).to.include(address);
|
||||
|
||||
await tokenTransferProxy.removeAuthorizedAddress.sendTransactionAsync(address, {
|
||||
from: owner,
|
||||
});
|
||||
const afterRemove = await tokenTransferProxy.getAuthorizedAddresses();
|
||||
const afterRemove = await tokenTransferProxy.getAuthorizedAddresses.callAsync();
|
||||
expect(afterRemove).to.have.length(0);
|
||||
});
|
||||
});
|
||||
|
||||
@@ -33,9 +33,13 @@ describe('TokenTransferProxy', () => {
|
||||
accounts = await web3Wrapper.getAvailableAddressesAsync();
|
||||
owner = notAuthorized = accounts[0];
|
||||
const tokenTransferProxyInstance = await deployer.deployAsync(ContractName.TokenTransferProxy);
|
||||
tokenTransferProxy = new TokenTransferProxyContract(tokenTransferProxyInstance);
|
||||
tokenTransferProxy = new TokenTransferProxyContract(
|
||||
web3Wrapper,
|
||||
tokenTransferProxyInstance.abi,
|
||||
tokenTransferProxyInstance.address,
|
||||
);
|
||||
const repInstance = await deployer.deployAsync(ContractName.DummyToken);
|
||||
rep = new DummyTokenContract(repInstance);
|
||||
rep = new DummyTokenContract(web3Wrapper, repInstance.abi, repInstance.address);
|
||||
|
||||
dmyBalances = new Balances([rep], [accounts[0], accounts[1]]);
|
||||
await Promise.all([
|
||||
|
||||
@@ -35,7 +35,7 @@ describe('UnlimitedAllowanceToken', () => {
|
||||
owner = accounts[0];
|
||||
spender = accounts[1];
|
||||
const tokenInstance = await deployer.deployAsync(ContractName.DummyToken);
|
||||
token = new DummyTokenContract(tokenInstance);
|
||||
token = new DummyTokenContract(web3Wrapper, tokenInstance.abi, tokenInstance.address);
|
||||
await token.mint.sendTransactionAsync(MAX_MINT_VALUE, { from: owner });
|
||||
tokenAddress = token.address;
|
||||
});
|
||||
|
||||
@@ -36,7 +36,7 @@ describe('ZRXToken', () => {
|
||||
networkId: constants.TESTRPC_NETWORK_ID,
|
||||
});
|
||||
const zrxInstance = await deployer.deployAsync(ContractName.ZRXToken);
|
||||
zrx = new ZRXTokenContract(zrxInstance);
|
||||
zrx = new ZRXTokenContract(web3Wrapper, zrxInstance.abi, zrxInstance.address);
|
||||
zrxAddress = zrx.address;
|
||||
MAX_UINT = zeroEx.token.UNLIMITED_ALLOWANCE_IN_BASE_UNITS;
|
||||
});
|
||||
@@ -48,25 +48,25 @@ describe('ZRXToken', () => {
|
||||
});
|
||||
describe('constants', () => {
|
||||
it('should have 18 decimals', async () => {
|
||||
const decimals = new BigNumber(await zrx.decimals());
|
||||
const decimals = new BigNumber(await zrx.decimals.callAsync());
|
||||
const expectedDecimals = 18;
|
||||
expect(decimals).to.be.bignumber.equal(expectedDecimals);
|
||||
});
|
||||
|
||||
it('should have a total supply of 1 billion tokens', async () => {
|
||||
const totalSupply = new BigNumber(await zrx.totalSupply());
|
||||
const totalSupply = new BigNumber(await zrx.totalSupply.callAsync());
|
||||
const expectedTotalSupply = 1000000000;
|
||||
expect(ZeroEx.toUnitAmount(totalSupply, 18)).to.be.bignumber.equal(expectedTotalSupply);
|
||||
});
|
||||
|
||||
it('should be named 0x Protocol Token', async () => {
|
||||
const name = await zrx.name();
|
||||
const name = await zrx.name.callAsync();
|
||||
const expectedName = '0x Protocol Token';
|
||||
expect(name).to.be.equal(expectedName);
|
||||
});
|
||||
|
||||
it('should have the symbol ZRX', async () => {
|
||||
const symbol = await zrx.symbol();
|
||||
const symbol = await zrx.symbol.callAsync();
|
||||
const expectedSymbol = 'ZRX';
|
||||
expect(symbol).to.be.equal(expectedSymbol);
|
||||
});
|
||||
@@ -75,7 +75,7 @@ describe('ZRXToken', () => {
|
||||
describe('constructor', () => {
|
||||
it('should initialize owner balance to totalSupply', async () => {
|
||||
const ownerBalance = await zeroEx.token.getBalanceAsync(zrxAddress, owner);
|
||||
const totalSupply = new BigNumber(await zrx.totalSupply());
|
||||
const totalSupply = new BigNumber(await zrx.totalSupply.callAsync());
|
||||
expect(totalSupply).to.be.bignumber.equal(ownerBalance);
|
||||
});
|
||||
});
|
||||
|
||||
@@ -17,7 +17,7 @@ export class Balances {
|
||||
const balancesByOwner: BalancesByOwner = {};
|
||||
for (const tokenContractInstance of this._tokenContractInstances) {
|
||||
for (const ownerAddress of this._ownerAddresses) {
|
||||
let balance = await tokenContractInstance.balanceOf(ownerAddress);
|
||||
let balance = await tokenContractInstance.balanceOf.callAsync(ownerAddress);
|
||||
balance = new BigNumber(balance);
|
||||
if (_.isUndefined(balancesByOwner[ownerAddress])) {
|
||||
balancesByOwner[ownerAddress] = {};
|
||||
|
||||
@@ -186,11 +186,11 @@ export class ExchangeWrapper {
|
||||
public async getOrderHashAsync(signedOrder: SignedOrder): Promise<string> {
|
||||
const shouldThrowOnInsufficientBalanceOrAllowance = false;
|
||||
const params = signedOrderUtils.getOrderAddressesAndValues(signedOrder);
|
||||
const orderHash = await this._exchange.getOrderHash(params.orderAddresses, params.orderValues);
|
||||
const orderHash = await this._exchange.getOrderHash.callAsync(params.orderAddresses, params.orderValues);
|
||||
return orderHash;
|
||||
}
|
||||
public async isValidSignatureAsync(signedOrder: SignedOrder): Promise<boolean> {
|
||||
const isValidSignature = await this._exchange.isValidSignature(
|
||||
const isValidSignature = await this._exchange.isValidSignature.callAsync(
|
||||
signedOrder.maker,
|
||||
ZeroEx.getOrderHashHex(signedOrder),
|
||||
signedOrder.ecSignature.v,
|
||||
@@ -204,7 +204,7 @@ export class ExchangeWrapper {
|
||||
denominator: BigNumber,
|
||||
target: BigNumber,
|
||||
): Promise<boolean> {
|
||||
const isRoundingError = await this._exchange.isRoundingError(numerator, denominator, target);
|
||||
const isRoundingError = await this._exchange.isRoundingError.callAsync(numerator, denominator, target);
|
||||
return isRoundingError;
|
||||
}
|
||||
public async getPartialAmountAsync(
|
||||
@@ -212,7 +212,9 @@ export class ExchangeWrapper {
|
||||
denominator: BigNumber,
|
||||
target: BigNumber,
|
||||
): Promise<BigNumber> {
|
||||
const partialAmount = new BigNumber(await this._exchange.getPartialAmount(numerator, denominator, target));
|
||||
const partialAmount = new BigNumber(
|
||||
await this._exchange.getPartialAmount.callAsync(numerator, denominator, target),
|
||||
);
|
||||
return partialAmount;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -22,7 +22,7 @@ export class TokenRegWrapper {
|
||||
return tx;
|
||||
}
|
||||
public async getTokenMetaDataAsync(tokenAddress: string) {
|
||||
const data = await this._tokenReg.getTokenMetaData(tokenAddress);
|
||||
const data = await this._tokenReg.getTokenMetaData.callAsync(tokenAddress);
|
||||
const token: Token = {
|
||||
address: data[0],
|
||||
name: data[1],
|
||||
@@ -34,7 +34,7 @@ export class TokenRegWrapper {
|
||||
return token;
|
||||
}
|
||||
public async getTokenByNameAsync(tokenName: string) {
|
||||
const data = await this._tokenReg.getTokenByName(tokenName);
|
||||
const data = await this._tokenReg.getTokenByName.callAsync(tokenName);
|
||||
const token: Token = {
|
||||
address: data[0],
|
||||
name: data[1],
|
||||
@@ -46,7 +46,7 @@ export class TokenRegWrapper {
|
||||
return token;
|
||||
}
|
||||
public async getTokenBySymbolAsync(tokenSymbol: string) {
|
||||
const data = await this._tokenReg.getTokenBySymbol(tokenSymbol);
|
||||
const data = await this._tokenReg.getTokenBySymbol.callAsync(tokenSymbol);
|
||||
const token: Token = {
|
||||
address: data[0],
|
||||
name: data[1],
|
||||
|
||||
Reference in New Issue
Block a user