@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,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
|