fix reduce only max amounts (#361)

This commit is contained in:
saml33 2024-01-01 23:46:08 +11:00 committed by GitHub
parent 2df3a68b06
commit fbb3862906
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
10 changed files with 67 additions and 67 deletions

View File

@ -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>

View File

@ -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"

View File

@ -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),

View File

@ -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) {

View File

@ -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) {

View File

@ -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",

View File

@ -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",

View File

@ -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",

View File

@ -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": "保证金",

View File

@ -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": "保證金",