import { ActionsMenu } from '@components/TokenList' import Button from '@components/shared/Button' import Change from '@components/shared/Change' import FormatNumericValue from '@components/shared/FormatNumericValue' import TokenLogo from '@components/shared/TokenLogo' import { goToTokenPage } from '@components/stats/tokens/TokenOverviewTable' import Decimal from 'decimal.js' import useMangoGroup from 'hooks/useMangoGroup' import { useRouter } from 'next/router' import { useTranslation } from 'react-i18next' import { numberCompacter } from 'utils/numbers' import { BankWithMarketData } from './Spot' import Tooltip from '@components/shared/Tooltip' import SimpleAreaChart from '@components/shared/SimpleAreaChart' import { COLORS } from 'styles/colors' import useThemeWrapper from 'hooks/useThemeWrapper' import dayjs from 'dayjs' import TokenReduceOnlyDesc from '@components/shared/TokenReduceOnlyDesc' const SpotCards = ({ tokens }: { tokens: BankWithMarketData[] }) => { const { t } = useTranslation(['common', 'explore', 'trade']) const { group } = useMangoGroup() const { theme } = useThemeWrapper() const router = useRouter() return (
{tokens.map((token) => { const { bank } = token const availableVaultBalance = group ? group.getTokenVaultBalanceByMintUi(bank.mint) - bank.uiDeposits() * bank.minVaultToDepositsRatio : 0 const available = Decimal.max( 0, availableVaultBalance.toFixed(bank.mintDecimals), ) const depositRate = bank.getDepositRateUi() const borrowRate = bank.getBorrowRateUi() const assetWeight = bank.scaledInitAssetWeight(bank.price).toFixed(2) const pastPrice = token.market?.marketData?.price_24h const volume = token.market?.marketData?.quote_volume_24h || 0 const change = volume > 0 && pastPrice ? ((bank.uiPrice - pastPrice) / pastPrice) * 100 : 0 const chartData = token.market?.marketData?.price_history .sort((a, b) => a.time.localeCompare(b.time)) .concat([{ price: bank.uiPrice, time: dayjs().toISOString() }]) || [] return (

{bank.name}

{token.market ? ( ) : null}
{chartData.length ? (
) : null}

{t('trade:24h-volume')}

{!token.market ? ( '–' ) : token.market?.marketData?.quote_volume_24h ? ( {numberCompacter.format( token.market.marketData.quote_volume_24h, )}{' '} USDC ) : ( 0 USDC )}

{t('available')}

{t('explore:collateral-weight')}

{assetWeight}x

{t('rates')}

%

|

%

) })}
) } export default SpotCards