diff options
author | Amir Bandeali <abandeali1@gmail.com> | 2017-11-30 14:02:43 +0800 |
---|---|---|
committer | Amir Bandeali <abandeali1@gmail.com> | 2017-11-30 23:10:18 +0800 |
commit | 4b3e0383235ca4ca0127f24c2e05543bb45a56bb (patch) | |
tree | 7a9c1888f99b1121826b09ca28185565ed47cd50 /packages/contracts/deploy/src/utils/contract.ts | |
parent | c57190dead41846809effb8823bd4e486ca72512 (diff) | |
download | dexon-sol-tools-4b3e0383235ca4ca0127f24c2e05543bb45a56bb.tar dexon-sol-tools-4b3e0383235ca4ca0127f24c2e05543bb45a56bb.tar.gz dexon-sol-tools-4b3e0383235ca4ca0127f24c2e05543bb45a56bb.tar.bz2 dexon-sol-tools-4b3e0383235ca4ca0127f24c2e05543bb45a56bb.tar.lz dexon-sol-tools-4b3e0383235ca4ca0127f24c2e05543bb45a56bb.tar.xz dexon-sol-tools-4b3e0383235ca4ca0127f24c2e05543bb45a56bb.tar.zst dexon-sol-tools-4b3e0383235ca4ca0127f24c2e05543bb45a56bb.zip |
Add contracts to packages, fix most linting errors
Diffstat (limited to 'packages/contracts/deploy/src/utils/contract.ts')
-rw-r--r-- | packages/contracts/deploy/src/utils/contract.ts | 81 |
1 files changed, 81 insertions, 0 deletions
diff --git a/packages/contracts/deploy/src/utils/contract.ts b/packages/contracts/deploy/src/utils/contract.ts new file mode 100644 index 000000000..e9c49c9f1 --- /dev/null +++ b/packages/contracts/deploy/src/utils/contract.ts @@ -0,0 +1,81 @@ +import {schemas, SchemaValidator} from '@0xproject/json-schemas'; +import promisify = require('es6-promisify'); +import * as _ from 'lodash'; +import * as Web3 from 'web3'; + +import {AbiType} from './types'; + +export class Contract implements Web3.ContractInstance { + public address: string; + public abi: Web3.ContractAbi; + private contract: Web3.ContractInstance; + private defaults: Partial<Web3.TxData>; + private validator: SchemaValidator; + // This class instance is going to be populated with functions and events depending on the ABI + // and we don't know their types in advance + [name: string]: any; + constructor(web3ContractInstance: Web3.ContractInstance, defaults: Partial<Web3.TxData>) { + this.contract = web3ContractInstance; + this.address = web3ContractInstance.address; + this.abi = web3ContractInstance.abi; + this.defaults = defaults; + this.populateEvents(); + this.populateFunctions(); + this.validator = new SchemaValidator(); + } + private populateFunctions(): void { + const functionsAbi = _.filter(this.abi, abiPart => abiPart.type === AbiType.Function); + _.forEach(functionsAbi, (functionAbi: Web3.MethodAbi) => { + if (functionAbi.constant) { + const cbStyleCallFunction = this.contract[functionAbi.name].call; + this[functionAbi.name] = { + callAsync: promisify(cbStyleCallFunction, this.contract), + }; + } else { + const cbStyleFunction = this.contract[functionAbi.name]; + const cbStyleEstimateGasFunction = this.contract[functionAbi.name].estimateGas; + this[functionAbi.name] = { + estimateGasAsync: promisify(cbStyleEstimateGasFunction, this.contract), + sendTransactionAsync: this.promisifyWithDefaultParams(cbStyleFunction), + }; + } + }); + } + private populateEvents(): void { + const eventsAbi = _.filter(this.abi, abiPart => abiPart.type === AbiType.Event); + _.forEach(eventsAbi, (eventAbi: Web3.EventAbi) => { + this[eventAbi.name] = this.contract[eventAbi.name]; + }); + } + private promisifyWithDefaultParams(fn: (...args: any[]) => void): (...args: any[]) => Promise<any> { + const promisifiedWithDefaultParams = async (...args: any[]) => { + const promise = new Promise((resolve, reject) => { + const lastArg = args[args.length - 1]; + let txData: Partial<Web3.TxData> = {}; + if (this.isTxData(lastArg)) { + txData = args.pop(); + } + txData = { + ...this.defaults, + ...txData, + }; + const callback = (err: Error, data: any) => { + if (_.isNull(err)) { + resolve(data); + } else { + reject(err); + } + }; + args.push(txData); + args.push(callback); + fn.apply(this.contract, args); + }); + return promise; + }; + return promisifiedWithDefaultParams; + } + private isTxData(lastArg: any): boolean { + const isValid = this.validator.isValid(lastArg, schemas.txDataSchema); + return isValid; + } +} |