import { PerpMarket } from '@blockworks-foundation/mango-v4' import { LinkButton } from '@components/shared/Button' import { Table, Td, Th, TrBody, TrHead } from '@components/shared/TableElements' import { LinkIcon, NoSymbolIcon } from '@heroicons/react/20/solid' import { useWallet } from '@solana/wallet-adapter-react' import mangoStore from '@store/mangoStore' import useMangoGroup from 'hooks/useMangoGroup' import useSelectedMarket from 'hooks/useSelectedMarket' import { useTranslation } from 'next-i18next' import { formatFixedDecimals, getDecimalCount, numberFormat, trimDecimals, } from 'utils/numbers' import { calculateLimitPriceForMarketOrder } from 'utils/tradeForm' import PerpSideBadge from './PerpSideBadge' import TableMarketName from './TableMarketName' const PerpPositions = () => { const { t } = useTranslation(['common', 'trade']) const { connected } = useWallet() const { group } = useMangoGroup() const perpPositions = mangoStore((s) => s.mangoAccount.perpPositions) const { selectedMarket } = useSelectedMarket() const handlePositionClick = (positionSize: number) => { const tradeForm = mangoStore.getState().tradeForm const set = mangoStore.getState().set let price = Number(tradeForm.price) if (tradeForm.tradeType === 'Market') { const orderbook = mangoStore.getState().selectedMarket.orderbook price = calculateLimitPriceForMarketOrder( orderbook, positionSize, tradeForm.side ) } const newSide = positionSize > 0 ? 'sell' : 'buy' set((s) => { s.tradeForm.side = newSide s.tradeForm.baseSize = positionSize.toString() if (newSide === 'buy') { s.tradeForm.quoteSize = (positionSize * price).toString() } else { s.tradeForm.quoteSize = (positionSize / price).toString() } }) } if (!group) return null const openPerpPositions = Object.values(perpPositions).filter((p) => p.basePositionLots.toNumber() ) return connected ? ( openPerpPositions.length ? (
{openPerpPositions.map((position) => { const market = group.getPerpMarketByMarketIndex( position.marketIndex ) const basePosition = position.getBasePositionUi(market) const trimmedBasePosition = trimDecimals( basePosition, getDecimalCount(market.minOrderSize) ) const isSelectedMarket = selectedMarket instanceof PerpMarket && selectedMarket.perpMarketIndex === position.marketIndex if (!basePosition) return null const unsettledPnl = position.getEquityUi(group, market) return ( ) })}
{t('market')} {t('trade:side')} {t('trade:size')} {t('notional')} {t('trade:entry-price')} Redeemable PnL Realized PnL

{isSelectedMarket ? ( handlePositionClick(trimmedBasePosition) } > {Math.abs(trimmedBasePosition)} ) : ( Math.abs(trimmedBasePosition) )}

$ {Math.abs(trimmedBasePosition * market._uiPrice).toFixed( 2 )}
$ {numberFormat.format( position.getAverageEntryPriceUi(market) )}
0 ? 'text-th-up' : 'text-th-down' }`} >
${formatFixedDecimals(unsettledPnl)}
$ {/* {numberFormat.format( position.perpSpotTransfers.toNumber() )} */}
) : (

{t('trade:no-positions')}

) ) : (

{t('trade:connect-positions')}

) } export default PerpPositions