From a5ef1db0c56e4166641c19b46641921a3b1e509f Mon Sep 17 00:00:00 2001 From: Leonid Logvinov Date: Mon, 26 Feb 2018 16:36:56 -0800 Subject: Rewrite templates to decode call data on transactions --- packages/0x.js/src/globals.d.ts | 1 + .../contract_templates/partials/call.handlebars | 22 +--------------- .../partials/callAsync.handlebars | 29 ++++++++++++++++++++++ packages/contract_templates/partials/tx.handlebars | 27 +------------------- packages/contracts/globals.d.ts | 1 + 5 files changed, 33 insertions(+), 47 deletions(-) create mode 100644 packages/contract_templates/partials/callAsync.handlebars (limited to 'packages') diff --git a/packages/0x.js/src/globals.d.ts b/packages/0x.js/src/globals.d.ts index 702f35149..505f9b933 100644 --- a/packages/0x.js/src/globals.d.ts +++ b/packages/0x.js/src/globals.d.ts @@ -66,6 +66,7 @@ declare module 'ethers-contracts' { export class Interface { public functions: { [functionName: string]: FunctionDescription }; public events: { [eventName: string]: EventDescription }; + public static decodeParams(types: string[], data: string): any[]; constructor(abi: any); } } diff --git a/packages/contract_templates/partials/call.handlebars b/packages/contract_templates/partials/call.handlebars index 7ac3e1ee3..cfb9bea82 100644 --- a/packages/contract_templates/partials/call.handlebars +++ b/packages/contract_templates/partials/call.handlebars @@ -1,23 +1,3 @@ public {{this.name}} = { - async callAsync( - {{> typed_params inputs=inputs}} - defaultBlock?: Web3.BlockParam, - ): 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}}; - }, + {{> callAsync}} }; diff --git a/packages/contract_templates/partials/callAsync.handlebars b/packages/contract_templates/partials/callAsync.handlebars new file mode 100644 index 000000000..88cc49ffa --- /dev/null +++ b/packages/contract_templates/partials/callAsync.handlebars @@ -0,0 +1,29 @@ +{{#hasReturnValue}} +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 encodedData = self._ethersInterface.functions.{{this.name}}( + {{> params inputs=inputs}} + ).data; + const callData = await self._applyDefaultsToTxDataAsync( + { + data: encodedData, + } + ) + const rawCallResult = await self._web3Wrapper.callAsync(callData); + const outputAbi = _.find(this.abi, {name: '{{this.name}}'}).outputs as Web3.DataItem[]; + const outputParamsTypes = _.map(outputAbi, 'type'); + let resultArray = ethersContracts.Interface.decodeParams(outputParamsTypes, rawCallResult) as any; + resultArray = BaseContract._transformABIData(outputAbi, resultArray, BaseContract._lowercaseAddress.bind(this)); + return resultArray{{#singleReturnValue}}[0]{{/singleReturnValue}}; +}, +{{/hasReturnValue}} diff --git a/packages/contract_templates/partials/tx.handlebars b/packages/contract_templates/partials/tx.handlebars index 5026dac20..347a482d6 100644 --- a/packages/contract_templates/partials/tx.handlebars +++ b/packages/contract_templates/partials/tx.handlebars @@ -54,30 +54,5 @@ 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}}; - }, + {{> callAsync}} }; diff --git a/packages/contracts/globals.d.ts b/packages/contracts/globals.d.ts index fe39fb11d..beb3bfd8c 100644 --- a/packages/contracts/globals.d.ts +++ b/packages/contracts/globals.d.ts @@ -57,6 +57,7 @@ declare module 'ethers-contracts' { export class Interface { public functions: { [functionName: string]: FunctionDescription }; public events: { [eventName: string]: EventDescription }; + public static decodeParams(types: string[], data: string): any[]; constructor(abi: any); } } -- cgit v1.2.3