diff --git a/webapp/src/components/account/account-ui.tsx b/webapp/src/components/account/account-ui.tsx index d48065d..ab0d4d4 100644 --- a/webapp/src/components/account/account-ui.tsx +++ b/webapp/src/components/account/account-ui.tsx @@ -13,9 +13,10 @@ import { toast } from 'sonner'; import type { TokenAccountEntry } from '@/lib/types'; import { useGetBalanceQuery, useGetTokenAccountsQuery, useAirdropSol, useAirdropUsdc } from './account-data-access'; import { useDelegations, useIncomingDelegations } from '@/hooks/use-delegations'; -import { useUsdcMint, useUsdcMintRaw } from '@/hooks/use-token-config'; import { useSubscriptionAuthorityStatus } from '@/hooks/use-subscription-authority-status'; -import { USDC_MULTIPLIER, cn, recurringAvailable } from '@/lib/utils'; +import { useSelectedToken } from '@/hooks/use-selected-token'; +import { TokenPicker } from '@/components/token/token-picker'; +import { cn, recurringAvailable } from '@/lib/utils'; import { getBlockTimestamp } from '@/hooks/use-time-travel'; import { useClusterConfig } from '@/hooks/use-cluster-config'; import { useProgramAddress } from '@/hooks/use-token-config'; @@ -67,7 +68,10 @@ export function WalletBalanceCards({ address: addr }: { address: Address }) { const solQuery = useGetBalanceQuery({ address: addr }); const tokenQuery = useGetTokenAccountsQuery({ address: addr }); const { url: rpcUrl } = useClusterConfig(); - const usdcMint = useUsdcMint(); + const { selectedMint, selectedToken } = useSelectedToken(); + const decimals = selectedToken?.decimals ?? 0; + const symbol = selectedToken?.symbol ?? ''; + const divisor = 10 ** decimals; const progAddr = useProgramAddress(); const outgoing = useDelegations(); const incoming = useIncomingDelegations(); @@ -83,16 +87,21 @@ export function WalletBalanceCards({ address: addr }: { address: Address }) { const reservedAmount = useMemo(() => { let total = 0; - for (const d of outgoing.fixed) total += Number(d.data.amount) / USDC_MULTIPLIER; - for (const d of outgoing.recurring) total += Number(d.data.amountPerPeriod) / USDC_MULTIPLIER; + for (const d of outgoing.fixed) { + if (d.data.mint === selectedMint) total += Number(d.data.amount) / divisor; + } + for (const d of outgoing.recurring) { + if (d.data.mint === selectedMint) total += Number(d.data.amountPerPeriod) / divisor; + } return total; - }, [outgoing.fixed, outgoing.recurring]); + }, [outgoing.fixed, outgoing.recurring, selectedMint, divisor]); const incomingAmount = useMemo(() => { let total = 0; for (const d of incoming.all) { + if (d.data.mint !== selectedMint) continue; if (d.type === 'Fixed') { - total += Number(d.data.amount) / USDC_MULTIPLIER; + total += Number(d.data.amount) / divisor; } else { total += Number( @@ -103,22 +112,21 @@ export function WalletBalanceCards({ address: addr }: { address: Address }) { d.data.periodLengthS, blockTime, ), - ) / USDC_MULTIPLIER; + ) / divisor; } } return total; - }, [incoming.all, blockTime]); + }, [incoming.all, blockTime, selectedMint, divisor]); - const usdcAccount = useMemo(() => { + const tokenAccount = useMemo(() => { return (tokenQuery.data as TokenAccountEntry[] | undefined)?.find(entry => { - return entry.account?.data?.parsed?.info?.mint === usdcMint; + return entry.account?.data?.parsed?.info?.mint === selectedMint; }); - }, [tokenQuery.data, usdcMint]); + }, [tokenQuery.data, selectedMint]); - const usdcBalance = usdcAccount?.account?.data?.parsed?.info?.tokenAmount?.uiAmount ?? 0; + const tokenBalance = tokenAccount?.account?.data?.parsed?.info?.tokenAmount?.uiAmount ?? 0; - const { mint: usdcMintRaw } = useUsdcMintRaw(); - const { data: statusData } = useSubscriptionAuthorityStatus(usdcMintRaw); + const { data: statusData } = useSubscriptionAuthorityStatus(selectedMint); const delegationId = statusData?.data?.initId ?? null; const [spinning, setSpinning] = useState(false); @@ -151,15 +159,18 @@ export function WalletBalanceCards({ address: addr }: { address: Address }) { )} - } - aria-label="Refresh wallet balances" - onClick={handleRefresh} - disabled={isRefreshing} - /> +
- {usdcMint.slice(0, 8)}...{usdcMint.slice(-4)}
-
Available: {availableAmount} USDC
++ Available: {availableAmount} {symbol} +
@@ -274,6 +282,8 @@ interface DelegationTableProps { mode: TabType; showExpired?: boolean; tokenMint: string; + decimals: number; + symbol: string; blockTime?: number; subscriptionAuthorityInitId?: bigint | null; } @@ -283,6 +293,8 @@ function FixedDelegationTable({ mode, showExpired, tokenMint, + decimals, + symbol, blockTime, subscriptionAuthorityInitId, }: DelegationTableProps) { @@ -367,7 +379,7 @@ function FixedDelegationTable({
No token account found. Get some USDC first.
+No token account found. Get some {symbol} first.
)}Token Configuration Error
-- USDC token is not configured. Please ensure the API server is running. -
+No tokens are configured for this network.
{planName}
- ${amountUsd.toFixed(2)} / period - {subscriberCount} subscriber - {subscriberCount !== 1 ? 's' : ''} + {formatTokenAmount(plan.data.terms.amount, decimals)} {token.symbol} / period -{' '} + {subscriberCount} subscriber{subscriberCount !== 1 ? 's' : ''}
Collection History
{history.slice(0, 10).map(record => ( -{planName}
- ${amountUsd.toFixed(2)}/period · {eligible.length}/{currentSubscribers.length}{' '} - eligible + {amountUsd.toFixed(2)} {token.symbol}/period · {eligible.length}/ + {currentSubscribers.length} eligible {staleSubscribers.length + staleAuthoritySubscribers.length > 0 && ` / ${staleSubscribers.length + staleAuthoritySubscribers.length} stale`}
@@ -345,7 +390,9 @@ function EnhancedPlanCard({ planData, blockTs }: { planData: PlanSubscriberData;