import { useCallback, useState } from 'react' import { getTokenBySymbol, ZERO_I80F48, I80F48, } from '@blockworks-foundation/mango-client' import useMangoStore from '../../stores/useMangoStore' import { formatUsdValue, i80f48ToPercent, tokenPrecision, } from '../../utils/index' import WithdrawModal from '../WithdrawModal' import Button from '../Button' import DepositModal from '../DepositModal' import { useViewport } from '../../hooks/useViewport' import { breakpoints } from '../TradePageGrid' import { Table, Td, Th, TrBody, TrHead } from '../TableElements' import { ExpandableRow } from '../TableElements' import MobileTableHeader from '../mobile/MobileTableHeader' import { useTranslation } from 'next-i18next' import Tooltip from '../Tooltip' import { useWallet } from '@solana/wallet-adapter-react' export default function AccountBorrows() { const { t } = useTranslation('common') const mangoGroup = useMangoStore((s) => s.selectedMangoGroup.current) const mangoCache = useMangoStore((s) => s.selectedMangoGroup.cache) const mangoConfig = useMangoStore((s) => s.selectedMangoGroup.config) const mangoAccount = useMangoStore((s) => s.selectedMangoAccount.current) const { publicKey, connected } = useWallet() const loadingMangoAccount = useMangoStore( (s) => s.selectedMangoAccount.initialLoad ) const spotBalances = useMangoStore((s) => s.selectedMangoAccount.spotBalances) const [borrowSymbol, setBorrowSymbol] = useState('') const [depositToSettle, setDepositToSettle] = useState(null) const [showBorrowModal, setShowBorrowModal] = useState(false) const [showDepositModal, setShowDepositModal] = useState(false) const { width } = useViewport() const isMobile = width ? width < breakpoints.sm : false const canWithdraw = publicKey && mangoAccount?.owner.equals(publicKey) const handleCloseWithdraw = useCallback(() => { setShowBorrowModal(false) }, []) const handleCloseDeposit = useCallback(() => { setShowDepositModal(false) setDepositToSettle(null) }, []) const handleShowBorrow = (symbol) => { setBorrowSymbol(symbol) setShowBorrowModal(true) } const handleShowDeposit = (symbol, amount) => { setDepositToSettle({ symbol: symbol, amount: amount }) setShowDepositModal(true) } return ( <> {mangoGroup && mangoAccount ? ( <>

{t('your-borrows')}

{/* TODO: calculate LiabsVal without perp markets
{t('total-borrow-value')}:
{formatUsdValue(+mangoAccount.getLiabsVal(mangoGroup, mangoCache))}
*/}
{spotBalances.find((b) => b?.borrows?.gt(ZERO_I80F48)) ? ( !isMobile ? ( {spotBalances .filter((assets) => assets?.borrows?.gt(ZERO_I80F48)) .map((asset) => { const token = getTokenBySymbol( mangoConfig, asset.symbol ) const tokenIndex = mangoGroup.getTokenIndex( token.mintKey ) return ( ) })}
{t('asset')} {t('balance')} {t('value')} {t('borrow-rate')} (APR)
{asset.symbol}
{asset?.borrows?.toFixed()} {asset?.borrows && mangoCache && mangoGroup ? formatUsdValue( asset?.borrows ?.mul( mangoGroup.getPrice( tokenIndex, mangoCache ) ) ?.toNumber() ) : null} {( mangoGroup .getBorrowRate(tokenIndex) .toNumber() * 100 ).toFixed(2)} %
) : (
{spotBalances .filter((assets) => assets?.borrows?.gt(ZERO_I80F48)) .map((asset, i) => { const token = getTokenBySymbol( mangoConfig, asset.symbol ) const tokenIndex = mangoGroup.getTokenIndex( token.mintKey ) return (
{asset.symbol}
{asset?.borrows?.toFixed( tokenPrecision[asset.symbol] )}
} key={`${asset.symbol}${i}`} panelTemplate={ <>
{asset?.borrows && mangoCache ? (
{t('value')}
{formatUsdValue( asset.borrows .mul( mangoGroup.getPrice( tokenIndex, mangoCache ) ) .toNumber() )}
) : null}
{t('borrow-rate')} (APR)
{( mangoGroup .getBorrowRate(tokenIndex) .toNumber() * 100 ).toFixed(2)} %
} /> ) })}
) ) : (
{t('no-borrows')}
)}
) : null}

{t('all-assets')}

{!isMobile ? ( {mangoAccount ? : null} {mangoGroup && mangoConfig.tokens.map((token, i) => { const tokenIndex = mangoGroup.getTokenIndex(token.mintKey) return ( {mangoAccount && mangoGroup && mangoCache ? ( ) : null} ) })}
{t('asset')} {t('price')} {t('deposit')} APR {t('borrow')} APR{t('max-borrow')}{t('liquidity')}
{token.symbol}
{mangoGroup && mangoCache ? formatUsdValue( mangoGroup .getPrice(tokenIndex, mangoCache) .toNumber() ) : null} {mangoGroup ? ( {i80f48ToPercent( mangoGroup.getDepositRate(tokenIndex) ).toFixed(2)} % ) : null} {mangoGroup ? ( {i80f48ToPercent( mangoGroup.getBorrowRate(tokenIndex) ).toFixed(2)} % ) : null} {mangoAccount .getMaxWithBorrowForToken( mangoGroup, mangoCache, tokenIndex ) .mul(I80F48.fromString('0.995')) .toNumber() > 0 ? mangoAccount .getMaxWithBorrowForToken( mangoGroup, mangoCache, tokenIndex ) .mul(I80F48.fromString('0.995')) .toNumber() .toLocaleString(undefined, { minimumFractionDigits: tokenPrecision[token.symbol], maximumFractionDigits: tokenPrecision[token.symbol], }) : 0} {mangoGroup ? mangoGroup .getUiTotalDeposit(tokenIndex) .sub(mangoGroup.getUiTotalBorrow(tokenIndex)) .toNumber() .toLocaleString(undefined, { minimumFractionDigits: tokenPrecision[token.symbol], maximumFractionDigits: tokenPrecision[token.symbol], }) : null}
) : (
{mangoGroup && mangoCache && mangoConfig.tokens.map((token, i) => { const tokenIndex = mangoGroup.getTokenIndex(token.mintKey) return (
{token.symbol}
{i80f48ToPercent( mangoGroup.getDepositRate(tokenIndex) ).toFixed(2)} % / {i80f48ToPercent( mangoGroup.getBorrowRate(tokenIndex) ).toFixed(2)} %
} key={`${token.symbol}${i}`} panelTemplate={
{t('price')}
{formatUsdValue( mangoGroup .getPrice(tokenIndex, mangoCache) .toNumber() )}
{mangoAccount ? (
{t('max-borrow')}
{mangoAccount ? mangoAccount .getMaxWithBorrowForToken( mangoGroup, mangoCache, tokenIndex ) .mul(I80F48.fromString('0.995')) .toNumber() .toLocaleString(undefined, { minimumFractionDigits: tokenPrecision[token.symbol], maximumFractionDigits: tokenPrecision[token.symbol], }) : null}
) : null}
{t('liquidity')}
{mangoGroup .getUiTotalDeposit(tokenIndex) .sub(mangoGroup.getUiTotalBorrow(tokenIndex)) .toNumber() .toLocaleString(undefined, { minimumFractionDigits: tokenPrecision[token.symbol], maximumFractionDigits: tokenPrecision[token.symbol], })}
} /> ) })}
)}
{showBorrowModal ? ( ) : null} {showDepositModal ? ( ) : null} ) }