@relayprotocol/relay-kit-ui 10.0.1 → 11.0.0

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 (80) hide show
  1. package/_cjs/src/components/common/TokenSelector/PaymentMethod.js +9 -9
  2. package/_cjs/src/components/common/TokenSelector/PaymentMethod.js.map +1 -1
  3. package/_cjs/src/components/common/TokenSelector/TokenSelector.js +8 -8
  4. package/_cjs/src/components/common/TokenSelector/TokenSelector.js.map +1 -1
  5. package/_cjs/src/components/widgets/SwapWidgetRenderer.js +6 -39
  6. package/_cjs/src/components/widgets/SwapWidgetRenderer.js.map +1 -1
  7. package/_cjs/src/constants/walletCompatibility.js +3 -1
  8. package/_cjs/src/constants/walletCompatibility.js.map +1 -1
  9. package/_cjs/src/hooks/index.js +5 -3
  10. package/_cjs/src/hooks/index.js.map +1 -1
  11. package/_cjs/src/hooks/useCodexBalances.js +305 -0
  12. package/_cjs/src/hooks/useCodexBalances.js.map +1 -0
  13. package/_cjs/src/hooks/useCurrencyBalance.js +18 -74
  14. package/_cjs/src/hooks/useCurrencyBalance.js.map +1 -1
  15. package/_cjs/src/hooks/useEnhancedTokensList.js.map +1 -1
  16. package/_cjs/src/hooks/useMultiWalletBalances.js +19 -37
  17. package/_cjs/src/hooks/useMultiWalletBalances.js.map +1 -1
  18. package/_cjs/src/hooks/useSolanaBalance.js +60 -0
  19. package/_cjs/src/hooks/useSolanaBalance.js.map +1 -0
  20. package/_cjs/src/providers/RelayKitProvider.js +1 -1
  21. package/_cjs/src/providers/RelayKitProvider.js.map +1 -1
  22. package/_cjs/src/version.js +1 -1
  23. package/_cjs/src/version.js.map +1 -1
  24. package/_cjs/tsconfig.build.tsbuildinfo +1 -1
  25. package/_esm/src/components/common/TokenSelector/PaymentMethod.js +9 -9
  26. package/_esm/src/components/common/TokenSelector/PaymentMethod.js.map +1 -1
  27. package/_esm/src/components/common/TokenSelector/TokenSelector.js +10 -10
  28. package/_esm/src/components/common/TokenSelector/TokenSelector.js.map +1 -1
  29. package/_esm/src/components/widgets/SwapWidgetRenderer.js +6 -41
  30. package/_esm/src/components/widgets/SwapWidgetRenderer.js.map +1 -1
  31. package/_esm/src/constants/walletCompatibility.js +3 -1
  32. package/_esm/src/constants/walletCompatibility.js.map +1 -1
  33. package/_esm/src/hooks/index.js +3 -2
  34. package/_esm/src/hooks/index.js.map +1 -1
  35. package/_esm/src/hooks/useCodexBalances.js +311 -0
  36. package/_esm/src/hooks/useCodexBalances.js.map +1 -0
  37. package/_esm/src/hooks/useCurrencyBalance.js +18 -74
  38. package/_esm/src/hooks/useCurrencyBalance.js.map +1 -1
  39. package/_esm/src/hooks/useEnhancedTokensList.js.map +1 -1
  40. package/_esm/src/hooks/useMultiWalletBalances.js +18 -39
  41. package/_esm/src/hooks/useMultiWalletBalances.js.map +1 -1
  42. package/_esm/src/hooks/useSolanaBalance.js +58 -0
  43. package/_esm/src/hooks/useSolanaBalance.js.map +1 -0
  44. package/_esm/src/providers/RelayKitProvider.js +1 -1
  45. package/_esm/src/providers/RelayKitProvider.js.map +1 -1
  46. package/_esm/src/version.js +1 -1
  47. package/_esm/src/version.js.map +1 -1
  48. package/_esm/tsconfig.build.tsbuildinfo +1 -1
  49. package/_types/src/components/common/TokenSelector/PaymentMethod.d.ts.map +1 -1
  50. package/_types/src/components/common/TokenSelector/TokenSelector.d.ts.map +1 -1
  51. package/_types/src/components/widgets/SwapWidgetRenderer.d.ts.map +1 -1
  52. package/_types/src/constants/walletCompatibility.d.ts.map +1 -1
  53. package/_types/src/hooks/index.d.ts +3 -2
  54. package/_types/src/hooks/index.d.ts.map +1 -1
  55. package/_types/src/hooks/useCodexBalances.d.ts +45 -0
  56. package/_types/src/hooks/useCodexBalances.d.ts.map +1 -0
  57. package/_types/src/hooks/useCurrencyBalance.d.ts +0 -1
  58. package/_types/src/hooks/useCurrencyBalance.d.ts.map +1 -1
  59. package/_types/src/hooks/useEnhancedTokensList.d.ts +1 -1
  60. package/_types/src/hooks/useEnhancedTokensList.d.ts.map +1 -1
  61. package/_types/src/hooks/useMultiWalletBalances.d.ts +3 -12
  62. package/_types/src/hooks/useMultiWalletBalances.d.ts.map +1 -1
  63. package/_types/src/hooks/{useEclipseBalance.d.ts → useSolanaBalance.d.ts} +2 -2
  64. package/_types/src/hooks/useSolanaBalance.d.ts.map +1 -0
  65. package/_types/src/providers/RelayKitProvider.d.ts +3 -3
  66. package/_types/src/providers/RelayKitProvider.d.ts.map +1 -1
  67. package/_types/src/version.d.ts +1 -1
  68. package/_types/tsconfig.build.tsbuildinfo +1 -1
  69. package/package.json +1 -1
  70. package/_cjs/src/hooks/useDuneBalances.js +0 -100
  71. package/_cjs/src/hooks/useDuneBalances.js.map +0 -1
  72. package/_cjs/src/hooks/useEclipseBalance.js +0 -47
  73. package/_cjs/src/hooks/useEclipseBalance.js.map +0 -1
  74. package/_esm/src/hooks/useDuneBalances.js +0 -102
  75. package/_esm/src/hooks/useDuneBalances.js.map +0 -1
  76. package/_esm/src/hooks/useEclipseBalance.js +0 -44
  77. package/_esm/src/hooks/useEclipseBalance.js.map +0 -1
  78. package/_types/src/hooks/useDuneBalances.d.ts +0 -25
  79. package/_types/src/hooks/useDuneBalances.d.ts.map +0 -1
  80. package/_types/src/hooks/useEclipseBalance.d.ts.map +0 -1
@@ -0,0 +1,311 @@
1
+ import { formatUnits, isAddress, zeroAddress } from 'viem';
2
+ import { ProviderOptionsContext } from '../providers/RelayKitProvider.js';
3
+ import { useContext } from 'react';
4
+ import { useQuery } from '@tanstack/react-query';
5
+ import { eclipse, isSolanaAddress, solana } from '../utils/solana.js';
6
+ import useRelayClient from './useRelayClient.js';
7
+ export const CODEX_SVM_NETWORK_ID = 1399811149;
8
+ const SOLANA_NATIVE_ADDRESS = '11111111111111111111111111111111';
9
+ // zero address + EIP-7528 placeholder — indexers use either for native entries
10
+ const EVM_NATIVE_ALIASES = [
11
+ zeroAddress,
12
+ '0xeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee',
13
+ 'native'
14
+ ];
15
+ const MAX_BALANCES = 200;
16
+ const PAGE_LIMIT = 100;
17
+ // Codex prices thinly-traded junk that removeScams misses — below this pool
18
+ // liquidity a token's usd value is treated as unrealizable and stripped
19
+ const MIN_LIQUIDITY_USD = 1000;
20
+ const BALANCES_QUERY = `query WalletBalances($input: BalancesInput!) {
21
+ balances(input: $input) {
22
+ cursor
23
+ items {
24
+ balance
25
+ balanceUsd
26
+ tokenPriceUsd
27
+ liquidityUsd
28
+ tokenAddress
29
+ networkId
30
+ token {
31
+ symbol
32
+ decimals
33
+ isScam
34
+ }
35
+ }
36
+ }
37
+ }`;
38
+ // Codex doesn't index native SVM assets — price them via equivalent indexed tokens
39
+ const SVM_NATIVE_PRICE_TOKENS = {
40
+ // SOL priced via wrapped SOL
41
+ [solana.id]: {
42
+ address: 'So11111111111111111111111111111111111111112',
43
+ networkId: CODEX_SVM_NETWORK_ID
44
+ },
45
+ // eclipse gas token is ETH, priced via mainnet WETH
46
+ [eclipse.id]: {
47
+ address: '0xc02aaa39b223fe8d0a0e5c4f27ead9083c756cc2',
48
+ networkId: 1
49
+ }
50
+ };
51
+ // Codex requires networks when includeNative is true; unsupported ids are ignored
52
+ export const getEvmNetworkIds = (chains) => {
53
+ return (chains ?? [])
54
+ .filter((chain) => chain.vmType === 'evm')
55
+ .map((chain) => chain.id);
56
+ };
57
+ /**
58
+ * SVM chains whose native balances come from their RPC — Codex only covers
59
+ * Solana SPL tokens, so gas balances (SOL, eclipse ETH) are merged in manually.
60
+ */
61
+ export const getSvmNativeChains = (chains) => {
62
+ return (chains ?? [])
63
+ .filter((chain) => chain.vmType === 'svm')
64
+ .flatMap((chain) => chain.httpRpcUrl &&
65
+ chain.currency?.symbol &&
66
+ chain.currency?.decimals !== undefined
67
+ ? [
68
+ {
69
+ chainId: chain.id,
70
+ rpcUrl: chain.httpRpcUrl,
71
+ symbol: chain.currency.symbol,
72
+ decimals: chain.currency.decimals,
73
+ priceToken: SVM_NATIVE_PRICE_TOKENS[chain.id]
74
+ }
75
+ ]
76
+ : []);
77
+ };
78
+ const fetchSvmNativeBalances = async (address, chains) => {
79
+ return Promise.all(chains.map(async (chain) => {
80
+ try {
81
+ const response = await fetch(chain.rpcUrl, {
82
+ method: 'POST',
83
+ headers: {
84
+ 'Content-Type': 'application/json'
85
+ },
86
+ body: JSON.stringify({
87
+ jsonrpc: '2.0',
88
+ id: 1,
89
+ method: 'getBalance',
90
+ params: [address]
91
+ })
92
+ });
93
+ const data = await response.json();
94
+ if (data.error) {
95
+ return null;
96
+ }
97
+ return { chain, amount: BigInt(data.result?.value ?? 0) };
98
+ }
99
+ catch (e) {
100
+ return null;
101
+ }
102
+ }));
103
+ };
104
+ const NATIVE_PRICES_QUERY = `query NativePrices($inputs: [GetPriceInput!]!) {
105
+ getTokenPrices(inputs: $inputs) {
106
+ address
107
+ networkId
108
+ priceUsd
109
+ }
110
+ }`;
111
+ const fetchSvmNativePrices = async (apiUrl, config, chains) => {
112
+ const inputs = chains.flatMap((chain) => chain.priceToken ? [chain.priceToken] : []);
113
+ if (!inputs.length) {
114
+ return {};
115
+ }
116
+ try {
117
+ const response = await fetch(apiUrl, {
118
+ method: 'POST',
119
+ headers: {
120
+ 'Content-Type': 'application/json',
121
+ ...(config.apiKey ? { Authorization: config.apiKey } : {})
122
+ },
123
+ body: JSON.stringify({
124
+ query: NATIVE_PRICES_QUERY,
125
+ variables: { inputs }
126
+ })
127
+ });
128
+ const json = await response.json();
129
+ const prices = {};
130
+ json.data?.getTokenPrices?.forEach((price) => {
131
+ if (price?.priceUsd !== undefined && price?.priceUsd !== null) {
132
+ prices[`${price.networkId}:${price.address}`] = price.priceUsd;
133
+ }
134
+ });
135
+ return prices;
136
+ }
137
+ catch (e) {
138
+ return {};
139
+ }
140
+ };
141
+ const normalizeAddress = (networkId, tokenAddress) => {
142
+ if (networkId === CODEX_SVM_NETWORK_ID) {
143
+ return tokenAddress === 'native' ? SOLANA_NATIVE_ADDRESS : tokenAddress;
144
+ }
145
+ return EVM_NATIVE_ALIASES.includes(tokenAddress.toLowerCase())
146
+ ? zeroAddress
147
+ : tokenAddress.toLowerCase();
148
+ };
149
+ const toNumber = (value) => {
150
+ if (value === undefined || value === null) {
151
+ return undefined;
152
+ }
153
+ const parsed = Number(value);
154
+ return Number.isFinite(parsed) ? parsed : undefined;
155
+ };
156
+ export const fetchCodexBalances = async (address, config, networks, svmNativeChains) => {
157
+ const apiUrl = `${config.apiBaseUrl ?? 'https://graph.codex.io'}/graphql`;
158
+ const items = [];
159
+ let cursor = null;
160
+ while (items.length < MAX_BALANCES) {
161
+ const response = await fetch(apiUrl, {
162
+ method: 'POST',
163
+ headers: {
164
+ 'Content-Type': 'application/json',
165
+ ...(config.apiKey ? { Authorization: config.apiKey } : {})
166
+ },
167
+ body: JSON.stringify({
168
+ query: BALANCES_QUERY,
169
+ variables: {
170
+ input: {
171
+ walletAddress: address,
172
+ includeNative: true,
173
+ removeScams: true,
174
+ sortBy: 'USD_VALUE',
175
+ sortDirection: 'DESC',
176
+ limit: PAGE_LIMIT,
177
+ networks,
178
+ ...(cursor ? { cursor } : {})
179
+ }
180
+ }
181
+ })
182
+ });
183
+ if (!response.ok) {
184
+ throw new Error(`Failed to fetch balances for ${address}`);
185
+ }
186
+ const json = await response.json();
187
+ if (json.errors?.length) {
188
+ throw new Error(json.errors[0]?.message ?? `Failed to fetch balances for ${address}`);
189
+ }
190
+ const page = json.data?.balances;
191
+ if (!page?.items?.length) {
192
+ break;
193
+ }
194
+ items.push(...page.items);
195
+ cursor = page.cursor;
196
+ if (!cursor) {
197
+ break;
198
+ }
199
+ }
200
+ const balances = items.reduce((balances, item) => {
201
+ const decimals = item.token?.decimals;
202
+ const symbol = item.token?.symbol;
203
+ if (typeof decimals !== 'number' || !symbol || item.token?.isScam) {
204
+ return balances;
205
+ }
206
+ try {
207
+ BigInt(item.balance);
208
+ }
209
+ catch (e) {
210
+ return balances;
211
+ }
212
+ const address = normalizeAddress(item.networkId, item.tokenAddress);
213
+ const isNative = address === zeroAddress || address === SOLANA_NATIVE_ADDRESS;
214
+ let price_usd = toNumber(item.tokenPriceUsd);
215
+ let value_usd = toNumber(item.balanceUsd);
216
+ const liquidityUsd = toNumber(item.liquidityUsd);
217
+ if (!isNative &&
218
+ liquidityUsd !== undefined &&
219
+ (liquidityUsd < MIN_LIQUIDITY_USD ||
220
+ (value_usd !== undefined && value_usd > liquidityUsd))) {
221
+ price_usd = undefined;
222
+ value_usd = undefined;
223
+ }
224
+ balances.push({
225
+ chain_id: item.networkId === CODEX_SVM_NETWORK_ID ? solana.id : item.networkId,
226
+ address,
227
+ amount: item.balance,
228
+ symbol,
229
+ decimals,
230
+ price_usd,
231
+ value_usd
232
+ });
233
+ return balances;
234
+ }, []);
235
+ if (svmNativeChains?.length) {
236
+ const [nativeBalances, nativePrices] = await Promise.all([
237
+ fetchSvmNativeBalances(address, svmNativeChains),
238
+ fetchSvmNativePrices(apiUrl, config, svmNativeChains)
239
+ ]);
240
+ nativeBalances.forEach((native) => {
241
+ if (!native) {
242
+ return;
243
+ }
244
+ const priceToken = native.chain.priceToken;
245
+ const priceUsd = priceToken
246
+ ? nativePrices[`${priceToken.networkId}:${priceToken.address}`]
247
+ : undefined;
248
+ const existing = balances.find((balance) => balance.chain_id === native.chain.chainId &&
249
+ balance.address === SOLANA_NATIVE_ADDRESS);
250
+ if (existing) {
251
+ const price = existing.price_usd ?? priceUsd;
252
+ existing.amount = native.amount.toString();
253
+ if (price !== undefined) {
254
+ existing.price_usd = price;
255
+ existing.value_usd =
256
+ price * Number(formatUnits(native.amount, existing.decimals));
257
+ }
258
+ }
259
+ else if (native.amount > BigInt(0)) {
260
+ balances.push({
261
+ chain_id: native.chain.chainId,
262
+ address: SOLANA_NATIVE_ADDRESS,
263
+ amount: native.amount.toString(),
264
+ symbol: native.chain.symbol,
265
+ decimals: native.chain.decimals,
266
+ price_usd: priceUsd,
267
+ value_usd: priceUsd !== undefined
268
+ ? priceUsd *
269
+ Number(formatUnits(native.amount, native.chain.decimals))
270
+ : undefined
271
+ });
272
+ }
273
+ });
274
+ }
275
+ return { balances };
276
+ };
277
+ export default (address, queryOptions) => {
278
+ const providerOptions = useContext(ProviderOptionsContext);
279
+ const relayClient = useRelayClient();
280
+ const codexConfig = providerOptions.codexConfig;
281
+ const queryKey = ['useCodexBalances', address];
282
+ const isEvmAddress = isAddress(address ?? '');
283
+ const isSvmAddress = isSolanaAddress(address ?? '');
284
+ const networks = isSvmAddress
285
+ ? [CODEX_SVM_NETWORK_ID]
286
+ : getEvmNetworkIds(relayClient?.chains);
287
+ const response = useQuery({
288
+ queryKey,
289
+ queryFn: () => {
290
+ if (!address || (!isSvmAddress && !isEvmAddress)) {
291
+ return null;
292
+ }
293
+ return fetchCodexBalances(address, codexConfig ?? {}, networks, isSvmAddress ? getSvmNativeChains(relayClient?.chains) : undefined);
294
+ },
295
+ ...queryOptions,
296
+ enabled: address !== undefined &&
297
+ networks.length > 0 &&
298
+ (codexConfig?.apiKey !== undefined ||
299
+ codexConfig?.apiBaseUrl !== undefined) &&
300
+ queryOptions?.enabled &&
301
+ (isSvmAddress || isEvmAddress)
302
+ });
303
+ // Keys are lowercased to match consumer lookups; balance.address keeps the
304
+ // mint's original case for the tokens api
305
+ const balanceMap = response?.data?.balances?.reduce((balanceMap, balance) => {
306
+ balanceMap[`${balance.chain_id}:${balance.address.toLowerCase()}`] = balance;
307
+ return balanceMap;
308
+ }, {});
309
+ return { ...response, balanceMap, queryKey };
310
+ };
311
+ //# sourceMappingURL=useCodexBalances.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useCodexBalances.js","sourceRoot":"","sources":["../../../src/hooks/useCodexBalances.ts"],"names":[],"mappings":"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","sourcesContent":["import { formatUnits, isAddress, zeroAddress } from 'viem'\nimport { ProviderOptionsContext } from '../providers/RelayKitProvider.js'\nimport { useContext } from 'react'\nimport {\n useQuery,\n type DefaultError,\n type QueryKey\n} from '@tanstack/react-query'\nimport { eclipse, isSolanaAddress, solana } from '../utils/solana.js'\nimport type { RelayChain } from '@relayprotocol/relay-sdk'\nimport useRelayClient from './useRelayClient.js'\n\nexport type WalletBalance = {\n chain_id: number\n address: string\n amount: string\n symbol: string\n decimals: number\n price_usd?: number\n value_usd?: number\n}\n\nexport type WalletBalanceResponse = {\n balances: WalletBalance[]\n} | null\n\nexport type BalanceMap = Record<string, WalletBalance>\n\nexport type CodexConfig = {\n apiBaseUrl?: string\n apiKey?: string\n}\n\nexport const CODEX_SVM_NETWORK_ID = 1399811149\n\nconst SOLANA_NATIVE_ADDRESS = '11111111111111111111111111111111'\n// zero address + EIP-7528 placeholder — indexers use either for native entries\nconst EVM_NATIVE_ALIASES = [\n zeroAddress,\n '0xeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee',\n 'native'\n]\n\nconst MAX_BALANCES = 200\nconst PAGE_LIMIT = 100\n// Codex prices thinly-traded junk that removeScams misses — below this pool\n// liquidity a token's usd value is treated as unrealizable and stripped\nconst MIN_LIQUIDITY_USD = 1000\n\nconst BALANCES_QUERY = `query WalletBalances($input: BalancesInput!) {\n balances(input: $input) {\n cursor\n items {\n balance\n balanceUsd\n tokenPriceUsd\n liquidityUsd\n tokenAddress\n networkId\n token {\n symbol\n decimals\n isScam\n }\n }\n }\n}`\n\ntype CodexBalanceItem = {\n balance: string\n balanceUsd?: string | null\n tokenPriceUsd?: string | null\n liquidityUsd?: string | null\n tokenAddress: string\n networkId: number\n token?: {\n symbol?: string | null\n decimals?: number | null\n isScam?: boolean | null\n } | null\n}\n\nexport type SvmNativeChain = {\n chainId: number\n rpcUrl: string\n symbol: string\n decimals: number\n priceToken?: {\n address: string\n networkId: number\n }\n}\n\n// Codex doesn't index native SVM assets — price them via equivalent indexed tokens\nconst SVM_NATIVE_PRICE_TOKENS: Record<\n number,\n { address: string; networkId: number }\n> = {\n // SOL priced via wrapped SOL\n [solana.id]: {\n address: 'So11111111111111111111111111111111111111112',\n networkId: CODEX_SVM_NETWORK_ID\n },\n // eclipse gas token is ETH, priced via mainnet WETH\n [eclipse.id]: {\n address: '0xc02aaa39b223fe8d0a0e5c4f27ead9083c756cc2',\n networkId: 1\n }\n}\n\n// Codex requires networks when includeNative is true; unsupported ids are ignored\nexport const getEvmNetworkIds = (chains?: RelayChain[]): number[] => {\n return (chains ?? [])\n .filter((chain) => chain.vmType === 'evm')\n .map((chain) => chain.id)\n}\n\n/**\n * SVM chains whose native balances come from their RPC — Codex only covers\n * Solana SPL tokens, so gas balances (SOL, eclipse ETH) are merged in manually.\n */\nexport const getSvmNativeChains = (chains?: RelayChain[]): SvmNativeChain[] => {\n return (chains ?? [])\n .filter((chain) => chain.vmType === 'svm')\n .flatMap((chain) =>\n chain.httpRpcUrl &&\n chain.currency?.symbol &&\n chain.currency?.decimals !== undefined\n ? [\n {\n chainId: chain.id,\n rpcUrl: chain.httpRpcUrl,\n symbol: chain.currency.symbol,\n decimals: chain.currency.decimals,\n priceToken: SVM_NATIVE_PRICE_TOKENS[chain.id]\n }\n ]\n : []\n )\n}\n\nconst fetchSvmNativeBalances = async (\n address: string,\n chains: SvmNativeChain[]\n): Promise<Array<{ chain: SvmNativeChain; amount: bigint } | null>> => {\n return Promise.all(\n chains.map(async (chain) => {\n try {\n const response = await fetch(chain.rpcUrl, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json'\n },\n body: JSON.stringify({\n jsonrpc: '2.0',\n id: 1,\n method: 'getBalance',\n params: [address]\n })\n })\n const data = await response.json()\n if (data.error) {\n return null\n }\n return { chain, amount: BigInt(data.result?.value ?? 0) }\n } catch (e) {\n return null\n }\n })\n )\n}\n\nconst NATIVE_PRICES_QUERY = `query NativePrices($inputs: [GetPriceInput!]!) {\n getTokenPrices(inputs: $inputs) {\n address\n networkId\n priceUsd\n }\n}`\n\nconst fetchSvmNativePrices = async (\n apiUrl: string,\n config: CodexConfig,\n chains: SvmNativeChain[]\n): Promise<Record<string, number>> => {\n const inputs = chains.flatMap((chain) =>\n chain.priceToken ? [chain.priceToken] : []\n )\n if (!inputs.length) {\n return {}\n }\n try {\n const response = await fetch(apiUrl, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n ...(config.apiKey ? { Authorization: config.apiKey } : {})\n },\n body: JSON.stringify({\n query: NATIVE_PRICES_QUERY,\n variables: { inputs }\n })\n })\n const json = await response.json()\n const prices: Record<string, number> = {}\n json.data?.getTokenPrices?.forEach(\n (\n price: {\n address: string\n networkId: number\n priceUsd?: number | null\n } | null\n ) => {\n if (price?.priceUsd !== undefined && price?.priceUsd !== null) {\n prices[`${price.networkId}:${price.address}`] = price.priceUsd\n }\n }\n )\n return prices\n } catch (e) {\n return {}\n }\n}\n\nconst normalizeAddress = (networkId: number, tokenAddress: string): string => {\n if (networkId === CODEX_SVM_NETWORK_ID) {\n return tokenAddress === 'native' ? SOLANA_NATIVE_ADDRESS : tokenAddress\n }\n return EVM_NATIVE_ALIASES.includes(tokenAddress.toLowerCase())\n ? zeroAddress\n : tokenAddress.toLowerCase()\n}\n\nconst toNumber = (value?: string | null): number | undefined => {\n if (value === undefined || value === null) {\n return undefined\n }\n const parsed = Number(value)\n return Number.isFinite(parsed) ? parsed : undefined\n}\n\nexport const fetchCodexBalances = async (\n address: string,\n config: CodexConfig,\n networks: number[],\n svmNativeChains?: SvmNativeChain[]\n): Promise<WalletBalanceResponse> => {\n const apiUrl = `${config.apiBaseUrl ?? 'https://graph.codex.io'}/graphql`\n const items: CodexBalanceItem[] = []\n let cursor: string | null = null\n\n while (items.length < MAX_BALANCES) {\n const response = await fetch(apiUrl, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n ...(config.apiKey ? { Authorization: config.apiKey } : {})\n },\n body: JSON.stringify({\n query: BALANCES_QUERY,\n variables: {\n input: {\n walletAddress: address,\n includeNative: true,\n removeScams: true,\n sortBy: 'USD_VALUE',\n sortDirection: 'DESC',\n limit: PAGE_LIMIT,\n networks,\n ...(cursor ? { cursor } : {})\n }\n }\n })\n })\n\n if (!response.ok) {\n throw new Error(`Failed to fetch balances for ${address}`)\n }\n\n const json = await response.json()\n if (json.errors?.length) {\n throw new Error(\n json.errors[0]?.message ?? `Failed to fetch balances for ${address}`\n )\n }\n\n const page = json.data?.balances\n if (!page?.items?.length) {\n break\n }\n items.push(...page.items)\n cursor = page.cursor\n if (!cursor) {\n break\n }\n }\n\n const balances = items.reduce<WalletBalance[]>((balances, item) => {\n const decimals = item.token?.decimals\n const symbol = item.token?.symbol\n if (typeof decimals !== 'number' || !symbol || item.token?.isScam) {\n return balances\n }\n try {\n BigInt(item.balance)\n } catch (e) {\n return balances\n }\n\n const address = normalizeAddress(item.networkId, item.tokenAddress)\n const isNative =\n address === zeroAddress || address === SOLANA_NATIVE_ADDRESS\n let price_usd = toNumber(item.tokenPriceUsd)\n let value_usd = toNumber(item.balanceUsd)\n const liquidityUsd = toNumber(item.liquidityUsd)\n if (\n !isNative &&\n liquidityUsd !== undefined &&\n (liquidityUsd < MIN_LIQUIDITY_USD ||\n (value_usd !== undefined && value_usd > liquidityUsd))\n ) {\n price_usd = undefined\n value_usd = undefined\n }\n\n balances.push({\n chain_id:\n item.networkId === CODEX_SVM_NETWORK_ID ? solana.id : item.networkId,\n address,\n amount: item.balance,\n symbol,\n decimals,\n price_usd,\n value_usd\n })\n return balances\n }, [])\n\n if (svmNativeChains?.length) {\n const [nativeBalances, nativePrices] = await Promise.all([\n fetchSvmNativeBalances(address, svmNativeChains),\n fetchSvmNativePrices(apiUrl, config, svmNativeChains)\n ])\n nativeBalances.forEach((native) => {\n if (!native) {\n return\n }\n const priceToken = native.chain.priceToken\n const priceUsd = priceToken\n ? nativePrices[`${priceToken.networkId}:${priceToken.address}`]\n : undefined\n const existing = balances.find(\n (balance) =>\n balance.chain_id === native.chain.chainId &&\n balance.address === SOLANA_NATIVE_ADDRESS\n )\n if (existing) {\n const price = existing.price_usd ?? priceUsd\n existing.amount = native.amount.toString()\n if (price !== undefined) {\n existing.price_usd = price\n existing.value_usd =\n price * Number(formatUnits(native.amount, existing.decimals))\n }\n } else if (native.amount > BigInt(0)) {\n balances.push({\n chain_id: native.chain.chainId,\n address: SOLANA_NATIVE_ADDRESS,\n amount: native.amount.toString(),\n symbol: native.chain.symbol,\n decimals: native.chain.decimals,\n price_usd: priceUsd,\n value_usd:\n priceUsd !== undefined\n ? priceUsd *\n Number(formatUnits(native.amount, native.chain.decimals))\n : undefined\n })\n }\n })\n }\n\n return { balances }\n}\n\ntype QueryType = typeof useQuery<\n WalletBalanceResponse,\n DefaultError,\n WalletBalanceResponse,\n QueryKey\n>\ntype QueryOptions = Parameters<QueryType>['0']\n\nexport default (address?: string, queryOptions?: Partial<QueryOptions>) => {\n const providerOptions = useContext(ProviderOptionsContext)\n const relayClient = useRelayClient()\n const codexConfig = providerOptions.codexConfig\n const queryKey = ['useCodexBalances', address]\n const isEvmAddress = isAddress(address ?? '')\n const isSvmAddress = isSolanaAddress(address ?? '')\n const networks = isSvmAddress\n ? [CODEX_SVM_NETWORK_ID]\n : getEvmNetworkIds(relayClient?.chains)\n\n const response = (useQuery as QueryType)({\n queryKey,\n queryFn: () => {\n if (!address || (!isSvmAddress && !isEvmAddress)) {\n return null\n }\n\n return fetchCodexBalances(\n address,\n codexConfig ?? {},\n networks,\n isSvmAddress ? getSvmNativeChains(relayClient?.chains) : undefined\n )\n },\n ...queryOptions,\n enabled:\n address !== undefined &&\n networks.length > 0 &&\n (codexConfig?.apiKey !== undefined ||\n codexConfig?.apiBaseUrl !== undefined) &&\n queryOptions?.enabled &&\n (isSvmAddress || isEvmAddress)\n })\n\n // Keys are lowercased to match consumer lookups; balance.address keeps the\n // mint's original case for the tokens api\n const balanceMap = response?.data?.balances?.reduce((balanceMap, balance) => {\n balanceMap[`${balance.chain_id}:${balance.address.toLowerCase()}`] = balance\n return balanceMap\n }, {} as BalanceMap)\n\n return { ...response, balanceMap, queryKey } as ReturnType<QueryType> & {\n balanceMap: typeof balanceMap\n queryKey: (string | undefined)[]\n }\n}\n"]}
@@ -1,13 +1,10 @@
1
1
  import { isAddress, zeroAddress } from 'viem';
2
2
  import { useBalance, useReadContract } from 'wagmi';
3
3
  import { erc20Abi } from 'viem';
4
- import useDuneBalances from './useDuneBalances.js';
4
+ import useSolanaBalance from './useSolanaBalance.js';
5
5
  import useBitcoinBalance from './useBitcoinBalance.js';
6
6
  import useAdaptedWalletBalance from './useAdaptedWalletBalance.js';
7
7
  import { isValidAddress } from '../utils/address.js';
8
- import useRelayClient from './useRelayClient.js';
9
- import useEclipseBalance from '../hooks/useEclipseBalance.js';
10
- import { eclipse } from '../utils/solana.js';
11
8
  import useHyperliquidBalance from './useHyperliquidBalance.js';
12
9
  import useHyperliquidAccountMode from './useHyperliquidAccountMode.js';
13
10
  import useTronBalance from '../hooks/useTronBalance.js';
@@ -16,7 +13,6 @@ import useTonBalance from '../hooks/useTonBalance.js';
16
13
  const useCurrencyBalance = ({ chain, address, currency, enabled = true, refreshInterval = 60000, wallet }) => {
17
14
  const isErc20Currency = currency && currency !== zeroAddress;
18
15
  const isValidEvmAddress = address && isAddress(address);
19
- const relayClient = useRelayClient();
20
16
  const adaptedWalletBalanceIsEnabled = wallet?.getBalance !== undefined && wallet.vmType === chain?.vmType;
21
17
  const adaptedWalletBalance = useAdaptedWalletBalance({
22
18
  wallet,
@@ -56,11 +52,10 @@ const useCurrencyBalance = ({ chain, address, currency, enabled = true, refreshI
56
52
  }
57
53
  });
58
54
  const _isValidAddress = isValidAddress(chain?.vmType, address, chain?.id);
59
- const duneBalances = useDuneBalances(address, relayClient?.baseApiUrl?.includes('testnet') ? 'testnet' : 'mainnet', {
55
+ const solanaBalance = useSolanaBalance(address, currency ? currency : undefined, chain?.httpRpcUrl, {
60
56
  enabled: Boolean(!adaptedWalletBalanceIsEnabled &&
61
57
  chain &&
62
58
  chain.vmType === 'svm' &&
63
- chain.id !== eclipse.id &&
64
59
  address &&
65
60
  _isValidAddress &&
66
61
  enabled),
@@ -77,15 +72,6 @@ const useCurrencyBalance = ({ chain, address, currency, enabled = true, refreshI
77
72
  gcTime: refreshInterval,
78
73
  staleTime: refreshInterval
79
74
  });
80
- const eclipseBalances = useEclipseBalance(address, {
81
- enabled: Boolean(!adaptedWalletBalanceIsEnabled &&
82
- chain &&
83
- chain.vmType === 'svm' &&
84
- chain.id === eclipse.id &&
85
- address &&
86
- _isValidAddress &&
87
- enabled)
88
- });
89
75
  const isHypevm = chain?.vmType === 'hypevm';
90
76
  const { data: hyperliquidAccountMode } = useHyperliquidAccountMode(address, Boolean(!adaptedWalletBalanceIsEnabled &&
91
77
  isHypevm &&
@@ -128,8 +114,7 @@ const useCurrencyBalance = ({ chain, address, currency, enabled = true, refreshI
128
114
  queryKey: adaptedWalletBalance.queryKey,
129
115
  isLoading: adaptedWalletBalance.isLoading,
130
116
  isError: adaptedWalletBalance.isError,
131
- error: adaptedWalletBalance.error,
132
- isDuneBalance: false
117
+ error: adaptedWalletBalance.error
133
118
  };
134
119
  }
135
120
  else if (chain?.vmType === 'evm') {
@@ -140,51 +125,16 @@ const useCurrencyBalance = ({ chain, address, currency, enabled = true, refreshI
140
125
  const isLoading = isErc20Currency
141
126
  ? erc20BalanceIsLoading
142
127
  : ethBalanceIsLoading;
143
- return { value, queryKey, isLoading, isError, error, isDuneBalance: false };
128
+ return { value, queryKey, isLoading, isError, error };
144
129
  }
145
130
  else if (chain?.vmType === 'svm') {
146
- let value = undefined;
147
- let isDuneBalance = true;
148
- let isError = false;
149
- let error = null;
150
- if (chain.id === eclipse.id) {
151
- value = eclipseBalances.data?.balance;
152
- isDuneBalance = false;
153
- isError = eclipseBalances.isError;
154
- error = eclipseBalances.error;
155
- }
156
- else {
157
- value =
158
- currency &&
159
- duneBalances.balanceMap &&
160
- duneBalances.balanceMap[`${chain.id}:${currency}`] &&
161
- duneBalances.balanceMap[`${chain.id}:${currency}`].amount
162
- ? BigInt(duneBalances.balanceMap[`${chain.id}:${currency}`].amount ?? 0)
163
- : undefined;
164
- isDuneBalance = true;
165
- isError = duneBalances.isError;
166
- error = duneBalances.error;
167
- }
168
- if (_isValidAddress) {
169
- return {
170
- value,
171
- queryKey: duneBalances.queryKey,
172
- isLoading: duneBalances.isLoading,
173
- isError,
174
- error,
175
- isDuneBalance
176
- };
177
- }
178
- else {
179
- return {
180
- value: undefined,
181
- queryKey: duneBalances.queryKey,
182
- isLoading: duneBalances.isLoading,
183
- isError,
184
- error,
185
- isDuneBalance
186
- };
187
- }
131
+ return {
132
+ value: _isValidAddress ? solanaBalance.balance : undefined,
133
+ queryKey: solanaBalance.queryKey,
134
+ isLoading: solanaBalance.isLoading,
135
+ isError: solanaBalance.isError,
136
+ error: solanaBalance.error
137
+ };
188
138
  }
189
139
  else if (chain?.vmType === 'bvm') {
190
140
  if (_isValidAddress) {
@@ -196,7 +146,6 @@ const useCurrencyBalance = ({ chain, address, currency, enabled = true, refreshI
196
146
  isLoading: bitcoinBalances.isLoading,
197
147
  isError: bitcoinBalances.isError,
198
148
  error: bitcoinBalances.error,
199
- isDuneBalance: false,
200
149
  hasPendingBalance: bitcoinBalances.data?.pendingBalance &&
201
150
  bitcoinBalances.data?.pendingBalance > 0n
202
151
  ? true
@@ -210,7 +159,6 @@ const useCurrencyBalance = ({ chain, address, currency, enabled = true, refreshI
210
159
  isLoading: bitcoinBalances.isLoading,
211
160
  isError: bitcoinBalances.isError,
212
161
  error: bitcoinBalances.error,
213
- isDuneBalance: false,
214
162
  hasPendingBalance: false
215
163
  };
216
164
  }
@@ -221,8 +169,7 @@ const useCurrencyBalance = ({ chain, address, currency, enabled = true, refreshI
221
169
  queryKey: hyperliquidBalance.queryKey,
222
170
  isLoading: hyperliquidBalance.isLoading,
223
171
  isError: hyperliquidBalance.isError,
224
- error: hyperliquidBalance.error,
225
- isDuneBalance: false
172
+ error: hyperliquidBalance.error
226
173
  };
227
174
  }
228
175
  else if (chain?.vmType === 'tvm') {
@@ -231,8 +178,7 @@ const useCurrencyBalance = ({ chain, address, currency, enabled = true, refreshI
231
178
  queryKey: tronBalance.queryKey,
232
179
  isLoading: tronBalance.isLoading,
233
180
  isError: tronBalance.isError,
234
- error: tronBalance.error,
235
- isDuneBalance: false
181
+ error: tronBalance.error
236
182
  };
237
183
  }
238
184
  else if (chain?.vmType === 'tonvm') {
@@ -241,18 +187,16 @@ const useCurrencyBalance = ({ chain, address, currency, enabled = true, refreshI
241
187
  queryKey: tonBalance.queryKey,
242
188
  isLoading: tonBalance.isLoading,
243
189
  isError: tonBalance.isError,
244
- error: tonBalance.error,
245
- isDuneBalance: false
190
+ error: tonBalance.error
246
191
  };
247
192
  }
248
193
  else {
249
194
  return {
250
195
  value: undefined,
251
- queryKey: duneBalances.queryKey,
252
- isLoading: duneBalances.isLoading,
253
- isError: duneBalances.isError,
254
- error: duneBalances.error,
255
- isDuneBalance: false
196
+ queryKey: [],
197
+ isLoading: false,
198
+ isError: false,
199
+ error: null
256
200
  };
257
201
  }
258
202
  };
@@ -1 +1 @@
1
- {"version":3,"file":"useCurrencyBalance.js","sourceRoot":"","sources":["../../../src/hooks/useCurrencyBalance.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n type Address,\n type GetBalanceErrorType,\n isAddress,\n type ReadContractErrorType,\n zeroAddress\n} from 'viem'\nimport { useBalance, useReadContract } from 'wagmi'\nimport { erc20Abi } from 'viem'\nimport type { QueryKey } from '@tanstack/react-query'\nimport type { AdaptedWallet, RelayChain } from '@relayprotocol/relay-sdk'\nimport useDuneBalances from './useDuneBalances.js'\nimport useBitcoinBalance from './useBitcoinBalance.js'\nimport useAdaptedWalletBalance from './useAdaptedWalletBalance.js'\nimport { isValidAddress } from '../utils/address.js'\nimport useRelayClient from './useRelayClient.js'\nimport useEclipseBalance from '../hooks/useEclipseBalance.js'\nimport { eclipse } from '../utils/solana.js'\nimport useHyperliquidBalance from './useHyperliquidBalance.js'\nimport useHyperliquidAccountMode from './useHyperliquidAccountMode.js'\nimport useTronBalance from '../hooks/useTronBalance.js'\nimport useTonBalance from '../hooks/useTonBalance.js'\n\ntype UseBalanceProps = {\n chain?: RelayChain\n address?: Address | string\n currency?: Address | string\n enabled?: boolean\n refreshInterval?: number\n wallet?: AdaptedWallet\n}\n\ntype UseCurrencyBalanceData = {\n value?: bigint\n queryKey: QueryKey\n isLoading: boolean\n isError: boolean | GetBalanceErrorType | null\n error: boolean | ReadContractErrorType | Error | null\n isDuneBalance: boolean\n hasPendingBalance?: boolean\n}\n\n// Handle fetching the balance of both native eth and erc20s\nconst useCurrencyBalance = ({\n chain,\n address,\n currency,\n enabled = true,\n refreshInterval = 60000,\n wallet\n}: UseBalanceProps): UseCurrencyBalanceData => {\n const isErc20Currency = currency && currency !== zeroAddress\n const isValidEvmAddress = address && isAddress(address)\n const relayClient = useRelayClient()\n const adaptedWalletBalanceIsEnabled =\n wallet?.getBalance !== undefined && wallet.vmType === chain?.vmType\n\n const adaptedWalletBalance = useAdaptedWalletBalance({\n wallet,\n chain,\n address,\n currency,\n enabled: enabled && adaptedWalletBalanceIsEnabled,\n refreshInterval\n })\n\n const {\n data: ethBalance,\n queryKey: ethBalanceQueryKey,\n isLoading: ethBalanceIsLoading,\n isError: ethError,\n error: isEthError\n } = useBalance({\n chainId: chain?.id,\n address: address as Address,\n query: {\n enabled: Boolean(\n !adaptedWalletBalanceIsEnabled &&\n !isErc20Currency &&\n chain &&\n chain.vmType === 'evm' &&\n isValidEvmAddress &&\n enabled\n ),\n refetchInterval: refreshInterval\n }\n })\n\n const {\n data: erc20Balance,\n queryKey: erc20BalanceQueryKey,\n isLoading: erc20BalanceIsLoading,\n isError: isErc20Error,\n error: erc20Error\n } = useReadContract({\n chainId: chain?.id,\n address: currency as Address,\n abi: erc20Abi,\n functionName: 'balanceOf',\n args: address ? [address as Address] : undefined,\n query: {\n enabled: Boolean(\n !adaptedWalletBalanceIsEnabled &&\n isErc20Currency &&\n chain &&\n chain.vmType === 'evm' &&\n isValidEvmAddress &&\n enabled\n ),\n refetchInterval: refreshInterval\n }\n })\n\n const _isValidAddress = isValidAddress(chain?.vmType, address, chain?.id)\n\n const duneBalances = useDuneBalances(\n address,\n relayClient?.baseApiUrl?.includes('testnet') ? 'testnet' : 'mainnet',\n {\n enabled: Boolean(\n !adaptedWalletBalanceIsEnabled &&\n chain &&\n chain.vmType === 'svm' &&\n chain.id !== eclipse.id &&\n address &&\n _isValidAddress &&\n enabled\n ),\n staleTime: refreshInterval,\n gcTime: refreshInterval\n }\n )\n\n const bitcoinBalances = useBitcoinBalance(address, {\n enabled: Boolean(\n !adaptedWalletBalanceIsEnabled &&\n chain &&\n chain.vmType === 'bvm' &&\n address &&\n _isValidAddress &&\n enabled\n ),\n gcTime: refreshInterval,\n staleTime: refreshInterval\n })\n\n const eclipseBalances = useEclipseBalance(address, {\n enabled: Boolean(\n !adaptedWalletBalanceIsEnabled &&\n chain &&\n chain.vmType === 'svm' &&\n chain.id === eclipse.id &&\n address &&\n _isValidAddress &&\n enabled\n )\n })\n\n const isHypevm = chain?.vmType === 'hypevm'\n\n const { data: hyperliquidAccountMode } = useHyperliquidAccountMode(\n address,\n Boolean(\n !adaptedWalletBalanceIsEnabled &&\n isHypevm &&\n address &&\n _isValidAddress &&\n enabled\n )\n )\n\n const hyperliquidBalance = useHyperliquidBalance(\n address,\n currency as string,\n hyperliquidAccountMode,\n {\n enabled: Boolean(\n !adaptedWalletBalanceIsEnabled &&\n isHypevm &&\n address &&\n _isValidAddress &&\n enabled\n ),\n gcTime: refreshInterval,\n staleTime: refreshInterval\n }\n )\n\n const tronBalance = useTronBalance(address, currency, {\n enabled: Boolean(\n !adaptedWalletBalanceIsEnabled &&\n chain &&\n chain.vmType === 'tvm' &&\n address &&\n _isValidAddress &&\n enabled\n ),\n gcTime: refreshInterval,\n staleTime: refreshInterval\n })\n\n const tonBalance = useTonBalance(address, chain?.httpRpcUrl, {\n enabled: Boolean(\n !adaptedWalletBalanceIsEnabled &&\n chain &&\n chain.vmType === 'tonvm' &&\n chain.httpRpcUrl &&\n address &&\n _isValidAddress &&\n enabled\n ),\n gcTime: refreshInterval,\n staleTime: refreshInterval\n })\n\n if (adaptedWalletBalanceIsEnabled) {\n return {\n value: adaptedWalletBalance.data,\n queryKey: adaptedWalletBalance.queryKey,\n isLoading: adaptedWalletBalance.isLoading,\n isError: adaptedWalletBalance.isError,\n error: adaptedWalletBalance.error,\n isDuneBalance: false\n }\n } else if (chain?.vmType === 'evm') {\n const value = isErc20Currency ? erc20Balance : ethBalance?.value\n const error = isErc20Currency ? erc20Error : ethError\n const isError = isErc20Currency ? isErc20Error : isEthError\n const queryKey = isErc20Currency ? erc20BalanceQueryKey : ethBalanceQueryKey\n const isLoading = isErc20Currency\n ? erc20BalanceIsLoading\n : ethBalanceIsLoading\n return { value, queryKey, isLoading, isError, error, isDuneBalance: false }\n } else if (chain?.vmType === 'svm') {\n let value: undefined | bigint = undefined\n let isDuneBalance = true\n let isError = false\n let error: Error | null = null\n\n if (chain.id === eclipse.id) {\n value = eclipseBalances.data?.balance\n isDuneBalance = false\n isError = eclipseBalances.isError\n error = eclipseBalances.error\n } else {\n value =\n currency &&\n duneBalances.balanceMap &&\n duneBalances.balanceMap[`${chain.id}:${currency}`] &&\n duneBalances.balanceMap[`${chain.id}:${currency}`].amount\n ? BigInt(\n duneBalances.balanceMap[`${chain.id}:${currency}`].amount ?? 0\n )\n : undefined\n isDuneBalance = true\n isError = duneBalances.isError\n error = duneBalances.error\n }\n\n if (_isValidAddress) {\n return {\n value,\n queryKey: duneBalances.queryKey,\n isLoading: duneBalances.isLoading,\n isError,\n error,\n isDuneBalance\n }\n } else {\n return {\n value: undefined,\n queryKey: duneBalances.queryKey,\n isLoading: duneBalances.isLoading,\n isError,\n error,\n isDuneBalance\n }\n }\n } else if (chain?.vmType === 'bvm') {\n if (_isValidAddress) {\n return {\n value:\n currency && bitcoinBalances.balance\n ? bitcoinBalances.balance\n : undefined,\n queryKey: bitcoinBalances.queryKey,\n isLoading: bitcoinBalances.isLoading,\n isError: bitcoinBalances.isError,\n error: bitcoinBalances.error,\n isDuneBalance: false,\n hasPendingBalance:\n bitcoinBalances.data?.pendingBalance &&\n bitcoinBalances.data?.pendingBalance > 0n\n ? true\n : false\n }\n } else {\n return {\n value: undefined,\n queryKey: bitcoinBalances.queryKey,\n isLoading: bitcoinBalances.isLoading,\n isError: bitcoinBalances.isError,\n error: bitcoinBalances.error,\n isDuneBalance: false,\n hasPendingBalance: false\n }\n }\n } else if (chain?.vmType === 'hypevm') {\n return {\n value: hyperliquidBalance.balance,\n queryKey: hyperliquidBalance.queryKey,\n isLoading: hyperliquidBalance.isLoading,\n isError: hyperliquidBalance.isError,\n error: hyperliquidBalance.error,\n isDuneBalance: false\n }\n } else if (chain?.vmType === 'tvm') {\n return {\n value: tronBalance.balance,\n queryKey: tronBalance.queryKey,\n isLoading: tronBalance.isLoading,\n isError: tronBalance.isError,\n error: tronBalance.error,\n isDuneBalance: false\n }\n } else if (chain?.vmType === 'tonvm') {\n return {\n value: tonBalance.balance,\n queryKey: tonBalance.queryKey,\n isLoading: tonBalance.isLoading,\n isError: tonBalance.isError,\n error: tonBalance.error,\n isDuneBalance: false\n }\n } else {\n return {\n value: undefined,\n queryKey: duneBalances.queryKey,\n isLoading: duneBalances.isLoading,\n isError: duneBalances.isError,\n error: duneBalances.error,\n isDuneBalance: false\n }\n }\n}\n\nexport default useCurrencyBalance\n"]}
1
+ {"version":3,"file":"useCurrencyBalance.js","sourceRoot":"","sources":["../../../src/hooks/useCurrencyBalance.ts"],"names":[],"mappings":"AAAA,OAAO,EAGL,SAAS,EAET,WAAW,EACZ,MAAM,MAAM,CAAA;AACb,OAAO,EAAE,UAAU,EAAE,eAAe,EAAE,MAAM,OAAO,CAAA;AACnD,OAAO,EAAE,QAAQ,EAAE,MAAM,MAAM,CAAA;AAG/B,OAAO,gBAAgB,MAAM,uBAAuB,CAAA;AACpD,OAAO,iBAAiB,MAAM,wBAAwB,CAAA;AACtD,OAAO,uBAAuB,MAAM,8BAA8B,CAAA;AAClE,OAAO,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAA;AACpD,OAAO,qBAAqB,MAAM,4BAA4B,CAAA;AAC9D,OAAO,yBAAyB,MAAM,gCAAgC,CAAA;AACtE,OAAO,cAAc,MAAM,4BAA4B,CAAA;AACvD,OAAO,aAAa,MAAM,2BAA2B,CAAA;AAoBrD,4DAA4D;AAC5D,MAAM,kBAAkB,GAAG,CAAC,EAC1B,KAAK,EACL,OAAO,EACP,QAAQ,EACR,OAAO,GAAG,IAAI,EACd,eAAe,GAAG,KAAK,EACvB,MAAM,EACU,EAA0B,EAAE;IAC5C,MAAM,eAAe,GAAG,QAAQ,IAAI,QAAQ,KAAK,WAAW,CAAA;IAC5D,MAAM,iBAAiB,GAAG,OAAO,IAAI,SAAS,CAAC,OAAO,CAAC,CAAA;IACvD,MAAM,6BAA6B,GACjC,MAAM,EAAE,UAAU,KAAK,SAAS,IAAI,MAAM,CAAC,MAAM,KAAK,KAAK,EAAE,MAAM,CAAA;IAErE,MAAM,oBAAoB,GAAG,uBAAuB,CAAC;QACnD,MAAM;QACN,KAAK;QACL,OAAO;QACP,QAAQ;QACR,OAAO,EAAE,OAAO,IAAI,6BAA6B;QACjD,eAAe;KAChB,CAAC,CAAA;IAEF,MAAM,EACJ,IAAI,EAAE,UAAU,EAChB,QAAQ,EAAE,kBAAkB,EAC5B,SAAS,EAAE,mBAAmB,EAC9B,OAAO,EAAE,QAAQ,EACjB,KAAK,EAAE,UAAU,EAClB,GAAG,UAAU,CAAC;QACb,OAAO,EAAE,KAAK,EAAE,EAAE;QAClB,OAAO,EAAE,OAAkB;QAC3B,KAAK,EAAE;YACL,OAAO,EAAE,OAAO,CACd,CAAC,6BAA6B;gBAC5B,CAAC,eAAe;gBAChB,KAAK;gBACL,KAAK,CAAC,MAAM,KAAK,KAAK;gBACtB,iBAAiB;gBACjB,OAAO,CACV;YACD,eAAe,EAAE,eAAe;SACjC;KACF,CAAC,CAAA;IAEF,MAAM,EACJ,IAAI,EAAE,YAAY,EAClB,QAAQ,EAAE,oBAAoB,EAC9B,SAAS,EAAE,qBAAqB,EAChC,OAAO,EAAE,YAAY,EACrB,KAAK,EAAE,UAAU,EAClB,GAAG,eAAe,CAAC;QAClB,OAAO,EAAE,KAAK,EAAE,EAAE;QAClB,OAAO,EAAE,QAAmB;QAC5B,GAAG,EAAE,QAAQ;QACb,YAAY,EAAE,WAAW;QACzB,IAAI,EAAE,OAAO,CAAC,CAAC,CAAC,CAAC,OAAkB,CAAC,CAAC,CAAC,CAAC,SAAS;QAChD,KAAK,EAAE;YACL,OAAO,EAAE,OAAO,CACd,CAAC,6BAA6B;gBAC5B,eAAe;gBACf,KAAK;gBACL,KAAK,CAAC,MAAM,KAAK,KAAK;gBACtB,iBAAiB;gBACjB,OAAO,CACV;YACD,eAAe,EAAE,eAAe;SACjC;KACF,CAAC,CAAA;IAEF,MAAM,eAAe,GAAG,cAAc,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,KAAK,EAAE,EAAE,CAAC,CAAA;IAEzE,MAAM,aAAa,GAAG,gBAAgB,CACpC,OAAO,EACP,QAAQ,CAAC,CAAC,CAAE,QAAmB,CAAC,CAAC,CAAC,SAAS,EAC3C,KAAK,EAAE,UAAU,EACjB;QACE,OAAO,EAAE,OAAO,CACd,CAAC,6BAA6B;YAC5B,KAAK;YACL,KAAK,CAAC,MAAM,KAAK,KAAK;YACtB,OAAO;YACP,eAAe;YACf,OAAO,CACV;QACD,SAAS,EAAE,eAAe;QAC1B,MAAM,EAAE,eAAe;KACxB,CACF,CAAA;IAED,MAAM,eAAe,GAAG,iBAAiB,CAAC,OAAO,EAAE;QACjD,OAAO,EAAE,OAAO,CACd,CAAC,6BAA6B;YAC5B,KAAK;YACL,KAAK,CAAC,MAAM,KAAK,KAAK;YACtB,OAAO;YACP,eAAe;YACf,OAAO,CACV;QACD,MAAM,EAAE,eAAe;QACvB,SAAS,EAAE,eAAe;KAC3B,CAAC,CAAA;IAEF,MAAM,QAAQ,GAAG,KAAK,EAAE,MAAM,KAAK,QAAQ,CAAA;IAE3C,MAAM,EAAE,IAAI,EAAE,sBAAsB,EAAE,GAAG,yBAAyB,CAChE,OAAO,EACP,OAAO,CACL,CAAC,6BAA6B;QAC5B,QAAQ;QACR,OAAO;QACP,eAAe;QACf,OAAO,CACV,CACF,CAAA;IAED,MAAM,kBAAkB,GAAG,qBAAqB,CAC9C,OAAO,EACP,QAAkB,EAClB,sBAAsB,EACtB;QACE,OAAO,EAAE,OAAO,CACd,CAAC,6BAA6B;YAC5B,QAAQ;YACR,OAAO;YACP,eAAe;YACf,OAAO,CACV;QACD,MAAM,EAAE,eAAe;QACvB,SAAS,EAAE,eAAe;KAC3B,CACF,CAAA;IAED,MAAM,WAAW,GAAG,cAAc,CAAC,OAAO,EAAE,QAAQ,EAAE;QACpD,OAAO,EAAE,OAAO,CACd,CAAC,6BAA6B;YAC5B,KAAK;YACL,KAAK,CAAC,MAAM,KAAK,KAAK;YACtB,OAAO;YACP,eAAe;YACf,OAAO,CACV;QACD,MAAM,EAAE,eAAe;QACvB,SAAS,EAAE,eAAe;KAC3B,CAAC,CAAA;IAEF,MAAM,UAAU,GAAG,aAAa,CAAC,OAAO,EAAE,KAAK,EAAE,UAAU,EAAE;QAC3D,OAAO,EAAE,OAAO,CACd,CAAC,6BAA6B;YAC5B,KAAK;YACL,KAAK,CAAC,MAAM,KAAK,OAAO;YACxB,KAAK,CAAC,UAAU;YAChB,OAAO;YACP,eAAe;YACf,OAAO,CACV;QACD,MAAM,EAAE,eAAe;QACvB,SAAS,EAAE,eAAe;KAC3B,CAAC,CAAA;IAEF,IAAI,6BAA6B,EAAE,CAAC;QAClC,OAAO;YACL,KAAK,EAAE,oBAAoB,CAAC,IAAI;YAChC,QAAQ,EAAE,oBAAoB,CAAC,QAAQ;YACvC,SAAS,EAAE,oBAAoB,CAAC,SAAS;YACzC,OAAO,EAAE,oBAAoB,CAAC,OAAO;YACrC,KAAK,EAAE,oBAAoB,CAAC,KAAK;SAClC,CAAA;IACH,CAAC;SAAM,IAAI,KAAK,EAAE,MAAM,KAAK,KAAK,EAAE,CAAC;QACnC,MAAM,KAAK,GAAG,eAAe,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,UAAU,EAAE,KAAK,CAAA;QAChE,MAAM,KAAK,GAAG,eAAe,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,QAAQ,CAAA;QACrD,MAAM,OAAO,GAAG,eAAe,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,UAAU,CAAA;QAC3D,MAAM,QAAQ,GAAG,eAAe,CAAC,CAAC,CAAC,oBAAoB,CAAC,CAAC,CAAC,kBAAkB,CAAA;QAC5E,MAAM,SAAS,GAAG,eAAe;YAC/B,CAAC,CAAC,qBAAqB;YACvB,CAAC,CAAC,mBAAmB,CAAA;QACvB,OAAO,EAAE,KAAK,EAAE,QAAQ,EAAE,SAAS,EAAE,OAAO,EAAE,KAAK,EAAE,CAAA;IACvD,CAAC;SAAM,IAAI,KAAK,EAAE,MAAM,KAAK,KAAK,EAAE,CAAC;QACnC,OAAO;YACL,KAAK,EAAE,eAAe,CAAC,CAAC,CAAC,aAAa,CAAC,OAAO,CAAC,CAAC,CAAC,SAAS;YAC1D,QAAQ,EAAE,aAAa,CAAC,QAAQ;YAChC,SAAS,EAAE,aAAa,CAAC,SAAS;YAClC,OAAO,EAAE,aAAa,CAAC,OAAO;YAC9B,KAAK,EAAE,aAAa,CAAC,KAAK;SAC3B,CAAA;IACH,CAAC;SAAM,IAAI,KAAK,EAAE,MAAM,KAAK,KAAK,EAAE,CAAC;QACnC,IAAI,eAAe,EAAE,CAAC;YACpB,OAAO;gBACL,KAAK,EACH,QAAQ,IAAI,eAAe,CAAC,OAAO;oBACjC,CAAC,CAAC,eAAe,CAAC,OAAO;oBACzB,CAAC,CAAC,SAAS;gBACf,QAAQ,EAAE,eAAe,CAAC,QAAQ;gBAClC,SAAS,EAAE,eAAe,CAAC,SAAS;gBACpC,OAAO,EAAE,eAAe,CAAC,OAAO;gBAChC,KAAK,EAAE,eAAe,CAAC,KAAK;gBAE5B,iBAAiB,EACf,eAAe,CAAC,IAAI,EAAE,cAAc;oBACpC,eAAe,CAAC,IAAI,EAAE,cAAc,GAAG,EAAE;oBACvC,CAAC,CAAC,IAAI;oBACN,CAAC,CAAC,KAAK;aACZ,CAAA;QACH,CAAC;aAAM,CAAC;YACN,OAAO;gBACL,KAAK,EAAE,SAAS;gBAChB,QAAQ,EAAE,eAAe,CAAC,QAAQ;gBAClC,SAAS,EAAE,eAAe,CAAC,SAAS;gBACpC,OAAO,EAAE,eAAe,CAAC,OAAO;gBAChC,KAAK,EAAE,eAAe,CAAC,KAAK;gBAE5B,iBAAiB,EAAE,KAAK;aACzB,CAAA;QACH,CAAC;IACH,CAAC;SAAM,IAAI,KAAK,EAAE,MAAM,KAAK,QAAQ,EAAE,CAAC;QACtC,OAAO;YACL,KAAK,EAAE,kBAAkB,CAAC,OAAO;YACjC,QAAQ,EAAE,kBAAkB,CAAC,QAAQ;YACrC,SAAS,EAAE,kBAAkB,CAAC,SAAS;YACvC,OAAO,EAAE,kBAAkB,CAAC,OAAO;YACnC,KAAK,EAAE,kBAAkB,CAAC,KAAK;SAChC,CAAA;IACH,CAAC;SAAM,IAAI,KAAK,EAAE,MAAM,KAAK,KAAK,EAAE,CAAC;QACnC,OAAO;YACL,KAAK,EAAE,WAAW,CAAC,OAAO;YAC1B,QAAQ,EAAE,WAAW,CAAC,QAAQ;YAC9B,SAAS,EAAE,WAAW,CAAC,SAAS;YAChC,OAAO,EAAE,WAAW,CAAC,OAAO;YAC5B,KAAK,EAAE,WAAW,CAAC,KAAK;SACzB,CAAA;IACH,CAAC;SAAM,IAAI,KAAK,EAAE,MAAM,KAAK,OAAO,EAAE,CAAC;QACrC,OAAO;YACL,KAAK,EAAE,UAAU,CAAC,OAAO;YACzB,QAAQ,EAAE,UAAU,CAAC,QAAQ;YAC7B,SAAS,EAAE,UAAU,CAAC,SAAS;YAC/B,OAAO,EAAE,UAAU,CAAC,OAAO;YAC3B,KAAK,EAAE,UAAU,CAAC,KAAK;SACxB,CAAA;IACH,CAAC;SAAM,CAAC;QACN,OAAO;YACL,KAAK,EAAE,SAAS;YAChB,QAAQ,EAAE,EAAE;YACZ,SAAS,EAAE,KAAK;YAChB,OAAO,EAAE,KAAK;YACd,KAAK,EAAE,IAAI;SACZ,CAAA;IACH,CAAC;AACH,CAAC,CAAA;AAED,eAAe,kBAAkB,CAAA","sourcesContent":["import {\n type Address,\n type GetBalanceErrorType,\n isAddress,\n type ReadContractErrorType,\n zeroAddress\n} from 'viem'\nimport { useBalance, useReadContract } from 'wagmi'\nimport { erc20Abi } from 'viem'\nimport type { QueryKey } from '@tanstack/react-query'\nimport type { AdaptedWallet, RelayChain } from '@relayprotocol/relay-sdk'\nimport useSolanaBalance from './useSolanaBalance.js'\nimport useBitcoinBalance from './useBitcoinBalance.js'\nimport useAdaptedWalletBalance from './useAdaptedWalletBalance.js'\nimport { isValidAddress } from '../utils/address.js'\nimport useHyperliquidBalance from './useHyperliquidBalance.js'\nimport useHyperliquidAccountMode from './useHyperliquidAccountMode.js'\nimport useTronBalance from '../hooks/useTronBalance.js'\nimport useTonBalance from '../hooks/useTonBalance.js'\n\ntype UseBalanceProps = {\n chain?: RelayChain\n address?: Address | string\n currency?: Address | string\n enabled?: boolean\n refreshInterval?: number\n wallet?: AdaptedWallet\n}\n\ntype UseCurrencyBalanceData = {\n value?: bigint\n queryKey: QueryKey\n isLoading: boolean\n isError: boolean | GetBalanceErrorType | null\n error: boolean | ReadContractErrorType | Error | null\n hasPendingBalance?: boolean\n}\n\n// Handle fetching the balance of both native eth and erc20s\nconst useCurrencyBalance = ({\n chain,\n address,\n currency,\n enabled = true,\n refreshInterval = 60000,\n wallet\n}: UseBalanceProps): UseCurrencyBalanceData => {\n const isErc20Currency = currency && currency !== zeroAddress\n const isValidEvmAddress = address && isAddress(address)\n const adaptedWalletBalanceIsEnabled =\n wallet?.getBalance !== undefined && wallet.vmType === chain?.vmType\n\n const adaptedWalletBalance = useAdaptedWalletBalance({\n wallet,\n chain,\n address,\n currency,\n enabled: enabled && adaptedWalletBalanceIsEnabled,\n refreshInterval\n })\n\n const {\n data: ethBalance,\n queryKey: ethBalanceQueryKey,\n isLoading: ethBalanceIsLoading,\n isError: ethError,\n error: isEthError\n } = useBalance({\n chainId: chain?.id,\n address: address as Address,\n query: {\n enabled: Boolean(\n !adaptedWalletBalanceIsEnabled &&\n !isErc20Currency &&\n chain &&\n chain.vmType === 'evm' &&\n isValidEvmAddress &&\n enabled\n ),\n refetchInterval: refreshInterval\n }\n })\n\n const {\n data: erc20Balance,\n queryKey: erc20BalanceQueryKey,\n isLoading: erc20BalanceIsLoading,\n isError: isErc20Error,\n error: erc20Error\n } = useReadContract({\n chainId: chain?.id,\n address: currency as Address,\n abi: erc20Abi,\n functionName: 'balanceOf',\n args: address ? [address as Address] : undefined,\n query: {\n enabled: Boolean(\n !adaptedWalletBalanceIsEnabled &&\n isErc20Currency &&\n chain &&\n chain.vmType === 'evm' &&\n isValidEvmAddress &&\n enabled\n ),\n refetchInterval: refreshInterval\n }\n })\n\n const _isValidAddress = isValidAddress(chain?.vmType, address, chain?.id)\n\n const solanaBalance = useSolanaBalance(\n address,\n currency ? (currency as string) : undefined,\n chain?.httpRpcUrl,\n {\n enabled: Boolean(\n !adaptedWalletBalanceIsEnabled &&\n chain &&\n chain.vmType === 'svm' &&\n address &&\n _isValidAddress &&\n enabled\n ),\n staleTime: refreshInterval,\n gcTime: refreshInterval\n }\n )\n\n const bitcoinBalances = useBitcoinBalance(address, {\n enabled: Boolean(\n !adaptedWalletBalanceIsEnabled &&\n chain &&\n chain.vmType === 'bvm' &&\n address &&\n _isValidAddress &&\n enabled\n ),\n gcTime: refreshInterval,\n staleTime: refreshInterval\n })\n\n const isHypevm = chain?.vmType === 'hypevm'\n\n const { data: hyperliquidAccountMode } = useHyperliquidAccountMode(\n address,\n Boolean(\n !adaptedWalletBalanceIsEnabled &&\n isHypevm &&\n address &&\n _isValidAddress &&\n enabled\n )\n )\n\n const hyperliquidBalance = useHyperliquidBalance(\n address,\n currency as string,\n hyperliquidAccountMode,\n {\n enabled: Boolean(\n !adaptedWalletBalanceIsEnabled &&\n isHypevm &&\n address &&\n _isValidAddress &&\n enabled\n ),\n gcTime: refreshInterval,\n staleTime: refreshInterval\n }\n )\n\n const tronBalance = useTronBalance(address, currency, {\n enabled: Boolean(\n !adaptedWalletBalanceIsEnabled &&\n chain &&\n chain.vmType === 'tvm' &&\n address &&\n _isValidAddress &&\n enabled\n ),\n gcTime: refreshInterval,\n staleTime: refreshInterval\n })\n\n const tonBalance = useTonBalance(address, chain?.httpRpcUrl, {\n enabled: Boolean(\n !adaptedWalletBalanceIsEnabled &&\n chain &&\n chain.vmType === 'tonvm' &&\n chain.httpRpcUrl &&\n address &&\n _isValidAddress &&\n enabled\n ),\n gcTime: refreshInterval,\n staleTime: refreshInterval\n })\n\n if (adaptedWalletBalanceIsEnabled) {\n return {\n value: adaptedWalletBalance.data,\n queryKey: adaptedWalletBalance.queryKey,\n isLoading: adaptedWalletBalance.isLoading,\n isError: adaptedWalletBalance.isError,\n error: adaptedWalletBalance.error\n }\n } else if (chain?.vmType === 'evm') {\n const value = isErc20Currency ? erc20Balance : ethBalance?.value\n const error = isErc20Currency ? erc20Error : ethError\n const isError = isErc20Currency ? isErc20Error : isEthError\n const queryKey = isErc20Currency ? erc20BalanceQueryKey : ethBalanceQueryKey\n const isLoading = isErc20Currency\n ? erc20BalanceIsLoading\n : ethBalanceIsLoading\n return { value, queryKey, isLoading, isError, error }\n } else if (chain?.vmType === 'svm') {\n return {\n value: _isValidAddress ? solanaBalance.balance : undefined,\n queryKey: solanaBalance.queryKey,\n isLoading: solanaBalance.isLoading,\n isError: solanaBalance.isError,\n error: solanaBalance.error\n }\n } else if (chain?.vmType === 'bvm') {\n if (_isValidAddress) {\n return {\n value:\n currency && bitcoinBalances.balance\n ? bitcoinBalances.balance\n : undefined,\n queryKey: bitcoinBalances.queryKey,\n isLoading: bitcoinBalances.isLoading,\n isError: bitcoinBalances.isError,\n error: bitcoinBalances.error,\n\n hasPendingBalance:\n bitcoinBalances.data?.pendingBalance &&\n bitcoinBalances.data?.pendingBalance > 0n\n ? true\n : false\n }\n } else {\n return {\n value: undefined,\n queryKey: bitcoinBalances.queryKey,\n isLoading: bitcoinBalances.isLoading,\n isError: bitcoinBalances.isError,\n error: bitcoinBalances.error,\n\n hasPendingBalance: false\n }\n }\n } else if (chain?.vmType === 'hypevm') {\n return {\n value: hyperliquidBalance.balance,\n queryKey: hyperliquidBalance.queryKey,\n isLoading: hyperliquidBalance.isLoading,\n isError: hyperliquidBalance.isError,\n error: hyperliquidBalance.error\n }\n } else if (chain?.vmType === 'tvm') {\n return {\n value: tronBalance.balance,\n queryKey: tronBalance.queryKey,\n isLoading: tronBalance.isLoading,\n isError: tronBalance.isError,\n error: tronBalance.error\n }\n } else if (chain?.vmType === 'tonvm') {\n return {\n value: tonBalance.balance,\n queryKey: tonBalance.queryKey,\n isLoading: tonBalance.isLoading,\n isError: tonBalance.isError,\n error: tonBalance.error\n }\n } else {\n return {\n value: undefined,\n queryKey: [],\n isLoading: false,\n isError: false,\n error: null\n }\n }\n}\n\nexport default useCurrencyBalance\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"useEnhancedTokensList.js","sourceRoot":"","sources":["../../../src/hooks/useEnhancedTokensList.ts"],"names":[],"mappings":"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","sourcesContent":["import { useMemo } from 'react'\nimport type { BalanceMap } from './useDuneBalances'\nimport { type Currency } from '@relayprotocol/relay-kit-hooks'\nimport { useInternalRelayChains } from '../hooks/index.js'\nimport type { ChainVM, RelayChain } from '@relayprotocol/relay-sdk'\n\nexport type EnhancedToken = {\n chainId: number\n address: string\n symbol: string\n name: string\n decimals: number\n logoURI: string\n verified?: boolean\n vmType?: ChainVM\n balance?: {\n amount: string\n price_usd?: number\n value_usd?: number\n }\n groupID?: string\n isGasCurrency?: boolean\n chain?: RelayChain\n}\n\nexport const useEnhancedTokensList = (\n tokenLists: Currency[] | undefined,\n balanceMap: BalanceMap | undefined,\n context: 'from' | 'to',\n multiWalletSupportEnabled: boolean,\n chainId?: number,\n sortByBalance: boolean = true\n): EnhancedToken[] => {\n const { chains } = useInternalRelayChains()\n\n const chainCurrencyMap = useMemo(() => {\n if (!chains) return new Map()\n return new Map(\n chains\n .filter((chain) => chain?.currency?.address)\n .map((chain) => [\n `${chain.id}:${chain.currency?.address?.toLowerCase()}`,\n true\n ])\n )\n }, [chains])\n\n return useMemo(() => {\n if (!tokenLists) return []\n\n const enhancedTokens = tokenLists\n .map((currency) => {\n // Validate that all required fields exist\n if (\n typeof currency?.chainId !== 'number' ||\n !currency?.address ||\n !currency?.symbol ||\n !currency?.name ||\n typeof currency?.decimals !== 'number'\n ) {\n return null\n }\n\n // Construct the enhanced token with all required fields\n const chain = chains?.find((c) => c.id === currency.chainId)\n const balanceKey = `${currency.chainId}:${currency.address.toLowerCase()}`\n const balance = balanceMap?.[balanceKey]\n\n const enhancedToken: EnhancedToken = {\n chainId: currency.chainId,\n address: currency.address,\n symbol: currency.symbol,\n name: currency.name,\n decimals: currency.decimals,\n logoURI: currency.metadata?.logoURI ?? '',\n verified: currency.metadata?.verified ?? false,\n vmType: currency.vmType,\n balance,\n isGasCurrency:\n currency.chainId !== 1337 &&\n chainCurrencyMap.has(\n `${currency.chainId}:${currency.address.toLowerCase()}`\n ),\n chain\n }\n\n return enhancedToken\n })\n // Remove any tokens that failed validation\n .filter((token): token is EnhancedToken => token !== null)\n // Remove duplicate tokens by chainId:address\n .filter(\n (token, index, self) =>\n index ===\n self.findIndex(\n (t) =>\n t.chainId === token.chainId &&\n t.address.toLowerCase() === token.address.toLowerCase()\n )\n )\n // Filter by chainId if specified\n .filter((token) => !chainId || token.chainId === chainId)\n // Filter out non-EVM tokens when multiWallet support is disabled\n .filter((token) => {\n if (context === 'from' && !multiWalletSupportEnabled) {\n return token.vmType === 'evm'\n }\n return true\n })\n .sort((a, b) => {\n // Only sort by USD value if sortByBalance is true\n if (sortByBalance) {\n const aValueUsd = a.balance?.value_usd ?? 0\n const bValueUsd = b.balance?.value_usd ?? 0\n if (aValueUsd !== bValueUsd) {\n return bValueUsd - aValueUsd\n }\n }\n\n // Maintain original order if not sorting by balance\n return 0\n })\n\n return enhancedTokens\n }, [\n tokenLists,\n balanceMap,\n context,\n multiWalletSupportEnabled,\n chainId,\n chainCurrencyMap,\n sortByBalance\n ])\n}\n"]}
1
+ {"version":3,"file":"useEnhancedTokensList.js","sourceRoot":"","sources":["../../../src/hooks/useEnhancedTokensList.ts"],"names":[],"mappings":"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","sourcesContent":["import { useMemo } from 'react'\nimport type { BalanceMap } from './useCodexBalances.js'\nimport { type Currency } from '@relayprotocol/relay-kit-hooks'\nimport { useInternalRelayChains } from '../hooks/index.js'\nimport type { ChainVM, RelayChain } from '@relayprotocol/relay-sdk'\n\nexport type EnhancedToken = {\n chainId: number\n address: string\n symbol: string\n name: string\n decimals: number\n logoURI: string\n verified?: boolean\n vmType?: ChainVM\n balance?: {\n amount: string\n price_usd?: number\n value_usd?: number\n }\n groupID?: string\n isGasCurrency?: boolean\n chain?: RelayChain\n}\n\nexport const useEnhancedTokensList = (\n tokenLists: Currency[] | undefined,\n balanceMap: BalanceMap | undefined,\n context: 'from' | 'to',\n multiWalletSupportEnabled: boolean,\n chainId?: number,\n sortByBalance: boolean = true\n): EnhancedToken[] => {\n const { chains } = useInternalRelayChains()\n\n const chainCurrencyMap = useMemo(() => {\n if (!chains) return new Map()\n return new Map(\n chains\n .filter((chain) => chain?.currency?.address)\n .map((chain) => [\n `${chain.id}:${chain.currency?.address?.toLowerCase()}`,\n true\n ])\n )\n }, [chains])\n\n return useMemo(() => {\n if (!tokenLists) return []\n\n const enhancedTokens = tokenLists\n .map((currency) => {\n // Validate that all required fields exist\n if (\n typeof currency?.chainId !== 'number' ||\n !currency?.address ||\n !currency?.symbol ||\n !currency?.name ||\n typeof currency?.decimals !== 'number'\n ) {\n return null\n }\n\n // Construct the enhanced token with all required fields\n const chain = chains?.find((c) => c.id === currency.chainId)\n const balanceKey = `${currency.chainId}:${currency.address.toLowerCase()}`\n const balance = balanceMap?.[balanceKey]\n\n const enhancedToken: EnhancedToken = {\n chainId: currency.chainId,\n address: currency.address,\n symbol: currency.symbol,\n name: currency.name,\n decimals: currency.decimals,\n logoURI: currency.metadata?.logoURI ?? '',\n verified: currency.metadata?.verified ?? false,\n vmType: currency.vmType,\n balance,\n isGasCurrency:\n currency.chainId !== 1337 &&\n chainCurrencyMap.has(\n `${currency.chainId}:${currency.address.toLowerCase()}`\n ),\n chain\n }\n\n return enhancedToken\n })\n // Remove any tokens that failed validation\n .filter((token): token is EnhancedToken => token !== null)\n // Remove duplicate tokens by chainId:address\n .filter(\n (token, index, self) =>\n index ===\n self.findIndex(\n (t) =>\n t.chainId === token.chainId &&\n t.address.toLowerCase() === token.address.toLowerCase()\n )\n )\n // Filter by chainId if specified\n .filter((token) => !chainId || token.chainId === chainId)\n // Filter out non-EVM tokens when multiWallet support is disabled\n .filter((token) => {\n if (context === 'from' && !multiWalletSupportEnabled) {\n return token.vmType === 'evm'\n }\n return true\n })\n .sort((a, b) => {\n // Only sort by USD value if sortByBalance is true\n if (sortByBalance) {\n const aValueUsd = a.balance?.value_usd ?? 0\n const bValueUsd = b.balance?.value_usd ?? 0\n if (aValueUsd !== bValueUsd) {\n return bValueUsd - aValueUsd\n }\n }\n\n // Maintain original order if not sorting by balance\n return 0\n })\n\n return enhancedTokens\n }, [\n tokenLists,\n balanceMap,\n context,\n multiWalletSupportEnabled,\n chainId,\n chainCurrencyMap,\n sortByBalance\n ])\n}\n"]}