@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,305 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.fetchCodexBalances = exports.getSvmNativeChains = exports.getEvmNetworkIds = exports.CODEX_SVM_NETWORK_ID = void 0;
4
+ const tslib_1 = require("tslib");
5
+ const viem_1 = require("viem");
6
+ const RelayKitProvider_js_1 = require("../providers/RelayKitProvider.js");
7
+ const react_1 = require("react");
8
+ const react_query_1 = require("@tanstack/react-query");
9
+ const solana_js_1 = require("../utils/solana.js");
10
+ const useRelayClient_js_1 = tslib_1.__importDefault(require("./useRelayClient.js"));
11
+ exports.CODEX_SVM_NETWORK_ID = 1399811149;
12
+ const SOLANA_NATIVE_ADDRESS = '11111111111111111111111111111111';
13
+ const EVM_NATIVE_ALIASES = [
14
+ viem_1.zeroAddress,
15
+ '0xeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee',
16
+ 'native'
17
+ ];
18
+ const MAX_BALANCES = 200;
19
+ const PAGE_LIMIT = 100;
20
+ const MIN_LIQUIDITY_USD = 1000;
21
+ const BALANCES_QUERY = `query WalletBalances($input: BalancesInput!) {
22
+ balances(input: $input) {
23
+ cursor
24
+ items {
25
+ balance
26
+ balanceUsd
27
+ tokenPriceUsd
28
+ liquidityUsd
29
+ tokenAddress
30
+ networkId
31
+ token {
32
+ symbol
33
+ decimals
34
+ isScam
35
+ }
36
+ }
37
+ }
38
+ }`;
39
+ const SVM_NATIVE_PRICE_TOKENS = {
40
+ [solana_js_1.solana.id]: {
41
+ address: 'So11111111111111111111111111111111111111112',
42
+ networkId: exports.CODEX_SVM_NETWORK_ID
43
+ },
44
+ [solana_js_1.eclipse.id]: {
45
+ address: '0xc02aaa39b223fe8d0a0e5c4f27ead9083c756cc2',
46
+ networkId: 1
47
+ }
48
+ };
49
+ const getEvmNetworkIds = (chains) => {
50
+ return (chains ?? [])
51
+ .filter((chain) => chain.vmType === 'evm')
52
+ .map((chain) => chain.id);
53
+ };
54
+ exports.getEvmNetworkIds = getEvmNetworkIds;
55
+ const getSvmNativeChains = (chains) => {
56
+ return (chains ?? [])
57
+ .filter((chain) => chain.vmType === 'svm')
58
+ .flatMap((chain) => chain.httpRpcUrl &&
59
+ chain.currency?.symbol &&
60
+ chain.currency?.decimals !== undefined
61
+ ? [
62
+ {
63
+ chainId: chain.id,
64
+ rpcUrl: chain.httpRpcUrl,
65
+ symbol: chain.currency.symbol,
66
+ decimals: chain.currency.decimals,
67
+ priceToken: SVM_NATIVE_PRICE_TOKENS[chain.id]
68
+ }
69
+ ]
70
+ : []);
71
+ };
72
+ exports.getSvmNativeChains = getSvmNativeChains;
73
+ const fetchSvmNativeBalances = async (address, chains) => {
74
+ return Promise.all(chains.map(async (chain) => {
75
+ try {
76
+ const response = await fetch(chain.rpcUrl, {
77
+ method: 'POST',
78
+ headers: {
79
+ 'Content-Type': 'application/json'
80
+ },
81
+ body: JSON.stringify({
82
+ jsonrpc: '2.0',
83
+ id: 1,
84
+ method: 'getBalance',
85
+ params: [address]
86
+ })
87
+ });
88
+ const data = await response.json();
89
+ if (data.error) {
90
+ return null;
91
+ }
92
+ return { chain, amount: BigInt(data.result?.value ?? 0) };
93
+ }
94
+ catch (e) {
95
+ return null;
96
+ }
97
+ }));
98
+ };
99
+ const NATIVE_PRICES_QUERY = `query NativePrices($inputs: [GetPriceInput!]!) {
100
+ getTokenPrices(inputs: $inputs) {
101
+ address
102
+ networkId
103
+ priceUsd
104
+ }
105
+ }`;
106
+ const fetchSvmNativePrices = async (apiUrl, config, chains) => {
107
+ const inputs = chains.flatMap((chain) => chain.priceToken ? [chain.priceToken] : []);
108
+ if (!inputs.length) {
109
+ return {};
110
+ }
111
+ try {
112
+ const response = await fetch(apiUrl, {
113
+ method: 'POST',
114
+ headers: {
115
+ 'Content-Type': 'application/json',
116
+ ...(config.apiKey ? { Authorization: config.apiKey } : {})
117
+ },
118
+ body: JSON.stringify({
119
+ query: NATIVE_PRICES_QUERY,
120
+ variables: { inputs }
121
+ })
122
+ });
123
+ const json = await response.json();
124
+ const prices = {};
125
+ json.data?.getTokenPrices?.forEach((price) => {
126
+ if (price?.priceUsd !== undefined && price?.priceUsd !== null) {
127
+ prices[`${price.networkId}:${price.address}`] = price.priceUsd;
128
+ }
129
+ });
130
+ return prices;
131
+ }
132
+ catch (e) {
133
+ return {};
134
+ }
135
+ };
136
+ const normalizeAddress = (networkId, tokenAddress) => {
137
+ if (networkId === exports.CODEX_SVM_NETWORK_ID) {
138
+ return tokenAddress === 'native' ? SOLANA_NATIVE_ADDRESS : tokenAddress;
139
+ }
140
+ return EVM_NATIVE_ALIASES.includes(tokenAddress.toLowerCase())
141
+ ? viem_1.zeroAddress
142
+ : tokenAddress.toLowerCase();
143
+ };
144
+ const toNumber = (value) => {
145
+ if (value === undefined || value === null) {
146
+ return undefined;
147
+ }
148
+ const parsed = Number(value);
149
+ return Number.isFinite(parsed) ? parsed : undefined;
150
+ };
151
+ const fetchCodexBalances = async (address, config, networks, svmNativeChains) => {
152
+ const apiUrl = `${config.apiBaseUrl ?? 'https://graph.codex.io'}/graphql`;
153
+ const items = [];
154
+ let cursor = null;
155
+ while (items.length < MAX_BALANCES) {
156
+ const response = await fetch(apiUrl, {
157
+ method: 'POST',
158
+ headers: {
159
+ 'Content-Type': 'application/json',
160
+ ...(config.apiKey ? { Authorization: config.apiKey } : {})
161
+ },
162
+ body: JSON.stringify({
163
+ query: BALANCES_QUERY,
164
+ variables: {
165
+ input: {
166
+ walletAddress: address,
167
+ includeNative: true,
168
+ removeScams: true,
169
+ sortBy: 'USD_VALUE',
170
+ sortDirection: 'DESC',
171
+ limit: PAGE_LIMIT,
172
+ networks,
173
+ ...(cursor ? { cursor } : {})
174
+ }
175
+ }
176
+ })
177
+ });
178
+ if (!response.ok) {
179
+ throw new Error(`Failed to fetch balances for ${address}`);
180
+ }
181
+ const json = await response.json();
182
+ if (json.errors?.length) {
183
+ throw new Error(json.errors[0]?.message ?? `Failed to fetch balances for ${address}`);
184
+ }
185
+ const page = json.data?.balances;
186
+ if (!page?.items?.length) {
187
+ break;
188
+ }
189
+ items.push(...page.items);
190
+ cursor = page.cursor;
191
+ if (!cursor) {
192
+ break;
193
+ }
194
+ }
195
+ const balances = items.reduce((balances, item) => {
196
+ const decimals = item.token?.decimals;
197
+ const symbol = item.token?.symbol;
198
+ if (typeof decimals !== 'number' || !symbol || item.token?.isScam) {
199
+ return balances;
200
+ }
201
+ try {
202
+ BigInt(item.balance);
203
+ }
204
+ catch (e) {
205
+ return balances;
206
+ }
207
+ const address = normalizeAddress(item.networkId, item.tokenAddress);
208
+ const isNative = address === viem_1.zeroAddress || address === SOLANA_NATIVE_ADDRESS;
209
+ let price_usd = toNumber(item.tokenPriceUsd);
210
+ let value_usd = toNumber(item.balanceUsd);
211
+ const liquidityUsd = toNumber(item.liquidityUsd);
212
+ if (!isNative &&
213
+ liquidityUsd !== undefined &&
214
+ (liquidityUsd < MIN_LIQUIDITY_USD ||
215
+ (value_usd !== undefined && value_usd > liquidityUsd))) {
216
+ price_usd = undefined;
217
+ value_usd = undefined;
218
+ }
219
+ balances.push({
220
+ chain_id: item.networkId === exports.CODEX_SVM_NETWORK_ID ? solana_js_1.solana.id : item.networkId,
221
+ address,
222
+ amount: item.balance,
223
+ symbol,
224
+ decimals,
225
+ price_usd,
226
+ value_usd
227
+ });
228
+ return balances;
229
+ }, []);
230
+ if (svmNativeChains?.length) {
231
+ const [nativeBalances, nativePrices] = await Promise.all([
232
+ fetchSvmNativeBalances(address, svmNativeChains),
233
+ fetchSvmNativePrices(apiUrl, config, svmNativeChains)
234
+ ]);
235
+ nativeBalances.forEach((native) => {
236
+ if (!native) {
237
+ return;
238
+ }
239
+ const priceToken = native.chain.priceToken;
240
+ const priceUsd = priceToken
241
+ ? nativePrices[`${priceToken.networkId}:${priceToken.address}`]
242
+ : undefined;
243
+ const existing = balances.find((balance) => balance.chain_id === native.chain.chainId &&
244
+ balance.address === SOLANA_NATIVE_ADDRESS);
245
+ if (existing) {
246
+ const price = existing.price_usd ?? priceUsd;
247
+ existing.amount = native.amount.toString();
248
+ if (price !== undefined) {
249
+ existing.price_usd = price;
250
+ existing.value_usd =
251
+ price * Number((0, viem_1.formatUnits)(native.amount, existing.decimals));
252
+ }
253
+ }
254
+ else if (native.amount > BigInt(0)) {
255
+ balances.push({
256
+ chain_id: native.chain.chainId,
257
+ address: SOLANA_NATIVE_ADDRESS,
258
+ amount: native.amount.toString(),
259
+ symbol: native.chain.symbol,
260
+ decimals: native.chain.decimals,
261
+ price_usd: priceUsd,
262
+ value_usd: priceUsd !== undefined
263
+ ? priceUsd *
264
+ Number((0, viem_1.formatUnits)(native.amount, native.chain.decimals))
265
+ : undefined
266
+ });
267
+ }
268
+ });
269
+ }
270
+ return { balances };
271
+ };
272
+ exports.fetchCodexBalances = fetchCodexBalances;
273
+ exports.default = (address, queryOptions) => {
274
+ const providerOptions = (0, react_1.useContext)(RelayKitProvider_js_1.ProviderOptionsContext);
275
+ const relayClient = (0, useRelayClient_js_1.default)();
276
+ const codexConfig = providerOptions.codexConfig;
277
+ const queryKey = ['useCodexBalances', address];
278
+ const isEvmAddress = (0, viem_1.isAddress)(address ?? '');
279
+ const isSvmAddress = (0, solana_js_1.isSolanaAddress)(address ?? '');
280
+ const networks = isSvmAddress
281
+ ? [exports.CODEX_SVM_NETWORK_ID]
282
+ : (0, exports.getEvmNetworkIds)(relayClient?.chains);
283
+ const response = react_query_1.useQuery({
284
+ queryKey,
285
+ queryFn: () => {
286
+ if (!address || (!isSvmAddress && !isEvmAddress)) {
287
+ return null;
288
+ }
289
+ return (0, exports.fetchCodexBalances)(address, codexConfig ?? {}, networks, isSvmAddress ? (0, exports.getSvmNativeChains)(relayClient?.chains) : undefined);
290
+ },
291
+ ...queryOptions,
292
+ enabled: address !== undefined &&
293
+ networks.length > 0 &&
294
+ (codexConfig?.apiKey !== undefined ||
295
+ codexConfig?.apiBaseUrl !== undefined) &&
296
+ queryOptions?.enabled &&
297
+ (isSvmAddress || isEvmAddress)
298
+ });
299
+ const balanceMap = response?.data?.balances?.reduce((balanceMap, balance) => {
300
+ balanceMap[`${balance.chain_id}:${balance.address.toLowerCase()}`] = balance;
301
+ return balanceMap;
302
+ }, {});
303
+ return { ...response, balanceMap, queryKey };
304
+ };
305
+ //# 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"]}
@@ -4,13 +4,10 @@ const tslib_1 = require("tslib");
4
4
  const viem_1 = require("viem");
5
5
  const wagmi_1 = require("wagmi");
6
6
  const viem_2 = require("viem");
7
- const useDuneBalances_js_1 = tslib_1.__importDefault(require("./useDuneBalances.js"));
7
+ const useSolanaBalance_js_1 = tslib_1.__importDefault(require("./useSolanaBalance.js"));
8
8
  const useBitcoinBalance_js_1 = tslib_1.__importDefault(require("./useBitcoinBalance.js"));
9
9
  const useAdaptedWalletBalance_js_1 = tslib_1.__importDefault(require("./useAdaptedWalletBalance.js"));
10
10
  const address_js_1 = require("../utils/address.js");
11
- const useRelayClient_js_1 = tslib_1.__importDefault(require("./useRelayClient.js"));
12
- const useEclipseBalance_js_1 = tslib_1.__importDefault(require("../hooks/useEclipseBalance.js"));
13
- const solana_js_1 = require("../utils/solana.js");
14
11
  const useHyperliquidBalance_js_1 = tslib_1.__importDefault(require("./useHyperliquidBalance.js"));
15
12
  const useHyperliquidAccountMode_js_1 = tslib_1.__importDefault(require("./useHyperliquidAccountMode.js"));
16
13
  const useTronBalance_js_1 = tslib_1.__importDefault(require("../hooks/useTronBalance.js"));
@@ -18,7 +15,6 @@ const useTonBalance_js_1 = tslib_1.__importDefault(require("../hooks/useTonBalan
18
15
  const useCurrencyBalance = ({ chain, address, currency, enabled = true, refreshInterval = 60000, wallet }) => {
19
16
  const isErc20Currency = currency && currency !== viem_1.zeroAddress;
20
17
  const isValidEvmAddress = address && (0, viem_1.isAddress)(address);
21
- const relayClient = (0, useRelayClient_js_1.default)();
22
18
  const adaptedWalletBalanceIsEnabled = wallet?.getBalance !== undefined && wallet.vmType === chain?.vmType;
23
19
  const adaptedWalletBalance = (0, useAdaptedWalletBalance_js_1.default)({
24
20
  wallet,
@@ -58,11 +54,10 @@ const useCurrencyBalance = ({ chain, address, currency, enabled = true, refreshI
58
54
  }
59
55
  });
60
56
  const _isValidAddress = (0, address_js_1.isValidAddress)(chain?.vmType, address, chain?.id);
61
- const duneBalances = (0, useDuneBalances_js_1.default)(address, relayClient?.baseApiUrl?.includes('testnet') ? 'testnet' : 'mainnet', {
57
+ const solanaBalance = (0, useSolanaBalance_js_1.default)(address, currency ? currency : undefined, chain?.httpRpcUrl, {
62
58
  enabled: Boolean(!adaptedWalletBalanceIsEnabled &&
63
59
  chain &&
64
60
  chain.vmType === 'svm' &&
65
- chain.id !== solana_js_1.eclipse.id &&
66
61
  address &&
67
62
  _isValidAddress &&
68
63
  enabled),
@@ -79,15 +74,6 @@ const useCurrencyBalance = ({ chain, address, currency, enabled = true, refreshI
79
74
  gcTime: refreshInterval,
80
75
  staleTime: refreshInterval
81
76
  });
82
- const eclipseBalances = (0, useEclipseBalance_js_1.default)(address, {
83
- enabled: Boolean(!adaptedWalletBalanceIsEnabled &&
84
- chain &&
85
- chain.vmType === 'svm' &&
86
- chain.id === solana_js_1.eclipse.id &&
87
- address &&
88
- _isValidAddress &&
89
- enabled)
90
- });
91
77
  const isHypevm = chain?.vmType === 'hypevm';
92
78
  const { data: hyperliquidAccountMode } = (0, useHyperliquidAccountMode_js_1.default)(address, Boolean(!adaptedWalletBalanceIsEnabled &&
93
79
  isHypevm &&
@@ -130,8 +116,7 @@ const useCurrencyBalance = ({ chain, address, currency, enabled = true, refreshI
130
116
  queryKey: adaptedWalletBalance.queryKey,
131
117
  isLoading: adaptedWalletBalance.isLoading,
132
118
  isError: adaptedWalletBalance.isError,
133
- error: adaptedWalletBalance.error,
134
- isDuneBalance: false
119
+ error: adaptedWalletBalance.error
135
120
  };
136
121
  }
137
122
  else if (chain?.vmType === 'evm') {
@@ -142,51 +127,16 @@ const useCurrencyBalance = ({ chain, address, currency, enabled = true, refreshI
142
127
  const isLoading = isErc20Currency
143
128
  ? erc20BalanceIsLoading
144
129
  : ethBalanceIsLoading;
145
- return { value, queryKey, isLoading, isError, error, isDuneBalance: false };
130
+ return { value, queryKey, isLoading, isError, error };
146
131
  }
147
132
  else if (chain?.vmType === 'svm') {
148
- let value = undefined;
149
- let isDuneBalance = true;
150
- let isError = false;
151
- let error = null;
152
- if (chain.id === solana_js_1.eclipse.id) {
153
- value = eclipseBalances.data?.balance;
154
- isDuneBalance = false;
155
- isError = eclipseBalances.isError;
156
- error = eclipseBalances.error;
157
- }
158
- else {
159
- value =
160
- currency &&
161
- duneBalances.balanceMap &&
162
- duneBalances.balanceMap[`${chain.id}:${currency}`] &&
163
- duneBalances.balanceMap[`${chain.id}:${currency}`].amount
164
- ? BigInt(duneBalances.balanceMap[`${chain.id}:${currency}`].amount ?? 0)
165
- : undefined;
166
- isDuneBalance = true;
167
- isError = duneBalances.isError;
168
- error = duneBalances.error;
169
- }
170
- if (_isValidAddress) {
171
- return {
172
- value,
173
- queryKey: duneBalances.queryKey,
174
- isLoading: duneBalances.isLoading,
175
- isError,
176
- error,
177
- isDuneBalance
178
- };
179
- }
180
- else {
181
- return {
182
- value: undefined,
183
- queryKey: duneBalances.queryKey,
184
- isLoading: duneBalances.isLoading,
185
- isError,
186
- error,
187
- isDuneBalance
188
- };
189
- }
133
+ return {
134
+ value: _isValidAddress ? solanaBalance.balance : undefined,
135
+ queryKey: solanaBalance.queryKey,
136
+ isLoading: solanaBalance.isLoading,
137
+ isError: solanaBalance.isError,
138
+ error: solanaBalance.error
139
+ };
190
140
  }
191
141
  else if (chain?.vmType === 'bvm') {
192
142
  if (_isValidAddress) {
@@ -198,7 +148,6 @@ const useCurrencyBalance = ({ chain, address, currency, enabled = true, refreshI
198
148
  isLoading: bitcoinBalances.isLoading,
199
149
  isError: bitcoinBalances.isError,
200
150
  error: bitcoinBalances.error,
201
- isDuneBalance: false,
202
151
  hasPendingBalance: bitcoinBalances.data?.pendingBalance &&
203
152
  bitcoinBalances.data?.pendingBalance > 0n
204
153
  ? true
@@ -212,7 +161,6 @@ const useCurrencyBalance = ({ chain, address, currency, enabled = true, refreshI
212
161
  isLoading: bitcoinBalances.isLoading,
213
162
  isError: bitcoinBalances.isError,
214
163
  error: bitcoinBalances.error,
215
- isDuneBalance: false,
216
164
  hasPendingBalance: false
217
165
  };
218
166
  }
@@ -223,8 +171,7 @@ const useCurrencyBalance = ({ chain, address, currency, enabled = true, refreshI
223
171
  queryKey: hyperliquidBalance.queryKey,
224
172
  isLoading: hyperliquidBalance.isLoading,
225
173
  isError: hyperliquidBalance.isError,
226
- error: hyperliquidBalance.error,
227
- isDuneBalance: false
174
+ error: hyperliquidBalance.error
228
175
  };
229
176
  }
230
177
  else if (chain?.vmType === 'tvm') {
@@ -233,8 +180,7 @@ const useCurrencyBalance = ({ chain, address, currency, enabled = true, refreshI
233
180
  queryKey: tronBalance.queryKey,
234
181
  isLoading: tronBalance.isLoading,
235
182
  isError: tronBalance.isError,
236
- error: tronBalance.error,
237
- isDuneBalance: false
183
+ error: tronBalance.error
238
184
  };
239
185
  }
240
186
  else if (chain?.vmType === 'tonvm') {
@@ -243,18 +189,16 @@ const useCurrencyBalance = ({ chain, address, currency, enabled = true, refreshI
243
189
  queryKey: tonBalance.queryKey,
244
190
  isLoading: tonBalance.isLoading,
245
191
  isError: tonBalance.isError,
246
- error: tonBalance.error,
247
- isDuneBalance: false
192
+ error: tonBalance.error
248
193
  };
249
194
  }
250
195
  else {
251
196
  return {
252
197
  value: undefined,
253
- queryKey: duneBalances.queryKey,
254
- isLoading: duneBalances.isLoading,
255
- isError: duneBalances.isError,
256
- error: duneBalances.error,
257
- isDuneBalance: false
198
+ queryKey: [],
199
+ isLoading: false,
200
+ isError: false,
201
+ error: null
258
202
  };
259
203
  }
260
204
  };
@@ -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":"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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 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"]}