import { I80F48, nativeI80F48ToUi, nativeToUi, QUOTE_INDEX, ZERO_BN, ZERO_I80F48, } from '@blockworks-foundation/mango-client' import { useCallback, useState } from 'react' import { ExclamationIcon, HeartIcon } from '@heroicons/react/solid' import useMangoStore, { MNGO_INDEX } from '../stores/useMangoStore' import { formatUsdValue, usdFormatter } from '../utils' import { notify } from '../utils/notifications' import { LinkButton } from './Button' import { ElementTitle } from './styles' import Tooltip from './Tooltip' import DepositModal from './DepositModal' import WithdrawModal from './WithdrawModal' import Button from './Button' import { DataLoader } from './MarketPosition' import { useViewport } from '../hooks/useViewport' import { breakpoints } from './TradePageGrid' const I80F48_100 = I80F48.fromString('100') export default function AccountInfo() { const connected = useMangoStore((s) => s.wallet.connected) const mangoGroup = useMangoStore((s) => s.selectedMangoGroup.current) const mangoCache = useMangoStore((s) => s.selectedMangoGroup.cache) const mangoAccount = useMangoStore((s) => s.selectedMangoAccount.current) const isLoading = useMangoStore((s) => s.selectedMangoAccount.initialLoad) const marketConfig = useMangoStore((s) => s.selectedMarket.config) const mangoClient = useMangoStore((s) => s.connection.client) const actions = useMangoStore((s) => s.actions) const { width } = useViewport() const isMobile = width ? width < breakpoints.sm : false const [showDepositModal, setShowDepositModal] = useState(false) const [showWithdrawModal, setShowWithdrawModal] = useState(false) const handleCloseDeposit = useCallback(() => { setShowDepositModal(false) }, []) const handleCloseWithdraw = useCallback(() => { setShowWithdrawModal(false) }, []) const equity = mangoAccount ? mangoAccount.computeValue(mangoGroup, mangoCache) : ZERO_I80F48 const mngoAccrued = mangoAccount ? mangoAccount.perpAccounts.reduce((acc, perpAcct) => { return perpAcct.mngoAccrued.add(acc) }, ZERO_BN) : ZERO_BN const handleRedeemMngo = async () => { const wallet = useMangoStore.getState().wallet.current const mngoNodeBank = mangoGroup.rootBankAccounts[MNGO_INDEX].nodeBankAccounts[0] try { const txid = await mangoClient.redeemAllMngo( mangoGroup, mangoAccount, wallet, mangoGroup.tokens[MNGO_INDEX].rootBank, mngoNodeBank.publicKey, mngoNodeBank.vault ) actions.fetchMangoAccounts() notify({ title: 'Successfully redeemed MNGO', description: '', txid, }) } catch (e) { notify({ title: 'Error redeeming MNGO', description: e.message, txid: e.txid, type: 'error', }) } } const maintHealthRatio = mangoAccount ? mangoAccount.getHealthRatio(mangoGroup, mangoCache, 'Maint') : I80F48_100 const initHealthRatio = mangoAccount ? mangoAccount.getHealthRatio(mangoGroup, mangoCache, 'Init') : I80F48_100 const maintHealth = mangoAccount ? mangoAccount.getHealth(mangoGroup, mangoCache, 'Maint') : I80F48_100 const initHealth = mangoAccount ? mangoAccount.getHealth(mangoGroup, mangoCache, 'Init') : I80F48_100 return ( <>
{!isMobile ? ( Init Health: {initHealth.toFixed(4)}
Maint Health: {maintHealth.toFixed(4)}
) : ( '' ) } > Account ) : null}
Equity
{isLoading ? : formatUsdValue(+equity)}
Leverage
{isLoading ? ( ) : mangoAccount ? ( `${mangoAccount .getLeverage(mangoGroup, mangoCache) .toFixed(2)}x` ) : ( '0.00x' )}
Collateral Available
{isLoading ? ( ) : mangoAccount ? ( usdFormatter( nativeI80F48ToUi( initHealth, mangoGroup.tokens[QUOTE_INDEX].decimals ).toFixed() ) ) : ( '--' )}
{marketConfig.name} Margin Available
{mangoAccount ? usdFormatter( nativeI80F48ToUi( mangoAccount.getMarketMarginAvailable( mangoGroup, mangoCache, marketConfig.marketIndex, marketConfig.kind ), mangoGroup.tokens[QUOTE_INDEX].decimals ).toFixed() ) : '0.00'}
Earn MNGO by market making on Perp markets.{' '} Learn more
} >
MNGO Rewards
{isLoading ? ( ) : mangoGroup ? ( nativeToUi( mngoAccrued.toNumber(), mangoGroup.tokens[MNGO_INDEX].decimals ) ) : ( 0 )} Claim
} >
Health
30 ? 'bg-th-green' : initHealthRatio.toNumber() > 0 ? 'bg-th-orange' : 'bg-th-red' }`} >
{maintHealthRatio.gt(I80F48_100) ? '>100' : maintHealthRatio.toFixed(2)} %
{mangoAccount.beingLiquidated ? (
You are being liquidated!
) : null}
{showDepositModal && ( )} {showWithdrawModal && ( )} ) }