@0xsquid/react-hooks 6.7.0-rollup-beta.0 → 6.7.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 (258) hide show
  1. package/dist/core/abis/ics20.json +128 -0
  2. package/dist/core/connectors/bitcoin/errors/index.js +22 -0
  3. package/dist/core/connectors/bitcoin/errors/index.js.map +1 -0
  4. package/dist/core/connectors/bitcoin/helpers.js +86 -0
  5. package/dist/core/connectors/bitcoin/helpers.js.map +1 -0
  6. package/dist/core/connectors/bitcoin/index.js +2 -0
  7. package/dist/core/connectors/bitcoin/index.js.map +1 -0
  8. package/dist/core/connectors/bitcoin/wallets/index.js +4 -0
  9. package/dist/core/connectors/bitcoin/wallets/index.js.map +1 -0
  10. package/dist/core/connectors/bitcoin/wallets/keplr.js +28 -0
  11. package/dist/core/connectors/bitcoin/wallets/keplr.js.map +1 -0
  12. package/dist/core/connectors/bitcoin/wallets/phantom.js +56 -0
  13. package/dist/core/connectors/bitcoin/wallets/phantom.js.map +1 -0
  14. package/dist/core/connectors/bitcoin/wallets/unisat.js +28 -0
  15. package/dist/core/connectors/bitcoin/wallets/unisat.js.map +1 -0
  16. package/dist/core/constants.js +144 -0
  17. package/dist/core/constants.js.map +1 -0
  18. package/dist/core/externalLinks.js +21 -0
  19. package/dist/core/externalLinks.js.map +1 -0
  20. package/dist/core/index.js +4 -0
  21. package/dist/core/index.js.map +1 -0
  22. package/dist/core/multicall3.js +442 -0
  23. package/dist/core/multicall3.js.map +1 -0
  24. package/dist/core/providers/CosmosProvider.js +13 -0
  25. package/dist/core/providers/CosmosProvider.js.map +1 -0
  26. package/dist/core/providers/SolanaProvider.js +15 -0
  27. package/dist/core/providers/SolanaProvider.js.map +1 -0
  28. package/dist/core/providers/SuiProvider.js +15 -0
  29. package/dist/core/providers/SuiProvider.js.map +1 -0
  30. package/dist/core/queries/queries-keys.d.ts +2 -2
  31. package/dist/core/queries/queries-keys.js +206 -0
  32. package/dist/core/queries/queries-keys.js.map +1 -0
  33. package/dist/core/queries/react-query-config.js +11 -0
  34. package/dist/core/queries/react-query-config.js.map +1 -0
  35. package/dist/core/types/config.d.ts +2 -0
  36. package/dist/core/types/config.js +2 -0
  37. package/dist/core/types/config.js.map +1 -0
  38. package/dist/core/types/dex.js +33 -0
  39. package/dist/core/types/dex.js.map +1 -0
  40. package/dist/core/types/error.js +12 -0
  41. package/dist/core/types/error.js.map +1 -0
  42. package/dist/core/types/event.d.ts +5 -0
  43. package/dist/core/types/event.js +2 -0
  44. package/dist/core/types/event.js.map +1 -0
  45. package/dist/core/types/index.js +2 -0
  46. package/dist/core/types/index.js.map +1 -0
  47. package/dist/core/types/rpc.js +2 -0
  48. package/dist/core/types/rpc.js.map +1 -0
  49. package/dist/core/types/sui.js +2 -0
  50. package/dist/core/types/sui.js.map +1 -0
  51. package/dist/core/types/swap.js +2 -0
  52. package/dist/core/types/swap.js.map +1 -0
  53. package/dist/core/types/tokens.js +2 -0
  54. package/dist/core/types/tokens.js.map +1 -0
  55. package/dist/core/types/transaction.js +41 -0
  56. package/dist/core/types/transaction.js.map +1 -0
  57. package/dist/core/types/wallet.js +26 -0
  58. package/dist/core/types/wallet.js.map +1 -0
  59. package/dist/core/wagmiConfig.js +60 -0
  60. package/dist/core/wagmiConfig.js.map +1 -0
  61. package/dist/core/wallets.js +549 -0
  62. package/dist/core/wallets.js.map +1 -0
  63. package/dist/hooks/analytics/useTrackSearchEmpty.d.ts +12 -0
  64. package/dist/hooks/analytics/useTrackSearchEmpty.js +22 -0
  65. package/dist/hooks/analytics/useTrackSearchEmpty.js.map +1 -0
  66. package/dist/hooks/chains/useSquidChains.js +107 -0
  67. package/dist/hooks/chains/useSquidChains.js.map +1 -0
  68. package/dist/hooks/client/useClient.js +6 -0
  69. package/dist/hooks/client/useClient.js.map +1 -0
  70. package/dist/hooks/cosmos/useCosmos.js +172 -0
  71. package/dist/hooks/cosmos/useCosmos.js.map +1 -0
  72. package/dist/hooks/cosmos/useCosmosForChain.js +33 -0
  73. package/dist/hooks/cosmos/useCosmosForChain.js.map +1 -0
  74. package/dist/hooks/index.d.ts +5 -5
  75. package/dist/hooks/index.js +45 -0
  76. package/dist/hooks/index.js.map +1 -0
  77. package/dist/hooks/navigation/useKeyboardNavigation.js +67 -0
  78. package/dist/hooks/navigation/useKeyboardNavigation.js.map +1 -0
  79. package/dist/hooks/query/useSquidQueryClient.js +23 -0
  80. package/dist/hooks/query/useSquidQueryClient.js.map +1 -0
  81. package/dist/hooks/solana/useSolana.js +104 -0
  82. package/dist/hooks/solana/useSolana.js.map +1 -0
  83. package/dist/hooks/squid/useSquid.js +55 -0
  84. package/dist/hooks/squid/useSquid.js.map +1 -0
  85. package/dist/hooks/store/useAddressBookStore.js +26 -0
  86. package/dist/hooks/store/useAddressBookStore.js.map +1 -0
  87. package/dist/hooks/store/useAssetsColorsStore.js +7 -0
  88. package/dist/hooks/store/useAssetsColorsStore.js.map +1 -0
  89. package/dist/hooks/store/useDepositAddressStore.js +12 -0
  90. package/dist/hooks/store/useDepositAddressStore.js.map +1 -0
  91. package/dist/hooks/store/useFavoriteTokensStore.js +28 -0
  92. package/dist/hooks/store/useFavoriteTokensStore.js.map +1 -0
  93. package/dist/hooks/store/useHistoryStore.js +41 -0
  94. package/dist/hooks/store/useHistoryStore.js.map +1 -0
  95. package/dist/hooks/store/useSquidStore.js +56 -0
  96. package/dist/hooks/store/useSquidStore.js.map +1 -0
  97. package/dist/hooks/store/useWalletStore.js +42 -0
  98. package/dist/hooks/store/useWalletStore.js.map +1 -0
  99. package/dist/hooks/sui/useSui.js +28 -0
  100. package/dist/hooks/sui/useSui.js.map +1 -0
  101. package/dist/hooks/sui/useSuiClient.js +16 -0
  102. package/dist/hooks/sui/useSuiClient.js.map +1 -0
  103. package/dist/hooks/sui/useSuiWallets.js +42 -0
  104. package/dist/hooks/sui/useSuiWallets.js.map +1 -0
  105. package/dist/hooks/swap/useDepositAddress.js +63 -0
  106. package/dist/hooks/swap/useDepositAddress.js.map +1 -0
  107. package/dist/hooks/swap/useSwap.js +209 -0
  108. package/dist/hooks/swap/useSwap.js.map +1 -0
  109. package/dist/hooks/tokens/useAllConnectedWalletBalances.js +103 -0
  110. package/dist/hooks/tokens/useAllConnectedWalletBalances.js.map +1 -0
  111. package/dist/hooks/tokens/useAllTokensWithBalanceForChainType.js +119 -0
  112. package/dist/hooks/tokens/useAllTokensWithBalanceForChainType.js.map +1 -0
  113. package/dist/hooks/tokens/useBalance.js +136 -0
  114. package/dist/hooks/tokens/useBalance.js.map +1 -0
  115. package/dist/hooks/tokens/useMultiChainBalance.js +68 -0
  116. package/dist/hooks/tokens/useMultiChainBalance.js.map +1 -0
  117. package/dist/hooks/tokens/useMultipleTokenPrices.js +46 -0
  118. package/dist/hooks/tokens/useMultipleTokenPrices.js.map +1 -0
  119. package/dist/hooks/tokens/useNativeBalance.js +217 -0
  120. package/dist/hooks/tokens/useNativeBalance.js.map +1 -0
  121. package/dist/hooks/tokens/useNativeTokenForChain.js +28 -0
  122. package/dist/hooks/tokens/useNativeTokenForChain.js.map +1 -0
  123. package/dist/hooks/tokens/useSingleTokenPrice.js +38 -0
  124. package/dist/hooks/tokens/useSingleTokenPrice.js.map +1 -0
  125. package/dist/hooks/tokens/useSquidTokens.js +80 -0
  126. package/dist/hooks/tokens/useSquidTokens.js.map +1 -0
  127. package/dist/hooks/tokens/useTokenHistoricalData.js +23 -0
  128. package/dist/hooks/tokens/useTokenHistoricalData.js.map +1 -0
  129. package/dist/hooks/transaction/useAllTransactionsStatus.js +68 -0
  130. package/dist/hooks/transaction/useAllTransactionsStatus.js.map +1 -0
  131. package/dist/hooks/transaction/useApproval.js +223 -0
  132. package/dist/hooks/transaction/useApproval.js.map +1 -0
  133. package/dist/hooks/transaction/useErc20Allowance.js +43 -0
  134. package/dist/hooks/transaction/useErc20Allowance.js.map +1 -0
  135. package/dist/hooks/transaction/useEstimate.js +118 -0
  136. package/dist/hooks/transaction/useEstimate.js.map +1 -0
  137. package/dist/hooks/transaction/useEstimatePriceImpact.js +31 -0
  138. package/dist/hooks/transaction/useEstimatePriceImpact.js.map +1 -0
  139. package/dist/hooks/transaction/useExecuteTransaction.js +605 -0
  140. package/dist/hooks/transaction/useExecuteTransaction.js.map +1 -0
  141. package/dist/hooks/transaction/useGetRoute.d.ts +3 -0
  142. package/dist/hooks/transaction/useGetRoute.js +230 -0
  143. package/dist/hooks/transaction/useGetRoute.js.map +1 -0
  144. package/dist/hooks/transaction/useIcs20Allowance.js +40 -0
  145. package/dist/hooks/transaction/useIcs20Allowance.js.map +1 -0
  146. package/dist/hooks/transaction/useRouteWarnings.js +19 -0
  147. package/dist/hooks/transaction/useRouteWarnings.js.map +1 -0
  148. package/dist/hooks/transaction/useSingleTransaction.js +91 -0
  149. package/dist/hooks/transaction/useSingleTransaction.js.map +1 -0
  150. package/dist/hooks/user/useAvatar.js +34 -0
  151. package/dist/hooks/user/useAvatar.js.map +1 -0
  152. package/dist/hooks/user/useHistory.js +106 -0
  153. package/dist/hooks/user/useHistory.js.map +1 -0
  154. package/dist/hooks/user/useUserParams.js +33 -0
  155. package/dist/hooks/user/useUserParams.js.map +1 -0
  156. package/dist/hooks/wallet/useAddToken.js +49 -0
  157. package/dist/hooks/wallet/useAddToken.js.map +1 -0
  158. package/dist/hooks/wallet/useAutoConnect.js +74 -0
  159. package/dist/hooks/wallet/useAutoConnect.js.map +1 -0
  160. package/dist/hooks/wallet/useEns.js +69 -0
  161. package/dist/hooks/wallet/useEns.js.map +1 -0
  162. package/dist/hooks/wallet/useGnosisContext.js +78 -0
  163. package/dist/hooks/wallet/useGnosisContext.js.map +1 -0
  164. package/dist/hooks/wallet/useIntegratorContext.js +39 -0
  165. package/dist/hooks/wallet/useIntegratorContext.js.map +1 -0
  166. package/dist/hooks/wallet/useMultiChainWallet.js +175 -0
  167. package/dist/hooks/wallet/useMultiChainWallet.js.map +1 -0
  168. package/dist/hooks/wallet/useSigner.js +76 -0
  169. package/dist/hooks/wallet/useSigner.js.map +1 -0
  170. package/dist/hooks/wallet/useWallet.js +206 -0
  171. package/dist/hooks/wallet/useWallet.js.map +1 -0
  172. package/dist/hooks/wallet/useWallets.js +36 -0
  173. package/dist/hooks/wallet/useWallets.js.map +1 -0
  174. package/dist/index.js +6 -17096
  175. package/dist/index.js.map +1 -1
  176. package/dist/provider/index.js +113 -0
  177. package/dist/provider/index.js.map +1 -0
  178. package/dist/services/external/ens.js +66 -0
  179. package/dist/services/external/ens.js.map +1 -0
  180. package/dist/services/external/rpcService.js +421 -0
  181. package/dist/services/external/rpcService.js.map +1 -0
  182. package/dist/{secretService-SEqSyHG0.js → services/external/secretService.js} +8 -37
  183. package/dist/services/external/secretService.js.map +1 -0
  184. package/dist/services/external/suiRpcClient.js +80 -0
  185. package/dist/services/external/suiRpcClient.js.map +1 -0
  186. package/dist/services/external/tokenDataService.js +108 -0
  187. package/dist/services/external/tokenDataService.js.map +1 -0
  188. package/dist/services/index.js +16 -0
  189. package/dist/services/index.js.map +1 -0
  190. package/dist/services/internal/apiService.js +21 -0
  191. package/dist/services/internal/apiService.js.map +1 -0
  192. package/dist/services/internal/assetsService.js +586 -0
  193. package/dist/services/internal/assetsService.js.map +1 -0
  194. package/dist/services/internal/bitcoinService.js +51 -0
  195. package/dist/services/internal/bitcoinService.js.map +1 -0
  196. package/dist/services/internal/configService.js +218 -0
  197. package/dist/services/internal/configService.js.map +1 -0
  198. package/dist/services/internal/cosmosService.js +141 -0
  199. package/dist/services/internal/cosmosService.js.map +1 -0
  200. package/dist/services/internal/errorService.js +188 -0
  201. package/dist/services/internal/errorService.js.map +1 -0
  202. package/dist/services/internal/estimateService.js +221 -0
  203. package/dist/services/internal/estimateService.js.map +1 -0
  204. package/dist/services/internal/eventService.d.ts +5 -0
  205. package/dist/services/internal/eventService.js +163 -0
  206. package/dist/services/internal/eventService.js.map +1 -0
  207. package/dist/services/internal/evmService.js +42 -0
  208. package/dist/services/internal/evmService.js.map +1 -0
  209. package/dist/services/internal/numberService.js +171 -0
  210. package/dist/services/internal/numberService.js.map +1 -0
  211. package/dist/services/internal/priceService.js +53 -0
  212. package/dist/services/internal/priceService.js.map +1 -0
  213. package/dist/services/internal/searchService.js +98 -0
  214. package/dist/services/internal/searchService.js.map +1 -0
  215. package/dist/services/internal/solanaService.js +109 -0
  216. package/dist/services/internal/solanaService.js.map +1 -0
  217. package/dist/services/internal/suiService.js +119 -0
  218. package/dist/services/internal/suiService.js.map +1 -0
  219. package/dist/services/internal/transactionService.js +207 -0
  220. package/dist/services/internal/transactionService.js.map +1 -0
  221. package/dist/services/internal/transactionStatusService.js +315 -0
  222. package/dist/services/internal/transactionStatusService.js.map +1 -0
  223. package/dist/services/internal/walletService.js +464 -0
  224. package/dist/services/internal/walletService.js.map +1 -0
  225. package/dist/tests/apiService.test.js +40 -0
  226. package/dist/tests/apiService.test.js.map +1 -0
  227. package/dist/tests/assetsService.test.js +500 -0
  228. package/dist/tests/assetsService.test.js.map +1 -0
  229. package/dist/tests/configService.test.js +673 -0
  230. package/dist/tests/configService.test.js.map +1 -0
  231. package/dist/tests/estimateService.test.js +355 -0
  232. package/dist/tests/estimateService.test.js.map +1 -0
  233. package/dist/tests/fetchSquidData.js +36 -0
  234. package/dist/tests/fetchSquidData.js.map +1 -0
  235. package/dist/tests/jest-svg-transform.d.ts +0 -0
  236. package/dist/tests/jest-svg-transform.js +21 -0
  237. package/dist/tests/jest-svg-transform.js.map +1 -0
  238. package/dist/tests/numberService.test.js +135 -0
  239. package/dist/tests/numberService.test.js.map +1 -0
  240. package/dist/tests/priceService.test.js +38 -0
  241. package/dist/tests/priceService.test.js.map +1 -0
  242. package/dist/tests/sample.json +0 -0
  243. package/dist/tests/searchService.test.js +92 -0
  244. package/dist/tests/searchService.test.js.map +1 -0
  245. package/dist/tests/swapConfig.test.js +332 -0
  246. package/dist/tests/swapConfig.test.js.map +1 -0
  247. package/dist/tests/transactionService.test.js +53 -0
  248. package/dist/tests/transactionService.test.js.map +1 -0
  249. package/dist/tests/transactionStatusService.test.js +165 -0
  250. package/dist/tests/transactionStatusService.test.js.map +1 -0
  251. package/dist/tests/walletService.test.js +264 -0
  252. package/dist/tests/walletService.test.js.map +1 -0
  253. package/package.json +4 -18
  254. package/dist/index.esm.js +0 -16892
  255. package/dist/index.esm.js.map +0 -1
  256. package/dist/secretService-Cc7emxDy.js +0 -162
  257. package/dist/secretService-Cc7emxDy.js.map +0 -1
  258. package/dist/secretService-SEqSyHG0.js.map +0 -1
@@ -0,0 +1,113 @@
1
+ import { Squid } from "@0xsquid/sdk";
2
+ import { QueryClient, QueryClientProvider } from "@tanstack/react-query";
3
+ import React, { useCallback, useEffect, useRef, useState } from "react";
4
+ import { mainnet } from "viem/chains";
5
+ import { createConfig, http, WagmiProvider } from "wagmi";
6
+ import { injected } from "wagmi/connectors";
7
+ import { squidApiBaseUrl } from "../core/externalLinks";
8
+ import { CosmosProvider } from "../core/providers/CosmosProvider";
9
+ import { SolanaProvider } from "../core/providers/SolanaProvider";
10
+ import { SuiProvider } from "../core/providers/SuiProvider";
11
+ import { defaultOptions } from "../core/queries/react-query-config";
12
+ import { createWagmiConfig } from "../core/wagmiConfig";
13
+ import { useAssetsColorsStore } from "../hooks/store/useAssetsColorsStore";
14
+ import { useConfigStore, useSquidStore, useSwapRoutePersistStore, } from "../hooks/store/useSquidStore";
15
+ import { fetchAssetsColors, initializeSquidWithAssetsColors, isEmptyObject, } from "../services";
16
+ import { getConfigWithDefaults } from "../services/internal/configService";
17
+ const queryClient = new QueryClient({ defaultOptions });
18
+ const verifyIntegratorIdValidity = (integratorId) => {
19
+ if (!integratorId) {
20
+ throw new Error("Integrator ID is required");
21
+ }
22
+ };
23
+ export const SquidProvider = ({ children, config, placeholder, }) => {
24
+ verifyIntegratorIdValidity(config.integratorId);
25
+ const [wagmiConfig, setWagmiConfig] = useState();
26
+ const sdkInitializedRef = useRef(false);
27
+ const initializeSdk = useCallback(async () => {
28
+ if (sdkInitializedRef.current) {
29
+ return;
30
+ }
31
+ sdkInitializedRef.current = true;
32
+ try {
33
+ const squid = new Squid({
34
+ integratorId: config.integratorId,
35
+ baseUrl: config.apiUrl ?? squidApiBaseUrl,
36
+ });
37
+ const [sdkInfoResponse, assetsColorsResponse] = await Promise.allSettled([
38
+ squid.init(),
39
+ fetchAssetsColors(),
40
+ ]);
41
+ if (sdkInfoResponse.status === "rejected") {
42
+ throw sdkInfoResponse.reason;
43
+ }
44
+ if (assetsColorsResponse.status === "fulfilled") {
45
+ useAssetsColorsStore.setState(assetsColorsResponse.value);
46
+ initializeSquidWithAssetsColors(squid, assetsColorsResponse.value);
47
+ }
48
+ const shouldResetSwapRouteStore =
49
+ // reset swap route if specified in config
50
+ !config?.loadPreviousStateFromLocalStorage ||
51
+ // or if initial assets are provided
52
+ !isEmptyObject(config.initialAssets?.from) ||
53
+ !isEmptyObject(config.initialAssets?.to);
54
+ if (shouldResetSwapRouteStore) {
55
+ useSwapRoutePersistStore.setState({
56
+ swapRoute: undefined,
57
+ destinationAddressHasBeenUpdated: undefined,
58
+ });
59
+ }
60
+ useSquidStore.setState((_) => ({
61
+ squid,
62
+ maintenanceMode: { active: false, message: undefined },
63
+ }));
64
+ const newWagmiConfig = createWagmiConfig(squid.chains);
65
+ setWagmiConfig(newWagmiConfig);
66
+ useConfigStore.setState({
67
+ isInitialized: true,
68
+ config: getConfigWithDefaults(config),
69
+ });
70
+ }
71
+ catch (error) {
72
+ const isAxios503Error = error.isAxiosError &&
73
+ error.response?.status === 503;
74
+ if (isAxios503Error) {
75
+ const maintenanceMessage = error.response?.data
76
+ ?.message ?? undefined;
77
+ // Even with an error, we want wagmi to be defined so that we can display the maintenance mode layout
78
+ // Create wagmi config with mainnet as fallback in maintenance mode
79
+ const newWagmiConfig = createConfig({
80
+ chains: [mainnet],
81
+ connectors: [injected()],
82
+ transports: {
83
+ [mainnet.id]: http(),
84
+ },
85
+ });
86
+ setWagmiConfig(newWagmiConfig);
87
+ useConfigStore.setState({
88
+ isInitialized: false,
89
+ config: getConfigWithDefaults(config),
90
+ });
91
+ useSquidStore.setState({
92
+ squid: undefined,
93
+ maintenanceMode: {
94
+ active: true,
95
+ message: maintenanceMessage,
96
+ },
97
+ });
98
+ }
99
+ else {
100
+ console.error("Error initializing SDK:", error);
101
+ }
102
+ }
103
+ }, [config]);
104
+ useEffect(() => {
105
+ initializeSdk();
106
+ }, [initializeSdk]);
107
+ return wagmiConfig ? (React.createElement(WagmiProvider, { config: wagmiConfig },
108
+ React.createElement(QueryClientProvider, { client: queryClient },
109
+ React.createElement(SuiProvider, null,
110
+ React.createElement(SolanaProvider, null,
111
+ React.createElement(CosmosProvider, null, children)))))) : (placeholder);
112
+ };
113
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/provider/index.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,cAAc,CAAC;AACrC,OAAO,EAAE,WAAW,EAAE,mBAAmB,EAAE,MAAM,uBAAuB,CAAC;AAEzE,OAAO,KAAK,EAAE,EAAE,WAAW,EAAE,SAAS,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAC;AACxE,OAAO,EAAE,OAAO,EAAE,MAAM,aAAa,CAAC;AACtC,OAAO,EAAU,YAAY,EAAE,IAAI,EAAE,aAAa,EAAE,MAAM,OAAO,CAAC;AAClE,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAC5C,OAAO,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AACxD,OAAO,EAAE,cAAc,EAAE,MAAM,kCAAkC,CAAC;AAClE,OAAO,EAAE,cAAc,EAAE,MAAM,kCAAkC,CAAC;AAClE,OAAO,EAAE,WAAW,EAAE,MAAM,+BAA+B,CAAC;AAC5D,OAAO,EAAE,cAAc,EAAE,MAAM,oCAAoC,CAAC;AAEpE,OAAO,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAC;AACxD,OAAO,EAAE,oBAAoB,EAAE,MAAM,qCAAqC,CAAC;AAC3E,OAAO,EACL,cAAc,EACd,aAAa,EACb,wBAAwB,GACzB,MAAM,8BAA8B,CAAC;AACtC,OAAO,EACL,iBAAiB,EACjB,+BAA+B,EAC/B,aAAa,GACd,MAAM,aAAa,CAAC;AACrB,OAAO,EAAE,qBAAqB,EAAE,MAAM,oCAAoC,CAAC;AAQ3E,MAAM,WAAW,GAAG,IAAI,WAAW,CAAC,EAAE,cAAc,EAAE,CAAC,CAAC;AAExD,MAAM,0BAA0B,GAAG,CAAC,YAAoB,EAAE,EAAE;IAC1D,IAAI,CAAC,YAAY,EAAE;QACjB,MAAM,IAAI,KAAK,CAAC,2BAA2B,CAAC,CAAC;KAC9C;AACH,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,aAAa,GAAgC,CAAC,EACzD,QAAQ,EACR,MAAM,EACN,WAAW,GACO,EAAE,EAAE;IACtB,0BAA0B,CAAC,MAAM,CAAC,YAAY,CAAC,CAAC;IAEhD,MAAM,CAAC,WAAW,EAAE,cAAc,CAAC,GAAG,QAAQ,EAAsB,CAAC;IAErE,MAAM,iBAAiB,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC;IAExC,MAAM,aAAa,GAAG,WAAW,CAAC,KAAK,IAAI,EAAE;QAC3C,IAAI,iBAAiB,CAAC,OAAO,EAAE;YAC7B,OAAO;SACR;QACD,iBAAiB,CAAC,OAAO,GAAG,IAAI,CAAC;QAEjC,IAAI;YACF,MAAM,KAAK,GAAG,IAAI,KAAK,CAAC;gBACtB,YAAY,EAAE,MAAM,CAAC,YAAY;gBACjC,OAAO,EAAE,MAAM,CAAC,MAAM,IAAI,eAAe;aAC1C,CAAC,CAAC;YAEH,MAAM,CAAC,eAAe,EAAE,oBAAoB,CAAC,GAAG,MAAM,OAAO,CAAC,UAAU,CAAC;gBACvE,KAAK,CAAC,IAAI,EAAE;gBACZ,iBAAiB,EAAE;aACpB,CAAC,CAAC;YAEH,IAAI,eAAe,CAAC,MAAM,KAAK,UAAU,EAAE;gBACzC,MAAM,eAAe,CAAC,MAAM,CAAC;aAC9B;YAED,IAAI,oBAAoB,CAAC,MAAM,KAAK,WAAW,EAAE;gBAC/C,oBAAoB,CAAC,QAAQ,CAAC,oBAAoB,CAAC,KAAK,CAAC,CAAC;gBAC1D,+BAA+B,CAAC,KAAK,EAAE,oBAAoB,CAAC,KAAK,CAAC,CAAC;aACpE;YAED,MAAM,yBAAyB;YAC7B,0CAA0C;YAC1C,CAAC,MAAM,EAAE,iCAAiC;gBAC1C,oCAAoC;gBACpC,CAAC,aAAa,CAAC,MAAM,CAAC,aAAa,EAAE,IAAI,CAAC;gBAC1C,CAAC,aAAa,CAAC,MAAM,CAAC,aAAa,EAAE,EAAE,CAAC,CAAC;YAE3C,IAAI,yBAAyB,EAAE;gBAC7B,wBAAwB,CAAC,QAAQ,CAAC;oBAChC,SAAS,EAAE,SAAS;oBACpB,gCAAgC,EAAE,SAAS;iBAC5C,CAAC,CAAC;aACJ;YAED,aAAa,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;gBAC7B,KAAK;gBACL,eAAe,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,EAAE,SAAS,EAAE;aACvD,CAAC,CAAC,CAAC;YAEJ,MAAM,cAAc,GAAG,iBAAiB,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;YACvD,cAAc,CAAC,cAAc,CAAC,CAAC;YAE/B,cAAc,CAAC,QAAQ,CAAC;gBACtB,aAAa,EAAE,IAAI;gBACnB,MAAM,EAAE,qBAAqB,CAAC,MAAM,CAAC;aACtC,CAAC,CAAC;SACJ;QAAC,OAAO,KAAK,EAAE;YACd,MAAM,eAAe,GAClB,KAAoB,CAAC,YAAY;gBACjC,KAAoB,CAAC,QAAQ,EAAE,MAAM,KAAK,GAAG,CAAC;YAEjD,IAAI,eAAe,EAAE;gBACnB,MAAM,kBAAkB,GACpB,KAAoB,CAAC,QAAQ,EAAE,IAA6B;oBAC5D,EAAE,OAAO,IAAI,SAAS,CAAC;gBAE3B,qGAAqG;gBACrG,mEAAmE;gBACnE,MAAM,cAAc,GAAG,YAAY,CAAC;oBAClC,MAAM,EAAE,CAAC,OAAO,CAAC;oBACjB,UAAU,EAAE,CAAC,QAAQ,EAAE,CAAC;oBACxB,UAAU,EAAE;wBACV,CAAC,OAAO,CAAC,EAAE,CAAC,EAAE,IAAI,EAAE;qBACrB;iBACF,CAAC,CAAC;gBACH,cAAc,CAAC,cAAc,CAAC,CAAC;gBAE/B,cAAc,CAAC,QAAQ,CAAC;oBACtB,aAAa,EAAE,KAAK;oBACpB,MAAM,EAAE,qBAAqB,CAAC,MAAM,CAAC;iBACtC,CAAC,CAAC;gBAEH,aAAa,CAAC,QAAQ,CAAC;oBACrB,KAAK,EAAE,SAAS;oBAChB,eAAe,EAAE;wBACf,MAAM,EAAE,IAAI;wBACZ,OAAO,EAAE,kBAAkB;qBAC5B;iBACF,CAAC,CAAC;aACJ;iBAAM;gBACL,OAAO,CAAC,KAAK,CAAC,yBAAyB,EAAE,KAAK,CAAC,CAAC;aACjD;SACF;IACH,CAAC,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC;IAEb,SAAS,CAAC,GAAG,EAAE;QACb,aAAa,EAAE,CAAC;IAClB,CAAC,EAAE,CAAC,aAAa,CAAC,CAAC,CAAC;IAEpB,OAAO,WAAW,CAAC,CAAC,CAAC,CACnB,oBAAC,aAAa,IAAC,MAAM,EAAE,WAAW;QAChC,oBAAC,mBAAmB,IAAC,MAAM,EAAE,WAAW;YACtC,oBAAC,WAAW;gBACV,oBAAC,cAAc;oBACb,oBAAC,cAAc,QAAE,QAAQ,CAAkB,CAC5B,CACL,CACM,CACR,CACjB,CAAC,CAAC,CAAC,CACF,WAAW,CACZ,CAAC;AACJ,CAAC,CAAC"}
@@ -0,0 +1,66 @@
1
+ import { CloudflareProvider } from "ethers";
2
+ import { internalSquidApiBaseUrl } from "../../core/constants";
3
+ const provider = new CloudflareProvider();
4
+ const API_BASE_URL = `${internalSquidApiBaseUrl}/ens`;
5
+ const getAvatarFromEns = async (ensName) => {
6
+ if (!ensName)
7
+ return;
8
+ try {
9
+ const resolver = await provider.getResolver(ensName);
10
+ return await resolver?.getText("avatar");
11
+ }
12
+ catch (error) { }
13
+ };
14
+ const getEnsDataFromAddress = async (address) => {
15
+ if (!address)
16
+ return {};
17
+ try {
18
+ const ensName = await provider.lookupAddress(address);
19
+ if (!ensName)
20
+ return {};
21
+ const avatar = await getAvatarFromEns(ensName);
22
+ return { name: ensName, avatar };
23
+ }
24
+ catch (error) {
25
+ return {};
26
+ }
27
+ };
28
+ export class EnsService {
29
+ static async getEnsDataFromAddress(address) {
30
+ if (!address)
31
+ return {};
32
+ try {
33
+ const ensData = await getEnsDataFromAddress(address);
34
+ return ensData;
35
+ }
36
+ catch (error) {
37
+ console.error("Error fetching ENS data:", error);
38
+ return {};
39
+ }
40
+ }
41
+ static async searchEnsNames(partialName) {
42
+ if (!partialName)
43
+ return [];
44
+ try {
45
+ const response = await fetch(`${API_BASE_URL}?action=searchEnsNames&query=${encodeURIComponent(partialName)}`);
46
+ return await response.json();
47
+ }
48
+ catch (error) {
49
+ console.error("Error searching ENS names:", error);
50
+ return [];
51
+ }
52
+ }
53
+ static async getExactEns(exactEns) {
54
+ if (!exactEns)
55
+ return [];
56
+ try {
57
+ const response = await fetch(`${API_BASE_URL}?action=getExactEns&query=${encodeURIComponent(exactEns)}`);
58
+ return await response.json();
59
+ }
60
+ catch (error) {
61
+ console.error("Error fetching exact ENS:", error);
62
+ return [];
63
+ }
64
+ }
65
+ }
66
+ //# sourceMappingURL=ens.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ens.js","sourceRoot":"","sources":["../../../src/services/external/ens.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,kBAAkB,EAAE,MAAM,QAAQ,CAAC;AAE5C,OAAO,EAAE,uBAAuB,EAAE,MAAM,sBAAsB,CAAC;AAE/D,MAAM,QAAQ,GAAG,IAAI,kBAAkB,EAAE,CAAC;AAC1C,MAAM,YAAY,GAAG,GAAG,uBAAuB,MAAM,CAAC;AAEtD,MAAM,gBAAgB,GAAG,KAAK,EAAE,OAAgB,EAAE,EAAE;IAClD,IAAI,CAAC,OAAO;QAAE,OAAO;IACrB,IAAI;QACF,MAAM,QAAQ,GAAG,MAAM,QAAQ,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC;QACrD,OAAO,MAAM,QAAQ,EAAE,OAAO,CAAC,QAAQ,CAAC,CAAC;KAC1C;IAAC,OAAO,KAAK,EAAE,GAAE;AACpB,CAAC,CAAC;AAEF,MAAM,qBAAqB,GAAG,KAAK,EAAE,OAAgB,EAAE,EAAE;IACvD,IAAI,CAAC,OAAO;QAAE,OAAO,EAAE,CAAC;IACxB,IAAI;QACF,MAAM,OAAO,GAAG,MAAM,QAAQ,CAAC,aAAa,CAAC,OAAO,CAAC,CAAC;QACtD,IAAI,CAAC,OAAO;YAAE,OAAO,EAAE,CAAC;QACxB,MAAM,MAAM,GAAG,MAAM,gBAAgB,CAAC,OAAO,CAAC,CAAC;QAC/C,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,EAAE,CAAC;KAClC;IAAC,OAAO,KAAK,EAAE;QACd,OAAO,EAAE,CAAC;KACX;AACH,CAAC,CAAC;AAEF,MAAM,OAAO,UAAU;IACrB,MAAM,CAAC,KAAK,CAAC,qBAAqB,CAAC,OAAgB;QACjD,IAAI,CAAC,OAAO;YAAE,OAAO,EAAE,CAAC;QAExB,IAAI;YACF,MAAM,OAAO,GAAG,MAAM,qBAAqB,CAAC,OAAO,CAAC,CAAC;YACrD,OAAO,OAAkB,CAAC;SAC3B;QAAC,OAAO,KAAK,EAAE;YACd,OAAO,CAAC,KAAK,CAAC,0BAA0B,EAAE,KAAK,CAAC,CAAC;YACjD,OAAO,EAAE,CAAC;SACX;IACH,CAAC;IAED,MAAM,CAAC,KAAK,CAAC,cAAc,CACzB,WAAoB;QAEpB,IAAI,CAAC,WAAW;YAAE,OAAO,EAAE,CAAC;QAE5B,IAAI;YACF,MAAM,QAAQ,GAAG,MAAM,KAAK,CAC1B,GAAG,YAAY,gCAAgC,kBAAkB,CAAC,WAAW,CAAC,EAAE,CACjF,CAAC;YACF,OAAO,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC;SAC9B;QAAC,OAAO,KAAK,EAAE;YACd,OAAO,CAAC,KAAK,CAAC,4BAA4B,EAAE,KAAK,CAAC,CAAC;YACnD,OAAO,EAAE,CAAC;SACX;IACH,CAAC;IAED,MAAM,CAAC,KAAK,CAAC,WAAW,CAAC,QAAiB;QACxC,IAAI,CAAC,QAAQ;YAAE,OAAO,EAAE,CAAC;QAEzB,IAAI;YACF,MAAM,QAAQ,GAAG,MAAM,KAAK,CAC1B,GAAG,YAAY,6BAA6B,kBAAkB,CAAC,QAAQ,CAAC,EAAE,CAC3E,CAAC;YACF,OAAO,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC;SAC9B;QAAC,OAAO,KAAK,EAAE;YACd,OAAO,CAAC,KAAK,CAAC,2BAA2B,EAAE,KAAK,CAAC,CAAC;YAClD,OAAO,EAAE,CAAC;SACX;IACH,CAAC;CACF"}
@@ -0,0 +1,421 @@
1
+ import { ChainType, } from "@0xsquid/squid-types";
2
+ import { StargateClient } from "@cosmjs/stargate";
3
+ import { CHAIN_IDS, nativeEvmTokenAddress, nativeSolanaTokenAddress, SOLANA_RPC_URL, } from "../../core/constants";
4
+ import { multicallAbi, multicallAddress } from "../../core/multicall3";
5
+ import { ethers, Interface, JsonRpcProvider } from "ethers";
6
+ import { erc20Abi } from "viem";
7
+ import { normalizeIbcAddress } from "../internal/assetsService";
8
+ import { isBitcoinAddressValid } from "../internal/bitcoinService";
9
+ import { formatBNToReadable } from "../internal/numberService";
10
+ import { SuiRpcClient } from "./suiRpcClient";
11
+ const isTokenNative = (token) => token.address.toLowerCase() === nativeEvmTokenAddress.toLowerCase();
12
+ const getTokenAddressForMultiCall = (t) => {
13
+ return isTokenNative(t)
14
+ ? multicallAddress
15
+ : t.address;
16
+ };
17
+ const getTokenBalanceCall = (token, userAddress) => {
18
+ const address = getTokenAddressForMultiCall(token);
19
+ const abi = isTokenNative(token) ? multicallAbi : erc20Abi;
20
+ const method = isTokenNative(token) ? "getEthBalance" : "balanceOf";
21
+ const iface = new Interface(abi);
22
+ const callData = iface.encodeFunctionData(method, [userAddress]);
23
+ return [address, callData];
24
+ };
25
+ /**
26
+ * Using Multicall3 contract, available on a lot of chains
27
+ * @param multicall
28
+ * @param calls
29
+ * @param tokens
30
+ * @returns
31
+ */
32
+ const executeMulticall = async (multicall, calls, tokens) => {
33
+ try {
34
+ const results = await multicall.tryAggregate.staticCall(false, calls);
35
+ const tokenWithResult = tokens.map((token, index) => ({
36
+ token,
37
+ result: { success: results[index][0], returnData: results[index][1] },
38
+ }));
39
+ return tokenWithResult;
40
+ }
41
+ catch (error) {
42
+ return tokens.map((token) => ({
43
+ token,
44
+ result: { success: false, returnData: "" },
45
+ }));
46
+ }
47
+ };
48
+ /**
49
+ * Format balance using ethers, based on success of the call
50
+ * If the call fails, we return 0 as balance
51
+ * @param results
52
+ * @returns
53
+ */
54
+ const formatBalanceForTokens = (results) => {
55
+ return results.map((data) => {
56
+ const token = data.token;
57
+ const result = data.result;
58
+ if (!result.success) {
59
+ return { ...token, balance: "0" };
60
+ }
61
+ try {
62
+ return {
63
+ ...token,
64
+ balance: formatBNToReadable(BigInt(result.returnData), token.decimals),
65
+ };
66
+ }
67
+ catch {
68
+ return {
69
+ ...token,
70
+ balance: "0",
71
+ };
72
+ }
73
+ });
74
+ };
75
+ export const getTokensSupportingMultiCall = async (tokens, userAddress, chains) => {
76
+ // Create providers for each chain
77
+ const providers = {};
78
+ chains.forEach((chain) => {
79
+ providers[chain.chainId] = new JsonRpcProvider(chain.rpc);
80
+ });
81
+ const fetchBalancesForChain = async (chain) => {
82
+ const tokensForChain = tokens.filter((t) => t.chainId === chain.chainId);
83
+ if (tokensForChain.length === 0)
84
+ return [];
85
+ const provider = providers[chain.chainId];
86
+ if (!provider) {
87
+ return [
88
+ ...tokensForChain.map((t) => ({
89
+ ...t,
90
+ balance: "0",
91
+ })),
92
+ ];
93
+ }
94
+ const multicall = new ethers.Contract(multicallAddress, multicallAbi, provider);
95
+ const calls = tokensForChain.map((token) => getTokenBalanceCall(token, userAddress));
96
+ const multicallResults = await executeMulticall(multicall, calls, tokensForChain);
97
+ return formatBalanceForTokens(multicallResults);
98
+ };
99
+ const allResults = await Promise.all(chains.map((chain) => fetchBalancesForChain(chain)));
100
+ return allResults.flat();
101
+ };
102
+ export const getAllEvmTokensBalance = async (evmTokens, userAddress, chains) => {
103
+ const tokensMulticall = await getTokensSupportingMultiCall(evmTokens, userAddress, chains);
104
+ return tokensMulticall;
105
+ };
106
+ /**
107
+ * We'll get the current block of a given RPC to see if we can query it
108
+ * Without getting CORS error or any other error
109
+ * @param rpc
110
+ * @returns
111
+ */
112
+ const testCosmosRpc = async (rpc) => {
113
+ let rpcIsValid = false;
114
+ try {
115
+ const client = await StargateClient.connect(rpc);
116
+ const block = await client.getBlock();
117
+ rpcIsValid = !!block.id;
118
+ }
119
+ catch (error) {
120
+ rpcIsValid = false;
121
+ }
122
+ return rpcIsValid;
123
+ };
124
+ export const getWorkingCosmosRpcUrl = async (chainData) => {
125
+ if (chainData.chainType !== ChainType.COSMOS)
126
+ return chainData.rpc;
127
+ const chain = chainData;
128
+ const rpcList = chain.rpcList.length > 0 ? chain.rpcList : chain.rpc ? [chain.rpc] : [];
129
+ // if rpcList is empty, use the default rpc
130
+ if (rpcList.length === 0) {
131
+ try {
132
+ const isValid = await testCosmosRpc(chain.rpc);
133
+ if (isValid) {
134
+ return chain.rpc;
135
+ }
136
+ }
137
+ catch (error) {
138
+ console.error(`Error fetching rpc url: ${chain.rpc} - Error: ${error?.toString()}`);
139
+ }
140
+ }
141
+ // if rpcList is not empty, try to fetch each rpc until we find a valid one
142
+ for (const rpc of rpcList) {
143
+ try {
144
+ // eslint-disable-next-line no-await-in-loop
145
+ const isValid = await timeout(5_000, testCosmosRpc(rpc));
146
+ if (isValid) {
147
+ return rpc;
148
+ }
149
+ }
150
+ catch (error) {
151
+ console.error(`Error fetching rpc url: ${chain.rpc} - Error: ${error?.toString()}`);
152
+ }
153
+ }
154
+ // In the case that all rpcs are invalid, return the default rpc anyway
155
+ return chain.rpc;
156
+ };
157
+ /**
158
+ * Get the balance of a single token for a given address
159
+ * @param chain - Cosmos chain
160
+ * @param address - user address
161
+ * @param tokenAddress - token address
162
+ * @returns balance as formatted string
163
+ */
164
+ export const getCosmosTokenBalance = async (chain, address, tokenAddress) => {
165
+ const validRpc = await getWorkingCosmosRpcUrl(chain);
166
+ if (!validRpc)
167
+ return "0";
168
+ const client = await StargateClient.connect(validRpc);
169
+ const balance = await client.getBalance(address, tokenAddress);
170
+ return balance.amount;
171
+ };
172
+ /**
173
+ * Fetches all Cosmos balances for a given address and RPC.
174
+ *
175
+ * @param {string} params.rpc - RPC URL to fetch balances from.
176
+ * @param {string} params.address - user address to fetch balances for.
177
+ * @param {Token[]} params.tokens - array of Cosmos tokens.
178
+ * @returns {Promise<TokenWithBalance[]>} promise that resolves to an array of tokens with their balances.
179
+ */
180
+ export const getAllCosmosBalancesForChain = async ({ rpc, address, tokens, }) => {
181
+ const client = await StargateClient.connect(rpc);
182
+ const balanceAsCoin = await client.getAllBalances(address);
183
+ // Need to map tokens and put balance, based on denom
184
+ const tokensWithBalance = tokens.map((t) => {
185
+ const balanceCoin = balanceAsCoin?.find((c) => c.denom === normalizeIbcAddress(t.address));
186
+ return {
187
+ ...t,
188
+ balance: balanceCoin
189
+ ? formatBNToReadable(BigInt(balanceCoin?.amount), t?.decimals)
190
+ : "0",
191
+ };
192
+ });
193
+ return tokensWithBalance;
194
+ };
195
+ /**
196
+ * Fetches all Cosmos balances for a given address and RPC.
197
+ *
198
+ * @param {object} params.addresses user addresses per cosmos network
199
+ * @param {Token[]} params.cosmosTokens
200
+ * @param {CosmosChain[]} params.cosmosChains
201
+ * @returns {Promise<TokenWithBalance[]>} All tokens with their balances.
202
+ */
203
+ export const getAllCosmosBalances = async ({ addresses, cosmosTokens, cosmosChains, }) => {
204
+ const tokensWithBalance = [];
205
+ await Promise.all(cosmosChains.map(async (cosmosChain) => {
206
+ const userAddress = addresses.find((a) => a.chainId === cosmosChain.chainId)?.address;
207
+ const tokensForChain = cosmosTokens.filter((t) => t.chainId === cosmosChain.chainId);
208
+ if (!userAddress) {
209
+ tokensWithBalance.push(...tokensForChain.map((t) => ({ ...t, balance: "0" })));
210
+ return;
211
+ }
212
+ try {
213
+ // These are networks that were not working with the default rpc.cosmos.directory
214
+ const specialNetworks = [
215
+ CHAIN_IDS.INJECTIVE,
216
+ CHAIN_IDS.OSMOSIS,
217
+ CHAIN_IDS.C4E,
218
+ CHAIN_IDS.KAVA_IBC,
219
+ CHAIN_IDS.TERRA,
220
+ CHAIN_IDS.SEI,
221
+ CHAIN_IDS.FETCH,
222
+ CHAIN_IDS.SECRET,
223
+ CHAIN_IDS.KI,
224
+ CHAIN_IDS.UMEE,
225
+ CHAIN_IDS.PERSISTENCE,
226
+ CHAIN_IDS.MIGALOO,
227
+ ];
228
+ let rpc;
229
+ if (specialNetworks.includes(cosmosChain.chainId)) {
230
+ // try to get a working rpc url
231
+ const validRpc = await timeout(3_000, getWorkingCosmosRpcUrl(cosmosChain));
232
+ // fallback to the default chain rpc
233
+ rpc = validRpc ?? cosmosChain.rpc;
234
+ }
235
+ else {
236
+ switch (cosmosChain.networkIdentifier) {
237
+ case "axelarnet":
238
+ rpc = `https://rpc.cosmos.directory/axelar`;
239
+ break;
240
+ case "sentinel":
241
+ rpc = `https://rpc.sentinel.chaintools.tech`;
242
+ break;
243
+ default:
244
+ rpc = `https://rpc.cosmos.directory/${cosmosChain.networkIdentifier}`;
245
+ break;
246
+ }
247
+ }
248
+ const balances = await timeout(6_000, getAllCosmosBalancesForChain({
249
+ rpc,
250
+ address: userAddress,
251
+ tokens: tokensForChain,
252
+ }));
253
+ if (balances) {
254
+ tokensWithBalance.push(...balances);
255
+ }
256
+ else {
257
+ tokensWithBalance.push(...tokensForChain.map((t) => ({ ...t, balance: "0" })));
258
+ }
259
+ }
260
+ catch (error) {
261
+ console.warn(`Failed to fetch balances for chain ${cosmosChain.chainId}:`, error);
262
+ tokensWithBalance.push(...tokensForChain.map((t) => ({ ...t, balance: "0" })));
263
+ }
264
+ }));
265
+ return tokensWithBalance;
266
+ };
267
+ export const getSolanaNativeBalance = async (userAddress) => {
268
+ const response = await fetch(SOLANA_RPC_URL, {
269
+ method: "POST",
270
+ headers: { "Content-Type": "application/json" },
271
+ body: JSON.stringify({
272
+ jsonrpc: "2.0",
273
+ id: 1,
274
+ method: "getBalance",
275
+ params: [userAddress],
276
+ }),
277
+ });
278
+ const data = await response.json();
279
+ return BigInt(data.result?.value || 0);
280
+ };
281
+ export const getSolanaTokenBalance = async (userAddress, tokenAddress) => {
282
+ if (tokenAddress.toLowerCase() === nativeSolanaTokenAddress.toLowerCase()) {
283
+ return getSolanaNativeBalance(userAddress);
284
+ }
285
+ const response = await fetch(SOLANA_RPC_URL, {
286
+ method: "POST",
287
+ headers: { "Content-Type": "application/json" },
288
+ body: JSON.stringify({
289
+ jsonrpc: "2.0",
290
+ id: 1,
291
+ method: "getTokenAccountsByOwner",
292
+ params: [
293
+ userAddress,
294
+ { programId: "TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA" },
295
+ { encoding: "jsonParsed" },
296
+ ],
297
+ }),
298
+ });
299
+ const data = await response.json();
300
+ const tokenAccount = data.result?.value?.find((acc) => acc.account.data.parsed.info.mint.toLowerCase() ===
301
+ tokenAddress.toLowerCase());
302
+ return BigInt(tokenAccount?.account.data.parsed.info.tokenAmount.amount || 0);
303
+ };
304
+ export const getSolanaTokensBalance = async (userAddress, tokenAddresses) => {
305
+ const response = await fetch(SOLANA_RPC_URL, {
306
+ method: "POST",
307
+ headers: { "Content-Type": "application/json" },
308
+ body: JSON.stringify({
309
+ jsonrpc: "2.0",
310
+ id: 1,
311
+ method: "getTokenAccountsByOwner",
312
+ params: [
313
+ userAddress,
314
+ { programId: "TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA" },
315
+ { encoding: "jsonParsed" },
316
+ ],
317
+ }),
318
+ });
319
+ const data = await response.json();
320
+ return tokenAddresses.reduce((acc, address) => {
321
+ const tokenAccount = data.result?.value?.find((accountInfo) => accountInfo.account.data.parsed.info.mint.toLowerCase() ===
322
+ address.toLowerCase());
323
+ acc[address] = BigInt(tokenAccount?.account.data.parsed.info.tokenAmount.amount || 0);
324
+ return acc;
325
+ }, {});
326
+ };
327
+ export const getAllSolanaTokensBalance = async (solanaTokens, userAddress) => {
328
+ try {
329
+ const nativeToken = solanaTokens.find((t) => t.address === nativeEvmTokenAddress);
330
+ const otherTokens = solanaTokens.filter((t) => t.address !== nativeEvmTokenAddress);
331
+ const [nativeBalance, tokenBalances] = await Promise.all([
332
+ nativeToken
333
+ ? getSolanaNativeBalance(userAddress)
334
+ : Promise.resolve(BigInt(0)),
335
+ getSolanaTokensBalance(userAddress, otherTokens.map((t) => t.address)),
336
+ ]);
337
+ return solanaTokens.map((token) => ({
338
+ ...token,
339
+ balance: token.address === nativeEvmTokenAddress
340
+ ? formatBNToReadable(nativeBalance, token.decimals)
341
+ : formatBNToReadable(tokenBalances[token.address], token.decimals),
342
+ }));
343
+ }
344
+ catch (error) {
345
+ console.warn("Failed to fetch Solana balances:", error);
346
+ return solanaTokens.map((t) => ({ ...t, balance: "0" }));
347
+ }
348
+ };
349
+ export async function getBitcoinNativeBalance(address) {
350
+ try {
351
+ const isValidBitcoinAddress = isBitcoinAddressValid(address);
352
+ if (!isValidBitcoinAddress) {
353
+ throw new Error(`Invalid Bitcoin address: ${address}`);
354
+ }
355
+ const apiUrl = `https://blockchain.info/q/addressbalance/${address}?confirmations=6`;
356
+ const response = await fetch(apiUrl);
357
+ const balanceInSatoshis = await response.json();
358
+ const isValidResponse = typeof balanceInSatoshis === "string" ||
359
+ typeof balanceInSatoshis === "number";
360
+ if (!isValidResponse) {
361
+ throw new Error("Invalid balance response");
362
+ }
363
+ return String(balanceInSatoshis || "0");
364
+ }
365
+ catch (error) {
366
+ console.error("Failed to fetch Bitcoin balance:", error);
367
+ return "0";
368
+ }
369
+ }
370
+ // TODO: implement fetching balances for all bitcoin tokens
371
+ export const getAllBitcoinTokensBalance = async (userAddress, bitcoinTokens) => {
372
+ const nativeBalance = await getBitcoinNativeBalance(userAddress);
373
+ return Promise.all(bitcoinTokens.map(async (token) => {
374
+ return {
375
+ ...token,
376
+ balance: formatBNToReadable(nativeBalance, token.decimals),
377
+ };
378
+ }));
379
+ };
380
+ /**
381
+ * Returns the balance of a single Sui coin for a given address
382
+ */
383
+ export const getSuiTokenBalance = async (userAddress, tokenAddress, rpcUrl) => {
384
+ const suiClient = new SuiRpcClient(rpcUrl);
385
+ const { totalBalance } = await suiClient.getBalance(userAddress, tokenAddress);
386
+ return BigInt(totalBalance || 0);
387
+ };
388
+ export const getAllSuiTokensBalance = async (userAddress, suiTokens, suiChains) => {
389
+ const getBalancesForChain = async (chain) => {
390
+ const tokensForChain = suiTokens.filter((t) => t.chainId === chain.chainId);
391
+ const suiClient = new SuiRpcClient(chain.rpc);
392
+ const foundBalances = await suiClient.getAllBalances(userAddress);
393
+ const balanceMap = foundBalances.reduce((acc, balance) => {
394
+ acc[balance.coinType] = balance.totalBalance;
395
+ return acc;
396
+ }, {});
397
+ return tokensForChain.map((token) => {
398
+ const balanceBn = BigInt(balanceMap[token.address] || 0);
399
+ return {
400
+ ...token,
401
+ balance: formatBNToReadable(balanceBn, token.decimals),
402
+ };
403
+ });
404
+ };
405
+ const allResults = await Promise.all(suiChains.map(getBalancesForChain));
406
+ return allResults.flat();
407
+ };
408
+ /**
409
+ * Returns a promise that resolves when the given promise resolves or after the given timeout
410
+ * @param ms - timeout in milliseconds
411
+ * @param promise - the promise to wait for
412
+ */
413
+ export function timeout(ms, promise) {
414
+ const timeoutPromise = new Promise((resolve) => {
415
+ setTimeout(() => {
416
+ resolve(null);
417
+ }, ms);
418
+ });
419
+ return Promise.race([promise, timeoutPromise]);
420
+ }
421
+ //# sourceMappingURL=rpcService.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rpcService.js","sourceRoot":"","sources":["../../../src/services/external/rpcService.ts"],"names":[],"mappings":"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"}