Skip to content

Commit

Permalink
Created function for retriving datatoken decimals. (#264)
Browse files Browse the repository at this point in the history
* Created function for retriving datatoken decimals.

* Removed TODO comments.

* override envs.

* moved to integration to have barge

* added debug error log

* stringify.

* removed to string.

* runs only fee tests.

* fix

* changed url.

* changed logic.

* fix provider issue.

* debug.

* debug 2.

* fix test.

* refactor checkFee.

* updated test.

* fix api call.

* added log.

* added more logs

* added more logs

* comment

* console logs

* fix buffer reading.

* remove to string.

* fix

* bring tests back.

* decreaze timeout per tx.

* fix review.

* fix review pt.2

* fix conflict

* fix

* remove file.

* fix.

* return default value.

* added util function.
  • Loading branch information
mariacarmina authored Mar 19, 2024
1 parent 1de5417 commit b697f0f
Show file tree
Hide file tree
Showing 4 changed files with 45 additions and 28 deletions.
24 changes: 7 additions & 17 deletions src/components/core/utils/feesHandler.ts
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,6 @@ import type { ComputeEnvironment } from '../../../@types/C2D.js'
import {
JsonRpcApiProvider,
ethers,
Contract,
Interface,
BigNumberish,
parseUnits,
Expand All @@ -11,8 +10,11 @@ import {
import { FeeTokens, ProviderFeeData, ProviderFeeValidation } from '../../../@types/Fees'
import { DDO } from '../../../@types/DDO/DDO'
import { Service } from '../../../@types/DDO/Service'

import { verifyMessage, getJsonRpcProvider } from '../../../utils/blockchain.js'
import {
getDatatokenDecimals,
verifyMessage,
getJsonRpcProvider
} from '../../../utils/blockchain.js'
import { getConfiguration } from '../../../utils/config.js'
import { CORE_LOGGER } from '../../../utils/logging/common.js'

Expand Down Expand Up @@ -79,20 +81,7 @@ export async function createProviderFee(

if (providerFeeToken && providerFeeToken !== ZeroAddress) {
const provider = await getJsonRpcProvider(asset.chainId)

const datatokenContract = new Contract(
providerFeeToken,
ERC20Template.abi,
await provider.getSigner()
)

let decimals = 18
try {
decimals = await datatokenContract.decimals()
} catch (e) {
console.error(e)
}

const decimals = await getDatatokenDecimals(providerFeeToken, provider)
providerFeeAmountFormatted = parseUnits(providerFeeAmount.toString(10), decimals)
} else {
providerFeeAmountFormatted = BigInt(0)
Expand Down Expand Up @@ -419,6 +408,7 @@ export async function createFee(

export async function checkFee(
txId: string,
chainId: number,
providerFeesData: ProviderFeeData
// message: string | Uint8Array // the message that was signed (fee structure) ?
): Promise<boolean> {
Expand Down
10 changes: 2 additions & 8 deletions src/components/core/utils/validateOrders.ts
Original file line number Diff line number Diff line change
@@ -1,10 +1,4 @@
import {
JsonRpcProvider,
JsonRpcApiProvider,
Contract,
Interface,
TransactionReceipt
} from 'ethers'
import { JsonRpcApiProvider, Contract, Interface, TransactionReceipt } from 'ethers'
import { fetchEventFromTransaction } from '../../../utils/util.js'
import ERC20Template from '@oceanprotocol/contracts/artifacts/contracts/templates/ERC20TemplateEnterprise.sol/ERC20TemplateEnterprise.json' assert { type: 'json' }
import ERC721Template from '@oceanprotocol/contracts/artifacts/contracts/templates/ERC721Template.sol/ERC721Template.json' assert { type: 'json' }
Expand Down Expand Up @@ -44,7 +38,7 @@ export async function fetchTransactionReceipt(
export async function validateOrderTransaction(
txId: string,
userAddress: string,
provider: JsonRpcProvider,
provider: JsonRpcApiProvider,
dataNftAddress: string,
datatokenAddress: string,
serviceIndex: number,
Expand Down
6 changes: 6 additions & 0 deletions src/test/utils/utils.ts
Original file line number Diff line number Diff line change
Expand Up @@ -136,6 +136,12 @@ export function getMockSupportedNetworks(): RPCS {
network: 'development',
rpc: 'http://127.0.0.1:8545',
chunkSize: 100
},
'137': {
chainId: 137,
network: 'polygon',
rpc: 'https://polygon-rpc.com',
chunkSize: 1000
}
}
return mockSupportedNetworks
Expand Down
33 changes: 30 additions & 3 deletions src/utils/blockchain.ts
Original file line number Diff line number Diff line change
@@ -1,5 +1,7 @@
import { ethers, Signer, JsonRpcApiProvider, JsonRpcProvider } from 'ethers'
import ERC20Template from '@oceanprotocol/contracts/artifacts/contracts/templates/ERC20TemplateEnterprise.sol/ERC20TemplateEnterprise.json' assert { type: 'json' }
import { ethers, Signer, Contract, JsonRpcApiProvider, JsonRpcProvider } from 'ethers'
import { getConfiguration } from './config.js'
import { CORE_LOGGER } from './logging/common.js'

export class Blockchain {
private signer: Signer
Expand All @@ -26,6 +28,19 @@ export class Blockchain {
}
}

export async function getDatatokenDecimals(
datatokenAddress: string,
provider: JsonRpcProvider
): Promise<number> {
const datatokenContract = new Contract(datatokenAddress, ERC20Template.abi, provider)
try {
return await datatokenContract.decimals()
} catch (err) {
CORE_LOGGER.error(`${err}. Returning default 18 decimals.`)
return 18
}
}

/**
* Verify a signed message, see if signature matches address
* @param message to verify
Expand All @@ -49,7 +64,19 @@ export async function verifyMessage(
}
}

export async function checkSupportedChainId(chainId: number): Promise<[boolean, string]> {
const config = await getConfiguration()
if (!(`${chainId.toString()}` in config.supportedNetworks)) {
CORE_LOGGER.error(`Chain ID ${chainId.toString()} is not supported`)
return [false, '']
}
return [true, config.supportedNetworks[chainId.toString()].rpc]
}

export async function getJsonRpcProvider(chainId: number): Promise<JsonRpcProvider> {
const networkUrl = (await getConfiguration()).supportedNetworks[chainId.toString()].rpc
return new JsonRpcProvider(networkUrl)
const checkResult = await checkSupportedChainId(chainId)
if (!checkResult[0]) {
return null
}
return new JsonRpcProvider(checkResult[1])
}

0 comments on commit b697f0f

Please sign in to comment.