@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,31 @@
1
+ export declare const BSC_GAS_READY_THRESHOLD = 0.005;
2
+ export declare const BSC_GAS_THRESHOLD = 0.005;
3
+ export declare const HEX_ADDRESS_RE: RegExp;
4
+ export interface TokenRow {
5
+ chain: string;
6
+ symbol: string;
7
+ name: string;
8
+ contractAddress: string | null;
9
+ logoUrl: string | null;
10
+ balance: string;
11
+ valueUsd: number;
12
+ balanceRaw: number;
13
+ isNative: boolean;
14
+ }
15
+ export interface NftItem {
16
+ chain: string;
17
+ name: string;
18
+ imageUrl: string;
19
+ collectionName: string;
20
+ }
21
+ export declare function chainIcon(chain: string): {
22
+ code: string;
23
+ cls: string;
24
+ };
25
+ export declare function normalizeChainName(chain: string): string;
26
+ export declare function isBscChainName(chain: string): boolean;
27
+ export declare function isAvaxChainName(chain: string): boolean;
28
+ export declare function formatBalance(balance: string): string;
29
+ export declare function toNormalizedAddress(addr: string): string;
30
+ export declare function parseFiniteAmount(value: string | number | null | undefined): number;
31
+ //# sourceMappingURL=constants.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"constants.d.ts","sourceRoot":"","sources":["../../src/inventory/constants.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,uBAAuB,QAAQ,CAAC;AAC7C,eAAO,MAAM,iBAAiB,QAAQ,CAAC;AACvC,eAAO,MAAM,cAAc,QAAwB,CAAC;AAEpD,MAAM,WAAW,QAAQ;IACvB,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,MAAM,CAAC;IACb,eAAe,EAAE,MAAM,GAAG,IAAI,CAAC;IAC/B,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;IACvB,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,MAAM,CAAC;IACjB,UAAU,EAAE,MAAM,CAAC;IACnB,QAAQ,EAAE,OAAO,CAAC;CACnB;AAED,MAAM,WAAW,OAAO;IACtB,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,MAAM,CAAC;IACjB,cAAc,EAAE,MAAM,CAAC;CACxB;AAED,wBAAgB,SAAS,CAAC,KAAK,EAAE,MAAM,GAAG;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,GAAG,EAAE,MAAM,CAAA;CAAE,CAmBtE;AAED,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAExD;AAED,wBAAgB,cAAc,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAGrD;AAED,wBAAgB,eAAe,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAQtD;AAED,wBAAgB,aAAa,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAOrD;AAED,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAExD;AAED,wBAAgB,iBAAiB,CAC/B,KAAK,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,GAAG,SAAS,GACxC,MAAM,CAKR"}
@@ -0,0 +1,59 @@
1
+ const BSC_GAS_READY_THRESHOLD = 5e-3;
2
+ const BSC_GAS_THRESHOLD = 5e-3;
3
+ const HEX_ADDRESS_RE = /^0x[a-fA-F0-9]{40}$/;
4
+ function chainIcon(chain) {
5
+ const c = chain.toLowerCase();
6
+ if (c === "ethereum" || c === "mainnet")
7
+ return { code: "E", cls: "bg-chain-eth" };
8
+ if (c === "base") return { code: "B", cls: "bg-chain-base" };
9
+ if (c === "bsc" || c === "bnb chain" || c === "bnb smart chain")
10
+ return { code: "B", cls: "bg-chain-bsc" };
11
+ if (c === "avax" || c === "avalanche" || c === "c-chain" || c === "avalanche c-chain")
12
+ return { code: "A", cls: "bg-chain-avax" };
13
+ if (c === "arbitrum") return { code: "A", cls: "bg-chain-arb" };
14
+ if (c === "optimism") return { code: "O", cls: "bg-chain-op" };
15
+ if (c === "polygon") return { code: "P", cls: "bg-chain-pol" };
16
+ if (c === "solana") return { code: "S", cls: "bg-chain-sol" };
17
+ return { code: chain.charAt(0).toUpperCase(), cls: "bg-bg-muted" };
18
+ }
19
+ function normalizeChainName(chain) {
20
+ return chain.trim().toLowerCase();
21
+ }
22
+ function isBscChainName(chain) {
23
+ const c = normalizeChainName(chain);
24
+ return c === "bsc" || c === "bnb chain" || c === "bnb smart chain";
25
+ }
26
+ function isAvaxChainName(chain) {
27
+ const c = normalizeChainName(chain);
28
+ return c === "avax" || c === "avalanche" || c === "c-chain" || c === "avalanche c-chain";
29
+ }
30
+ function formatBalance(balance) {
31
+ const num = parseFiniteAmount(balance);
32
+ if (num === 0) return "0";
33
+ if (num < 1e-4) return "<0.0001";
34
+ if (num < 1) return num.toFixed(6);
35
+ if (num < 1e3) return num.toFixed(4);
36
+ return num.toLocaleString("en-US", { maximumFractionDigits: 2 });
37
+ }
38
+ function toNormalizedAddress(addr) {
39
+ return addr.trim().toLowerCase();
40
+ }
41
+ function parseFiniteAmount(value) {
42
+ if (typeof value === "number") return Number.isFinite(value) ? value : 0;
43
+ if (typeof value !== "string") return 0;
44
+ const parsed = Number.parseFloat(value);
45
+ return Number.isFinite(parsed) ? parsed : 0;
46
+ }
47
+ export {
48
+ BSC_GAS_READY_THRESHOLD,
49
+ BSC_GAS_THRESHOLD,
50
+ HEX_ADDRESS_RE,
51
+ chainIcon,
52
+ formatBalance,
53
+ isAvaxChainName,
54
+ isBscChainName,
55
+ normalizeChainName,
56
+ parseFiniteAmount,
57
+ toNormalizedAddress
58
+ };
59
+ //# sourceMappingURL=constants.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/inventory/constants.ts"],"sourcesContent":["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"],"mappings":"AAAO,MAAM,0BAA0B;AAChC,MAAM,oBAAoB;AAC1B,MAAM,iBAAiB;AAqBvB,SAAS,UAAU,OAA8C;AACtE,QAAM,IAAI,MAAM,YAAY;AAC5B,MAAI,MAAM,cAAc,MAAM;AAC5B,WAAO,EAAE,MAAM,KAAK,KAAK,eAAe;AAC1C,MAAI,MAAM,OAAQ,QAAO,EAAE,MAAM,KAAK,KAAK,gBAAgB;AAC3D,MAAI,MAAM,SAAS,MAAM,eAAe,MAAM;AAC5C,WAAO,EAAE,MAAM,KAAK,KAAK,eAAe;AAC1C,MACE,MAAM,UACN,MAAM,eACN,MAAM,aACN,MAAM;AAEN,WAAO,EAAE,MAAM,KAAK,KAAK,gBAAgB;AAC3C,MAAI,MAAM,WAAY,QAAO,EAAE,MAAM,KAAK,KAAK,eAAe;AAC9D,MAAI,MAAM,WAAY,QAAO,EAAE,MAAM,KAAK,KAAK,cAAc;AAC7D,MAAI,MAAM,UAAW,QAAO,EAAE,MAAM,KAAK,KAAK,eAAe;AAC7D,MAAI,MAAM,SAAU,QAAO,EAAE,MAAM,KAAK,KAAK,eAAe;AAC5D,SAAO,EAAE,MAAM,MAAM,OAAO,CAAC,EAAE,YAAY,GAAG,KAAK,cAAc;AACnE;AAEO,SAAS,mBAAmB,OAAuB;AACxD,SAAO,MAAM,KAAK,EAAE,YAAY;AAClC;AAEO,SAAS,eAAe,OAAwB;AACrD,QAAM,IAAI,mBAAmB,KAAK;AAClC,SAAO,MAAM,SAAS,MAAM,eAAe,MAAM;AACnD;AAEO,SAAS,gBAAgB,OAAwB;AACtD,QAAM,IAAI,mBAAmB,KAAK;AAClC,SACE,MAAM,UACN,MAAM,eACN,MAAM,aACN,MAAM;AAEV;AAEO,SAAS,cAAc,SAAyB;AACrD,QAAM,MAAM,kBAAkB,OAAO;AACrC,MAAI,QAAQ,EAAG,QAAO;AACtB,MAAI,MAAM,KAAQ,QAAO;AACzB,MAAI,MAAM,EAAG,QAAO,IAAI,QAAQ,CAAC;AACjC,MAAI,MAAM,IAAM,QAAO,IAAI,QAAQ,CAAC;AACpC,SAAO,IAAI,eAAe,SAAS,EAAE,uBAAuB,EAAE,CAAC;AACjE;AAEO,SAAS,oBAAoB,MAAsB;AACxD,SAAO,KAAK,KAAK,EAAE,YAAY;AACjC;AAEO,SAAS,kBACd,OACQ;AACR,MAAI,OAAO,UAAU,SAAU,QAAO,OAAO,SAAS,KAAK,IAAI,QAAQ;AACvE,MAAI,OAAO,UAAU,SAAU,QAAO;AACtC,QAAM,SAAS,OAAO,WAAW,KAAK;AACtC,SAAO,OAAO,SAAS,MAAM,IAAI,SAAS;AAC5C;","names":[]}
@@ -0,0 +1,5 @@
1
+ export { CHAIN_CONFIGS, type ChainConfig, type ChainKey, chainKeyToWalletRpcChain, getChainConfig, getContractLogoUrl, getExplorerTokenUrl, getExplorerTxUrl, getNativeLogoUrl, getStablecoinAddress, PRIMARY_CHAIN_KEYS, resolveChainKey, } from "./chainConfig.ts";
2
+ export { BSC_GAS_READY_THRESHOLD, BSC_GAS_THRESHOLD, HEX_ADDRESS_RE, isAvaxChainName, isBscChainName, type NftItem, type TokenRow, toNormalizedAddress, } from "./constants.ts";
3
+ export { TokenLogo } from "./TokenLogo.tsx";
4
+ export { useInventoryData } from "./useInventoryData.ts";
5
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/inventory/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,aAAa,EACb,KAAK,WAAW,EAChB,KAAK,QAAQ,EACb,wBAAwB,EACxB,cAAc,EACd,kBAAkB,EAClB,mBAAmB,EACnB,gBAAgB,EAChB,gBAAgB,EAChB,oBAAoB,EACpB,kBAAkB,EAClB,eAAe,GAChB,MAAM,kBAAkB,CAAC;AAC1B,OAAO,EACL,uBAAuB,EACvB,iBAAiB,EACjB,cAAc,EACd,eAAe,EACf,cAAc,EACd,KAAK,OAAO,EACZ,KAAK,QAAQ,EACb,mBAAmB,GACpB,MAAM,gBAAgB,CAAC;AACxB,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAC5C,OAAO,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC"}
@@ -0,0 +1,43 @@
1
+ import {
2
+ CHAIN_CONFIGS,
3
+ chainKeyToWalletRpcChain,
4
+ getChainConfig,
5
+ getContractLogoUrl,
6
+ getExplorerTokenUrl,
7
+ getExplorerTxUrl,
8
+ getNativeLogoUrl,
9
+ getStablecoinAddress,
10
+ PRIMARY_CHAIN_KEYS,
11
+ resolveChainKey
12
+ } from "./chainConfig.js";
13
+ import {
14
+ BSC_GAS_READY_THRESHOLD,
15
+ BSC_GAS_THRESHOLD,
16
+ HEX_ADDRESS_RE,
17
+ isAvaxChainName,
18
+ isBscChainName,
19
+ toNormalizedAddress
20
+ } from "./constants.js";
21
+ import { TokenLogo } from "./TokenLogo.js";
22
+ import { useInventoryData } from "./useInventoryData.js";
23
+ export {
24
+ BSC_GAS_READY_THRESHOLD,
25
+ BSC_GAS_THRESHOLD,
26
+ CHAIN_CONFIGS,
27
+ HEX_ADDRESS_RE,
28
+ PRIMARY_CHAIN_KEYS,
29
+ TokenLogo,
30
+ chainKeyToWalletRpcChain,
31
+ getChainConfig,
32
+ getContractLogoUrl,
33
+ getExplorerTokenUrl,
34
+ getExplorerTxUrl,
35
+ getNativeLogoUrl,
36
+ getStablecoinAddress,
37
+ isAvaxChainName,
38
+ isBscChainName,
39
+ resolveChainKey,
40
+ toNormalizedAddress,
41
+ useInventoryData
42
+ };
43
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/inventory/index.ts"],"sourcesContent":["export {\n CHAIN_CONFIGS,\n type ChainConfig,\n type ChainKey,\n chainKeyToWalletRpcChain,\n getChainConfig,\n getContractLogoUrl,\n getExplorerTokenUrl,\n getExplorerTxUrl,\n getNativeLogoUrl,\n getStablecoinAddress,\n PRIMARY_CHAIN_KEYS,\n resolveChainKey,\n} from \"./chainConfig.js\";\nexport {\n BSC_GAS_READY_THRESHOLD,\n BSC_GAS_THRESHOLD,\n HEX_ADDRESS_RE,\n isAvaxChainName,\n isBscChainName,\n type NftItem,\n type TokenRow,\n toNormalizedAddress,\n} from \"./constants.js\";\nexport { TokenLogo } from \"./TokenLogo.js\";\nexport { useInventoryData } from \"./useInventoryData.js\";\n"],"mappings":"AAAA;AAAA,EACE;AAAA,EAGA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,OACK;AACP;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EAGA;AAAA,OACK;AACP,SAAS,iBAAiB;AAC1B,SAAS,wBAAwB;","names":[]}
@@ -0,0 +1,11 @@
1
+ import type { InventoryChainFilters } from "@elizaos/ui/state";
2
+ export type PrimaryInventoryChainKey = keyof InventoryChainFilters;
3
+ export declare const DEFAULT_INVENTORY_CHAIN_FILTERS: InventoryChainFilters;
4
+ type InventoryChainFilterState = InventoryChainFilters | Partial<InventoryChainFilters> | null | undefined;
5
+ export declare function matchesInventoryChainFilter(chainName: string, filters: InventoryChainFilterState): boolean;
6
+ /** When exactly one chain is enabled, returns that key; otherwise null. */
7
+ export declare function computeSingleChainFocus(filters: InventoryChainFilterState): PrimaryInventoryChainKey | null;
8
+ export declare function normalizeInventoryChainFilters(filters: InventoryChainFilterState): InventoryChainFilters;
9
+ export declare function toggleInventoryChainFilter(filters: InventoryChainFilterState, key: PrimaryInventoryChainKey): InventoryChainFilters;
10
+ export {};
11
+ //# sourceMappingURL=inventory-chain-filters.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"inventory-chain-filters.d.ts","sourceRoot":"","sources":["../../src/inventory/inventory-chain-filters.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,mBAAmB,CAAC;AAI/D,MAAM,MAAM,wBAAwB,GAAG,MAAM,qBAAqB,CAAC;AAUnE,eAAO,MAAM,+BAA+B,EAAE,qBAM7C,CAAC;AAEF,KAAK,yBAAyB,GAC1B,qBAAqB,GACrB,OAAO,CAAC,qBAAqB,CAAC,GAC9B,IAAI,GACJ,SAAS,CAAC;AAOd,wBAAgB,2BAA2B,CACzC,SAAS,EAAE,MAAM,EACjB,OAAO,EAAE,yBAAyB,GACjC,OAAO,CAKT;AAED,2EAA2E;AAC3E,wBAAgB,uBAAuB,CACrC,OAAO,EAAE,yBAAyB,GACjC,wBAAwB,GAAG,IAAI,CAMjC;AAED,wBAAgB,8BAA8B,CAC5C,OAAO,EAAE,yBAAyB,GACjC,qBAAqB,CAKvB;AAED,wBAAgB,0BAA0B,CACxC,OAAO,EAAE,yBAAyB,EAClC,GAAG,EAAE,wBAAwB,GAC5B,qBAAqB,CAGvB"}
@@ -0,0 +1,49 @@
1
+ import { resolveChainKey } from "./chainConfig.js";
2
+ const PRIMARY_INVENTORY_CHAIN_KEYS = [
3
+ "ethereum",
4
+ "base",
5
+ "bsc",
6
+ "avax",
7
+ "solana"
8
+ ];
9
+ const DEFAULT_INVENTORY_CHAIN_FILTERS = {
10
+ ethereum: true,
11
+ base: true,
12
+ bsc: true,
13
+ avax: true,
14
+ solana: true
15
+ };
16
+ function isPrimaryInventoryChainKey(k) {
17
+ return PRIMARY_INVENTORY_CHAIN_KEYS.includes(k);
18
+ }
19
+ function matchesInventoryChainFilter(chainName, filters) {
20
+ const normalizedFilters = normalizeInventoryChainFilters(filters);
21
+ const k = resolveChainKey(chainName);
22
+ if (!k || !isPrimaryInventoryChainKey(k)) return false;
23
+ return normalizedFilters[k] === true;
24
+ }
25
+ function computeSingleChainFocus(filters) {
26
+ const normalizedFilters = normalizeInventoryChainFilters(filters);
27
+ const enabled = PRIMARY_INVENTORY_CHAIN_KEYS.filter(
28
+ (k) => normalizedFilters[k]
29
+ );
30
+ return enabled.length === 1 ? enabled[0] : null;
31
+ }
32
+ function normalizeInventoryChainFilters(filters) {
33
+ return {
34
+ ...DEFAULT_INVENTORY_CHAIN_FILTERS,
35
+ ...filters
36
+ };
37
+ }
38
+ function toggleInventoryChainFilter(filters, key) {
39
+ const normalizedFilters = normalizeInventoryChainFilters(filters);
40
+ return { ...normalizedFilters, [key]: !normalizedFilters[key] };
41
+ }
42
+ export {
43
+ DEFAULT_INVENTORY_CHAIN_FILTERS,
44
+ computeSingleChainFocus,
45
+ matchesInventoryChainFilter,
46
+ normalizeInventoryChainFilters,
47
+ toggleInventoryChainFilter
48
+ };
49
+ //# sourceMappingURL=inventory-chain-filters.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/inventory/inventory-chain-filters.ts"],"sourcesContent":["import type { InventoryChainFilters } from \"@elizaos/ui/state\";\nimport type { ChainKey } from \"./chainConfig.js\";\nimport { resolveChainKey } from \"./chainConfig.js\";\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"],"mappings":"AAEA,SAAS,uBAAuB;AAIhC,MAAM,+BAA+B;AAAA,EACnC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF;AAEO,MAAM,kCAAyD;AAAA,EACpE,UAAU;AAAA,EACV,MAAM;AAAA,EACN,KAAK;AAAA,EACL,MAAM;AAAA,EACN,QAAQ;AACV;AAOA,SAAS,2BACP,GAC+B;AAC/B,SAAO,6BAA6B,SAAS,CAA6B;AAC5E;AAEO,SAAS,4BACd,WACA,SACS;AACT,QAAM,oBAAoB,+BAA+B,OAAO;AAChE,QAAM,IAAI,gBAAgB,SAAS;AACnC,MAAI,CAAC,KAAK,CAAC,2BAA2B,CAAC,EAAG,QAAO;AACjD,SAAO,kBAAkB,CAAC,MAAM;AAClC;AAGO,SAAS,wBACd,SACiC;AACjC,QAAM,oBAAoB,+BAA+B,OAAO;AAChE,QAAM,UAAU,6BAA6B;AAAA,IAC3C,CAAC,MAAM,kBAAkB,CAAC;AAAA,EAC5B;AACA,SAAO,QAAQ,WAAW,IAAI,QAAQ,CAAC,IAAI;AAC7C;AAEO,SAAS,+BACd,SACuB;AACvB,SAAO;AAAA,IACL,GAAG;AAAA,IACH,GAAG;AAAA,EACL;AACF;AAEO,SAAS,2BACd,SACA,KACuB;AACvB,QAAM,oBAAoB,+BAA+B,OAAO;AAChE,SAAO,EAAE,GAAG,mBAAmB,CAAC,GAAG,GAAG,CAAC,kBAAkB,GAAG,EAAE;AAChE;","names":[]}
@@ -0,0 +1,6 @@
1
+ /**
2
+ * Normalize NFT/token image URLs for browser rendering.
3
+ * Wallet APIs often return ipfs://, ipns://, or ar:// URIs that <img> cannot load directly.
4
+ */
5
+ export declare function normalizeInventoryImageUrl(raw: string | null | undefined): string | null;
6
+ //# sourceMappingURL=media-url.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"media-url.d.ts","sourceRoot":"","sources":["../../src/inventory/media-url.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAMH,wBAAgB,0BAA0B,CACxC,GAAG,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,GAC7B,MAAM,GAAG,IAAI,CAgCf"}
@@ -0,0 +1,32 @@
1
+ const IPFS_GATEWAY_BASE = "https://ipfs.io/ipfs/";
2
+ const IPNS_GATEWAY_BASE = "https://ipfs.io/ipns/";
3
+ const ARWEAVE_GATEWAY_BASE = "https://arweave.net/";
4
+ function normalizeInventoryImageUrl(raw) {
5
+ const value = raw?.trim();
6
+ if (!value) return null;
7
+ if (/^(?:https?:|blob:)/i.test(value)) {
8
+ return value;
9
+ }
10
+ if (/^data:image\/(?:png|jpe?g|gif|webp|avif);base64,[a-z0-9+/]+=*$/i.test(
11
+ value
12
+ )) {
13
+ return value;
14
+ }
15
+ if (/^ipfs:\/\//i.test(value)) {
16
+ const cidPath = value.replace(/^ipfs:\/\//i, "").replace(/^ipfs\//i, "");
17
+ return cidPath ? `${IPFS_GATEWAY_BASE}${cidPath}` : null;
18
+ }
19
+ if (/^ipns:\/\//i.test(value)) {
20
+ const namePath = value.replace(/^ipns:\/\//i, "");
21
+ return namePath ? `${IPNS_GATEWAY_BASE}${namePath}` : null;
22
+ }
23
+ if (/^ar:\/\//i.test(value)) {
24
+ const txId = value.replace(/^ar:\/\//i, "");
25
+ return txId ? `${ARWEAVE_GATEWAY_BASE}${txId}` : null;
26
+ }
27
+ return null;
28
+ }
29
+ export {
30
+ normalizeInventoryImageUrl
31
+ };
32
+ //# sourceMappingURL=media-url.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/inventory/media-url.ts"],"sourcesContent":["/**\n * Normalize NFT/token image URLs for browser rendering.\n * Wallet APIs often return ipfs://, ipns://, or ar:// URIs that <img> cannot load directly.\n */\n\nconst IPFS_GATEWAY_BASE = \"https://ipfs.io/ipfs/\";\nconst IPNS_GATEWAY_BASE = \"https://ipfs.io/ipns/\";\nconst ARWEAVE_GATEWAY_BASE = \"https://arweave.net/\";\n\nexport function normalizeInventoryImageUrl(\n raw: string | null | undefined,\n): string | null {\n const value = raw?.trim();\n if (!value) return null;\n\n if (/^(?:https?:|blob:)/i.test(value)) {\n return value;\n }\n\n if (\n /^data:image\\/(?:png|jpe?g|gif|webp|avif);base64,[a-z0-9+/]+=*$/i.test(\n value,\n )\n ) {\n return value;\n }\n\n if (/^ipfs:\\/\\//i.test(value)) {\n const cidPath = value.replace(/^ipfs:\\/\\//i, \"\").replace(/^ipfs\\//i, \"\");\n return cidPath ? `${IPFS_GATEWAY_BASE}${cidPath}` : null;\n }\n\n if (/^ipns:\\/\\//i.test(value)) {\n const namePath = value.replace(/^ipns:\\/\\//i, \"\");\n return namePath ? `${IPNS_GATEWAY_BASE}${namePath}` : null;\n }\n\n if (/^ar:\\/\\//i.test(value)) {\n const txId = value.replace(/^ar:\\/\\//i, \"\");\n return txId ? `${ARWEAVE_GATEWAY_BASE}${txId}` : null;\n }\n\n return null;\n}\n"],"mappings":"AAKA,MAAM,oBAAoB;AAC1B,MAAM,oBAAoB;AAC1B,MAAM,uBAAuB;AAEtB,SAAS,2BACd,KACe;AACf,QAAM,QAAQ,KAAK,KAAK;AACxB,MAAI,CAAC,MAAO,QAAO;AAEnB,MAAI,sBAAsB,KAAK,KAAK,GAAG;AACrC,WAAO;AAAA,EACT;AAEA,MACE,kEAAkE;AAAA,IAChE;AAAA,EACF,GACA;AACA,WAAO;AAAA,EACT;AAEA,MAAI,cAAc,KAAK,KAAK,GAAG;AAC7B,UAAM,UAAU,MAAM,QAAQ,eAAe,EAAE,EAAE,QAAQ,YAAY,EAAE;AACvE,WAAO,UAAU,GAAG,iBAAiB,GAAG,OAAO,KAAK;AAAA,EACtD;AAEA,MAAI,cAAc,KAAK,KAAK,GAAG;AAC7B,UAAM,WAAW,MAAM,QAAQ,eAAe,EAAE;AAChD,WAAO,WAAW,GAAG,iBAAiB,GAAG,QAAQ,KAAK;AAAA,EACxD;AAEA,MAAI,YAAY,KAAK,KAAK,GAAG;AAC3B,UAAM,OAAO,MAAM,QAAQ,aAAa,EAAE;AAC1C,WAAO,OAAO,GAAG,oBAAoB,GAAG,IAAI,KAAK;AAAA,EACnD;AAEA,SAAO;AACT;","names":[]}
@@ -0,0 +1,38 @@
1
+ import type { EvmChainBalance, WalletAddresses, WalletBalancesResponse, WalletConfigStatus, WalletNftsResponse } from "@elizaos/shared";
2
+ import type { InventoryChainFilters } from "@elizaos/ui/state";
3
+ import { type NftItem, type TokenRow } from "./constants.ts";
4
+ import { type PrimaryInventoryChainKey } from "./inventory-chain-filters.ts";
5
+ export interface InventoryDataInput {
6
+ walletBalances: WalletBalancesResponse | null;
7
+ walletAddresses: WalletAddresses | null;
8
+ walletConfig: WalletConfigStatus | null;
9
+ walletNfts: WalletNftsResponse | null;
10
+ inventorySort: string;
11
+ inventorySortDirection: "asc" | "desc";
12
+ inventoryChainFilters: InventoryChainFilters;
13
+ }
14
+ export interface InventoryDataOutput {
15
+ /** When exactly one chain toggle is on, that key; otherwise null. */
16
+ singleChainFocus: PrimaryInventoryChainKey | null;
17
+ tokenRows: TokenRow[];
18
+ /** Unfiltered rows (for sidebar per-chain asset counts). */
19
+ tokenRowsAllChains: TokenRow[];
20
+ sortedRows: TokenRow[];
21
+ chainErrors: EvmChainBalance[];
22
+ focusChainHasError: boolean;
23
+ allNfts: NftItem[];
24
+ primaryChain: EvmChainBalance | null;
25
+ primaryNativeBalanceNum: number;
26
+ focusedRows: TokenRow[];
27
+ visibleRows: TokenRow[];
28
+ totalUsd: number;
29
+ visibleChainErrors: EvmChainBalance[];
30
+ focusedChainName: string | null;
31
+ focusedChainError: string | null;
32
+ focusedNativeBalance: string | null;
33
+ focusedNativeSymbol: string | null;
34
+ primaryChainError: string | null;
35
+ primaryNativeBalance: string | null;
36
+ }
37
+ export declare function useInventoryData({ walletBalances, walletAddresses, walletConfig, walletNfts, inventorySort, inventorySortDirection, inventoryChainFilters, }: InventoryDataInput): InventoryDataOutput;
38
+ //# sourceMappingURL=useInventoryData.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useInventoryData.d.ts","sourceRoot":"","sources":["../../src/inventory/useInventoryData.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,eAAe,EACf,eAAe,EACf,sBAAsB,EACtB,kBAAkB,EAClB,kBAAkB,EACnB,MAAM,iBAAiB,CAAC;AACzB,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,mBAAmB,CAAC;AAQ/D,OAAO,EAGL,KAAK,OAAO,EACZ,KAAK,QAAQ,EACd,MAAM,gBAAgB,CAAC;AACxB,OAAO,EAGL,KAAK,wBAAwB,EAC9B,MAAM,8BAA8B,CAAC;AAEtC,MAAM,WAAW,kBAAkB;IACjC,cAAc,EAAE,sBAAsB,GAAG,IAAI,CAAC;IAC9C,eAAe,EAAE,eAAe,GAAG,IAAI,CAAC;IACxC,YAAY,EAAE,kBAAkB,GAAG,IAAI,CAAC;IACxC,UAAU,EAAE,kBAAkB,GAAG,IAAI,CAAC;IACtC,aAAa,EAAE,MAAM,CAAC;IACtB,sBAAsB,EAAE,KAAK,GAAG,MAAM,CAAC;IACvC,qBAAqB,EAAE,qBAAqB,CAAC;CAC9C;AAED,MAAM,WAAW,mBAAmB;IAClC,qEAAqE;IACrE,gBAAgB,EAAE,wBAAwB,GAAG,IAAI,CAAC;IAClD,SAAS,EAAE,QAAQ,EAAE,CAAC;IACtB,4DAA4D;IAC5D,kBAAkB,EAAE,QAAQ,EAAE,CAAC;IAC/B,UAAU,EAAE,QAAQ,EAAE,CAAC;IACvB,WAAW,EAAE,eAAe,EAAE,CAAC;IAC/B,kBAAkB,EAAE,OAAO,CAAC;IAC5B,OAAO,EAAE,OAAO,EAAE,CAAC;IACnB,YAAY,EAAE,eAAe,GAAG,IAAI,CAAC;IACrC,uBAAuB,EAAE,MAAM,CAAC;IAChC,WAAW,EAAE,QAAQ,EAAE,CAAC;IACxB,WAAW,EAAE,QAAQ,EAAE,CAAC;IACxB,QAAQ,EAAE,MAAM,CAAC;IACjB,kBAAkB,EAAE,eAAe,EAAE,CAAC;IACtC,gBAAgB,EAAE,MAAM,GAAG,IAAI,CAAC;IAChC,iBAAiB,EAAE,MAAM,GAAG,IAAI,CAAC;IACjC,oBAAoB,EAAE,MAAM,GAAG,IAAI,CAAC;IACpC,mBAAmB,EAAE,MAAM,GAAG,IAAI,CAAC;IACnC,iBAAiB,EAAE,MAAM,GAAG,IAAI,CAAC;IACjC,oBAAoB,EAAE,MAAM,GAAG,IAAI,CAAC;CACrC;AAwHD,wBAAgB,gBAAgB,CAAC,EAC/B,cAAc,EACd,eAAe,EACf,YAAY,EACZ,UAAU,EACV,aAAa,EACb,sBAAsB,EACtB,qBAAqB,GACtB,EAAE,kBAAkB,GAAG,mBAAmB,CA+M1C"}
@@ -0,0 +1,311 @@
1
+ import { useMemo } from "react";
2
+ import {
3
+ CHAIN_CONFIGS,
4
+ PRIMARY_CHAIN_KEYS,
5
+ resolveChainKey
6
+ } from "./chainConfig.js";
7
+ import {
8
+ isBscChainName,
9
+ parseFiniteAmount
10
+ } from "./constants.js";
11
+ import {
12
+ computeSingleChainFocus,
13
+ matchesInventoryChainFilter
14
+ } from "./inventory-chain-filters.js";
15
+ function hasVisibleBalance(row) {
16
+ return row.balanceRaw > 0 || row.valueUsd > 0;
17
+ }
18
+ function matchesSingleChainFocus(chainName, focus) {
19
+ const resolved = resolveChainKey(chainName);
20
+ return resolved === focus;
21
+ }
22
+ function buildTokenRowsAllChains({
23
+ walletBalances,
24
+ walletAddresses,
25
+ walletConfig
26
+ }) {
27
+ const rows = [];
28
+ const knownEvmAddr = walletAddresses?.evmAddress ?? walletConfig?.evmAddress;
29
+ if (walletBalances?.evm) {
30
+ const seenChainKeys = /* @__PURE__ */ new Set();
31
+ for (const chain of walletBalances.evm.chains) {
32
+ const chainKey = resolveChainKey(chain.chain);
33
+ if (chainKey) seenChainKeys.add(chainKey);
34
+ rows.push({
35
+ chain: chain.chain,
36
+ symbol: chain.nativeSymbol,
37
+ name: `${chain.chain} native`,
38
+ contractAddress: null,
39
+ logoUrl: null,
40
+ balance: chain.nativeBalance,
41
+ valueUsd: parseFiniteAmount(chain.nativeValueUsd),
42
+ balanceRaw: parseFiniteAmount(chain.nativeBalance),
43
+ isNative: true
44
+ });
45
+ if (chain.error) continue;
46
+ for (const tk of chain.tokens) {
47
+ rows.push({
48
+ chain: chain.chain,
49
+ symbol: tk.symbol,
50
+ name: tk.name,
51
+ contractAddress: tk.contractAddress ?? null,
52
+ logoUrl: tk.logoUrl ?? null,
53
+ balance: tk.balance,
54
+ valueUsd: parseFiniteAmount(tk.valueUsd),
55
+ balanceRaw: parseFiniteAmount(tk.balance),
56
+ isNative: false
57
+ });
58
+ }
59
+ }
60
+ if (knownEvmAddr) {
61
+ for (const key of PRIMARY_CHAIN_KEYS) {
62
+ if (key === "solana") continue;
63
+ if (seenChainKeys.has(key)) continue;
64
+ const cfg = CHAIN_CONFIGS[key];
65
+ rows.unshift({
66
+ chain: cfg.name,
67
+ symbol: cfg.nativeSymbol,
68
+ name: `${cfg.name} native`,
69
+ contractAddress: null,
70
+ logoUrl: null,
71
+ balance: "0",
72
+ valueUsd: 0,
73
+ balanceRaw: 0,
74
+ isNative: true
75
+ });
76
+ }
77
+ }
78
+ } else if (knownEvmAddr) {
79
+ for (const key of PRIMARY_CHAIN_KEYS) {
80
+ if (key === "solana") continue;
81
+ const cfg = CHAIN_CONFIGS[key];
82
+ rows.push({
83
+ chain: cfg.name,
84
+ symbol: cfg.nativeSymbol,
85
+ name: `${cfg.name} native`,
86
+ contractAddress: null,
87
+ logoUrl: null,
88
+ balance: "0",
89
+ valueUsd: 0,
90
+ balanceRaw: 0,
91
+ isNative: true
92
+ });
93
+ }
94
+ }
95
+ if (walletBalances?.solana) {
96
+ rows.push({
97
+ chain: "Solana",
98
+ symbol: "SOL",
99
+ name: "Solana native",
100
+ contractAddress: null,
101
+ logoUrl: null,
102
+ balance: walletBalances.solana.solBalance,
103
+ valueUsd: parseFiniteAmount(walletBalances.solana.solValueUsd),
104
+ balanceRaw: parseFiniteAmount(walletBalances.solana.solBalance),
105
+ isNative: true
106
+ });
107
+ for (const tk of walletBalances.solana.tokens) {
108
+ rows.push({
109
+ chain: "Solana",
110
+ symbol: tk.symbol,
111
+ name: tk.name,
112
+ contractAddress: tk.mint ?? null,
113
+ logoUrl: tk.logoUrl ?? null,
114
+ balance: tk.balance,
115
+ valueUsd: parseFiniteAmount(tk.valueUsd),
116
+ balanceRaw: parseFiniteAmount(tk.balance),
117
+ isNative: false
118
+ });
119
+ }
120
+ }
121
+ return rows.filter(hasVisibleBalance);
122
+ }
123
+ function useInventoryData({
124
+ walletBalances,
125
+ walletAddresses,
126
+ walletConfig,
127
+ walletNfts,
128
+ inventorySort,
129
+ inventorySortDirection,
130
+ inventoryChainFilters
131
+ }) {
132
+ const singleChainFocus = useMemo(
133
+ () => computeSingleChainFocus(inventoryChainFilters),
134
+ [inventoryChainFilters]
135
+ );
136
+ const knownEvmAddr = walletAddresses?.evmAddress ?? walletConfig?.evmAddress;
137
+ const _knownSolAddr = walletAddresses?.solanaAddress ?? walletConfig?.solanaAddress;
138
+ const primaryChain = useMemo(() => {
139
+ if (!walletBalances?.evm?.chains) return null;
140
+ return walletBalances.evm.chains.find(
141
+ (c) => isBscChainName(c.chain)
142
+ ) ?? null;
143
+ }, [walletBalances]);
144
+ const primaryNativeBalanceNum = useMemo(() => {
145
+ if (!primaryChain) return 0;
146
+ return parseFiniteAmount(primaryChain.nativeBalance);
147
+ }, [primaryChain]);
148
+ const tokenRowsAllChains = useMemo(
149
+ () => buildTokenRowsAllChains({
150
+ walletBalances,
151
+ walletAddresses,
152
+ walletConfig
153
+ }),
154
+ [walletBalances, walletAddresses, walletConfig]
155
+ );
156
+ const tokenRows = useMemo(
157
+ () => tokenRowsAllChains.filter(
158
+ (row) => matchesInventoryChainFilter(row.chain, inventoryChainFilters)
159
+ ),
160
+ [tokenRowsAllChains, inventoryChainFilters]
161
+ );
162
+ const sortedRows = useMemo(() => {
163
+ const sorted = [...tokenRows];
164
+ const asc = inventorySortDirection === "asc";
165
+ if (inventorySort === "value") {
166
+ sorted.sort((a, b) => {
167
+ const diff = a.valueUsd - b.valueUsd;
168
+ if (diff !== 0) return asc ? diff : -diff;
169
+ const diff2 = a.balanceRaw - b.balanceRaw;
170
+ return asc ? diff2 : -diff2;
171
+ });
172
+ } else if (inventorySort === "chain") {
173
+ sorted.sort((a, b) => {
174
+ const c = a.chain.localeCompare(b.chain);
175
+ if (c !== 0) return asc ? c : -c;
176
+ const s = a.symbol.localeCompare(b.symbol);
177
+ return asc ? s : -s;
178
+ });
179
+ } else if (inventorySort === "symbol") {
180
+ sorted.sort((a, b) => {
181
+ const s = a.symbol.localeCompare(b.symbol);
182
+ if (s !== 0) return asc ? s : -s;
183
+ const c = a.chain.localeCompare(b.chain);
184
+ return asc ? c : -c;
185
+ });
186
+ }
187
+ return sorted;
188
+ }, [tokenRows, inventorySort, inventorySortDirection]);
189
+ const chainErrors = useMemo(
190
+ () => (walletBalances?.evm?.chains ?? []).filter(
191
+ (c) => c.error
192
+ ),
193
+ [walletBalances]
194
+ );
195
+ const focusChainHasError = useMemo(() => {
196
+ return chainErrors.some(
197
+ (c) => matchesInventoryChainFilter(c.chain, inventoryChainFilters)
198
+ );
199
+ }, [chainErrors, inventoryChainFilters]);
200
+ const allNfts = useMemo(() => {
201
+ if (!walletNfts) return [];
202
+ const items = [];
203
+ for (const chainData of walletNfts.evm) {
204
+ for (const nft of chainData.nfts) {
205
+ items.push({
206
+ chain: chainData.chain,
207
+ name: nft.name,
208
+ imageUrl: nft.imageUrl,
209
+ collectionName: nft.collectionName || nft.tokenType
210
+ });
211
+ }
212
+ }
213
+ if (walletNfts.solana) {
214
+ for (const nft of walletNfts.solana.nfts) {
215
+ items.push({
216
+ chain: "Solana",
217
+ name: nft.name,
218
+ imageUrl: nft.imageUrl,
219
+ collectionName: nft.collectionName
220
+ });
221
+ }
222
+ }
223
+ const filtered = items.filter(
224
+ (nft) => matchesInventoryChainFilter(nft.chain, inventoryChainFilters)
225
+ );
226
+ const sorted = [...filtered];
227
+ const asc = inventorySortDirection === "asc";
228
+ const normalizedSort = inventorySort === "value" ? "symbol" : inventorySort;
229
+ if (normalizedSort === "chain") {
230
+ sorted.sort((a, b) => {
231
+ const chainDiff = a.chain.localeCompare(b.chain);
232
+ if (chainDiff !== 0) return asc ? chainDiff : -chainDiff;
233
+ const nameDiff = a.name.localeCompare(b.name);
234
+ return asc ? nameDiff : -nameDiff;
235
+ });
236
+ } else {
237
+ sorted.sort((a, b) => {
238
+ const nameDiff = a.name.localeCompare(b.name);
239
+ if (nameDiff !== 0) return asc ? nameDiff : -nameDiff;
240
+ const chainDiff = a.chain.localeCompare(b.chain);
241
+ return asc ? chainDiff : -chainDiff;
242
+ });
243
+ }
244
+ return sorted;
245
+ }, [
246
+ walletNfts,
247
+ inventoryChainFilters,
248
+ inventorySort,
249
+ inventorySortDirection
250
+ ]);
251
+ const focusedChain = useMemo(() => {
252
+ if (!singleChainFocus) return null;
253
+ if (singleChainFocus === "solana") {
254
+ return {
255
+ name: CHAIN_CONFIGS.solana.name,
256
+ nativeSymbol: CHAIN_CONFIGS.solana.nativeSymbol,
257
+ nativeBalance: walletBalances?.solana?.solBalance ?? null,
258
+ error: null
259
+ };
260
+ }
261
+ const chainConfig = CHAIN_CONFIGS[singleChainFocus];
262
+ const evmChain = walletBalances?.evm?.chains.find(
263
+ (chain) => matchesSingleChainFocus(chain.chain, singleChainFocus)
264
+ ) ?? null;
265
+ if (!chainConfig && !evmChain) return null;
266
+ return {
267
+ name: evmChain?.chain ?? chainConfig?.name ?? singleChainFocus,
268
+ nativeSymbol: evmChain?.nativeSymbol ?? chainConfig?.nativeSymbol ?? null,
269
+ nativeBalance: evmChain?.nativeBalance ?? (knownEvmAddr ? "0" : null),
270
+ error: evmChain?.error ?? null
271
+ };
272
+ }, [singleChainFocus, knownEvmAddr, walletBalances]);
273
+ const primaryChainError = primaryChain?.error ?? chainErrors.find((chain) => isBscChainName(chain.chain))?.error ?? null;
274
+ const primaryNativeBalance = primaryChain?.nativeBalance ?? null;
275
+ const focusedRows = sortedRows;
276
+ const visibleRows = sortedRows;
277
+ const totalUsd = useMemo(
278
+ () => tokenRows.reduce((sum, r) => sum + r.valueUsd, 0),
279
+ [tokenRows]
280
+ );
281
+ const visibleChainErrors = useMemo(() => {
282
+ return chainErrors.filter(
283
+ (chain) => matchesInventoryChainFilter(chain.chain, inventoryChainFilters)
284
+ );
285
+ }, [chainErrors, inventoryChainFilters]);
286
+ return {
287
+ singleChainFocus,
288
+ tokenRows,
289
+ tokenRowsAllChains,
290
+ sortedRows,
291
+ chainErrors,
292
+ focusChainHasError,
293
+ allNfts,
294
+ primaryChain,
295
+ primaryNativeBalanceNum,
296
+ focusedRows,
297
+ visibleRows,
298
+ totalUsd,
299
+ visibleChainErrors,
300
+ focusedChainName: focusedChain?.name ?? null,
301
+ focusedChainError: focusedChain?.error ?? null,
302
+ focusedNativeBalance: focusedChain?.nativeBalance ?? null,
303
+ focusedNativeSymbol: focusedChain?.nativeSymbol ?? null,
304
+ primaryChainError,
305
+ primaryNativeBalance
306
+ };
307
+ }
308
+ export {
309
+ useInventoryData
310
+ };
311
+ //# sourceMappingURL=useInventoryData.js.map