handle when vault balance is below 0

This commit is contained in:
tjs 2022-08-26 13:17:31 -04:00
parent 98fe5bf521
commit 0775176122
4 changed files with 64 additions and 60 deletions

View File

@ -74,7 +74,7 @@ const JupiterRouteInfo = ({
selectedRoute, selectedRoute,
setSelectedRoute, setSelectedRoute,
}: JupiterRouteInfoProps) => { }: JupiterRouteInfoProps) => {
const { t } = useTranslation('trade') const { t } = useTranslation(['common', 'trade'])
const [showRoutesModal, setShowRoutesModal] = useState(false) const [showRoutesModal, setShowRoutesModal] = useState(false)
const [swapRate, setSwapRate] = useState<boolean>(false) const [swapRate, setSwapRate] = useState<boolean>(false)
const [depositAndFee, setDepositAndFee] = useState<TransactionFeeInfo>() const [depositAndFee, setDepositAndFee] = useState<TransactionFeeInfo>()
@ -244,7 +244,7 @@ const JupiterRouteInfo = ({
<div className="space-y-2 px-1"> <div className="space-y-2 px-1">
<div className="flex justify-between"> <div className="flex justify-between">
<span>{t('rate')}</span> <span>Rate</span>
<div> <div>
<div className="flex items-center justify-end"> <div className="flex items-center justify-end">
<p className="text-right text-sm"> <p className="text-right text-sm">
@ -307,7 +307,7 @@ const JupiterRouteInfo = ({
<div className="flex justify-between"> <div className="flex justify-between">
<p className="text-sm text-th-fgd-3">{t('borrow-amount')}</p> <p className="text-sm text-th-fgd-3">{t('borrow-amount')}</p>
<p className="text-right text-sm text-th-fgd-1"> <p className="text-right text-sm text-th-fgd-1">
~{formatFixedDecimals(borrowAmount)} {inputTokenInfo?.symbol} ~ {formatFixedDecimals(borrowAmount)} {inputTokenInfo?.symbol}
</p> </p>
</div> </div>
) : null} ) : null}

View File

@ -1,6 +1,6 @@
import { ChangeEvent, useEffect, useRef, useState } from 'react' import { ChangeEvent, useEffect, useRef, useState } from 'react'
import mangoStore from '../../store/mangoStore' import mangoStore from '../../store/mangoStore'
import { useTokenMax } from './SwapForm' import { useTokenMax } from './useTokenMax'
const LeverageSlider = ({ const LeverageSlider = ({
amount, amount,

View File

@ -14,11 +14,7 @@ import ContentBox from '../shared/ContentBox'
import JupiterRouteInfo from './JupiterRouteInfo' import JupiterRouteInfo from './JupiterRouteInfo'
import TokenSelect from '../TokenSelect' import TokenSelect from '../TokenSelect'
import useDebounce from '../shared/useDebounce' import useDebounce from '../shared/useDebounce'
import { import { floorToDecimal, numberFormat } from '../../utils/numbers'
floorToDecimal,
formatDecimal,
numberFormat,
} from '../../utils/numbers'
import { SwapLeverageSlider } from './LeverageSlider' import { SwapLeverageSlider } from './LeverageSlider'
import { useTranslation } from 'next-i18next' import { useTranslation } from 'next-i18next'
import SwapFormTokenList from './SwapFormTokenList' import SwapFormTokenList from './SwapFormTokenList'
@ -35,6 +31,7 @@ import {
INPUT_TOKEN_DEFAULT, INPUT_TOKEN_DEFAULT,
OUTPUT_TOKEN_DEFAULT, OUTPUT_TOKEN_DEFAULT,
} from '../../utils/constants' } from '../../utils/constants'
import { useTokenMax } from './useTokenMax'
const MAX_DIGITS = 11 const MAX_DIGITS = 11
const withValueLimit = (values: NumberFormatValues): boolean => { const withValueLimit = (values: NumberFormatValues): boolean => {
@ -410,57 +407,6 @@ const SwapForm = () => {
export default SwapForm export default SwapForm
export const useTokenMax = (useMargin = true) => {
const mangoAccount = mangoStore((s) => s.mangoAccount.current)
const inputBank = mangoStore((s) => s.swap.inputBank)
const outputBank = mangoStore((s) => s.swap.outputBank)
const slippage = mangoStore((s) => s.swap.slippage)
const tokenInMax = useMemo(() => {
const group = mangoStore.getState().group
if (!group || !inputBank || !mangoAccount || !outputBank)
return { amount: 0.0, decimals: 6, amountWithBorrow: 0.0 }
const inputBankFromGroup = group.getFirstBankByMint(inputBank.mint)
const tokenBalance = parseFloat(
formatDecimal(
mangoAccount?.getTokenBalanceUi(inputBankFromGroup),
inputBankFromGroup.mintDecimals
)
)
const maxAmountWithoutMargin = tokenBalance > 0 ? tokenBalance : 0
const inputBankVaultBalance = floorToDecimal(
inputBank.uiDeposits() - inputBank.uiBorrows(),
inputBank.mintDecimals
)
const maxUiAmountWithBorrow = mangoAccount?.getMaxSourceUiForTokenSwap(
group,
inputBank.mint,
outputBank.mint,
0.98 - slippage / 10
)
return {
amount: useMargin
? Math.min(
maxAmountWithoutMargin,
inputBankVaultBalance,
maxUiAmountWithBorrow
)
: Math.min(maxAmountWithoutMargin, inputBankVaultBalance),
amountWithBorrow: Math.min(
floorToDecimal(maxUiAmountWithBorrow, inputBank.mintDecimals),
inputBankVaultBalance
),
decimals: inputBank.mintDecimals,
}
}, [inputBank, mangoAccount, outputBank, slippage])
return tokenInMax
}
const MaxSwapAmount = ({ const MaxSwapAmount = ({
amountWithBorrow, amountWithBorrow,
setAmountIn, setAmountIn,

View File

@ -0,0 +1,58 @@
import { useMemo } from 'react'
import mangoStore from '../../store/mangoStore'
import { floorToDecimal, formatDecimal } from '../../utils/numbers'
export const useTokenMax = (useMargin = true) => {
const mangoAccount = mangoStore((s) => s.mangoAccount.current)
const inputBank = mangoStore((s) => s.swap.inputBank)
const outputBank = mangoStore((s) => s.swap.outputBank)
const slippage = mangoStore((s) => s.swap.slippage)
const tokenInMax = useMemo(() => {
const group = mangoStore.getState().group
if (!group || !inputBank || !mangoAccount || !outputBank)
return { amount: 0.0, decimals: 6, amountWithBorrow: 0.0 }
const inputBankFromGroup = group.getFirstBankByMint(inputBank.mint)
const tokenBalance = parseFloat(
formatDecimal(
mangoAccount?.getTokenBalanceUi(inputBankFromGroup),
inputBankFromGroup.mintDecimals
)
)
const maxAmountWithoutMargin = tokenBalance > 0 ? tokenBalance : 0
const inputBankVaultBalance = floorToDecimal(
inputBank.uiDeposits() - inputBank.uiBorrows(),
inputBank.mintDecimals
)
const maxUiAmountWithBorrow = mangoAccount?.getMaxSourceUiForTokenSwap(
group,
inputBank.mint,
outputBank.mint,
0.98 - slippage / 10
)
const maxAmount = useMargin
? Math.min(
maxAmountWithoutMargin,
inputBankVaultBalance,
maxUiAmountWithBorrow
)
: Math.min(maxAmountWithoutMargin, inputBankVaultBalance)
const maxAmountWithBorrow = Math.min(
floorToDecimal(maxUiAmountWithBorrow, inputBank.mintDecimals),
inputBankVaultBalance
)
return {
amount: maxAmount > 0 ? maxAmount : 0,
amountWithBorrow: maxAmountWithBorrow > 0 ? maxAmountWithBorrow : 0,
decimals: inputBank.mintDecimals,
}
}, [inputBank, mangoAccount, outputBank, slippage, useMargin])
return tokenInMax
}