wire up max estimated apy

This commit is contained in:
tjs 2023-09-20 21:33:18 -04:00
parent ba14cf7a3a
commit fae948ca3c
6 changed files with 83 additions and 57 deletions

View File

@ -1,14 +1,13 @@
import useStakeRates from 'hooks/useStakeRates'
import { formatTokenSymbol } from 'utils/tokens'
import SheenLoader from './shared/SheenLoader'
import { useMemo } from 'react'
import Decimal from 'decimal.js'
import useMangoGroup from 'hooks/useMangoGroup'
import FormatNumericValue from './shared/FormatNumericValue'
import mangoStore from '@store/mangoStore'
const AccountStats = ({ token }: { token: string }) => {
const { data: stakeRates, isLoading: loadingRates } = useStakeRates()
const { group } = useMangoGroup()
const estimatedMaxAPY = mangoStore((s) => s.estimatedMaxAPY.current)
const solBank = useMemo(() => {
return group?.banksMapByName.get('SOL')?.[0]
@ -44,13 +43,7 @@ const AccountStats = ({ token }: { token: string }) => {
<div>
<p className="mb-1">Max Est. APY</p>
<span className="text-2xl font-bold">
{loadingRates ? (
<SheenLoader className="mt-1">
<div className="h-8 w-20 bg-th-bkg-3" />
</SheenLoader>
) : stakeRates?.[token.toLowerCase()] ? (
`${(stakeRates?.[token.toLowerCase()] * 100).toFixed(2)}%`
) : null}
{estimatedMaxAPY ? `${estimatedMaxAPY.toFixed(2)}%` : 0}
</span>
</div>
<div>

View File

@ -13,10 +13,6 @@ const Stake = () => {
const [activeFormTab, setActiveFormTab] = useState('Add')
const selectedToken = mangoStore((s) => s.selectedToken)
const onClose = useCallback(() => {
console.log('StakeForm onSuccess')
}, [])
const handleTokenSelect = useCallback((token: string) => {
set((state) => {
state.selectedToken = token
@ -48,10 +44,10 @@ const Stake = () => {
/>
</div>
{activeFormTab === 'Add' ? (
<StakeForm onSuccess={onClose} token={selectedToken} />
<StakeForm token={selectedToken} />
) : null}
{activeFormTab === 'Remove' ? (
<UnstakeForm onSuccess={onClose} token={selectedToken} />
<UnstakeForm token={selectedToken} />
) : null}
</div>
</div>

View File

@ -36,12 +36,11 @@ import FormatNumericValue from './shared/FormatNumericValue'
import { stakeAndCreate } from 'utils/transactions'
import { MangoAccount } from '@blockworks-foundation/mango-v4'
import { AnchorProvider } from '@project-serum/anchor'
import useStakeRates from 'hooks/useStakeRates'
import useBankRates from 'hooks/useBankRates'
const set = mangoStore.getState().set
interface DepositFormProps {
onSuccess: () => void
interface StakeFormProps {
token: string
}
@ -79,7 +78,7 @@ const getNextAccountNumber = (accounts: MangoAccount[]): number => {
return 0
}
function DepositForm({ onSuccess, token: selectedToken }: DepositFormProps) {
function StakeForm({ token: selectedToken }: StakeFormProps) {
const { t } = useTranslation(['common', 'account'])
const [inputAmount, setInputAmount] = useState('')
const [submitting, setSubmitting] = useState(false)
@ -93,7 +92,12 @@ function DepositForm({ onSuccess, token: selectedToken }: DepositFormProps) {
// const banks = useBanksWithBalances('walletBalance')
const { usedTokens, totalTokens } = useMangoAccountAccounts()
const { group } = useMangoGroup()
const { data: stakeRates } = useStakeRates()
const {
stakeBankDepositRate,
borrowBankBorrowRate,
leveragedAPY,
estimatedNetAPY,
} = useBankRates(selectedToken, leverage)
const stakeBank = useMemo(() => {
return group?.banksMapByName.get(selectedToken)?.[0]
@ -123,11 +127,6 @@ function DepositForm({ onSuccess, token: selectedToken }: DepositFormProps) {
setInputAmount(max.toFixed())
}, [tokenMax])
// const handleSelectToken = (token: string) => {
// setSelectedToken(token)
// setShowTokenList(false)
// }
const amountToBorrow = useMemo(() => {
const solPrice = borrowBank?.uiPrice
const stakePrice = stakeBank?.uiPrice
@ -185,7 +184,6 @@ function DepositForm({ onSuccess, token: selectedToken }: DepositFormProps) {
await actions.fetchWalletTokens(publicKey)
setSubmitting(false)
setInputAmount('')
onSuccess()
} catch (e) {
console.error('Error depositing:', e)
setSubmitting(false)
@ -197,7 +195,7 @@ function DepositForm({ onSuccess, token: selectedToken }: DepositFormProps) {
type: 'error',
})
}
}, [stakeBank, publicKey, inputAmount, amountToBorrow, onSuccess])
}, [stakeBank, publicKey, inputAmount, amountToBorrow])
const showInsufficientBalance =
tokenMax.maxAmount < Number(inputAmount) ||
@ -214,28 +212,6 @@ function DepositForm({ onSuccess, token: selectedToken }: DepositFormProps) {
})
}, [selectedToken])
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 estimatedNetAPY = useMemo(() => {
return (
borrowBankStakeRate * leverage - borrowBankBorrowRate * (leverage - 1)
)
}, [borrowBankStakeRate, leverage, borrowBankBorrowRate])
return (
<>
<EnterBottomExitBottom
@ -437,7 +413,7 @@ function DepositForm({ onSuccess, token: selectedToken }: DepositFormProps) {
desc={
<>
{t('error-token-positions-full')}{' '}
<Link href="/settings" onClick={() => onSuccess()} shallow>
<Link href="/settings" shallow>
{t('manage')}
</Link>
</>
@ -450,4 +426,4 @@ function DepositForm({ onSuccess, token: selectedToken }: DepositFormProps) {
)
}
export default DepositForm
export default StakeForm

View File

@ -38,7 +38,6 @@ import { unstakeAndClose } from 'utils/transactions'
const set = mangoStore.getState().set
interface UnstakeFormProps {
onSuccess: () => void
token: string
}
@ -63,7 +62,7 @@ export const walletBalanceForToken = (
}
}
function UnstakeForm({ onSuccess, token: selectedToken }: UnstakeFormProps) {
function UnstakeForm({ token: selectedToken }: UnstakeFormProps) {
const { t } = useTranslation(['common', 'account'])
const [inputAmount, setInputAmount] = useState('')
const [submitting, setSubmitting] = useState(false)
@ -154,7 +153,6 @@ function UnstakeForm({ onSuccess, token: selectedToken }: UnstakeFormProps) {
await actions.fetchMangoAccounts(mangoAccount.owner)
await actions.fetchWalletTokens(publicKey)
setSubmitting(false)
onSuccess()
} catch (e) {
console.error('Error depositing:', e)
setSubmitting(false)
@ -166,7 +164,7 @@ function UnstakeForm({ onSuccess, token: selectedToken }: UnstakeFormProps) {
type: 'error',
})
}
}, [stakeBank, publicKey, inputAmount, onSuccess])
}, [stakeBank, publicKey, inputAmount])
const showInsufficientBalance =
tokenMax.maxAmount < Number(inputAmount) ||
@ -326,7 +324,7 @@ function UnstakeForm({ onSuccess, token: selectedToken }: UnstakeFormProps) {
desc={
<>
{t('error-token-positions-full')}{' '}
<Link href="/settings" onClick={() => onSuccess()} shallow>
<Link href="/settings" shallow>
{t('manage')}
</Link>
</>

57
hooks/useBankRates.ts Normal file
View File

@ -0,0 +1,57 @@
import { useMemo } from 'react'
import useStakeRates from './useStakeRates'
import useMangoGroup from './useMangoGroup'
import mangoStore from '@store/mangoStore'
const set = mangoStore.getState().set
export default function useBankRates(selectedToken: string, leverage: number) {
const { data: stakeRates } = useStakeRates()
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 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 estimatedNetAPY = useMemo(() => {
return (
borrowBankStakeRate * leverage - borrowBankBorrowRate * (leverage - 1)
)
}, [borrowBankStakeRate, leverage, borrowBankBorrowRate])
const estimatedMaxAPY = useMemo(() => {
set((s) => {
s.estimatedMaxAPY.current =
borrowBankStakeRate * 3 - borrowBankBorrowRate * 2
})
}, [borrowBankStakeRate, borrowBankBorrowRate])
return {
stakeBankDepositRate,
borrowBankBorrowRate,
borrowBankStakeRate,
leveragedAPY,
estimatedNetAPY,
estimatedMaxAPY,
}
}

View File

@ -141,6 +141,9 @@ export const DEFAULT_TRADE_FORM: TradeForm = {
export type MangoStore = {
// leverage stake
selectedToken: string
estimatedMaxAPY: {
current: number
}
//end
activityFeed: {
feed: Array<ActivityFeed>
@ -305,6 +308,9 @@ const mangoStore = create<MangoStore>()(
return {
// leverage stake
selectedToken: STAKEABLE_TOKENS[0],
estimatedMaxAPY: {
current: 0,
},
//end
activityFeed: {
feed: [],