import MaxAmountButton from '@components/shared/MaxAmountButton' import { useTokenMax } from '@components/swap/useTokenMax' import mangoStore from '@store/mangoStore' import useSelectedMarket from 'hooks/useSelectedMarket' import { useTranslation } from 'next-i18next' import { useCallback, useMemo } from 'react' import { floorToDecimal, getDecimalCount } from 'utils/numbers' const MaxMarketSwapAmount = ({ setAmountIn, useMargin, }: { setAmountIn: (x: string) => void useMargin: boolean }) => { const { t } = useTranslation('common') const { price: oraclePrice, serumOrPerpMarket } = useSelectedMarket() const mangoAccountLoading = mangoStore((s) => s.mangoAccount.initialLoad) const { amount: tokenMax, amountWithBorrow, decimals, } = useTokenMax(useMargin) const tickDecimals = useMemo(() => { if (!serumOrPerpMarket) return decimals return getDecimalCount(serumOrPerpMarket.tickSize) }, [decimals, serumOrPerpMarket]) const maxAmount = useMemo(() => { const balanceMax = useMargin ? amountWithBorrow : tokenMax const { side } = mangoStore.getState().tradeForm const sideMax = side === 'buy' ? balanceMax.toNumber() / oraclePrice : balanceMax return floorToDecimal(sideMax, tickDecimals).toFixed() }, [amountWithBorrow, oraclePrice, tickDecimals, tokenMax, useMargin]) const setMax = useCallback(() => { const { side } = mangoStore.getState().tradeForm const max = useMargin ? amountWithBorrow : tokenMax const maxDecimals = side === 'buy' ? tickDecimals : decimals setAmountIn(floorToDecimal(max, maxDecimals).toFixed()) }, [decimals, setAmountIn, tickDecimals, useMargin]) if (mangoAccountLoading) return null return (

{t('trade:size')}

setMax()} value={maxAmount} />
) } export default MaxMarketSwapAmount