@0xsquid/react-hooks 6.7.0-rollup-beta.1 → 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-Cnn1_HQT.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-Cnn1_HQT.js.map +0 -1
  257. package/dist/secretService-DW4QetNp.js +0 -162
  258. package/dist/secretService-DW4QetNp.js.map +0 -1
@@ -0,0 +1,53 @@
1
+ import { BigNumber } from "bignumber.js";
2
+ /**
3
+ * Cleans numeric string by removing thousand separators
4
+ * @param amount - The amount to clean (string or number)
5
+ */
6
+ export function cleanAmount(amount) {
7
+ if (typeof amount === "number")
8
+ return amount.toString();
9
+ return amount.replace(/,/g, "");
10
+ }
11
+ /**
12
+ * Convert token amount to USD
13
+ * @param {string|number} tokenAmount - The amount of tokens
14
+ * @param {string|number} tokenPrice - The price of one token in USD
15
+ * @returns {BigNumber} - The equivalent amount in USD
16
+ */
17
+ export function convertTokenAmountToUSD(tokenAmount, tokenPrice, maxDecimals = 4) {
18
+ if (!tokenAmount || !tokenPrice)
19
+ return "";
20
+ try {
21
+ const amount = new BigNumber(cleanAmount(tokenAmount));
22
+ const price = new BigNumber(cleanAmount(tokenPrice));
23
+ return amount.multipliedBy(price).decimalPlaces(maxDecimals).toString();
24
+ }
25
+ catch {
26
+ return "";
27
+ }
28
+ }
29
+ /**
30
+ * Convert USD to token amount
31
+ * @param {string|number} usdAmount - The amount in USD
32
+ * @param {string|number} tokenPrice - The price of one token in USD
33
+ * @param {number} maxDecimals - The maximum number of decimals
34
+ * @returns {BigNumber} - The equivalent amount of tokens
35
+ */
36
+ export function convertUSDToTokenAmount(usdAmount, tokenPrice, maxDecimals) {
37
+ if (!usdAmount || !tokenPrice || !maxDecimals)
38
+ return "0";
39
+ const amount = new BigNumber(cleanAmount(usdAmount));
40
+ const price = new BigNumber(cleanAmount(tokenPrice));
41
+ return amount.dividedBy(price).decimalPlaces(maxDecimals).toString();
42
+ }
43
+ export const calculateTotal24hChange = (tokensWithBalance, totalUSDAmount) => {
44
+ let weightedChangeSum = 0;
45
+ for (const token of tokensWithBalance) {
46
+ const tokenBalance = parseFloat(token.balance);
47
+ const tokenValueUSD = tokenBalance * token.usdPrice;
48
+ const weightedChange = (tokenValueUSD / Number(totalUSDAmount)) * token.price24hChange;
49
+ weightedChangeSum += weightedChange;
50
+ }
51
+ return weightedChangeSum;
52
+ };
53
+ //# sourceMappingURL=priceService.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"priceService.js","sourceRoot":"","sources":["../../../src/services/internal/priceService.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AAEzC;;;GAGG;AACH,MAAM,UAAU,WAAW,CAAC,MAAuB;IACjD,IAAI,OAAO,MAAM,KAAK,QAAQ;QAAE,OAAO,MAAM,CAAC,QAAQ,EAAE,CAAC;IACzD,OAAO,MAAM,CAAC,OAAO,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;AAClC,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,uBAAuB,CACrC,WAA4B,EAC5B,UAA2B,EAC3B,cAAsB,CAAC;IAEvB,IAAI,CAAC,WAAW,IAAI,CAAC,UAAU;QAAE,OAAO,EAAE,CAAC;IAC3C,IAAI;QACF,MAAM,MAAM,GAAG,IAAI,SAAS,CAAC,WAAW,CAAC,WAAW,CAAC,CAAC,CAAC;QACvD,MAAM,KAAK,GAAG,IAAI,SAAS,CAAC,WAAW,CAAC,UAAU,CAAC,CAAC,CAAC;QACrD,OAAO,MAAM,CAAC,YAAY,CAAC,KAAK,CAAC,CAAC,aAAa,CAAC,WAAW,CAAC,CAAC,QAAQ,EAAE,CAAC;KACzE;IAAC,MAAM;QACN,OAAO,EAAE,CAAC;KACX;AACH,CAAC;AAED;;;;;;GAMG;AACH,MAAM,UAAU,uBAAuB,CACrC,SAA0B,EAC1B,UAA2B,EAC3B,WAAmB;IAEnB,IAAI,CAAC,SAAS,IAAI,CAAC,UAAU,IAAI,CAAC,WAAW;QAAE,OAAO,GAAG,CAAC;IAC1D,MAAM,MAAM,GAAG,IAAI,SAAS,CAAC,WAAW,CAAC,SAAS,CAAC,CAAC,CAAC;IACrD,MAAM,KAAK,GAAG,IAAI,SAAS,CAAC,WAAW,CAAC,UAAU,CAAC,CAAC,CAAC;IAErD,OAAO,MAAM,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,aAAa,CAAC,WAAW,CAAC,CAAC,QAAQ,EAAE,CAAC;AACvE,CAAC;AAQD,MAAM,CAAC,MAAM,uBAAuB,GAAG,CACrC,iBAAqC,EACrC,cAA+B,EACvB,EAAE;IACV,IAAI,iBAAiB,GAAG,CAAC,CAAC;IAE1B,KAAK,MAAM,KAAK,IAAI,iBAAiB,EAAE;QACrC,MAAM,YAAY,GAAG,UAAU,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;QAC/C,MAAM,aAAa,GAAG,YAAY,GAAG,KAAK,CAAC,QAAQ,CAAC;QACpD,MAAM,cAAc,GAClB,CAAC,aAAa,GAAG,MAAM,CAAC,cAAc,CAAC,CAAC,GAAG,KAAK,CAAC,cAAc,CAAC;QAClE,iBAAiB,IAAI,cAAc,CAAC;KACrC;IAED,OAAO,iBAAiB,CAAC;AAC3B,CAAC,CAAC"}
@@ -0,0 +1,98 @@
1
+ import Fuse from "fuse.js";
2
+ import { nativeEvmTokenAddress } from "../../core/constants";
3
+ const fuseSearchOptions = {
4
+ isCaseSensitive: false,
5
+ threshold: 0.1,
6
+ findAllMatches: false,
7
+ includeMatches: true,
8
+ keys: [
9
+ { name: "symbol", weight: 1 },
10
+ { name: "name", weight: 0.8 },
11
+ ],
12
+ };
13
+ /**
14
+ * Minimum length of a search query to search by address
15
+ * Some tokens can have very short addresses (e.g. "uosmo", "uixo", "satoshi", etc...)
16
+ * We don't want to search by address for these short queries
17
+ * as they can conflict with other tokens' symbols
18
+ *
19
+ * This value is arbitrary and can be adjusted as needed
20
+ * but most blockchains should have longer addresses than this
21
+ */
22
+ const minAddressLength = 7;
23
+ /**
24
+ * Searches for tokens based on a query string, prioritizing results in the following order:
25
+ * 1. Exact address (if query is long enough)
26
+ * 2. ETH on Ethereum mainnet (chainId 1)
27
+ * 3. Native tokens of chains matching the query (e.g., BNB when searching for "binance")
28
+ * 4. Exact matches for native tokens (e.g., native FTM when searching for "FTM")
29
+ * 5. Other exact matches for token names or symbols
30
+ * 6. Other native tokens that partially match the query
31
+ * 7. Remaining tokens that partially match the query
32
+ *
33
+ * @param query - The search query string
34
+ * @param tokens - Array of all available tokens
35
+ * @param chains - Array of chain data
36
+ * @returns An array of tokens sorted according to the priority described above
37
+ */
38
+ export const searchTokens = (query, tokens, chains) => {
39
+ // Query must at least be 2 characters long
40
+ if (query.length <= 1)
41
+ return tokens;
42
+ // Check for exact address match first, only if query is long enough
43
+ const exactAddressMatches = query.length >= minAddressLength
44
+ ? tokens.filter((token) => token.address.toLowerCase() === query.toLowerCase())
45
+ : [];
46
+ // There can be multiple matches for the same address,
47
+ // e.g. ITS tokens share address across chains
48
+ if (exactAddressMatches.length > 0) {
49
+ return exactAddressMatches;
50
+ }
51
+ // Init fuse.js
52
+ const fuse = new Fuse(tokens, fuseSearchOptions);
53
+ // Perform the search with fuse
54
+ const searchResults = fuse.search(query);
55
+ // Find native tokens that match the query or related chain names
56
+ const nativeTokens = chains
57
+ .filter((chain) => chain.nativeCurrency.symbol.toLowerCase() === query.toLowerCase() ||
58
+ chain.nativeCurrency.name.toLowerCase().includes(query.toLowerCase()) ||
59
+ chain.networkName.toLowerCase().includes(query.toLowerCase()) ||
60
+ chain.axelarChainName.toLowerCase().includes(query.toLowerCase()))
61
+ .map((chain) => tokens.find((token) => token.chainId === chain.chainId &&
62
+ token.address.toLowerCase() === nativeEvmTokenAddress))
63
+ .filter((token) => token !== undefined);
64
+ // Separate ETH on Ethereum mainnet (chainId 1) for top priority
65
+ const ethMainnet = nativeTokens.find((token) => token.symbol === "ETH" && token.chainId === "1");
66
+ const otherNativeTokens = nativeTokens.filter((token) => !(token.symbol === "ETH" && token.chainId === "1"));
67
+ // Find exact matches for token name or symbol
68
+ const exactMatches = searchResults
69
+ .map((result) => result.item)
70
+ .filter((token) => token.name.toLowerCase() === query.toLowerCase() ||
71
+ token.symbol.toLowerCase() === query.toLowerCase());
72
+ // Prioritize native tokens within exact matches
73
+ const prioritizedExactMatches = exactMatches.sort((a, b) => {
74
+ const aIsNative = a.address.toLowerCase() === nativeEvmTokenAddress;
75
+ const bIsNative = b.address.toLowerCase() === nativeEvmTokenAddress;
76
+ if (aIsNative && !bIsNative)
77
+ return -1;
78
+ if (!aIsNative && bIsNative)
79
+ return 1;
80
+ return 0;
81
+ });
82
+ // Collect remaining search results that aren't exact matches
83
+ const otherResults = searchResults
84
+ .map((result) => result.item)
85
+ .filter((token) => !(token.name.toLowerCase() === query.toLowerCase() ||
86
+ token.symbol.toLowerCase() === query.toLowerCase()));
87
+ // Combine all results in the desired priority order
88
+ const combinedResults = [
89
+ ...(ethMainnet ? [ethMainnet] : []),
90
+ ...otherNativeTokens,
91
+ ...prioritizedExactMatches,
92
+ ...otherResults,
93
+ ];
94
+ // Remove any duplicate tokens from the results
95
+ const uniqueResults = Array.from(new Set(combinedResults));
96
+ return uniqueResults;
97
+ };
98
+ //# sourceMappingURL=searchService.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"searchService.js","sourceRoot":"","sources":["../../../src/services/internal/searchService.ts"],"names":[],"mappings":"AACA,OAAO,IAAI,MAAM,SAAS,CAAC;AAC3B,OAAO,EAAE,qBAAqB,EAAE,MAAM,sBAAsB,CAAC;AAE7D,MAAM,iBAAiB,GAA6B;IAClD,eAAe,EAAE,KAAK;IACtB,SAAS,EAAE,GAAG;IACd,cAAc,EAAE,KAAK;IACrB,cAAc,EAAE,IAAI;IACpB,IAAI,EAAE;QACJ,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,EAAE,CAAC,EAAE;QAC7B,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,GAAG,EAAE;KAC9B;CACF,CAAC;AAEF;;;;;;;;GAQG;AACH,MAAM,gBAAgB,GAAG,CAAC,CAAC;AAE3B;;;;;;;;;;;;;;GAcG;AACH,MAAM,CAAC,MAAM,YAAY,GAAG,CAC1B,KAAa,EACb,MAAe,EACf,MAAmB,EACV,EAAE;IACX,2CAA2C;IAC3C,IAAI,KAAK,CAAC,MAAM,IAAI,CAAC;QAAE,OAAO,MAAM,CAAC;IAErC,oEAAoE;IACpE,MAAM,mBAAmB,GACvB,KAAK,CAAC,MAAM,IAAI,gBAAgB;QAC9B,CAAC,CAAC,MAAM,CAAC,MAAM,CACX,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,OAAO,CAAC,WAAW,EAAE,KAAK,KAAK,CAAC,WAAW,EAAE,CAC/D;QACH,CAAC,CAAC,EAAE,CAAC;IAET,sDAAsD;IACtD,8CAA8C;IAC9C,IAAI,mBAAmB,CAAC,MAAM,GAAG,CAAC,EAAE;QAClC,OAAO,mBAAmB,CAAC;KAC5B;IAED,eAAe;IACf,MAAM,IAAI,GAAG,IAAI,IAAI,CAAC,MAAM,EAAE,iBAAiB,CAAC,CAAC;IAEjD,+BAA+B;IAC/B,MAAM,aAAa,GAAG,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;IAEzC,iEAAiE;IACjE,MAAM,YAAY,GAAG,MAAM;SACxB,MAAM,CACL,CAAC,KAAK,EAAE,EAAE,CACR,KAAK,CAAC,cAAc,CAAC,MAAM,CAAC,WAAW,EAAE,KAAK,KAAK,CAAC,WAAW,EAAE;QACjE,KAAK,CAAC,cAAc,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC,QAAQ,CAAC,KAAK,CAAC,WAAW,EAAE,CAAC;QACrE,KAAK,CAAC,WAAW,CAAC,WAAW,EAAE,CAAC,QAAQ,CAAC,KAAK,CAAC,WAAW,EAAE,CAAC;QAC7D,KAAK,CAAC,eAAe,CAAC,WAAW,EAAE,CAAC,QAAQ,CAAC,KAAK,CAAC,WAAW,EAAE,CAAC,CACpE;SACA,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CACb,MAAM,CAAC,IAAI,CACT,CAAC,KAAK,EAAE,EAAE,CACR,KAAK,CAAC,OAAO,KAAK,KAAK,CAAC,OAAO;QAC/B,KAAK,CAAC,OAAO,CAAC,WAAW,EAAE,KAAK,qBAAqB,CACxD,CACF;SACA,MAAM,CAAC,CAAC,KAAK,EAAkB,EAAE,CAAC,KAAK,KAAK,SAAS,CAAC,CAAC;IAE1D,gEAAgE;IAChE,MAAM,UAAU,GAAG,YAAY,CAAC,IAAI,CAClC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,MAAM,KAAK,KAAK,IAAI,KAAK,CAAC,OAAO,KAAK,GAAG,CAC3D,CAAC;IACF,MAAM,iBAAiB,GAAG,YAAY,CAAC,MAAM,CAC3C,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,MAAM,KAAK,KAAK,IAAI,KAAK,CAAC,OAAO,KAAK,GAAG,CAAC,CAC9D,CAAC;IAEF,8CAA8C;IAC9C,MAAM,YAAY,GAAG,aAAa;SAC/B,GAAG,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC;SAC5B,MAAM,CACL,CAAC,KAAK,EAAE,EAAE,CACR,KAAK,CAAC,IAAI,CAAC,WAAW,EAAE,KAAK,KAAK,CAAC,WAAW,EAAE;QAChD,KAAK,CAAC,MAAM,CAAC,WAAW,EAAE,KAAK,KAAK,CAAC,WAAW,EAAE,CACrD,CAAC;IAEJ,gDAAgD;IAChD,MAAM,uBAAuB,GAAG,YAAY,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE;QACzD,MAAM,SAAS,GAAG,CAAC,CAAC,OAAO,CAAC,WAAW,EAAE,KAAK,qBAAqB,CAAC;QACpE,MAAM,SAAS,GAAG,CAAC,CAAC,OAAO,CAAC,WAAW,EAAE,KAAK,qBAAqB,CAAC;QACpE,IAAI,SAAS,IAAI,CAAC,SAAS;YAAE,OAAO,CAAC,CAAC,CAAC;QACvC,IAAI,CAAC,SAAS,IAAI,SAAS;YAAE,OAAO,CAAC,CAAC;QACtC,OAAO,CAAC,CAAC;IACX,CAAC,CAAC,CAAC;IAEH,6DAA6D;IAC7D,MAAM,YAAY,GAAG,aAAa;SAC/B,GAAG,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC;SAC5B,MAAM,CACL,CAAC,KAAK,EAAE,EAAE,CACR,CAAC,CACC,KAAK,CAAC,IAAI,CAAC,WAAW,EAAE,KAAK,KAAK,CAAC,WAAW,EAAE;QAChD,KAAK,CAAC,MAAM,CAAC,WAAW,EAAE,KAAK,KAAK,CAAC,WAAW,EAAE,CACnD,CACJ,CAAC;IAEJ,oDAAoD;IACpD,MAAM,eAAe,GAAG;QACtB,GAAG,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;QACnC,GAAG,iBAAiB;QACpB,GAAG,uBAAuB;QAC1B,GAAG,YAAY;KAChB,CAAC;IAEF,+CAA+C;IAC/C,MAAM,aAAa,GAAG,KAAK,CAAC,IAAI,CAAC,IAAI,GAAG,CAAC,eAAe,CAAC,CAAC,CAAC;IAE3D,OAAO,aAAa,CAAC;AACvB,CAAC,CAAC"}
@@ -0,0 +1,109 @@
1
+ import { createAssociatedTokenAccountInstruction, createTransferInstruction, getAssociatedTokenAddress, } from "@solana/spl-token";
2
+ import { PublicKey, SystemProgram, Transaction, VersionedTransaction, } from "@solana/web3.js";
3
+ import { nativeSolanaTokenAddress } from "../../core/constants";
4
+ export const isSolanaAddressValid = (address) => {
5
+ try {
6
+ new PublicKey(address);
7
+ return true;
8
+ }
9
+ catch {
10
+ return false;
11
+ }
12
+ };
13
+ export const connectSolanaWallet = async (wallet, { connectSolana }) => {
14
+ const address = await connectSolana?.mutateAsync({
15
+ wallet,
16
+ });
17
+ if (address) {
18
+ return { wallet, address };
19
+ }
20
+ return null;
21
+ };
22
+ /**
23
+ * Execute a Solana swap transaction
24
+ * This will be used for the swap flow - Using Jupiter Dex under the hood
25
+ */
26
+ export const executeSolanaSwap = async ({ route, signer, connection, onSigned, }) => {
27
+ if (!route?.transactionRequest?.data) {
28
+ throw new Error("Invalid parameters");
29
+ }
30
+ const swapRequest = route.transactionRequest.data;
31
+ const swapTransactionBuf = Buffer.from(swapRequest, "base64");
32
+ const transaction = VersionedTransaction.deserialize(swapTransactionBuf);
33
+ try {
34
+ const latestBlockhash = await connection.getLatestBlockhash();
35
+ const signature = await signer.sendTransaction(transaction, connection);
36
+ onSigned?.(signature);
37
+ await connection.confirmTransaction({
38
+ signature,
39
+ blockhash: latestBlockhash.blockhash,
40
+ lastValidBlockHeight: latestBlockhash.lastValidBlockHeight,
41
+ });
42
+ return signature;
43
+ }
44
+ catch (error) {
45
+ console.error("Solana swap failed:", error);
46
+ throw error;
47
+ }
48
+ };
49
+ /**
50
+ * Execute a Solana transfer transaction for both native SOL and SPL tokens
51
+ * @param amount - Amount to transfer in raw units (lamports for SOL, raw token units for SPL)
52
+ * @param target - Target wallet address
53
+ * @param signer - Solana wallet adapter instance
54
+ * @param connection - Solana RPC connection
55
+ * @param sourceToken - Token information (undefined for native SOL)
56
+ * @param onSigned - Optional callback triggered when transaction is signed
57
+ * @returns Transaction signature
58
+ */
59
+ export const executeSolanaTransfer = async ({ amount, target, signer, connection, sourceToken, onSigned, }) => {
60
+ // Validate signer and target address
61
+ if (!signer.publicKey) {
62
+ throw new Error("Signer public key not found");
63
+ }
64
+ if (!isSolanaAddressValid(target)) {
65
+ throw new Error("Invalid target address");
66
+ }
67
+ const targetPubKey = new PublicKey(target);
68
+ const transaction = new Transaction();
69
+ const isNativeToken = !sourceToken ||
70
+ sourceToken.address.toLowerCase() ===
71
+ nativeSolanaTokenAddress.toLowerCase();
72
+ if (isNativeToken) {
73
+ // Handle native SOL transfer
74
+ transaction.add(SystemProgram.transfer({
75
+ fromPubkey: signer.publicKey,
76
+ toPubkey: targetPubKey,
77
+ lamports: amount,
78
+ }));
79
+ }
80
+ else {
81
+ // Handle SPL token transfer
82
+ const mint = new PublicKey(sourceToken.address);
83
+ // Get Associated Token Accounts (ATAs) for both source and target
84
+ const sourceATA = await getAssociatedTokenAddress(mint, signer.publicKey, true);
85
+ const targetATA = await getAssociatedTokenAddress(mint, targetPubKey, true);
86
+ // Check if target ATA exists and create if needed
87
+ const targetAccount = await connection.getAccountInfo(targetATA);
88
+ if (!targetAccount) {
89
+ transaction.add(createAssociatedTokenAccountInstruction(signer.publicKey, targetATA, targetPubKey, mint));
90
+ }
91
+ // Add the token transfer instruction
92
+ transaction.add(createTransferInstruction(sourceATA, targetATA, signer.publicKey, amount));
93
+ }
94
+ // Get latest blockhash and sign transaction
95
+ const { blockhash, lastValidBlockHeight } = await connection.getLatestBlockhash();
96
+ transaction.recentBlockhash = blockhash;
97
+ transaction.feePayer = signer.publicKey;
98
+ const signature = await signer.sendTransaction(transaction, connection);
99
+ // Trigger callback for UI purposes (show loading state)
100
+ onSigned?.(signature);
101
+ // Wait for transaction confirmation
102
+ await connection.confirmTransaction({
103
+ signature,
104
+ blockhash,
105
+ lastValidBlockHeight,
106
+ });
107
+ return signature;
108
+ };
109
+ //# sourceMappingURL=solanaService.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"solanaService.js","sourceRoot":"","sources":["../../../src/services/internal/solanaService.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,119 @@
1
+ import { ChainType } from "@0xsquid/squid-types";
2
+ import { isSuiChain, SUI_MAINNET_CHAIN, SUI_TESTNET_CHAIN, } from "@mysten/wallet-standard";
3
+ import { CHAIN_IDS } from "../../core/constants";
4
+ import { walletIconBaseUrl } from "../../core/wallets";
5
+ const STANDARD_FEATURES = [
6
+ "standard:connect",
7
+ "standard:events",
8
+ ];
9
+ const SUI_FEATURES = ["sui:signTransaction"];
10
+ /**
11
+ * Validates that a given standard wallet has all the required features for a Sui wallet
12
+ */
13
+ function isSuiStandardWallet(wallet) {
14
+ return [...STANDARD_FEATURES, ...SUI_FEATURES].every((feature) => feature in wallet.features);
15
+ }
16
+ export function filterSuiWallets(standardWallets) {
17
+ // Filter out all non-Sui standard wallets
18
+ return standardWallets.filter(isSuiStandardWallet).map(formatSuiWallet);
19
+ }
20
+ function isHex(value) {
21
+ return /^(0x|0X)?[a-fA-F0-9]+$/.test(value) && value.length % 2 === 0;
22
+ }
23
+ function getHexByteLength(value) {
24
+ return /^(0x|0X)/.test(value) ? (value.length - 2) / 2 : value.length / 2;
25
+ }
26
+ const SUI_ADDRESS_LENGTH = 32;
27
+ // Ref. https://github.com/MystenLabs/ts-sdks/blob/31dd6c73d7aab9819bd545323273f733cfcc5a01/packages/typescript/src/utils/sui-types.ts#L24-L27
28
+ export function isSuiAddressValid(address) {
29
+ return isHex(address) && getHexByteLength(address) === SUI_ADDRESS_LENGTH;
30
+ }
31
+ export const slushWebWalletData = {
32
+ icon: `${walletIconBaseUrl}/slush-web.webp`,
33
+ id: "slush-web-wallet",
34
+ name: "Slush Web Wallet",
35
+ };
36
+ /**
37
+ * Override Sui standard wallet properties
38
+ */
39
+ export const suiStdWalletOverrides = {
40
+ Phantom: {
41
+ icon: `${walletIconBaseUrl}/phantom.webp`,
42
+ connectorId: "phantom",
43
+ },
44
+ Backpack: {
45
+ icon: `${walletIconBaseUrl}/backpack.webp`,
46
+ connectorId: "backpack",
47
+ },
48
+ "OKX Wallet": {
49
+ icon: `${walletIconBaseUrl}/okx.webp`,
50
+ connectorId: "okx",
51
+ },
52
+ "Cosmostation Wallet": {
53
+ icon: `${walletIconBaseUrl}/cosmostation.webp`,
54
+ connectorId: "cosmostation",
55
+ },
56
+ "Surf Wallet": {
57
+ icon: `${walletIconBaseUrl}/surf.webp`,
58
+ },
59
+ "com.mystenlabs.suiwallet": {
60
+ icon: `${walletIconBaseUrl}/slush.webp`,
61
+ name: "Slush Wallet",
62
+ },
63
+ };
64
+ /**
65
+ * Format a Sui standard wallet into a Squid Wallet
66
+ */
67
+ function formatSuiWallet(wallet) {
68
+ const { icon, name: defaultName, features, id, chains } = wallet;
69
+ const standardWalletId = id || defaultName;
70
+ const walletOverrides = suiStdWalletOverrides[standardWalletId];
71
+ const walletIcon = walletOverrides?.icon || icon;
72
+ const name = walletOverrides?.name || defaultName;
73
+ const connectorId = walletOverrides?.connectorId || standardWalletId;
74
+ const isSlushWebWallet = connectorId === slushWebWalletData.id;
75
+ return {
76
+ connectorId,
77
+ name,
78
+ connectorName: name,
79
+ type: ChainType.SUI,
80
+ icon: walletIcon,
81
+ windowFlag: name,
82
+ isMobile: false,
83
+ // Slush (web) is a social wallet so it cannot be installed
84
+ // and works similar to WalletConnect
85
+ isInstalled: isSlushWebWallet ? undefined : () => true,
86
+ skipInstallCheck: isSlushWebWallet,
87
+ connector() {
88
+ return {
89
+ signTransaction: features["sui:signTransaction"].signTransaction,
90
+ connect: async () => {
91
+ const { accounts } = await features["standard:connect"].connect();
92
+ if (!isSuiChain(chains[0]))
93
+ throw new Error("Error connecting Sui wallet, invalid chain");
94
+ if (!accounts.length) {
95
+ throw new Error("No accounts returned from wallet");
96
+ }
97
+ return {
98
+ account: accounts[0],
99
+ chain: chains[0],
100
+ };
101
+ },
102
+ disconnect: async () => {
103
+ await features["standard:disconnect"]?.disconnect();
104
+ },
105
+ };
106
+ },
107
+ };
108
+ }
109
+ export function getSuiChain(chainId) {
110
+ switch (chainId) {
111
+ case CHAIN_IDS.SUI:
112
+ return SUI_MAINNET_CHAIN;
113
+ case CHAIN_IDS.SUI_TESTNET:
114
+ return SUI_TESTNET_CHAIN;
115
+ default:
116
+ return null;
117
+ }
118
+ }
119
+ //# sourceMappingURL=suiService.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"suiService.js","sourceRoot":"","sources":["../../../src/services/internal/suiService.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,sBAAsB,CAAC;AACjD,OAAO,EACL,UAAU,EAIV,iBAAiB,EACjB,iBAAiB,GAKlB,MAAM,yBAAyB,CAAC;AACjC,OAAO,EAAE,SAAS,EAAE,MAAM,sBAAsB,CAAC;AAMjD,OAAO,EAAE,iBAAiB,EAAE,MAAM,oBAAoB,CAAC;AAavD,MAAM,iBAAiB,GAAkC;IACvD,kBAAkB;IAClB,iBAAiB;CAClB,CAAC;AACF,MAAM,YAAY,GAA6B,CAAC,qBAAqB,CAAC,CAAC;AAEvE;;GAEG;AACH,SAAS,mBAAmB,CAC1B,MAAsB;IAEtB,OAAO,CAAC,GAAG,iBAAiB,EAAE,GAAG,YAAY,CAAC,CAAC,KAAK,CAClD,CAAC,OAAO,EAAE,EAAE,CAAC,OAAO,IAAI,MAAM,CAAC,QAAQ,CACxC,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,gBAAgB,CAC9B,eAA0C;IAE1C,0CAA0C;IAC1C,OAAO,eAAe,CAAC,MAAM,CAAC,mBAAmB,CAAC,CAAC,GAAG,CAAC,eAAe,CAAC,CAAC;AAC1E,CAAC;AAED,SAAS,KAAK,CAAC,KAAa;IAC1B,OAAO,wBAAwB,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC,KAAK,CAAC,CAAC;AACxE,CAAC;AAED,SAAS,gBAAgB,CAAC,KAAa;IACrC,OAAO,UAAU,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC;AAC5E,CAAC;AAED,MAAM,kBAAkB,GAAG,EAAE,CAAC;AAE9B,8IAA8I;AAC9I,MAAM,UAAU,iBAAiB,CAAC,OAAe;IAC/C,OAAO,KAAK,CAAC,OAAO,CAAC,IAAI,gBAAgB,CAAC,OAAO,CAAC,KAAK,kBAAkB,CAAC;AAC5E,CAAC;AAQD,MAAM,CAAC,MAAM,kBAAkB,GAAG;IAChC,IAAI,EAAE,GAAG,iBAAiB,iBAAiB;IAC3C,EAAE,EAAE,kBAAkB;IACtB,IAAI,EAAE,kBAAkB;CACzB,CAAC;AAEF;;GAEG;AACH,MAAM,CAAC,MAAM,qBAAqB,GAChC;IACE,OAAO,EAAE;QACP,IAAI,EAAE,GAAG,iBAAiB,eAAe;QACzC,WAAW,EAAE,SAAS;KACvB;IACD,QAAQ,EAAE;QACR,IAAI,EAAE,GAAG,iBAAiB,gBAAgB;QAC1C,WAAW,EAAE,UAAU;KACxB;IACD,YAAY,EAAE;QACZ,IAAI,EAAE,GAAG,iBAAiB,WAAW;QACrC,WAAW,EAAE,KAAK;KACnB;IACD,qBAAqB,EAAE;QACrB,IAAI,EAAE,GAAG,iBAAiB,oBAAoB;QAC9C,WAAW,EAAE,cAAc;KAC5B;IACD,aAAa,EAAE;QACb,IAAI,EAAE,GAAG,iBAAiB,YAAY;KACvC;IACD,0BAA0B,EAAE;QAC1B,IAAI,EAAE,GAAG,iBAAiB,aAAa;QACvC,IAAI,EAAE,cAAc;KACrB;CACF,CAAC;AAEJ;;GAEG;AACH,SAAS,eAAe,CAAC,MAAyB;IAChD,MAAM,EAAE,IAAI,EAAE,IAAI,EAAE,WAAW,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,GAAG,MAAM,CAAC;IAEjE,MAAM,gBAAgB,GAAG,EAAE,IAAI,WAAW,CAAC;IAC3C,MAAM,eAAe,GAAG,qBAAqB,CAAC,gBAAgB,CAAC,CAAC;IAChE,MAAM,UAAU,GAAG,eAAe,EAAE,IAAI,IAAI,IAAI,CAAC;IACjD,MAAM,IAAI,GAAG,eAAe,EAAE,IAAI,IAAI,WAAW,CAAC;IAClD,MAAM,WAAW,GACf,eAAe,EAAE,WAAW,IAAK,gBAAgC,CAAC;IAEpE,MAAM,gBAAgB,GAAG,WAAW,KAAK,kBAAkB,CAAC,EAAE,CAAC;IAE/D,OAAO;QACL,WAAW;QACX,IAAI;QACJ,aAAa,EAAE,IAAI;QACnB,IAAI,EAAE,SAAS,CAAC,GAAG;QACnB,IAAI,EAAE,UAAU;QAChB,UAAU,EAAE,IAAwB;QACpC,QAAQ,EAAE,KAAK;QACf,2DAA2D;QAC3D,qCAAqC;QACrC,WAAW,EAAE,gBAAgB,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC,IAAI;QACtD,gBAAgB,EAAE,gBAAgB;QAClC,SAAS;YACP,OAAO;gBACL,eAAe,EAAE,QAAQ,CAAC,qBAAqB,CAAC,CAAC,eAAe;gBAChE,OAAO,EAAE,KAAK,IAAI,EAAE;oBAClB,MAAM,EAAE,QAAQ,EAAE,GAAG,MAAM,QAAQ,CAAC,kBAAkB,CAAC,CAAC,OAAO,EAAE,CAAC;oBAElE,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;wBACxB,MAAM,IAAI,KAAK,CAAC,4CAA4C,CAAC,CAAC;oBAEhE,IAAI,CAAC,QAAQ,CAAC,MAAM,EAAE;wBACpB,MAAM,IAAI,KAAK,CAAC,kCAAkC,CAAC,CAAC;qBACrD;oBAED,OAAO;wBACL,OAAO,EAAE,QAAQ,CAAC,CAAC,CAAC;wBACpB,KAAK,EAAE,MAAM,CAAC,CAAC,CAAC;qBACjB,CAAC;gBACJ,CAAC;gBACD,UAAU,EAAE,KAAK,IAAI,EAAE;oBACrB,MAAM,QAAQ,CAAC,qBAAqB,CAAC,EAAE,UAAU,EAAE,CAAC;gBACtD,CAAC;aACF,CAAC;QACJ,CAAC;KACF,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,WAAW,CAAC,OAAe;IACzC,QAAQ,OAAO,EAAE;QACf,KAAK,SAAS,CAAC,GAAG;YAChB,OAAO,iBAAiB,CAAC;QAC3B,KAAK,SAAS,CAAC,WAAW;YACxB,OAAO,iBAAiB,CAAC;QAC3B;YACE,OAAO,IAAI,CAAC;KACf;AACH,CAAC"}
@@ -0,0 +1,207 @@
1
+ import { ActionType, BridgeType, SquidDataType, } from "@0xsquid/squid-types";
2
+ import axios from "axios";
3
+ import { DEFAULT_LOCALE } from "../../core/constants";
4
+ import { TransactionType, } from "../../core/types/transaction";
5
+ import { getQueryHeaders } from "./apiService";
6
+ export const formatTransactionHistoryDate = (transaction) => {
7
+ if (!transaction?.timestamp)
8
+ return undefined;
9
+ try {
10
+ const date = new Date(Number(transaction.timestamp));
11
+ // Format date to: MMM DD. Examples:
12
+ // Jan 01
13
+ // May 12
14
+ const month = new Intl.DateTimeFormat(DEFAULT_LOCALE, {
15
+ month: "short",
16
+ }).format(date);
17
+ const day = date.toLocaleString(DEFAULT_LOCALE, { day: "2-digit" });
18
+ return { month, day };
19
+ }
20
+ catch (error) {
21
+ console.error("Error formatting date:", error);
22
+ return undefined;
23
+ }
24
+ };
25
+ export const getAxelarExplorerTxUrl = (urlPrefix, routeType, txID) => {
26
+ if (!urlPrefix) {
27
+ return undefined;
28
+ }
29
+ const txType = routeType ?? TransactionType.BRIDGE;
30
+ if (txType === TransactionType.CALL_BRIDGE ||
31
+ txType === TransactionType.BRIDGE) {
32
+ return `${urlPrefix}transfer/${txID}`;
33
+ }
34
+ return `${urlPrefix}gmp/${txID}`;
35
+ };
36
+ export const getSourceExplorerTxUrl = (chain, txID) => {
37
+ if (!chain || !chain.blockExplorerUrls[0]) {
38
+ return undefined;
39
+ }
40
+ let txSuffix;
41
+ switch (chain.chainId) {
42
+ case "agoric-3":
43
+ txSuffix = "/transactions/";
44
+ break;
45
+ default:
46
+ txSuffix = "/tx/";
47
+ }
48
+ if (chain.blockExplorerUrls[0].endsWith("/")) {
49
+ txSuffix = txSuffix.slice(1);
50
+ }
51
+ return `${chain.blockExplorerUrls[0]}${txSuffix}${txID}`;
52
+ };
53
+ export const getMainExplorerUrl = (transaction) => {
54
+ // The most accurate one is coming from squid /status api
55
+ if (transaction?.statusResponse?.axelarTransactionUrl) {
56
+ return transaction?.statusResponse.axelarTransactionUrl;
57
+ }
58
+ // If not, we can try to get it from the source chain
59
+ if (transaction?.sourceTxExplorerUrl) {
60
+ return transaction?.sourceTxExplorerUrl;
61
+ }
62
+ // If not, we can try to guess it from the transaction type
63
+ if (transaction && transaction?.transactionId) {
64
+ return getAxelarExplorerTxUrl(transaction.statusResponse?.axelarTransactionUrl, transaction.routeType, transaction.transactionId);
65
+ }
66
+ return undefined;
67
+ };
68
+ export const formatDistance = (date, baseDate, options) => {
69
+ const { includeSeconds = false, addSuffix = false, locale = { locale: DEFAULT_LOCALE }, } = options || {};
70
+ const elapsedMilliseconds = Math.abs(new Date(date).getTime() - new Date(baseDate).getTime());
71
+ const seconds = Math.round(elapsedMilliseconds / 1000);
72
+ const minutes = Math.round(seconds / 60);
73
+ const hours = Math.round(minutes / 60);
74
+ const days = Math.round(hours / 24);
75
+ const months = Math.round(days / 30.44);
76
+ const years = Math.round(days / 365.25);
77
+ const rtf = new Intl.RelativeTimeFormat(locale.locale, { numeric: "auto" });
78
+ let formatted = "";
79
+ if (includeSeconds && seconds < 45) {
80
+ const unit = addSuffix ? "second" : "seconds";
81
+ formatted = rtf.format(-seconds, unit);
82
+ }
83
+ else if (minutes < 60) {
84
+ formatted = rtf.format(-minutes, "minutes");
85
+ }
86
+ else if (hours < 24) {
87
+ formatted = rtf.format(-hours, "hours");
88
+ }
89
+ else if (days < 30) {
90
+ formatted = rtf.format(-days, "days");
91
+ }
92
+ else if (months < 12) {
93
+ formatted = rtf.format(-months, "months");
94
+ }
95
+ else {
96
+ formatted = rtf.format(-years, "years");
97
+ }
98
+ // remove "ago" from the string
99
+ // before: "2 minutes ago"
100
+ // after: "2 minutes"
101
+ return addSuffix ? formatted : formatted.replace(/\b(?:ago)\b/, "").trim();
102
+ };
103
+ export const formatSeconds = (seconds, secondsTemplate = " seconds", minutesTemplate = " minutes", hoursTemplate = " hours") => {
104
+ let duration = "";
105
+ if (seconds < 60) {
106
+ duration = `${seconds.toString()}${secondsTemplate}`;
107
+ }
108
+ else {
109
+ duration = formatDistance(0, seconds * 1000, { includeSeconds: true });
110
+ }
111
+ const result = duration.startsWith("1 ")
112
+ ? duration
113
+ .replace(" minute", minutesTemplate)
114
+ .replace(" hour", hoursTemplate)
115
+ : duration
116
+ .replace(" minutes", minutesTemplate)
117
+ .replace(" hours", hoursTemplate);
118
+ return result;
119
+ };
120
+ /**
121
+ * Remove the chainData from statusResponse to gain some storage space
122
+ * @param sr
123
+ * @returns
124
+ */
125
+ export const formatStatusResponseForStorage = (sr) => {
126
+ if (!sr) {
127
+ return sr;
128
+ }
129
+ const formattedSrcChain = sr.fromChain
130
+ ? {
131
+ ...sr.fromChain,
132
+ chainData: undefined,
133
+ callEventLog: [],
134
+ }
135
+ : undefined;
136
+ const formattedDestChain = sr.toChain
137
+ ? {
138
+ ...sr.toChain,
139
+ chainData: undefined,
140
+ callEventLog: [],
141
+ }
142
+ : undefined;
143
+ return {
144
+ ...sr,
145
+ fromChain: formattedSrcChain,
146
+ toChain: formattedDestChain,
147
+ };
148
+ };
149
+ export const formatTxForStorage = (tx) => {
150
+ return {
151
+ ...tx,
152
+ statusResponse: formatStatusResponseForStorage(tx.statusResponse),
153
+ };
154
+ };
155
+ export const fetchTransactionStatus = async ({ transaction, integratorId, apiUrl, }) => {
156
+ const statusEndpoint = `${apiUrl}/v2/status`;
157
+ try {
158
+ const response = await axios.get(statusEndpoint, {
159
+ params: {
160
+ transactionId: transaction?.transactionIdForStatus ?? transaction?.transactionId,
161
+ fromChainId: transaction?.fromChain,
162
+ toChainId: transaction?.toChain,
163
+ bridgeType: transaction?.bridgeType,
164
+ quoteId: transaction?.requestId,
165
+ },
166
+ headers: getQueryHeaders(integratorId, transaction?.requestId),
167
+ });
168
+ return response.data;
169
+ }
170
+ catch (error) {
171
+ if (error) {
172
+ throw new Error("Fetch transaction status failed", { cause: error });
173
+ }
174
+ throw new Error("Fetch transaction status failed", { cause: undefined });
175
+ }
176
+ };
177
+ export const compareTransactionIds = (idA, idB) => {
178
+ if (!idA || !idB) {
179
+ return false;
180
+ }
181
+ const normalizedA = idA.toLowerCase();
182
+ const normalizedB = idB.toLowerCase();
183
+ return normalizedA.includes(normalizedB) || normalizedB.includes(normalizedA);
184
+ };
185
+ /**
186
+ * Checks if the provided action is Coral bridge action
187
+ */
188
+ export function isCoralBridgeAction(action) {
189
+ return (action.type === ActionType.RFQ &&
190
+ // TODO: update types
191
+ action.provider?.toLowerCase() === "coral");
192
+ }
193
+ export function sleep(ms) {
194
+ return new Promise((resolve) => setTimeout(resolve, ms));
195
+ }
196
+ export const isDepositRoute = (route) => {
197
+ return (!!route &&
198
+ route.transactionRequest?.type === SquidDataType.ChainflipDepositAddress);
199
+ };
200
+ /**
201
+ * Checks if the route contains a Chainflip bridge action
202
+ */
203
+ export function isChainflipBridgeTransaction(actions = []) {
204
+ return actions.some((action) => action.type === ActionType.BRIDGE &&
205
+ action.data?.type === BridgeType.CHAINFLIP);
206
+ }
207
+ //# sourceMappingURL=transactionService.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"transactionService.js","sourceRoot":"","sources":["../../../src/services/internal/transactionService.ts"],"names":[],"mappings":"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"}