improve fetchTokenStats
This commit is contained in:
parent
750984b713
commit
ec14aecd03
|
@ -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
|
||||
}
|
|
@ -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',
|
||||
|
|
Loading…
Reference in New Issue