import { FunctionComponent, useEffect, useRef, useState } from 'react' import useMangoStore from '../stores/useMangoStore' import { PerpMarket, ZERO_BN } from '@blockworks-foundation/mango-client' import Button, { LinkButton } from './Button' import { notify } from '../utils/notifications' import Loading from './Loading' import { calculateTradePrice, sleep } from '../utils' import Modal from './Modal' interface MarketCloseModalProps { onClose: () => void isOpen: boolean market: PerpMarket marketIndex: number } const MarketCloseModal: FunctionComponent = ({ onClose, isOpen, market, marketIndex, }) => { const [submitting, setSubmitting] = useState(false) const actions = useMangoStore((s) => s.actions) const mangoClient = useMangoStore((s) => s.connection.client) const orderBookRef = useRef(useMangoStore.getState().selectedMarket.orderBook) const config = useMangoStore.getState().selectedMarket.config const orderbook = orderBookRef.current useEffect( () => useMangoStore.subscribe( // @ts-ignore (orderBook) => (orderBookRef.current = orderBook), (state) => state.selectedMarket.orderBook ), [] ) async function handleMarketClose() { const mangoAccount = useMangoStore.getState().selectedMangoAccount.current const mangoGroup = useMangoStore.getState().selectedMangoGroup.current const { askInfo, bidInfo } = useMangoStore.getState().selectedMarket const wallet = useMangoStore.getState().wallet.current const connection = useMangoStore.getState().connection.current if (!wallet || !mangoGroup || !mangoAccount) return setSubmitting(true) try { const reloadedMangoAccount = await mangoAccount.reload(connection) const perpAccount = reloadedMangoAccount.perpAccounts[marketIndex] const side = perpAccount.basePosition.gt(ZERO_BN) ? 'sell' : 'buy' const size = Math.abs(market.baseLotsToNumber(perpAccount.basePosition)) const orderPrice = calculateTradePrice( 'Market', orderbook, size, side, '' ) if (!orderPrice) { notify({ title: 'Price not available', description: 'Please try again', type: 'error', }) } const txid = await mangoClient.placePerpOrder( mangoGroup, mangoAccount, mangoGroup.mangoCache, market, wallet, side, orderPrice, size, 'ioc', 0, side === 'buy' ? askInfo : bidInfo ) await sleep(500) actions.reloadMangoAccount() notify({ title: 'Transaction sent', txid }) } catch (e) { notify({ title: 'Error placing order', description: e.message, txid: e.txid, type: 'error', }) } finally { setSubmitting(false) onClose() } } return (
Are you sure you want to market close your
{config.name}{' '} position?
The price you receive may be more or less than you expect.
Cancel
) } export default MarketCloseModal