import useMangoAccount from 'hooks/useMangoAccount' import useMangoGroup from 'hooks/useMangoGroup' import { useTranslation } from 'next-i18next' import { useMemo, useState } from 'react' import { handleViewChange } from './AccountPage' import Tooltip from '@components/shared/Tooltip' import { HealthType, toUiDecimalsForQuote, } from '@blockworks-foundation/mango-v4' import HealthBar from './HealthBar' import FormatNumericValue from '@components/shared/FormatNumericValue' import { IconButton } from '@components/shared/Button' import { CalendarIcon, ChartBarIcon, ChevronRightIcon, } from '@heroicons/react/20/solid' import { useRouter } from 'next/router' import useAccountPerformanceData from 'hooks/useAccountPerformanceData' import Change from '@components/shared/Change' import PnlHistoryModal from '@components/modals/PnlHistoryModal' const AccountHeroStats = ({ accountValue }: { accountValue: number }) => { const { t } = useTranslation(['common', 'account']) const { group } = useMangoGroup() const { mangoAccount, mangoAccountAddress } = useMangoAccount() const { rollingDailyData } = useAccountPerformanceData() const router = useRouter() const [showPnlHistory, setShowPnlHistory] = useState(false) const handleGoToStats = () => { const query = { ...router.query, ['view']: 'account-stats' } router.push({ pathname: router.pathname, query }, undefined, { shallow: true, }) } const maintHealth = useMemo(() => { return group && mangoAccount ? mangoAccount.getHealthRatioUi(group, HealthType.maint) : 0 }, [mangoAccount, group]) const leverage = useMemo(() => { if (!group || !mangoAccount) return 0 const assetsValue = toUiDecimalsForQuote( mangoAccount.getAssetsValue(group).toNumber(), ) if (isNaN(assetsValue / accountValue)) { return 0 } else { return Math.abs(1 - assetsValue / accountValue) } }, [mangoAccount, group, accountValue]) const accountPnl = useMemo(() => { if (!group || !mangoAccount) return 0 return toUiDecimalsForQuote(mangoAccount.getPnl(group).toNumber()) }, [group, mangoAccount]) const pnlChangeToday = useMemo(() => { if (!accountPnl || !rollingDailyData.length) return 0 const startHour = rollingDailyData.find((item) => { const itemHour = new Date(item.time).getHours() return itemHour === 0 }) const startDayPnl = startHour?.pnl const pnlChangeToday = startDayPnl ? accountPnl - startDayPnl : 0 return pnlChangeToday }, [accountPnl, rollingDailyData]) const rollingDailyPnlChange = useMemo(() => { if (!accountPnl || !rollingDailyData.length) return 0 return accountPnl - rollingDailyData[0].pnl }, [accountPnl, rollingDailyData]) return ( <>

Health describes how close your account is to liquidation. The lower your account health is the more likely you are to get liquidated when prices fluctuate.

{maintHealth < 100 && mangoAccountAddress ? ( <>

Your account health is {maintHealth}%

Scenario: {' '} If the prices of all your liabilities increase by{' '} {maintHealth}%, even for just a moment, some of your liabilities will be liquidated.

Scenario: {' '} If the value of your total collateral decreases by{' '} {( (1 - 1 / ((maintHealth || 0) / 100 + 1)) * 100 ).toFixed(2)} % , some of your liabilities will be liquidated.

These are examples. A combination of events can also lead to liquidation.

) : null}
} >

{t('health')}

{mangoAccountAddress ? ( handleViewChange('health-contributions', router) } > ) : null}

{maintHealth}%

{t('leverage')}: x

{t('free-collateral')}

{t('total')}:

{t('pnl')}

{mangoAccountAddress ? ( setShowPnlHistory(true)} > ) : null}

{t('rolling-change')}

{showPnlHistory ? ( setShowPnlHistory(false)} pnlChangeToday={pnlChangeToday} /> ) : null} ) } export default AccountHeroStats