import FormatNumericValue from '@components/shared/FormatNumericValue' import { Table, Td, Th, TrBody, TrHead } from '@components/shared/TableElements' import TableMarketName from '@components/trade/TableMarketName' import { ChevronDownIcon, ChevronRightIcon } from '@heroicons/react/20/solid' import useMangoGroup from 'hooks/useMangoGroup' import { useTranslation } from 'next-i18next' import { abbreviateAddress } from 'utils/formatting' import { floorToDecimal, getDecimalCount } from 'utils/numbers' import Tooltip from '@components/shared/Tooltip' import PnlTooltipContent from '@components/shared/PnlTooltipContent' import { useViewport } from 'hooks/useViewport' import { breakpoints } from 'utils/theme' import { Disclosure, Transition } from '@headlessui/react' import { PositionStat } from 'types' const PerpPositionsStatsTable = ({ positions, }: { positions: PositionStat[] }) => { const { t } = useTranslation(['common', 'stats', 'trade']) const { group } = useMangoGroup() const { width } = useViewport() const showTableView = width ? width > breakpoints.md : false if (!group) return null return showTableView ? (
{positions.map(({ account, perpPosition, mangoAccount }, i) => { const market = group.getPerpMarketByMarketIndex( perpPosition.marketIndex, ) const basePosition = perpPosition.getBasePositionUi(market) if (!basePosition) return null const floorBasePosition = floorToDecimal( basePosition, getDecimalCount(market.minOrderSize), ).toNumber() const isLong = basePosition > 0 const avgEntryPrice = perpPosition.getAverageEntryPriceUi(market) const unsettledPnl = perpPosition.getUnsettledPnlUi(market) const totalPnl = perpPosition.cumulativePnlOverPositionLifetimeUi(market) const unrealizedPnl = perpPosition.getUnRealizedPnlUi(market) const realizedPnl = perpPosition.getRealizedPnlUi() const roe = (unrealizedPnl / (Math.abs(basePosition) * avgEntryPrice)) * 100 let estLiqPrice if (account) { estLiqPrice = perpPosition.getLiquidationPriceUi(group, account) } return ( ) })}
{t('market')} {t('trade:size')} {t('trade:avg-entry-price')} {t('trade:est-liq-price')} {t('trade:unrealized-pnl')} {t('account')}
{estLiqPrice ? ( ) : ( '–' )}
} delay={100} > = 0 ? 'text-th-up' : 'text-th-down' }`} > = 0 ? 'text-th-up' : 'text-th-down'}> %{' '} (ROE)
) : (
{positions.map(({ account, perpPosition, mangoAccount }) => { const market = group.getPerpMarketByMarketIndex( perpPosition.marketIndex, ) const basePosition = perpPosition.getBasePositionUi(market) if (!basePosition) return null const floorBasePosition = floorToDecimal( basePosition, getDecimalCount(market.minOrderSize), ).toNumber() const isLong = basePosition > 0 const avgEntryPrice = perpPosition.getAverageEntryPriceUi(market) const unsettledPnl = perpPosition.getUnsettledPnlUi(market) const totalPnl = perpPosition.cumulativePnlOverPositionLifetimeUi(market) const unrealizedPnl = perpPosition.getUnRealizedPnlUi(market) const realizedPnl = perpPosition.getRealizedPnlUi() const roe = (unrealizedPnl / (Math.abs(basePosition) * avgEntryPrice)) * 100 let estLiqPrice: number | null if (account) { estLiqPrice = perpPosition.getLiquidationPriceUi(group, account) } return ( {({ open }) => ( <>
{' '} {market.name.split('-')[0]} |

{t('trade:size')}

{t('trade:avg-entry-price')}

{t('trade:est-liq-price')}

{estLiqPrice ? ( ) : ( '–' )}

{t('trade:unrealized-pnl')}

} delay={100} > = 0 ? 'text-th-up' : 'text-th-down' }`} >

ROE

= 0 ? 'text-th-up' : 'text-th-down' }`} > %

)}
) })}
) } export default PerpPositionsStatsTable