fix withdraw modal max amount to limit to vault amount
This commit is contained in:
parent
7300b5eb4b
commit
c48b9f8a95
|
@ -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}>
|
||||||
|
|
Loading…
Reference in New Issue