mango-v4-ui/components/swap/useTokenMax.tsx

84 lines
2.4 KiB
TypeScript
Raw Normal View History

import { Bank, Group, MangoAccount } from '@blockworks-foundation/mango-v4'
import Decimal from 'decimal.js'
2022-08-26 10:17:31 -07:00
import { useMemo } from 'react'
import mangoStore from '../../store/mangoStore'
import { floorToDecimal } from '../../utils/numbers'
import useMangoAccount from '../shared/useMangoAccount'
2022-08-26 10:17:31 -07:00
export const getMaxWithdrawForBank = (
group: Group,
bank: Bank,
mangoAccount: MangoAccount,
allowBorrow: boolean = false
): Decimal => {
const accountBalance = mangoAccount?.getTokenBalanceUi(bank)
const vaultBalance = group.getTokenVaultBalanceByMintUi(bank.mint)
const maxBorrow = floorToDecimal(
mangoAccount?.getMaxWithdrawWithBorrowForTokenUi(group, bank.mint)!,
bank.mintDecimals
)
return allowBorrow
? Decimal.min(vaultBalance, maxBorrow!)
: Decimal.min(accountBalance, vaultBalance, maxBorrow!)
}
2022-08-26 10:17:31 -07:00
export const useTokenMax = (useMargin = true) => {
const { mangoAccount } = useMangoAccount()
2022-08-26 10:17:31 -07:00
const inputBank = mangoStore((s) => s.swap.inputBank)
const outputBank = mangoStore((s) => s.swap.outputBank)
const tokenInMax = useMemo(() => {
const group = mangoStore.getState().group
if (!group || !inputBank || !mangoAccount || !outputBank)
return {
amount: new Decimal(0.0),
decimals: 6,
amountWithBorrow: new Decimal(0.0),
}
2022-08-26 10:17:31 -07:00
2022-08-26 11:19:16 -07:00
const inputBankFromGroup = group.getFirstBankByMint(inputBank.mint)
const tokenBalance = floorToDecimal(
mangoAccount?.getTokenBalanceUi(inputBankFromGroup),
inputBankFromGroup.mintDecimals
2022-08-26 22:23:08 -07:00
)
2022-08-26 22:51:14 -07:00
2022-08-26 22:23:08 -07:00
const inputBankVaultBalance = group.getTokenVaultBalanceByMintUi(
2022-08-26 22:48:18 -07:00
inputBank.mint
2022-08-26 10:17:31 -07:00
)
const maxAmountWithoutMargin = tokenBalance.gt(0)
? tokenBalance
: new Decimal(0)
2022-08-26 10:17:31 -07:00
const maxUiAmountWithBorrow = floorToDecimal(
mangoAccount?.getMaxSourceUiForTokenSwap(
group,
inputBank.mint,
outputBank.mint,
1
)!,
inputBank.mintDecimals
2022-08-26 10:17:31 -07:00
)
const maxAmount = useMargin
? Decimal.min(
2022-08-26 10:17:31 -07:00
maxAmountWithoutMargin,
inputBankVaultBalance,
maxUiAmountWithBorrow!
2022-08-26 10:17:31 -07:00
)
: Decimal.min(maxAmountWithoutMargin, inputBankVaultBalance)
2022-08-26 10:17:31 -07:00
const maxAmountWithBorrow = Decimal.min(
maxUiAmountWithBorrow!,
2022-08-26 10:17:31 -07:00
inputBankVaultBalance
)
return {
2022-08-26 11:19:16 -07:00
amount: maxAmount,
amountWithBorrow: maxAmountWithBorrow,
2022-08-26 10:17:31 -07:00
decimals: inputBank.mintDecimals,
}
}, [inputBank, mangoAccount, outputBank, useMargin])
2022-08-26 10:17:31 -07:00
return tokenInMax
}