wire up max estimated apy
This commit is contained in:
parent
ba14cf7a3a
commit
fae948ca3c
|
@ -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>
|
||||
|
|
|
@ -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>
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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>
|
||||
</>
|
||||
|
|
|
@ -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,
|
||||
}
|
||||
}
|
|
@ -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: [],
|
||||
|
|
Loading…
Reference in New Issue