import React, { ReactElement, useEffect, useState } from 'react'
import { gql, OperationContext } from 'urql'
import Conversion from '../atoms/Price/Conversion'
import PriceUnit from '../atoms/Price/PriceUnit'
import Tooltip from '../atoms/Tooltip'
import NetworkName from '../atoms/NetworkName'
import { fetchData, getSubgrahUri } from '../../utils/subgraph'
import { filterNetworksByType } from './UserPreferences/Networks/index'
import { useSiteMetadata } from '../../hooks/useSiteMetadata'
import useNetworkMetadata from '../../hooks/useNetworkMetadata'
import { Logger } from '@oceanprotocol/lib'
import styles from './MarketStats.module.css'
const getTotalPoolsValues = gql`
query PoolsData {
poolFactories {
totalValueLocked
totalOceanLiquidity
finalizedPoolCount
}
}
`
interface Value {
[chainId: number]: string
}
function MarketNetworkStats({
totalValueLocked,
poolCount,
totalOceanLiquidity
}: {
totalValueLocked: string
poolCount: string
totalOceanLiquidity: string
}): ReactElement {
return (
<>
{' '}
TVL across{' '}
{poolCount} asset pools that contain{' '}
,
plus datatokens for each pool.
>
)
}
function MarketNetworkStatsTooltip({
totalValueLocked,
poolCount,
totalOceanLiquidity,
mainChainIds
}: {
totalValueLocked: Value
poolCount: Value
totalOceanLiquidity: Value
mainChainIds: number[]
}): ReactElement {
return (
<>
{totalValueLocked &&
totalOceanLiquidity &&
poolCount &&
mainChainIds?.map((chainId, key) => (
-
{' '}
TVL
{' | '}
{poolCount[chainId] || '0'} pools
{' | '}
))}
Counted on-chain from our pool factory. Does not filter out assets in{' '}
list-purgatory
>
)
}
export default function MarketStats(): ReactElement {
const [totalValueLocked, setTotalValueLocked] = useState()
const [totalOceanLiquidity, setTotalOceanLiquidity] = useState()
const [poolCount, setPoolCount] = useState()
const [totalValueLockedSum, setTotalValueLockedSum] = useState()
const [totalOceanLiquiditySum, setTotalOceanLiquiditySum] = useState()
const [poolCountSum, setPoolCountSum] = useState()
const [mainChainIds, setMainChainIds] = useState()
const { appConfig } = useSiteMetadata()
const { networksList } = useNetworkMetadata()
async function getMarketStats() {
const mainChainIdsList = await filterNetworksByType(
'mainnet',
appConfig.chainIdsSupported,
networksList
)
setMainChainIds(mainChainIdsList)
let newTotalValueLockedSum = 0
let newTotalOceanLiquiditySum = 0
let newPoolCountSum = 0
for (const chainId of mainChainIdsList) {
const context: OperationContext = {
url: `${getSubgrahUri(
chainId
)}/subgraphs/name/oceanprotocol/ocean-subgraph`,
requestPolicy: 'network-only'
}
try {
const response = await fetchData(getTotalPoolsValues, null, context)
if (!response) continue
const { totalValueLocked, totalOceanLiquidity, finalizedPoolCount } =
response?.data?.poolFactories[0]
await setTotalValueLocked((prevState) => ({
...prevState,
[chainId]: totalValueLocked
}))
await setTotalOceanLiquidity((prevState) => ({
...prevState,
[chainId]: totalOceanLiquidity
}))
await setPoolCount((prevState) => ({
...prevState,
[chainId]: finalizedPoolCount
}))
newTotalValueLockedSum += parseInt(totalValueLocked)
newTotalOceanLiquiditySum += parseInt(totalOceanLiquidity)
newPoolCountSum += parseInt(finalizedPoolCount)
} catch (error) {
Logger.error('Error fetchData: ', error.message)
}
}
setTotalValueLockedSum(`${newTotalValueLockedSum}`)
setTotalOceanLiquiditySum(`${newTotalOceanLiquiditySum}`)
setPoolCountSum(`${newPoolCountSum}`)
}
useEffect(() => {
getMarketStats()
}, [])
return (
<>
{' '}
}
/>
>
)
}