Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
62 commits
Select commit Hold shift + click to select a range
69050d8
ocean v4 update in packkage.json
ahmedraza118 May 13, 2025
1c03b71
converting to type:module
ahmedraza118 May 15, 2025
7b1e305
shifting to OPF node instance insted of subgraph
ahmedraza118 May 21, 2025
87f966f
fixed npm install issue (updated peer dependencies)
ahmedraza118 May 21, 2025
bec64ab
fixing issues in all tests
ahmedraza118 May 22, 2025
8ae5d30
updated github actions upload-artifacts to v4
ahmedraza118 May 22, 2025
9a377d2
skipping storybook
ahmedraza118 May 22, 2025
eb48f33
updated download artifact in github actions
ahmedraza118 May 22, 2025
2107372
Fetch price schema from node instead of subgraph
ahmedraza118 May 28, 2025
8c3d9e4
NEXT_PUBLIC_NODE_URL changed to 1.c2d
ahmedraza118 May 28, 2025
cd64512
updated generatebaseQuery for node instead of subgraph
ahmedraza118 May 28, 2025
8e9c0be
adding index to search query, fixing test, and price
ahmedraza118 May 28, 2025
41b45c9
fixed router configs for blockchain data
ahmedraza118 May 29, 2025
b75932b
fixed sepolia, price and v3 blastapi issues
ahmedraza118 May 30, 2025
579291d
debug changes for publish
ahmedraza118 Jun 5, 2025
42e305a
fix: getAccessDetails
AdriGeorge Jun 5, 2025
b8e2ac2
fix: fix
AdriGeorge Jun 6, 2025
3025654
fix: fix
AdriGeorge Jun 6, 2025
12bbc70
fix: fix
AdriGeorge Jun 6, 2025
9ab293a
query updates for oceanjs v4.1
ahmedraza118 Jun 11, 2025
1960a81
indexmetadata fixes
ahmedraza118 Jun 13, 2025
fd6fd0a
updated to new OPF node
ahmedraza118 Jun 16, 2025
0b1858a
debuging download push
ahmedraza118 Jun 16, 2025
7611291
Method fix: code cleaning
ahmedraza118 Jun 17, 2025
3793e20
Pricing update in preview
ahmedraza118 Jun 17, 2025
2ce826d
Merge remote-tracking branch 'origin/stage-op-node-update' into feat/…
ahmedraza118 Jun 17, 2025
283be38
removing tests from cicd
ahmedraza118 Jun 17, 2025
96d789e
updated artifacts
ahmedraza118 Jun 17, 2025
a9b8632
updated coverage
ahmedraza118 Jun 17, 2025
84f6a1d
removing test, coverage, storybook from CICD pipeline
ahmedraza118 Jun 17, 2025
50c2d5a
removed comments
ahmedraza118 Jun 17, 2025
63019eb
auto update provider
ahmedraza118 Jun 17, 2025
acd588f
fix: tags
AdriGeorge Jun 17, 2025
b0b4f02
fixes in profile, home quries,
ahmedraza118 Jun 17, 2025
d7d463f
fix: build
AdriGeorge Jun 18, 2025
b76df36
remove console and fixes
ahmedraza118 Jun 18, 2025
af38192
tags fixes
ahmedraza118 Jun 18, 2025
1245e13
fixed footer stats
ahmedraza118 Jun 18, 2025
79f7e9d
fixed Quries most sales, recently published
ahmedraza118 Jun 19, 2025
ec6f62a
removed Optimisam testnet, fixed tags
ahmedraza118 Jun 19, 2025
5a20cda
fixed all dataset results
ahmedraza118 Jun 19, 2025
ae78001
commenting publishers profiles on home page
ahmedraza118 Jun 19, 2025
52903ff
fix: nativetoken balance, cleaning console.log
ahmedraza118 Jun 19, 2025
df735cd
implemented topPublishers : Fixes in profile and tags
ahmedraza118 Jun 20, 2025
14358e3
fixed pricing loading in AssetAction
ahmedraza118 Jun 23, 2025
82e7b77
fixed: fetching price in AssetAction
ahmedraza118 Jun 24, 2025
c9f2c7a
price sort fix
ahmedraza118 Jun 25, 2025
58cab85
AssetAction Page optimisation
ahmedraza118 Jun 25, 2025
2ebc661
added chainId check in factory
ahmedraza118 Jun 26, 2025
6415e2c
implemented weth payments
ahmedraza118 Jun 27, 2025
49b9dee
static changes for testing WETH
ahmedraza118 Jun 30, 2025
b35bf2c
updating price conversion for weth
ahmedraza118 Jul 1, 2025
6b2c49b
fixing issue in decimals and getFeesAndPricing
ahmedraza118 Jul 1, 2025
4045382
edit asset price fixed
ahmedraza118 Jul 2, 2025
378b884
cleaning code and fetching address and symbol from env
ahmedraza118 Jul 2, 2025
29734a7
just to rebuild
ahmedraza118 Jul 2, 2025
87ebbfe
remove console
ahmedraza118 Jul 2, 2025
9491aa5
fixing price issue in edit asset
ahmedraza118 Jul 2, 2025
c225da2
Merge branch 'feat/updated-v4' into feat/update-weth
ahmedraza118 Jul 2, 2025
a98a1da
fixed chainid issue
ahmedraza118 Jul 2, 2025
8350bd2
chainid issue resolved
ahmedraza118 Jul 2, 2025
eeb6146
updating env variables in pricing and basetoken
ahmedraza118 Jul 3, 2025
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion .jest/__fixtures__/algorithmAquarius.ts
Original file line number Diff line number Diff line change
Expand Up @@ -74,7 +74,7 @@ export const algorithmAquarius: AssetExtended = {
{
datatokenAddress: '0xCfDdA22C9837aE76E0faA845354f33C62E03653a',
name: 'string',
symbol: 'OCEAN',
symbol: 'WETH',
serviceId:
'dbc42f4c62d2452f8731fd023eacfae74e9c7a42fbd12ce84310f13342e4aab1',
orders: 22,
Expand Down
2 changes: 1 addition & 1 deletion .jest/__fixtures__/datasetAquarius.ts
Original file line number Diff line number Diff line change
Expand Up @@ -61,7 +61,7 @@ export const datasetAquarius: AssetExtended = {
{
datatokenAddress: '0xCfDdA22C9837aE76E0faA845354f33C62E03653a',
name: 'string',
symbol: 'OCEAN',
symbol: 'WETH',
serviceId:
'dbc42f4c62d2452f8731fd023eacfae74e9c7a42fbd12ce84310f13342e4aab1',
orders: 22,
Expand Down
2 changes: 1 addition & 1 deletion .jest/__fixtures__/datasetWithAccessDetails.ts
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,7 @@ export const asset: AssetExtended = {
baseToken: {
address: '0xcfdda22c9837ae76e0faa845354f33c62e03653a',
name: 'Ocean Token',
symbol: 'OCEAN',
symbol: 'WETH',
decimals: 18
},
datatoken: {
Expand Down
6 changes: 3 additions & 3 deletions .jest/__fixtures__/datasetsWithAccessDetails.ts
Original file line number Diff line number Diff line change
Expand Up @@ -115,7 +115,7 @@ export const assets: AssetExtended[] = [
{
datatokenAddress: '0xCfDdA22C9837aE76E0faA845354f33C62E03653a',
name: 'string',
symbol: 'OCEAN',
symbol: 'WETH',
serviceId:
'dbc42f4c62d2452f8731fd023eacfae74e9c7a42fbd12ce84310f13342e4aab1',
orders: 1,
Expand Down Expand Up @@ -230,7 +230,7 @@ export const assets: AssetExtended[] = [
{
datatokenAddress: '0xCfDdA22C9837aE76E0faA845354f33C62E03653a',
name: 'string',
symbol: 'OCEAN',
symbol: 'WETH',
serviceId:
'dbc42f4c62d2452f8731fd023eacfae74e9c7a42fbd12ce84310f13342e4aab1',
orders: 1,
Expand Down Expand Up @@ -345,7 +345,7 @@ export const assets: AssetExtended[] = [
{
datatokenAddress: '0xCfDdA22C9837aE76E0faA845354f33C62E03653a',
name: 'string',
symbol: 'OCEAN',
symbol: 'WETH',
serviceId:
'dbc42f4c62d2452f8731fd023eacfae74e9c7a42fbd12ce84310f13342e4aab1',
orders: 2,
Expand Down
8 changes: 4 additions & 4 deletions .jest/__fixtures__/web3.ts
Original file line number Diff line number Diff line change
Expand Up @@ -5,13 +5,13 @@ export default {
accountId: '0x99840Df5Cb42faBE0Feb8811Aaa4BC99cA6C84e0',
approvedBaseTokens: [
{
address: '0xcfdda22c9837ae76e0faa845354f33c62e03653a',
symbol: 'OCEAN',
name: 'Ocean Token',
address: '0x5f207d42f869fd1c71d7f0f81a2a67fc20ff7323',
symbol: 'WETH',
name: 'WETH Token',
decimals: 18
}
],
balance: { eth: '0', ocean: '1000' },
balance: { eth: '0', weth: '1000' },
block: 7751969,
chainId: 5,
connect: jest.fn(),
Expand Down
2 changes: 1 addition & 1 deletion app.config.cjs
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,7 @@ module.exports = {
infuraProjectId: process.env.NEXT_PUBLIC_INFURA_PROJECT_ID || 'xxx',

oceanTokenAddress: process.env.NEXT_PUBLIC_OCEAN_TOKEN_ADDRESS,
oceanTokenSymbol: process.env.NEXT_PUBLIC_OCEAN_TOKEN_SYMBOL || 'OCEAN',
oceanTokenSymbol: process.env.NEXT_PUBLIC_OCEAN_TOKEN_SYMBOL || 'WETH',
defaultDatatokenCap:
'115792089237316195423570985008687907853269984665640564039457',
defaultDatatokenTemplateIndex: 2,
Expand Down
8 changes: 4 additions & 4 deletions chains.config.cjs
Original file line number Diff line number Diff line change
Expand Up @@ -7,8 +7,8 @@ const chains = [
isDefault: false,
isCustom: true,
network: 'Eth Sepolia',
oceanTokenSymbol: 'OCEAN',
oceanTokenAddress: '0x1B083D8584dd3e6Ff37d04a6e7e82b5F622f3985',
oceanTokenSymbol: 'WETH',
oceanTokenAddress: '0x5f207d42f869fd1c71d7f0f81a2a67fc20ff7323',
nftFactoryAddress: '0xFdC4a5DEaCDfc6D82F66e894539461a269900E13',
fixedRateExchangeAddress: '0x8372715D834d286c9aECE1AcD51Da5755B32D505',
dispenserAddress: '0x5461b629E01f72E0A468931A36e039Eea394f9eA',
Expand All @@ -30,8 +30,8 @@ const chains = [
isDefault: true,
isCustom: true,
network: 'pontusx-testnet',
oceanTokenSymbol: 'OCEAN',
oceanTokenAddress: '0x1B083D8584dd3e6Ff37d04a6e7e82b5F622f3985',
oceanTokenSymbol: 'WETH',
oceanTokenAddress: '0x5f207d42f869fd1c71d7f0f81a2a67fc20ff7323',
nftFactoryAddress: '0x2C4d542ff791890D9290Eec89C9348A4891A6Fd2',
fixedRateExchangeAddress: '0xcE0F39abB6DA2aE4d072DA78FA0A711cBB62764E',
dispenserAddress: '0xaB5B68F88Bc881CAA427007559E9bbF8818026dE',
Expand Down
2 changes: 1 addition & 1 deletion content/pages/editMetadata.json
Original file line number Diff line number Diff line change
Expand Up @@ -22,7 +22,7 @@
"name": "price",
"label": "New Price",
"type": "number",
"min": "1",
"min": "0.0001",
"placeholder": "0",
"help": "Enter a new price.",
"required": true
Expand Down
2 changes: 1 addition & 1 deletion content/price.json
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@
"title": "Fixed",
"info": "Set your price for accessing this dataset. The datatoken for this dataset will be worth the entered amount of the selected base token.",
"tooltips": {
"communityFee": "Goes to Ocean DAO for teams to improve the tools, build apps, do outreach, and more. A small fraction is used to burn OCEAN. This fee is collected when downloading or using an asset in a compute job.",
"communityFee": "Goes to Ocean DAO for teams to improve the tools, build apps, do outreach, and more. A small fraction is used to burn WETH. This fee is collected when downloading or using an asset in a compute job.",
"marketplaceFee": "Goes to the marketplace owner that is hosting and providing the marketplace and is collected when downloading or using an asset in a compute job. In Ocean Market, it is treated as network revenue that goes to the Ocean community."
}
},
Expand Down
22 changes: 11 additions & 11 deletions documentation/build-a-marketplace/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -19,29 +19,29 @@ Using Ocean Market is already a big improvement on the alternatives that are out

The tutorial covers:

* Forking and running Ocean Market locally
* Customizing your fork of Ocean market
* Quick deployment of Ocean Market
- Forking and running Ocean Market locally
- Customizing your fork of Ocean market
- Quick deployment of Ocean Market

## Preparation

**Prior knowledge**

If you’re completely unfamiliar with Ocean Market or web3 applications in general, you will benefit from reading these guides first:

* To use your clone of Ocean Market, you’ll need a wallet. We recommend getting set up with metamask.
* You’ll also need some OCEAN on a testnet to use your marketplace.
* When you have the testnet tokens, have a go at publishing a data NFT on Ocean Market.
* Run through the process of consuming a data asset on Ocean Market.
- To use your clone of Ocean Market, you’ll need a wallet. We recommend getting set up with metamask.
- You’ll also need some WETH on a testnet to use your marketplace.
- When you have the testnet tokens, have a go at publishing a data NFT on Ocean Market.
- Run through the process of consuming a data asset on Ocean Market.

For more information visit the [Ocean Docs](https://docs.oceanprotocol.com/)

**Required Prerequisites**

* Git. Instructions for installing Git can be found [here](https://git-scm.com/book/en/v2/Getting-Started-Installing-Git).
* Node.js can be downloaded from [here](https://nodejs.org/en/download/) (we’re using version 18 in this guide)
* A decent code editor, such as [Visual Studio Code](https://code.visualstudio.com/).
* You’ll need a Github account to fork Ocean Market via [Github](https://github.com/).
- Git. Instructions for installing Git can be found [here](https://git-scm.com/book/en/v2/Getting-Started-Installing-Git).
- Node.js can be downloaded from [here](https://nodejs.org/en/download/) (we’re using version 18 in this guide)
- A decent code editor, such as [Visual Studio Code](https://code.visualstudio.com/).
- You’ll need a Github account to fork Ocean Market via [Github](https://github.com/).

{% hint style="warning" %}
Let's emphasize an important aspect of building dApps. It's crucial to keep in mind that practically everything can be added to the blockchain 😵 When you integrate with these components, it becomes **crucial** for you, as a developer, to ensure **proper sanitization** of the responses on your end. This means you should carefully **validate and filter** the data received to **prevent** any potential vulnerabilities or security risks in your applications.
Expand Down
16 changes: 8 additions & 8 deletions documentation/using-ocean-market.md
Original file line number Diff line number Diff line change
Expand Up @@ -10,21 +10,21 @@ The Ocean Market is a place for buyers + sellers of top-notch data and algorithm

#### **You can:**

* Buy access to unique data, algorithms, and compute jobs. 🛍️
* Tokenize & monetize your intellectual property through blockchain technology. 💪
- Buy access to unique data, algorithms, and compute jobs. 🛍️
- Tokenize & monetize your intellectual property through blockchain technology. 💪

#### **Learn to:**

* Publish an NFT
* Download NFT Assets
* Host Your Assets
- Publish an NFT
- Download NFT Assets
- Host Your Assets

For more information visit the [Ocean Docs](https://docs.oceanprotocol.com/)

#### Getting Basic 💁‍♀️

**If you are new to web3** and blockchain technologies then we suggest you first get familiar with some Web3 basics:

* Wallet Basics 👛
* Set Up MetaMask 🦊
* Manage Your OCEAN 🪙
- Wallet Basics 👛
- Set Up MetaMask 🦊
- Manage Your WETH 🪙
4 changes: 2 additions & 2 deletions src/@context/MarketMetadata/index.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -62,8 +62,8 @@ function MarketMetadataProvider({

const oceanToken: TokenInfo = {
address: appConfig.oceanTokenAddress,
name: 'OCEAN',
symbol: 'OCEAN',
name: process.env.NEXT_PUBLIC_OCEAN_TOKEN_SYMBOL,
symbol: process.env.NEXT_PUBLIC_OCEAN_TOKEN_SYMBOL,
decimals: 18
}

Expand Down
5 changes: 4 additions & 1 deletion src/@context/Prices/_utils.ts
Original file line number Diff line number Diff line change
Expand Up @@ -2,17 +2,20 @@
// Deal with differences between token symbol & Coingecko API IDs
//
export function getCoingeckoTokenId(symbol: string) {
// can be OCEAN or mOCEAN
// can be WETH or mOCEAN
const isOcean = symbol?.toLowerCase().includes('ocean')
// can be H2O or H20
// const isH2o = symbol?.toLowerCase().includes('h2')
const isWeth = symbol?.toLowerCase() === 'weth'
const isEth = symbol?.toLowerCase() === 'eth'
const isMatic = symbol?.toLowerCase() === 'matic'

const priceTokenId = isOcean
? 'ocean-protocol'
: isEth
? 'ethereum'
: isWeth
? 'ethereum'
: isMatic
? 'matic-network'
: symbol?.toLowerCase()
Expand Down
4 changes: 2 additions & 2 deletions src/@context/Prices/index.test.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -27,8 +27,8 @@ test('useSWR is called', async () => {
// expect(result.current.prices['ocean-protocol'].eur).toBe('2')
})

test('should get correct Coingecko API ID for OCEAN', async () => {
const id1 = getCoingeckoTokenId('OCEAN')
test('should get correct Coingecko API ID for WETH', async () => {
const id1 = getCoingeckoTokenId('WETH')
expect(id1).toBe('ocean-protocol')

const id2 = getCoingeckoTokenId('mOCEAN')
Expand Down
70 changes: 43 additions & 27 deletions src/@utils/accessDetailsAndPricing.ts
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,7 @@ import {
publisherMarketOrderFee,
customProviderUrl
} from '../../app.config.cjs'
import { Signer } from 'ethers'
import { Signer, ethers } from 'ethers'
import { toast } from 'react-toastify'
import { getDummySigner } from './wallet'
// import { Service } from 'src/@types/ddo/Service'
Expand All @@ -36,6 +36,8 @@ export async function getOrderPriceAndFees( // this function give price
signer?: Signer,
providerFees?: ProviderFees
): Promise<OrderPriceAndFees> {
const tokenDecimals = 18 // Replace with actual token decimals (fetch via contract if needed)

const orderPriceAndFee = {
price: accessDetails.price || '0',
publisherMarketOrderFee: publisherMarketOrderFee || '0',
Expand Down Expand Up @@ -67,59 +69,73 @@ export async function getOrderPriceAndFees( // this function give price
}
const message = getErrorMessage(error.message)
LoggerInstance.error('[Initialize Provider] Error:', message)

// Customize error message for accountId non included in allow list
if (
// TODO: verify if the error code is correctly resolved by the provider
message.includes('ConsumableCodes.CREDENTIAL_NOT_IN_ALLOW_LIST') ||
message.includes('denied with code: 3')
) {
if (accountId !== ZERO_ADDRESS) {
toast.error(
`Consumer address not found in allow list for service ${asset.id}. Access has been denied.`
`Consumer address not found in allow list for service ${asset.id}.`
)
}
return
return orderPriceAndFee
}
// Customize error message for accountId included in deny list
if (
// TODO: verify if the error code is correctly resolved by the provider
message.includes('ConsumableCodes.CREDENTIAL_IN_DENY_LIST') ||
message.includes('denied with code: 4')
) {
if (accountId !== ZERO_ADDRESS) {
toast.error(
`Consumer address found in deny list for service ${asset.id}. Access has been denied.`
`Consumer address found in deny list for service ${asset.id}.`
)
}
return
return orderPriceAndFee
}
toast.error(message)
}
orderPriceAndFee.providerFee = providerFees || initializeData?.providerFee

// fetch price and swap fees
// Fetch price and swap fees
if (accessDetails.type === 'fixed') {
const fixed = await getFixedBuyPrice(accessDetails, asset.chainId, signer)
orderPriceAndFee.price = accessDetails.price
orderPriceAndFee.opcFee = fixed.oceanFeeAmount
orderPriceAndFee.publisherMarketFixedSwapFee = fixed.marketFeeAmount
orderPriceAndFee.consumeMarketFixedSwapFee = fixed.consumeMarketFeeAmount
}
orderPriceAndFee.price = ethers.utils
.parseUnits(accessDetails.price, tokenDecimals)
.toString()
orderPriceAndFee.opcFee = ethers.utils
.parseUnits(fixed.oceanFeeAmount, tokenDecimals)
.toString()
orderPriceAndFee.publisherMarketFixedSwapFee = ethers.utils
.parseUnits(fixed.marketFeeAmount, tokenDecimals)
.toString()
orderPriceAndFee.consumeMarketFixedSwapFee = ethers.utils
.parseUnits(fixed.consumeMarketFeeAmount, tokenDecimals)
.toString()
} else {
const price = new Decimal(+accessDetails.price || 0)
const consumeMarketFeePercentage =
Number(orderPriceAndFee?.consumeMarketOrderFee) || 0
const publisherMarketFeePercentage =
Number(orderPriceAndFee?.publisherMarketOrderFee) || 0

const price = new Decimal(+accessDetails.price || 0)
const consumeMarketFeePercentage =
+orderPriceAndFee?.consumeMarketOrderFee || 0
const publisherMarketFeePercentage =
+orderPriceAndFee?.publisherMarketOrderFee || 0
if (
isNaN(consumeMarketFeePercentage) ||
isNaN(publisherMarketFeePercentage)
) {
LoggerInstance.error('Invalid fee percentage')
return orderPriceAndFee
}

// Calculate percentage-based fees
const consumeMarketFee = price.mul(consumeMarketFeePercentage).div(100)
const publisherMarketFee = price.mul(publisherMarketFeePercentage).div(100)
const consumeMarketFee = price.mul(consumeMarketFeePercentage).div(100)
const publisherMarketFee = price.mul(publisherMarketFeePercentage).div(100)
const result = price.add(consumeMarketFee).add(publisherMarketFee)

// Format result to respect token decimals
orderPriceAndFee.price = ethers.utils
.parseUnits(result.toFixed(tokenDecimals), tokenDecimals)
.toString()
}

// Calculate total
const result = price.add(consumeMarketFee).add(publisherMarketFee).toString()
orderPriceAndFee.price = result
LoggerInstance.log('OrderPriceAndFees:', orderPriceAndFee)
return orderPriceAndFee
}

Expand Down
1 change: 0 additions & 1 deletion src/@utils/aquarius/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -406,7 +406,6 @@ export async function getPublishedAssets(
): Promise<PagedAssets> {
if (!accountId) return
const filters: FilterTerm[] = []
filters.push(getFilterTerm('indexedMetadata.nft.state', [0, 4, 5]))
filters.push(
getFilterTerm('indexedMetadata.nft.owner', accountId.toLowerCase())
)
Expand Down
14 changes: 9 additions & 5 deletions src/@utils/numbers.ts
Original file line number Diff line number Diff line change
Expand Up @@ -6,12 +6,16 @@ export function formatNumber(
locale: string,
decimals?: string
): string {
const priceStr = price.toString()
const decimalPlacesInPrice = priceStr.includes('.')
? priceStr.split('.')[1].length
: 0
const targetDecimalPlaces = decimals
? Math.min(Number(decimals), decimalPlacesInPrice)
: decimalPlacesInPrice

return formatCurrency(price, '', locale, false, {
// Not exactly clear what `significant figures` are for this library,
// but setting this seems to give us the formatting we want.
// See https://github.com/oceanprotocol/market/issues/70
significantFigures: 4,
...(decimals && { decimalPlaces: Number(decimals) })
decimalPlaces: targetDecimalPlaces
})
}

Expand Down
Loading