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,
|
|
|
|
}
|
|
|
|
}
|