diff --git a/components/account/AccountHeroStats.tsx b/components/account/AccountHeroStats.tsx new file mode 100644 index 00000000..9e17eb75 --- /dev/null +++ b/components/account/AccountHeroStats.tsx @@ -0,0 +1,501 @@ +import mangoStore from '@store/mangoStore' +import useMangoAccount from 'hooks/useMangoAccount' +import useMangoGroup from 'hooks/useMangoGroup' +import { useTranslation } from 'next-i18next' +import { useEffect, useMemo } from 'react' +import { ChartToShow } from './AccountPage' +import { useQuery } from '@tanstack/react-query' +import { fetchFundingTotals, fetchVolumeTotals } from 'utils/account' +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 } from '@heroicons/react/20/solid' +import Change from '@components/shared/Change' +import SheenLoader from '@components/shared/SheenLoader' +import { FormattedHourlyAccountVolumeData, PerformanceDataItem } from 'types' + +const AccountHeroStats = ({ + accountPnl, + accountValue, + hourlyVolumeData, + loadingHourlyVolume, + rollingDailyData, + setShowPnlHistory, + setChartToShow, +}: { + accountPnl: number + accountValue: number + hourlyVolumeData: FormattedHourlyAccountVolumeData[] | undefined + loadingHourlyVolume: boolean + rollingDailyData: PerformanceDataItem[] + setShowPnlHistory: (show: boolean) => void + setChartToShow: (view: ChartToShow) => void +}) => { + const { t } = useTranslation(['common', 'account']) + const { group } = useMangoGroup() + const { mangoAccount, mangoAccountAddress } = useMangoAccount() + + const totalInterestData = mangoStore( + (s) => s.mangoAccount.interestTotals.data + ) + + useEffect(() => { + if (mangoAccountAddress) { + const actions = mangoStore.getState().actions + actions.fetchAccountInterestTotals(mangoAccountAddress) + } + }, [mangoAccountAddress]) + + const { + data: fundingData, + isLoading: loadingFunding, + isFetching: fetchingFunding, + } = useQuery( + ['funding', mangoAccountAddress], + () => fetchFundingTotals(mangoAccountAddress), + { + cacheTime: 1000 * 60 * 10, + staleTime: 1000 * 60, + retry: 3, + refetchOnWindowFocus: false, + enabled: !!mangoAccountAddress, + } + ) + + const { + data: volumeTotalData, + isLoading: loadingVolumeTotalData, + isFetching: fetchingVolumeTotalData, + } = useQuery( + ['total-volume', mangoAccountAddress], + () => fetchVolumeTotals(mangoAccountAddress), + { + cacheTime: 1000 * 60 * 10, + staleTime: 1000 * 60, + retry: 3, + refetchOnWindowFocus: false, + enabled: !!mangoAccountAddress, + } + ) + + 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 rollingDailyPnlChange = useMemo(() => { + if (!accountPnl || !rollingDailyData.length) return 0 + return accountPnl - rollingDailyData[0].pnl + }, [accountPnl, rollingDailyData]) + + const interestTotalValue = useMemo(() => { + if (totalInterestData.length) { + return totalInterestData.reduce( + (a, c) => a + (c.borrow_interest_usd * -1 + c.deposit_interest_usd), + 0 + ) + } + return 0.0 + }, [totalInterestData]) + + const fundingTotalValue = useMemo(() => { + if (fundingData?.length && mangoAccountAddress) { + return fundingData.reduce( + (a, c) => a + c.long_funding + c.short_funding, + 0 + ) + } + return 0.0 + }, [fundingData, mangoAccountAddress]) + + const oneDayInterestChange = useMemo(() => { + if (rollingDailyData.length) { + const first = rollingDailyData[0] + const latest = rollingDailyData[rollingDailyData.length - 1] + + const startDayInterest = + first.borrow_interest_cumulative_usd + + first.deposit_interest_cumulative_usd + + const endDayInterest = + latest.borrow_interest_cumulative_usd + + latest.deposit_interest_cumulative_usd + + return endDayInterest - startDayInterest + } + return 0.0 + }, [rollingDailyData]) + + const dailyVolume = useMemo(() => { + if (!hourlyVolumeData || !hourlyVolumeData.length) return 0 + // Calculate the current time in milliseconds + const currentTime = new Date().getTime() + + // Calculate the start time for the last 24 hours in milliseconds + const last24HoursStartTime = currentTime - 24 * 60 * 60 * 1000 + + // Filter the formatted data based on the timestamp + const last24HoursData = hourlyVolumeData.filter((entry) => { + const timestampMs = new Date(entry.time).getTime() + return timestampMs >= last24HoursStartTime && timestampMs <= currentTime + }) + + const volume = last24HoursData.reduce((a, c) => a + c.total_volume_usd, 0) + return volume + }, [hourlyVolumeData]) + + const handleChartToShow = ( + viewName: + | 'pnl' + | 'cumulative-interest-value' + | 'hourly-funding' + | 'hourly-volume' + ) => { + setChartToShow(viewName) + } + + const loadingTotalVolume = fetchingVolumeTotalData || loadingVolumeTotalData + + 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')} +

+ +
+

+ {maintHealth}% +

+ +
+ + + {t('leverage')}: + + + x + + +
+
+
+
+ +

+ {t('free-collateral')} +

+
+

+ +

+ + + {t('total')}: + + + + + +
+
+
+
+
+ +

+ {t('pnl')} +

+
+ {mangoAccountAddress ? ( +
+ + handleChartToShow('pnl')} + > + + + + + setShowPnlHistory(true)} + > + + + +
+ ) : null} +
+

+ +

+
+ +

{t('rolling-change')}

+
+
+
+
+
+
+

+ {t('account:lifetime-volume')} +

+ {mangoAccountAddress ? ( + + handleChartToShow('hourly-volume')} + > + + + + ) : null} +
+ {loadingTotalVolume && mangoAccountAddress ? ( + +
+ + ) : ( +

+ +

+ )} + + {t('account:daily-volume')}: + {loadingHourlyVolume && mangoAccountAddress ? ( + +
+ + ) : ( + + + + )} + +
+
+
+
+
+ +

+ {t('total-interest-earned')} +

+
+ {mangoAccountAddress ? ( + + + handleChartToShow('cumulative-interest-value') + } + > + + + + ) : null} +
+

+ +

+
+ +

{t('rolling-change')}

+
+
+
+
+
+ +

+ {t('account:total-funding-earned')} +

+
+ {mangoAccountAddress ? ( + + handleChartToShow('hourly-funding')} + > + + + + ) : null} +
+ {(loadingFunding || fetchingFunding) && mangoAccountAddress ? ( + +
+ + ) : ( +

+ +

+ )} +
+
+ + ) +} + +export default AccountHeroStats diff --git a/components/account/AccountPage.tsx b/components/account/AccountPage.tsx index 77c582f6..ff9f3298 100644 --- a/components/account/AccountPage.tsx +++ b/components/account/AccountPage.tsx @@ -1,54 +1,25 @@ -import { - HealthType, - toUiDecimalsForQuote, -} from '@blockworks-foundation/mango-v4' +import { toUiDecimalsForQuote } from '@blockworks-foundation/mango-v4' import { useTranslation } from 'next-i18next' -import { useEffect, useMemo, useState } from 'react' +import { useMemo, useState } from 'react' import AccountActions from './AccountActions' -import mangoStore from '@store/mangoStore' -import { formatCurrencyValue } from '../../utils/numbers' -import FlipNumbers from 'react-flip-numbers' -import SimpleAreaChart from '@components/shared/SimpleAreaChart' -import { COLORS } from '../../styles/colors' -import { useTheme } from 'next-themes' -import { IconButton } from '../shared/Button' -import { - ArrowsPointingOutIcon, - CalendarIcon, - ChartBarIcon, -} from '@heroicons/react/20/solid' -import { Transition } from '@headlessui/react' import AccountTabs from './AccountTabs' -import SheenLoader from '../shared/SheenLoader' import AccountChart from './AccountChart' import useMangoAccount from '../../hooks/useMangoAccount' -import Change from '../shared/Change' -import Tooltip from '@components/shared/Tooltip' -import { - ANIMATION_SETTINGS_KEY, - // IS_ONBOARDED_KEY -} from 'utils/constants' import useLocalStorageState from 'hooks/useLocalStorageState' // import AccountOnboardingTour from '@components/tours/AccountOnboardingTour' import dayjs from 'dayjs' -import { INITIAL_ANIMATION_SETTINGS } from '@components/settings/AnimationSettings' import { useViewport } from 'hooks/useViewport' import { breakpoints } from 'utils/theme' import useMangoGroup from 'hooks/useMangoGroup' import PnlHistoryModal from '@components/modals/PnlHistoryModal' -import FormatNumericValue from '@components/shared/FormatNumericValue' -import HealthBar from './HealthBar' import AssetsLiabilities from './AssetsLiabilities' import { PerformanceDataItem } from 'types' import { useQuery } from '@tanstack/react-query' import FundingChart from './FundingChart' import VolumeChart from './VolumeChart' -import { - fetchAccountPerformance, - fetchFundingTotals, - fetchHourlyVolume, - fetchVolumeTotals, -} from 'utils/account' +import { fetchAccountPerformance, fetchHourlyVolume } from 'utils/account' +import AccountHeroStats from './AccountHeroStats' +import AccountValue from './AccountValue' const TABS = ['account-value', 'account:assets-liabilities'] @@ -64,34 +35,17 @@ const AccountPage = () => { const { t } = useTranslation(['common', 'account']) const { group } = useMangoGroup() const { mangoAccount, mangoAccountAddress } = useMangoAccount() - - const totalInterestData = mangoStore( - (s) => s.mangoAccount.interestTotals.data - ) const [chartToShow, setChartToShow] = useState('') - const [showExpandChart, setShowExpandChart] = useState(false) const [showPnlHistory, setShowPnlHistory] = useState(false) - const { theme } = useTheme() const { width } = useViewport() const isMobile = width ? width < breakpoints.md : false // const tourSettings = mangoStore((s) => s.settings.tours) // const [isOnBoarded] = useLocalStorageState(IS_ONBOARDED_KEY) - const [animationSettings] = useLocalStorageState( - ANIMATION_SETTINGS_KEY, - INITIAL_ANIMATION_SETTINGS - ) const [activeTab, setActiveTab] = useLocalStorageState( 'accountHeroKey-0.1', 'account-value' ) - useEffect(() => { - if (mangoAccountAddress) { - const actions = mangoStore.getState().actions - actions.fetchAccountInterestTotals(mangoAccountAddress) - } - }, [mangoAccountAddress]) - const { data: performanceData, isLoading: loadingPerformanceData, @@ -108,38 +62,6 @@ const AccountPage = () => { } ) - const { - data: fundingData, - isLoading: loadingFunding, - isFetching: fetchingFunding, - } = useQuery( - ['funding', mangoAccountAddress], - () => fetchFundingTotals(mangoAccountAddress), - { - cacheTime: 1000 * 60 * 10, - staleTime: 1000 * 60, - retry: 3, - refetchOnWindowFocus: false, - enabled: !!mangoAccountAddress, - } - ) - - const { - data: volumeTotalData, - isLoading: loadingVolumeTotalData, - isFetching: fetchingVolumeTotalData, - } = useQuery( - ['total-volume', mangoAccountAddress], - () => fetchVolumeTotals(mangoAccountAddress), - { - cacheTime: 1000 * 60 * 10, - staleTime: 1000 * 60, - retry: 3, - refetchOnWindowFocus: false, - enabled: !!mangoAccountAddress, - } - ) - const { data: hourlyVolumeData, isLoading: loadingHourlyVolumeData, @@ -156,25 +78,7 @@ const AccountPage = () => { } ) - const dailyVolume = useMemo(() => { - if (!hourlyVolumeData || !hourlyVolumeData.length) return 0 - // Calculate the current time in milliseconds - const currentTime = new Date().getTime() - - // Calculate the start time for the last 24 hours in milliseconds - const last24HoursStartTime = currentTime - 24 * 60 * 60 * 1000 - - // Filter the formatted data based on the timestamp - const last24HoursData = hourlyVolumeData.filter((entry) => { - const timestampMs = new Date(entry.time).getTime() - return timestampMs >= last24HoursStartTime && timestampMs <= currentTime - }) - - const volume = last24HoursData.reduce((a, c) => a + c.total_volume_usd, 0) - return volume - }, [hourlyVolumeData]) - - const oneDayPerformanceData: PerformanceDataItem[] | [] = useMemo(() => { + const rollingDailyData: PerformanceDataItem[] | [] = useMemo(() => { if (!performanceData || !performanceData.length) return [] const nowDate = new Date() return performanceData.filter((d) => { @@ -183,20 +87,6 @@ const AccountPage = () => { }) }, [performanceData]) - const onHoverMenu = (open: boolean, action: string) => { - if ( - (!open && action === 'onMouseEnter') || - (open && action === 'onMouseLeave') - ) { - setShowExpandChart(!open) - } - } - - const handleShowAccountValueChart = () => { - setChartToShow('account-value') - setShowExpandChart(false) - } - const handleHideChart = () => { setChartToShow('') } @@ -213,89 +103,17 @@ const AccountPage = () => { ] }, [group, mangoAccount]) - const leverage = useMemo(() => { - if (!group || !mangoAccount) return 0 - const assetsValue = toUiDecimalsForQuote( - mangoAccount.getAssetsValue(group).toNumber() - ) + 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 - if (isNaN(assetsValue / accountValue)) { - return 0 - } else { - return Math.abs(1 - assetsValue / accountValue) - } - }, [mangoAccount, group, accountValue]) - - const [accountValueChange, rollingDailyPnlChange, pnlChangeToday] = - useMemo(() => { - if (!accountValue || !accountPnl || !oneDayPerformanceData.length) - return [0, 0, 0] - const accountValueChange = - accountValue - oneDayPerformanceData[0].account_equity - const startHour = oneDayPerformanceData.find((item) => { - const itemHour = new Date(item.time).getHours() - return itemHour === 0 - }) - const startDayPnl = startHour?.pnl - const rollingDailyPnlChange = accountPnl - oneDayPerformanceData[0].pnl - const pnlChangeToday = startDayPnl ? accountPnl - startDayPnl : 0 - - return [accountValueChange, rollingDailyPnlChange, pnlChangeToday] - }, [accountPnl, accountValue, oneDayPerformanceData]) - - const interestTotalValue = useMemo(() => { - if (totalInterestData.length) { - return totalInterestData.reduce( - (a, c) => a + (c.borrow_interest_usd * -1 + c.deposit_interest_usd), - 0 - ) - } - return 0.0 - }, [totalInterestData]) - - const fundingTotalValue = useMemo(() => { - if (fundingData?.length && mangoAccountAddress) { - return fundingData.reduce( - (a, c) => a + c.long_funding + c.short_funding, - 0 - ) - } - return 0.0 - }, [fundingData, mangoAccountAddress]) - - const oneDayInterestChange = useMemo(() => { - if (oneDayPerformanceData.length) { - const first = oneDayPerformanceData[0] - const latest = oneDayPerformanceData[oneDayPerformanceData.length - 1] - - const startDayInterest = - first.borrow_interest_cumulative_usd + - first.deposit_interest_cumulative_usd - - const endDayInterest = - latest.borrow_interest_cumulative_usd + - latest.deposit_interest_cumulative_usd - - return endDayInterest - startDayInterest - } - return 0.0 - }, [oneDayPerformanceData]) - - const maintHealth = useMemo(() => { - return group && mangoAccount - ? mangoAccount.getHealthRatioUi(group, HealthType.maint) - : 0 - }, [mangoAccount, group]) - - const handleChartToShow = ( - chartName: - | 'pnl' - | 'cumulative-interest-value' - | 'hourly-funding' - | 'hourly-volume' - ) => { - setChartToShow(chartName) - } + return pnlChangeToday + }, [accountPnl, rollingDailyData]) const latestAccountData = useMemo(() => { if (!accountValue || !performanceData || !performanceData.length) return [] @@ -315,7 +133,6 @@ const AccountPage = () => { ] }, [accountPnl, accountValue, performanceData]) - const loadingTotalVolume = fetchingVolumeTotalData || loadingVolumeTotalData const loadingHourlyVolume = fetchingHourlyVolumeData || loadingHourlyVolumeData @@ -342,93 +159,13 @@ const AccountPage = () => {
{activeTab === 'account-value' ? ( -
-
-
- {animationSettings['number-scroll'] ? ( - group && mangoAccount ? ( - - ) : ( - - ) - ) : ( - - )} -
-
- -

- {t('rolling-change')} -

-
-
- {!performanceLoading ? ( - oneDayPerformanceData.length ? ( -
- onHoverMenu(showExpandChart, 'onMouseEnter') - } - onMouseLeave={() => - onHoverMenu(showExpandChart, 'onMouseLeave') - } - > - = 0 - ? COLORS.UP[theme] - : COLORS.DOWN[theme] - } - data={oneDayPerformanceData.concat(latestAccountData)} - name="accountValue" - xKey="time" - yKey="account_equity" - /> - - handleShowAccountValueChart()} - > - - - -
- ) : null - ) : mangoAccountAddress ? ( - -
- - ) : null} -
+ ) : null} {activeTab === 'account:assets-liabilities' ? ( @@ -439,323 +176,15 @@ const AccountPage = () => {
-
-
-
- -

- 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')} -

- -
-

- {maintHealth}% -

- -
- - - {t('leverage')}: - - - x - - -
-
-
-
- -

- {t('free-collateral')} -

-
-

- -

- - - {t('total')}: - - - - - -
-
-
-
-
- -

- {t('pnl')} -

-
- {mangoAccountAddress ? ( -
- - handleChartToShow('pnl')} - > - - - - - setShowPnlHistory(true)} - > - - - -
- ) : null} -
-

- -

-
- -

{t('rolling-change')}

-
-
-
-
-
-
-

- {t('account:lifetime-volume')} -

- {mangoAccountAddress ? ( - - handleChartToShow('hourly-volume')} - > - - - - ) : null} -
- {loadingTotalVolume && mangoAccountAddress ? ( - -
- - ) : ( -

- -

- )} - - {t('account:daily-volume')}: - {loadingHourlyVolume && mangoAccountAddress ? ( - -
- - ) : ( - - - - )} - -
-
-
-
-
- -

- {t('total-interest-earned')} -

-
- {mangoAccountAddress ? ( - - - handleChartToShow('cumulative-interest-value') - } - > - - - - ) : null} -
-

- -

-
- -

{t('rolling-change')}

-
-
-
-
-
- -

- {t('account:total-funding-earned')} -

-
- {mangoAccountAddress ? ( - - handleChartToShow('hourly-funding')} - > - - - - ) : null} -
- {(loadingFunding || fetchingFunding) && mangoAccountAddress ? ( - -
- - ) : ( -

- -

- )} -
-
+ {/* {!tourSettings?.account_tour_seen && isOnBoarded && connected ? ( diff --git a/components/account/AccountValue.tsx b/components/account/AccountValue.tsx new file mode 100644 index 00000000..e9a9c868 --- /dev/null +++ b/components/account/AccountValue.tsx @@ -0,0 +1,148 @@ +import { formatCurrencyValue } from '../../utils/numbers' +import FlipNumbers from 'react-flip-numbers' +import SimpleAreaChart from '@components/shared/SimpleAreaChart' +import { COLORS } from '../../styles/colors' +import { IconButton } from '../shared/Button' +import { ArrowsPointingOutIcon } from '@heroicons/react/20/solid' +import { Transition } from '@headlessui/react' +import SheenLoader from '../shared/SheenLoader' +import Change from '../shared/Change' +import FormatNumericValue from '@components/shared/FormatNumericValue' +import { useTheme } from 'next-themes' +import useLocalStorageState from 'hooks/useLocalStorageState' +import { ANIMATION_SETTINGS_KEY } from 'utils/constants' +import { INITIAL_ANIMATION_SETTINGS } from '@components/settings/AnimationSettings' +import useMangoGroup from 'hooks/useMangoGroup' +import useMangoAccount from 'hooks/useMangoAccount' +import { PerformanceDataItem } from 'types' +import { useMemo, useState } from 'react' +import { useTranslation } from 'next-i18next' +import { useViewport } from 'hooks/useViewport' +import { breakpoints } from 'utils/theme' +import { ChartToShow } from './AccountPage' + +const AccountValue = ({ + accountValue, + latestAccountData, + loading, + rollingDailyData, + setChartToShow, +}: { + accountValue: number + latestAccountData: PerformanceDataItem[] + loading: boolean + rollingDailyData: PerformanceDataItem[] + setChartToShow: (chart: ChartToShow) => void +}) => { + const { t } = useTranslation('common') + const { theme } = useTheme() + const { group } = useMangoGroup() + const { mangoAccount, mangoAccountAddress } = useMangoAccount() + const [showExpandChart, setShowExpandChart] = useState(false) + const [animationSettings] = useLocalStorageState( + ANIMATION_SETTINGS_KEY, + INITIAL_ANIMATION_SETTINGS + ) + const { width } = useViewport() + const isMobile = width ? width < breakpoints.md : false + + const accountValueChange = useMemo(() => { + if (!accountValue || !rollingDailyData.length) return 0 + const accountValueChange = accountValue - rollingDailyData[0].account_equity + return accountValueChange + }, [accountValue, rollingDailyData]) + + const onHoverMenu = (open: boolean, action: string) => { + if ( + (!open && action === 'onMouseEnter') || + (open && action === 'onMouseLeave') + ) { + setShowExpandChart(!open) + } + } + + const handleShowAccountValueChart = () => { + setChartToShow('account-value') + setShowExpandChart(false) + } + + return ( +
+
+
+ {animationSettings['number-scroll'] ? ( + group && mangoAccount ? ( + + ) : ( + + ) + ) : ( + + )} +
+
+ +

{t('rolling-change')}

+
+
+ {!loading ? ( + rollingDailyData.length ? ( +
onHoverMenu(showExpandChart, 'onMouseEnter')} + onMouseLeave={() => onHoverMenu(showExpandChart, 'onMouseLeave')} + > + = 0 ? COLORS.UP[theme] : COLORS.DOWN[theme] + } + data={rollingDailyData.concat(latestAccountData)} + name="accountValue" + xKey="time" + yKey="account_equity" + /> + + handleShowAccountValueChart()} + > + + + +
+ ) : null + ) : mangoAccountAddress ? ( + +
+ + ) : null} +
+ ) +} + +export default AccountValue