// Metadata is optional in ERC-20. A recipient cannot choose which tokens create // schedules for them, so one broken metadata call must not hide their workspace. export async function readTokenMetadata(token, address) { const [symbol, decimals] = await Promise.allSettled([ Promise.resolve().then(() => token.symbol()), Promise.resolve().then(() => token.decimals()), ]); const precision = decimals.status === 'fulfilled' ? Number(decimals.value) : NaN; if (!Number.isInteger(precision) || precision < 0 || precision > 80) { return { symbol: 'base units', decimals: 0, rawUnits: true }; } const label = symbol.status === 'fulfilled' ? String(symbol.value).trim().slice(0, 24) : ''; return { symbol: label || `${address.slice(0, 6)}…${address.slice(-4)}`, decimals: precision, rawUnits: false }; }