diff --git a/src/@types/TokenBalance.d.ts b/src/@types/TokenBalance.d.ts index 279802adb..9a7156628 100644 --- a/src/@types/TokenBalance.d.ts +++ b/src/@types/TokenBalance.d.ts @@ -1,6 +1,6 @@ export interface PoolBalance { - ocean: number - datatoken: number + ocean: string + datatoken: string } export interface UserBalance { diff --git a/src/components/organisms/AssetActions/Pool/Add/FormAdd.tsx b/src/components/organisms/AssetActions/Pool/Add/FormAdd.tsx index 81ca0f4d8..3bc687b40 100644 --- a/src/components/organisms/AssetActions/Pool/Add/FormAdd.tsx +++ b/src/components/organisms/AssetActions/Pool/Add/FormAdd.tsx @@ -15,6 +15,9 @@ import UserLiquidity from '../../../../atoms/UserLiquidity' import { useOcean } from '../../../../../providers/Ocean' import { useWeb3 } from '../../../../../providers/Web3' +import { isValidNumber } from './../../../../../utils/numberValidations' +import Decimal from 'decimal.js' + export default function FormAdd({ coin, dtBalance, @@ -67,6 +70,7 @@ export default function FormAdd({ setNewPoolShare('0') return } + if (Number(values.amount) > Number(amountMax)) return const poolTokens = await ocean.pool.calcPoolOutGivenSingleIn( @@ -74,15 +78,20 @@ export default function FormAdd({ coin === 'OCEAN' ? ocean.pool.oceanAddress : ocean.pool.dtAddress, `${values.amount}` ) + setNewPoolTokens(poolTokens) - totalBalance && - setNewPoolShare( - `${ - (Number(poolTokens) / - (Number(totalPoolTokens) + Number(poolTokens))) * - 100 - }` - ) + + const newPoolShareDecimal = + isValidNumber(poolTokens) && isValidNumber(totalPoolTokens) + ? new Decimal(poolTokens) + .dividedBy( + new Decimal(totalPoolTokens).plus(new Decimal(poolTokens)) + ) + .mul(100) + .toString() + : '0' + + totalBalance && setNewPoolShare(newPoolShareDecimal) } calculatePoolShares() }, [ diff --git a/src/components/organisms/AssetActions/Pool/TokenList.tsx b/src/components/organisms/AssetActions/Pool/TokenList.tsx index 50cafa339..dc01677cd 100644 --- a/src/components/organisms/AssetActions/Pool/TokenList.tsx +++ b/src/components/organisms/AssetActions/Pool/TokenList.tsx @@ -2,6 +2,7 @@ import Conversion from '../../../atoms/Price/Conversion' import React, { ReactElement, ReactNode } from 'react' import Token from './Token' import styles from './TokenList.module.css' +import Decimal from 'decimal.js' export default function TokenList({ title, @@ -20,7 +21,7 @@ export default function TokenList({ dt: string dtSymbol: string poolShares: string - conversion: number + conversion: Decimal highlight?: boolean showTVLLabel?: boolean }): ReactElement { @@ -31,9 +32,9 @@ export default function TokenList({
- {conversion > 0 && ( + {conversion.greaterThan(0) && ( diff --git a/src/components/organisms/AssetActions/Pool/index.tsx b/src/components/organisms/AssetActions/Pool/index.tsx index 8a8c10eb9..d3ec21223 100644 --- a/src/components/organisms/AssetActions/Pool/index.tsx +++ b/src/components/organisms/AssetActions/Pool/index.tsx @@ -22,8 +22,13 @@ import { useWeb3 } from '../../../../providers/Web3' import PoolTransactions from '../../../molecules/PoolTransactions' import { fetchData, getQueryContext } from '../../../../utils/subgraph' +import { isValidNumber } from './../../../../utils/numberValidations' +import Decimal from 'decimal.js' + const REFETCH_INTERVAL = 5000 +Decimal.set({ toExpNeg: -18, precision: 18, rounding: 1 }) + const contentQuery = graphql` query PoolQuery { content: allFile(filter: { relativePath: { eq: "price.json" } }) { @@ -85,11 +90,15 @@ export default function Pool(): ReactElement { const [hasAddedLiquidity, setHasAddedLiquidity] = useState(false) const [poolShare, setPoolShare] = useState() - const [totalUserLiquidityInOcean, setTotalUserLiquidityInOcean] = useState(0) - const [totalLiquidityInOcean, setTotalLiquidityInOcean] = useState(0) + const [totalUserLiquidityInOcean, setTotalUserLiquidityInOcean] = useState( + new Decimal(0) + ) + const [totalLiquidityInOcean, setTotalLiquidityInOcean] = useState( + new Decimal(0) + ) const [creatorTotalLiquidityInOcean, setCreatorTotalLiquidityInOcean] = - useState(0) + useState(new Decimal(0)) const [creatorLiquidity, setCreatorLiquidity] = useState() const [creatorPoolTokens, setCreatorPoolTokens] = useState() const [creatorPoolShare, setCreatorPoolShare] = useState() @@ -144,15 +153,28 @@ export default function Pool(): ReactElement { // Get swap fee // swapFee is tricky: to get 0.1% you need to convert from 0.001 - setSwapFee(`${Number(dataLiquidity.pool.swapFee) * 100}`) + const swapFee = isValidNumber(dataLiquidity.pool.swapFee) + ? new Decimal(dataLiquidity.pool.swapFee).mul(100).toString() + : '0' + + setSwapFee(swapFee) // Get weights const weightDt = dataLiquidity.pool.tokens.filter( (token: any) => token.tokenAddress === ddo.dataToken.toLowerCase() )[0].denormWeight - setWeightDt(`${Number(weightDt) * 10}`) - setWeightOcean(`${100 - Number(weightDt) * 10}`) + const weightDtDecimal = isValidNumber(weightDt) + ? new Decimal(weightDt).mul(10).toString() + : '0' + + setWeightDt(weightDtDecimal) + + const weightOceanDecimal = isValidNumber(weightDt) + ? new Decimal(100).minus(new Decimal(weightDt).mul(10)).toString() + : '0' + + setWeightOcean(weightOceanDecimal) // // Get everything the creator put into the pool @@ -161,12 +183,25 @@ export default function Pool(): ReactElement { const creatorPoolTokens = dataLiquidity.pool.shares[0].balance setCreatorPoolTokens(creatorPoolTokens) - // Calculate creator's provided liquidity based on pool tokens const creatorOceanBalance = - (Number(creatorPoolTokens) / Number(totalPoolTokens)) * price.ocean + isValidNumber(creatorPoolTokens) && + isValidNumber(totalPoolTokens) && + isValidNumber(price.ocean) + ? new Decimal(creatorPoolTokens) + .dividedBy(new Decimal(totalPoolTokens)) + .mul(price.ocean) + .toString() + : '0' const creatorDtBalance = - (Number(creatorPoolTokens) / Number(totalPoolTokens)) * price.datatoken + isValidNumber(creatorPoolTokens) && + isValidNumber(totalPoolTokens) && + isValidNumber(price.datatoken) + ? new Decimal(creatorPoolTokens) + .dividedBy(new Decimal(totalPoolTokens)) + .mul(price.datatoken) + .toString() + : '0' const creatorLiquidity = { ocean: creatorOceanBalance, @@ -175,14 +210,30 @@ export default function Pool(): ReactElement { setCreatorLiquidity(creatorLiquidity) const totalCreatorLiquidityInOcean = - creatorLiquidity?.ocean + - creatorLiquidity?.datatoken * dataLiquidity.pool.spotPrice + isValidNumber(creatorLiquidity?.ocean) && + isValidNumber(creatorLiquidity?.datatoken) && + isValidNumber(dataLiquidity.pool.spotPrice) + ? new Decimal(creatorLiquidity?.ocean).add( + new Decimal(creatorLiquidity?.datatoken).mul( + new Decimal(dataLiquidity.pool.spotPrice) + ) + ) + : new Decimal(0) + setCreatorTotalLiquidityInOcean(totalCreatorLiquidityInOcean) + const creatorPoolShare = price?.ocean && price?.datatoken && creatorLiquidity && - ((Number(creatorPoolTokens) / Number(totalPoolTokens)) * 100).toFixed(2) + isValidNumber(creatorPoolTokens) && + isValidNumber(totalPoolTokens) + ? new Decimal(creatorPoolTokens) + .dividedBy(new Decimal(totalPoolTokens)) + .mul(100) + .toFixed(2) + : '0' + setCreatorPoolShare(creatorPoolShare) refetchLiquidity() } @@ -195,17 +246,38 @@ export default function Pool(): ReactElement { useEffect(() => { const poolShare = + isValidNumber(poolTokens) && + isValidNumber(totalPoolTokens) && price?.ocean && price?.datatoken && - ((Number(poolTokens) / Number(totalPoolTokens)) * 100).toFixed(5) + new Decimal(poolTokens) + .dividedBy(new Decimal(totalPoolTokens)) + .mul(100) + .toFixed(5) + setPoolShare(poolShare) setHasAddedLiquidity(Number(poolShare) > 0) const totalUserLiquidityInOcean = - userLiquidity?.ocean + userLiquidity?.datatoken * price?.value + isValidNumber(userLiquidity?.ocean) && + isValidNumber(userLiquidity?.datatoken) && + isValidNumber(price?.value) + ? new Decimal(userLiquidity?.ocean).add( + new Decimal(userLiquidity?.datatoken).mul(price?.value) + ) + : new Decimal(0) + setTotalUserLiquidityInOcean(totalUserLiquidityInOcean) + const totalLiquidityInOcean = - Number(price?.ocean) + Number(price?.datatoken) * Number(price?.value) + isValidNumber(price?.ocean) && + isValidNumber(price?.datatoken) && + isValidNumber(price?.value) + ? new Decimal(price?.ocean).add( + new Decimal(price?.datatoken).mul(price?.value) + ) + : new Decimal(0) + setTotalLiquidityInOcean(totalLiquidityInOcean) }, [userLiquidity, price, poolTokens, totalPoolTokens]) @@ -221,11 +293,28 @@ export default function Pool(): ReactElement { price.address ) setPoolTokens(poolTokens) + // calculate user's provided liquidity based on pool tokens const userOceanBalance = - (Number(poolTokens) / Number(totalPoolTokens)) * price.ocean + isValidNumber(poolTokens) && + isValidNumber(totalPoolTokens) && + isValidNumber(price.ocean) + ? new Decimal(poolTokens) + .dividedBy(new Decimal(totalPoolTokens)) + .mul(price.ocean) + .toString() + : '0' + const userDtBalance = - (Number(poolTokens) / Number(totalPoolTokens)) * price.datatoken + isValidNumber(poolTokens) && + isValidNumber(totalPoolTokens) && + isValidNumber(price.datatoken) + ? new Decimal(poolTokens) + .dividedBy(new Decimal(totalPoolTokens)) + .mul(price.datatoken) + .toString() + : '0' + const userLiquidity = { ocean: userOceanBalance, datatoken: userDtBalance @@ -255,8 +344,8 @@ export default function Pool(): ReactElement { poolAddress={price.address} totalPoolTokens={totalPoolTokens} totalBalance={{ - ocean: price.ocean, - datatoken: price.datatoken + ocean: new Decimal(price.ocean).toString(), + datatoken: new Decimal(price.datatoken).toString() }} swapFee={swapFee} dtSymbol={dtSymbol} diff --git a/src/components/organisms/AssetActions/Pool/utils.ts b/src/components/organisms/AssetActions/Pool/utils.ts index 140b480b7..68fe113e2 100644 --- a/src/components/organisms/AssetActions/Pool/utils.ts +++ b/src/components/organisms/AssetActions/Pool/utils.ts @@ -1,5 +1,10 @@ import { Ocean } from '@oceanprotocol/lib' +import { isValidNumber } from './../../../../utils/numberValidations' +import Decimal from 'decimal.js' + +Decimal.set({ toExpNeg: -18, precision: 18, rounding: 1 }) + export async function getMaxPercentRemove( ocean: Ocean, poolAddress: string, @@ -15,9 +20,15 @@ export async function getMaxPercentRemove( amountMaxOcean ) - let amountMaxPercent = `${Math.floor( - (Number(amountMaxPoolShares) / Number(poolTokens)) * 100 - )}` + let amountMaxPercent = + isValidNumber(amountMaxPoolShares) && isValidNumber(poolTokens) + ? new Decimal(amountMaxPoolShares) + .dividedBy(new Decimal(poolTokens)) + .mul(100) + .floor() + .toString() + : '0' + if (Number(amountMaxPercent) > 100) { amountMaxPercent = '100' } diff --git a/src/components/organisms/AssetActions/Trade/FormTrade.tsx b/src/components/organisms/AssetActions/Trade/FormTrade.tsx index 1188d5618..bd4018b78 100644 --- a/src/components/organisms/AssetActions/Trade/FormTrade.tsx +++ b/src/components/organisms/AssetActions/Trade/FormTrade.tsx @@ -42,8 +42,8 @@ export default function FormTrade({ }: { ddo: DDO balance: PoolBalance - maxDt: number - maxOcean: number + maxDt: string + maxOcean: string price: BestPrice }): ReactElement { const data = useStaticQuery(contentQuery) @@ -61,12 +61,18 @@ export default function FormTrade({ const validationSchema: Yup.SchemaOf = Yup.object() .shape({ ocean: Yup.number() - .max(maximumOcean, (param) => `Must be more or equal to ${param.max}`) + .max( + Number(maximumOcean), + (param) => `Must be more or equal to ${param.max}` + ) .min(0.001, (param) => `Must be more or equal to ${param.min}`) .required('Required') .nullable(), datatoken: Yup.number() - .max(maximumDt, (param) => `Must be less or equal than ${param.max}`) + .max( + Number(maximumDt), + (param) => `Must be less or equal than ${param.max}` + ) .min(0.00001, (param) => `Must be more or equal to ${param.min}`) .required('Required') .nullable(), @@ -77,7 +83,9 @@ export default function FormTrade({ async function handleTrade(values: FormTradeData) { try { - const impact = new Decimal(100 - Number(values.slippage)).div(100) + const impact = new Decimal( + new Decimal(100).sub(new Decimal(values.slippage)) + ).div(100) const precision = 15 const tx = values.type === 'buy' diff --git a/src/components/organisms/AssetActions/Trade/Output.tsx b/src/components/organisms/AssetActions/Trade/Output.tsx index f108b6473..61879b753 100644 --- a/src/components/organisms/AssetActions/Trade/Output.tsx +++ b/src/components/organisms/AssetActions/Trade/Output.tsx @@ -5,6 +5,11 @@ import { useOcean } from '../../../../providers/Ocean' import Token from '../Pool/Token' import styles from './Output.module.css' +import { isValidNumber } from './../../../../utils/numberValidations' +import Decimal from 'decimal.js' + +Decimal.set({ toExpNeg: -18, precision: 18, rounding: 1 }) + export default function Output({ dtSymbol, poolAddress @@ -25,12 +30,20 @@ export default function Output({ async function getSwapFee() { const swapFee = await ocean.pool.getSwapFee(poolAddress) + // swapFee is tricky: to get 0.1% you need to convert from 0.001 - setSwapFee(`${Number(swapFee) * 100}`) + setSwapFee( + isValidNumber(swapFee) ? new Decimal(swapFee).mul(100).toString() : '0' + ) + const value = values.type === 'buy' - ? Number(swapFee) * values.ocean - : Number(swapFee) * values.datatoken + ? isValidNumber(swapFee) && isValidNumber(values.ocean) + ? new Decimal(swapFee).mul(new Decimal(values.ocean)) + : 0 + : isValidNumber(swapFee) && isValidNumber(values.datatoken) + ? new Decimal(swapFee).mul(new Decimal(values.datatoken)) + : 0 setSwapFeeValue(value.toString()) } getSwapFee() @@ -46,8 +59,14 @@ export default function Output({ const maxImpact = 1 - Number(values.slippage) / 100 const maxPrice = values.type === 'buy' - ? (values.datatoken * maxImpact).toString() - : (values.ocean * maxImpact).toString() + ? isValidNumber(values.datatoken) && isValidNumber(maxImpact) + ? new Decimal(values.datatoken) + .mul(new Decimal(maxImpact)) + .toString() + : '0' + : isValidNumber(values.ocean) && isValidNumber(maxImpact) + ? new Decimal(values.ocean).mul(new Decimal(maxImpact)).toString() + : '0' setMaxOutput(maxPrice) } diff --git a/src/components/organisms/AssetActions/Trade/Swap.tsx b/src/components/organisms/AssetActions/Trade/Swap.tsx index 16b05ee89..59fa26202 100644 --- a/src/components/organisms/AssetActions/Trade/Swap.tsx +++ b/src/components/organisms/AssetActions/Trade/Swap.tsx @@ -12,6 +12,10 @@ import { FormTradeData, TradeItem } from '../../../../models/FormTrade' import { useOcean } from '../../../../providers/Ocean' import PriceImpact from './PriceImpact' +import Decimal from 'decimal.js' + +Decimal.set({ toExpNeg: -18, precision: 18, rounding: 1 }) + export default function Swap({ ddo, maxDt, @@ -22,23 +26,23 @@ export default function Swap({ setMaximumOcean }: { ddo: DDO - maxDt: number - maxOcean: number + maxDt: string + maxOcean: string balance: PoolBalance price: BestPrice - setMaximumDt: (value: number) => void - setMaximumOcean: (value: number) => void + setMaximumDt: (value: string) => void + setMaximumOcean: (value: string) => void }): ReactElement { const { ocean } = useOcean() const [oceanItem, setOceanItem] = useState({ - amount: 0, + amount: '0', token: 'OCEAN', - maxAmount: 0 + maxAmount: '0' }) const [dtItem, setDtItem] = useState({ - amount: 0, + amount: '0', token: ddo.dataTokenInfo.symbol, - maxAmount: 0 + maxAmount: '0' }) const { @@ -72,32 +76,32 @@ export default function Swap({ const maximumDt = values.type === 'buy' ? Number(dtAmount) > Number(maxBuyDt) - ? Number(maxBuyDt) - : Number(dtAmount) - : Number(dtAmount) > balance.datatoken - ? balance.datatoken - : Number(dtAmount) + ? new Decimal(maxBuyDt) + : new Decimal(dtAmount) + : Number(dtAmount) > Number(balance.datatoken) + ? new Decimal(balance.datatoken) + : new Decimal(dtAmount) const maximumOcean = values.type === 'sell' ? Number(oceanAmount) > Number(maxBuyOcean) - ? Number(maxBuyOcean) - : Number(oceanAmount) - : Number(oceanAmount) > balance.ocean - ? balance.ocean - : Number(oceanAmount) + ? new Decimal(maxBuyOcean) + : new Decimal(oceanAmount) + : Number(oceanAmount) > Number(balance.ocean) + ? new Decimal(balance.ocean) + : new Decimal(oceanAmount) - setMaximumDt(maximumDt) - setMaximumOcean(maximumOcean) + setMaximumDt(maximumDt.toString()) + setMaximumOcean(maximumOcean.toString()) setOceanItem({ ...oceanItem, - amount: oceanAmount, - maxAmount: maximumOcean + amount: oceanAmount.toString(), + maxAmount: maximumOcean.toString() }) setDtItem({ ...dtItem, - amount: dtAmount, - maxAmount: maximumDt + amount: dtAmount.toString(), + maxAmount: maximumDt.toString() }) } calculateMaximum() diff --git a/src/components/organisms/AssetActions/Trade/TradeInput.tsx b/src/components/organisms/AssetActions/Trade/TradeInput.tsx index f990380cc..123d61692 100644 --- a/src/components/organisms/AssetActions/Trade/TradeInput.tsx +++ b/src/components/organisms/AssetActions/Trade/TradeInput.tsx @@ -73,7 +73,7 @@ export default function TradeInput({ size="small" onClick={() => { setFieldValue(name, item?.maxAmount) - handleValueChange(name, item?.maxAmount) + handleValueChange(name, Number(item?.maxAmount)) }} > Use Max diff --git a/src/components/organisms/AssetActions/Trade/index.tsx b/src/components/organisms/AssetActions/Trade/index.tsx index 14b45f1cf..00d675f4a 100644 --- a/src/components/organisms/AssetActions/Trade/index.tsx +++ b/src/components/organisms/AssetActions/Trade/index.tsx @@ -5,13 +5,18 @@ import { useAsset } from '../../../../providers/Asset' import { useOcean } from '../../../../providers/Ocean' import { useWeb3 } from '../../../../providers/Web3' +import { isValidNumber } from './../../../../utils/numberValidations' +import Decimal from 'decimal.js' + +Decimal.set({ toExpNeg: -18, precision: 18, rounding: 1 }) + export default function Trade(): ReactElement { const { accountId, balance } = useWeb3() const { ocean } = useOcean() const [tokenBalance, setTokenBalance] = useState() const { price, ddo } = useAsset() - const [maxDt, setMaxDt] = useState(0) - const [maxOcean, setMaxOcean] = useState(0) + const [maxDt, setMaxDt] = useState('0') + const [maxOcean, setMaxOcean] = useState('0') // Get datatoken balance, and combine with OCEAN balance from hooks into one object useEffect(() => { @@ -20,8 +25,8 @@ export default function Trade(): ReactElement { async function getTokenBalance() { const dtBalance = await ocean.datatokens.balance(ddo.dataToken, accountId) setTokenBalance({ - ocean: Number(balance.ocean), - datatoken: Number(dtBalance) + ocean: new Decimal(balance.ocean).toString(), + datatoken: new Decimal(dtBalance).toString() }) } getTokenBalance() @@ -35,12 +40,20 @@ export default function Trade(): ReactElement { const maxTokensInPool = await ocean.pool.getDTMaxBuyQuantity( price.address ) - setMaxDt(Number(maxTokensInPool)) + setMaxDt( + isValidNumber(maxTokensInPool) + ? new Decimal(maxTokensInPool).toString() + : '0' + ) const maxOceanInPool = await ocean.pool.getOceanMaxBuyQuantity( price.address ) - setMaxOcean(Number(maxOceanInPool)) + setMaxOcean( + isValidNumber(maxOceanInPool) + ? new Decimal(maxOceanInPool).toString() + : '0' + ) } getMaximum() }, [ocean, balance.ocean, price]) diff --git a/src/components/organisms/AssetContent/Pricing/FormPricing/index.tsx b/src/components/organisms/AssetContent/Pricing/FormPricing/index.tsx index a64e84573..17c7a65a3 100644 --- a/src/components/organisms/AssetContent/Pricing/FormPricing/index.tsx +++ b/src/components/organisms/AssetContent/Pricing/FormPricing/index.tsx @@ -12,6 +12,11 @@ import { DDO } from '@oceanprotocol/lib' import FormHelp from '../../../../atoms/Input/Help' import { useSiteMetadata } from '../../../../../hooks/useSiteMetadata' +import { isValidNumber } from './../../../../../utils/numberValidations' +import Decimal from 'decimal.js' + +Decimal.set({ toExpNeg: -18, precision: 18, rounding: 1 }) + export default function FormPricing({ ddo, setShowPricing, @@ -41,8 +46,15 @@ export default function FormPricing({ useEffect(() => { if (type === 'fixed') return const dtAmount = - (Number(oceanAmount) / Number(weightOnOcean) / price) * - Number(weightOnDataToken) + isValidNumber(oceanAmount) && + isValidNumber(weightOnOcean) && + isValidNumber(price) && + isValidNumber(weightOnDataToken) + ? new Decimal(oceanAmount) + .dividedBy(new Decimal(weightOnOcean)) + .dividedBy(new Decimal(price)) + .mul(new Decimal(weightOnDataToken)) + : 0 setFieldValue('dtAmount', dtAmount) }, [price, oceanAmount, weightOnOcean, weightOnDataToken, type]) diff --git a/src/components/pages/History/PoolShares.tsx b/src/components/pages/History/PoolShares.tsx index 2413a4318..fcd6548db 100644 --- a/src/components/pages/History/PoolShares.tsx +++ b/src/components/pages/History/PoolShares.tsx @@ -17,6 +17,10 @@ import { fetchDataForMultipleChains } from '../../../utils/subgraph' import NetworkName from '../../atoms/NetworkName' import axios from 'axios' import { retrieveDDO } from '../../../utils/aquarius' +import { isValidNumber } from './../../../utils/numberValidations' +import Decimal from 'decimal.js' + +Decimal.set({ toExpNeg: -18, precision: 18, rounding: 1 }) const REFETCH_INTERVAL = 20000 @@ -90,11 +94,16 @@ function Liquidity({ row, type }: { row: Asset; type: string }) { ).toString() } if (type === 'pool') { - price = `${ - Number(row.poolShare.poolId.oceanReserve) + - Number(row.poolShare.poolId.datatokenReserve) * - row.poolShare.poolId.consumePrice - }` + price = + isValidNumber(row.poolShare.poolId.oceanReserve) && + isValidNumber(row.poolShare.poolId.datatokenReserve) && + isValidNumber(row.poolShare.poolId.consumePrice) + ? new Decimal(row.poolShare.poolId.datatokenReserve) + .mul(new Decimal(row.poolShare.poolId.consumePrice)) + .plus(row.poolShare.poolId.oceanReserve) + .toString() + : '0' + oceanTokenBalance = row.poolShare.poolId.oceanReserve.toString() dataTokenBalance = row.poolShare.poolId.datatokenReserve.toString() } diff --git a/src/models/FormTrade.ts b/src/models/FormTrade.ts index ede5ba943..c6e22518d 100644 --- a/src/models/FormTrade.ts +++ b/src/models/FormTrade.ts @@ -7,9 +7,9 @@ export interface FormTradeData extends PoolBalance { } export interface TradeItem { - amount: number + amount: string token: string - maxAmount: number + maxAmount: string } export const initialValues: FormTradeData = { diff --git a/src/utils/numberValidations.ts b/src/utils/numberValidations.ts new file mode 100644 index 000000000..c4d32a84c --- /dev/null +++ b/src/utils/numberValidations.ts @@ -0,0 +1,8 @@ +export function isValidNumber(value: any): boolean { + const isUndefinedValue = typeof value === 'undefined' + const isNullValue = value === null + const isNaNValue = isNaN(Number(value)) + const isEmptyString = value === '' + + return !isUndefinedValue && !isNullValue && !isNaNValue && !isEmptyString +}