mango-v4-ui/components/shared/TokenVaultWarnings.tsx

79 lines
2.2 KiB
TypeScript
Raw Normal View History

2022-11-27 04:36:12 -08:00
import { Bank } from '@blockworks-foundation/mango-v4'
2023-01-09 15:47:18 -08:00
import {
getMaxWithdrawForBank,
useTokenMax,
} from '@components/swap/useTokenMax'
2022-11-27 04:36:12 -08:00
import useMangoAccount from 'hooks/useMangoAccount'
import useMangoGroup from 'hooks/useMangoGroup'
2022-12-19 16:08:46 -08:00
import Link from 'next/link'
2022-11-27 04:36:12 -08:00
import { useMemo } from 'react'
import InlineNotification from './InlineNotification'
2023-01-09 15:47:18 -08:00
const TokenVaultWarnings = ({
bank,
type,
}: {
bank: Bank
type: 'borrow' | 'swap' | 'withdraw'
}) => {
2022-11-27 04:36:12 -08:00
const { mangoAccount } = useMangoAccount()
const { group } = useMangoGroup()
2023-01-09 15:47:18 -08:00
const { amountWithBorrow: swapBorrowMax } = useTokenMax()
const [maxWithdraw, maxBorrow] = useMemo(() => {
if (!mangoAccount || !group) return [0, 0]
2023-08-05 05:30:36 -07:00
const maxWithdraw = getMaxWithdrawForBank(
group,
bank,
mangoAccount,
).toNumber()
2022-12-19 16:08:46 -08:00
const maxBorrow = mangoAccount.getMaxWithdrawWithBorrowForTokenUi(
group,
2023-07-21 11:47:53 -07:00
bank.mint,
2022-12-19 16:08:46 -08:00
)
2023-01-09 15:47:18 -08:00
return [maxWithdraw, maxBorrow]
2022-12-19 16:08:46 -08:00
}, [bank, mangoAccount, group])
2022-11-27 04:36:12 -08:00
2023-02-16 02:56:05 -08:00
const [availableVaultBalance, vaultBalance] = useMemo(() => {
if (!bank || !group) return [0, 0]
2023-01-09 15:47:18 -08:00
const vaultBalance = group.getTokenVaultBalanceByMintUi(bank.mint)
const vaultDeposits = bank.uiDeposits()
const available =
vaultBalance - vaultDeposits * bank.minVaultToDepositsRatio
2023-02-16 02:56:05 -08:00
return [available, vaultBalance]
2022-11-27 04:36:12 -08:00
}, [bank, group])
2023-01-09 15:47:18 -08:00
const showWarning = useMemo(() => {
if (!bank || !group) return false
if (
(type === 'borrow' && maxBorrow > availableVaultBalance) ||
2023-02-16 02:56:05 -08:00
(type === 'swap' && swapBorrowMax.toNumber() > vaultBalance) ||
2023-01-09 15:47:18 -08:00
(type === 'withdraw' && maxWithdraw > availableVaultBalance)
) {
return true
}
return false
}, [bank, group, type])
return showWarning ? (
<div className="mb-4">
<InlineNotification
type="warning"
desc={
<div>
2022-12-28 16:45:09 -08:00
The available {bank.name}{' '}
<Link href="/stats" className="underline hover:no-underline">
2022-12-28 16:45:09 -08:00
vault balance
</Link>{' '}
2023-01-09 15:47:18 -08:00
is low and impacting the maximum amount you can <span>{type}</span>
</div>
}
/>
</div>
2022-11-27 04:36:12 -08:00
) : null
}
export default TokenVaultWarnings