lev-stake-sol/hooks/useBankRates.ts

99 lines
3.7 KiB
TypeScript
Raw Normal View History

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(() => {
2024-02-27 07:30:05 -08:00
return stakeBank ? stakeBank.getDepositRate() : 0
2023-09-20 18:33:18 -07:00
}, [stakeBank])
const borrowBankBorrowRate = useMemo(() => {
2024-02-27 07:30:05 -08:00
return borrowBank ? Number(borrowBank.getBorrowRate()) : 0
2023-09-20 18:33:18 -07:00
}, [borrowBank])
2024-02-27 07:30:05 -08:00
const jlpStakeRateAPY = useMemo(() => {
return stakeRates ? stakeRates[selectedToken.toLowerCase()] : 0
2023-09-20 18:33:18 -07:00
}, [stakeRates, selectedToken])
2024-02-27 07:30:05 -08:00
const financialMetrics = useMemo(() => {
2024-02-27 10:15:26 -08:00
2024-02-27 07:30:05 -08:00
let borrowMultiplier = leverage - 1;
let depositMultiplier = leverage;
2023-09-20 18:33:18 -07:00
2024-02-27 07:30:05 -08:00
let collectedCollateralFees = 0
let collectedReturns = 0
2024-02-22 06:12:37 -08:00
2024-02-27 07:30:05 -08:00
const maintAssetWeight = Number(stakeBank?.maintAssetWeight);
const collateralFeePerDay = Number(stakeBank?.collateralFeePerDay);
2024-02-27 10:15:26 -08:00
const borrowFeeRatePerDay = 1 + Number(borrowBankBorrowRate) / 365;
const jlpStakeRatePerDay = ((jlpStakeRateAPY + 1) ** (1 / 365));
2024-02-22 06:12:37 -08:00
2024-02-27 07:30:05 -08:00
for (let day = 1; day <= 365; day++) {
2024-02-27 10:15:26 -08:00
2024-02-27 07:30:05 -08:00
// Collateral Fee Multiplier
const collateralFeeMultiplier = borrowMultiplier / (depositMultiplier * maintAssetWeight);
2024-02-27 10:15:26 -08:00
const multipliedCollateralFeeRatePerDay = collateralFeeMultiplier * collateralFeePerDay;
2024-02-27 07:30:05 -08:00
// USDC Liabilities Multiplier
2024-02-27 10:15:26 -08:00
borrowMultiplier = borrowMultiplier * borrowFeeRatePerDay;
2024-02-27 07:30:05 -08:00
// Daily Collateral Fees
2024-02-27 10:15:26 -08:00
collectedCollateralFees += (multipliedCollateralFeeRatePerDay) * depositMultiplier
collectedReturns += (jlpStakeRatePerDay - 1) * depositMultiplier
depositMultiplier = depositMultiplier * jlpStakeRatePerDay;
depositMultiplier = depositMultiplier - (multipliedCollateralFeeRatePerDay * depositMultiplier);
2024-02-27 07:30:05 -08:00
}
// APY's for the calculation
2024-02-27 10:15:26 -08:00
const depositAPY = collectedReturns * 100; // Composed of the below two
const collateralFeeAPY = collectedCollateralFees * 100;
const collectedReturnsAPY = (collectedReturns) * 100;
2024-02-27 07:30:05 -08:00
// Interest Fee APY: Reflecting borrowing cost as an annual percentage yield
const interestCost = (borrowMultiplier - (leverage - 1)); // APY on interest
const borrowsAPY = 100 * interestCost;
// Total APY taking into account interest, collateral fees and returns
2024-02-27 10:15:26 -08:00
const APY = 100 * ((depositMultiplier - borrowMultiplier) - 1)
2023-09-20 18:33:18 -07:00
2024-02-27 07:30:05 -08:00
// Comparisons to outside
const nonMangoAPY = jlpStakeRateAPY * leverage * 100;
const diffToNonMango = (depositAPY - nonMangoAPY);
const diffToNonLeveraged = (depositAPY - (jlpStakeRateAPY * 100));
return { APY, depositAPY, collectedReturnsAPY, collateralFeeAPY, borrowsAPY, nonMangoAPY, diffToNonMango, diffToNonLeveraged };
}, [leverage, borrowBankBorrowRate, jlpStakeRateAPY, stakeBank?.collateralFeePerDay, stakeBank?.maintAssetWeight ]);
2023-10-01 18:36:50 -07:00
const estimatedMaxAPY = useMemo(() => {
return (
2024-02-27 07:30:05 -08:00
jlpStakeRateAPY * leverageMax - Number(borrowBankBorrowRate) * (leverageMax - 1)
2023-10-01 18:36:50 -07:00
)
2024-02-27 07:30:05 -08:00
}, [jlpStakeRateAPY, borrowBankBorrowRate, leverageMax])
2023-09-20 18:33:18 -07:00
return {
2024-02-27 07:30:05 -08:00
financialMetrics,
2023-09-20 18:33:18 -07:00
stakeBankDepositRate,
borrowBankBorrowRate,
2024-02-27 07:30:05 -08:00
jlpStakeRateAPY,
2023-09-20 18:33:18 -07:00
estimatedMaxAPY,
}
}