From 8031e011f929456a15d3c29c84289788f895b716 Mon Sep 17 00:00:00 2001 From: alexcos20 Date: Sun, 31 May 2020 00:25:33 -0700 Subject: [PATCH 1/2] fixes & datatokens class --- package-lock.json | 18 +-- package.json | 1 + src/Instantiable.abstract.ts | 2 - src/datatokens/Datatokens.ts | 150 ++++++++++++++++++++++--- src/datatokens/DatatokensABI.json | 1 + src/datatokens/DatatokensABI.ts | 1 - src/datatokens/FactoryABI.json | 1 + src/datatokens/FactoryABI.ts | 1 - src/models/Config.ts | 8 +- src/ocean/utils/WebServiceConnector.ts | 2 +- 10 files changed, 147 insertions(+), 38 deletions(-) create mode 100644 src/datatokens/DatatokensABI.json delete mode 100644 src/datatokens/DatatokensABI.ts create mode 100644 src/datatokens/FactoryABI.json delete mode 100644 src/datatokens/FactoryABI.ts diff --git a/package-lock.json b/package-lock.json index a333356a1..46f355aa7 100644 --- a/package-lock.json +++ b/package-lock.json @@ -556,19 +556,6 @@ "fastq": "^1.6.0" } }, - "@oceanprotocol/keeper-contracts": { - "version": "0.13.2", - "resolved": "https://registry.npmjs.org/@oceanprotocol/keeper-contracts/-/keeper-contracts-0.13.2.tgz", - "integrity": "sha512-915dcnzCHEuvsmRKqVj0RxHT3T386lSJh8WREe4dsnrXHsi1ULNYxX0Ts/cvalv6bRL+aqyaZ6gN3l3nkfwEDg==" - }, - "@oceanprotocol/secret-store-client": { - "version": "0.0.15", - "resolved": "https://registry.npmjs.org/@oceanprotocol/secret-store-client/-/secret-store-client-0.0.15.tgz", - "integrity": "sha512-5yNNA+qdjut9/nMiFKJd4D4io+GhzdfvdqVd5YMkgT9RV1qDosGj6NVsKArYay6g+tQH7pCJ6Y1FiAbhaaFB9g==", - "requires": { - "node-fetch": "^2.6.0" - } - }, "@octokit/auth-token": { "version": "2.4.1", "resolved": "https://registry.npmjs.org/@octokit/auth-token/-/auth-token-2.4.1.tgz", @@ -6771,6 +6758,11 @@ "integrity": "sha512-33X7H/wdfO99GdRLLgkjUrD4geAFdq/Uv0kl3HD4da6HDixd2GUg8Mw7dahLCV9r/EARkmtYBB6Tch4EEokFTQ==", "dev": true }, + "fs": { + "version": "0.0.1-security", + "resolved": "https://registry.npmjs.org/fs/-/fs-0.0.1-security.tgz", + "integrity": "sha1-invTcYa23d84E/I4WLV+yq9eQdQ=" + }, "fs-constants": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/fs-constants/-/fs-constants-1.0.0.tgz", diff --git a/package.json b/package.json index a04aac187..b68fd277d 100644 --- a/package.json +++ b/package.json @@ -36,6 +36,7 @@ "@ethereum-navigator/navigator": "^0.5.0", "bignumber.js": "^9.0.0", "deprecated-decorator": "^0.1.6", + "fs": "0.0.1-security", "node-fetch": "^2.6.0", "save-file": "^2.3.1", "uuid": "^8.0.0", diff --git a/src/Instantiable.abstract.ts b/src/Instantiable.abstract.ts index d38a0c9ed..f6803ea25 100644 --- a/src/Instantiable.abstract.ts +++ b/src/Instantiable.abstract.ts @@ -2,8 +2,6 @@ import Web3 from 'web3' import Config from './models/Config' import { Logger, LoggerInstance, LogLevel } from './utils' import { Ocean } from './ocean/Ocean' -import { OceanFactoryABI } from './datatokens/FactoryABI' -import { OceanDataTokenABI } from './datatokens/DatatokensABI' export interface InstantiableConfig { ocean: Ocean diff --git a/src/datatokens/Datatokens.ts b/src/datatokens/Datatokens.ts index 6adab2138..1d2213c08 100644 --- a/src/datatokens/Datatokens.ts +++ b/src/datatokens/Datatokens.ts @@ -1,5 +1,8 @@ import Account from '../ocean/Account' +const defaultFactoryABI = require('../datatokens/FactoryABI.json') +const defaultDatatokensABI = require('../datatokens/DatatokensABI.json') + /** * Provides a interface to DataTokens @@ -25,8 +28,9 @@ export class DataTokens { web3: any ) { this.factoryAddress = factoryAddress - this.factoryABI = factoryABI - this.datatokensABI = datatokensABI + + this.factoryABI = factoryABI || defaultFactoryABI + this.datatokensABI = datatokensABI || defaultDatatokensABI this.web3 = web3 } @@ -34,11 +38,37 @@ export class DataTokens { * Create new datatoken * @param {String} metaDataStoreURI * @param {Account} account + * @param {String} name + * @param {String} symbol + * @param {Number} cap * @return {Promise} datatoken address */ - public async create(metaDataStoreURI: string, account: Account): Promise { - // TO DO - return '' + public async create( + metaDataStoreURI: string, + account: Account, + name?: string, + symbol?: string, + cap?: number + ): Promise { + // TODO - Autogenerate name, symbol & cap if missing + if (!name) name = 'DTTest1' + if (!symbol) symbol = 'DT1' + if (!cap) cap = 1000000 + // Create factory contract object + const factory = new this.web3.eth.Contract(this.factoryABI, this.factoryAddress, { + from: account.getId() + }) + // Invoke createToken function of the contract + const trxReceipt = await factory.methods + .createToken(name, symbol, cap, metaDataStoreURI, account.getId()) + .send() + let tokenAddress = null + try { + tokenAddress = trxReceipt.events.TokenCreated.returnValues[0] + } catch (e) { + console.error(e) + } + return tokenAddress } /** @@ -51,12 +81,17 @@ export class DataTokens { */ public async approve( dataTokenAddress: string, - toAddress: string, + spender: string, amount: number, account: Account ): Promise { - // TO DO - return '' + const datatoken = new this.web3.eth.Contract( + this.datatokensABI, + dataTokenAddress, + { from: account.getId() } + ) + const trxReceipt = await datatoken.methods.approve(spender, amount).send() + return trxReceipt } /** @@ -93,8 +128,14 @@ export class DataTokens { amount: number, toAddress?: string ): Promise { - // TO DO - return '' + const address = toAddress || account.getId() + const datatoken = new this.web3.eth.Contract( + this.datatokensABI, + dataTokenAddress, + { from: account.getId() } + ) + const trxReceipt = await datatoken.methods.mint(address, amount).send() + return trxReceipt } /** @@ -111,8 +152,13 @@ export class DataTokens { amount: number, account: Account ): Promise { - // TO DO - return '' + const datatoken = new this.web3.eth.Contract( + this.datatokensABI, + dataTokenAddress, + { from: account.getId() } + ) + const trxReceipt = await datatoken.methods.transfer(toAddress, amount).send() + return trxReceipt } /** @@ -129,8 +175,15 @@ export class DataTokens { amount: number, account: Account ): Promise { - // TO DO - return '' + const datatoken = new this.web3.eth.Contract( + this.datatokensABI, + dataTokenAddress, + { from: account.getId() } + ) + const trxReceipt = await datatoken.methods + .transferFrom(fromAddress, account.getId(), amount) + .send() + return trxReceipt } /** @@ -140,7 +193,72 @@ export class DataTokens { * @return {Promise} balance */ public async balance(dataTokenAddress: string, account: Account): Promise { - // TO DO - return 0 + const datatoken = new this.web3.eth.Contract( + this.datatokensABI, + dataTokenAddress, + { from: account.getId() } + ) + const trxReceipt = await datatoken.methods.balanceOf(account.getId()).call() + return trxReceipt + } + + /** Get Blob + * @param {String} dataTokenAddress + * @param {Account} account + * @return {Promise} string + */ + public async getBlob(dataTokenAddress: string, account: Account): Promise { + const datatoken = new this.web3.eth.Contract( + this.datatokensABI, + dataTokenAddress, + { from: account.getId() } + ) + const trxReceipt = await datatoken.methods.blob().call() + return trxReceipt + } + + /** Get Name + * @param {String} dataTokenAddress + * @param {Account} account + * @return {Promise} string + */ + public async getName(dataTokenAddress: string, account: Account): Promise { + const datatoken = new this.web3.eth.Contract( + this.datatokensABI, + dataTokenAddress, + { from: account.getId() } + ) + const trxReceipt = await datatoken.methods.name().call() + return trxReceipt + } + + /** Get Symbol + * @param {String} dataTokenAddress + * @param {Account} account + * @return {Promise} string + */ + public async getSymbol(dataTokenAddress: string, account: Account): Promise { + const datatoken = new this.web3.eth.Contract( + this.datatokensABI, + dataTokenAddress, + { from: account.getId() } + ) + const trxReceipt = await datatoken.methods.symbol().call() + return trxReceipt + } + + /** Get Cap + * @param {String} dataTokenAddress + * @param {Account} account + * @return {Promise} string + */ + public async getCap(dataTokenAddress: string, account: Account): Promise { + const datatoken = new this.web3.eth.Contract( + this.datatokensABI, + dataTokenAddress, + { from: account.getId() } + ) + const trxReceipt = await datatoken.methods.cap().call() + return trxReceipt } } diff --git a/src/datatokens/DatatokensABI.json b/src/datatokens/DatatokensABI.json new file mode 100644 index 000000000..cea8f5faf --- /dev/null +++ b/src/datatokens/DatatokensABI.json @@ -0,0 +1 @@ +[{"constant":false,"inputs":[{"name":"spender","type":"address"},{"name":"value","type":"uint256"}],"name":"approve","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"totalSupply","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"from","type":"address"},{"name":"to","type":"address"},{"name":"value","type":"uint256"}],"name":"transferFrom","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"spender","type":"address"},{"name":"addedValue","type":"uint256"}],"name":"increaseAllowance","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"account","type":"address"}],"name":"balanceOf","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"spender","type":"address"},{"name":"subtractedValue","type":"uint256"}],"name":"decreaseAllowance","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"to","type":"address"},{"name":"value","type":"uint256"}],"name":"transfer","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"owner","type":"address"},{"name":"spender","type":"address"}],"name":"allowance","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"inputs":[{"name":"name","type":"string"},{"name":"symbol","type":"string"},{"name":"minter","type":"address"},{"name":"cap","type":"uint256"},{"name":"blob","type":"string"},{"name":"feeManager","type":"address"}],"payable":false,"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"name":"from","type":"address"},{"indexed":true,"name":"to","type":"address"},{"indexed":false,"name":"value","type":"uint256"}],"name":"Transfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"owner","type":"address"},{"indexed":true,"name":"spender","type":"address"},{"indexed":false,"name":"value","type":"uint256"}],"name":"Approval","type":"event"},{"constant":false,"inputs":[{"name":"name","type":"string"},{"name":"symbol","type":"string"},{"name":"minter","type":"address"},{"name":"cap","type":"uint256"},{"name":"blob","type":"string"},{"name":"feeManager","type":"address"}],"name":"initialize","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"account","type":"address"},{"name":"value","type":"uint256"}],"name":"mint","outputs":[],"payable":true,"stateMutability":"payable","type":"function"},{"constant":false,"inputs":[],"name":"pause","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[],"name":"unpause","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"minter","type":"address"}],"name":"setMinter","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"name","outputs":[{"name":"","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"symbol","outputs":[{"name":"","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"blob","outputs":[{"name":"","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"decimals","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"cap","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"account","type":"address"}],"name":"isMinter","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"isInitialized","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"isPaused","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"}] \ No newline at end of file diff --git a/src/datatokens/DatatokensABI.ts b/src/datatokens/DatatokensABI.ts deleted file mode 100644 index a63a117a5..000000000 --- a/src/datatokens/DatatokensABI.ts +++ /dev/null @@ -1 +0,0 @@ -export const OceanDataTokenABI = {} diff --git a/src/datatokens/FactoryABI.json b/src/datatokens/FactoryABI.json new file mode 100644 index 000000000..80d740515 --- /dev/null +++ b/src/datatokens/FactoryABI.json @@ -0,0 +1 @@ +[{"inputs":[{"name":"_template","type":"address"},{"name":"_feeManager","type":"address"}],"payable":false,"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":false,"name":"newTokenAddress","type":"address"},{"indexed":false,"name":"templateAddress","type":"address"},{"indexed":false,"name":"tokenName","type":"string"}],"name":"TokenCreated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"tokenAddress","type":"address"},{"indexed":true,"name":"tokenName","type":"string"},{"indexed":true,"name":"tokenSymbol","type":"string"},{"indexed":false,"name":"tokenCap","type":"uint256"},{"indexed":false,"name":"RegisteredBy","type":"address"},{"indexed":false,"name":"RegisteredAt","type":"uint256"},{"indexed":false,"name":"blob","type":"string"}],"name":"TokenRegistered","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"instance","type":"address"}],"name":"InstanceDeployed","type":"event"},{"constant":false,"inputs":[{"name":"_name","type":"string"},{"name":"_symbol","type":"string"},{"name":"_cap","type":"uint256"},{"name":"_blob","type":"string"},{"name":"_minter","type":"address"}],"name":"createToken","outputs":[{"name":"token","type":"address"}],"payable":false,"stateMutability":"nonpayable","type":"function"}] \ No newline at end of file diff --git a/src/datatokens/FactoryABI.ts b/src/datatokens/FactoryABI.ts deleted file mode 100644 index 1b8d11b42..000000000 --- a/src/datatokens/FactoryABI.ts +++ /dev/null @@ -1 +0,0 @@ -export const OceanFactoryABI = {} diff --git a/src/models/Config.ts b/src/models/Config.ts index 91ff3277c..86407d991 100644 --- a/src/models/Config.ts +++ b/src/models/Config.ts @@ -6,13 +6,13 @@ export class Config { * Aquarius URL. * @type {string} */ - public aquariusUri: string + public aquariusUri?: string /** * Brizo URL. * @type {string} */ - public brizoUri: string + public brizoUri?: string /** * Web3 Provider. @@ -30,13 +30,13 @@ export class Config { * Factory ABI * @type {string} */ - public factoryABI: object + public factoryABI?: object /** * datatokens ABI * @type {string} */ - public datatokensABI: object + public datatokensABI?: object /** * Log level. diff --git a/src/ocean/utils/WebServiceConnector.ts b/src/ocean/utils/WebServiceConnector.ts index 49d913708..e0c8e2dab 100644 --- a/src/ocean/utils/WebServiceConnector.ts +++ b/src/ocean/utils/WebServiceConnector.ts @@ -1,5 +1,5 @@ import { BodyInit, RequestInit, Response } from 'node-fetch' -import fs from 'fs' +import * as fs from 'fs' import { Logger } from '../../utils' const fetch = require('node-fetch') From 6ea69451efde1f615e60b15e24730bcfdfbb8370 Mon Sep 17 00:00:00 2001 From: alexcos20 Date: Sun, 31 May 2020 00:41:58 -0700 Subject: [PATCH 2/2] fix simple create flow --- src/ocean/Assets.ts | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/ocean/Assets.ts b/src/ocean/Assets.ts index c6d2d9647..88185155b 100644 --- a/src/ocean/Assets.ts +++ b/src/ocean/Assets.ts @@ -52,7 +52,8 @@ export class Assets extends Instantiable { const publisherURI = this.ocean.brizo.getURI() const jsonBlob = { t: 0, url: publisherURI } const { datatokens } = this.ocean - return datatokens.create(JSON.stringify(jsonBlob), publisher) + return datatokens.create( JSON.stringify(jsonBlob), publisher) + } /** @@ -79,7 +80,7 @@ export class Assets extends Instantiable { const metadataStoreURI = this.ocean.aquarius.getURI() const jsonBlob = { t: 1, url: metadataStoreURI } const { datatokens } = this.ocean - dtAddress = await datatokens.create(JSON.stringify(jsonBlob), publisher) + dtAddress = await datatokens.create({ metaDataStoreURI: JSON.stringify(jsonBlob), account: publisher }) this.logger.log('DataToken creted') observer.next(CreateProgressStep.DataTokenCreated) }