lev-stake-sol/utils/stats.ts

86 lines
2.7 KiB
TypeScript

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 | undefined) => {
if (!group) return []
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')
}
const rawData = await response.json()
const [data] = processTokenStatsData(rawData, group)
return data
}
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
})
// add most recent value, using most recent datapoint to patch difficult to compute stats
for (const banks of group.banksMapByTokenIndex.values()) {
const bank = banks[0]
const now = new Date().toISOString()
const filtered = data.filter(
(x: TokenStatsItem) => bank.tokenIndex === x?.token_index,
)
if (!filtered || filtered.length === 0) {
continue
}
const previous = filtered.reduce((max, cur) =>
max.date_hour > cur.date_hour ? max : cur,
)
const APY_Daily_Compound =
Math.pow(1 + bank.getDepositRateUi() / 365, 365) - 1
const tokenStatsItem: TokenStatsItem = {
borrow_apr: previous.borrow_apr,
borrow_rate: bank.getBorrowRateUi() / 100,
collected_fees: previous.collected_fees,
date_hour: now,
deposit_apr: previous.deposit_apr,
deposit_apy: APY_Daily_Compound,
deposit_rate: bank.getDepositRateUi() / 100,
mango_group: bank.group.toBase58(),
price: bank.uiPrice,
symbol: bank.name,
token_index: bank.tokenIndex,
total_borrows: bank.uiBorrows(),
total_deposits: bank.uiDeposits(),
}
data.push(tokenStatsItem)
}
const mangoStats: MangoTokenStatsItem[] = Object.values(mangoStatsMap)
mangoStats.sort(
(a, b) => new Date(a.date).getTime() - new Date(b.date).getTime(),
)
return [data, mangoStats]
}