From 93b2736d6533f983aeb74005004de7f40eb35851 Mon Sep 17 00:00:00 2001 From: Leonid Logvinov Date: Fri, 23 Feb 2018 14:13:35 -0800 Subject: Use the same templates as 0x.js --- packages/contract_templates/contract.handlebars | 48 +++++++++++++ .../contract_templates/partials/call.handlebars | 23 ++++++ .../contract_templates/partials/event.handlebars | 5 ++ .../contract_templates/partials/params.handlebars | 3 + .../partials/return_type.handlebars | 10 +++ packages/contract_templates/partials/tx.handlebars | 83 ++++++++++++++++++++++ .../partials/typed_params.handlebars | 3 + 7 files changed, 175 insertions(+) create mode 100644 packages/contract_templates/contract.handlebars create mode 100644 packages/contract_templates/partials/call.handlebars create mode 100644 packages/contract_templates/partials/event.handlebars create mode 100644 packages/contract_templates/partials/params.handlebars create mode 100644 packages/contract_templates/partials/return_type.handlebars create mode 100644 packages/contract_templates/partials/tx.handlebars create mode 100644 packages/contract_templates/partials/typed_params.handlebars (limited to 'packages/contract_templates') diff --git a/packages/contract_templates/contract.handlebars b/packages/contract_templates/contract.handlebars new file mode 100644 index 000000000..2954145a7 --- /dev/null +++ b/packages/contract_templates/contract.handlebars @@ -0,0 +1,48 @@ +/** + * 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/0x.js/contract_templates. + */ +// tslint:disable: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 { Web3Wrapper } from '@0xproject/web3-wrapper'; +import * as ethersContracts from 'ethers-contracts'; +import * as _ from 'lodash'; +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}} + +// tslint:disable:no-parameter-reassignment +export class {{contractName}}Contract extends BaseContract { +{{#each methods}} + {{#this.constant}} + {{> call contractName=../contractName}} + {{/this.constant}} + {{^this.constant}} + {{> tx contractName=../contractName}} + {{/this.constant}} +{{/each}} + constructor(web3Wrapper: Web3Wrapper, abi: Web3.ContractAbi, address: string) { + super(web3Wrapper, abi, address); + classUtils.bindAll(this, ['_ethersInterface', '_address', '_abi', '_web3Wrapper']); + } +} // tslint:disable:max-file-line-count diff --git a/packages/contract_templates/partials/call.handlebars b/packages/contract_templates/partials/call.handlebars new file mode 100644 index 000000000..7ac3e1ee3 --- /dev/null +++ b/packages/contract_templates/partials/call.handlebars @@ -0,0 +1,23 @@ +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}}; + }, +}; diff --git a/packages/contract_templates/partials/event.handlebars b/packages/contract_templates/partials/event.handlebars new file mode 100644 index 000000000..3c6100e4f --- /dev/null +++ b/packages/contract_templates/partials/event.handlebars @@ -0,0 +1,5 @@ +export interface {{name}}ContractEventArgs { + {{#each inputs}} + {{name}}: {{#returnType type components}}{{/returnType}}; + {{/each}} +} diff --git a/packages/contract_templates/partials/params.handlebars b/packages/contract_templates/partials/params.handlebars new file mode 100644 index 000000000..ac5d4ae85 --- /dev/null +++ b/packages/contract_templates/partials/params.handlebars @@ -0,0 +1,3 @@ +{{#each inputs}} +{{name}}, +{{/each}} diff --git a/packages/contract_templates/partials/return_type.handlebars b/packages/contract_templates/partials/return_type.handlebars new file mode 100644 index 000000000..9dd509953 --- /dev/null +++ b/packages/contract_templates/partials/return_type.handlebars @@ -0,0 +1,10 @@ +{{#if outputs.length}} +{{#singleReturnValue}} +{{#returnType outputs.0.type components}}{{/returnType}} +{{/singleReturnValue}} +{{^singleReturnValue}} +[{{#each outputs}}{{#returnType type components}}{{/returnType}}{{#unless @last}}, {{/unless}}{{/each}}] +{{/singleReturnValue}} +{{else}} +void +{{/if}} diff --git a/packages/contract_templates/partials/tx.handlebars b/packages/contract_templates/partials/tx.handlebars new file mode 100644 index 000000000..5026dac20 --- /dev/null +++ b/packages/contract_templates/partials/tx.handlebars @@ -0,0 +1,83 @@ +public {{this.name}} = { + async sendTransactionAsync( + {{> typed_params inputs=inputs}} + {{#this.payable}} + txData: TxDataPayable = {}, + {{/this.payable}} + {{^this.payable}} + txData: TxData = {}, + {{/this.payable}} + ): Promise { + 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 = this._ethersInterface.functions.{{this.name}}( + {{> params inputs=inputs}} + ).data + const txDataWithDefaults = await self._applyDefaultsToTxDataAsync( + { + ...txData, + data: encodedData, + }, + self.{{this.name}}.estimateGasAsync.bind( + self, + {{> params inputs=inputs}} + ), + ); + const txHash = await this._web3Wrapper.sendTransactionAsync(txDataWithDefaults); + return txHash; + }, + async estimateGasAsync( + {{> typed_params inputs=inputs}} + txData: TxData = {}, + ): Promise { + const self = this as {{contractName}}Contract; + const encodedData = this._ethersInterface.functions.{{this.name}}( + {{> params inputs=inputs}} + ).data + const txDataWithDefaults = await self._applyDefaultsToTxDataAsync( + { + ...txData, + data: encodedData, + } + ); + const gas = await this._web3Wrapper.estimateGasAsync(txDataWithDefaults); + return gas; + }, + getABIEncodedTransactionData( + {{> typed_params inputs=inputs}} + txData: TxData = {}, + ): string { + const self = this as {{contractName}}Contract; + const abiEncodedTransactionData = this._ethersInterface.functions.{{this.name}}( + {{> params inputs=inputs}} + ).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}}; + }, +}; diff --git a/packages/contract_templates/partials/typed_params.handlebars b/packages/contract_templates/partials/typed_params.handlebars new file mode 100644 index 000000000..c100e58f7 --- /dev/null +++ b/packages/contract_templates/partials/typed_params.handlebars @@ -0,0 +1,3 @@ +{{#each inputs}} + {{name}}: {{#parameterType type components}}{{/parameterType}}, +{{/each}} -- cgit v1.2.3 From 4e451479f8db6ef459f4d4c6f7935c20f9d6ea09 Mon Sep 17 00:00:00 2001 From: Leonid Logvinov Date: Fri, 23 Feb 2018 14:56:05 -0800 Subject: Fix build --- packages/contract_templates/contract.handlebars | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'packages/contract_templates') diff --git a/packages/contract_templates/contract.handlebars b/packages/contract_templates/contract.handlebars index 2954145a7..4b8b30056 100644 --- a/packages/contract_templates/contract.handlebars +++ b/packages/contract_templates/contract.handlebars @@ -43,6 +43,6 @@ export class {{contractName}}Contract extends BaseContract { {{/each}} constructor(web3Wrapper: Web3Wrapper, abi: Web3.ContractAbi, address: string) { super(web3Wrapper, abi, address); - classUtils.bindAll(this, ['_ethersInterface', '_address', '_abi', '_web3Wrapper']); + classUtils.bindAll(this, ['_ethersInterface', 'address', 'abi', '_web3Wrapper']); } } // tslint:disable:max-file-line-count -- cgit v1.2.3 From 2aec1501d03085e85fc5a73da3a44481de2dc6b3 Mon Sep 17 00:00:00 2001 From: Leonid Logvinov Date: Mon, 26 Feb 2018 09:54:00 -0800 Subject: Update template link --- packages/contract_templates/contract.handlebars | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'packages/contract_templates') diff --git a/packages/contract_templates/contract.handlebars b/packages/contract_templates/contract.handlebars index 4b8b30056..f03bdb504 100644 --- a/packages/contract_templates/contract.handlebars +++ b/packages/contract_templates/contract.handlebars @@ -1,6 +1,6 @@ /** * 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/0x.js/contract_templates. + * Templates can be found at https://github.com/0xProject/0x.js/tree/development/packages/contract_templates. */ // tslint:disable:no-consecutive-blank-lines // tslint:disable-next-line:no-unused-variable -- cgit v1.2.3 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 --- .../contract_templates/partials/call.handlebars | 22 +--------------- .../partials/callAsync.handlebars | 29 ++++++++++++++++++++++ packages/contract_templates/partials/tx.handlebars | 27 +------------------- 3 files changed, 31 insertions(+), 47 deletions(-) create mode 100644 packages/contract_templates/partials/callAsync.handlebars (limited to 'packages/contract_templates') 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}} }; -- cgit v1.2.3 From ef40cb96876cb77e897be441ceff1ca1521dc682 Mon Sep 17 00:00:00 2001 From: Leonid Logvinov Date: Mon, 26 Feb 2018 17:04:19 -0800 Subject: Add txData to async calls --- packages/contract_templates/partials/callAsync.handlebars | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) (limited to 'packages/contract_templates') diff --git a/packages/contract_templates/partials/callAsync.handlebars b/packages/contract_templates/partials/callAsync.handlebars index 88cc49ffa..93d347145 100644 --- a/packages/contract_templates/partials/callAsync.handlebars +++ b/packages/contract_templates/partials/callAsync.handlebars @@ -7,6 +7,7 @@ async callAsync( {{^this.payable}} txData: TxData = {}, {{/this.payable}} + defaultBlock?: Web3.BlockParam, ): Promise<{{> return_type outputs=outputs}}> { const self = this as {{contractName}}Contract; const inputAbi = _.find(this.abi, {name: '{{this.name}}'}).inputs; @@ -19,7 +20,7 @@ async callAsync( data: encodedData, } ) - const rawCallResult = await self._web3Wrapper.callAsync(callData); + const rawCallResult = await self._web3Wrapper.callAsync(callData, defaultBlock); 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; -- cgit v1.2.3 From 8fe844bcc9e4298cc3ced58c1abcee78de4193b3 Mon Sep 17 00:00:00 2001 From: Leonid Logvinov Date: Tue, 27 Feb 2018 12:01:12 -0800 Subject: Move BaseContract to web3Wrapper --- packages/contract_templates/contract.handlebars | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) (limited to 'packages/contract_templates') diff --git a/packages/contract_templates/contract.handlebars b/packages/contract_templates/contract.handlebars index f03bdb504..b5c2dd9f2 100644 --- a/packages/contract_templates/contract.handlebars +++ b/packages/contract_templates/contract.handlebars @@ -6,13 +6,11 @@ // tslint:disable-next-line:no-unused-variable import { TxData, TxDataPayable } from '@0xproject/types'; import { BigNumber, classUtils, promisify } from '@0xproject/utils'; -import { Web3Wrapper } from '@0xproject/web3-wrapper'; +import { BaseContract, Web3Wrapper } from '@0xproject/web3-wrapper'; import * as ethersContracts from 'ethers-contracts'; import * as _ from 'lodash'; import * as Web3 from 'web3'; -import {BaseContract} from './base_contract'; - {{#if events}} export type {{contractName}}ContractEventArgs = {{#each events}} -- cgit v1.2.3