@elizaos/plugin-wallet-ui 2.0.3-beta.5 → 2.0.3-beta.7
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/InventoryView.d.ts +19 -0
- package/dist/InventoryView.d.ts.map +1 -0
- package/dist/InventoryView.helpers.d.ts +32 -0
- package/dist/InventoryView.helpers.d.ts.map +1 -0
- package/dist/InventoryView.helpers.js +104 -0
- package/dist/InventoryView.helpers.js.map +1 -0
- package/dist/InventoryView.interact.d.ts +2 -0
- package/dist/InventoryView.interact.d.ts.map +1 -0
- package/dist/InventoryView.interact.js +47 -0
- package/dist/InventoryView.interact.js.map +1 -0
- package/dist/InventoryView.js +242 -0
- package/dist/InventoryView.js.map +1 -0
- package/dist/components/InventoryAppView.d.ts +2 -0
- package/dist/components/InventoryAppView.d.ts.map +1 -0
- package/dist/components/InventoryAppView.js +1744 -0
- package/dist/components/InventoryAppView.js.map +1 -0
- package/dist/components/InventorySpatialView.d.ts +86 -0
- package/dist/components/InventorySpatialView.d.ts.map +1 -0
- package/dist/components/InventorySpatialView.js +218 -0
- package/dist/components/InventorySpatialView.js.map +1 -0
- package/dist/index.d.ts +15 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +65 -0
- package/dist/index.js.map +1 -0
- package/dist/inventory/ChainIcon.d.ts +9 -0
- package/dist/inventory/ChainIcon.d.ts.map +1 -0
- package/dist/inventory/ChainIcon.js +71 -0
- package/dist/inventory/ChainIcon.js.map +1 -0
- package/dist/inventory/TokenLogo.d.ts +8 -0
- package/dist/inventory/TokenLogo.d.ts.map +1 -0
- package/dist/inventory/TokenLogo.js +52 -0
- package/dist/inventory/TokenLogo.js.map +1 -0
- package/dist/inventory/chainConfig.d.ts +89 -0
- package/dist/inventory/chainConfig.d.ts.map +1 -0
- package/dist/inventory/chainConfig.js +252 -0
- package/dist/inventory/chainConfig.js.map +1 -0
- package/dist/inventory/constants.d.ts +31 -0
- package/dist/inventory/constants.d.ts.map +1 -0
- package/dist/inventory/constants.js +59 -0
- package/dist/inventory/constants.js.map +1 -0
- package/dist/inventory/index.d.ts +5 -0
- package/dist/inventory/index.d.ts.map +1 -0
- package/dist/inventory/index.js +43 -0
- package/dist/inventory/index.js.map +1 -0
- package/dist/inventory/inventory-chain-filters.d.ts +11 -0
- package/dist/inventory/inventory-chain-filters.d.ts.map +1 -0
- package/dist/inventory/inventory-chain-filters.js +49 -0
- package/dist/inventory/inventory-chain-filters.js.map +1 -0
- package/dist/inventory/media-url.d.ts +6 -0
- package/dist/inventory/media-url.d.ts.map +1 -0
- package/dist/inventory/media-url.js +32 -0
- package/dist/inventory/media-url.js.map +1 -0
- package/dist/inventory/useInventoryData.d.ts +38 -0
- package/dist/inventory/useInventoryData.d.ts.map +1 -0
- package/dist/inventory/useInventoryData.js +311 -0
- package/dist/inventory/useInventoryData.js.map +1 -0
- package/dist/plugin.d.ts +3 -0
- package/dist/plugin.d.ts.map +1 -0
- package/dist/plugin.js +55 -0
- package/dist/plugin.js.map +1 -0
- package/dist/register-routes.d.ts +9 -0
- package/dist/register-routes.d.ts.map +1 -0
- package/dist/register-routes.js +22 -0
- package/dist/register-routes.js.map +1 -0
- package/dist/register-terminal-view.d.ts +15 -0
- package/dist/register-terminal-view.d.ts.map +1 -0
- package/dist/register-terminal-view.js +33 -0
- package/dist/register-terminal-view.js.map +1 -0
- package/dist/register.d.ts +4 -0
- package/dist/register.d.ts.map +1 -0
- package/dist/register.js +20 -0
- package/dist/register.js.map +1 -0
- package/dist/ui.d.ts +13 -0
- package/dist/ui.d.ts.map +1 -0
- package/dist/ui.js +62 -0
- package/dist/ui.js.map +1 -0
- package/dist/views/bundle.js +1072 -0
- package/dist/views/bundle.js.map +1 -0
- package/dist/wallet-rpc.d.ts +2 -0
- package/dist/wallet-rpc.d.ts.map +1 -0
- package/dist/wallet-rpc.js +9 -0
- package/dist/wallet-rpc.js.map +1 -0
- package/dist/wallet-view-bundle.d.ts +3 -0
- package/dist/wallet-view-bundle.d.ts.map +1 -0
- package/dist/wallet-view-bundle.js +7 -0
- package/dist/wallet-view-bundle.js.map +1 -0
- package/dist/widgets/wallet-status.d.ts +3 -0
- package/dist/widgets/wallet-status.d.ts.map +1 -0
- package/dist/widgets/wallet-status.helpers.d.ts +3 -0
- package/dist/widgets/wallet-status.helpers.d.ts.map +1 -0
- package/dist/widgets/wallet-status.helpers.js +12 -0
- package/dist/widgets/wallet-status.helpers.js.map +1 -0
- package/dist/widgets/wallet-status.js +291 -0
- package/dist/widgets/wallet-status.js.map +1 -0
- package/package.json +7 -7
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"bundle.js","names":[],"sources":["../../src/components/InventorySpatialView.tsx","../../src/InventoryView.helpers.ts","../../src/inventory/constants.ts","../../src/inventory/chainConfig.ts","../../src/inventory/inventory-chain-filters.ts","../../src/inventory/useInventoryData.ts","../../src/InventoryView.tsx","../../src/InventoryView.interact.ts"],"sourcesContent":["/**\n * InventorySpatialView - the wallet inventory surface authored once with the\n * spatial vocabulary, so it renders correctly wherever it is displayed:\n *\n * - GUI / XR - mounted in `<SpatialSurface>` (DOM; XR scales up).\n * - TUI - rendered to real terminal lines by the agent terminal, via\n * `registerSpatialTerminalView` (see `register-terminal-view.tsx`).\n *\n * It is purely presentational (a snapshot + an action callback in, primitives\n * out) and imports only the cross-modality primitives, so it is safe to render\n * in the Node agent process where the terminal lives (no wallet RPC client or\n * `@elizaos/ui` runtime hook import). The unified `InventoryView` wraps this in a\n * `SpatialSurface` and owns the live data + the `onAction` dispatch.\n */\n\nimport {\n Button,\n Card,\n Divider,\n HStack,\n List,\n type SpatialTone,\n Text,\n VStack,\n} from \"@elizaos/ui/spatial\";\n\n/** A single token holding, pre-formatted for display. */\nexport interface WalletTokenRow {\n id: string;\n symbol: string;\n chain: string;\n /** Pre-formatted human balance, e.g. \"1.25\". */\n balance: string;\n /** USD value of the holding. */\n valueUsd: number;\n contractAddress: string | null;\n logoUrl: string | null;\n}\n\n/** A single NFT, pre-formatted for display. */\nexport interface WalletNftRow {\n id: string;\n chain: string;\n collectionName: string;\n name: string;\n imageUrl: string;\n}\n\n/** A market mover, pre-formatted for display. */\nexport interface WalletMarketMover {\n id: string;\n symbol: string;\n priceUsd: number;\n change24hPct: number;\n}\n\n/** A recent swap from the trading profile. */\nexport interface WalletRecentSwap {\n id: string;\n /** Display label, e.g. \"BNB -> CAKE\". */\n pair: string;\n /** Pre-formatted relative/short time. */\n when: string;\n}\n\nexport interface WalletAddresses {\n evmAddress: string | null;\n solanaAddress: string | null;\n}\n\nexport interface WalletConfig {\n evmBalanceReady: boolean;\n solanaBalanceReady: boolean;\n selectedRpcProviders: string[];\n}\n\nexport interface WalletTradingProfile {\n realizedPnlBnb: number;\n recentSwaps: WalletRecentSwap[];\n}\n\nexport interface WalletSnapshot {\n portfolioValueUsd: number;\n tokenRows: WalletTokenRow[];\n walletNfts: WalletNftRow[];\n marketMovers: WalletMarketMover[];\n tradingProfile: WalletTradingProfile;\n addresses: WalletAddresses;\n config: WalletConfig;\n /** `false` when the wallet is turned off; surfaces the Enable control. */\n walletEnabled?: boolean | null;\n loading?: boolean;\n error?: string | null;\n}\n\n/** Wallet sections the agent can switch between, mirroring the GUI tabs. */\nconst TAB_KEYS = [\"tokens\", \"defi\", \"nfts\"] as const;\n\nfunction formatUsd(value: number): string {\n if (!Number.isFinite(value)) return \"$0\";\n if (Math.abs(value) >= 1000) {\n return `$${value.toLocaleString(\"en-US\", { maximumFractionDigits: 0 })}`;\n }\n return `$${value.toFixed(2)}`;\n}\n\nfunction shortAddress(address: string | null): string {\n if (!address) return \"-\";\n if (address.length <= 12) return address;\n return `${address.slice(0, 6)}..${address.slice(-4)}`;\n}\n\nfunction changeTone(pct: number): SpatialTone {\n if (pct > 0) return \"success\";\n if (pct < 0) return \"danger\";\n return \"muted\";\n}\n\nfunction changeMark(pct: number): string {\n if (pct > 0) return \"+\";\n if (pct < 0) return \"-\";\n return \".\";\n}\n\nfunction pnlTone(value: number): SpatialTone {\n if (value > 0) return \"success\";\n if (value < 0) return \"danger\";\n return \"muted\";\n}\n\nexport interface InventorySpatialViewProps {\n snapshot: WalletSnapshot;\n /**\n * Dispatched action ids: `tab:<id>`, `refresh`, `enable-wallet`,\n * `rpc-settings`, `open-token:<id>`, `hide-token:<id>`, `copy-evm`,\n * `copy-solana`.\n */\n onAction?: (action: string) => void;\n}\n\nexport function InventorySpatialView({\n snapshot,\n onAction,\n}: InventorySpatialViewProps) {\n const dispatch = (action: string) => () => onAction?.(action);\n const {\n portfolioValueUsd,\n tokenRows,\n walletNfts,\n marketMovers,\n tradingProfile,\n addresses,\n config,\n walletEnabled,\n } = snapshot;\n const rpc =\n config.selectedRpcProviders.length > 0\n ? config.selectedRpcProviders.join(\", \")\n : \"default\";\n\n return (\n <Card gap={1} padding={1}>\n <HStack gap={1} align=\"center\">\n <Text style=\"subheading\" grow={1}>\n {formatUsd(portfolioValueUsd)}\n </Text>\n <Text style=\"caption\" tone=\"muted\">\n {snapshot.loading ? \"loading\" : `${tokenRows.length} tokens`}\n </Text>\n </HStack>\n\n <HStack gap={1} align=\"center\">\n <Text\n style=\"caption\"\n tone={config.evmBalanceReady ? \"success\" : \"muted\"}\n >\n {config.evmBalanceReady ? \"evm-ready\" : \"evm-off\"}\n </Text>\n <Text\n style=\"caption\"\n tone={config.solanaBalanceReady ? \"success\" : \"muted\"}\n grow={1}\n >\n {config.solanaBalanceReady ? \"sol-ready\" : \"sol-off\"}\n </Text>\n <Button\n variant=\"outline\"\n tone=\"default\"\n agent=\"rpc-settings\"\n onPress={dispatch(\"rpc-settings\")}\n >\n {rpc}\n </Button>\n </HStack>\n\n {snapshot.error ? (\n <Text tone=\"danger\" style=\"caption\">\n {snapshot.error}\n </Text>\n ) : null}\n\n {walletEnabled === false ? (\n <Button\n grow={1}\n agent=\"enable-wallet\"\n onPress={dispatch(\"enable-wallet\")}\n >\n Enable wallet\n </Button>\n ) : null}\n\n <HStack gap={1} wrap>\n {TAB_KEYS.map((tab) => (\n <Button\n key={tab}\n variant=\"outline\"\n tone=\"default\"\n grow={1}\n agent={`tab-${tab}`}\n onPress={dispatch(`tab:${tab}`)}\n >\n {tab}\n </Button>\n ))}\n <Button agent=\"refresh\" onPress={dispatch(\"refresh\")}>\n Refresh\n </Button>\n </HStack>\n\n <Divider label=\"tokens\" />\n {tokenRows.length === 0 ? (\n <Text tone=\"muted\" align=\"center\" style=\"caption\">\n None\n </Text>\n ) : (\n <List gap={0}>\n {tokenRows.slice(0, 8).map((token) => (\n <HStack key={token.id} gap={1} align=\"center\">\n <VStack gap={0} grow={1}>\n <Text bold wrap={false}>\n {token.symbol}\n </Text>\n <Text style=\"caption\" tone=\"muted\" wrap={false}>\n {token.chain} {token.balance}\n </Text>\n </VStack>\n <Text wrap={false}>{formatUsd(token.valueUsd)}</Text>\n <Button\n variant=\"ghost\"\n tone=\"default\"\n agent={`open-${token.id}`}\n onPress={dispatch(`open-token:${token.id}`)}\n >\n Open\n </Button>\n <Button\n variant=\"ghost\"\n tone=\"danger\"\n agent={`hide-${token.id}`}\n onPress={dispatch(`hide-token:${token.id}`)}\n >\n Hide\n </Button>\n </HStack>\n ))}\n </List>\n )}\n\n <Divider label=\"movers\" />\n {marketMovers.length === 0 ? (\n <Text tone=\"muted\" align=\"center\" style=\"caption\">\n —\n </Text>\n ) : (\n <List gap={0}>\n {marketMovers.slice(0, 5).map((mover) => (\n <HStack key={mover.id} gap={1} align=\"center\">\n <Text bold grow={1} wrap={false}>\n {mover.symbol}\n </Text>\n <Text style=\"caption\" tone=\"muted\" wrap={false}>\n {formatUsd(mover.priceUsd)}\n </Text>\n <Text tone={changeTone(mover.change24hPct)} wrap={false}>\n {changeMark(mover.change24hPct)}\n {Math.abs(mover.change24hPct).toFixed(1)}%\n </Text>\n </HStack>\n ))}\n </List>\n )}\n\n <Divider label=\"pnl\" />\n <HStack gap={1} align=\"center\">\n <Text grow={1}>Realized P&L</Text>\n <Text tone={pnlTone(tradingProfile.realizedPnlBnb)} wrap={false}>\n {tradingProfile.realizedPnlBnb >= 0 ? \"+\" : \"\"}\n {tradingProfile.realizedPnlBnb.toFixed(4)} BNB\n </Text>\n </HStack>\n {tradingProfile.recentSwaps.length > 0 ? (\n <List gap={0}>\n {tradingProfile.recentSwaps.slice(0, 4).map((swap) => (\n <HStack key={swap.id} gap={1} align=\"center\">\n <Text grow={1} wrap={false}>\n {swap.pair}\n </Text>\n <Text style=\"caption\" tone=\"muted\" wrap={false}>\n {swap.when}\n </Text>\n </HStack>\n ))}\n </List>\n ) : null}\n\n <Divider label=\"nfts\" />\n {walletNfts.length === 0 ? (\n <Text tone=\"muted\" align=\"center\" style=\"caption\">\n None\n </Text>\n ) : (\n <List gap={0}>\n {walletNfts.slice(0, 6).map((nft) => (\n <HStack key={nft.id} gap={1} align=\"center\" agent={`nft-${nft.id}`}>\n <Text tone=\"primary\" wrap={false}>\n #\n </Text>\n <VStack gap={0} grow={1}>\n <Text bold wrap={false}>\n {nft.name}\n </Text>\n <Text style=\"caption\" tone=\"muted\" wrap={false}>\n {nft.collectionName}\n </Text>\n </VStack>\n <Text style=\"caption\" tone=\"muted\" wrap={false}>\n {nft.chain}\n </Text>\n </HStack>\n ))}\n </List>\n )}\n\n <Divider label=\"addresses\" />\n <HStack gap={1} align=\"center\">\n <Text style=\"caption\" tone=\"muted\" grow={1} wrap={false}>\n EVM {shortAddress(addresses.evmAddress)}\n </Text>\n <Button\n variant=\"ghost\"\n tone=\"default\"\n disabled={!addresses.evmAddress}\n agent=\"copy-evm\"\n onPress={dispatch(\"copy-evm\")}\n >\n Copy\n </Button>\n </HStack>\n <HStack gap={1} align=\"center\">\n <Text style=\"caption\" tone=\"muted\" grow={1} wrap={false}>\n SOL {shortAddress(addresses.solanaAddress)}\n </Text>\n <Button\n variant=\"ghost\"\n tone=\"default\"\n disabled={!addresses.solanaAddress}\n agent=\"copy-solana\"\n onPress={dispatch(\"copy-solana\")}\n >\n Copy\n </Button>\n </HStack>\n </Card>\n );\n}\n","// Shared wallet data helpers for the inventory view, used by both InventoryView /\n// InventoryTuiView (in InventoryView.tsx) and the `interact` capability handler\n// (in InventoryView.interact.ts). Kept out of the .tsx so that file exports only\n// React components and stays Fast-Refresh-compatible in dev.\nimport type {\n WalletAddresses,\n WalletBalancesResponse,\n WalletConfigStatus,\n} from \"@elizaos/shared\";\nimport { client } from \"@elizaos/ui/api\";\n\nexport function resolveWalletAddresses({\n walletAddresses,\n walletConfig,\n}: {\n walletAddresses: WalletAddresses | null;\n walletConfig: WalletConfigStatus | null;\n}): {\n evmAddress: string | null;\n solanaAddress: string | null;\n} {\n return {\n evmAddress: walletAddresses?.evmAddress ?? walletConfig?.evmAddress ?? null,\n solanaAddress:\n walletAddresses?.solanaAddress ?? walletConfig?.solanaAddress ?? null,\n };\n}\n\nfunction parseUsd(value: string | number | null | undefined): number {\n if (typeof value === \"number\") return Number.isFinite(value) ? value : 0;\n if (typeof value !== \"string\") return 0;\n const parsed = Number.parseFloat(value);\n return Number.isFinite(parsed) ? parsed : 0;\n}\n\nfunction summarizeWalletBalances(\n walletBalances: WalletBalancesResponse | null,\n): {\n totalUsd: number;\n tokens: Array<{\n chain: string;\n symbol: string;\n name: string;\n contractAddress: string | null;\n balance: string;\n valueUsd: number;\n isNative: boolean;\n }>;\n chainErrors: Array<{ chain: string; error: string }>;\n} {\n const tokens: Array<{\n chain: string;\n symbol: string;\n name: string;\n contractAddress: string | null;\n balance: string;\n valueUsd: number;\n isNative: boolean;\n }> = [];\n const chainErrors: Array<{ chain: string; error: string }> = [];\n\n for (const chain of walletBalances?.evm?.chains ?? []) {\n const nativeValueUsd = parseUsd(chain.nativeValueUsd);\n tokens.push({\n chain: chain.chain,\n symbol: chain.nativeSymbol,\n name: `${chain.chain} native`,\n contractAddress: null,\n balance: chain.nativeBalance,\n valueUsd: nativeValueUsd,\n isNative: true,\n });\n if (chain.error) {\n chainErrors.push({ chain: chain.chain, error: chain.error });\n continue;\n }\n for (const token of chain.tokens) {\n tokens.push({\n chain: chain.chain,\n symbol: token.symbol,\n name: token.name,\n contractAddress: token.contractAddress,\n balance: token.balance,\n valueUsd: parseUsd(token.valueUsd),\n isNative: false,\n });\n }\n }\n\n if (walletBalances?.solana) {\n tokens.push({\n chain: \"Solana\",\n symbol: \"SOL\",\n name: \"Solana native\",\n contractAddress: null,\n balance: walletBalances.solana.solBalance,\n valueUsd: parseUsd(walletBalances.solana.solValueUsd),\n isNative: true,\n });\n for (const token of walletBalances.solana.tokens) {\n tokens.push({\n chain: \"Solana\",\n symbol: token.symbol,\n name: token.name,\n contractAddress: token.mint,\n balance: token.balance,\n valueUsd: parseUsd(token.valueUsd),\n isNative: false,\n });\n }\n }\n\n tokens.sort((a, b) => b.valueUsd - a.valueUsd);\n return {\n totalUsd: tokens.reduce((sum, token) => sum + token.valueUsd, 0),\n tokens,\n chainErrors,\n };\n}\n\nexport async function loadWalletTuiState() {\n const [\n walletAddresses,\n walletConfig,\n walletBalances,\n walletNfts,\n marketOverview,\n ] = await Promise.all([\n client.getWalletAddresses().catch(() => null),\n client.getWalletConfig().catch(() => null),\n client.getWalletBalances().catch(() => null),\n client.getWalletNfts().catch(() => null),\n client.getWalletMarketOverview().catch(() => null),\n ]);\n const summary = summarizeWalletBalances(walletBalances);\n return {\n walletAddresses,\n walletConfig,\n walletBalances,\n walletNfts,\n marketOverview,\n summary,\n };\n}\n","export const BSC_GAS_READY_THRESHOLD = 0.005;\nexport const BSC_GAS_THRESHOLD = 0.005;\nexport const HEX_ADDRESS_RE = /^0x[a-fA-F0-9]{40}$/;\n\nexport interface TokenRow {\n chain: string;\n symbol: string;\n name: string;\n contractAddress: string | null;\n logoUrl: string | null;\n balance: string;\n valueUsd: number;\n balanceRaw: number;\n isNative: boolean;\n}\n\nexport interface NftItem {\n chain: string;\n name: string;\n imageUrl: string;\n collectionName: string;\n}\n\nexport function chainIcon(chain: string): { code: string; cls: string } {\n const c = chain.toLowerCase();\n if (c === \"ethereum\" || c === \"mainnet\")\n return { code: \"E\", cls: \"bg-chain-eth\" };\n if (c === \"base\") return { code: \"B\", cls: \"bg-chain-base\" };\n if (c === \"bsc\" || c === \"bnb chain\" || c === \"bnb smart chain\")\n return { code: \"B\", cls: \"bg-chain-bsc\" };\n if (\n c === \"avax\" ||\n c === \"avalanche\" ||\n c === \"c-chain\" ||\n c === \"avalanche c-chain\"\n )\n return { code: \"A\", cls: \"bg-chain-avax\" };\n if (c === \"arbitrum\") return { code: \"A\", cls: \"bg-chain-arb\" };\n if (c === \"optimism\") return { code: \"O\", cls: \"bg-chain-op\" };\n if (c === \"polygon\") return { code: \"P\", cls: \"bg-chain-pol\" };\n if (c === \"solana\") return { code: \"S\", cls: \"bg-chain-sol\" };\n return { code: chain.charAt(0).toUpperCase(), cls: \"bg-bg-muted\" };\n}\n\nexport function normalizeChainName(chain: string): string {\n return chain.trim().toLowerCase();\n}\n\nexport function isBscChainName(chain: string): boolean {\n const c = normalizeChainName(chain);\n return c === \"bsc\" || c === \"bnb chain\" || c === \"bnb smart chain\";\n}\n\nexport function isAvaxChainName(chain: string): boolean {\n const c = normalizeChainName(chain);\n return (\n c === \"avax\" ||\n c === \"avalanche\" ||\n c === \"c-chain\" ||\n c === \"avalanche c-chain\"\n );\n}\n\nexport function formatBalance(balance: string): string {\n const num = parseFiniteAmount(balance);\n if (num === 0) return \"0\";\n if (num < 0.0001) return \"<0.0001\";\n if (num < 1) return num.toFixed(6);\n if (num < 1000) return num.toFixed(4);\n return num.toLocaleString(\"en-US\", { maximumFractionDigits: 2 });\n}\n\nexport function toNormalizedAddress(addr: string): string {\n return addr.trim().toLowerCase();\n}\n\nexport function parseFiniteAmount(\n value: string | number | null | undefined,\n): number {\n if (typeof value === \"number\") return Number.isFinite(value) ? value : 0;\n if (typeof value !== \"string\") return 0;\n const parsed = Number.parseFloat(value);\n return Number.isFinite(parsed) ? parsed : 0;\n}\n","/**\n * Central chain configuration registry.\n *\n * Every chain-specific constant (explorer URLs, native token details,\n * gas thresholds, stablecoin addresses, logo URLs, address validation)\n * lives here so that UI components and hooks can derive values from\n * a single source of truth rather than scattering inline constants.\n */\n\nexport type ChainKey =\n | \"bsc\"\n | \"avax\"\n | \"solana\"\n | \"ethereum\"\n | \"base\"\n | \"arbitrum\"\n | \"optimism\"\n | \"polygon\";\n\nexport interface Stablecoin {\n symbol: string;\n address: string;\n}\n\nexport interface ChainConfig {\n /** Unique identifier used as filter key and in storage keys. */\n chainKey: ChainKey;\n /** Human-readable chain name. */\n name: string;\n /** Native gas-token symbol (e.g. BNB, AVAX, SOL). */\n nativeSymbol: string;\n /** Native token decimals. */\n nativeDecimals: number;\n /** Whether this is an EVM-compatible chain. */\n isEvm: boolean;\n\n /** Base URL of the chain's block explorer. */\n explorerBaseUrl: string;\n /** Path template for token pages; `{address}` is replaced. */\n explorerTokenPath: string;\n /** Path template for transaction pages; `{hash}` is replaced. */\n explorerTxPath: string;\n\n /** URL for the native gas-token logo. */\n nativeLogoUrl: string;\n /** TrustWallet assets CDN slug (e.g. `smartchain`, `avalanchec`). */\n trustWalletSlug: string | null;\n\n /** Minimum native balance to consider the wallet \"trade-ready\". */\n gasReadyThreshold: number;\n /** Reserve kept aside from max-balance swaps. */\n swapGasReserve: number;\n\n /** Well-known stablecoin contract addresses on this chain. */\n stablecoins: Stablecoin[];\n\n /** Regex to validate an address on this chain. */\n addressRegex: RegExp;\n\n /** Chain ID used by the DexScreener API. */\n dexScreenerChainId: string;\n\n /** Alternative chain name strings that resolve to this config. */\n nameVariants: string[];\n\n /** Brand color for the chain. CSS variable reference (e.g. `\"var(--color-chain-eth)\"`). */\n color: string;\n}\n\nconst HEX_ADDRESS_RE = /^0x[a-fA-F0-9]{40}$/;\nconst SOLANA_ADDRESS_RE = /^[1-9A-HJ-NP-Za-km-z]{32,44}$/;\n\nexport const CHAIN_CONFIGS: Record<ChainKey, ChainConfig> = {\n bsc: {\n chainKey: \"bsc\",\n name: \"BSC\",\n nativeSymbol: \"BNB\",\n nativeDecimals: 18,\n isEvm: true,\n explorerBaseUrl: \"https://bscscan.com\",\n explorerTokenPath: \"/token/{address}\",\n explorerTxPath: \"/tx/{hash}\",\n nativeLogoUrl:\n \"https://raw.githubusercontent.com/trustwallet/assets/master/blockchains/smartchain/info/logo.png\",\n trustWalletSlug: \"smartchain\",\n gasReadyThreshold: 0.005,\n swapGasReserve: 0.002,\n stablecoins: [\n { symbol: \"USDT\", address: \"0x55d398326f99059fF775485246999027B3197955\" },\n { symbol: \"USDC\", address: \"0x8AC76a51cc950d9822D68b83fE1Ad97B32Cd580d\" },\n ],\n addressRegex: HEX_ADDRESS_RE,\n dexScreenerChainId: \"bsc\",\n nameVariants: [\"bsc\", \"bnb chain\", \"bnb smart chain\"],\n color: \"var(--color-chain-bsc)\",\n },\n\n avax: {\n chainKey: \"avax\",\n name: \"Avalanche\",\n nativeSymbol: \"AVAX\",\n nativeDecimals: 18,\n isEvm: true,\n explorerBaseUrl: \"https://snowtrace.io\",\n explorerTokenPath: \"/token/{address}\",\n explorerTxPath: \"/tx/{hash}\",\n nativeLogoUrl:\n \"https://raw.githubusercontent.com/trustwallet/assets/master/blockchains/avalanchec/info/logo.png\",\n trustWalletSlug: \"avalanchec\",\n gasReadyThreshold: 0.01,\n swapGasReserve: 0.005,\n stablecoins: [\n { symbol: \"USDT\", address: \"0x9702230A8Ea53601f5cD2dc00fDBc13d4dF4A8c7\" },\n { symbol: \"USDC\", address: \"0xB97EF9Ef8734C71904D8002F8b6Bc66Dd9c48a6E\" },\n ],\n addressRegex: HEX_ADDRESS_RE,\n dexScreenerChainId: \"avalanche\",\n nameVariants: [\"avax\", \"avalanche\", \"c-chain\", \"avalanche c-chain\"],\n color: \"#e84142\",\n },\n\n solana: {\n chainKey: \"solana\",\n name: \"Solana\",\n nativeSymbol: \"SOL\",\n nativeDecimals: 9,\n isEvm: false,\n explorerBaseUrl: \"https://solscan.io\",\n explorerTokenPath: \"/token/{address}\",\n explorerTxPath: \"/tx/{hash}\",\n nativeLogoUrl:\n \"https://raw.githubusercontent.com/trustwallet/assets/master/blockchains/solana/info/logo.png\",\n trustWalletSlug: \"solana\",\n gasReadyThreshold: 0.01,\n swapGasReserve: 0.005,\n stablecoins: [\n {\n symbol: \"USDC\",\n address: \"EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v\",\n },\n ],\n addressRegex: SOLANA_ADDRESS_RE,\n dexScreenerChainId: \"solana\",\n nameVariants: [\"solana\", \"sol\"],\n color: \"var(--color-chain-sol)\",\n },\n\n ethereum: {\n chainKey: \"ethereum\",\n name: \"Ethereum\",\n nativeSymbol: \"ETH\",\n nativeDecimals: 18,\n isEvm: true,\n explorerBaseUrl: \"https://etherscan.io\",\n explorerTokenPath: \"/token/{address}\",\n explorerTxPath: \"/tx/{hash}\",\n nativeLogoUrl:\n \"https://raw.githubusercontent.com/trustwallet/assets/master/blockchains/ethereum/info/logo.png\",\n trustWalletSlug: \"ethereum\",\n gasReadyThreshold: 0.005,\n swapGasReserve: 0.002,\n stablecoins: [\n { symbol: \"USDT\", address: \"0xdAC17F958D2ee523a2206206994597C13D831ec7\" },\n { symbol: \"USDC\", address: \"0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48\" },\n ],\n addressRegex: HEX_ADDRESS_RE,\n dexScreenerChainId: \"ethereum\",\n nameVariants: [\"ethereum\", \"mainnet\", \"eth\"],\n color: \"var(--color-chain-eth)\",\n },\n\n base: {\n chainKey: \"base\",\n name: \"Base\",\n nativeSymbol: \"ETH\",\n nativeDecimals: 18,\n isEvm: true,\n explorerBaseUrl: \"https://basescan.org\",\n explorerTokenPath: \"/token/{address}\",\n explorerTxPath: \"/tx/{hash}\",\n nativeLogoUrl:\n \"https://raw.githubusercontent.com/trustwallet/assets/master/blockchains/base/info/logo.png\",\n trustWalletSlug: \"base\",\n gasReadyThreshold: 0.005,\n swapGasReserve: 0.001,\n stablecoins: [\n { symbol: \"USDC\", address: \"0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913\" },\n ],\n addressRegex: HEX_ADDRESS_RE,\n dexScreenerChainId: \"base\",\n nameVariants: [\"base\"],\n color: \"var(--color-chain-base)\",\n },\n\n arbitrum: {\n chainKey: \"arbitrum\",\n name: \"Arbitrum\",\n nativeSymbol: \"ETH\",\n nativeDecimals: 18,\n isEvm: true,\n explorerBaseUrl: \"https://arbiscan.io\",\n explorerTokenPath: \"/token/{address}\",\n explorerTxPath: \"/tx/{hash}\",\n nativeLogoUrl:\n \"https://raw.githubusercontent.com/trustwallet/assets/master/blockchains/ethereum/info/logo.png\",\n trustWalletSlug: null,\n gasReadyThreshold: 0.005,\n swapGasReserve: 0.001,\n stablecoins: [\n { symbol: \"USDC\", address: \"0xaf88d065e77c8cC2239327C5EDb3A432268e5831\" },\n ],\n addressRegex: HEX_ADDRESS_RE,\n dexScreenerChainId: \"arbitrum\",\n nameVariants: [\"arbitrum\"],\n color: \"var(--color-chain-arb)\",\n },\n\n optimism: {\n chainKey: \"optimism\",\n name: \"Optimism\",\n nativeSymbol: \"ETH\",\n nativeDecimals: 18,\n isEvm: true,\n explorerBaseUrl: \"https://optimistic.etherscan.io\",\n explorerTokenPath: \"/token/{address}\",\n explorerTxPath: \"/tx/{hash}\",\n nativeLogoUrl:\n \"https://raw.githubusercontent.com/trustwallet/assets/master/blockchains/ethereum/info/logo.png\",\n trustWalletSlug: null,\n gasReadyThreshold: 0.005,\n swapGasReserve: 0.001,\n stablecoins: [\n { symbol: \"USDC\", address: \"0x0b2C639c533813f4Aa9D7837CAf62653d097Ff85\" },\n ],\n addressRegex: HEX_ADDRESS_RE,\n dexScreenerChainId: \"optimism\",\n nameVariants: [\"optimism\"],\n color: \"var(--color-chain-op)\",\n },\n\n polygon: {\n chainKey: \"polygon\",\n name: \"Polygon\",\n nativeSymbol: \"MATIC\",\n nativeDecimals: 18,\n isEvm: true,\n explorerBaseUrl: \"https://polygonscan.com\",\n explorerTokenPath: \"/token/{address}\",\n explorerTxPath: \"/tx/{hash}\",\n nativeLogoUrl:\n \"https://raw.githubusercontent.com/trustwallet/assets/master/blockchains/polygon/info/logo.png\",\n trustWalletSlug: \"polygon\",\n gasReadyThreshold: 0.5,\n swapGasReserve: 0.1,\n stablecoins: [\n { symbol: \"USDT\", address: \"0xc2132D05D31c914a87C6611C10748AEb04B58e8F\" },\n { symbol: \"USDC\", address: \"0x3c499c542cEF5E3811e1192ce70d8cC03d5c3359\" },\n ],\n addressRegex: HEX_ADDRESS_RE,\n dexScreenerChainId: \"polygon\",\n nameVariants: [\"polygon\"],\n color: \"var(--color-chain-pol)\",\n },\n};\n\n/** Pre-built lookup table from lowercase variant to ChainConfig. */\nconst _variantMap = new Map<string, ChainConfig>();\nfor (const config of Object.values(CHAIN_CONFIGS)) {\n for (const variant of config.nameVariants) {\n _variantMap.set(variant.toLowerCase(), config);\n }\n}\n\n/** Resolve a chain name (case-insensitive, trimmed) to its config. */\nexport function getChainConfig(chainName: string): ChainConfig | null {\n return _variantMap.get(chainName.trim().toLowerCase()) ?? null;\n}\n\n/**\n * Resolve a chain name string to a `ChainKey`.\n * Returns `null` for unrecognised chains.\n */\nexport function resolveChainKey(chainName: string): ChainKey | null {\n const config = getChainConfig(chainName);\n return config?.chainKey ?? null;\n}\n\n/**\n * Build the explorer URL for a token on the given chain.\n * Returns `null` if the chain is unknown or the address is invalid.\n */\nexport function getExplorerTokenUrl(\n chainName: string,\n address: string,\n): string | null {\n const config = getChainConfig(chainName);\n if (!config) return null;\n const trimmed = address.trim();\n if (!config.addressRegex.test(trimmed)) return null;\n return `${config.explorerBaseUrl}${config.explorerTokenPath.replace(\"{address}\", trimmed)}`;\n}\n\n/**\n * Build the explorer URL for a transaction on the given chain.\n * Returns `null` if the chain is unknown.\n */\nexport function getExplorerTxUrl(\n chainName: string,\n hash: string,\n): string | null {\n const config = getChainConfig(chainName);\n if (!config) return null;\n return `${config.explorerBaseUrl}${config.explorerTxPath.replace(\"{hash}\", hash.trim())}`;\n}\n\n/**\n * Get the native token logo URL for a chain, or `null` if unknown.\n */\nexport function getNativeLogoUrl(chainName: string): string | null {\n return getChainConfig(chainName)?.nativeLogoUrl ?? null;\n}\n\n/**\n * Get the TrustWallet CDN logo URL for a contract token on the given chain.\n * Returns `null` if the chain has no TrustWallet slug or no contract address.\n */\nexport function getContractLogoUrl(\n chainName: string,\n contractAddress: string | null,\n): string | null {\n if (!contractAddress) return null;\n const config = getChainConfig(chainName);\n if (!config?.trustWalletSlug) return null;\n return `https://raw.githubusercontent.com/trustwallet/assets/master/blockchains/${config.trustWalletSlug}/assets/${contractAddress}/logo.png`;\n}\n\n/**\n * Resolve a stablecoin address on a given chain by symbol.\n * Returns `null` if not found.\n */\nexport function getStablecoinAddress(\n chainName: string,\n symbol: string,\n): string | null {\n const config = getChainConfig(chainName);\n if (!config) return null;\n const upper = symbol.trim().toUpperCase();\n return config.stablecoins.find((s) => s.symbol === upper)?.address ?? null;\n}\n\n/** The primary chains we want to support prominently. */\nexport const PRIMARY_CHAIN_KEYS: ChainKey[] = [\n \"ethereum\",\n \"base\",\n \"bsc\",\n \"avax\",\n \"solana\",\n];\n\n/**\n * Map a chain focus key (ChainKey or \"all\") to the legacy WalletRpcChain used\n * by legacyCustomChains. Returns null for \"all\" or unknown chains.\n */\nexport function chainKeyToWalletRpcChain(\n chainFocus: string,\n): \"evm\" | \"bsc\" | \"solana\" | null {\n if (chainFocus === \"all\" || chainFocus === \"multi\") return null;\n if (chainFocus === \"bsc\" || chainFocus === \"solana\") return chainFocus;\n const evmKeys: ChainKey[] = [\n \"ethereum\",\n \"base\",\n \"avax\",\n \"arbitrum\",\n \"optimism\",\n \"polygon\",\n ];\n return evmKeys.includes(chainFocus as ChainKey) ? \"evm\" : null;\n}\n","import type { InventoryChainFilters } from \"@elizaos/ui/state\";\nimport type { ChainKey } from \"./chainConfig.ts\";\nimport { resolveChainKey } from \"./chainConfig.ts\";\n\nexport type PrimaryInventoryChainKey = keyof InventoryChainFilters;\n\nconst PRIMARY_INVENTORY_CHAIN_KEYS = [\n \"ethereum\",\n \"base\",\n \"bsc\",\n \"avax\",\n \"solana\",\n] as const satisfies readonly PrimaryInventoryChainKey[];\n\nexport const DEFAULT_INVENTORY_CHAIN_FILTERS: InventoryChainFilters = {\n ethereum: true,\n base: true,\n bsc: true,\n avax: true,\n solana: true,\n};\n\ntype InventoryChainFilterState =\n | InventoryChainFilters\n | Partial<InventoryChainFilters>\n | null\n | undefined;\nfunction isPrimaryInventoryChainKey(\n k: ChainKey,\n): k is PrimaryInventoryChainKey {\n return PRIMARY_INVENTORY_CHAIN_KEYS.includes(k as PrimaryInventoryChainKey);\n}\n\nexport function matchesInventoryChainFilter(\n chainName: string,\n filters: InventoryChainFilterState,\n): boolean {\n const normalizedFilters = normalizeInventoryChainFilters(filters);\n const k = resolveChainKey(chainName);\n if (!k || !isPrimaryInventoryChainKey(k)) return false;\n return normalizedFilters[k] === true;\n}\n\n/** When exactly one chain is enabled, returns that key; otherwise null. */\nexport function computeSingleChainFocus(\n filters: InventoryChainFilterState,\n): PrimaryInventoryChainKey | null {\n const normalizedFilters = normalizeInventoryChainFilters(filters);\n const enabled = PRIMARY_INVENTORY_CHAIN_KEYS.filter(\n (k) => normalizedFilters[k],\n );\n return enabled.length === 1 ? enabled[0] : null;\n}\n\nexport function normalizeInventoryChainFilters(\n filters: InventoryChainFilterState,\n): InventoryChainFilters {\n return {\n ...DEFAULT_INVENTORY_CHAIN_FILTERS,\n ...filters,\n };\n}\n\nexport function toggleInventoryChainFilter(\n filters: InventoryChainFilterState,\n key: PrimaryInventoryChainKey,\n): InventoryChainFilters {\n const normalizedFilters = normalizeInventoryChainFilters(filters);\n return { ...normalizedFilters, [key]: !normalizedFilters[key] };\n}\n","import type {\n EvmChainBalance,\n WalletAddresses,\n WalletBalancesResponse,\n WalletConfigStatus,\n WalletNftsResponse,\n} from \"@elizaos/shared\";\nimport type { InventoryChainFilters } from \"@elizaos/ui/state\";\nimport { useMemo } from \"react\";\nimport {\n CHAIN_CONFIGS,\n type ChainKey,\n PRIMARY_CHAIN_KEYS,\n resolveChainKey,\n} from \"./chainConfig.ts\";\nimport {\n isBscChainName,\n parseFiniteAmount,\n type NftItem,\n type TokenRow,\n} from \"./constants.ts\";\nimport {\n computeSingleChainFocus,\n matchesInventoryChainFilter,\n type PrimaryInventoryChainKey,\n} from \"./inventory-chain-filters.ts\";\n\nexport interface InventoryDataInput {\n walletBalances: WalletBalancesResponse | null;\n walletAddresses: WalletAddresses | null;\n walletConfig: WalletConfigStatus | null;\n walletNfts: WalletNftsResponse | null;\n inventorySort: string;\n inventorySortDirection: \"asc\" | \"desc\";\n inventoryChainFilters: InventoryChainFilters;\n}\n\nexport interface InventoryDataOutput {\n /** When exactly one chain toggle is on, that key; otherwise null. */\n singleChainFocus: PrimaryInventoryChainKey | null;\n tokenRows: TokenRow[];\n /** Unfiltered rows (for sidebar per-chain asset counts). */\n tokenRowsAllChains: TokenRow[];\n sortedRows: TokenRow[];\n chainErrors: EvmChainBalance[];\n focusChainHasError: boolean;\n allNfts: NftItem[];\n primaryChain: EvmChainBalance | null;\n primaryNativeBalanceNum: number;\n focusedRows: TokenRow[];\n visibleRows: TokenRow[];\n totalUsd: number;\n visibleChainErrors: EvmChainBalance[];\n focusedChainName: string | null;\n focusedChainError: string | null;\n focusedNativeBalance: string | null;\n focusedNativeSymbol: string | null;\n primaryChainError: string | null;\n primaryNativeBalance: string | null;\n}\n\nfunction hasVisibleBalance(row: TokenRow): boolean {\n return row.balanceRaw > 0 || row.valueUsd > 0;\n}\n\nfunction matchesSingleChainFocus(chainName: string, focus: ChainKey): boolean {\n const resolved = resolveChainKey(chainName);\n return resolved === focus;\n}\n\n/** Builds token rows as if every primary chain were included (before per-toggle filter). */\nfunction buildTokenRowsAllChains({\n walletBalances,\n walletAddresses,\n walletConfig,\n}: {\n walletBalances: WalletBalancesResponse | null;\n walletAddresses: WalletAddresses | null;\n walletConfig: WalletConfigStatus | null;\n}): TokenRow[] {\n const rows: TokenRow[] = [];\n const knownEvmAddr = walletAddresses?.evmAddress ?? walletConfig?.evmAddress;\n\n if (walletBalances?.evm) {\n const seenChainKeys = new Set<string>();\n for (const chain of walletBalances.evm.chains) {\n const chainKey = resolveChainKey(chain.chain);\n if (chainKey) seenChainKeys.add(chainKey);\n rows.push({\n chain: chain.chain,\n symbol: chain.nativeSymbol,\n name: `${chain.chain} native`,\n contractAddress: null,\n logoUrl: null,\n balance: chain.nativeBalance,\n valueUsd: parseFiniteAmount(chain.nativeValueUsd),\n balanceRaw: parseFiniteAmount(chain.nativeBalance),\n isNative: true,\n });\n if (chain.error) continue;\n for (const tk of chain.tokens) {\n rows.push({\n chain: chain.chain,\n symbol: tk.symbol,\n name: tk.name,\n contractAddress: tk.contractAddress ?? null,\n logoUrl: tk.logoUrl ?? null,\n balance: tk.balance,\n valueUsd: parseFiniteAmount(tk.valueUsd),\n balanceRaw: parseFiniteAmount(tk.balance),\n isNative: false,\n });\n }\n }\n if (knownEvmAddr) {\n for (const key of PRIMARY_CHAIN_KEYS) {\n if (key === \"solana\") continue;\n if (seenChainKeys.has(key)) continue;\n const cfg = CHAIN_CONFIGS[key];\n rows.unshift({\n chain: cfg.name,\n symbol: cfg.nativeSymbol,\n name: `${cfg.name} native`,\n contractAddress: null,\n logoUrl: null,\n balance: \"0\",\n valueUsd: 0,\n balanceRaw: 0,\n isNative: true,\n });\n }\n }\n } else if (knownEvmAddr) {\n for (const key of PRIMARY_CHAIN_KEYS) {\n if (key === \"solana\") continue;\n const cfg = CHAIN_CONFIGS[key];\n rows.push({\n chain: cfg.name,\n symbol: cfg.nativeSymbol,\n name: `${cfg.name} native`,\n contractAddress: null,\n logoUrl: null,\n balance: \"0\",\n valueUsd: 0,\n balanceRaw: 0,\n isNative: true,\n });\n }\n }\n\n if (walletBalances?.solana) {\n rows.push({\n chain: \"Solana\",\n symbol: \"SOL\",\n name: \"Solana native\",\n contractAddress: null,\n logoUrl: null,\n balance: walletBalances.solana.solBalance,\n valueUsd: parseFiniteAmount(walletBalances.solana.solValueUsd),\n balanceRaw: parseFiniteAmount(walletBalances.solana.solBalance),\n isNative: true,\n });\n for (const tk of walletBalances.solana.tokens) {\n rows.push({\n chain: \"Solana\",\n symbol: tk.symbol,\n name: tk.name,\n contractAddress: tk.mint ?? null,\n logoUrl: tk.logoUrl ?? null,\n balance: tk.balance,\n valueUsd: parseFiniteAmount(tk.valueUsd),\n balanceRaw: parseFiniteAmount(tk.balance),\n isNative: false,\n });\n }\n }\n return rows.filter(hasVisibleBalance);\n}\n\nexport function useInventoryData({\n walletBalances,\n walletAddresses,\n walletConfig,\n walletNfts,\n inventorySort,\n inventorySortDirection,\n inventoryChainFilters,\n}: InventoryDataInput): InventoryDataOutput {\n const singleChainFocus = useMemo(\n () => computeSingleChainFocus(inventoryChainFilters),\n [inventoryChainFilters],\n );\n const knownEvmAddr = walletAddresses?.evmAddress ?? walletConfig?.evmAddress;\n const _knownSolAddr =\n walletAddresses?.solanaAddress ?? walletConfig?.solanaAddress;\n\n const primaryChain = useMemo(() => {\n if (!walletBalances?.evm?.chains) return null;\n return (\n walletBalances.evm.chains.find((c: EvmChainBalance) =>\n isBscChainName(c.chain),\n ) ?? null\n );\n }, [walletBalances]);\n\n const primaryNativeBalanceNum = useMemo(() => {\n if (!primaryChain) return 0;\n return parseFiniteAmount(primaryChain.nativeBalance);\n }, [primaryChain]);\n\n const tokenRowsAllChains = useMemo(\n () =>\n buildTokenRowsAllChains({\n walletBalances,\n walletAddresses,\n walletConfig,\n }),\n [walletBalances, walletAddresses, walletConfig],\n );\n\n const tokenRows = useMemo(\n () =>\n tokenRowsAllChains.filter((row) =>\n matchesInventoryChainFilter(row.chain, inventoryChainFilters),\n ),\n [tokenRowsAllChains, inventoryChainFilters],\n );\n\n const sortedRows = useMemo(() => {\n const sorted = [...tokenRows];\n const asc = inventorySortDirection === \"asc\";\n if (inventorySort === \"value\") {\n sorted.sort((a, b) => {\n const diff = a.valueUsd - b.valueUsd;\n if (diff !== 0) return asc ? diff : -diff;\n const diff2 = a.balanceRaw - b.balanceRaw;\n return asc ? diff2 : -diff2;\n });\n } else if (inventorySort === \"chain\") {\n sorted.sort((a, b) => {\n const c = a.chain.localeCompare(b.chain);\n if (c !== 0) return asc ? c : -c;\n const s = a.symbol.localeCompare(b.symbol);\n return asc ? s : -s;\n });\n } else if (inventorySort === \"symbol\") {\n sorted.sort((a, b) => {\n const s = a.symbol.localeCompare(b.symbol);\n if (s !== 0) return asc ? s : -s;\n const c = a.chain.localeCompare(b.chain);\n return asc ? c : -c;\n });\n }\n return sorted;\n }, [tokenRows, inventorySort, inventorySortDirection]);\n\n const chainErrors = useMemo(\n () =>\n (walletBalances?.evm?.chains ?? []).filter(\n (c: EvmChainBalance) => c.error,\n ),\n [walletBalances],\n );\n\n const focusChainHasError = useMemo(() => {\n return chainErrors.some((c) =>\n matchesInventoryChainFilter(c.chain, inventoryChainFilters),\n );\n }, [chainErrors, inventoryChainFilters]);\n\n const allNfts = useMemo((): NftItem[] => {\n if (!walletNfts) return [];\n const items: NftItem[] = [];\n for (const chainData of walletNfts.evm) {\n for (const nft of chainData.nfts) {\n items.push({\n chain: chainData.chain,\n name: nft.name,\n imageUrl: nft.imageUrl,\n collectionName: nft.collectionName || nft.tokenType,\n });\n }\n }\n if (walletNfts.solana) {\n for (const nft of walletNfts.solana.nfts) {\n items.push({\n chain: \"Solana\",\n name: nft.name,\n imageUrl: nft.imageUrl,\n collectionName: nft.collectionName,\n });\n }\n }\n const filtered = items.filter((nft) =>\n matchesInventoryChainFilter(nft.chain, inventoryChainFilters),\n );\n const sorted = [...filtered];\n const asc = inventorySortDirection === \"asc\";\n const normalizedSort = inventorySort === \"value\" ? \"symbol\" : inventorySort;\n\n if (normalizedSort === \"chain\") {\n sorted.sort((a, b) => {\n const chainDiff = a.chain.localeCompare(b.chain);\n if (chainDiff !== 0) return asc ? chainDiff : -chainDiff;\n const nameDiff = a.name.localeCompare(b.name);\n return asc ? nameDiff : -nameDiff;\n });\n } else {\n sorted.sort((a, b) => {\n const nameDiff = a.name.localeCompare(b.name);\n if (nameDiff !== 0) return asc ? nameDiff : -nameDiff;\n const chainDiff = a.chain.localeCompare(b.chain);\n return asc ? chainDiff : -chainDiff;\n });\n }\n\n return sorted;\n }, [\n walletNfts,\n inventoryChainFilters,\n inventorySort,\n inventorySortDirection,\n ]);\n\n const focusedChain = useMemo(() => {\n if (!singleChainFocus) return null;\n if (singleChainFocus === \"solana\") {\n return {\n name: CHAIN_CONFIGS.solana.name,\n nativeSymbol: CHAIN_CONFIGS.solana.nativeSymbol,\n nativeBalance: walletBalances?.solana?.solBalance ?? null,\n error: null,\n };\n }\n\n const chainConfig =\n CHAIN_CONFIGS[singleChainFocus as keyof typeof CHAIN_CONFIGS];\n const evmChain =\n walletBalances?.evm?.chains.find((chain) =>\n matchesSingleChainFocus(chain.chain, singleChainFocus),\n ) ?? null;\n\n if (!chainConfig && !evmChain) return null;\n\n return {\n name: evmChain?.chain ?? chainConfig?.name ?? singleChainFocus,\n nativeSymbol: evmChain?.nativeSymbol ?? chainConfig?.nativeSymbol ?? null,\n nativeBalance: evmChain?.nativeBalance ?? (knownEvmAddr ? \"0\" : null),\n error: evmChain?.error ?? null,\n };\n }, [singleChainFocus, knownEvmAddr, walletBalances]);\n\n const primaryChainError =\n primaryChain?.error ??\n chainErrors.find((chain) => isBscChainName(chain.chain))?.error ??\n null;\n const primaryNativeBalance: string | null =\n primaryChain?.nativeBalance ?? null;\n\n const focusedRows = sortedRows;\n const visibleRows = sortedRows;\n\n const totalUsd = useMemo(\n () => tokenRows.reduce((sum, r) => sum + r.valueUsd, 0),\n [tokenRows],\n );\n\n const visibleChainErrors = useMemo(() => {\n return chainErrors.filter((chain) =>\n matchesInventoryChainFilter(chain.chain, inventoryChainFilters),\n );\n }, [chainErrors, inventoryChainFilters]);\n\n return {\n singleChainFocus,\n tokenRows,\n tokenRowsAllChains,\n sortedRows,\n chainErrors,\n focusChainHasError,\n allNfts,\n primaryChain,\n primaryNativeBalanceNum,\n focusedRows,\n visibleRows,\n totalUsd,\n visibleChainErrors,\n focusedChainName: focusedChain?.name ?? null,\n focusedChainError: focusedChain?.error ?? null,\n focusedNativeBalance: focusedChain?.nativeBalance ?? null,\n focusedNativeSymbol: focusedChain?.nativeSymbol ?? null,\n primaryChainError,\n primaryNativeBalance,\n };\n}\n","/**\n * InventoryView — the single GUI/XR data wrapper for the wallet surface.\n *\n * It owns the live wallet data (balances, NFTs, trading profile, market\n * overview, addresses, config) drawn from the app store + `useInventoryData`,\n * builds the one presentational {@link WalletSnapshot}, and renders the single\n * {@link InventorySpatialView} inside a {@link SpatialSurface}. Omitting the\n * `modality` prop lets `SpatialSurface` auto-detect GUI vs XR via\n * `window.__elizaXRContext`, so the SAME component serves both surfaces. The TUI\n * surface renders the same `InventorySpatialView` through the terminal registry\n * (see `register-terminal-view.tsx`).\n *\n * The rich multi-panel dashboard (P&L chart, activity log, movers, LP positions,\n * NFT grid) lives in the separate {@link InventoryAppView} overlay surface that\n * the `/inventory` nav tab mounts; this view is the cross-modality holdings\n * source of truth.\n */\n\nimport { client } from \"@elizaos/ui/api\";\nimport { useActivityEvents } from \"@elizaos/ui/hooks\";\nimport { SpatialSurface } from \"@elizaos/ui/spatial\";\nimport type { InventoryChainFilters } from \"@elizaos/ui/state\";\nimport { useAppSelectorShallow } from \"@elizaos/ui/state\";\nimport { useCallback, useEffect, useMemo, useRef, useState } from \"react\";\nimport {\n InventorySpatialView,\n type WalletSnapshot,\n} from \"./components/InventorySpatialView.tsx\";\nimport { resolveWalletAddresses } from \"./InventoryView.helpers.ts\";\nimport { formatBalance, type TokenRow } from \"./inventory/constants.ts\";\nimport { useInventoryData } from \"./inventory/useInventoryData.ts\";\n\nconst ALL_INVENTORY_FILTERS: InventoryChainFilters = {\n ethereum: true,\n base: true,\n bsc: true,\n avax: true,\n solana: true,\n};\nconst HIDDEN_TOKEN_IDS_KEY = \"eliza:wallet:hidden-token-ids:v1\";\nconst WALLET_REFRESH_INTERVAL_MS = 20_000;\n\nfunction readHiddenTokenIds(): Set<string> {\n if (typeof window === \"undefined\") return new Set();\n const raw = window.localStorage.getItem(HIDDEN_TOKEN_IDS_KEY);\n if (!raw) return new Set();\n const parsed: unknown = JSON.parse(raw);\n if (!Array.isArray(parsed)) return new Set();\n return new Set(\n parsed.filter((item): item is string => typeof item === \"string\"),\n );\n}\n\nfunction writeHiddenTokenIds(next: Set<string>): void {\n if (typeof window === \"undefined\") return;\n window.localStorage.setItem(HIDDEN_TOKEN_IDS_KEY, JSON.stringify([...next]));\n}\n\nfunction tokenId(row: TokenRow): string {\n const address =\n row.contractAddress && row.contractAddress.length > 0\n ? row.contractAddress.toLowerCase()\n : `native:${row.symbol.toLowerCase()}`;\n return `${row.chain.toLowerCase()}:${address}`;\n}\n\nfunction tokenHasInventory(row: TokenRow): boolean {\n return row.balanceRaw > 0 || row.valueUsd > 0;\n}\n\nfunction parseAmount(value: string | null | undefined): number {\n if (!value) return 0;\n const parsed = Number.parseFloat(value);\n return Number.isFinite(parsed) ? parsed : 0;\n}\n\nfunction copyToClipboard(value: string | null): void {\n if (!value || typeof navigator === \"undefined\" || !navigator.clipboard) {\n return;\n }\n void navigator.clipboard.writeText(value);\n}\n\nfunction openRpcSettings(setTab: (tab: string) => void): void {\n setTab(\"settings\");\n if (typeof window !== \"undefined\") {\n window.location.hash = \"wallet-rpc\";\n }\n}\n\nexport function InventoryView() {\n const {\n walletEnabled,\n walletAddresses,\n walletConfig,\n walletBalances,\n walletNfts,\n loadWalletConfig,\n loadBalances,\n loadNfts,\n setState,\n setTab,\n setActionNotice,\n } = useAppSelectorShallow((s) => ({\n walletEnabled: s.walletEnabled,\n walletAddresses: s.walletAddresses,\n walletConfig: s.walletConfig,\n walletBalances: s.walletBalances,\n walletNfts: s.walletNfts,\n loadWalletConfig: s.loadWalletConfig,\n loadBalances: s.loadBalances,\n loadNfts: s.loadNfts,\n setState: s.setState,\n setTab: s.setTab,\n setActionNotice: s.setActionNotice,\n }));\n const { events: activityEvents } = useActivityEvents();\n void activityEvents;\n\n const [hiddenTokenIds, setHiddenTokenIds] = useState<Set<string>>(() =>\n readHiddenTokenIds(),\n );\n const [realizedPnlBnb, setRealizedPnlBnb] = useState(0);\n const [error, setError] = useState<string | null>(null);\n const initialLoadRef = useRef(false);\n\n const loadTradingProfile = useCallback(async () => {\n const profile = await client.getWalletTradingProfile(\"30d\");\n setRealizedPnlBnb(parseAmount(profile.summary.realizedPnlBnb));\n }, []);\n\n useEffect(() => {\n if (initialLoadRef.current) return;\n initialLoadRef.current = true;\n void loadWalletConfig();\n if (walletEnabled === false) return;\n void loadBalances();\n void loadNfts();\n void loadTradingProfile();\n }, [\n loadBalances,\n loadNfts,\n loadTradingProfile,\n loadWalletConfig,\n walletEnabled,\n ]);\n\n useEffect(() => {\n if (walletEnabled === false) return;\n const interval = window.setInterval(() => {\n void loadWalletConfig();\n void loadBalances();\n void loadNfts();\n void loadTradingProfile();\n }, WALLET_REFRESH_INTERVAL_MS);\n return () => window.clearInterval(interval);\n }, [loadBalances, loadNfts, loadTradingProfile, loadWalletConfig, walletEnabled]);\n\n const inventoryData = useInventoryData({\n walletBalances,\n walletAddresses,\n walletConfig,\n walletNfts,\n inventorySort: \"value\",\n inventorySortDirection: \"desc\",\n inventoryChainFilters: ALL_INVENTORY_FILTERS,\n });\n\n const addresses = useMemo(\n () => resolveWalletAddresses({ walletAddresses, walletConfig }),\n [walletAddresses, walletConfig],\n );\n\n const visibleRows = useMemo(\n () =>\n inventoryData.tokenRowsAllChains\n .filter(tokenHasInventory)\n .filter((row) => !hiddenTokenIds.has(tokenId(row))),\n [hiddenTokenIds, inventoryData.tokenRowsAllChains],\n );\n\n const snapshot: WalletSnapshot = useMemo(() => {\n const selectedRpcProviders = walletConfig?.selectedRpcProviders\n ? Object.values(walletConfig.selectedRpcProviders).filter(\n (value): value is string => typeof value === \"string\",\n )\n : [];\n return {\n portfolioValueUsd: visibleRows.reduce((sum, row) => sum + row.valueUsd, 0),\n tokenRows: visibleRows.map((row) => ({\n id: tokenId(row),\n symbol: row.symbol,\n chain: row.chain,\n balance: formatBalance(row.balance),\n valueUsd: row.valueUsd,\n contractAddress: row.contractAddress,\n logoUrl: row.logoUrl,\n })),\n walletNfts: inventoryData.allNfts.map((nft) => ({\n id: `${nft.chain}:${nft.collectionName}:${nft.name}`,\n chain: nft.chain,\n collectionName: nft.collectionName,\n name: nft.name,\n imageUrl: nft.imageUrl,\n })),\n marketMovers: [],\n tradingProfile: { realizedPnlBnb, recentSwaps: [] },\n addresses,\n config: {\n evmBalanceReady: Boolean(walletConfig?.evmBalanceReady),\n solanaBalanceReady: Boolean(walletConfig?.solanaBalanceReady),\n selectedRpcProviders: [...new Set(selectedRpcProviders)],\n },\n walletEnabled,\n error,\n };\n }, [\n addresses,\n error,\n inventoryData.allNfts,\n realizedPnlBnb,\n visibleRows,\n walletConfig,\n walletEnabled,\n ]);\n\n const hideToken = useCallback(\n (id: string) => {\n const row = visibleRows.find((candidate) => tokenId(candidate) === id);\n const next = new Set(hiddenTokenIds);\n next.add(id);\n setHiddenTokenIds(next);\n writeHiddenTokenIds(next);\n if (row) setActionNotice(`${row.symbol} hidden from this wallet view.`);\n },\n [hiddenTokenIds, setActionNotice, visibleRows],\n );\n\n const refresh = useCallback(() => {\n setError(null);\n void loadWalletConfig();\n void loadBalances();\n void loadNfts();\n void loadTradingProfile();\n }, [loadBalances, loadNfts, loadTradingProfile, loadWalletConfig]);\n\n const enableWallet = useCallback(() => {\n setState(\"walletEnabled\", true);\n void loadWalletConfig();\n void loadBalances();\n void loadNfts();\n }, [loadBalances, loadNfts, loadWalletConfig, setState]);\n\n const onAction = useCallback(\n (action: string) => {\n if (action.startsWith(\"hide-token:\")) {\n hideToken(action.slice(\"hide-token:\".length));\n return;\n }\n if (action.startsWith(\"open-token:\")) {\n setTab(\"settings\");\n return;\n }\n if (action.startsWith(\"tab:\")) return;\n switch (action) {\n case \"refresh\":\n refresh();\n return;\n case \"enable-wallet\":\n enableWallet();\n return;\n case \"rpc-settings\":\n openRpcSettings(setTab);\n return;\n case \"copy-evm\":\n copyToClipboard(addresses.evmAddress);\n return;\n case \"copy-solana\":\n copyToClipboard(addresses.solanaAddress);\n return;\n }\n },\n [addresses, enableWallet, hideToken, refresh, setTab],\n );\n\n return (\n <SpatialSurface>\n <InventorySpatialView snapshot={snapshot} onAction={onAction} />\n </SpatialSurface>\n );\n}\n","// View-bundle `interact` capability handler, split out of InventoryView.tsx so\n// that file exports only React components and stays Fast-Refresh-compatible\n// (Vite would full-reload a component file that also exports a plain function).\n// The view bundle re-exports `interact` via ./wallet-view-bundle.ts.\nimport { client } from \"@elizaos/ui/api\";\nimport {\n loadWalletTuiState,\n resolveWalletAddresses,\n} from \"./InventoryView.helpers\";\n\nexport async function interact(\n capability: string,\n params?: Record<string, unknown>,\n): Promise<unknown> {\n if (capability === \"terminal-wallet-state\") {\n const state = await loadWalletTuiState();\n const addresses = resolveWalletAddresses({\n walletAddresses: state.walletAddresses,\n walletConfig: state.walletConfig,\n });\n return {\n viewType: \"tui\",\n addresses,\n totalUsd: state.summary.totalUsd,\n tokenCount: state.summary.tokens.length,\n nftCount:\n (state.walletNfts?.evm?.reduce(\n (sum, collection) => sum + collection.nfts.length,\n 0,\n ) ?? 0) + (state.walletNfts?.solana?.nfts.length ?? 0),\n chainErrors: state.summary.chainErrors,\n tokens: state.summary.tokens.slice(\n 0,\n typeof params?.limit === \"number\" ? params.limit : 20,\n ),\n };\n }\n\n if (capability === \"terminal-wallet-market-overview\") {\n return {\n viewType: \"tui\",\n overview: await client.getWalletMarketOverview(),\n };\n }\n\n if (capability === \"terminal-wallet-trading-profile\") {\n const window =\n params?.window === \"24h\" ||\n params?.window === \"7d\" ||\n params?.window === \"30d\"\n ? params.window\n : \"30d\";\n return {\n viewType: \"tui\",\n profile: await client.getWalletTradingProfile(window),\n };\n }\n\n throw new Error(`Unsupported capability \"${capability}\"`);\n}\n"],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"wallet-rpc.d.ts","sourceRoot":"","sources":["../src/wallet-rpc.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,2BAA2B,EAC3B,iCAAiC,GAClC,MAAM,iBAAiB,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/wallet-rpc.ts"],"sourcesContent":["export {\n buildWalletRpcUpdateRequest,\n resolveInitialWalletRpcSelections,\n} from \"@elizaos/shared\";\n"],"mappings":"AAAA;AAAA,EACE;AAAA,EACA;AAAA,OACK;","names":[]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"wallet-view-bundle.d.ts","sourceRoot":"","sources":["../src/wallet-view-bundle.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAChD,OAAO,EAAE,QAAQ,EAAE,MAAM,0BAA0B,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/wallet-view-bundle.ts"],"sourcesContent":["// Vite view-bundle entry. Re-exports the unified spatial view component plus the\n// `interact` capability handler so the built bundle (dist/views/bundle.js)\n// exposes the named exports the view loader reads (`InventoryView`, `interact`).\n// Kept separate from InventoryView.tsx so that file exports only React\n// components and stays Fast-Refresh-compatible in dev.\nexport { InventoryView } from \"./InventoryView.js\";\nexport { interact } from \"./InventoryView.interact\";\n"],"mappings":"AAKA,SAAS,qBAAqB;AAC9B,SAAS,gBAAgB;","names":[]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"wallet-status.d.ts","sourceRoot":"","sources":["../../src/widgets/wallet-status.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,wBAAwB,CAAC;AAuKrE,wBAAgB,yBAAyB,CAAC,MAAM,EAAE,sBAAsB,kDAuKvE"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"wallet-status.helpers.d.ts","sourceRoot":"","sources":["../../src/widgets/wallet-status.helpers.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,2BAA2B,EAAE,MAAM,wBAAwB,CAAC;AAG1E,eAAO,MAAM,oBAAoB,EAAE,2BAMlC,CAAC"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import { WalletStatusSidebarWidget } from "./wallet-status.js";
|
|
2
|
+
const WALLET_STATUS_WIDGET = {
|
|
3
|
+
id: "wallet.status",
|
|
4
|
+
pluginId: "wallet",
|
|
5
|
+
order: 70,
|
|
6
|
+
defaultEnabled: true,
|
|
7
|
+
Component: WalletStatusSidebarWidget
|
|
8
|
+
};
|
|
9
|
+
export {
|
|
10
|
+
WALLET_STATUS_WIDGET
|
|
11
|
+
};
|
|
12
|
+
//# sourceMappingURL=wallet-status.helpers.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/widgets/wallet-status.helpers.ts"],"sourcesContent":["// The `ChatSidebarWidgetDefinition` registration value for the wallet status\n// widget. Kept out of wallet-status.tsx so that file exports only React\n// components and stays Fast-Refresh-compatible in dev.\n\nimport type { ChatSidebarWidgetDefinition } from \"@elizaos/ui/components\";\nimport { WalletStatusSidebarWidget } from \"./wallet-status.js\";\n\nexport const WALLET_STATUS_WIDGET: ChatSidebarWidgetDefinition = {\n id: \"wallet.status\",\n pluginId: \"wallet\",\n order: 70,\n defaultEnabled: true,\n Component: WalletStatusSidebarWidget,\n};\n"],"mappings":"AAKA,SAAS,iCAAiC;AAEnC,MAAM,uBAAoD;AAAA,EAC/D,IAAI;AAAA,EACJ,UAAU;AAAA,EACV,OAAO;AAAA,EACP,gBAAgB;AAAA,EAChB,WAAW;AACb;","names":[]}
|
|
@@ -0,0 +1,291 @@
|
|
|
1
|
+
import { jsx, jsxs } from "react/jsx-runtime";
|
|
2
|
+
import { EmptyWidgetState, WidgetSection } from "@elizaos/ui/components";
|
|
3
|
+
import { useAppSelector } from "@elizaos/ui/state";
|
|
4
|
+
import { Check, Copy, Wallet } from "lucide-react";
|
|
5
|
+
import { useEffect, useMemo, useState } from "react";
|
|
6
|
+
import {
|
|
7
|
+
getNativeLogoUrl,
|
|
8
|
+
resolveChainKey
|
|
9
|
+
} from "../inventory/chainConfig.js";
|
|
10
|
+
import { normalizeInventoryImageUrl } from "../inventory/media-url.js";
|
|
11
|
+
const DUST_THRESHOLD_USD = 0.01;
|
|
12
|
+
const COPY_FEEDBACK_MS = 1200;
|
|
13
|
+
const EVM_CHAIN_ORDER = [
|
|
14
|
+
"ethereum",
|
|
15
|
+
"base",
|
|
16
|
+
"arbitrum",
|
|
17
|
+
"optimism",
|
|
18
|
+
"polygon",
|
|
19
|
+
"bsc",
|
|
20
|
+
"avax"
|
|
21
|
+
];
|
|
22
|
+
const EVM_CHAIN_KEYS = new Set(EVM_CHAIN_ORDER);
|
|
23
|
+
const CHAIN_DISPLAY_LABELS = {
|
|
24
|
+
ethereum: "Ethereum",
|
|
25
|
+
base: "Base",
|
|
26
|
+
arbitrum: "Arbitrum",
|
|
27
|
+
optimism: "Optimism",
|
|
28
|
+
polygon: "Polygon",
|
|
29
|
+
bsc: "BNB Chain",
|
|
30
|
+
avax: "Avalanche",
|
|
31
|
+
solana: "Solana"
|
|
32
|
+
};
|
|
33
|
+
function shortenAddress(value) {
|
|
34
|
+
if (!value) return null;
|
|
35
|
+
if (value.length <= 10) return value;
|
|
36
|
+
return `${value.slice(0, 6)}\u2026${value.slice(-4)}`;
|
|
37
|
+
}
|
|
38
|
+
function parseUsd(value) {
|
|
39
|
+
if (typeof value !== "string") return 0;
|
|
40
|
+
const parsed = Number.parseFloat(value);
|
|
41
|
+
return Number.isFinite(parsed) ? parsed : 0;
|
|
42
|
+
}
|
|
43
|
+
function formatUsd(value) {
|
|
44
|
+
if (value >= 1e3) {
|
|
45
|
+
return `$${value.toLocaleString("en-US", { maximumFractionDigits: 0 })}`;
|
|
46
|
+
}
|
|
47
|
+
if (value >= 1) {
|
|
48
|
+
return `$${value.toFixed(2)}`;
|
|
49
|
+
}
|
|
50
|
+
return `$${value.toFixed(2)}`;
|
|
51
|
+
}
|
|
52
|
+
function hasPositiveBalance(value) {
|
|
53
|
+
if (!value) return false;
|
|
54
|
+
const parsed = Number.parseFloat(value);
|
|
55
|
+
return Number.isFinite(parsed) && parsed > 0;
|
|
56
|
+
}
|
|
57
|
+
function normalizeEvmChainKeys(chainNames) {
|
|
58
|
+
const seen = /* @__PURE__ */ new Set();
|
|
59
|
+
for (const chainName of chainNames) {
|
|
60
|
+
const chainKey = resolveChainKey(chainName);
|
|
61
|
+
if (chainKey && EVM_CHAIN_KEYS.has(chainKey)) {
|
|
62
|
+
seen.add(chainKey);
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
return EVM_CHAIN_ORDER.filter((chainKey) => seen.has(chainKey));
|
|
66
|
+
}
|
|
67
|
+
function ChainBadge({ chain }) {
|
|
68
|
+
const [errored, setErrored] = useState(false);
|
|
69
|
+
const label = CHAIN_DISPLAY_LABELS[chain];
|
|
70
|
+
const url = errored ? null : normalizeInventoryImageUrl(getNativeLogoUrl(chain)) ?? null;
|
|
71
|
+
if (url) {
|
|
72
|
+
return /* @__PURE__ */ jsx(
|
|
73
|
+
"img",
|
|
74
|
+
{
|
|
75
|
+
src: url,
|
|
76
|
+
alt: label,
|
|
77
|
+
title: label,
|
|
78
|
+
width: 16,
|
|
79
|
+
height: 16,
|
|
80
|
+
className: "inline-flex h-4 w-4 shrink-0 object-contain",
|
|
81
|
+
onError: () => setErrored(true)
|
|
82
|
+
}
|
|
83
|
+
);
|
|
84
|
+
}
|
|
85
|
+
return /* @__PURE__ */ jsx(
|
|
86
|
+
"span",
|
|
87
|
+
{
|
|
88
|
+
className: "inline-flex h-4 shrink-0 items-center px-0.5 font-mono text-[0.52rem] font-semibold leading-none text-muted",
|
|
89
|
+
title: label,
|
|
90
|
+
role: "img",
|
|
91
|
+
"aria-label": label,
|
|
92
|
+
children: label.slice(0, 3).toUpperCase()
|
|
93
|
+
}
|
|
94
|
+
);
|
|
95
|
+
}
|
|
96
|
+
function ChainBadges({ chains }) {
|
|
97
|
+
return /* @__PURE__ */ jsx("span", { className: "flex min-w-0 flex-wrap items-center gap-1", children: chains.map((chain) => /* @__PURE__ */ jsx(ChainBadge, { chain }, chain)) });
|
|
98
|
+
}
|
|
99
|
+
function CopyAddressButton({ value, label }) {
|
|
100
|
+
const [copied, setCopied] = useState(false);
|
|
101
|
+
useEffect(() => {
|
|
102
|
+
if (!copied) return;
|
|
103
|
+
const timer = setTimeout(() => setCopied(false), COPY_FEEDBACK_MS);
|
|
104
|
+
return () => clearTimeout(timer);
|
|
105
|
+
}, [copied]);
|
|
106
|
+
async function onClick(event) {
|
|
107
|
+
event.preventDefault();
|
|
108
|
+
event.stopPropagation();
|
|
109
|
+
try {
|
|
110
|
+
if (typeof navigator === "undefined" || !navigator.clipboard) {
|
|
111
|
+
return;
|
|
112
|
+
}
|
|
113
|
+
await navigator.clipboard.writeText(value);
|
|
114
|
+
setCopied(true);
|
|
115
|
+
} catch {
|
|
116
|
+
return;
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
return /* @__PURE__ */ jsx(
|
|
120
|
+
"button",
|
|
121
|
+
{
|
|
122
|
+
type: "button",
|
|
123
|
+
onClick,
|
|
124
|
+
"aria-label": copied ? `${label} copied` : `Copy ${label}`,
|
|
125
|
+
title: copied ? "Copied" : "Copy",
|
|
126
|
+
className: "inline-flex h-5 w-5 shrink-0 items-center justify-center text-muted transition-colors hover:text-txt",
|
|
127
|
+
children: copied ? /* @__PURE__ */ jsx(Check, { className: "h-3 w-3", "aria-hidden": true }) : /* @__PURE__ */ jsx(Copy, { className: "h-3 w-3", "aria-hidden": true })
|
|
128
|
+
}
|
|
129
|
+
);
|
|
130
|
+
}
|
|
131
|
+
function WalletStatusSidebarWidget(_props) {
|
|
132
|
+
const walletEnabled = useAppSelector((s) => s.walletEnabled);
|
|
133
|
+
const walletAddresses = useAppSelector((s) => s.walletAddresses);
|
|
134
|
+
const walletConfig = useAppSelector((s) => s.walletConfig);
|
|
135
|
+
const walletBalances = useAppSelector((s) => s.walletBalances);
|
|
136
|
+
const loadWalletConfig = useAppSelector((s) => s.loadWalletConfig);
|
|
137
|
+
const loadBalances = useAppSelector((s) => s.loadBalances);
|
|
138
|
+
const setTab = useAppSelector((s) => s.setTab);
|
|
139
|
+
useEffect(() => {
|
|
140
|
+
if (walletEnabled === false) return;
|
|
141
|
+
if (walletConfig === null) {
|
|
142
|
+
void loadWalletConfig();
|
|
143
|
+
}
|
|
144
|
+
if (walletBalances !== null) return;
|
|
145
|
+
void loadBalances();
|
|
146
|
+
}, [
|
|
147
|
+
walletEnabled,
|
|
148
|
+
walletConfig,
|
|
149
|
+
walletBalances,
|
|
150
|
+
loadWalletConfig,
|
|
151
|
+
loadBalances
|
|
152
|
+
]);
|
|
153
|
+
const evmAddress = walletAddresses?.evmAddress ?? null;
|
|
154
|
+
const solanaAddress = walletAddresses?.solanaAddress ?? null;
|
|
155
|
+
const evmShort = shortenAddress(evmAddress);
|
|
156
|
+
const solanaShort = shortenAddress(solanaAddress);
|
|
157
|
+
const evmChains = useMemo(
|
|
158
|
+
() => normalizeEvmChainKeys([
|
|
159
|
+
...walletConfig?.evmChains ?? [],
|
|
160
|
+
...walletBalances?.evm?.chains.map((chain) => chain.chain) ?? []
|
|
161
|
+
]),
|
|
162
|
+
[walletConfig?.evmChains, walletBalances]
|
|
163
|
+
);
|
|
164
|
+
const walletSummary = useMemo(() => {
|
|
165
|
+
let assetCount = 0;
|
|
166
|
+
let totalUsd = 0;
|
|
167
|
+
if (walletBalances?.evm) {
|
|
168
|
+
for (const chain of walletBalances.evm.chains) {
|
|
169
|
+
const nativeUsd = parseUsd(chain.nativeValueUsd);
|
|
170
|
+
totalUsd += nativeUsd;
|
|
171
|
+
if (nativeUsd >= DUST_THRESHOLD_USD || hasPositiveBalance(chain.nativeBalance)) {
|
|
172
|
+
assetCount += 1;
|
|
173
|
+
}
|
|
174
|
+
for (const token of chain.tokens) {
|
|
175
|
+
const tokenUsd = parseUsd(token.valueUsd);
|
|
176
|
+
totalUsd += tokenUsd;
|
|
177
|
+
if (tokenUsd >= DUST_THRESHOLD_USD || hasPositiveBalance(token.balance)) {
|
|
178
|
+
assetCount += 1;
|
|
179
|
+
}
|
|
180
|
+
}
|
|
181
|
+
}
|
|
182
|
+
}
|
|
183
|
+
if (walletBalances?.solana) {
|
|
184
|
+
const nativeUsd = parseUsd(walletBalances.solana.solValueUsd);
|
|
185
|
+
totalUsd += nativeUsd;
|
|
186
|
+
if (nativeUsd >= DUST_THRESHOLD_USD || hasPositiveBalance(walletBalances.solana.solBalance)) {
|
|
187
|
+
assetCount += 1;
|
|
188
|
+
}
|
|
189
|
+
for (const token of walletBalances.solana.tokens) {
|
|
190
|
+
const tokenUsd = parseUsd(token.valueUsd);
|
|
191
|
+
totalUsd += tokenUsd;
|
|
192
|
+
if (tokenUsd >= DUST_THRESHOLD_USD || hasPositiveBalance(token.balance)) {
|
|
193
|
+
assetCount += 1;
|
|
194
|
+
}
|
|
195
|
+
}
|
|
196
|
+
}
|
|
197
|
+
return { assetCount, totalUsd };
|
|
198
|
+
}, [walletBalances]);
|
|
199
|
+
if (walletEnabled === false) {
|
|
200
|
+
return null;
|
|
201
|
+
}
|
|
202
|
+
const hasAnyAddress = Boolean(evmAddress || solanaAddress);
|
|
203
|
+
const hasAnyBalanceRow = walletSummary.assetCount > 0;
|
|
204
|
+
return /* @__PURE__ */ jsx(
|
|
205
|
+
WidgetSection,
|
|
206
|
+
{
|
|
207
|
+
title: "Wallet",
|
|
208
|
+
icon: /* @__PURE__ */ jsx(Wallet, { className: "h-3.5 w-3.5" }),
|
|
209
|
+
testId: "chat-widget-wallet-status",
|
|
210
|
+
onTitleClick: () => setTab("inventory"),
|
|
211
|
+
children: hasAnyAddress ? /* @__PURE__ */ jsxs("div", { className: "flex flex-col gap-1.5 px-1 pt-0.5", children: [
|
|
212
|
+
evmAddress ? /* @__PURE__ */ jsxs(
|
|
213
|
+
"div",
|
|
214
|
+
{
|
|
215
|
+
className: "flex items-center justify-between gap-2 text-3xs",
|
|
216
|
+
"data-testid": "chat-widget-wallet-row-evm-address",
|
|
217
|
+
children: [
|
|
218
|
+
/* @__PURE__ */ jsx(ChainBadges, { chains: evmChains }),
|
|
219
|
+
/* @__PURE__ */ jsxs("div", { className: "flex items-center gap-1 min-w-0", children: [
|
|
220
|
+
/* @__PURE__ */ jsx(
|
|
221
|
+
"span",
|
|
222
|
+
{
|
|
223
|
+
className: "truncate font-mono text-txt",
|
|
224
|
+
title: evmAddress,
|
|
225
|
+
children: evmShort
|
|
226
|
+
}
|
|
227
|
+
),
|
|
228
|
+
/* @__PURE__ */ jsx(CopyAddressButton, { value: evmAddress, label: "EVM address" })
|
|
229
|
+
] })
|
|
230
|
+
]
|
|
231
|
+
}
|
|
232
|
+
) : null,
|
|
233
|
+
solanaAddress ? /* @__PURE__ */ jsxs(
|
|
234
|
+
"div",
|
|
235
|
+
{
|
|
236
|
+
className: "flex items-center justify-between gap-2 text-3xs",
|
|
237
|
+
"data-testid": "chat-widget-wallet-row-solana-address",
|
|
238
|
+
children: [
|
|
239
|
+
/* @__PURE__ */ jsx(ChainBadge, { chain: "solana" }),
|
|
240
|
+
/* @__PURE__ */ jsxs("div", { className: "flex items-center gap-1 min-w-0", children: [
|
|
241
|
+
/* @__PURE__ */ jsx(
|
|
242
|
+
"span",
|
|
243
|
+
{
|
|
244
|
+
className: "truncate font-mono text-txt",
|
|
245
|
+
title: solanaAddress,
|
|
246
|
+
children: solanaShort
|
|
247
|
+
}
|
|
248
|
+
),
|
|
249
|
+
/* @__PURE__ */ jsx(
|
|
250
|
+
CopyAddressButton,
|
|
251
|
+
{
|
|
252
|
+
value: solanaAddress,
|
|
253
|
+
label: "Solana address"
|
|
254
|
+
}
|
|
255
|
+
)
|
|
256
|
+
] })
|
|
257
|
+
]
|
|
258
|
+
}
|
|
259
|
+
) : null,
|
|
260
|
+
hasAnyBalanceRow ? /* @__PURE__ */ jsxs("div", { className: "mt-1 flex flex-col gap-1 pt-1", children: [
|
|
261
|
+
/* @__PURE__ */ jsxs(
|
|
262
|
+
"div",
|
|
263
|
+
{
|
|
264
|
+
className: "flex items-center justify-between text-3xs",
|
|
265
|
+
"data-testid": "chat-widget-wallet-row-assets",
|
|
266
|
+
children: [
|
|
267
|
+
/* @__PURE__ */ jsx("span", { className: "truncate text-muted", children: "Assets" }),
|
|
268
|
+
/* @__PURE__ */ jsx("span", { className: "shrink-0 text-txt", children: walletSummary.assetCount })
|
|
269
|
+
]
|
|
270
|
+
}
|
|
271
|
+
),
|
|
272
|
+
/* @__PURE__ */ jsxs(
|
|
273
|
+
"div",
|
|
274
|
+
{
|
|
275
|
+
className: "flex items-center justify-between text-3xs",
|
|
276
|
+
"data-testid": "chat-widget-wallet-row-value",
|
|
277
|
+
children: [
|
|
278
|
+
/* @__PURE__ */ jsx("span", { className: "truncate text-muted", children: "Value" }),
|
|
279
|
+
/* @__PURE__ */ jsx("span", { className: "shrink-0 text-txt", children: formatUsd(walletSummary.totalUsd) })
|
|
280
|
+
]
|
|
281
|
+
}
|
|
282
|
+
)
|
|
283
|
+
] }) : null
|
|
284
|
+
] }) : /* @__PURE__ */ jsx(EmptyWidgetState, { icon: /* @__PURE__ */ jsx(Wallet, { className: "h-5 w-5" }), title: "None" })
|
|
285
|
+
}
|
|
286
|
+
);
|
|
287
|
+
}
|
|
288
|
+
export {
|
|
289
|
+
WalletStatusSidebarWidget
|
|
290
|
+
};
|
|
291
|
+
//# sourceMappingURL=wallet-status.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/widgets/wallet-status.tsx"],"sourcesContent":["import type { ChatSidebarWidgetProps } from \"@elizaos/ui/components\";\nimport { EmptyWidgetState, WidgetSection } from \"@elizaos/ui/components\";\nimport { useAppSelector } from \"@elizaos/ui/state\";\nimport { Check, Copy, Wallet } from \"lucide-react\";\nimport { useEffect, useMemo, useState } from \"react\";\nimport {\n type ChainKey,\n getNativeLogoUrl,\n resolveChainKey,\n} from \"../inventory/chainConfig.js\";\nimport { normalizeInventoryImageUrl } from \"../inventory/media-url.js\";\n\nconst DUST_THRESHOLD_USD = 0.01;\nconst COPY_FEEDBACK_MS = 1200;\nconst EVM_CHAIN_ORDER: ChainKey[] = [\n \"ethereum\",\n \"base\",\n \"arbitrum\",\n \"optimism\",\n \"polygon\",\n \"bsc\",\n \"avax\",\n];\nconst EVM_CHAIN_KEYS = new Set<ChainKey>(EVM_CHAIN_ORDER);\nconst CHAIN_DISPLAY_LABELS: Record<ChainKey, string> = {\n ethereum: \"Ethereum\",\n base: \"Base\",\n arbitrum: \"Arbitrum\",\n optimism: \"Optimism\",\n polygon: \"Polygon\",\n bsc: \"BNB Chain\",\n avax: \"Avalanche\",\n solana: \"Solana\",\n};\n\nfunction shortenAddress(value: string | null | undefined): string | null {\n if (!value) return null;\n if (value.length <= 10) return value;\n return `${value.slice(0, 6)}…${value.slice(-4)}`;\n}\n\nfunction parseUsd(value: string | null | undefined): number {\n if (typeof value !== \"string\") return 0;\n const parsed = Number.parseFloat(value);\n return Number.isFinite(parsed) ? parsed : 0;\n}\n\nfunction formatUsd(value: number): string {\n if (value >= 1000) {\n return `$${value.toLocaleString(\"en-US\", { maximumFractionDigits: 0 })}`;\n }\n if (value >= 1) {\n return `$${value.toFixed(2)}`;\n }\n return `$${value.toFixed(2)}`;\n}\n\nfunction hasPositiveBalance(value: string | null | undefined): boolean {\n if (!value) return false;\n const parsed = Number.parseFloat(value);\n return Number.isFinite(parsed) && parsed > 0;\n}\n\nfunction normalizeEvmChainKeys(chainNames: readonly string[]): ChainKey[] {\n const seen = new Set<ChainKey>();\n for (const chainName of chainNames) {\n const chainKey = resolveChainKey(chainName);\n if (chainKey && EVM_CHAIN_KEYS.has(chainKey)) {\n seen.add(chainKey);\n }\n }\n return EVM_CHAIN_ORDER.filter((chainKey) => seen.has(chainKey));\n}\n\nfunction ChainBadge({ chain }: { chain: ChainKey }) {\n // Use the same per-chain logo URLs the wallet page uses — these are real\n // raster logos pulled from the trustwallet/assets repo (see\n // CHAIN_CONFIGS[*].nativeLogoUrl) and cover every chain we register,\n // including Arbitrum / Optimism / Polygon that the SVG-only ChainIcon\n // doesn't have paths for.\n const [errored, setErrored] = useState(false);\n const label = CHAIN_DISPLAY_LABELS[chain];\n const url = errored\n ? null\n : (normalizeInventoryImageUrl(getNativeLogoUrl(chain)) ?? null);\n\n if (url) {\n return (\n <img\n src={url}\n alt={label}\n title={label}\n width={16}\n height={16}\n className=\"inline-flex h-4 w-4 shrink-0 object-contain\"\n onError={() => setErrored(true)}\n />\n );\n }\n // Tiny initials fallback when the logo URL fails or is missing.\n return (\n <span\n className=\"inline-flex h-4 shrink-0 items-center px-0.5 font-mono text-[0.52rem] font-semibold leading-none text-muted\"\n title={label}\n role=\"img\"\n aria-label={label}\n >\n {label.slice(0, 3).toUpperCase()}\n </span>\n );\n}\n\nfunction ChainBadges({ chains }: { chains: readonly ChainKey[] }) {\n return (\n <span className=\"flex min-w-0 flex-wrap items-center gap-1\">\n {chains.map((chain) => (\n <ChainBadge key={chain} chain={chain} />\n ))}\n </span>\n );\n}\n\ninterface CopyButtonProps {\n value: string;\n label: string;\n}\n\nfunction CopyAddressButton({ value, label }: CopyButtonProps) {\n const [copied, setCopied] = useState(false);\n\n useEffect(() => {\n if (!copied) return;\n const timer = setTimeout(() => setCopied(false), COPY_FEEDBACK_MS);\n return () => clearTimeout(timer);\n }, [copied]);\n\n async function onClick(event: React.MouseEvent) {\n event.preventDefault();\n event.stopPropagation();\n try {\n if (typeof navigator === \"undefined\" || !navigator.clipboard) {\n return;\n }\n await navigator.clipboard.writeText(value);\n setCopied(true);\n } catch {\n return;\n }\n }\n\n return (\n <button\n type=\"button\"\n onClick={onClick}\n aria-label={copied ? `${label} copied` : `Copy ${label}`}\n title={copied ? \"Copied\" : \"Copy\"}\n className=\"inline-flex h-5 w-5 shrink-0 items-center justify-center text-muted transition-colors hover:text-txt\"\n >\n {copied ? (\n <Check className=\"h-3 w-3\" aria-hidden />\n ) : (\n <Copy className=\"h-3 w-3\" aria-hidden />\n )}\n </button>\n );\n}\n\nexport function WalletStatusSidebarWidget(_props: ChatSidebarWidgetProps) {\n const walletEnabled = useAppSelector((s) => s.walletEnabled);\n const walletAddresses = useAppSelector((s) => s.walletAddresses);\n const walletConfig = useAppSelector((s) => s.walletConfig);\n const walletBalances = useAppSelector((s) => s.walletBalances);\n const loadWalletConfig = useAppSelector((s) => s.loadWalletConfig);\n const loadBalances = useAppSelector((s) => s.loadBalances);\n const setTab = useAppSelector((s) => s.setTab);\n\n useEffect(() => {\n if (walletEnabled === false) return;\n if (walletConfig === null) {\n void loadWalletConfig();\n }\n if (walletBalances !== null) return;\n void loadBalances();\n }, [\n walletEnabled,\n walletConfig,\n walletBalances,\n loadWalletConfig,\n loadBalances,\n ]);\n\n const evmAddress = walletAddresses?.evmAddress ?? null;\n const solanaAddress = walletAddresses?.solanaAddress ?? null;\n const evmShort = shortenAddress(evmAddress);\n const solanaShort = shortenAddress(solanaAddress);\n const evmChains = useMemo(\n () =>\n normalizeEvmChainKeys([\n ...(walletConfig?.evmChains ?? []),\n ...(walletBalances?.evm?.chains.map((chain) => chain.chain) ?? []),\n ]),\n [walletConfig?.evmChains, walletBalances],\n );\n\n const walletSummary = useMemo(() => {\n let assetCount = 0;\n let totalUsd = 0;\n if (walletBalances?.evm) {\n for (const chain of walletBalances.evm.chains) {\n const nativeUsd = parseUsd(chain.nativeValueUsd);\n totalUsd += nativeUsd;\n if (\n nativeUsd >= DUST_THRESHOLD_USD ||\n hasPositiveBalance(chain.nativeBalance)\n ) {\n assetCount += 1;\n }\n for (const token of chain.tokens) {\n const tokenUsd = parseUsd(token.valueUsd);\n totalUsd += tokenUsd;\n if (\n tokenUsd >= DUST_THRESHOLD_USD ||\n hasPositiveBalance(token.balance)\n ) {\n assetCount += 1;\n }\n }\n }\n }\n if (walletBalances?.solana) {\n const nativeUsd = parseUsd(walletBalances.solana.solValueUsd);\n totalUsd += nativeUsd;\n if (\n nativeUsd >= DUST_THRESHOLD_USD ||\n hasPositiveBalance(walletBalances.solana.solBalance)\n ) {\n assetCount += 1;\n }\n for (const token of walletBalances.solana.tokens) {\n const tokenUsd = parseUsd(token.valueUsd);\n totalUsd += tokenUsd;\n if (\n tokenUsd >= DUST_THRESHOLD_USD ||\n hasPositiveBalance(token.balance)\n ) {\n assetCount += 1;\n }\n }\n }\n return { assetCount, totalUsd };\n }, [walletBalances]);\n\n if (walletEnabled === false) {\n return null;\n }\n\n const hasAnyAddress = Boolean(evmAddress || solanaAddress);\n const hasAnyBalanceRow = walletSummary.assetCount > 0;\n\n return (\n <WidgetSection\n title=\"Wallet\"\n icon={<Wallet className=\"h-3.5 w-3.5\" />}\n testId=\"chat-widget-wallet-status\"\n onTitleClick={() => setTab(\"inventory\")}\n >\n {hasAnyAddress ? (\n <div className=\"flex flex-col gap-1.5 px-1 pt-0.5\">\n {evmAddress ? (\n <div\n className=\"flex items-center justify-between gap-2 text-3xs\"\n data-testid=\"chat-widget-wallet-row-evm-address\"\n >\n <ChainBadges chains={evmChains} />\n <div className=\"flex items-center gap-1 min-w-0\">\n <span\n className=\"truncate font-mono text-txt\"\n title={evmAddress}\n >\n {evmShort}\n </span>\n <CopyAddressButton value={evmAddress} label=\"EVM address\" />\n </div>\n </div>\n ) : null}\n {solanaAddress ? (\n <div\n className=\"flex items-center justify-between gap-2 text-3xs\"\n data-testid=\"chat-widget-wallet-row-solana-address\"\n >\n <ChainBadge chain=\"solana\" />\n <div className=\"flex items-center gap-1 min-w-0\">\n <span\n className=\"truncate font-mono text-txt\"\n title={solanaAddress}\n >\n {solanaShort}\n </span>\n <CopyAddressButton\n value={solanaAddress}\n label=\"Solana address\"\n />\n </div>\n </div>\n ) : null}\n\n {hasAnyBalanceRow ? (\n <div className=\"mt-1 flex flex-col gap-1 pt-1\">\n <div\n className=\"flex items-center justify-between text-3xs\"\n data-testid=\"chat-widget-wallet-row-assets\"\n >\n <span className=\"truncate text-muted\">Assets</span>\n <span className=\"shrink-0 text-txt\">\n {walletSummary.assetCount}\n </span>\n </div>\n <div\n className=\"flex items-center justify-between text-3xs\"\n data-testid=\"chat-widget-wallet-row-value\"\n >\n <span className=\"truncate text-muted\">Value</span>\n <span className=\"shrink-0 text-txt\">\n {formatUsd(walletSummary.totalUsd)}\n </span>\n </div>\n </div>\n ) : null}\n </div>\n ) : (\n <EmptyWidgetState icon={<Wallet className=\"h-5 w-5\" />} title=\"None\" />\n )}\n </WidgetSection>\n );\n}\n"],"mappings":"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","names":[]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@elizaos/plugin-wallet-ui",
|
|
3
|
-
"version": "2.0.3-beta.
|
|
3
|
+
"version": "2.0.3-beta.7",
|
|
4
4
|
"type": "module",
|
|
5
5
|
"main": "./dist/index.js",
|
|
6
6
|
"exports": {
|
|
@@ -32,14 +32,14 @@
|
|
|
32
32
|
}
|
|
33
33
|
},
|
|
34
34
|
"dependencies": {
|
|
35
|
-
"@elizaos/core": "2.0.3-beta.
|
|
36
|
-
"@elizaos/shared": "2.0.3-beta.
|
|
37
|
-
"@elizaos/ui": "2.0.3-beta.
|
|
35
|
+
"@elizaos/core": "2.0.3-beta.7",
|
|
36
|
+
"@elizaos/shared": "2.0.3-beta.7",
|
|
37
|
+
"@elizaos/ui": "2.0.3-beta.7",
|
|
38
38
|
"lucide-react": "^1.0.0"
|
|
39
39
|
},
|
|
40
40
|
"peerDependencies": {
|
|
41
|
-
"@elizaos/app-core": "2.0.3-beta.
|
|
42
|
-
"@elizaos/plugin-wallet": "2.0.3-beta.
|
|
41
|
+
"@elizaos/app-core": "2.0.3-beta.7",
|
|
42
|
+
"@elizaos/plugin-wallet": "2.0.3-beta.7",
|
|
43
43
|
"react": ">=18.0.0"
|
|
44
44
|
},
|
|
45
45
|
"elizaos": {
|
|
@@ -75,5 +75,5 @@
|
|
|
75
75
|
"vite": "^8.0.0",
|
|
76
76
|
"vitest": "^4.0.17"
|
|
77
77
|
},
|
|
78
|
-
"gitHead": "
|
|
78
|
+
"gitHead": "61094f10458d11055c75b3dd0bae374e3f66bac5"
|
|
79
79
|
}
|