${acceptance}
const fallbackDashboard = { active_account: { name: 'Main Wallet', address: '0x1111111111111111111111111111111111111111', source: 'SeedPhrase' }, chains: [ { id: 1, name: 'Ethereum' }, { id: 8453, name: 'Base' } ], balances: [ { chain_id: 1, symbol: 'ETH', amount: 1.24, usd_value: 4200 }, { chain_id: 8453, symbol: 'USDC', amount: 1280, usd_value: 1280 } ], approvals: [ { chain_id: 1, asset_symbol: 'USDC', spender: '0x2222222222222222222222222222222222222222', allowance: 'unlimited', risk: 'High' } ], activities: [ { label: 'Swap ETH → USDC', status: 'Confirmed', chain_id: 1 } ], settings: { theme: 'System', language: 'en', currency: 'USD', auto_lock_minutes: 15, prefer_rabby_over_metamask: true } }; const fallbackFeatures = [ ['Create/unlock wallet', 'Password, lock/unlock, encrypted local state', 'Modeled'], ['Import/create accounts', 'Seed phrase, private key, JSON, watch-only', 'Modeled'], ['Multi-chain networks', 'Built-in, custom RPC, testnet, offline chain flags', 'Modeled'], ['Portfolio dashboard', 'Balances, NFTs, DeFi positions, activity', 'UiPrototype'], ['Dapp provider and permissions', 'Origin/account/chain permissions', 'Modeled'], ['Signing and security previews', 'Typed data/message/transaction previews and risk', 'Modeled'], ['Settings and customization', 'Theme, language, currency, auto-lock, default wallet mode', 'UiPrototype'] ]; function money(value) { return new Intl.NumberFormat('en-US', { style: 'currency', currency: 'USD' }).format(value || 0); } function shortAddress(address) { if (!address || address.length < 12) return address || ''; return `${address.slice(0, 6)}…${address.slice(-4)}`; } function statusLabel(value) { if (typeof value === 'string') return value; if (value && typeof value === 'object') return Object.keys(value)[0] || 'Modeled'; return 'Modeled'; } async function invokeOrFallback(command, fallback) { try { const tauri = window.__TAURI__?.core; if (!tauri) return fallback; return await tauri.invoke(command); } catch (_) { return fallback; } } function renderDashboard(dashboard) { const total = dashboard.balances.reduce((sum, token) => sum + token.usd_value, 0); const highRisk = dashboard.approvals.filter((approval) => ['High', 'Critical'].includes(statusLabel(approval.risk))).length; document.getElementById('account-address').textContent = shortAddress(dashboard.active_account.address); document.getElementById('portfolio-total').textContent = money(total); document.getElementById('hero-total').textContent = money(total); document.getElementById('chain-count').textContent = dashboard.chains.length; document.getElementById('risk-count').textContent = highRisk; document.getElementById('approval-risk').textContent = highRisk; document.getElementById('token-list').innerHTML = dashboard.balances.map((token) => `
${acceptance}