2023-10-01 18:36:50 -07:00
|
|
|
import { useMemo } from 'react'
|
2023-09-20 18:33:18 -07:00
|
|
|
import useStakeRates from './useStakeRates'
|
|
|
|
import useMangoGroup from './useMangoGroup'
|
2023-10-01 18:36:50 -07:00
|
|
|
// import mangoStore from '@store/mangoStore'
|
|
|
|
import useLeverageMax from './useLeverageMax'
|
2023-09-20 18:33:18 -07:00
|
|
|
|
2023-10-01 18:36:50 -07:00
|
|
|
// const set = mangoStore.getState().set
|
2023-09-20 18:33:18 -07:00
|
|
|
|
|
|
|
export default function useBankRates(selectedToken: string, leverage: number) {
|
|
|
|
const { data: stakeRates } = useStakeRates()
|
|
|
|
const { group } = useMangoGroup()
|
2024-02-20 04:59:49 -08:00
|
|
|
|
2023-10-01 18:36:50 -07:00
|
|
|
// const estimatedMaxAPY = mangoStore((s) => s.estimatedMaxAPY.current)
|
|
|
|
const leverageMax = useLeverageMax(selectedToken)
|
2023-09-20 18:33:18 -07:00
|
|
|
|
|
|
|
const stakeBank = useMemo(() => {
|
|
|
|
return group?.banksMapByName.get(selectedToken)?.[0]
|
|
|
|
}, [selectedToken, group])
|
|
|
|
|
|
|
|
const borrowBank = useMemo(() => {
|
2024-02-20 04:59:49 -08:00
|
|
|
return group?.banksMapByName.get('USDC')?.[0]
|
2023-09-20 18:33:18 -07:00
|
|
|
}, [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])
|
|
|
|
|
2024-02-22 06:12:37 -08:00
|
|
|
|
|
|
|
const collateralFeeAPY = useMemo(() => {
|
|
|
|
if (!stakeBank) return 0
|
2024-02-22 07:00:57 -08:00
|
|
|
const borrowedAmount = leverage - 1
|
|
|
|
const assetsCovered = borrowedAmount / Number(stakeBank?.maintAssetWeight)
|
|
|
|
return stakeBank?.collateralFeePerDay * 365 * 100 * assetsCovered
|
|
|
|
}, [stakeBank, leverage])
|
2024-02-22 06:12:37 -08:00
|
|
|
|
2023-09-20 18:33:18 -07:00
|
|
|
const estimatedNetAPY = useMemo(() => {
|
|
|
|
return (
|
2024-02-22 06:12:37 -08:00
|
|
|
borrowBankStakeRate * leverage - borrowBankBorrowRate * (leverage - 1) - collateralFeeAPY
|
2023-09-20 18:33:18 -07:00
|
|
|
)
|
2024-02-22 06:12:37 -08:00
|
|
|
}, [borrowBankStakeRate, leverage, borrowBankBorrowRate, collateralFeeAPY])
|
2023-09-20 18:33:18 -07:00
|
|
|
|
2023-10-01 18:36:50 -07:00
|
|
|
// useEffect(() => {
|
|
|
|
// set((s) => {
|
|
|
|
// s.estimatedMaxAPY.current =
|
|
|
|
// borrowBankStakeRate * leverageMax -
|
|
|
|
// borrowBankBorrowRate * (leverageMax - 1)
|
|
|
|
// })
|
|
|
|
// }, [borrowBankStakeRate, borrowBankBorrowRate, leverageMax])
|
|
|
|
|
|
|
|
const estimatedMaxAPY = useMemo(() => {
|
|
|
|
return (
|
2024-02-22 06:12:37 -08:00
|
|
|
borrowBankStakeRate * leverageMax - borrowBankBorrowRate * (leverageMax - 1)
|
2023-10-01 18:36:50 -07:00
|
|
|
)
|
|
|
|
}, [borrowBankStakeRate, borrowBankBorrowRate, leverageMax])
|
2023-09-20 18:33:18 -07:00
|
|
|
|
|
|
|
return {
|
|
|
|
stakeBankDepositRate,
|
|
|
|
borrowBankBorrowRate,
|
|
|
|
borrowBankStakeRate,
|
|
|
|
leveragedAPY,
|
|
|
|
estimatedNetAPY,
|
|
|
|
estimatedMaxAPY,
|
2024-02-22 06:12:37 -08:00
|
|
|
collateralFeeAPY
|
2023-09-20 18:33:18 -07:00
|
|
|
}
|
|
|
|
}
|