import { I80F48, nativeI80F48ToUi, nativeToUi, QUOTE_INDEX, ZERO_BN, ZERO_I80F48, } from '@blockworks-foundation/mango-client' import { useCallback, useState } from 'react' import { ExclamationIcon, ExternalLinkIcon, HeartIcon, } from '@heroicons/react/solid' import useMangoStore, { MNGO_INDEX } from '../stores/useMangoStore' import { abbreviateAddress, 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' import { useTranslation } from 'next-i18next' import useMangoAccount from '../hooks/useMangoAccount' const I80F48_100 = I80F48.fromString('100') export default function AccountInfo() { const { t } = useTranslation('common') const connected = useMangoStore((s) => s.wallet.connected) const mangoGroup = useMangoStore((s) => s.selectedMangoGroup.current) const mangoCache = useMangoStore((s) => s.selectedMangoGroup.cache) const { mangoAccount, initialLoad } = useMangoAccount() 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 // console.log('rerendering account info', mangoAccount, mngoAccrued.toNumber()) 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 ) notify({ title: t('redeem-success'), description: '', txid, }) } catch (e) { notify({ title: t('redeem-failure'), description: e.message, txid: e.txid, type: 'error', }) } finally { actions.reloadMangoAccount() } } 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 const liquidationPrice = mangoGroup && mangoAccount && marketConfig ? mangoAccount.getLiquidationPrice( mangoGroup, mangoCache, marketConfig.marketIndex ) : undefined return ( <>