fix withdraw modal max amount to limit to vault amount

This commit is contained in:
tjs 2022-08-23 20:44:43 -04:00
parent 7300b5eb4b
commit c48b9f8a95
1 changed files with 27 additions and 5 deletions

View File

@ -1,3 +1,4 @@
import { Bank, Group, MangoAccount } from '@blockworks-foundation/mango-v4'
import { ChevronDownIcon } from '@heroicons/react/solid' import { ChevronDownIcon } from '@heroicons/react/solid'
import { PublicKey } from '@solana/web3.js' import { PublicKey } from '@solana/web3.js'
import { useTranslation } from 'next-i18next' import { useTranslation } from 'next-i18next'
@ -23,6 +24,23 @@ interface WithdrawModalProps {
token?: string token?: string
} }
const getMaxWithdrawWithoutBorrow = (
group: Group,
bank: Bank,
mangoAccount: MangoAccount
): number => {
const accountBalance = mangoAccount?.getTokenBalanceUi(bank)
const vaultBalance = floorToDecimal(
bank.uiDeposits() - bank.uiBorrows(),
bank.mintDecimals
)
const maxBorrow = mangoAccount?.getMaxWithdrawWithBorrowForTokenUi(
group,
bank.mint
)
return Math.min(accountBalance, vaultBalance, maxBorrow)
}
type ModalCombinedProps = WithdrawModalProps & ModalProps type ModalCombinedProps = WithdrawModalProps & ModalProps
function WithdrawModal({ isOpen, onClose, token }: ModalCombinedProps) { function WithdrawModal({ isOpen, onClose, token }: ModalCombinedProps) {
@ -55,10 +73,10 @@ function WithdrawModal({ isOpen, onClose, token }: ModalCombinedProps) {
const mangoAccount = mangoStore((s) => s.mangoAccount.current) const mangoAccount = mangoStore((s) => s.mangoAccount.current)
const tokenMax = useMemo(() => { const tokenMax = useMemo(() => {
if (!bank) return 0 if (!bank || !mangoAccount || !group) return 0
const amount = mangoAccount?.getTokenBalanceUi(bank) const amount = getMaxWithdrawWithoutBorrow(group, bank, mangoAccount)
return amount && amount > 0 ? floorToDecimal(amount, bank.mintDecimals) : 0 return amount && amount > 0 ? floorToDecimal(amount, bank.mintDecimals) : 0
}, [mangoAccount, bank]) }, [mangoAccount, bank, group])
const handleSizePercentage = useCallback( const handleSizePercentage = useCallback(
(percentage: string) => { (percentage: string) => {
@ -113,7 +131,11 @@ function WithdrawModal({ isOpen, onClose, token }: ModalCombinedProps) {
if (mangoAccount) { if (mangoAccount) {
const banks = group?.banksMapByName const banks = group?.banksMapByName
? Array.from(group?.banksMapByName, ([key, value]) => { ? Array.from(group?.banksMapByName, ([key, value]) => {
const accountBalance = mangoAccount?.getTokenBalanceUi(value[0]) const accountBalance = getMaxWithdrawWithoutBorrow(
group,
value[0],
mangoAccount
)
return { return {
key, key,
value, value,
@ -128,7 +150,7 @@ function WithdrawModal({ isOpen, onClose, token }: ModalCombinedProps) {
return banks.filter((b) => b.accountBalance > 0) return banks.filter((b) => b.accountBalance > 0)
} }
return [] return []
}, [mangoAccount, group?.banksMapByName]) }, [mangoAccount, group])
return ( return (
<Modal isOpen={isOpen} onClose={onClose}> <Modal isOpen={isOpen} onClose={onClose}>