improve fetchTokenStats

This commit is contained in:
tjs 2023-09-16 12:55:17 -04:00
parent 750984b713
commit ec14aecd03
2 changed files with 56 additions and 43 deletions

48
apis/mngo/index.ts Normal file
View File

@ -0,0 +1,48 @@
import { Group } from '@blockworks-foundation/mango-v4'
import { MangoTokenStatsItem, TokenStatsItem } from 'types'
import { MANGO_DATA_API_URL } from 'utils/constants'
export const fetchTokenStatsData = async (group: Group) => {
const response = await fetch(
`${MANGO_DATA_API_URL}/token-historical-stats?mango-group=${group?.publicKey.toString()}`,
)
if (!response.ok) {
throw new Error('Network response was not ok')
}
return response.json()
}
export const processTokenStatsData = (
data: TokenStatsItem[] | unknown,
group: Group,
) => {
const mangoStatsMap: Record<string, MangoTokenStatsItem> = {}
if (!Array.isArray(data)) return []
data.forEach((c) => {
const bank = group.banksMapByTokenIndex.get(c.token_index)?.[0]
if (!bank) return
const date: string = c.date_hour
const uiPrice = bank.uiPrice
if (!mangoStatsMap[date]) {
mangoStatsMap[date] = {
date,
depositValue: 0,
borrowValue: 0,
feesCollected: 0,
}
}
mangoStatsMap[date].depositValue += Math.floor(c.total_deposits * c.price)
mangoStatsMap[date].borrowValue += Math.floor(c.total_borrows * c.price)
mangoStatsMap[date].feesCollected += c.collected_fees * uiPrice
})
const mangoStats: MangoTokenStatsItem[] = Object.values(mangoStatsMap)
mangoStats.sort(
(a, b) => new Date(a.date).getTime() - new Date(b.date).getTime(),
)
return mangoStats
}

View File

@ -87,6 +87,7 @@ import maxBy from 'lodash/maxBy'
import mapValues from 'lodash/mapValues'
import groupBy from 'lodash/groupBy'
import sampleSize from 'lodash/sampleSize'
import { fetchTokenStatsData, processTokenStatsData } from 'apis/mngo'
const GROUP = new PublicKey('78b8f4cGCwmZ9ysPFMWLaLTkkaYnUjwMJYStWe5RTSSX')
@ -943,62 +944,26 @@ const mangoStore = create<MangoStore>()(
const set = get().set
const group = get().group
if (!group) return
set((state) => {
state.tokenStats.loading = true
})
try {
const response = await fetch(
`${MANGO_DATA_API_URL}/token-historical-stats?mango-group=${group?.publicKey.toString()}`,
)
const data = await response.json()
let mangoStats: MangoTokenStatsItem[] = []
if (data && data.length) {
mangoStats = data.reduce(
(a: MangoTokenStatsItem[], c: TokenStatsItem) => {
const banks = Array.from(group.banksMapByMint)
.map(([_mintAddress, banks]) => banks)
.map((b) => b[0])
const bank: Bank | undefined = banks.find(
(b) => b.tokenIndex === c.token_index,
)
const hasDate = a.find(
(d: MangoTokenStatsItem) => d.date === c.date_hour,
)
if (!hasDate) {
a.push({
date: c.date_hour,
depositValue: Math.floor(c.total_deposits * c.price),
borrowValue: Math.floor(c.total_borrows * c.price),
feesCollected: c.collected_fees * bank!.uiPrice,
})
} else {
hasDate.depositValue =
hasDate.depositValue +
Math.floor(c.total_deposits * c.price)
hasDate.borrowValue =
hasDate.borrowValue +
Math.floor(c.total_borrows * c.price)
hasDate.feesCollected =
hasDate.feesCollected + c.collected_fees * bank!.uiPrice
}
return a.sort(
(a, b) =>
new Date(a.date).getTime() - new Date(b.date).getTime(),
)
},
[],
)
}
const data = await fetchTokenStatsData(group)
const mangoStats = processTokenStatsData(data, group)
set((state) => {
state.tokenStats.data = data
state.tokenStats.mangoStats = mangoStats
state.tokenStats.initialLoad = true
state.tokenStats.loading = false
})
} catch {
} catch (error) {
set((state) => {
state.tokenStats.loading = false
})
notify({
title: 'Failed to fetch token stats data',
type: 'error',