diff --git a/src/contracts/Datatoken.ts b/src/contracts/Datatoken.ts index efcfa47c..aaaa8da7 100644 --- a/src/contracts/Datatoken.ts +++ b/src/contracts/Datatoken.ts @@ -30,8 +30,11 @@ export class Datatoken extends SmartContract { /** * Instantiate ERC20 Datatokens - * @param {AbiItem | AbiItem[]} datatokensAbi - * @param {Web3} web3 + * @param {Signer} signer + * @param {string | number} network optional network name or chain id + * @param {Config} config optional config object + * @param {AbiItem[]} abi optional abi + * @param {AbiItem[]} abiEnterprise optional enterprise abi */ constructor( signer: Signer, diff --git a/src/contracts/SmartContractWithAddress.ts b/src/contracts/SmartContractWithAddress.ts index 2a9e78fe..48b2a836 100644 --- a/src/contracts/SmartContractWithAddress.ts +++ b/src/contracts/SmartContractWithAddress.ts @@ -1,9 +1,4 @@ -// import Web3 from 'web3' -// import { Contract } from 'web3-eth-contract' -// import { AbiItem } from 'web3-utils' - import { Signer, Contract, ContractFunction } from 'ethers' -import { Interface } from 'ethers/lib/utils' import { AbiItem } from '../@types' import { Config } from '../config' import { SmartContract } from './SmartContract' diff --git a/src/utils/ContractUtils.ts b/src/utils/ContractUtils.ts index 3e7df36d..a3c41bc4 100644 --- a/src/utils/ContractUtils.ts +++ b/src/utils/ContractUtils.ts @@ -72,9 +72,9 @@ export function getEventFromTx(txReceipt, eventName) { /** * Send the transation on chain - * @param {string} from account that calls the function - * @param {any} estGas estimated gas for the transaction - * @param {Web3} web3 web3 objcet + * @param {BigNumber} estGas estimated gas for the transaction + * @param {Signer} signer signer object + * @param {number} gasFeeMultiplier number represinting the multiplier we apply to gas fees * @param {Function} functionToSend function that we need to send * @param {...any[]} args arguments of the function * @return {Promise} transaction receipt diff --git a/src/utils/DdoHelpers.ts b/src/utils/DdoHelpers.ts index 00674e5f..dd066fc4 100644 --- a/src/utils/DdoHelpers.ts +++ b/src/utils/DdoHelpers.ts @@ -1,8 +1,8 @@ import sha256 from 'crypto-js/sha256' -import Web3 from 'web3' +import { ethers } from 'ethers' export function generateDid(nftAddress: string, chainId: number): string { - nftAddress = Web3.utils.toChecksumAddress(nftAddress) + nftAddress = ethers.utils.getAddress(nftAddress) const checksum = sha256(nftAddress + chainId.toString(10)) return `did:op:${checksum.toString()}` } diff --git a/src/utils/SignatureUtils.ts b/src/utils/SignatureUtils.ts index 3742097c..a24c6f1b 100644 --- a/src/utils/SignatureUtils.ts +++ b/src/utils/SignatureUtils.ts @@ -1,13 +1,19 @@ -import Web3 from 'web3' +import { ethers, Signer, providers } from 'ethers' -export async function signHash(web3: Web3, message: string, address: string) { - let signedMessage = await web3.eth.sign(message, address) +export async function signHash(signer: Signer, message: string) { + /* Since ganache has no support yet for personal_sign, we must use the legacy implementation + const signedMessage = await user2.signMessage(message) + */ + const messageHashBytes = ethers.utils.arrayify(message) + let signedMessage = await (signer as providers.JsonRpcSigner)._legacySignMessage( + messageHashBytes + ) signedMessage = signedMessage.substr(2) // remove 0x const r = '0x' + signedMessage.slice(0, 64) const s = '0x' + signedMessage.slice(64, 128) let v = '0x' + signedMessage.slice(128, 130) - // make sure we obey 27 and 28 standards if (v === '0x00') v = '0x1b' if (v === '0x01') v = '0x1c' + return { v, r, s } } diff --git a/src/utils/TokenUtils.ts b/src/utils/TokenUtils.ts index 6935e4b8..3325e179 100644 --- a/src/utils/TokenUtils.ts +++ b/src/utils/TokenUtils.ts @@ -3,7 +3,6 @@ import { ethers, Signer, BigNumber } from 'ethers' import { amountToUnits, unitsToAmount, minAbi, sendTx, LoggerInstance } from '.' import { Config } from '../config' import { ReceiptOrEstimate, ReceiptOrDecimal } from '../@types' -// import { AbiItem } from 'web3-utils' /** * Approve spender to spent amount tokens diff --git a/src/utils/minAbi.ts b/src/utils/minAbi.ts index e9772862..a005208b 100644 --- a/src/utils/minAbi.ts +++ b/src/utils/minAbi.ts @@ -1,4 +1,3 @@ -// import { AbiItem } from 'web3-utils/types' export const minAbi = [ { constant: true, diff --git a/test/TestContractHandler.ts b/test/TestContractHandler.ts deleted file mode 100644 index 800f8d0a..00000000 --- a/test/TestContractHandler.ts +++ /dev/null @@ -1,217 +0,0 @@ -import Web3 from 'web3' -import { AbiItem } from 'web3-utils/types' -import OPFCommunityFeeCollector from '@oceanprotocol/contracts/artifacts/contracts/communityFee/OPFCommunityFeeCollector.sol/OPFCommunityFeeCollector.json' -import ERC20Template from '@oceanprotocol/contracts/artifacts/contracts/templates/ERC20Template.sol/ERC20Template.json' -import ERC721Template from '@oceanprotocol/contracts/artifacts/contracts/templates/ERC721Template.sol/ERC721Template.json' -import MockERC20 from '@oceanprotocol/contracts/artifacts/contracts/utils/mock/MockERC20Decimals.sol/MockERC20Decimals.json' -import Router from '@oceanprotocol/contracts/artifacts/contracts/pools/FactoryRouter.sol/FactoryRouter.json' -import FixedRate from '@oceanprotocol/contracts/artifacts/contracts/pools/fixedRate/FixedRateExchange.sol/FixedRateExchange.json' -import Dispenser from '@oceanprotocol/contracts/artifacts/contracts/pools/dispenser/Dispenser.sol/Dispenser.json' -import ERC721Factory from '@oceanprotocol/contracts/artifacts/contracts/ERC721Factory.sol/ERC721Factory.json' -// delete this once removed from contracts -import PoolTemplate from '@oceanprotocol/contracts/artifacts/contracts/pools/balancer/BPool.sol/BPool.json' -import { getAddresses, GAS_PRICE } from './config' - -const estimateGasAndDeployContract = async ( - web3: Web3, - abi: AbiItem | AbiItem[], - bytecode: string, - argumentsArray: any[], - owner: string -) => { - const contract = new web3.eth.Contract(abi) - // get est gascost - const estimatedGas = await contract - .deploy({ - data: bytecode, - arguments: argumentsArray - }) - .estimateGas(function (err, estimatedGas) { - if (err) console.log('DeployContracts: ' + err) - return estimatedGas - }) - // deploy the contract and get its address - return await contract - .deploy({ - data: bytecode, - arguments: argumentsArray - }) - .send({ - from: owner, - gas: estimatedGas + 1, - gasPrice: GAS_PRICE - }) - .then(function (contract) { - return contract.options.address - }) -} - -export interface Addresses { - opfCommunityFeeCollectorAddress: string - datatokenTemplateAddress: string - nftTemplateAddress: string - oceanAddress: string - routerAddress: string - sideStakingAddress: string - fixedRateAddress: string - dispenserAddress: string - nftFactoryAddress: string - daiAddress: string - usdcAddress: string - poolTemplateAddress: string -} - -export const deployContracts = async (web3: Web3, owner: string): Promise => { - const addresses: Addresses = {} as Addresses - const configAddresses = getAddresses() - - // deploy OPF free collector - addresses.opfCommunityFeeCollectorAddress = - configAddresses?.OPFCommunityFeeCollector || - (await estimateGasAndDeployContract( - web3, - OPFCommunityFeeCollector.abi as AbiItem[], - OPFCommunityFeeCollector.bytecode, - [owner, owner], - owner - )) - - // deploy Datatoken template - addresses.datatokenTemplateAddress = - configAddresses?.ERC20Template['1'] || - (await estimateGasAndDeployContract( - web3, - ERC20Template.abi as AbiItem[], - ERC20Template.bytecode, - [], - owner - )) - - // deploy NFT template - addresses.nftTemplateAddress = - configAddresses?.ERC721Template?.['1'] || - (await estimateGasAndDeployContract( - web3, - ERC721Template.abi as AbiItem[], - ERC721Template.bytecode, - [], - owner - )) - - // deploy OCEAN mock tocken - addresses.oceanAddress = - configAddresses?.Ocean || - (await estimateGasAndDeployContract( - web3, - MockERC20.abi as AbiItem[], - MockERC20.bytecode, - ['OCEAN', 'OCEAN', 18], - owner - )) - - // deploy pool template to be removed once the pools are removed from contracts - addresses.poolTemplateAddress = - configAddresses?.poolTemplate || - (await estimateGasAndDeployContract( - web3, - PoolTemplate.abi as AbiItem[], - PoolTemplate.bytecode, - [], - owner - )) - - // deploy router - addresses.routerAddress = - configAddresses?.Router || - (await estimateGasAndDeployContract( - web3, - Router.abi as AbiItem[], - Router.bytecode, - [ - owner, - addresses.oceanAddress, - addresses.poolTemplateAddress, - addresses.opfCommunityFeeCollectorAddress, - [] - ], - owner - )) - - // deploy fixed rate - addresses.fixedRateAddress = - configAddresses?.FixedPrice || - (await estimateGasAndDeployContract( - web3, - FixedRate.abi as AbiItem[], - FixedRate.bytecode, - [addresses.routerAddress], - owner - )) - - // deploy dispenser - addresses.dispenserAddress = - configAddresses?.Dispenser || - (await estimateGasAndDeployContract( - web3, - Dispenser.abi as AbiItem[], - Dispenser.bytecode, - [addresses.routerAddress], - owner - )) - - // deploy NFT factory - addresses.nftFactoryAddress = - configAddresses?.ERC721Factory || - (await estimateGasAndDeployContract( - web3, - ERC721Factory.abi as AbiItem[], - ERC721Factory.bytecode, - [ - addresses.nftTemplateAddress, - addresses.datatokenTemplateAddress, - addresses.routerAddress - ], - owner - )) - - // deploy USDC mock tocken - addresses.usdcAddress = - configAddresses?.MockUSDC || - (await estimateGasAndDeployContract( - web3, - MockERC20.abi as AbiItem[], - MockERC20.bytecode, - ['USDC', 'USDC', 6], - owner - )) - - // deploy DAI mock tocken - addresses.daiAddress = - configAddresses?.MockDAI || - (await estimateGasAndDeployContract( - web3, - MockERC20.abi as AbiItem[], - MockERC20.bytecode, - ['DAI', 'DAI', 18], - owner - )) - - if (!configAddresses?.Router) { - const RouterContract = new web3.eth.Contract( - Router.abi as AbiItem[], - addresses.routerAddress - ) - - await RouterContract.methods - .addFactory(addresses.nftFactoryAddress) - .send({ from: owner }) - await RouterContract.methods - .addFixedRateContract(addresses.fixedRateAddress) - .send({ from: owner }) - await RouterContract.methods - .addDispenserContract(addresses.dispenserAddress) - .send({ from: owner }) - } - - return addresses -} diff --git a/test/config.ts b/test/config.ts index af090929..628c5e3f 100644 --- a/test/config.ts +++ b/test/config.ts @@ -1,5 +1,4 @@ -import Web3 from 'web3' -import { ethers, Wallet, providers, Signer } from 'ethers' +import { providers, Signer } from 'ethers' import fs from 'fs' import { homedir } from 'os' import { ConfigHelper, configHelperNetworks } from '../src/config' @@ -7,11 +6,24 @@ import { LoggerInstance, LogLevel } from '../src/utils' LoggerInstance.setLevel(LogLevel.Error) +export interface Addresses { + opfCommunityFeeCollectorAddress: string + datatokenTemplateAddress: string + nftTemplateAddress: string + oceanAddress: string + routerAddress: string + sideStakingAddress: string + fixedRateAddress: string + dispenserAddress: string + nftFactoryAddress: string + daiAddress: string + usdcAddress: string + poolTemplateAddress: string +} + export const GAS_PRICE = '3000000000' // by default, we connect with development network -export const web3 = new Web3(process.env.NODE_URI || configHelperNetworks[1].nodeUri) - export const provider = new providers.JsonRpcProvider( process.env.NODE_URI || configHelperNetworks[1].nodeUri ) diff --git a/test/integration/CodeExamples.test.ts b/test/integration/CodeExamples.test.ts index a1b6d173..39d86e03 100644 --- a/test/integration/CodeExamples.test.ts +++ b/test/integration/CodeExamples.test.ts @@ -23,8 +23,8 @@ /// 3. [Install dependencies](#3-install-dependancies) /// 4. [Import dependencies and add variables and constants](#4-import-dependencies-and-add-variables-and-constants) /// 5. [Load the configuration, initialize accounts and deploy contracts](#5-load-the-configuration-initialize-accounts-and-deploy-contracts) -/// 6. [Publish Data NFT and a Datatoken with a fixed rate exchange](#6-publish-data-nft-and-a-datatoken-with-a-fixed-rate-exchange -/// 7. [Consume a fixed rate asset data asset, and downloads it'](#7-consume-a-fixed-rate-asset-data-asset) +/// 6. [Publish Data NFT and a Datatoken with a fixed rate exchange](#6-publish-data-nft-and-a-datatoken-with-a-fixed-rate-exchange) +/// 7. [Consume a fixed rate asset data asset'](#7-consume-a-fixed-rate-asset-data-asset) /// 8. [Publish Data NFT and a Datatoken with a dispenser](#8-publish-data-nft-and-a-datatoken-with-a-dispenserr) /// 9. [Consume a dispenser data asset](#9-consume-a-dispenser-data-asset) /// 10. [Using ERC725 Key-Value Store](#10-using-erc725-key-value-store) diff --git a/test/unit/Datatoken.test.ts b/test/unit/Datatoken.test.ts index 74530dc4..310f461c 100644 --- a/test/unit/Datatoken.test.ts +++ b/test/unit/Datatoken.test.ts @@ -526,17 +526,7 @@ describe('Datatoken', () => { ] ) - // const { v, r, s } = await signHash(web3, message,user3) - const messageHashBytes = ethers.utils.arrayify(message) - let signedMessage = await (user3 as providers.JsonRpcSigner)._legacySignMessage( - messageHashBytes - ) - signedMessage = signedMessage.substr(2) // remove 0x - const r = '0x' + signedMessage.slice(0, 64) - const s = '0x' + signedMessage.slice(64, 128) - let v = '0x' + signedMessage.slice(128, 130) - if (v === '0x00') v = '0x1b' - if (v === '0x01') v = '0x1c' + const { v, r, s } = await signHash(user3, message) const providerFees: ProviderFees = { providerFeeAddress: await user3.getAddress(), @@ -586,16 +576,7 @@ describe('Datatoken', () => { ] ) - const messageHashBytes = ethers.utils.arrayify(message) - let signedMessage = await (user3 as providers.JsonRpcSigner)._legacySignMessage( - messageHashBytes - ) - signedMessage = signedMessage.substr(2) // remove 0x - const r = '0x' + signedMessage.slice(0, 64) - const s = '0x' + signedMessage.slice(64, 128) - let v = '0x' + signedMessage.slice(128, 130) - if (v === '0x00') v = '0x1b' - if (v === '0x01') v = '0x1c' + const { v, r, s } = await signHash(user3, message) const providerFees: ProviderFees = { providerFeeAddress: await user3.getAddress(), @@ -641,16 +622,8 @@ describe('Datatoken', () => { providerValidUntil ] ) - const messageHashBytes = ethers.utils.arrayify(message) - let signedMessage = await (user3 as providers.JsonRpcSigner)._legacySignMessage( - messageHashBytes - ) - signedMessage = signedMessage.substr(2) // remove 0x - const r = '0x' + signedMessage.slice(0, 64) - const s = '0x' + signedMessage.slice(64, 128) - let v = '0x' + signedMessage.slice(128, 130) - if (v === '0x00') v = '0x1b' - if (v === '0x01') v = '0x1c' + + const { v, r, s } = await signHash(user3, message) const providerFees: ProviderFees = { providerFeeAddress: await user3.getAddress(), @@ -698,16 +671,8 @@ describe('Datatoken', () => { providerValidUntil ] ) - const messageHashBytes = ethers.utils.arrayify(message) - let signedMessage = await (user3 as providers.JsonRpcSigner)._legacySignMessage( - messageHashBytes - ) - signedMessage = signedMessage.substr(2) // remove 0x - const r = '0x' + signedMessage.slice(0, 64) - const s = '0x' + signedMessage.slice(64, 128) - let v = '0x' + signedMessage.slice(128, 130) - if (v === '0x00') v = '0x1b' - if (v === '0x01') v = '0x1c' + + const { v, r, s } = await signHash(user3, message) const providerFees: ProviderFees = { providerFeeAddress: await user1.getAddress(), diff --git a/test/unit/Nft.test.ts b/test/unit/Nft.test.ts index 49e74ed7..f902cd79 100644 --- a/test/unit/Nft.test.ts +++ b/test/unit/Nft.test.ts @@ -1,5 +1,4 @@ import { assert } from 'chai' -import { deployContracts, Addresses } from '../TestContractHandler' import sha256 from 'crypto-js/sha256' import { ethers, Signer } from 'ethers' import { getAddresses, getTestConfig, provider } from '../config' diff --git a/test/unit/NftFactory.test.ts b/test/unit/NftFactory.test.ts index fad181e2..2ec032da 100644 --- a/test/unit/NftFactory.test.ts +++ b/test/unit/NftFactory.test.ts @@ -253,25 +253,8 @@ describe('Nft Factory test', () => { providerValidUntil ] ) - /* Since ganache has no support yet for personal_sign, we must use the legacy implementation - const signedMessage = await user2.signMessage(message) - */ - // const signedMessage = await (user2 as providers.JsonRpcSigner)._legacySignMessage( - // message - // ) - // console.log(signedMessage) - // const { v, r, s } = await signHash(web3, message, consumeFeeAddress) - const messageHashBytes = ethers.utils.arrayify(message) - let signedMessage = await ( - consumeFeeAddress as providers.JsonRpcSigner - )._legacySignMessage(messageHashBytes) - signedMessage = signedMessage.substr(2) // remove 0x - const r = '0x' + signedMessage.slice(0, 64) - const s = '0x' + signedMessage.slice(64, 128) - let v = '0x' + signedMessage.slice(128, 130) - if (v === '0x00') v = '0x1b' - if (v === '0x01') v = '0x1c' + const { v, r, s } = await signHash(consumeFeeAddress, message) const providerFees: ProviderFees = { providerFeeAddress: await consumeFeeAddress.getAddress(),