diff options
Diffstat (limited to 'src/contract.ts')
-rw-r--r-- | src/contract.ts | 34 |
1 files changed, 32 insertions, 2 deletions
diff --git a/src/contract.ts b/src/contract.ts index 0c76571cc..3592e0e71 100644 --- a/src/contract.ts +++ b/src/contract.ts @@ -6,11 +6,13 @@ export class Contract implements Web3.ContractInstance { public address: string; public abi: Web3.ContractAbi; private contract: Web3.ContractInstance; + private defaults: Partial<Web3.TxData>; [name: string]: any; - constructor(web3ContractInstance: Web3.ContractInstance) { + 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(); } @@ -18,11 +20,12 @@ export class Contract implements Web3.ContractInstance { const functionsAbi = _.filter(this.abi, abiPart => abiPart.type === 'function'); _.forEach(functionsAbi, (functionAbi: Web3.MethodAbi) => { const cbStyleFunction = this.contract[functionAbi.name]; - this[functionAbi.name] = promisify(cbStyleFunction, this.contract); if (functionAbi.constant) { + this[functionAbi.name] = promisify(cbStyleFunction, this.contract); const cbStyleCallFunction = this.contract[functionAbi.name].call; this[functionAbi.name].call = promisify(cbStyleCallFunction, this.contract); } else { + this[functionAbi.name] = this.promisifyWithDefaultParams(cbStyleFunction); const cbStyleEstimateGasFunction = this.contract[functionAbi.name].estimateGas; this[functionAbi.name].estimateGas = promisify(cbStyleEstimateGasFunction, this.contract); @@ -35,4 +38,31 @@ export class Contract implements Web3.ContractInstance { this[eventAbi.name] = this.contract[eventAbi.name]; }); } + private promisifyWithDefaultParams(fn: (...args: any[]) => void): (...args: any[]) => Promise<any> { + const promisifiedWithDefaultParams = (...args: any[]) => { + const promise = new Promise((resolve, reject) => { + const lastArg = args[args.length - 1]; + let txData: Partial<Web3.TxData> = {}; + if (_.isObject(lastArg) && !_.isArray(lastArg) && !lastArg.isBigNumber) { + txData = args.pop(); + } + txData = { + ...txData, + ...this.defaults, + }; + 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; + } } |