lev-stake-sol/hooks/useBankRates.ts

78 lines
2.4 KiB
TypeScript

import { useMemo } from 'react'
import useStakeRates from './useStakeRates'
import useMangoGroup from './useMangoGroup'
// import mangoStore from '@store/mangoStore'
import useLeverageMax from './useLeverageMax'
// const set = mangoStore.getState().set
export default function useBankRates(selectedToken: string, leverage: number) {
const { data: stakeRates } = useStakeRates()
const { group } = useMangoGroup()
// const estimatedMaxAPY = mangoStore((s) => s.estimatedMaxAPY.current)
const leverageMax = useLeverageMax(selectedToken)
const stakeBank = useMemo(() => {
return group?.banksMapByName.get(selectedToken)?.[0]
}, [selectedToken, group])
const borrowBank = useMemo(() => {
return group?.banksMapByName.get('USDC')?.[0]
}, [group])
const stakeBankDepositRate = useMemo(() => {
return stakeBank ? stakeBank.getDepositRateUi() : 0
}, [stakeBank])
const borrowBankBorrowRate = useMemo(() => {
return borrowBank ? borrowBank.getBorrowRateUi() : 0
}, [borrowBank])
const borrowBankStakeRate = useMemo(() => {
return stakeRates ? stakeRates[selectedToken.toLowerCase()] * 100 : 0
}, [stakeRates, selectedToken])
const leveragedAPY = useMemo(() => {
return borrowBankStakeRate ? borrowBankStakeRate * leverage : 0
}, [borrowBankStakeRate, leverage])
const collateralFeeAPY = useMemo(() => {
if (!stakeBank) return 0
const borrowedAmount = leverage - 1
const assetsCovered = borrowedAmount / Number(stakeBank?.maintAssetWeight)
return stakeBank?.collateralFeePerDay * 365 * 100 * assetsCovered
}, [stakeBank, leverage])
const estimatedNetAPY = useMemo(() => {
return (
borrowBankStakeRate * leverage - borrowBankBorrowRate * (leverage - 1) - collateralFeeAPY
)
}, [borrowBankStakeRate, leverage, borrowBankBorrowRate, collateralFeeAPY])
// useEffect(() => {
// set((s) => {
// s.estimatedMaxAPY.current =
// borrowBankStakeRate * leverageMax -
// borrowBankBorrowRate * (leverageMax - 1)
// })
// }, [borrowBankStakeRate, borrowBankBorrowRate, leverageMax])
const estimatedMaxAPY = useMemo(() => {
return (
borrowBankStakeRate * leverageMax - borrowBankBorrowRate * (leverageMax - 1)
)
}, [borrowBankStakeRate, borrowBankBorrowRate, leverageMax])
return {
stakeBankDepositRate,
borrowBankBorrowRate,
borrowBankStakeRate,
leveragedAPY,
estimatedNetAPY,
estimatedMaxAPY,
collateralFeeAPY
}
}