diff --git a/src/containers/ChainOverview/Stats.tsx b/src/containers/ChainOverview/Stats.tsx index fe40b34d3..19b9d9f8f 100644 --- a/src/containers/ChainOverview/Stats.tsx +++ b/src/containers/ChainOverview/Stats.tsx @@ -344,12 +344,12 @@ export const Stats = memo(function Stats(props: IStatsProps) { {formattedNum(props.dexs.total24h, true)}
- {props.dexs.total7d != null ? ( + {props.dexs.total7d != null && (

Volume (7d) {formattedNum(props.dexs.total7d, true)}

- ) : null} + )} {props.dexs.change_7dover7d != null && (

Weekly Change @@ -362,12 +362,12 @@ export const Stats = memo(function Stats(props: IStatsProps) {

)} - {props.dexs.dexsDominance != null ? ( + {props.dexs.dexsDominance != null && (

DEX vs CEX dominance {props.dexs.dexsDominance}%

- ) : null} + )}
) : null} @@ -395,7 +395,7 @@ export const Stats = memo(function Stats(props: IStatsProps) { {formattedNum(props.perps.total7d, true)}

) : null} - {props.perps.change_7dover7d != null ? ( + {props.perps.change_7dover7d != null && (

Weekly Change = 0 ? '+' : ''}${props.perps.change_7dover7d}%`}

- ) : null} + )} + {props.perps.dexsDominance != null && ( +

+ DEX vs CEX dominance + {props.perps.dexsDominance}% +

+ )} ) : null} diff --git a/src/containers/ChainOverview/queries.server.tsx b/src/containers/ChainOverview/queries.server.tsx index f79b6f7b2..3e9f12ab5 100644 --- a/src/containers/ChainOverview/queries.server.tsx +++ b/src/containers/ChainOverview/queries.server.tsx @@ -111,7 +111,7 @@ export async function getChainOverviewData({ chain }: { chain: string }): Promis IAdapterSummary | null, IAdapterSummary | null, IAdapterOverview | null, - number | null, + { spotVolume: number | null; derivativeVolume: number | null } | null, Array<[number, number]> | null, Array<[number, number]> | null, Array<[number, { tvl: number; borrowed?: number; staking?: number; doublecounted?: number }]> | null, @@ -562,13 +562,19 @@ export async function getChainOverviewData({ chain }: { chain: string }): Promis total7d: dexs?.total7d ?? null, change_7dover7d: dexs?.change_7dover7d ?? null, dexsDominance: - cexVolume && dexs?.total24h ? +((dexs.total24h / (cexVolume + dexs.total24h)) * 100).toFixed(2) : null, + cexVolume && dexs?.total24h + ? +((dexs.total24h / (cexVolume.spotVolume + dexs.total24h)) * 100).toFixed(2) + : null, chart: dexs ? dexs.totalDataChart.slice(-14).map((x) => [x[0] * 1000, x[1]]) : null }, perps: { total24h: perps?.total24h ?? null, total7d: perps?.total7d ?? null, - change_7dover7d: perps?.change_7dover7d ?? null + change_7dover7d: perps?.change_7dover7d ?? null, + dexsDominance: + cexVolume && perps?.total24h + ? +((perps.total24h / (cexVolume.derivativeVolume + perps.total24h)) * 100).toFixed(2) + : null }, users: { activeUsers, newUsers, transactions: transactions ? +transactions : null }, inflows: inflowsData, diff --git a/src/containers/ChainOverview/types.ts b/src/containers/ChainOverview/types.ts index bbb4ec87c..2f7704560 100644 --- a/src/containers/ChainOverview/types.ts +++ b/src/containers/ChainOverview/types.ts @@ -79,7 +79,12 @@ export interface IChainOverviewData { dexsDominance: number | null chart: Array<[number, number]> | null } - perps: { total24h: number | null; total7d: number | null; change_7dover7d: number | null } + perps: { + total24h: number | null + total7d: number | null + change_7dover7d: number | null + dexsDominance: number | null + } users: { activeUsers: number | null; newUsers: number | null; transactions: number | null } inflows: { netInflows: number | null } | null treasury: { tvl: number | null; tokenBreakdowns: Record | null } | null diff --git a/src/containers/DimensionAdapters/queries.tsx b/src/containers/DimensionAdapters/queries.tsx index 00addc145..278d981c5 100644 --- a/src/containers/DimensionAdapters/queries.tsx +++ b/src/containers/DimensionAdapters/queries.tsx @@ -301,12 +301,17 @@ export async function getAdapterProtocolSummary({ } export async function getCexVolume() { - const [cexs, btcPriceRes] = await Promise.all([ + const [cexs, cexDerivatives, btcPriceRes] = await Promise.all([ fetchJson( `https://api.llama.fi/cachedExternalResponse?url=${encodeURIComponent( 'https://api.coingecko.com/api/v3/exchanges?per_page=250' )}` ), + fetchJson(`https://pro-api.coingecko.com/api/v3/derivatives/exchanges?per_page=250`, { + headers: { + 'x-cg-pro-api-key': process.env.CG_KEY + } + }), fetchJson( `https://api.llama.fi/cachedExternalResponse?url=${encodeURIComponent( 'https://api.coingecko.com/api/v3/simple/price?ids=bitcoin&vs_currencies=usd' @@ -314,10 +319,24 @@ export async function getCexVolume() { ) ]) const btcPrice = btcPriceRes?.bitcoin?.usd - if (!btcPrice || !cexs || typeof cexs.filter !== 'function') return undefined + if ( + !btcPrice || + !cexs || + typeof cexs.filter !== 'function' || + !cexDerivatives || + typeof cexDerivatives.filter !== 'function' + ) + return undefined + // cexs might not be a list TypeError: cexs.filter is not a function - const volume = cexs.filter((c) => c.trust_score >= 9).reduce((sum, c) => sum + c.trade_volume_24h_btc, 0) * btcPrice - return volume + const spotVolume = + cexs.filter((c) => c.trust_score >= 9).reduce((sum, c) => sum + c.trade_volume_24h_btc, 0) * btcPrice + const derivativeVolume = + cexDerivatives + .filter((c) => c.number_of_perpetual_pairs >= 10) + .reduce((sum, c) => sum + Number(c.trade_volume_24h_btc), 0) * btcPrice + + return { spotVolume, derivativeVolume } } async function getEmissionsData() {