use max net apy in token select buttons

This commit is contained in:
saml33 2023-09-26 10:50:05 +10:00
parent c1a16c40ff
commit 2b7da4b6a9
3 changed files with 52 additions and 32 deletions

View File

@ -42,6 +42,7 @@ import { AnchorProvider } from '@project-serum/anchor'
import useBankRates from 'hooks/useBankRates' import useBankRates from 'hooks/useBankRates'
import { Disclosure } from '@headlessui/react' import { Disclosure } from '@headlessui/react'
import SheenLoader from './shared/SheenLoader' import SheenLoader from './shared/SheenLoader'
import useLeverageMax from 'hooks/useLeverageMax'
const set = mangoStore.getState().set const set = mangoStore.getState().set
@ -107,6 +108,7 @@ function StakeForm({ token: selectedToken }: StakeFormProps) {
leveragedAPY, leveragedAPY,
estimatedNetAPY, estimatedNetAPY,
} = useBankRates(selectedToken, leverage) } = useBankRates(selectedToken, leverage)
const leverageMax = useLeverageMax(selectedToken)
const stakeBank = useMemo(() => { const stakeBank = useMemo(() => {
return group?.banksMapByName.get(selectedToken)?.[0] return group?.banksMapByName.get(selectedToken)?.[0]
@ -211,22 +213,6 @@ function StakeForm({ token: selectedToken }: StakeFormProps) {
setLeverage(v * 1) setLeverage(v * 1)
}, []) }, [])
const leverageMax = useMemo(() => {
if (!stakeBank || !borrowBank) return 1
const borrowInitLiabWeight = borrowBank.scaledInitLiabWeight(
borrowBank.price,
)
const stakeInitAssetWeight = stakeBank.scaledInitAssetWeight(
stakeBank.price,
)
if (!borrowInitLiabWeight || !stakeInitAssetWeight) return 1
const x = stakeInitAssetWeight.div(borrowInitLiabWeight).toNumber()
const conversionRate = borrowBank.uiPrice / stakeBank.uiPrice
const y = 1 - conversionRate * stakeInitAssetWeight.toNumber()
return 1 + x / y
}, [stakeBank, borrowBank])
useEffect(() => { useEffect(() => {
const group = mangoStore.getState().group const group = mangoStore.getState().group
set((state) => { set((state) => {

View File

@ -1,7 +1,7 @@
import useStakeRates from 'hooks/useStakeRates'
import Image from 'next/image' import Image from 'next/image'
import { formatTokenSymbol } from 'utils/tokens' import { formatTokenSymbol } from 'utils/tokens'
import SheenLoader from './shared/SheenLoader' import useBankRates from 'hooks/useBankRates'
import useLeverageMax from 'hooks/useLeverageMax'
const TokenButton = ({ const TokenButton = ({
handleTokenSelect, handleTokenSelect,
@ -12,7 +12,8 @@ const TokenButton = ({
selectedToken: string selectedToken: string
handleTokenSelect: (v: string) => void handleTokenSelect: (v: string) => void
}) => { }) => {
const { data: stakeRates, isLoading } = useStakeRates() const leverage = useLeverageMax(tokenName)
const { estimatedNetAPY } = useBankRates(tokenName, leverage)
return ( return (
<button <button
@ -46,19 +47,20 @@ const TokenButton = ({
selectedToken === tokenName ? 'text-th-fgd-1' : 'text-th-fgd-4' selectedToken === tokenName ? 'text-th-fgd-1' : 'text-th-fgd-4'
}`} }`}
> >
{isLoading ? ( {
<SheenLoader> // isLoading ? (
<div // <SheenLoader>
className={`h-5 w-10 ${ // <div
selectedToken === tokenName // className={`h-5 w-10 ${
? 'bg-th-active-dark' // selectedToken === tokenName
: 'bg-th-bkg-2' // ? 'bg-th-active-dark'
}`} // : 'bg-th-bkg-2'
/> // }`}
</SheenLoader> // />
) : stakeRates?.[tokenName.toLowerCase()] ? ( // </SheenLoader>
`${(stakeRates?.[tokenName.toLowerCase()] * 100).toFixed(2)}%` // ) :
) : null} `${estimatedNetAPY.toFixed(2)}%`
}
</span> </span>
</div> </div>
</button> </button>

32
hooks/useLeverageMax.ts Normal file
View File

@ -0,0 +1,32 @@
import { useMemo } from 'react'
import useMangoGroup from './useMangoGroup'
export default function useLeverageMax(selectedToken: string) {
const { group } = useMangoGroup()
const stakeBank = useMemo(() => {
return group?.banksMapByName.get(selectedToken)?.[0]
}, [selectedToken, group])
const borrowBank = useMemo(() => {
return group?.banksMapByName.get('SOL')?.[0]
}, [group])
const leverageMax = useMemo(() => {
if (!stakeBank || !borrowBank) return 1
const borrowInitLiabWeight = borrowBank.scaledInitLiabWeight(
borrowBank.price,
)
const stakeInitAssetWeight = stakeBank.scaledInitAssetWeight(
stakeBank.price,
)
if (!borrowInitLiabWeight || !stakeInitAssetWeight) return 1
const x = stakeInitAssetWeight.div(borrowInitLiabWeight).toNumber()
const conversionRate = borrowBank.uiPrice / stakeBank.uiPrice
const y = 1 - conversionRate * stakeInitAssetWeight.toNumber()
return 1 + x / y
}, [stakeBank, borrowBank])
return leverageMax
}