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

58 lines
1.8 KiB
TypeScript
Raw Normal View History

2022-08-26 10:17:31 -07:00
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 }
2022-08-26 11:19:16 -07:00
const inputBankFromGroup = group.getFirstBankByMint(inputBank.mint)
2022-08-26 22:23:08 -07:00
const tokenBalance = parseFloat(
formatDecimal(
mangoAccount?.getTokenBalanceUi(inputBankFromGroup),
inputBankFromGroup.mintDecimals
)
)
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 > 0 ? tokenBalance : 0
const maxUiAmountWithBorrow = mangoAccount?.getMaxSourceUiForTokenSwap(
group,
inputBank.mint,
outputBank.mint,
0.98 - slippage / 10
)
const maxAmount = useMargin
? Math.min(
maxAmountWithoutMargin,
inputBankVaultBalance,
maxUiAmountWithBorrow!
2022-08-26 10:17:31 -07:00
)
: Math.min(maxAmountWithoutMargin, inputBankVaultBalance)
const maxAmountWithBorrow = Math.min(
floorToDecimal(maxUiAmountWithBorrow!, inputBank.mintDecimals),
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, slippage, useMargin])
return tokenInMax
}