fix reduce only max amounts (#361)
This commit is contained in:
parent
2df3a68b06
commit
fbb3862906
|
@ -16,7 +16,11 @@ const MaxSwapAmount = ({
|
|||
}) => {
|
||||
const { t } = useTranslation('common')
|
||||
const mangoAccountLoading = mangoStore((s) => s.mangoAccount.initialLoad)
|
||||
const { amount: tokenMax, amountWithBorrow, decimals } = maxAmount(useMargin)
|
||||
const {
|
||||
amount: spotMax,
|
||||
amountWithBorrow: leverageMax,
|
||||
decimals,
|
||||
} = maxAmount(useMargin)
|
||||
|
||||
if (mangoAccountLoading) return null
|
||||
|
||||
|
@ -26,14 +30,13 @@ const MaxSwapAmount = ({
|
|||
|
||||
return (
|
||||
<div className="flex flex-wrap justify-end pl-6 text-xs">
|
||||
{tokenMax.lt(amountWithBorrow) ||
|
||||
(tokenMax.eq(amountWithBorrow) && !useMargin) ? (
|
||||
{spotMax.lt(leverageMax) || (spotMax.eq(leverageMax) && !useMargin) ? (
|
||||
<MaxAmountButton
|
||||
className="mb-0.5"
|
||||
decimals={decimals}
|
||||
label={useMargin ? t('bal') : t('max')}
|
||||
onClick={() => setMax(tokenMax)}
|
||||
value={tokenMax}
|
||||
onClick={() => setMax(spotMax)}
|
||||
value={spotMax}
|
||||
/>
|
||||
) : null}
|
||||
{useMargin ? (
|
||||
|
@ -41,8 +44,8 @@ const MaxSwapAmount = ({
|
|||
className="mb-0.5 ml-2"
|
||||
decimals={decimals}
|
||||
label={t('max')}
|
||||
onClick={() => setMax(amountWithBorrow)}
|
||||
value={amountWithBorrow}
|
||||
onClick={() => setMax(leverageMax)}
|
||||
value={leverageMax}
|
||||
/>
|
||||
) : null}
|
||||
</div>
|
||||
|
|
|
@ -201,7 +201,7 @@ const SwapForm = () => {
|
|||
{inputBank &&
|
||||
!walletSwap &&
|
||||
inputBank.areBorrowsReduceOnly() &&
|
||||
inputBank.areDepositsReduceOnly() ? (
|
||||
useMargin ? (
|
||||
<div className="pb-4">
|
||||
<InlineNotification
|
||||
type="warning"
|
||||
|
@ -211,10 +211,7 @@ const SwapForm = () => {
|
|||
/>
|
||||
</div>
|
||||
) : null}
|
||||
{outputBank &&
|
||||
!walletSwap &&
|
||||
outputBank.areBorrowsReduceOnly() &&
|
||||
outputBank.areDepositsReduceOnly() ? (
|
||||
{outputBank && !walletSwap && outputBank.areDepositsReduceOnly() ? (
|
||||
<div className="pb-4">
|
||||
<InlineNotification
|
||||
type="warning"
|
||||
|
|
|
@ -199,13 +199,7 @@ const SwapFormTokenList = ({
|
|||
const tokenPk = new PublicKey(token.address)
|
||||
const tokenBank = group.getFirstBankByMint(tokenPk)
|
||||
const max = mangoAccount
|
||||
? getTokenInMax(
|
||||
mangoAccount,
|
||||
tokenPk,
|
||||
outputBank.mint,
|
||||
group,
|
||||
useMargin,
|
||||
)
|
||||
? getTokenInMax(mangoAccount, tokenPk, outputBank.mint, group)
|
||||
: {
|
||||
amount: new Decimal(0),
|
||||
amountWithBorrow: new Decimal(0),
|
||||
|
|
|
@ -64,7 +64,6 @@ export const getTokenInMax = (
|
|||
inputMint: PublicKey,
|
||||
outputMint: PublicKey,
|
||||
group: Group,
|
||||
useMargin: boolean,
|
||||
) => {
|
||||
const inputBank = group.getFirstBankByMint(inputMint)
|
||||
const outputBank = group.getFirstBankByMint(outputMint)
|
||||
|
@ -87,13 +86,6 @@ export const getTokenInMax = (
|
|||
const outputTokenBalance = new Decimal(
|
||||
mangoAccount.getTokenBalanceUi(outputBank),
|
||||
)
|
||||
|
||||
const maxAmountWithoutMargin =
|
||||
(inputTokenBalance.gt(0) && !outputReduceOnly) ||
|
||||
(outputReduceOnly && outputTokenBalance.lt(0))
|
||||
? inputTokenBalance
|
||||
: new Decimal(0)
|
||||
|
||||
const rawMaxUiAmountWithBorrow = getMaxSourceForSwap(
|
||||
group,
|
||||
mangoAccount,
|
||||
|
@ -101,12 +93,16 @@ export const getTokenInMax = (
|
|||
outputBank.mint,
|
||||
)
|
||||
|
||||
const maxUiAmountWithBorrow =
|
||||
outputReduceOnly && (outputTokenBalance.gt(0) || outputTokenBalance.eq(0))
|
||||
? new Decimal(0)
|
||||
: rawMaxUiAmountWithBorrow > 0
|
||||
? floorToDecimal(rawMaxUiAmountWithBorrow, inputBank.mintDecimals)
|
||||
: new Decimal(0)
|
||||
let spotMax = new Decimal(0)
|
||||
let leverageMax = new Decimal(0)
|
||||
|
||||
if (!outputReduceOnly || (outputReduceOnly && outputTokenBalance.lt(0))) {
|
||||
spotMax = inputTokenBalance
|
||||
leverageMax = floorToDecimal(
|
||||
rawMaxUiAmountWithBorrow,
|
||||
inputBank.mintDecimals,
|
||||
)
|
||||
}
|
||||
|
||||
const inputBankVaultBalance = floorToDecimal(
|
||||
group
|
||||
|
@ -115,21 +111,11 @@ export const getTokenInMax = (
|
|||
inputBank.mintDecimals,
|
||||
)
|
||||
|
||||
const maxAmount = useMargin
|
||||
? Decimal.min(
|
||||
maxAmountWithoutMargin,
|
||||
inputBankVaultBalance,
|
||||
maxUiAmountWithBorrow,
|
||||
)
|
||||
: Decimal.min(
|
||||
maxAmountWithoutMargin,
|
||||
inputBankVaultBalance,
|
||||
maxUiAmountWithBorrow,
|
||||
)
|
||||
const maxAmount = Decimal.min(spotMax, leverageMax, inputBankVaultBalance)
|
||||
|
||||
const maxAmountWithBorrow = inputReduceOnly
|
||||
? Decimal.min(maxAmountWithoutMargin, inputBankVaultBalance)
|
||||
: Decimal.min(maxUiAmountWithBorrow, inputBankVaultBalance)
|
||||
? Decimal.min(spotMax, leverageMax, inputBankVaultBalance)
|
||||
: Decimal.min(leverageMax, inputBankVaultBalance)
|
||||
|
||||
return {
|
||||
amount: maxAmount,
|
||||
|
@ -158,7 +144,6 @@ export const useTokenMax = (useMargin = true): TokenMaxResults => {
|
|||
inputBank.mint,
|
||||
outputBank.mint,
|
||||
group,
|
||||
useMargin,
|
||||
)
|
||||
}
|
||||
} catch (e) {
|
||||
|
|
|
@ -30,32 +30,53 @@ export const useSpotMarketMax = (
|
|||
selectedMarket.serumMarketExternal,
|
||||
)
|
||||
if (side === 'buy') {
|
||||
leverageMax = mangoAccount.getMaxQuoteForSerum3BidUi(
|
||||
group,
|
||||
selectedMarket.serumMarketExternal,
|
||||
)
|
||||
const bank = group.getFirstBankByTokenIndex(
|
||||
const quoteBank = group.getFirstBankByTokenIndex(
|
||||
selectedMarket.quoteTokenIndex,
|
||||
)
|
||||
const balance = mangoAccount.getTokenBalanceUi(bank)
|
||||
const unsettled = spotBalances[bank.mint.toString()]?.unsettled || 0
|
||||
const tickDecimals = getDecimalCount(market.tickSize)
|
||||
spotMax = floorToDecimal(balance + unsettled, tickDecimals).toNumber()
|
||||
} else {
|
||||
leverageMax = mangoAccount.getMaxBaseForSerum3AskUi(
|
||||
const balance = mangoAccount.getTokenBalanceUi(quoteBank)
|
||||
const quoteLeverageMax = mangoAccount.getMaxQuoteForSerum3BidUi(
|
||||
group,
|
||||
selectedMarket.serumMarketExternal,
|
||||
)
|
||||
const bank = group.getFirstBankByTokenIndex(
|
||||
const unsettled =
|
||||
spotBalances[quoteBank?.mint.toString()]?.unsettled || 0
|
||||
const tickDecimals = getDecimalCount(market.tickSize)
|
||||
const roundedBalanceMax = floorToDecimal(
|
||||
balance + unsettled,
|
||||
tickDecimals,
|
||||
).toNumber()
|
||||
spotMax = roundedBalanceMax
|
||||
|
||||
const isReduceOnly = quoteBank?.areBorrowsReduceOnly()
|
||||
if (isReduceOnly) {
|
||||
leverageMax = roundedBalanceMax
|
||||
} else {
|
||||
leverageMax = quoteLeverageMax
|
||||
}
|
||||
} else {
|
||||
const baseBank = group.getFirstBankByTokenIndex(
|
||||
selectedMarket.baseTokenIndex,
|
||||
)
|
||||
const balance = mangoAccount.getTokenBalanceUi(bank)
|
||||
const unsettled = spotBalances[bank.mint.toString()]?.unsettled || 0
|
||||
const baseLeverageMax = mangoAccount.getMaxBaseForSerum3AskUi(
|
||||
group,
|
||||
selectedMarket.serumMarketExternal,
|
||||
)
|
||||
const balance = mangoAccount.getTokenBalanceUi(baseBank)
|
||||
const unsettled =
|
||||
spotBalances[baseBank?.mint.toString()]?.unsettled || 0
|
||||
const minOrderDecimals = getDecimalCount(market.minOrderSize)
|
||||
spotMax = floorToDecimal(
|
||||
const roundedBalanceMax = floorToDecimal(
|
||||
balance + unsettled,
|
||||
minOrderDecimals,
|
||||
).toNumber()
|
||||
spotMax = roundedBalanceMax
|
||||
|
||||
const isReduceOnly = baseBank?.areBorrowsReduceOnly()
|
||||
if (isReduceOnly) {
|
||||
leverageMax = roundedBalanceMax
|
||||
} else {
|
||||
leverageMax = baseLeverageMax
|
||||
}
|
||||
}
|
||||
return useMargin ? leverageMax : Math.max(spotMax, 0)
|
||||
} catch (e) {
|
||||
|
|
|
@ -13,7 +13,7 @@
|
|||
"hide-fees": "Hide Fees",
|
||||
"hide-swap-history": "Hide Swap History",
|
||||
"important-info": "Important Info",
|
||||
"input-reduce-only-warning": "{{symbol}} is in reduce only mode. You can swap your balance to another token",
|
||||
"input-reduce-only-warning": "{{symbol}} borrows are disabled",
|
||||
"insufficient-balance": "Insufficient {{symbol}} Balance",
|
||||
"insufficient-collateral": "Insufficient Collateral",
|
||||
"margin": "Margin",
|
||||
|
|
|
@ -13,7 +13,7 @@
|
|||
"hide-fees": "Hide Fees",
|
||||
"hide-swap-history": "Hide Swap History",
|
||||
"important-info": "Important Info",
|
||||
"input-reduce-only-warning": "{{symbol}} is in reduce only mode. You can swap your balance to another token",
|
||||
"input-reduce-only-warning": "{{symbol}} borrows are disabled",
|
||||
"insufficient-balance": "Insufficient {{symbol}} Balance",
|
||||
"insufficient-collateral": "Insufficient Collateral",
|
||||
"margin": "Margin",
|
||||
|
|
|
@ -13,7 +13,7 @@
|
|||
"hide-fees": "Hide Fees",
|
||||
"hide-swap-history": "Hide Swap History",
|
||||
"important-info": "Important Info",
|
||||
"input-reduce-only-warning": "{{symbol}} is in reduce only mode. You can swap your balance to another token",
|
||||
"input-reduce-only-warning": "{{symbol}} borrows are disabled",
|
||||
"insufficient-balance": "Insufficient {{symbol}} Balance",
|
||||
"insufficient-collateral": "Insufficient Collateral",
|
||||
"margin": "Margin",
|
||||
|
|
|
@ -13,7 +13,7 @@
|
|||
"hide-fees": "隐藏费用",
|
||||
"hide-swap-history": "隐藏换币纪录",
|
||||
"important-info": "重要资料",
|
||||
"input-reduce-only-warning": "{{symbol}}处于仅减少模式。您可以将余额换成另一个币种",
|
||||
"input-reduce-only-warning": "{{symbol}} borrows are disabled",
|
||||
"insufficient-balance": "{{symbol}}余额不够",
|
||||
"insufficient-collateral": "质押品不够",
|
||||
"margin": "保证金",
|
||||
|
|
|
@ -13,7 +13,7 @@
|
|||
"hide-fees": "隱藏費用",
|
||||
"hide-swap-history": "隱藏換幣紀錄",
|
||||
"important-info": "重要資料",
|
||||
"input-reduce-only-warning": "{{symbol}}處於僅減少模式。您可以將餘額換成另一個幣種",
|
||||
"input-reduce-only-warning": "{{symbol}} borrows are disabled",
|
||||
"insufficient-balance": "{{symbol}}餘額不夠",
|
||||
"insufficient-collateral": "質押品不夠",
|
||||
"margin": "保證金",
|
||||
|
|
Loading…
Reference in New Issue