From 92e94c53a388aea7a1e21a0ea10b3ffdc7331bda Mon Sep 17 00:00:00 2001 From: Bogdan Fazakas Date: Mon, 1 Nov 2021 11:55:02 +0200 Subject: [PATCH] added erc20 enterprise methods --- src/datatokens/Datatoken.ts | 166 +++++++++++++++++++++++++++++++++++- 1 file changed, 164 insertions(+), 2 deletions(-) diff --git a/src/datatokens/Datatoken.ts b/src/datatokens/Datatoken.ts index b0a48086..58712f21 100644 --- a/src/datatokens/Datatoken.ts +++ b/src/datatokens/Datatoken.ts @@ -2,6 +2,7 @@ import Web3 from 'web3' import { AbiItem } from 'web3-utils' import { TransactionReceipt } from 'web3-eth' import defaultDatatokensABI from '@oceanprotocol/contracts/artifacts/contracts/templates/ERC20Template.sol/ERC20Template.json' +import defaultDatatokensEnterpriseABI from '@oceanprotocol/contracts/artifacts/contracts/templates/ERC20TemplateEnterpise.sol/ERC20TemplateEnterpise.json' import Decimal from 'decimal.js' import { LoggerInstance, getFairGasPrice } from '../utils' import { Contract } from 'web3-eth-contract' @@ -14,22 +15,45 @@ interface Roles { feeManager: boolean } +interface OrderParams { + consumer: string + amount: string + serviceId: number + consumeFeeAddress: string + consumeFeeToken: string + consumeFeeAmount: string +} + +interface FreParams { + exchangeContract: string + exchangeId: string + maxBaseTokenAmount: string +} + export class Datatoken { public GASLIMIT_DEFAULT = 1000000 public factoryAddress: string public factoryABI: AbiItem | AbiItem[] public datatokensABI: AbiItem | AbiItem[] + public datatokensEnterpriseABI: AbiItem | AbiItem[] public web3: Web3 public startBlock: number /** - * Instantiate ERC20 DataTokens (independently of Ocean). + * Instantiate ERC20 DataTokens * @param {AbiItem | AbiItem[]} datatokensABI * @param {Web3} web3 */ - constructor(web3: Web3, datatokensABI?: AbiItem | AbiItem[], startBlock?: number) { + constructor( + web3: Web3, + datatokensABI?: AbiItem | AbiItem[], + datatokensEnterpriseABI?: AbiItem | AbiItem[], + startBlock?: number + ) { this.web3 = web3 this.datatokensABI = datatokensABI || (defaultDatatokensABI.abi as AbiItem[]) + this.datatokensEnterpriseABI = + datatokensEnterpriseABI || (defaultDatatokensEnterpriseABI.abi as AbiItem[]) this.startBlock = startBlock || 0 } @@ -879,6 +903,144 @@ export class Datatoken { } } + /** Estimate gas cost for buyFromFreAndOrder method + * @param {String} dtAddress Datatoken address + * @param {String} address User address which calls + * @param {OrderParams} orderParams Consumer Address + * @param {FreParams} freParams Amount of tokens that is going to be transfered + * @param {Contract} contractInstance optional contract instance + * @return {Promise} + */ + public async estGasBuyFromFreAndOrder( + dtAddress: string, + address: string, + orderParams: OrderParams, + freParams: FreParams, + contractInstance?: Contract + ): Promise { + const dtContract = + contractInstance || + new this.web3.eth.Contract(this.datatokensEnterpriseABI, dtAddress) + + // Estimate gas for startOrder method + const gasLimitDefault = this.GASLIMIT_DEFAULT + let estGas + try { + estGas = await dtContract.methods + .buyFromFreAndOrder(orderParams, freParams) + .estimateGas({ from: address }, (err, estGas) => (err ? gasLimitDefault : estGas)) + } catch (e) { + estGas = gasLimitDefault + } + return estGas + } + + /** Buys 1 DT from the FRE and then startsOrder, while burning that DT + * @param {String} dtAddress Datatoken address + * @param {String} address User address which calls + * @param {OrderParams} orderParams Consumer Address + * @param {FreParams} freParams Amount of tokens that is going to be transfered + * @return {Promise} + */ + public async buyFromFreAndOrder( + dtAddress: string, + address: string, + orderParams: OrderParams, + freParams: FreParams + ): Promise { + const dtContract = new this.web3.eth.Contract(this.datatokensEnterpriseABI, dtAddress) + try { + const estGas = await this.estGasBuyFromFreAndOrder( + dtAddress, + address, + orderParams, + freParams, + dtContract + ) + + const trxReceipt = await dtContract.methods + .buyFromFreAndOrder(orderParams, freParams) + .send({ + from: address, + gas: estGas + 1, + gasPrice: await getFairGasPrice(this.web3) + }) + return trxReceipt + } catch (e) { + LoggerInstance.error(`ERROR: Failed to buy DT From Fre And Order : ${e.message}`) + throw new Error(`Failed to buy DT From Fre And Order: ${e.message}`) + } + } + + /** Estimate gas cost for buyFromFreAndOrder method + * @param {String} dtAddress Datatoken address + * @param {String} address User address which calls + * @param {OrderParams} orderParams + * @param {String} dispenserContract + * @param {Contract} contractInstance optional contract instance + * @return {Promise} + */ + public async estGasBuyFromDispenserAndOrder( + dtAddress: string, + address: string, + orderParams: OrderParams, + dispenserContract: string, + contractInstance?: Contract + ): Promise { + const dtContract = + contractInstance || + new this.web3.eth.Contract(this.datatokensEnterpriseABI, dtAddress) + + // Estimate gas for startOrder method + const gasLimitDefault = this.GASLIMIT_DEFAULT + let estGas + try { + estGas = await dtContract.methods + .buyFromDispenserAndOrder(orderParams, dispenserContract) + .estimateGas({ from: address }, (err, estGas) => (err ? gasLimitDefault : estGas)) + } catch (e) { + estGas = gasLimitDefault + } + return estGas + } + + /** Gets DT from dispenser and then startsOrder, while burning that DT + * @param {String} dtAddress Datatoken address + * @param {String} address User address which calls + * @param {OrderParams} orderParams + * @param {String} dispenserContract + * @return {Promise} + */ + public async buyFromDispenserAndOrder( + dtAddress: string, + address: string, + orderParams: OrderParams, + dispenserContract: string + ): Promise { + const dtContract = new this.web3.eth.Contract(this.datatokensEnterpriseABI, dtAddress) + try { + const estGas = await this.estGasBuyFromDispenserAndOrder( + dtAddress, + address, + orderParams, + dispenserContract, + dtContract + ) + + const trxReceipt = await dtContract.methods + .buyFromDispenserAndOrder(orderParams, dispenserContract) + .send({ + from: address, + gas: estGas + 1, + gasPrice: await getFairGasPrice(this.web3) + }) + return trxReceipt + } catch (e) { + LoggerInstance.error(`ERROR: Failed to buy DT From Fre And Order : ${e.message}`) + throw new Error(`Failed to buy DT From Fre And Order: ${e.message}`) + } + } + /** Estimate gas for setData method * @param {String} dtAddress Datatoken address * @param {String} address User address