132 lines
3.9 KiB
TypeScript
132 lines
3.9 KiB
TypeScript
import { useEffect, useState } from 'react'
|
|
import { I80F48 } from '@blockworks-foundation/mango-client'
|
|
import useMangoStore from '../stores/useMangoStore'
|
|
import { tokenPrecision } from '../utils'
|
|
|
|
const useMangoStats = () => {
|
|
const [stats, setStats] = useState([
|
|
{
|
|
name: '',
|
|
hourly: '',
|
|
depositInterest: 0,
|
|
borrowInterest: 0,
|
|
totalDeposits: 0,
|
|
totalBorrows: 0,
|
|
baseOraclePrice: 0,
|
|
utilization: '0',
|
|
},
|
|
])
|
|
const [perpStats, setPerpStats] = useState([
|
|
{
|
|
name: '',
|
|
hourly: '',
|
|
oldestLongFunding: 0,
|
|
oldestShortFunding: 0,
|
|
latestLongFunding: 0,
|
|
latestShortFunding: 0,
|
|
openInterest: 0,
|
|
baseOraclePrice: 0,
|
|
},
|
|
])
|
|
const [latestStats, setLatestStats] = useState<any[]>([])
|
|
const [loadLatestStats, setLoadLatestStats] = useState<boolean>(false)
|
|
const [loadHistoricalStats, setLoadHistoricalStats] = useState<boolean>(false)
|
|
const [loadPerpStats, setLoadPerpStats] = useState<boolean>(false)
|
|
const mangoGroup = useMangoStore((s) => s.selectedMangoGroup.current)
|
|
const mangoGroupName = useMangoStore((s) => s.selectedMangoGroup.name)
|
|
const connection = useMangoStore((s) => s.connection.current)
|
|
const config = useMangoStore((s) => s.selectedMangoGroup.config)
|
|
|
|
useEffect(() => {
|
|
const fetchHistoricalStats = async () => {
|
|
setLoadHistoricalStats(true)
|
|
try {
|
|
const response = await fetch(
|
|
`https://mango-transaction-log.herokuapp.com/v3/stats/spot_stats_hourly?mango-group=${mangoGroupName}`
|
|
)
|
|
const stats = await response.json()
|
|
setStats(stats)
|
|
setLoadHistoricalStats(false)
|
|
} catch {
|
|
setLoadHistoricalStats(false)
|
|
}
|
|
}
|
|
fetchHistoricalStats()
|
|
}, [mangoGroupName])
|
|
|
|
useEffect(() => {
|
|
const fetchHistoricalPerpStats = async () => {
|
|
setLoadPerpStats(true)
|
|
try {
|
|
const response = await fetch(
|
|
`https://mango-transaction-log.herokuapp.com/v3/stats/perp_stats_hourly?mango-group=${mangoGroupName}`
|
|
)
|
|
const stats = await response.json()
|
|
setPerpStats(stats)
|
|
setLoadPerpStats(false)
|
|
} catch {
|
|
setLoadPerpStats(false)
|
|
}
|
|
}
|
|
fetchHistoricalPerpStats()
|
|
}, [mangoGroupName])
|
|
|
|
useEffect(() => {
|
|
const getLatestStats = async () => {
|
|
if (mangoGroup) {
|
|
setLoadLatestStats(true)
|
|
const rootBanks = await mangoGroup.loadRootBanks(connection)
|
|
if (!config) return
|
|
const latestStats = config.tokens.map((token) => {
|
|
const rootBank = rootBanks.find((bank) => {
|
|
if (!bank) {
|
|
return false
|
|
}
|
|
return bank.publicKey.toBase58() == token.rootKey.toBase58()
|
|
})
|
|
if (!rootBank) {
|
|
return
|
|
}
|
|
const totalDeposits = rootBank.getUiTotalDeposit(mangoGroup)
|
|
const totalBorrows = rootBank.getUiTotalBorrow(mangoGroup)
|
|
|
|
return {
|
|
time: new Date(),
|
|
name: token.symbol,
|
|
totalDeposits: totalDeposits.toFixed(
|
|
tokenPrecision[token.symbol] || 2
|
|
),
|
|
totalBorrows: totalBorrows.toFixed(
|
|
tokenPrecision[token.symbol] || 2
|
|
),
|
|
depositInterest: rootBank
|
|
.getDepositRate(mangoGroup)
|
|
.mul(I80F48.fromNumber(100)),
|
|
borrowInterest: rootBank
|
|
.getBorrowRate(mangoGroup)
|
|
.mul(I80F48.fromNumber(100)),
|
|
utilization: totalDeposits.gt(I80F48.fromNumber(0))
|
|
? totalBorrows.div(totalDeposits)
|
|
: I80F48.fromNumber(0),
|
|
}
|
|
})
|
|
setLatestStats(latestStats)
|
|
setLoadLatestStats(false)
|
|
}
|
|
}
|
|
|
|
getLatestStats()
|
|
}, [mangoGroup])
|
|
|
|
return {
|
|
latestStats,
|
|
loadLatestStats,
|
|
stats,
|
|
perpStats,
|
|
loadHistoricalStats,
|
|
loadPerpStats,
|
|
}
|
|
}
|
|
|
|
export default useMangoStats
|