@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,500 @@
1
+ import { ChainType } from "@0xsquid/squid-types";
2
+ import BigNumber from "bignumber.js";
3
+ import { nativeEvmTokenAddress } from "../core/constants";
4
+ import { areSameCosmosAddress, filterChains, getDisabledChainsIds, groupTokensByChainId, groupTokensBySymbol, shareSubgraphId, sortTokensBySharedSubgraphIds, } from "../services/internal/assetsService";
5
+ import { fetchSquidData } from "./fetchSquidData";
6
+ let squid = undefined;
7
+ let CHAINS = {};
8
+ let TOKENS = {};
9
+ describe("assetsService", () => {
10
+ beforeAll(async () => {
11
+ squid = await fetchSquidData();
12
+ CHAINS = squid?.chains;
13
+ TOKENS = squid?.tokens;
14
+ });
15
+ describe("shareSubgraphId", () => {
16
+ test("should return false when no token has subgraph ids", () => {
17
+ expect(shareSubgraphId(TOKENS.BASE.USDBC, TOKENS.AVALANCHE.MAI)).toBe(false);
18
+ });
19
+ test("should return true when tokens share subgraph ids", () => {
20
+ expect(shareSubgraphId(TOKENS.AVALANCHE.USDC, TOKENS.ETHEREUM.USDC)).toBe(true);
21
+ });
22
+ test("should return false when tokens do not share subgraph ids", () => {
23
+ expect(shareSubgraphId(TOKENS.AVALANCHE.AVAX, TOKENS.ETHEREUM.ETH)).toBe(false);
24
+ });
25
+ });
26
+ describe("sortTokensBySharedSubgraphIds", () => {
27
+ test("should sort 'a' token first when it shares subgraph ids with the token to check", () => {
28
+ expect(sortTokensBySharedSubgraphIds({
29
+ a: TOKENS.AVALANCHE.USDC,
30
+ b: TOKENS.ETHEREUM.WBTC,
31
+ tokenToCheck: TOKENS.ETHEREUM.USDC,
32
+ })).toBe(-1);
33
+ });
34
+ test("should sort 'b' token first when it shares subgraph ids with the token to check", () => {
35
+ expect(sortTokensBySharedSubgraphIds({
36
+ a: TOKENS.AVALANCHE.USDC,
37
+ b: TOKENS.ETHEREUM.ETH,
38
+ tokenToCheck: TOKENS.ETHEREUM.WETH,
39
+ })).toBe(1);
40
+ });
41
+ test("should not change order when tokens do not share subgraph ids with the token to check", () => {
42
+ expect(sortTokensBySharedSubgraphIds({
43
+ a: TOKENS.AVALANCHE.AVAX,
44
+ b: TOKENS.ETHEREUM.ETH,
45
+ tokenToCheck: TOKENS.ETHEREUM.DAI,
46
+ })).toBe(0);
47
+ });
48
+ test("should not change the order when both tokens share subgraph ids with the token to check", () => {
49
+ expect(sortTokensBySharedSubgraphIds({
50
+ a: TOKENS.ETHEREUM.USDC,
51
+ b: TOKENS.AVALANCHE["USDC.axl"],
52
+ tokenToCheck: TOKENS.AVALANCHE.USDC,
53
+ })).toBe(0);
54
+ });
55
+ });
56
+ describe("filterChains", () => {
57
+ test("return chains without changes when no chains are disabled", () => {
58
+ const chains = [CHAINS.AVALANCHE, CHAINS.ETHEREUM, CHAINS.NOBLE];
59
+ expect(filterChains({
60
+ chains,
61
+ config: {
62
+ disabledChains: undefined,
63
+ },
64
+ direction: "from",
65
+ })).toEqual(chains);
66
+ });
67
+ test("remove disabled chains", () => {
68
+ expect(filterChains({
69
+ chains: [CHAINS.MOONBEAM, CHAINS.POLYGON, CHAINS.BINANCE],
70
+ config: {
71
+ disabledChains: { source: [CHAINS.POLYGON.chainId] },
72
+ },
73
+ direction: "from",
74
+ })).toEqual([CHAINS.MOONBEAM, CHAINS.BINANCE]);
75
+ expect(filterChains({
76
+ chains: [CHAINS.POLYGON, CHAINS.CELO, CHAINS.BINANCE],
77
+ config: {
78
+ disabledChains: { destination: [CHAINS.CELO.chainId] },
79
+ },
80
+ direction: "to",
81
+ })).toEqual([CHAINS.POLYGON, CHAINS.BINANCE]);
82
+ });
83
+ test("remove multiple disabled chains", () => {
84
+ const chains = [
85
+ CHAINS.MOONBEAM,
86
+ CHAINS.POLYGON,
87
+ CHAINS.BINANCE,
88
+ CHAINS.LINEA,
89
+ CHAINS.FANTOM,
90
+ CHAINS.CELO,
91
+ ];
92
+ expect(filterChains({
93
+ chains,
94
+ config: {
95
+ disabledChains: {
96
+ source: [CHAINS.MOONBEAM.chainId, CHAINS.LINEA.chainId],
97
+ },
98
+ },
99
+ direction: "from",
100
+ })).toEqual([CHAINS.POLYGON, CHAINS.BINANCE, CHAINS.FANTOM, CHAINS.CELO]);
101
+ });
102
+ });
103
+ describe("getDisabledChainsIds", () => {
104
+ test("returns disabled chains based on source direction", () => {
105
+ expect(getDisabledChainsIds({
106
+ direction: "from",
107
+ config: {
108
+ disabledChains: {
109
+ source: [CHAINS.MOONBEAM.chainId],
110
+ destination: [CHAINS.POLYGON.chainId],
111
+ },
112
+ },
113
+ })).toEqual([CHAINS.MOONBEAM.chainId]);
114
+ });
115
+ test("returns disabled chains based on destination direction", () => {
116
+ expect(getDisabledChainsIds({
117
+ direction: "to",
118
+ config: {
119
+ disabledChains: {
120
+ source: [CHAINS.MOONBEAM.chainId],
121
+ destination: [CHAINS.POLYGON.chainId],
122
+ },
123
+ },
124
+ })).toEqual([CHAINS.POLYGON.chainId]);
125
+ });
126
+ test("returns an empty array when direction is undefined", () => {
127
+ expect(getDisabledChainsIds({
128
+ config: {
129
+ disabledChains: {
130
+ source: [CHAINS.MOONBEAM.chainId],
131
+ destination: [CHAINS.POLYGON.chainId],
132
+ },
133
+ },
134
+ })).toEqual([]);
135
+ });
136
+ });
137
+ describe("areSameCosmosAddress", () => {
138
+ test("should return true for identical IBC addresses", () => {
139
+ const address = "ibc/8E27BA2D5493AF5636760E354E46004562C46AB7EC0CC4C1CA14E9E20E2545B5";
140
+ expect(areSameCosmosAddress(address, address)).toBe(true);
141
+ });
142
+ test("should return true for IBC addresses with different case", () => {
143
+ const address1 = "ibc/8E27BA2D5493AF5636760E354E46004562C46AB7EC0CC4C1CA14E9E20E2545B5";
144
+ const address2 = "ibc/8e27ba2d5493af5636760e354e46004562c46ab7ec0cc4c1ca14e9e20e2545b5";
145
+ expect(areSameCosmosAddress(address1, address2)).toBe(true);
146
+ });
147
+ test("should compare IBC addresses correctly", () => {
148
+ const address1 = "ibc/8E27BA2D5493AF5636760E354E46004562C46AB7EC0CC4C1CA14E9E20E2545B5";
149
+ const address2 = "ibc/9F27BA2D5493AF5636760E354E46004562C46AB7EC0CC4C1CA14E9E20E2545B5";
150
+ expect(areSameCosmosAddress(address1, address2)).toBe(false);
151
+ });
152
+ test("should handle IBC addresses with lowercase 'ibc'", () => {
153
+ const address1 = "ibc/8E27BA2D5493AF5636760E354E46004562C46AB7EC0CC4C1CA14E9E20E2545B5";
154
+ const address2 = "IBC/8E27BA2D5493AF5636760E354E46004562C46AB7EC0CC4C1CA14E9E20E2545B5";
155
+ expect(areSameCosmosAddress(address1, address2)).toBe(true);
156
+ });
157
+ test("should compare non-IBC addresses correctly", () => {
158
+ const address1 = "cosmos1abcdef";
159
+ const address2 = "cosmos2ghijkl";
160
+ expect(areSameCosmosAddress(address1, address2)).toBe(false);
161
+ });
162
+ test("should compare IBC and non-IBC addresses", () => {
163
+ const ibcAddress = "ibc/8E27BA2D5493AF5636760E354E46004562C46AB7EC0CC4C1CA14E9E20E2545B5";
164
+ const nonIbcAddress = "cosmos1abcdef";
165
+ expect(areSameCosmosAddress(ibcAddress, nonIbcAddress)).toBe(false);
166
+ });
167
+ });
168
+ describe("groupTokens", () => {
169
+ const mockTokens = [
170
+ {
171
+ type: ChainType.EVM,
172
+ volatility: 0,
173
+ chainId: "1",
174
+ address: nativeEvmTokenAddress,
175
+ name: "Ethereum",
176
+ symbol: "ETH",
177
+ decimals: 18,
178
+ balance: "1",
179
+ coingeckoId: "ethereum",
180
+ usdPrice: 1.5,
181
+ },
182
+ {
183
+ type: ChainType.EVM,
184
+ volatility: 0,
185
+ chainId: "1",
186
+ address: "0x1",
187
+ name: "Wrapped Ether",
188
+ symbol: "WETH",
189
+ decimals: 18,
190
+ balance: "2",
191
+ coingeckoId: "ethereum",
192
+ usdPrice: 1.5,
193
+ },
194
+ {
195
+ type: ChainType.EVM,
196
+ volatility: 0,
197
+ chainId: "56",
198
+ address: "0x2",
199
+ name: "USD Coin",
200
+ symbol: "USDC",
201
+ decimals: 6,
202
+ balance: "1",
203
+ coingeckoId: "usd-coin",
204
+ usdPrice: 1.5,
205
+ },
206
+ {
207
+ type: ChainType.EVM,
208
+ volatility: 0,
209
+ chainId: "43114",
210
+ address: "0x3",
211
+ name: "USD Coin.e",
212
+ symbol: "USDC.e",
213
+ decimals: 6,
214
+ balance: "2",
215
+ coingeckoId: "usd-coin",
216
+ usdPrice: 1.5,
217
+ },
218
+ {
219
+ type: ChainType.EVM,
220
+ volatility: 0,
221
+ chainId: "1",
222
+ address: "0x4",
223
+ name: "Wrapped Bitcoin",
224
+ symbol: "WBTC",
225
+ decimals: 8,
226
+ balance: "1",
227
+ coingeckoId: "wrapped-bitcoin",
228
+ usdPrice: 1.5,
229
+ },
230
+ {
231
+ type: ChainType.EVM,
232
+ volatility: 0,
233
+ chainId: "43114",
234
+ address: "0x5",
235
+ name: "Wrapped Bitcoin.e",
236
+ symbol: "WBTC.e",
237
+ decimals: 8,
238
+ balance: "2",
239
+ coingeckoId: "wrapped-bitcoin",
240
+ usdPrice: 1.5,
241
+ },
242
+ {
243
+ type: ChainType.EVM,
244
+ volatility: 0,
245
+ chainId: "1",
246
+ address: "0x6",
247
+ name: "Staked Ether",
248
+ symbol: "stETH",
249
+ decimals: 18,
250
+ balance: "3",
251
+ coingeckoId: "staked-ether",
252
+ usdPrice: 1.5,
253
+ },
254
+ {
255
+ type: ChainType.EVM,
256
+ volatility: 0,
257
+ chainId: "43114",
258
+ address: nativeEvmTokenAddress,
259
+ name: "Avalanche",
260
+ symbol: "AVAX",
261
+ decimals: 18,
262
+ balance: "4",
263
+ coingeckoId: "avalanche-2",
264
+ usdPrice: 1.5,
265
+ },
266
+ {
267
+ type: ChainType.EVM,
268
+ volatility: 0,
269
+ chainId: "43114",
270
+ address: "0x7",
271
+ name: "Wrapped AVAX",
272
+ symbol: "WAVAX",
273
+ decimals: 18,
274
+ balance: "5",
275
+ coingeckoId: "wrapped-avax",
276
+ usdPrice: 1.5,
277
+ },
278
+ {
279
+ type: ChainType.EVM,
280
+ volatility: 0,
281
+ chainId: "1",
282
+ address: "0x8",
283
+ name: "Unique Token",
284
+ symbol: "UNQ",
285
+ decimals: 18,
286
+ balance: "1",
287
+ coingeckoId: "unique-token",
288
+ usdPrice: 1.5,
289
+ },
290
+ ];
291
+ let result;
292
+ beforeAll(() => {
293
+ result = groupTokensBySymbol(mockTokens);
294
+ });
295
+ test("should group tokens into the correct number of groups", () => {
296
+ expect(result.grouped).toHaveLength(4);
297
+ });
298
+ test("should group ETH tokens correctly", () => {
299
+ const ethGroup = result.grouped.find((g) => g.symbol === "ETH");
300
+ expect(ethGroup).toBeDefined();
301
+ expect(ethGroup?.tokens).toHaveLength(2);
302
+ expect(ethGroup?.totalBalance).toBe("3");
303
+ expect(ethGroup?.name).toBe("Ethereum");
304
+ });
305
+ test("should group USDC tokens correctly", () => {
306
+ const usdcGroup = result.grouped.find((g) => g.symbol === "USDC");
307
+ expect(usdcGroup).toBeDefined();
308
+ expect(usdcGroup?.tokens).toHaveLength(2);
309
+ expect(usdcGroup?.totalBalance).toBe("3");
310
+ });
311
+ test("should group WBTC tokens correctly", () => {
312
+ const wbtcGroup = result.grouped.find((g) => g.symbol === "WBTC");
313
+ expect(wbtcGroup).toBeDefined();
314
+ expect(wbtcGroup?.tokens).toHaveLength(2);
315
+ expect(wbtcGroup?.totalBalance).toBe("3");
316
+ });
317
+ test("should not group tokens that should not be grouped", () => {
318
+ const stethToken = result.ungrouped.find((t) => t.symbol === "stETH");
319
+ expect(stethToken).toBeDefined();
320
+ expect(stethToken?.balance).toBe("3");
321
+ });
322
+ test("should group AVAX tokens correctly", () => {
323
+ const avaxGroup = result.grouped.find((g) => g.symbol === "AVAX");
324
+ expect(avaxGroup).toBeDefined();
325
+ expect(avaxGroup?.tokens).toHaveLength(2);
326
+ expect(avaxGroup?.totalBalance).toBe("9");
327
+ expect(avaxGroup?.name).toBe("Avalanche");
328
+ });
329
+ test("should calculate correct total balance for all groups", () => {
330
+ result.grouped.forEach((group) => {
331
+ const calculatedTotal = group.tokens.reduce((sum, token) => {
332
+ return sum.plus(new BigNumber(token.balance));
333
+ }, new BigNumber(0));
334
+ expect(new BigNumber(group.totalBalance).isEqualTo(calculatedTotal)).toBe(true);
335
+ });
336
+ });
337
+ test("should separate grouped and ungrouped tokens", () => {
338
+ expect(result.grouped).toBeDefined();
339
+ expect(result.ungrouped).toBeDefined();
340
+ });
341
+ test("should have the correct number of grouped tokens", () => {
342
+ expect(result.grouped).toHaveLength(4);
343
+ });
344
+ test("should have the correct number of ungrouped tokens", () => {
345
+ expect(result.ungrouped).toHaveLength(2);
346
+ });
347
+ test("should place stETH in ungrouped tokens", () => {
348
+ const stethToken = result.ungrouped.find((t) => t.symbol === "stETH");
349
+ expect(stethToken).toBeDefined();
350
+ expect(stethToken?.balance).toBe("3");
351
+ });
352
+ test("should place unique token in ungrouped tokens", () => {
353
+ const unqToken = result.ungrouped.find((t) => t.symbol === "UNQ");
354
+ expect(unqToken).toBeDefined();
355
+ expect(unqToken?.balance).toBe("1");
356
+ });
357
+ test("should not have any single-token groups in grouped tokens", () => {
358
+ result.grouped.forEach((group) => {
359
+ expect(group.tokens.length).toBeGreaterThan(1);
360
+ });
361
+ });
362
+ test("should calculate correct total balance for all groups and ungrouped tokens", () => {
363
+ let totalBalance = new BigNumber(0);
364
+ result.grouped.forEach((group) => {
365
+ const groupTotal = new BigNumber(group.totalBalance);
366
+ totalBalance = totalBalance.plus(groupTotal);
367
+ });
368
+ result.ungrouped.forEach((token) => {
369
+ totalBalance = totalBalance.plus(new BigNumber(token.balance));
370
+ });
371
+ const expectedTotal = mockTokens.reduce((sum, token) => {
372
+ return sum.plus(new BigNumber(token.balance));
373
+ }, new BigNumber(0));
374
+ expect(totalBalance.isEqualTo(expectedTotal)).toBe(true);
375
+ });
376
+ test("should have correct USD balance for ETH group", () => {
377
+ const ethGroup = result.grouped.find((g) => g.symbol === "ETH");
378
+ // 3 total tokens * 1.5 USD = 4.5 USD
379
+ expect(ethGroup?.totalBalanceUsd).toBe("4.5");
380
+ });
381
+ test("should have correct USD balance for AVAX group", () => {
382
+ const avaxGroup = result.grouped.find((g) => g.symbol === "AVAX");
383
+ // 9 total tokens * 1.5 USD = 13.5 USD
384
+ expect(avaxGroup?.totalBalanceUsd).toBe("13.5");
385
+ });
386
+ });
387
+ describe("groupTokensByChainId", () => {
388
+ test("should group tokens by chain ID correctly", () => {
389
+ const mockChains = [
390
+ {
391
+ chainId: "1",
392
+ networkName: "Ethereum",
393
+ nativeCurrency: { symbol: "ETH" },
394
+ chainIconURI: "eth.png",
395
+ },
396
+ {
397
+ chainId: "43114",
398
+ networkName: "Avalanche",
399
+ nativeCurrency: { symbol: "AVAX" },
400
+ chainIconURI: "avax.png",
401
+ },
402
+ ];
403
+ const mockTokens = [
404
+ {
405
+ chainId: "1",
406
+ address: "0x1",
407
+ balance: "1",
408
+ usdPrice: 1.5,
409
+ },
410
+ {
411
+ chainId: "1",
412
+ address: "0x2",
413
+ balance: "2",
414
+ usdPrice: 1.5,
415
+ },
416
+ {
417
+ chainId: "43114",
418
+ address: "0x3",
419
+ balance: "3",
420
+ usdPrice: 1.5,
421
+ },
422
+ ];
423
+ const result = groupTokensByChainId(mockTokens, mockChains);
424
+ expect(result).toHaveLength(2);
425
+ const ethGroup = result.find((g) => g.chainId === "1");
426
+ expect(ethGroup).toBeDefined();
427
+ expect(ethGroup?.tokens).toHaveLength(2);
428
+ expect(ethGroup?.totalBalanceUsd).toBe("4.5");
429
+ expect(ethGroup?.symbol).toBe("ETH");
430
+ const avaxGroup = result.find((g) => g.chainId === "43114");
431
+ expect(avaxGroup).toBeDefined();
432
+ expect(avaxGroup?.tokens).toHaveLength(1);
433
+ expect(avaxGroup?.totalBalanceUsd).toBe("4.5");
434
+ expect(avaxGroup?.symbol).toBe("AVAX");
435
+ });
436
+ test("should handle tokens with undefined or zero USD price", () => {
437
+ const mockChains = [
438
+ {
439
+ chainId: "8453",
440
+ networkName: "Base",
441
+ nativeCurrency: { symbol: "ETH" },
442
+ chainIconURI: "base.png",
443
+ },
444
+ ];
445
+ const mockTokens = [
446
+ {
447
+ chainId: "8453",
448
+ address: "0x1",
449
+ symbol: "ETH",
450
+ balance: "0.037",
451
+ usdPrice: 3295.37,
452
+ },
453
+ {
454
+ chainId: "8453",
455
+ address: "0x2",
456
+ symbol: "USDC",
457
+ balance: "0.005",
458
+ usdPrice: 1.001,
459
+ },
460
+ {
461
+ chainId: "8453",
462
+ address: "0x3",
463
+ symbol: "TBH",
464
+ balance: "500",
465
+ usdPrice: 0, // Token with zero price
466
+ },
467
+ ];
468
+ const result = groupTokensByChainId(mockTokens, mockChains);
469
+ expect(result).toHaveLength(1);
470
+ const baseGroup = result[0];
471
+ expect(baseGroup.totalBalanceUsd).toBe("121.9337");
472
+ });
473
+ });
474
+ // TODO: Uncomment this to test images locally
475
+ // describe("getTokenImage", () => {
476
+ // test("fetch all token images and log non-working tokens", async () => {
477
+ // const nonWorkingTokens: Set<string> = new Set();
478
+ // const fetchImage = async (token: Token) => {
479
+ // const imageUrl = getTokenImage(token);
480
+ // if (imageUrl) {
481
+ // try {
482
+ // const response = await fetch(imageUrl);
483
+ // if (response.status === 404) {
484
+ // nonWorkingTokens.add(token.symbol.toLowerCase());
485
+ // }
486
+ // } catch (error) {
487
+ // nonWorkingTokens.add(token.symbol.toLowerCase());
488
+ // }
489
+ // }
490
+ // };
491
+ // const allTokens = Object.values(TOKENS).flatMap((chainTokens) =>
492
+ // Object.values(chainTokens)
493
+ // );
494
+ // await Promise.all(allTokens.map(fetchImage));
495
+ // const uniqueNonWorkingTokens = Array.from(nonWorkingTokens);
496
+ // console.log(JSON.stringify(uniqueNonWorkingTokens, null, 2));
497
+ // });
498
+ // });
499
+ });
500
+ //# sourceMappingURL=assetsService.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"assetsService.test.js","sourceRoot":"","sources":["../../src/tests/assetsService.test.ts"],"names":[],"mappings":"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"}