import React, { ReactElement, useEffect, useState } from 'react' import { useOcean, useMetadata } from '@oceanprotocol/react' import { DDO } from '@oceanprotocol/lib' import styles from './index.module.css' import stylesActions from './Actions.module.css' import Token from './Token' import PriceUnit from '../../../atoms/Price/PriceUnit' import Loader from '../../../atoms/Loader' import Button from '../../../atoms/Button' import Add from './Add' import Remove from './Remove' import Tooltip from '../../../atoms/Tooltip' import Conversion from '../../../atoms/Price/Conversion' import EtherscanLink from '../../../atoms/EtherscanLink' import { useUserPreferences } from '../../../../providers/UserPreferences' export interface Balance { ocean: string dt: string } /* TODO: create tooltip copy */ export default function Pool({ ddo }: { ddo: DDO }): ReactElement { const { debug } = useUserPreferences() const { ocean, accountId } = useOcean() const { price } = useMetadata(ddo) const [poolTokens, setPoolTokens] = useState() const [totalPoolTokens, setTotalPoolTokens] = useState() const [totalBalance, setTotalBalance] = useState() const [dtSymbol, setDtSymbol] = useState() const [userBalance, setUserBalance] = useState() const [swapFee, setSwapFee] = useState() const [showAdd, setShowAdd] = useState(false) const [showRemove, setShowRemove] = useState(false) const [isLoading, setIsLoading] = useState(true) const hasAddedLiquidity = userBalance && (Number(userBalance.ocean) > 0 || Number(userBalance.dt) > 0) const poolShare = totalBalance && userBalance && ((Number(poolTokens) / Number(totalPoolTokens)) * 100).toFixed(2) useEffect(() => { if (!ocean || !accountId || !price || !price.value) return async function init() { setIsLoading(true) try { // // Get data token symbol // const dtSymbol = await ocean.datatokens.getSymbol(ddo.dataToken) setDtSymbol(dtSymbol) // // Get everything which is in the pool // const oceanReserve = await ocean.pool.getOceanReserve(price.address) const dtReserve = await ocean.pool.getDTReserve(price.address) setTotalBalance({ ocean: oceanReserve, dt: dtReserve }) const totalPoolTokens = await ocean.pool.totalSupply(price.address) setTotalPoolTokens(totalPoolTokens) // // Get everything the user has put into the pool // const poolTokens = await ocean.pool.sharesBalance( accountId, price.address ) setPoolTokens(poolTokens) // calculate user's provided liquidity based on pool tokens const userOceanBalance = (Number(poolTokens) / Number(totalPoolTokens)) * Number(oceanReserve) const userDtBalance = (Number(poolTokens) / Number(totalPoolTokens)) * Number(dtReserve) const userBalance = { ocean: `${userOceanBalance}`, dt: `${userDtBalance}` } setUserBalance(userBalance) // Get liquidity provider fee const swapFee = await ocean.pool.getSwapFee(price.address) setSwapFee(swapFee) } catch (error) { console.error(error.message) } finally { setIsLoading(false) } } init() }, [ocean, accountId, price, ddo.dataToken]) return ( <> {isLoading && !userBalance ? ( ) : showAdd ? ( ) : showRemove ? ( ) : ( <>
={' '}
Pool Datatoken

Your Liquidity

{debug === true && }

Pool Statistics

{debug === true && ( )}
{hasAddedLiquidity && ( )}
)} ) }