From e8cdbd0437f625fb8b4a3881327cf8dde225694a Mon Sep 17 00:00:00 2001 From: saml33 Date: Tue, 18 Jul 2023 22:13:08 +1000 Subject: [PATCH] checkout orderbook liquidity before market close --- components/trade/MarketCloseModal.tsx | 41 +++++++++++++++++++++------ public/locales/en/trade.json | 1 + public/locales/es/trade.json | 1 + public/locales/ru/trade.json | 1 + public/locales/zh/trade.json | 1 + public/locales/zh_tw/trade.json | 1 + 6 files changed, 37 insertions(+), 9 deletions(-) diff --git a/components/trade/MarketCloseModal.tsx b/components/trade/MarketCloseModal.tsx index e525717c..1fd1ce28 100644 --- a/components/trade/MarketCloseModal.tsx +++ b/components/trade/MarketCloseModal.tsx @@ -1,4 +1,10 @@ -import { FunctionComponent, useCallback, useEffect, useState } from 'react' +import { + FunctionComponent, + useCallback, + useEffect, + useMemo, + useState, +} from 'react' import mangoStore from '@store/mangoStore' import { useTranslation } from 'next-i18next' import { @@ -17,6 +23,7 @@ import { INITIAL_SOUND_SETTINGS } from '@components/settings/SoundSettings' import { Howl } from 'howler' import { isMangoError } from 'types' import { decodeBook, decodeBookL2 } from './Orderbook' +import InlineNotification from '@components/shared/InlineNotification' interface MarketCloseModalProps { onClose: () => void @@ -113,6 +120,21 @@ const MarketCloseModal: FunctionComponent = ({ } }, [connection, perpMarket, group]) + const insufficientLiquidity = useMemo(() => { + if (!perpMarket) return true + const baseSize = position.getBasePositionUi(perpMarket) + const isBids = baseSize < 0 + if (isBids) { + if (!bids || !bids.length) return true + const liquidityMax = bids.reduce((a, c) => a + c[1], 0) + return liquidityMax < baseSize + } else { + if (!asks || !asks.length) return true + const liquidityMax = asks.reduce((a, c) => a + c[1], 0) + return liquidityMax < baseSize + } + }, [perpMarket, position, bids, asks]) + const handleMarketClose = useCallback( async (bids: BidsAndAsks, asks: BidsAndAsks) => { const client = mangoStore.getState().client @@ -138,14 +160,6 @@ const MarketCloseModal: FunctionComponent = ({ ) const maxSlippage = 0.025 - // const perpOrderType = - // tradeForm.tradeType === 'Market' - // ? PerpOrderType.market - // : tradeForm.ioc - // ? PerpOrderType.immediateOrCancel - // : tradeForm.postOnly - // ? PerpOrderType.postOnly - // : PerpOrderType.limit const tx = await client.perpPlaceOrder( group, mangoAccount, @@ -196,8 +210,17 @@ const MarketCloseModal: FunctionComponent = ({ {t('trade:close-confirm', { config_name: perpMarket?.name })}
{t('trade:price-expect')}
+ {insufficientLiquidity ? ( +
+ +
+ ) : null}