@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.
Files changed (95) hide show
  1. package/dist/InventoryView.d.ts +19 -0
  2. package/dist/InventoryView.d.ts.map +1 -0
  3. package/dist/InventoryView.helpers.d.ts +32 -0
  4. package/dist/InventoryView.helpers.d.ts.map +1 -0
  5. package/dist/InventoryView.helpers.js +104 -0
  6. package/dist/InventoryView.helpers.js.map +1 -0
  7. package/dist/InventoryView.interact.d.ts +2 -0
  8. package/dist/InventoryView.interact.d.ts.map +1 -0
  9. package/dist/InventoryView.interact.js +47 -0
  10. package/dist/InventoryView.interact.js.map +1 -0
  11. package/dist/InventoryView.js +242 -0
  12. package/dist/InventoryView.js.map +1 -0
  13. package/dist/components/InventoryAppView.d.ts +2 -0
  14. package/dist/components/InventoryAppView.d.ts.map +1 -0
  15. package/dist/components/InventoryAppView.js +1744 -0
  16. package/dist/components/InventoryAppView.js.map +1 -0
  17. package/dist/components/InventorySpatialView.d.ts +86 -0
  18. package/dist/components/InventorySpatialView.d.ts.map +1 -0
  19. package/dist/components/InventorySpatialView.js +218 -0
  20. package/dist/components/InventorySpatialView.js.map +1 -0
  21. package/dist/index.d.ts +15 -0
  22. package/dist/index.d.ts.map +1 -0
  23. package/dist/index.js +65 -0
  24. package/dist/index.js.map +1 -0
  25. package/dist/inventory/ChainIcon.d.ts +9 -0
  26. package/dist/inventory/ChainIcon.d.ts.map +1 -0
  27. package/dist/inventory/ChainIcon.js +71 -0
  28. package/dist/inventory/ChainIcon.js.map +1 -0
  29. package/dist/inventory/TokenLogo.d.ts +8 -0
  30. package/dist/inventory/TokenLogo.d.ts.map +1 -0
  31. package/dist/inventory/TokenLogo.js +52 -0
  32. package/dist/inventory/TokenLogo.js.map +1 -0
  33. package/dist/inventory/chainConfig.d.ts +89 -0
  34. package/dist/inventory/chainConfig.d.ts.map +1 -0
  35. package/dist/inventory/chainConfig.js +252 -0
  36. package/dist/inventory/chainConfig.js.map +1 -0
  37. package/dist/inventory/constants.d.ts +31 -0
  38. package/dist/inventory/constants.d.ts.map +1 -0
  39. package/dist/inventory/constants.js +59 -0
  40. package/dist/inventory/constants.js.map +1 -0
  41. package/dist/inventory/index.d.ts +5 -0
  42. package/dist/inventory/index.d.ts.map +1 -0
  43. package/dist/inventory/index.js +43 -0
  44. package/dist/inventory/index.js.map +1 -0
  45. package/dist/inventory/inventory-chain-filters.d.ts +11 -0
  46. package/dist/inventory/inventory-chain-filters.d.ts.map +1 -0
  47. package/dist/inventory/inventory-chain-filters.js +49 -0
  48. package/dist/inventory/inventory-chain-filters.js.map +1 -0
  49. package/dist/inventory/media-url.d.ts +6 -0
  50. package/dist/inventory/media-url.d.ts.map +1 -0
  51. package/dist/inventory/media-url.js +32 -0
  52. package/dist/inventory/media-url.js.map +1 -0
  53. package/dist/inventory/useInventoryData.d.ts +38 -0
  54. package/dist/inventory/useInventoryData.d.ts.map +1 -0
  55. package/dist/inventory/useInventoryData.js +311 -0
  56. package/dist/inventory/useInventoryData.js.map +1 -0
  57. package/dist/plugin.d.ts +3 -0
  58. package/dist/plugin.d.ts.map +1 -0
  59. package/dist/plugin.js +55 -0
  60. package/dist/plugin.js.map +1 -0
  61. package/dist/register-routes.d.ts +9 -0
  62. package/dist/register-routes.d.ts.map +1 -0
  63. package/dist/register-routes.js +22 -0
  64. package/dist/register-routes.js.map +1 -0
  65. package/dist/register-terminal-view.d.ts +15 -0
  66. package/dist/register-terminal-view.d.ts.map +1 -0
  67. package/dist/register-terminal-view.js +33 -0
  68. package/dist/register-terminal-view.js.map +1 -0
  69. package/dist/register.d.ts +4 -0
  70. package/dist/register.d.ts.map +1 -0
  71. package/dist/register.js +20 -0
  72. package/dist/register.js.map +1 -0
  73. package/dist/ui.d.ts +13 -0
  74. package/dist/ui.d.ts.map +1 -0
  75. package/dist/ui.js +62 -0
  76. package/dist/ui.js.map +1 -0
  77. package/dist/views/bundle.js +1072 -0
  78. package/dist/views/bundle.js.map +1 -0
  79. package/dist/wallet-rpc.d.ts +2 -0
  80. package/dist/wallet-rpc.d.ts.map +1 -0
  81. package/dist/wallet-rpc.js +9 -0
  82. package/dist/wallet-rpc.js.map +1 -0
  83. package/dist/wallet-view-bundle.d.ts +3 -0
  84. package/dist/wallet-view-bundle.d.ts.map +1 -0
  85. package/dist/wallet-view-bundle.js +7 -0
  86. package/dist/wallet-view-bundle.js.map +1 -0
  87. package/dist/widgets/wallet-status.d.ts +3 -0
  88. package/dist/widgets/wallet-status.d.ts.map +1 -0
  89. package/dist/widgets/wallet-status.helpers.d.ts +3 -0
  90. package/dist/widgets/wallet-status.helpers.d.ts.map +1 -0
  91. package/dist/widgets/wallet-status.helpers.js +12 -0
  92. package/dist/widgets/wallet-status.helpers.js.map +1 -0
  93. package/dist/widgets/wallet-status.js +291 -0
  94. package/dist/widgets/wallet-status.js.map +1 -0
  95. package/package.json +7 -7
@@ -0,0 +1,19 @@
1
+ /**
2
+ * InventoryView — the single GUI/XR data wrapper for the wallet surface.
3
+ *
4
+ * It owns the live wallet data (balances, NFTs, trading profile, market
5
+ * overview, addresses, config) drawn from the app store + `useInventoryData`,
6
+ * builds the one presentational {@link WalletSnapshot}, and renders the single
7
+ * {@link InventorySpatialView} inside a {@link SpatialSurface}. Omitting the
8
+ * `modality` prop lets `SpatialSurface` auto-detect GUI vs XR via
9
+ * `window.__elizaXRContext`, so the SAME component serves both surfaces. The TUI
10
+ * surface renders the same `InventorySpatialView` through the terminal registry
11
+ * (see `register-terminal-view.tsx`).
12
+ *
13
+ * The rich multi-panel dashboard (P&L chart, activity log, movers, LP positions,
14
+ * NFT grid) lives in the separate {@link InventoryAppView} overlay surface that
15
+ * the `/inventory` nav tab mounts; this view is the cross-modality holdings
16
+ * source of truth.
17
+ */
18
+ export declare function InventoryView(): import("react/jsx-runtime").JSX.Element;
19
+ //# sourceMappingURL=InventoryView.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"InventoryView.d.ts","sourceRoot":"","sources":["../src/InventoryView.tsx"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AA0EH,wBAAgB,aAAa,4CAwM5B"}
@@ -0,0 +1,32 @@
1
+ import type { WalletAddresses, WalletBalancesResponse, WalletConfigStatus } from "@elizaos/shared";
2
+ export declare function resolveWalletAddresses({ walletAddresses, walletConfig, }: {
3
+ walletAddresses: WalletAddresses | null;
4
+ walletConfig: WalletConfigStatus | null;
5
+ }): {
6
+ evmAddress: string | null;
7
+ solanaAddress: string | null;
8
+ };
9
+ export declare function loadWalletTuiState(): Promise<{
10
+ walletAddresses: WalletAddresses | null;
11
+ walletConfig: WalletConfigStatus | null;
12
+ walletBalances: WalletBalancesResponse | null;
13
+ walletNfts: import("@elizaos/contracts").WalletNftsResponse | null;
14
+ marketOverview: import("@elizaos/contracts").WalletMarketOverviewResponse | null;
15
+ summary: {
16
+ totalUsd: number;
17
+ tokens: Array<{
18
+ chain: string;
19
+ symbol: string;
20
+ name: string;
21
+ contractAddress: string | null;
22
+ balance: string;
23
+ valueUsd: number;
24
+ isNative: boolean;
25
+ }>;
26
+ chainErrors: Array<{
27
+ chain: string;
28
+ error: string;
29
+ }>;
30
+ };
31
+ }>;
32
+ //# sourceMappingURL=InventoryView.helpers.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"InventoryView.helpers.d.ts","sourceRoot":"","sources":["../src/InventoryView.helpers.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EACV,eAAe,EACf,sBAAsB,EACtB,kBAAkB,EACnB,MAAM,iBAAiB,CAAC;AAGzB,wBAAgB,sBAAsB,CAAC,EACrC,eAAe,EACf,YAAY,GACb,EAAE;IACD,eAAe,EAAE,eAAe,GAAG,IAAI,CAAC;IACxC,YAAY,EAAE,kBAAkB,GAAG,IAAI,CAAC;CACzC,GAAG;IACF,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,aAAa,EAAE,MAAM,GAAG,IAAI,CAAC;CAC9B,CAMA;AA8FD,wBAAsB,kBAAkB;;;;;;;kBAlF5B,MAAM;gBACR,KAAK,CAAC;YACZ,KAAK,EAAE,MAAM,CAAC;YACd,MAAM,EAAE,MAAM,CAAC;YACf,IAAI,EAAE,MAAM,CAAC;YACb,eAAe,EAAE,MAAM,GAAG,IAAI,CAAC;YAC/B,OAAO,EAAE,MAAM,CAAC;YAChB,QAAQ,EAAE,MAAM,CAAC;YACjB,QAAQ,EAAE,OAAO,CAAC;SACnB,CAAC;qBACW,KAAK,CAAC;YAAE,KAAK,EAAE,MAAM,CAAC;YAAC,KAAK,EAAE,MAAM,CAAA;SAAE,CAAC;;GA+FrD"}
@@ -0,0 +1,104 @@
1
+ import { client } from "@elizaos/ui/api";
2
+ function resolveWalletAddresses({
3
+ walletAddresses,
4
+ walletConfig
5
+ }) {
6
+ return {
7
+ evmAddress: walletAddresses?.evmAddress ?? walletConfig?.evmAddress ?? null,
8
+ solanaAddress: walletAddresses?.solanaAddress ?? walletConfig?.solanaAddress ?? null
9
+ };
10
+ }
11
+ function parseUsd(value) {
12
+ if (typeof value === "number") return Number.isFinite(value) ? value : 0;
13
+ if (typeof value !== "string") return 0;
14
+ const parsed = Number.parseFloat(value);
15
+ return Number.isFinite(parsed) ? parsed : 0;
16
+ }
17
+ function summarizeWalletBalances(walletBalances) {
18
+ const tokens = [];
19
+ const chainErrors = [];
20
+ for (const chain of walletBalances?.evm?.chains ?? []) {
21
+ const nativeValueUsd = parseUsd(chain.nativeValueUsd);
22
+ tokens.push({
23
+ chain: chain.chain,
24
+ symbol: chain.nativeSymbol,
25
+ name: `${chain.chain} native`,
26
+ contractAddress: null,
27
+ balance: chain.nativeBalance,
28
+ valueUsd: nativeValueUsd,
29
+ isNative: true
30
+ });
31
+ if (chain.error) {
32
+ chainErrors.push({ chain: chain.chain, error: chain.error });
33
+ continue;
34
+ }
35
+ for (const token of chain.tokens) {
36
+ tokens.push({
37
+ chain: chain.chain,
38
+ symbol: token.symbol,
39
+ name: token.name,
40
+ contractAddress: token.contractAddress,
41
+ balance: token.balance,
42
+ valueUsd: parseUsd(token.valueUsd),
43
+ isNative: false
44
+ });
45
+ }
46
+ }
47
+ if (walletBalances?.solana) {
48
+ tokens.push({
49
+ chain: "Solana",
50
+ symbol: "SOL",
51
+ name: "Solana native",
52
+ contractAddress: null,
53
+ balance: walletBalances.solana.solBalance,
54
+ valueUsd: parseUsd(walletBalances.solana.solValueUsd),
55
+ isNative: true
56
+ });
57
+ for (const token of walletBalances.solana.tokens) {
58
+ tokens.push({
59
+ chain: "Solana",
60
+ symbol: token.symbol,
61
+ name: token.name,
62
+ contractAddress: token.mint,
63
+ balance: token.balance,
64
+ valueUsd: parseUsd(token.valueUsd),
65
+ isNative: false
66
+ });
67
+ }
68
+ }
69
+ tokens.sort((a, b) => b.valueUsd - a.valueUsd);
70
+ return {
71
+ totalUsd: tokens.reduce((sum, token) => sum + token.valueUsd, 0),
72
+ tokens,
73
+ chainErrors
74
+ };
75
+ }
76
+ async function loadWalletTuiState() {
77
+ const [
78
+ walletAddresses,
79
+ walletConfig,
80
+ walletBalances,
81
+ walletNfts,
82
+ marketOverview
83
+ ] = await Promise.all([
84
+ client.getWalletAddresses().catch(() => null),
85
+ client.getWalletConfig().catch(() => null),
86
+ client.getWalletBalances().catch(() => null),
87
+ client.getWalletNfts().catch(() => null),
88
+ client.getWalletMarketOverview().catch(() => null)
89
+ ]);
90
+ const summary = summarizeWalletBalances(walletBalances);
91
+ return {
92
+ walletAddresses,
93
+ walletConfig,
94
+ walletBalances,
95
+ walletNfts,
96
+ marketOverview,
97
+ summary
98
+ };
99
+ }
100
+ export {
101
+ loadWalletTuiState,
102
+ resolveWalletAddresses
103
+ };
104
+ //# sourceMappingURL=InventoryView.helpers.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/InventoryView.helpers.ts"],"sourcesContent":["// 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"],"mappings":"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","names":[]}
@@ -0,0 +1,2 @@
1
+ export declare function interact(capability: string, params?: Record<string, unknown>): Promise<unknown>;
2
+ //# sourceMappingURL=InventoryView.interact.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"InventoryView.interact.d.ts","sourceRoot":"","sources":["../src/InventoryView.interact.ts"],"names":[],"mappings":"AAUA,wBAAsB,QAAQ,CAC5B,UAAU,EAAE,MAAM,EAClB,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAC/B,OAAO,CAAC,OAAO,CAAC,CA8ClB"}
@@ -0,0 +1,47 @@
1
+ import { client } from "@elizaos/ui/api";
2
+ import {
3
+ loadWalletTuiState,
4
+ resolveWalletAddresses
5
+ } from "./InventoryView.helpers";
6
+ async function interact(capability, params) {
7
+ if (capability === "terminal-wallet-state") {
8
+ const state = await loadWalletTuiState();
9
+ const addresses = resolveWalletAddresses({
10
+ walletAddresses: state.walletAddresses,
11
+ walletConfig: state.walletConfig
12
+ });
13
+ return {
14
+ viewType: "tui",
15
+ addresses,
16
+ totalUsd: state.summary.totalUsd,
17
+ tokenCount: state.summary.tokens.length,
18
+ nftCount: (state.walletNfts?.evm?.reduce(
19
+ (sum, collection) => sum + collection.nfts.length,
20
+ 0
21
+ ) ?? 0) + (state.walletNfts?.solana?.nfts.length ?? 0),
22
+ chainErrors: state.summary.chainErrors,
23
+ tokens: state.summary.tokens.slice(
24
+ 0,
25
+ typeof params?.limit === "number" ? params.limit : 20
26
+ )
27
+ };
28
+ }
29
+ if (capability === "terminal-wallet-market-overview") {
30
+ return {
31
+ viewType: "tui",
32
+ overview: await client.getWalletMarketOverview()
33
+ };
34
+ }
35
+ if (capability === "terminal-wallet-trading-profile") {
36
+ const window = params?.window === "24h" || params?.window === "7d" || params?.window === "30d" ? params.window : "30d";
37
+ return {
38
+ viewType: "tui",
39
+ profile: await client.getWalletTradingProfile(window)
40
+ };
41
+ }
42
+ throw new Error(`Unsupported capability "${capability}"`);
43
+ }
44
+ export {
45
+ interact
46
+ };
47
+ //# sourceMappingURL=InventoryView.interact.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/InventoryView.interact.ts"],"sourcesContent":["// 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":"AAIA,SAAS,cAAc;AACvB;AAAA,EACE;AAAA,EACA;AAAA,OACK;AAEP,eAAsB,SACpB,YACA,QACkB;AAClB,MAAI,eAAe,yBAAyB;AAC1C,UAAM,QAAQ,MAAM,mBAAmB;AACvC,UAAM,YAAY,uBAAuB;AAAA,MACvC,iBAAiB,MAAM;AAAA,MACvB,cAAc,MAAM;AAAA,IACtB,CAAC;AACD,WAAO;AAAA,MACL,UAAU;AAAA,MACV;AAAA,MACA,UAAU,MAAM,QAAQ;AAAA,MACxB,YAAY,MAAM,QAAQ,OAAO;AAAA,MACjC,WACG,MAAM,YAAY,KAAK;AAAA,QACtB,CAAC,KAAK,eAAe,MAAM,WAAW,KAAK;AAAA,QAC3C;AAAA,MACF,KAAK,MAAM,MAAM,YAAY,QAAQ,KAAK,UAAU;AAAA,MACtD,aAAa,MAAM,QAAQ;AAAA,MAC3B,QAAQ,MAAM,QAAQ,OAAO;AAAA,QAC3B;AAAA,QACA,OAAO,QAAQ,UAAU,WAAW,OAAO,QAAQ;AAAA,MACrD;AAAA,IACF;AAAA,EACF;AAEA,MAAI,eAAe,mCAAmC;AACpD,WAAO;AAAA,MACL,UAAU;AAAA,MACV,UAAU,MAAM,OAAO,wBAAwB;AAAA,IACjD;AAAA,EACF;AAEA,MAAI,eAAe,mCAAmC;AACpD,UAAM,SACJ,QAAQ,WAAW,SACnB,QAAQ,WAAW,QACnB,QAAQ,WAAW,QACf,OAAO,SACP;AACN,WAAO;AAAA,MACL,UAAU;AAAA,MACV,SAAS,MAAM,OAAO,wBAAwB,MAAM;AAAA,IACtD;AAAA,EACF;AAEA,QAAM,IAAI,MAAM,2BAA2B,UAAU,GAAG;AAC1D;","names":[]}
@@ -0,0 +1,242 @@
1
+ import { jsx } from "react/jsx-runtime";
2
+ import { client } from "@elizaos/ui/api";
3
+ import { useActivityEvents } from "@elizaos/ui/hooks";
4
+ import { SpatialSurface } from "@elizaos/ui/spatial";
5
+ import { useAppSelectorShallow } from "@elizaos/ui/state";
6
+ import { useCallback, useEffect, useMemo, useRef, useState } from "react";
7
+ import {
8
+ InventorySpatialView
9
+ } from "./components/InventorySpatialView.js";
10
+ import { resolveWalletAddresses } from "./InventoryView.helpers.js";
11
+ import { formatBalance } from "./inventory/constants.js";
12
+ import { useInventoryData } from "./inventory/useInventoryData.js";
13
+ const ALL_INVENTORY_FILTERS = {
14
+ ethereum: true,
15
+ base: true,
16
+ bsc: true,
17
+ avax: true,
18
+ solana: true
19
+ };
20
+ const HIDDEN_TOKEN_IDS_KEY = "eliza:wallet:hidden-token-ids:v1";
21
+ const WALLET_REFRESH_INTERVAL_MS = 2e4;
22
+ function readHiddenTokenIds() {
23
+ if (typeof window === "undefined") return /* @__PURE__ */ new Set();
24
+ const raw = window.localStorage.getItem(HIDDEN_TOKEN_IDS_KEY);
25
+ if (!raw) return /* @__PURE__ */ new Set();
26
+ const parsed = JSON.parse(raw);
27
+ if (!Array.isArray(parsed)) return /* @__PURE__ */ new Set();
28
+ return new Set(
29
+ parsed.filter((item) => typeof item === "string")
30
+ );
31
+ }
32
+ function writeHiddenTokenIds(next) {
33
+ if (typeof window === "undefined") return;
34
+ window.localStorage.setItem(HIDDEN_TOKEN_IDS_KEY, JSON.stringify([...next]));
35
+ }
36
+ function tokenId(row) {
37
+ const address = row.contractAddress && row.contractAddress.length > 0 ? row.contractAddress.toLowerCase() : `native:${row.symbol.toLowerCase()}`;
38
+ return `${row.chain.toLowerCase()}:${address}`;
39
+ }
40
+ function tokenHasInventory(row) {
41
+ return row.balanceRaw > 0 || row.valueUsd > 0;
42
+ }
43
+ function parseAmount(value) {
44
+ if (!value) return 0;
45
+ const parsed = Number.parseFloat(value);
46
+ return Number.isFinite(parsed) ? parsed : 0;
47
+ }
48
+ function copyToClipboard(value) {
49
+ if (!value || typeof navigator === "undefined" || !navigator.clipboard) {
50
+ return;
51
+ }
52
+ void navigator.clipboard.writeText(value);
53
+ }
54
+ function openRpcSettings(setTab) {
55
+ setTab("settings");
56
+ if (typeof window !== "undefined") {
57
+ window.location.hash = "wallet-rpc";
58
+ }
59
+ }
60
+ function InventoryView() {
61
+ const {
62
+ walletEnabled,
63
+ walletAddresses,
64
+ walletConfig,
65
+ walletBalances,
66
+ walletNfts,
67
+ loadWalletConfig,
68
+ loadBalances,
69
+ loadNfts,
70
+ setState,
71
+ setTab,
72
+ setActionNotice
73
+ } = useAppSelectorShallow((s) => ({
74
+ walletEnabled: s.walletEnabled,
75
+ walletAddresses: s.walletAddresses,
76
+ walletConfig: s.walletConfig,
77
+ walletBalances: s.walletBalances,
78
+ walletNfts: s.walletNfts,
79
+ loadWalletConfig: s.loadWalletConfig,
80
+ loadBalances: s.loadBalances,
81
+ loadNfts: s.loadNfts,
82
+ setState: s.setState,
83
+ setTab: s.setTab,
84
+ setActionNotice: s.setActionNotice
85
+ }));
86
+ const { events: activityEvents } = useActivityEvents();
87
+ void activityEvents;
88
+ const [hiddenTokenIds, setHiddenTokenIds] = useState(
89
+ () => readHiddenTokenIds()
90
+ );
91
+ const [realizedPnlBnb, setRealizedPnlBnb] = useState(0);
92
+ const [error, setError] = useState(null);
93
+ const initialLoadRef = useRef(false);
94
+ const loadTradingProfile = useCallback(async () => {
95
+ const profile = await client.getWalletTradingProfile("30d");
96
+ setRealizedPnlBnb(parseAmount(profile.summary.realizedPnlBnb));
97
+ }, []);
98
+ useEffect(() => {
99
+ if (initialLoadRef.current) return;
100
+ initialLoadRef.current = true;
101
+ void loadWalletConfig();
102
+ if (walletEnabled === false) return;
103
+ void loadBalances();
104
+ void loadNfts();
105
+ void loadTradingProfile();
106
+ }, [
107
+ loadBalances,
108
+ loadNfts,
109
+ loadTradingProfile,
110
+ loadWalletConfig,
111
+ walletEnabled
112
+ ]);
113
+ useEffect(() => {
114
+ if (walletEnabled === false) return;
115
+ const interval = window.setInterval(() => {
116
+ void loadWalletConfig();
117
+ void loadBalances();
118
+ void loadNfts();
119
+ void loadTradingProfile();
120
+ }, WALLET_REFRESH_INTERVAL_MS);
121
+ return () => window.clearInterval(interval);
122
+ }, [loadBalances, loadNfts, loadTradingProfile, loadWalletConfig, walletEnabled]);
123
+ const inventoryData = useInventoryData({
124
+ walletBalances,
125
+ walletAddresses,
126
+ walletConfig,
127
+ walletNfts,
128
+ inventorySort: "value",
129
+ inventorySortDirection: "desc",
130
+ inventoryChainFilters: ALL_INVENTORY_FILTERS
131
+ });
132
+ const addresses = useMemo(
133
+ () => resolveWalletAddresses({ walletAddresses, walletConfig }),
134
+ [walletAddresses, walletConfig]
135
+ );
136
+ const visibleRows = useMemo(
137
+ () => inventoryData.tokenRowsAllChains.filter(tokenHasInventory).filter((row) => !hiddenTokenIds.has(tokenId(row))),
138
+ [hiddenTokenIds, inventoryData.tokenRowsAllChains]
139
+ );
140
+ const snapshot = useMemo(() => {
141
+ const selectedRpcProviders = walletConfig?.selectedRpcProviders ? Object.values(walletConfig.selectedRpcProviders).filter(
142
+ (value) => typeof value === "string"
143
+ ) : [];
144
+ return {
145
+ portfolioValueUsd: visibleRows.reduce((sum, row) => sum + row.valueUsd, 0),
146
+ tokenRows: visibleRows.map((row) => ({
147
+ id: tokenId(row),
148
+ symbol: row.symbol,
149
+ chain: row.chain,
150
+ balance: formatBalance(row.balance),
151
+ valueUsd: row.valueUsd,
152
+ contractAddress: row.contractAddress,
153
+ logoUrl: row.logoUrl
154
+ })),
155
+ walletNfts: inventoryData.allNfts.map((nft) => ({
156
+ id: `${nft.chain}:${nft.collectionName}:${nft.name}`,
157
+ chain: nft.chain,
158
+ collectionName: nft.collectionName,
159
+ name: nft.name,
160
+ imageUrl: nft.imageUrl
161
+ })),
162
+ marketMovers: [],
163
+ tradingProfile: { realizedPnlBnb, recentSwaps: [] },
164
+ addresses,
165
+ config: {
166
+ evmBalanceReady: Boolean(walletConfig?.evmBalanceReady),
167
+ solanaBalanceReady: Boolean(walletConfig?.solanaBalanceReady),
168
+ selectedRpcProviders: [...new Set(selectedRpcProviders)]
169
+ },
170
+ walletEnabled,
171
+ error
172
+ };
173
+ }, [
174
+ addresses,
175
+ error,
176
+ inventoryData.allNfts,
177
+ realizedPnlBnb,
178
+ visibleRows,
179
+ walletConfig,
180
+ walletEnabled
181
+ ]);
182
+ const hideToken = useCallback(
183
+ (id) => {
184
+ const row = visibleRows.find((candidate) => tokenId(candidate) === id);
185
+ const next = new Set(hiddenTokenIds);
186
+ next.add(id);
187
+ setHiddenTokenIds(next);
188
+ writeHiddenTokenIds(next);
189
+ if (row) setActionNotice(`${row.symbol} hidden from this wallet view.`);
190
+ },
191
+ [hiddenTokenIds, setActionNotice, visibleRows]
192
+ );
193
+ const refresh = useCallback(() => {
194
+ setError(null);
195
+ void loadWalletConfig();
196
+ void loadBalances();
197
+ void loadNfts();
198
+ void loadTradingProfile();
199
+ }, [loadBalances, loadNfts, loadTradingProfile, loadWalletConfig]);
200
+ const enableWallet = useCallback(() => {
201
+ setState("walletEnabled", true);
202
+ void loadWalletConfig();
203
+ void loadBalances();
204
+ void loadNfts();
205
+ }, [loadBalances, loadNfts, loadWalletConfig, setState]);
206
+ const onAction = useCallback(
207
+ (action) => {
208
+ if (action.startsWith("hide-token:")) {
209
+ hideToken(action.slice("hide-token:".length));
210
+ return;
211
+ }
212
+ if (action.startsWith("open-token:")) {
213
+ setTab("settings");
214
+ return;
215
+ }
216
+ if (action.startsWith("tab:")) return;
217
+ switch (action) {
218
+ case "refresh":
219
+ refresh();
220
+ return;
221
+ case "enable-wallet":
222
+ enableWallet();
223
+ return;
224
+ case "rpc-settings":
225
+ openRpcSettings(setTab);
226
+ return;
227
+ case "copy-evm":
228
+ copyToClipboard(addresses.evmAddress);
229
+ return;
230
+ case "copy-solana":
231
+ copyToClipboard(addresses.solanaAddress);
232
+ return;
233
+ }
234
+ },
235
+ [addresses, enableWallet, hideToken, refresh, setTab]
236
+ );
237
+ return /* @__PURE__ */ jsx(SpatialSurface, { children: /* @__PURE__ */ jsx(InventorySpatialView, { snapshot, onAction }) });
238
+ }
239
+ export {
240
+ InventoryView
241
+ };
242
+ //# sourceMappingURL=InventoryView.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/InventoryView.tsx"],"sourcesContent":["/**\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.js\";\nimport { resolveWalletAddresses } from \"./InventoryView.helpers.js\";\nimport { formatBalance, type TokenRow } from \"./inventory/constants.js\";\nimport { useInventoryData } from \"./inventory/useInventoryData.js\";\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"],"mappings":"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","names":[]}
@@ -0,0 +1,2 @@
1
+ export declare function InventoryAppView(): import("react/jsx-runtime").JSX.Element;
2
+ //# sourceMappingURL=InventoryAppView.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"InventoryAppView.d.ts","sourceRoot":"","sources":["../../src/components/InventoryAppView.tsx"],"names":[],"mappings":"AA48DA,wBAAgB,gBAAgB,4CAgU/B"}