import { MangoAccount, Serum3Market } from '@blockworks-foundation/mango-v4' import LeverageSlider from '@components/shared/LeverageSlider' import mangoStore from '@store/mangoStore' import useMangoAccount from 'hooks/useMangoAccount' import useSelectedMarket from 'hooks/useSelectedMarket' import { useCallback, useMemo } from 'react' import { GenericMarket } from 'types' import { trimDecimals } from 'utils/numbers' export const useSpotMarketMax = ( mangoAccount: MangoAccount | undefined, selectedMarket: GenericMarket | undefined, side: string, useMargin: boolean ) => { const max = useMemo(() => { const group = mangoStore.getState().group if (!mangoAccount || !group || !selectedMarket) return 100 if (!(selectedMarket instanceof Serum3Market)) return 100 let leverageMax = 0 let spotMax = 0 try { if (side === 'buy') { leverageMax = mangoAccount.getMaxQuoteForSerum3BidUi( group, selectedMarket.serumMarketExternal ) spotMax = mangoAccount.getTokenBalanceUi( group.getFirstBankByTokenIndex(selectedMarket.quoteTokenIndex) ) } else { leverageMax = mangoAccount.getMaxBaseForSerum3AskUi( group, selectedMarket.serumMarketExternal ) spotMax = mangoAccount.getTokenBalanceUi( group.getFirstBankByTokenIndex(selectedMarket.baseTokenIndex) ) } return useMargin ? leverageMax : Math.max(spotMax, 0) } catch (e) { console.error('Error calculating max leverage: spot btn group: ', e) return 0 } }, [side, selectedMarket, mangoAccount, useMargin]) return max } const SpotSlider = ({ minOrderDecimals, tickDecimals, step, useMargin, }: { minOrderDecimals: number tickDecimals: number step: number useMargin: boolean }) => { const side = mangoStore((s) => s.tradeForm.side) const { selectedMarket, price: marketPrice } = useSelectedMarket() const { mangoAccount } = useMangoAccount() const tradeForm = mangoStore((s) => s.tradeForm) const max = useSpotMarketMax(mangoAccount, selectedMarket, side, useMargin) const handleSlide = useCallback( (val: string) => { const set = mangoStore.getState().set set((s) => { const price = s.tradeForm.tradeType === 'Market' ? marketPrice : Number(s.tradeForm.price) if (s.tradeForm.side === 'buy') { s.tradeForm.quoteSize = val if (Number(price)) { s.tradeForm.baseSize = trimDecimals( parseFloat(val) / price, minOrderDecimals ).toFixed(minOrderDecimals) } else { s.tradeForm.baseSize = '' } } else if (s.tradeForm.side === 'sell') { s.tradeForm.baseSize = val if (Number(price)) { s.tradeForm.quoteSize = trimDecimals( parseFloat(val) * price, tickDecimals ).toFixed(tickDecimals) } } }) }, [marketPrice, minOrderDecimals, tickDecimals] ) return (
) } export default SpotSlider