@lifi/widget 4.7.1 → 4.9.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 (214) hide show
  1. package/dist/esm/components/AmountInput/AmountInput.style.d.ts.map +1 -1
  2. package/dist/esm/components/AmountInputCard/AmountInputCardPair.js +5 -2
  3. package/dist/esm/components/AmountInputCard/AmountInputCardPair.js.map +1 -1
  4. package/dist/esm/components/Card/Card.d.ts.map +1 -1
  5. package/dist/esm/components/Card/CardIconButton.d.ts.map +1 -1
  6. package/dist/esm/components/ContractComponent/ItemPrice.d.ts.map +1 -1
  7. package/dist/esm/components/ListItem/ListItemButton.d.ts.map +1 -1
  8. package/dist/esm/components/ListItemButton.d.ts.map +1 -1
  9. package/dist/esm/components/SelectChainAndToken.js +5 -2
  10. package/dist/esm/components/SelectChainAndToken.js.map +1 -1
  11. package/dist/esm/components/SendToWallet/SendToWalletButton.js +5 -4
  12. package/dist/esm/components/SendToWallet/SendToWalletButton.js.map +1 -1
  13. package/dist/esm/components/Token/Token.d.ts.map +1 -1
  14. package/dist/esm/components/TokenList/types.d.ts.map +1 -1
  15. package/dist/esm/components/TokenList/useTokenSelect.d.ts.map +1 -1
  16. package/dist/esm/components/TokenList/useTokenSelect.js +10 -0
  17. package/dist/esm/components/TokenList/useTokenSelect.js.map +1 -1
  18. package/dist/esm/config/constants.js.map +1 -1
  19. package/dist/esm/config/version.d.ts +1 -1
  20. package/dist/esm/config/version.js +1 -1
  21. package/dist/esm/config/version.js.map +1 -1
  22. package/dist/esm/hooks/useAccountsBalancesData.js +5 -2
  23. package/dist/esm/hooks/useAccountsBalancesData.js.map +1 -1
  24. package/dist/esm/hooks/useAddressValidation.d.ts +3 -2
  25. package/dist/esm/hooks/useAddressValidation.d.ts.map +1 -1
  26. package/dist/esm/hooks/useAddressValidation.js +48 -21
  27. package/dist/esm/hooks/useAddressValidation.js.map +1 -1
  28. package/dist/esm/hooks/useAvailableChains.d.ts.map +1 -1
  29. package/dist/esm/hooks/useAvailableChains.js +21 -38
  30. package/dist/esm/hooks/useAvailableChains.js.map +1 -1
  31. package/dist/esm/hooks/useFromTokenSufficiency.js +3 -3
  32. package/dist/esm/hooks/useFromTokenSufficiency.js.map +1 -1
  33. package/dist/esm/hooks/useGasRecommendation.js +3 -3
  34. package/dist/esm/hooks/useGasRecommendation.js.map +1 -1
  35. package/dist/esm/hooks/useGasRefuel.js +4 -1
  36. package/dist/esm/hooks/useGasRefuel.js.map +1 -1
  37. package/dist/esm/hooks/useGasSufficiency.js +3 -3
  38. package/dist/esm/hooks/useGasSufficiency.js.map +1 -1
  39. package/dist/esm/hooks/useIsBatchingSupported.js +2 -2
  40. package/dist/esm/hooks/useIsBatchingSupported.js.map +1 -1
  41. package/dist/esm/hooks/useRouteExecution.js +6 -6
  42. package/dist/esm/hooks/useRouteExecution.js.map +1 -1
  43. package/dist/esm/hooks/useRoutes.d.ts.map +1 -1
  44. package/dist/esm/hooks/useRoutes.js +18 -13
  45. package/dist/esm/hooks/useRoutes.js.map +1 -1
  46. package/dist/esm/hooks/useToAddressAutoPopulate.js +6 -8
  47. package/dist/esm/hooks/useToAddressAutoPopulate.js.map +1 -1
  48. package/dist/esm/hooks/useToAddressRequirements.d.ts +3 -2
  49. package/dist/esm/hooks/useToAddressRequirements.d.ts.map +1 -1
  50. package/dist/esm/hooks/useToAddressRequirements.js +8 -7
  51. package/dist/esm/hooks/useToAddressRequirements.js.map +1 -1
  52. package/dist/esm/hooks/useToAddressReset.js +6 -3
  53. package/dist/esm/hooks/useToAddressReset.js.map +1 -1
  54. package/dist/esm/hooks/useTokenBalance.js +6 -5
  55. package/dist/esm/hooks/useTokenBalance.js.map +1 -1
  56. package/dist/esm/hooks/useTokenBalancesQueries.js +3 -3
  57. package/dist/esm/hooks/useTokenBalancesQueries.js.map +1 -1
  58. package/dist/esm/hooks/useTokenSearch.js +3 -3
  59. package/dist/esm/hooks/useTokenSearch.js.map +1 -1
  60. package/dist/esm/hooks/useTokens.js +15 -15
  61. package/dist/esm/hooks/useTokens.js.map +1 -1
  62. package/dist/esm/hooks/useTools.d.ts.map +1 -1
  63. package/dist/esm/hooks/useTools.js +26 -27
  64. package/dist/esm/hooks/useTools.js.map +1 -1
  65. package/dist/esm/hooks/useTransactionDetails.js +2 -2
  66. package/dist/esm/hooks/useTransactionDetails.js.map +1 -1
  67. package/dist/esm/hooks/useTransactionHistory.js +3 -3
  68. package/dist/esm/hooks/useTransactionHistory.js.map +1 -1
  69. package/dist/esm/i18n/bn.json +2 -1
  70. package/dist/esm/i18n/de.json +2 -1
  71. package/dist/esm/i18n/en.json +2 -1
  72. package/dist/esm/i18n/es.json +2 -1
  73. package/dist/esm/i18n/fr.json +2 -1
  74. package/dist/esm/i18n/hi.json +2 -1
  75. package/dist/esm/i18n/id.json +2 -1
  76. package/dist/esm/i18n/it.json +2 -1
  77. package/dist/esm/i18n/ja.json +2 -1
  78. package/dist/esm/i18n/ko.json +2 -1
  79. package/dist/esm/i18n/pl.json +2 -1
  80. package/dist/esm/i18n/pt.json +2 -1
  81. package/dist/esm/i18n/th.json +2 -1
  82. package/dist/esm/i18n/tr.json +2 -1
  83. package/dist/esm/i18n/uk.json +2 -1
  84. package/dist/esm/i18n/vi.json +2 -1
  85. package/dist/esm/i18n/zh.json +2 -1
  86. package/dist/esm/index.d.ts +5 -1
  87. package/dist/esm/index.js +3 -1
  88. package/dist/esm/pages/RoutesPage/RoutesPage.style.d.ts.map +1 -1
  89. package/dist/esm/pages/SendToWallet/BookmarkAddressSheet.js +7 -4
  90. package/dist/esm/pages/SendToWallet/BookmarkAddressSheet.js.map +1 -1
  91. package/dist/esm/pages/SendToWallet/BookmarksPage.js +35 -31
  92. package/dist/esm/pages/SendToWallet/BookmarksPage.js.map +1 -1
  93. package/dist/esm/pages/SendToWallet/ConnectedWalletsPage.js +4 -3
  94. package/dist/esm/pages/SendToWallet/ConnectedWalletsPage.js.map +1 -1
  95. package/dist/esm/pages/SendToWallet/RecentWalletsPage.js +43 -39
  96. package/dist/esm/pages/SendToWallet/RecentWalletsPage.js.map +1 -1
  97. package/dist/esm/pages/SendToWallet/SendToConfiguredWalletPage.js +32 -26
  98. package/dist/esm/pages/SendToWallet/SendToConfiguredWalletPage.js.map +1 -1
  99. package/dist/esm/pages/SendToWallet/SendToWalletPage.js +5 -10
  100. package/dist/esm/pages/SendToWallet/SendToWalletPage.js.map +1 -1
  101. package/dist/esm/providers/I18nProvider/types.d.ts.map +1 -1
  102. package/dist/esm/providers/WalletProvider/WalletProvider.d.ts.map +1 -1
  103. package/dist/esm/providers/WalletProvider/WalletProvider.js +14 -2
  104. package/dist/esm/providers/WalletProvider/WalletProvider.js.map +1 -1
  105. package/dist/esm/providers/WidgetProvider/WidgetProvider.d.ts.map +1 -1
  106. package/dist/esm/providers/WidgetProvider/WidgetProvider.js +15 -11
  107. package/dist/esm/providers/WidgetProvider/WidgetProvider.js.map +1 -1
  108. package/dist/esm/providers/WidgetProvider/types.d.ts +2 -0
  109. package/dist/esm/providers/WidgetProvider/types.d.ts.map +1 -1
  110. package/dist/esm/queries/getChains.d.ts +38 -0
  111. package/dist/esm/queries/getChains.d.ts.map +1 -0
  112. package/dist/esm/queries/getChains.js +51 -0
  113. package/dist/esm/queries/getChains.js.map +1 -0
  114. package/dist/esm/queries/getTools.d.ts +26 -0
  115. package/dist/esm/queries/getTools.d.ts.map +1 -0
  116. package/dist/esm/queries/getTools.js +30 -0
  117. package/dist/esm/queries/getTools.js.map +1 -0
  118. package/dist/esm/queries/index.d.ts +4 -0
  119. package/dist/esm/queries/index.js +3 -0
  120. package/dist/esm/queries/types.d.ts +25 -0
  121. package/dist/esm/queries/types.d.ts.map +1 -0
  122. package/dist/esm/shared.d.ts +2 -1
  123. package/dist/esm/shared.js +2 -1
  124. package/dist/esm/stores/StoreProvider.d.ts.map +1 -1
  125. package/dist/esm/stores/StoreProvider.js +16 -17
  126. package/dist/esm/stores/StoreProvider.js.map +1 -1
  127. package/dist/esm/stores/bookmarks/types.d.ts +3 -0
  128. package/dist/esm/stores/bookmarks/types.d.ts.map +1 -1
  129. package/dist/esm/stores/chains/ChainOrderStore.d.ts.map +1 -1
  130. package/dist/esm/stores/chains/ChainOrderStore.js +4 -1
  131. package/dist/esm/stores/chains/ChainOrderStore.js.map +1 -1
  132. package/dist/esm/stores/form/FormStore.js +3 -2
  133. package/dist/esm/stores/form/FormStore.js.map +1 -1
  134. package/dist/esm/stores/form/URLSearchParamsBuilder.js +7 -3
  135. package/dist/esm/stores/form/URLSearchParamsBuilder.js.map +1 -1
  136. package/dist/esm/stores/form/getDefaultValuesFromQueryString.js +4 -1
  137. package/dist/esm/stores/form/getDefaultValuesFromQueryString.js.map +1 -1
  138. package/dist/esm/stores/header/useHeaderStore.d.ts +1 -1
  139. package/dist/esm/stores/header/useHeaderStore.d.ts.map +1 -1
  140. package/dist/esm/stores/header/useHeaderStore.js.map +1 -1
  141. package/dist/esm/themes/createTheme.d.ts.map +1 -1
  142. package/dist/esm/types/events.d.ts.map +1 -1
  143. package/dist/esm/types/token.d.ts.map +1 -1
  144. package/dist/esm/types/widget.d.ts +30 -0
  145. package/dist/esm/types/widget.d.ts.map +1 -1
  146. package/dist/esm/types/widget.js.map +1 -1
  147. package/dist/esm/utils/chainType.js +32 -1
  148. package/dist/esm/utils/chainType.js.map +1 -1
  149. package/dist/esm/utils/customReceiver.js +6 -1
  150. package/dist/esm/utils/customReceiver.js.map +1 -1
  151. package/dist/esm/utils/queries.js.map +1 -1
  152. package/dist/esm/utils/scopeKeys.d.ts +6 -0
  153. package/dist/esm/utils/scopeKeys.d.ts.map +1 -0
  154. package/dist/esm/utils/scopeKeys.js +8 -0
  155. package/dist/esm/utils/scopeKeys.js.map +1 -0
  156. package/package.json +15 -7
  157. package/src/components/AmountInputCard/AmountInputCardPair.tsx +6 -2
  158. package/src/components/SelectChainAndToken.tsx +5 -1
  159. package/src/components/SendToWallet/SendToWalletButton.tsx +13 -8
  160. package/src/components/TokenList/useTokenSelect.ts +15 -0
  161. package/src/config/constants.ts +3 -0
  162. package/src/config/version.ts +1 -1
  163. package/src/hooks/useAccountsBalancesData.ts +6 -2
  164. package/src/hooks/useAddressValidation.ts +87 -32
  165. package/src/hooks/useAvailableChains.test.tsx +170 -0
  166. package/src/hooks/useAvailableChains.ts +29 -47
  167. package/src/hooks/useFromTokenSufficiency.ts +2 -2
  168. package/src/hooks/useGasRecommendation.ts +2 -2
  169. package/src/hooks/useGasRefuel.ts +11 -1
  170. package/src/hooks/useGasSufficiency.ts +2 -2
  171. package/src/hooks/useIsBatchingSupported.ts +2 -2
  172. package/src/hooks/useRouteExecution.ts +5 -5
  173. package/src/hooks/useRoutes.ts +28 -23
  174. package/src/hooks/useToAddressAutoPopulate.ts +13 -17
  175. package/src/hooks/useToAddressRequirements.ts +19 -4
  176. package/src/hooks/useToAddressReset.ts +13 -4
  177. package/src/hooks/useTokenBalance.ts +10 -5
  178. package/src/hooks/useTokenBalancesQueries.ts +3 -3
  179. package/src/hooks/useTokenSearch.ts +7 -3
  180. package/src/hooks/useTokens.ts +13 -14
  181. package/src/hooks/useTools.sharedEntry.test.tsx +155 -0
  182. package/src/hooks/useTools.ts +42 -37
  183. package/src/hooks/useTransactionDetails.ts +3 -3
  184. package/src/hooks/useTransactionHistory.ts +2 -2
  185. package/src/index.ts +2 -1
  186. package/src/pages/SendToWallet/BookmarkAddressSheet.tsx +5 -1
  187. package/src/pages/SendToWallet/BookmarksPage.tsx +42 -52
  188. package/src/pages/SendToWallet/ConnectedWalletsPage.tsx +4 -14
  189. package/src/pages/SendToWallet/RecentWalletsPage.tsx +59 -66
  190. package/src/pages/SendToWallet/SendToConfiguredWalletPage.tsx +45 -50
  191. package/src/pages/SendToWallet/SendToWalletPage.tsx +4 -16
  192. package/src/providers/WalletProvider/WalletProvider.tsx +28 -3
  193. package/src/providers/WidgetProvider/WidgetProvider.test.tsx +73 -0
  194. package/src/providers/WidgetProvider/WidgetProvider.tsx +28 -14
  195. package/src/providers/WidgetProvider/types.ts +2 -0
  196. package/src/queries/getChains.ts +93 -0
  197. package/src/queries/getTools.ts +62 -0
  198. package/src/queries/index.ts +30 -0
  199. package/src/queries/sharedCache.test.tsx +223 -0
  200. package/src/queries/types.ts +38 -0
  201. package/src/shared.ts +1 -0
  202. package/src/stores/StoreProvider.test.tsx +107 -0
  203. package/src/stores/StoreProvider.tsx +8 -6
  204. package/src/stores/bookmarks/types.ts +3 -0
  205. package/src/stores/chains/ChainOrderStore.tsx +4 -1
  206. package/src/stores/form/FormStore.tsx +2 -0
  207. package/src/stores/form/URLSearchParamsBuilder.tsx +4 -2
  208. package/src/stores/form/getDefaultValuesFromQueryString.ts +19 -0
  209. package/src/stores/header/useHeaderStore.tsx +3 -4
  210. package/src/types/widget.ts +30 -0
  211. package/src/utils/chainType.ts +73 -1
  212. package/src/utils/customReceiver.ts +36 -0
  213. package/src/utils/queries.ts +1 -0
  214. package/src/utils/scopeKeys.ts +18 -0
@@ -1 +1 @@
1
- {"version":3,"file":"useTokens.js","names":[],"sources":["../../../src/hooks/useTokens.ts"],"sourcesContent":["import {\n ChainType,\n getToken,\n getTokens,\n type TokenExtended,\n type TokensExtendedResponse,\n} from '@lifi/sdk'\nimport { useChainTypeFromAddress } from '@lifi/widget-provider'\nimport { useQuery } from '@tanstack/react-query'\nimport { useMemo } from 'react'\nimport { useSDKClient } from '../providers/SDKClientProvider.js'\nimport { useWidgetConfig } from '../providers/WidgetProvider/WidgetProvider.js'\nimport type { FormType } from '../stores/form/types.js'\nimport type { TokensByChain } from '../types/token.js'\nimport { isAddressQuery } from '../utils/address.js'\nimport { defaultChainIdsByType } from '../utils/chainType.js'\nimport { isItemAllowed } from '../utils/item.js'\nimport { getQueryKey } from '../utils/queries.js'\nimport {\n filterAllowedTokens,\n getNativeTokenAddresses,\n mergeVerifiedWithSearchTokens,\n} from '../utils/token.js'\nimport { useAvailableChains } from './useAvailableChains.js'\n\nconst refetchInterval = 300_000\n\nexport const useTokens = (\n formType?: FormType,\n search?: string,\n chainId?: number\n): {\n allTokens: Record<number, TokenExtended[]> | undefined\n isLoading: boolean\n isSearchLoading: boolean\n /** The search is a contract address, so only the token at that address matches. */\n isAddressSearch: boolean\n} => {\n const {\n tokens: configTokens,\n chains: chainsConfig,\n keyPrefix,\n } = useWidgetConfig()\n const sdkClient = useSDKClient()\n const { getChainTypeFromTokenAddress } = useChainTypeFromAddress()\n // A pasted address often carries a trailing space or newline, which the\n // API rejects. Trim once so the key, the requests and the checks agree.\n const trimmedSearch = search?.trim()\n // Keep this memoized, and out of any per-token loop: a provider validates by\n // parsing, which costs microseconds per call rather than nanoseconds.\n const isAddressSearch = useMemo(\n () => isAddressQuery(trimmedSearch, getChainTypeFromTokenAddress),\n [trimmedSearch, getChainTypeFromTokenAddress]\n )\n\n // Main tokens cache - verified tokens from API\n const { data: verifiedTokens, isLoading } = useQuery({\n queryKey: [getQueryKey('tokens', keyPrefix)],\n queryFn: async ({ signal }) => {\n const chainTypes = [\n ChainType.EVM,\n ChainType.SVM,\n ChainType.UTXO,\n ChainType.MVM,\n ChainType.TVM,\n ChainType.STL,\n ].filter((chainType) => isItemAllowed(chainType, chainsConfig?.types))\n\n const tokensResponse: TokensExtendedResponse = await getTokens(\n sdkClient,\n {\n chainTypes,\n orderBy: 'volumeUSD24H',\n extended: true,\n limit: 1000,\n minPriceUSD: 0.000001,\n },\n { signal }\n )\n\n // `listed` tells a main-list token from a searched one\n const tokens: TokensByChain = Object.fromEntries(\n Object.entries(tokensResponse.tokens).map(([chainId, tokens]) => [\n chainId,\n tokens.map((token) => ({ ...token, listed: true })),\n ])\n )\n\n return tokens\n },\n refetchInterval,\n staleTime: refetchInterval,\n })\n\n // Search tokens cache - unverified tokens from search\n const { data: searchTokens, isLoading: isSearchLoading } = useQuery({\n queryKey: [\n getQueryKey('tokens-search', keyPrefix),\n trimmedSearch,\n chainId,\n isAddressSearch,\n ] as const,\n queryFn: async ({ queryKey, signal }) => {\n const [, searchQuery, searchChainId, addressSearch] = queryKey\n const chainTypes = [\n ChainType.EVM,\n ChainType.SVM,\n ChainType.UTXO,\n ChainType.MVM,\n ChainType.TVM,\n ChainType.STL,\n ].filter((chainType) => isItemAllowed(chainType, chainsConfig?.types))\n\n const tokensResponse: TokensExtendedResponse = await getTokens(\n sdkClient,\n {\n chainTypes,\n orderBy: 'volumeUSD24H',\n extended: true,\n search: searchQuery,\n limit: 1000,\n minPriceUSD: 0.000001,\n },\n { signal }\n )\n\n // Fallback: fetch a single token from the /token endpoint when the\n // search did not deliver one. Look it up on the selected chain, or\n // without one on the default chain of the address format.\n if (searchQuery) {\n const chainType = getChainTypeFromTokenAddress(searchQuery)\n const lookupChainId =\n searchChainId ??\n (chainType ? defaultChainIdsByType[chainType] : undefined)\n if (lookupChainId) {\n const existingTokens = tokensResponse.tokens[lookupChainId] ?? []\n // The search index also matches names, so for an address query\n // impersonators that embed the address can fill the list while the\n // token at that address is missing. Without a selected chain the\n // token can sit on any chain of the response.\n const hasTokenAtAddress = () => {\n const address = searchQuery.toLowerCase()\n const candidates = searchChainId\n ? [existingTokens]\n : Object.values(tokensResponse.tokens)\n return candidates.some((tokens) =>\n tokens.some((token) => token.address?.toLowerCase() === address)\n )\n }\n const isTokenMissing = addressSearch\n ? !hasTokenAtAddress()\n : !existingTokens.length\n if (isTokenMissing) {\n try {\n const token = await getToken(\n sdkClient,\n lookupChainId,\n searchQuery,\n { signal }\n )\n if (token) {\n tokensResponse.tokens[lookupChainId] = [\n ...existingTokens,\n token,\n ]\n }\n } catch (error) {\n // A guessed chain may not hold the token (HTTP 400). Keep the\n // search results instead of failing the whole query.\n if (signal.aborted) {\n throw error\n }\n }\n }\n }\n }\n\n return tokensResponse.tokens as TokensByChain\n },\n enabled: !!trimmedSearch,\n refetchInterval,\n staleTime: refetchInterval,\n })\n\n const { chains } = useAvailableChains()\n const nativeTokenAddresses = useMemo(\n () => getNativeTokenAddresses(chains),\n [chains]\n )\n\n // Merge tokens at read time - single place where caches are combined\n const allTokens = useMemo(() => {\n const merged = mergeVerifiedWithSearchTokens(verifiedTokens, searchTokens)\n return filterAllowedTokens(\n merged,\n configTokens,\n chainsConfig,\n formType,\n nativeTokenAddresses\n )\n }, [\n verifiedTokens,\n searchTokens,\n configTokens,\n chainsConfig,\n formType,\n nativeTokenAddresses,\n ])\n\n return {\n allTokens,\n isLoading,\n isSearchLoading,\n isAddressSearch,\n }\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"useTokens.js","names":[],"sources":["../../../src/hooks/useTokens.ts"],"sourcesContent":["import {\n ChainType,\n getToken,\n getTokens,\n type TokenExtended,\n type TokensExtendedResponse,\n} from '@lifi/sdk'\nimport { useChainTypeFromAddress } from '@lifi/widget-provider'\nimport { useQuery } from '@tanstack/react-query'\nimport { useMemo } from 'react'\nimport { useSDKClient } from '../providers/SDKClientProvider.js'\nimport { useWidgetConfig } from '../providers/WidgetProvider/WidgetProvider.js'\nimport type { FormType } from '../stores/form/types.js'\nimport type { TokensByChain } from '../types/token.js'\nimport { isAddressQuery } from '../utils/address.js'\nimport { defaultChainIdsByType } from '../utils/chainType.js'\nimport { isItemAllowed } from '../utils/item.js'\nimport { getQueryKey } from '../utils/queries.js'\nimport {\n filterAllowedTokens,\n getNativeTokenAddresses,\n mergeVerifiedWithSearchTokens,\n} from '../utils/token.js'\nimport { useAvailableChains } from './useAvailableChains.js'\n\nconst refetchInterval = 300_000\n\n// The main list and the search send the same list parameters.\nconst tokenListParams = {\n orderBy: 'volumeUSD24H',\n extended: true,\n limit: 1100,\n minPriceUSD: 0.000001,\n} as const\n\nexport const useTokens = (\n formType?: FormType,\n search?: string,\n chainId?: number\n): {\n allTokens: Record<number, TokenExtended[]> | undefined\n isLoading: boolean\n isSearchLoading: boolean\n /** The search is a contract address, so only the token at that address matches. */\n isAddressSearch: boolean\n} => {\n const {\n tokens: configTokens,\n chains: chainsConfig,\n storageScopeKey,\n } = useWidgetConfig()\n const sdkClient = useSDKClient()\n const { getChainTypeFromTokenAddress } = useChainTypeFromAddress()\n // A pasted address often carries a trailing space or newline, which the\n // API rejects. Trim once so the key, the requests and the checks agree.\n const trimmedSearch = search?.trim()\n // Keep this memoized, and out of any per-token loop: a provider validates by\n // parsing, which costs microseconds per call rather than nanoseconds.\n const isAddressSearch = useMemo(\n () => isAddressQuery(trimmedSearch, getChainTypeFromTokenAddress),\n [trimmedSearch, getChainTypeFromTokenAddress]\n )\n\n // Main tokens cache - verified tokens from API\n const { data: verifiedTokens, isLoading } = useQuery({\n queryKey: [getQueryKey('tokens', storageScopeKey)],\n queryFn: async ({ signal }) => {\n const chainTypes = [\n ChainType.EVM,\n ChainType.SVM,\n ChainType.UTXO,\n ChainType.MVM,\n ChainType.TVM,\n ChainType.STL,\n ].filter((chainType) => isItemAllowed(chainType, chainsConfig?.types))\n\n const tokensResponse: TokensExtendedResponse = await getTokens(\n sdkClient,\n { ...tokenListParams, chainTypes },\n { signal }\n )\n\n // `listed` tells a main-list token from a searched one\n const tokens: TokensByChain = Object.fromEntries(\n Object.entries(tokensResponse.tokens).map(([chainId, tokens]) => [\n chainId,\n tokens.map((token) => ({ ...token, listed: true })),\n ])\n )\n\n return tokens\n },\n refetchInterval,\n staleTime: refetchInterval,\n })\n\n // Search tokens cache - unverified tokens from search\n const { data: searchTokens, isLoading: isSearchLoading } = useQuery({\n queryKey: [\n getQueryKey('tokens-search', storageScopeKey),\n trimmedSearch,\n chainId,\n isAddressSearch,\n ] as const,\n queryFn: async ({ queryKey, signal }) => {\n const [, searchQuery, searchChainId, addressSearch] = queryKey\n const chainTypes = [\n ChainType.EVM,\n ChainType.SVM,\n ChainType.UTXO,\n ChainType.MVM,\n ChainType.TVM,\n ChainType.STL,\n ].filter((chainType) => isItemAllowed(chainType, chainsConfig?.types))\n\n const tokensResponse: TokensExtendedResponse = await getTokens(\n sdkClient,\n {\n ...tokenListParams,\n chainTypes,\n search: searchQuery,\n },\n { signal }\n )\n\n // Fallback: fetch a single token from the /token endpoint when the\n // search did not deliver one. Look it up on the selected chain, or\n // without one on the default chain of the address format.\n if (searchQuery) {\n const chainType = getChainTypeFromTokenAddress(searchQuery)\n const lookupChainId =\n searchChainId ??\n (chainType ? defaultChainIdsByType[chainType] : undefined)\n if (lookupChainId) {\n const existingTokens = tokensResponse.tokens[lookupChainId] ?? []\n // The search index also matches names, so for an address query\n // impersonators that embed the address can fill the list while the\n // token at that address is missing. Without a selected chain the\n // token can sit on any chain of the response.\n const hasTokenAtAddress = () => {\n const address = searchQuery.toLowerCase()\n const candidates = searchChainId\n ? [existingTokens]\n : Object.values(tokensResponse.tokens)\n return candidates.some((tokens) =>\n tokens.some((token) => token.address?.toLowerCase() === address)\n )\n }\n const isTokenMissing = addressSearch\n ? !hasTokenAtAddress()\n : !existingTokens.length\n if (isTokenMissing) {\n try {\n const token = await getToken(\n sdkClient,\n lookupChainId,\n searchQuery,\n { signal }\n )\n if (token) {\n tokensResponse.tokens[lookupChainId] = [\n ...existingTokens,\n token,\n ]\n }\n } catch (error) {\n // A guessed chain may not hold the token (HTTP 400). Keep the\n // search results instead of failing the whole query.\n if (signal.aborted) {\n throw error\n }\n }\n }\n }\n }\n\n return tokensResponse.tokens as TokensByChain\n },\n enabled: !!trimmedSearch,\n refetchInterval,\n staleTime: refetchInterval,\n })\n\n const { chains } = useAvailableChains()\n const nativeTokenAddresses = useMemo(\n () => getNativeTokenAddresses(chains),\n [chains]\n )\n\n // Merge tokens at read time - single place where caches are combined\n const allTokens = useMemo(() => {\n const merged = mergeVerifiedWithSearchTokens(verifiedTokens, searchTokens)\n return filterAllowedTokens(\n merged,\n configTokens,\n chainsConfig,\n formType,\n nativeTokenAddresses\n )\n }, [\n verifiedTokens,\n searchTokens,\n configTokens,\n chainsConfig,\n formType,\n nativeTokenAddresses,\n ])\n\n return {\n allTokens,\n isLoading,\n isSearchLoading,\n isAddressSearch,\n }\n}\n"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"useTools.d.ts","names":[],"sources":["../../../src/hooks/useTools.ts"],"mappings":";;qBAQa;EAAiB,OAAO"}
1
+ {"version":3,"file":"useTools.d.ts","names":[],"sources":["../../../src/hooks/useTools.ts"],"mappings":";;qBAWa;EAAiB,OAAO"}
@@ -2,38 +2,37 @@ import { getConfigItemSets, isItemAllowedForSets } from "../utils/item.js";
2
2
  import { useSettingsStoreContext } from "../stores/settings/SettingsStore.js";
3
3
  import { useWidgetConfig } from "../providers/WidgetProvider/WidgetProvider.js";
4
4
  import { useSDKClient } from "../providers/SDKClientProvider.js";
5
- import { getQueryKey } from "../utils/queries.js";
6
- import { getTools } from "@lifi/sdk";
5
+ import { getToolsQueryOptions } from "../queries/getTools.js";
6
+ import { useCallback, useEffect } from "react";
7
7
  import { useQuery } from "@tanstack/react-query";
8
8
  //#region src/hooks/useTools.ts
9
+ const refetchInterval = 18e4;
9
10
  const useTools = () => {
10
- const { bridges, exchanges, keyPrefix } = useWidgetConfig();
11
+ const { bridges, exchanges, queryScopeKey } = useWidgetConfig();
11
12
  const settingsStore = useSettingsStoreContext();
12
13
  const sdkClient = useSDKClient();
13
- const { data } = useQuery({
14
- queryKey: [
15
- getQueryKey("tools", keyPrefix),
16
- bridges?.allow,
17
- bridges?.deny,
18
- exchanges?.allow,
19
- exchanges?.deny
20
- ],
21
- queryFn: async () => {
22
- const tools = await getTools(sdkClient);
23
- const bridgesConfigSets = getConfigItemSets(bridges, (bridges) => new Set(bridges));
24
- const exchangesConfigSets = getConfigItemSets(exchanges, (exchanges) => new Set(exchanges));
25
- const result = {
26
- bridges: tools.bridges.filter((bridge) => isItemAllowedForSets(bridge.key, bridgesConfigSets)),
27
- exchanges: tools.exchanges.filter((exchange) => isItemAllowedForSets(exchange.key, exchangesConfigSets))
28
- };
29
- const { initializeTools } = settingsStore.getState();
30
- initializeTools("Bridges", result.bridges.map((bridge) => bridge.key));
31
- initializeTools("Exchanges", result.exchanges.map((exchange) => exchange.key));
32
- return result;
33
- },
34
- refetchInterval: 18e4,
35
- staleTime: 18e4
36
- });
14
+ const selectAllowedTools = useCallback((tools) => {
15
+ const bridgeSets = getConfigItemSets(bridges, (keys) => new Set(keys));
16
+ const exchangeSets = getConfigItemSets(exchanges, (keys) => new Set(keys));
17
+ return {
18
+ bridges: tools.bridges.filter((bridge) => isItemAllowedForSets(bridge.key, bridgeSets)),
19
+ exchanges: tools.exchanges.filter((exchange) => isItemAllowedForSets(exchange.key, exchangeSets))
20
+ };
21
+ }, [bridges, exchanges]);
22
+ const { data } = useQuery(getToolsQueryOptions(sdkClient, {
23
+ scopeKey: queryScopeKey,
24
+ query: {
25
+ refetchInterval,
26
+ staleTime: refetchInterval,
27
+ select: selectAllowedTools
28
+ }
29
+ }));
30
+ useEffect(() => {
31
+ if (!data) return;
32
+ const { initializeTools } = settingsStore.getState();
33
+ initializeTools("Bridges", data.bridges.map((bridge) => bridge.key));
34
+ initializeTools("Exchanges", data.exchanges.map((exchange) => exchange.key));
35
+ }, [data, settingsStore]);
37
36
  return { tools: data };
38
37
  };
39
38
  //#endregion
@@ -1 +1 @@
1
- {"version":3,"file":"useTools.js","names":[],"sources":["../../../src/hooks/useTools.ts"],"sourcesContent":["import { getTools, type ToolsResponse } from '@lifi/sdk'\nimport { useQuery } from '@tanstack/react-query'\nimport { useSDKClient } from '../providers/SDKClientProvider.js'\nimport { useWidgetConfig } from '../providers/WidgetProvider/WidgetProvider.js'\nimport { useSettingsStoreContext } from '../stores/settings/SettingsStore.js'\nimport { getConfigItemSets, isItemAllowedForSets } from '../utils/item.js'\nimport { getQueryKey } from '../utils/queries.js'\n\nexport const useTools = (): { tools: ToolsResponse | undefined } => {\n const { bridges, exchanges, keyPrefix } = useWidgetConfig()\n const settingsStore = useSettingsStoreContext()\n const sdkClient = useSDKClient()\n\n const { data } = useQuery({\n queryKey: [\n getQueryKey('tools', keyPrefix),\n bridges?.allow,\n bridges?.deny,\n exchanges?.allow,\n exchanges?.deny,\n ],\n queryFn: async (): Promise<ToolsResponse> => {\n const tools = await getTools(sdkClient)\n const bridgesConfigSets = getConfigItemSets(\n bridges,\n (bridges) => new Set(bridges)\n )\n const exchangesConfigSets = getConfigItemSets(\n exchanges,\n (exchanges) => new Set(exchanges)\n )\n const result = {\n bridges: tools.bridges.filter((bridge) =>\n isItemAllowedForSets(bridge.key, bridgesConfigSets)\n ),\n exchanges: tools.exchanges.filter((exchange) =>\n isItemAllowedForSets(exchange.key, exchangesConfigSets)\n ),\n }\n const { initializeTools } = settingsStore.getState()\n initializeTools(\n 'Bridges',\n result.bridges.map((bridge) => bridge.key)\n )\n initializeTools(\n 'Exchanges',\n result.exchanges.map((exchange) => exchange.key)\n )\n return result\n },\n refetchInterval: 180_000,\n staleTime: 180_000,\n })\n\n return { tools: data }\n}\n"],"mappings":";;;;;;;;AAQA,MAAa,iBAAuD;CAClE,MAAM,EAAE,SAAS,WAAW,cAAc,gBAAgB;CAC1D,MAAM,gBAAgB,wBAAwB;CAC9C,MAAM,YAAY,aAAa;CAE/B,MAAM,EAAE,SAAS,SAAS;EACxB,UAAU;GACR,YAAY,SAAS,SAAS;GAC9B,SAAS;GACT,SAAS;GACT,WAAW;GACX,WAAW;EACb;EACA,SAAS,YAAoC;GAC3C,MAAM,QAAQ,MAAM,SAAS,SAAS;GACtC,MAAM,oBAAoB,kBACxB,UACC,YAAY,IAAI,IAAI,OAAO,CAC9B;GACA,MAAM,sBAAsB,kBAC1B,YACC,cAAc,IAAI,IAAI,SAAS,CAClC;GACA,MAAM,SAAS;IACb,SAAS,MAAM,QAAQ,QAAQ,WAC7B,qBAAqB,OAAO,KAAK,iBAAiB,CACpD;IACA,WAAW,MAAM,UAAU,QAAQ,aACjC,qBAAqB,SAAS,KAAK,mBAAmB,CACxD;GACF;GACA,MAAM,EAAE,oBAAoB,cAAc,SAAS;GACnD,gBACE,WACA,OAAO,QAAQ,KAAK,WAAW,OAAO,GAAG,CAC3C;GACA,gBACE,aACA,OAAO,UAAU,KAAK,aAAa,SAAS,GAAG,CACjD;GACA,OAAO;EACT;EACA,iBAAiB;EACjB,WAAW;CACb,CAAC;CAED,OAAO,EAAE,OAAO,KAAK;AACvB"}
1
+ {"version":3,"file":"useTools.js","names":[],"sources":["../../../src/hooks/useTools.ts"],"sourcesContent":["import type { ToolsResponse } from '@lifi/sdk'\nimport { useQuery } from '@tanstack/react-query'\nimport { useCallback, useEffect } from 'react'\nimport { useSDKClient } from '../providers/SDKClientProvider.js'\nimport { useWidgetConfig } from '../providers/WidgetProvider/WidgetProvider.js'\nimport { getToolsQueryOptions } from '../queries/getTools.js'\nimport { useSettingsStoreContext } from '../stores/settings/SettingsStore.js'\nimport { getConfigItemSets, isItemAllowedForSets } from '../utils/item.js'\n\nconst refetchInterval = 180_000\n\nexport const useTools = (): { tools: ToolsResponse | undefined } => {\n const { bridges, exchanges, queryScopeKey } = useWidgetConfig()\n const settingsStore = useSettingsStoreContext()\n const sdkClient = useSDKClient()\n\n const selectAllowedTools = useCallback(\n (tools: ToolsResponse): ToolsResponse => {\n const bridgeSets = getConfigItemSets(bridges, (keys) => new Set(keys))\n const exchangeSets = getConfigItemSets(exchanges, (keys) => new Set(keys))\n return {\n bridges: tools.bridges.filter((bridge) =>\n isItemAllowedForSets(bridge.key, bridgeSets)\n ),\n exchanges: tools.exchanges.filter((exchange) =>\n isItemAllowedForSets(exchange.key, exchangeSets)\n ),\n }\n },\n [bridges, exchanges]\n )\n\n const { data } = useQuery(\n getToolsQueryOptions(sdkClient, {\n scopeKey: queryScopeKey,\n query: {\n refetchInterval,\n staleTime: refetchInterval,\n select: selectAllowedTools,\n },\n })\n )\n\n // A host may fill the shared entry, so seed from the data, not in a queryFn.\n useEffect(() => {\n if (!data) {\n return\n }\n const { initializeTools } = settingsStore.getState()\n initializeTools(\n 'Bridges',\n data.bridges.map((bridge) => bridge.key)\n )\n initializeTools(\n 'Exchanges',\n data.exchanges.map((exchange) => exchange.key)\n )\n }, [data, settingsStore])\n\n return { tools: data }\n}\n"],"mappings":";;;;;;;;AASA,MAAM,kBAAkB;AAExB,MAAa,iBAAuD;CAClE,MAAM,EAAE,SAAS,WAAW,kBAAkB,gBAAgB;CAC9D,MAAM,gBAAgB,wBAAwB;CAC9C,MAAM,YAAY,aAAa;CAE/B,MAAM,qBAAqB,aACxB,UAAwC;EACvC,MAAM,aAAa,kBAAkB,UAAU,SAAS,IAAI,IAAI,IAAI,CAAC;EACrE,MAAM,eAAe,kBAAkB,YAAY,SAAS,IAAI,IAAI,IAAI,CAAC;EACzE,OAAO;GACL,SAAS,MAAM,QAAQ,QAAQ,WAC7B,qBAAqB,OAAO,KAAK,UAAU,CAC7C;GACA,WAAW,MAAM,UAAU,QAAQ,aACjC,qBAAqB,SAAS,KAAK,YAAY,CACjD;EACF;CACF,GACA,CAAC,SAAS,SAAS,CACrB;CAEA,MAAM,EAAE,SAAS,SACf,qBAAqB,WAAW;EAC9B,UAAU;EACV,OAAO;GACL;GACA,WAAW;GACX,QAAQ;EACV;CACF,CAAC,CACH;CAGA,gBAAgB;EACd,IAAI,CAAC,MACH;EAEF,MAAM,EAAE,oBAAoB,cAAc,SAAS;EACnD,gBACE,WACA,KAAK,QAAQ,KAAK,WAAW,OAAO,GAAG,CACzC;EACA,gBACE,aACA,KAAK,UAAU,KAAK,aAAa,SAAS,GAAG,CAC/C;CACF,GAAG,CAAC,MAAM,aAAa,CAAC;CAExB,OAAO,EAAE,OAAO,KAAK;AACvB"}
@@ -9,9 +9,9 @@ import { useAccount } from "@lifi/wallet-management";
9
9
  const useTransactionDetails = (transactionHash) => {
10
10
  const { account, accounts } = useAccount();
11
11
  const queryClient = useQueryClient();
12
- const { keyPrefix } = useWidgetConfig();
12
+ const { storageScopeKey } = useWidgetConfig();
13
13
  const sdkClient = useSDKClient();
14
- const transactionHistoryQueryKey = useMemo(() => getQueryKey("transaction-history", keyPrefix), [keyPrefix]);
14
+ const transactionHistoryQueryKey = useMemo(() => getQueryKey("transaction-history", storageScopeKey), [storageScopeKey]);
15
15
  const { data, isLoading } = useQuery({
16
16
  queryKey: [transactionHistoryQueryKey, transactionHash],
17
17
  queryFn: async ({ queryKey: [, transactionHash], signal }) => {
@@ -1 +1 @@
1
- {"version":3,"file":"useTransactionDetails.js","names":[],"sources":["../../../src/hooks/useTransactionDetails.ts"],"sourcesContent":["import type { FullStatusData } from '@lifi/sdk'\nimport { getStatus, type StatusResponse } from '@lifi/sdk'\nimport { useAccount } from '@lifi/wallet-management'\nimport {\n keepPreviousData,\n useQuery,\n useQueryClient,\n} from '@tanstack/react-query'\nimport { useMemo } from 'react'\nimport { useSDKClient } from '../providers/SDKClientProvider.js'\nimport { useWidgetConfig } from '../providers/WidgetProvider/WidgetProvider.js'\nimport { getQueryKey } from '../utils/queries.js'\n\nexport const useTransactionDetails = (\n transactionHash?: string\n): {\n transaction: StatusResponse | undefined\n isLoading: boolean\n} => {\n const { account, accounts } = useAccount()\n const queryClient = useQueryClient()\n const { keyPrefix } = useWidgetConfig()\n const sdkClient = useSDKClient()\n\n const transactionHistoryQueryKey = useMemo(\n () => getQueryKey('transaction-history', keyPrefix),\n [keyPrefix]\n )\n\n const { data, isLoading } = useQuery({\n queryKey: [transactionHistoryQueryKey, transactionHash],\n queryFn: async ({ queryKey: [, transactionHash], signal }) => {\n if (transactionHash) {\n for (const account of accounts) {\n const cachedHistory = queryClient.getQueryData<StatusResponse[]>([\n transactionHistoryQueryKey,\n account.address,\n ])\n\n const transaction = cachedHistory?.find(\n (t) => t.sending.txHash === transactionHash\n )\n\n if (transaction) {\n return transaction\n }\n }\n\n const transaction = await getStatus(\n sdkClient,\n {\n txHash: transactionHash,\n },\n { signal }\n )\n\n const fromAddress = (transaction as FullStatusData)?.fromAddress\n\n if (fromAddress) {\n queryClient.setQueryData<StatusResponse[]>(\n [transactionHistoryQueryKey, fromAddress],\n (data) => (data ? [...data, transaction!] : [transaction!])\n )\n }\n\n return transaction\n }\n },\n refetchInterval: 300_000,\n enabled: account.isConnected && Boolean(transactionHash),\n initialData: () => {\n for (const account of accounts) {\n const transaction = queryClient\n .getQueryData<StatusResponse[]>([\n transactionHistoryQueryKey,\n account.address,\n ])\n ?.find((t) => t.sending.txHash === transactionHash)\n if (transaction) {\n return transaction\n }\n }\n },\n placeholderData: keepPreviousData,\n })\n\n return {\n transaction: data,\n isLoading,\n }\n}\n"],"mappings":";;;;;;;;AAaA,MAAa,yBACX,oBAIG;CACH,MAAM,EAAE,SAAS,aAAa,WAAW;CACzC,MAAM,cAAc,eAAe;CACnC,MAAM,EAAE,cAAc,gBAAgB;CACtC,MAAM,YAAY,aAAa;CAE/B,MAAM,6BAA6B,cAC3B,YAAY,uBAAuB,SAAS,GAClD,CAAC,SAAS,CACZ;CAEA,MAAM,EAAE,MAAM,cAAc,SAAS;EACnC,UAAU,CAAC,4BAA4B,eAAe;EACtD,SAAS,OAAO,EAAE,UAAU,GAAG,kBAAkB,aAAa;GAC5D,IAAI,iBAAiB;IACnB,KAAK,MAAM,WAAW,UAAU;KAM9B,MAAM,cALgB,YAAY,aAA+B,CAC/D,4BACA,QAAQ,OACV,CAEgC,CAAC,EAAE,MAChC,MAAM,EAAE,QAAQ,WAAW,eAC9B;KAEA,IAAI,aACF,OAAO;IAEX;IAEA,MAAM,cAAc,MAAM,UACxB,WACA,EACE,QAAQ,gBACV,GACA,EAAE,OAAO,CACX;IAEA,MAAM,cAAe,aAAgC;IAErD,IAAI,aACF,YAAY,aACV,CAAC,4BAA4B,WAAW,IACvC,SAAU,OAAO,CAAC,GAAG,MAAM,WAAY,IAAI,CAAC,WAAY,CAC3D;IAGF,OAAO;GACT;EACF;EACA,iBAAiB;EACjB,SAAS,QAAQ,eAAe,QAAQ,eAAe;EACvD,mBAAmB;GACjB,KAAK,MAAM,WAAW,UAAU;IAC9B,MAAM,cAAc,YACjB,aAA+B,CAC9B,4BACA,QAAQ,OACV,CAAC,CAAC,EACA,MAAM,MAAM,EAAE,QAAQ,WAAW,eAAe;IACpD,IAAI,aACF,OAAO;GAEX;EACF;EACA,iBAAiB;CACnB,CAAC;CAED,OAAO;EACL,aAAa;EACb;CACF;AACF"}
1
+ {"version":3,"file":"useTransactionDetails.js","names":[],"sources":["../../../src/hooks/useTransactionDetails.ts"],"sourcesContent":["import type { FullStatusData } from '@lifi/sdk'\nimport { getStatus, type StatusResponse } from '@lifi/sdk'\nimport { useAccount } from '@lifi/wallet-management'\nimport {\n keepPreviousData,\n useQuery,\n useQueryClient,\n} from '@tanstack/react-query'\nimport { useMemo } from 'react'\nimport { useSDKClient } from '../providers/SDKClientProvider.js'\nimport { useWidgetConfig } from '../providers/WidgetProvider/WidgetProvider.js'\nimport { getQueryKey } from '../utils/queries.js'\n\nexport const useTransactionDetails = (\n transactionHash?: string\n): {\n transaction: StatusResponse | undefined\n isLoading: boolean\n} => {\n const { account, accounts } = useAccount()\n const queryClient = useQueryClient()\n const { storageScopeKey } = useWidgetConfig()\n const sdkClient = useSDKClient()\n\n const transactionHistoryQueryKey = useMemo(\n () => getQueryKey('transaction-history', storageScopeKey),\n [storageScopeKey]\n )\n\n const { data, isLoading } = useQuery({\n queryKey: [transactionHistoryQueryKey, transactionHash],\n queryFn: async ({ queryKey: [, transactionHash], signal }) => {\n if (transactionHash) {\n for (const account of accounts) {\n const cachedHistory = queryClient.getQueryData<StatusResponse[]>([\n transactionHistoryQueryKey,\n account.address,\n ])\n\n const transaction = cachedHistory?.find(\n (t) => t.sending.txHash === transactionHash\n )\n\n if (transaction) {\n return transaction\n }\n }\n\n const transaction = await getStatus(\n sdkClient,\n {\n txHash: transactionHash,\n },\n { signal }\n )\n\n const fromAddress = (transaction as FullStatusData)?.fromAddress\n\n if (fromAddress) {\n queryClient.setQueryData<StatusResponse[]>(\n [transactionHistoryQueryKey, fromAddress],\n (data) => (data ? [...data, transaction!] : [transaction!])\n )\n }\n\n return transaction\n }\n },\n refetchInterval: 300_000,\n enabled: account.isConnected && Boolean(transactionHash),\n initialData: () => {\n for (const account of accounts) {\n const transaction = queryClient\n .getQueryData<StatusResponse[]>([\n transactionHistoryQueryKey,\n account.address,\n ])\n ?.find((t) => t.sending.txHash === transactionHash)\n if (transaction) {\n return transaction\n }\n }\n },\n placeholderData: keepPreviousData,\n })\n\n return {\n transaction: data,\n isLoading,\n }\n}\n"],"mappings":";;;;;;;;AAaA,MAAa,yBACX,oBAIG;CACH,MAAM,EAAE,SAAS,aAAa,WAAW;CACzC,MAAM,cAAc,eAAe;CACnC,MAAM,EAAE,oBAAoB,gBAAgB;CAC5C,MAAM,YAAY,aAAa;CAE/B,MAAM,6BAA6B,cAC3B,YAAY,uBAAuB,eAAe,GACxD,CAAC,eAAe,CAClB;CAEA,MAAM,EAAE,MAAM,cAAc,SAAS;EACnC,UAAU,CAAC,4BAA4B,eAAe;EACtD,SAAS,OAAO,EAAE,UAAU,GAAG,kBAAkB,aAAa;GAC5D,IAAI,iBAAiB;IACnB,KAAK,MAAM,WAAW,UAAU;KAM9B,MAAM,cALgB,YAAY,aAA+B,CAC/D,4BACA,QAAQ,OACV,CAEgC,CAAC,EAAE,MAChC,MAAM,EAAE,QAAQ,WAAW,eAC9B;KAEA,IAAI,aACF,OAAO;IAEX;IAEA,MAAM,cAAc,MAAM,UACxB,WACA,EACE,QAAQ,gBACV,GACA,EAAE,OAAO,CACX;IAEA,MAAM,cAAe,aAAgC;IAErD,IAAI,aACF,YAAY,aACV,CAAC,4BAA4B,WAAW,IACvC,SAAU,OAAO,CAAC,GAAG,MAAM,WAAY,IAAI,CAAC,WAAY,CAC3D;IAGF,OAAO;GACT;EACF;EACA,iBAAiB;EACjB,SAAS,QAAQ,eAAe,QAAQ,eAAe;EACvD,mBAAmB;GACjB,KAAK,MAAM,WAAW,UAAU;IAC9B,MAAM,cAAc,YACjB,aAA+B,CAC9B,4BACA,QAAQ,OACV,CAAC,CAAC,EACA,MAAM,MAAM,EAAE,QAAQ,WAAW,eAAe;IACpD,IAAI,aACF,OAAO;GAEX;EACF;EACA,iBAAiB;CACnB,CAAC;CAED,OAAO;EACL,aAAa;EACb;CACF;AACF"}
@@ -1,8 +1,8 @@
1
1
  import { useWidgetConfig } from "../providers/WidgetProvider/WidgetProvider.js";
2
2
  import { useSDKClient } from "../providers/SDKClientProvider.js";
3
- import { getQueryKey } from "../utils/queries.js";
4
3
  import { getSourceTxHash } from "../stores/routes/utils.js";
5
4
  import { useRouteExecutionStoreContext } from "../stores/routes/RouteExecutionStore.js";
5
+ import { getQueryKey } from "../utils/queries.js";
6
6
  import { useTools } from "./useTools.js";
7
7
  import { buildRouteFromTxHistory } from "../utils/converters.js";
8
8
  import { getTransactionHistory } from "@lifi/sdk";
@@ -13,12 +13,12 @@ import { useAccount } from "@lifi/wallet-management";
13
13
  const useTransactionHistory = () => {
14
14
  const store = useRouteExecutionStoreContext();
15
15
  const { accounts } = useAccount();
16
- const { keyPrefix } = useWidgetConfig();
16
+ const { storageScopeKey } = useWidgetConfig();
17
17
  const sdkClient = useSDKClient();
18
18
  const { tools } = useTools();
19
19
  const { data: routeExecutions, isLoading } = useQueries({
20
20
  queries: accounts.map((account) => ({
21
- queryKey: [getQueryKey("transaction-history", keyPrefix), account.address],
21
+ queryKey: [getQueryKey("transaction-history", storageScopeKey), account.address],
22
22
  queryFn: (async ({ queryKey: [, accountAddress], signal }) => {
23
23
  if (!accountAddress) return [];
24
24
  const date = /* @__PURE__ */ new Date();
@@ -1 +1 @@
1
- {"version":3,"file":"useTransactionHistory.js","names":[],"sources":["../../../src/hooks/useTransactionHistory.ts"],"sourcesContent":["import type { FullStatusData, StatusResponse } from '@lifi/sdk'\nimport { getTransactionHistory } from '@lifi/sdk'\nimport { useAccount } from '@lifi/wallet-management'\nimport type { QueryFunction } from '@tanstack/react-query'\nimport { useQueries } from '@tanstack/react-query'\nimport { useEffect, useMemo } from 'react'\nimport { useSDKClient } from '../providers/SDKClientProvider.js'\nimport { useWidgetConfig } from '../providers/WidgetProvider/WidgetProvider.js'\nimport { useRouteExecutionStoreContext } from '../stores/routes/RouteExecutionStore.js'\nimport type {\n RouteExecution,\n RouteExecutionState,\n} from '../stores/routes/types.js'\nimport { getSourceTxHash } from '../stores/routes/utils.js'\nimport { buildRouteFromTxHistory } from '../utils/converters.js'\nimport { getQueryKey } from '../utils/queries.js'\nimport { useTools } from './useTools.js'\n\nexport const useTransactionHistory = (): {\n data: RouteExecution[]\n isLoading: boolean\n} => {\n const store = useRouteExecutionStoreContext()\n const { accounts } = useAccount()\n const { keyPrefix } = useWidgetConfig()\n const sdkClient = useSDKClient()\n const { tools } = useTools()\n\n const { data: routeExecutions, isLoading } = useQueries({\n queries: accounts.map((account) => ({\n queryKey: [\n getQueryKey('transaction-history', keyPrefix),\n account.address,\n ],\n queryFn: (async ({ queryKey: [, accountAddress], signal }) => {\n if (!accountAddress) {\n return []\n }\n const date = new Date()\n date.setFullYear(date.getFullYear() - 10)\n\n const response = await getTransactionHistory(\n sdkClient,\n {\n wallet: accountAddress,\n fromTimestamp: Math.floor(date.getTime() / 1000),\n toTimestamp: Math.floor(Date.now() / 1000),\n },\n { signal }\n )\n\n return response.transfers\n }) as QueryFunction<StatusResponse[], (string | undefined)[], never>,\n refetchInterval: 300_000,\n enabled: Boolean(account.address),\n })),\n combine: (results) => {\n const uniqueTransactions = new Map<string, StatusResponse>()\n results.forEach((result) => {\n if (result.data) {\n result.data.forEach((transaction) => {\n if (\n (transaction as FullStatusData)?.transactionId &&\n (transaction as FullStatusData)?.receiving?.chainId &&\n transaction?.sending.chainId\n ) {\n uniqueTransactions.set(\n (transaction as FullStatusData).transactionId,\n transaction\n )\n }\n })\n }\n })\n // Convert raw API transactions into RouteExecution objects.\n const data = Array.from(uniqueTransactions.values()).flatMap(\n (transaction) => {\n const routeExecution = buildRouteFromTxHistory(\n transaction as FullStatusData,\n tools\n )\n return routeExecution ? [routeExecution] : []\n }\n )\n return {\n data,\n isLoading: results.some((result) => result.isLoading),\n }\n },\n })\n\n // Stable Set — only recreated when data actually changes (TanStack Query structural sharing).\n const apiTxHashes = useMemo(\n () => new Set(routeExecutions.map((r) => getSourceTxHash(r.route))),\n [routeExecutions]\n )\n\n // Remove local store routes already indexed by the API to avoid duplicates.\n // Must be in an effect — combine runs during render, so store mutations there\n // would trigger \"Cannot update a component while rendering\" in concurrent mode.\n useEffect(() => {\n if (!apiTxHashes.size) {\n return\n }\n const { routes, deleteRoute } = store.getState() as RouteExecutionState\n for (const [id, routeExecution] of Object.entries(routes)) {\n const txHash = getSourceTxHash(\n (routeExecution as RouteExecution | undefined)?.route\n )\n if (txHash && apiTxHashes.has(txHash)) {\n deleteRoute(id)\n }\n }\n }, [apiTxHashes, store])\n\n return {\n data: routeExecutions,\n isLoading,\n }\n}\n"],"mappings":";;;;;;;;;;;;AAkBA,MAAa,8BAGR;CACH,MAAM,QAAQ,8BAA8B;CAC5C,MAAM,EAAE,aAAa,WAAW;CAChC,MAAM,EAAE,cAAc,gBAAgB;CACtC,MAAM,YAAY,aAAa;CAC/B,MAAM,EAAE,UAAU,SAAS;CAE3B,MAAM,EAAE,MAAM,iBAAiB,cAAc,WAAW;EACtD,SAAS,SAAS,KAAK,aAAa;GAClC,UAAU,CACR,YAAY,uBAAuB,SAAS,GAC5C,QAAQ,OACV;GACA,UAAU,OAAO,EAAE,UAAU,GAAG,iBAAiB,aAAa;IAC5D,IAAI,CAAC,gBACH,OAAO,CAAC;IAEV,MAAM,uBAAO,IAAI,KAAK;IACtB,KAAK,YAAY,KAAK,YAAY,IAAI,EAAE;IAYxC,QAAO,MAVgB,sBACrB,WACA;KACE,QAAQ;KACR,eAAe,KAAK,MAAM,KAAK,QAAQ,IAAI,GAAI;KAC/C,aAAa,KAAK,MAAM,KAAK,IAAI,IAAI,GAAI;IAC3C,GACA,EAAE,OAAO,CACX,EAAA,CAEgB;GAClB;GACA,iBAAiB;GACjB,SAAS,QAAQ,QAAQ,OAAO;EAClC,EAAE;EACF,UAAU,YAAY;GACpB,MAAM,qCAAqB,IAAI,IAA4B;GAC3D,QAAQ,SAAS,WAAW;IAC1B,IAAI,OAAO,MACT,OAAO,KAAK,SAAS,gBAAgB;KACnC,IACG,aAAgC,iBAChC,aAAgC,WAAW,WAC5C,aAAa,QAAQ,SAErB,mBAAmB,IAChB,YAA+B,eAChC,WACF;IAEJ,CAAC;GAEL,CAAC;GAWD,OAAO;IACL,MAVW,MAAM,KAAK,mBAAmB,OAAO,CAAC,CAAC,CAAC,SAClD,gBAAgB;KACf,MAAM,iBAAiB,wBACrB,aACA,KACF;KACA,OAAO,iBAAiB,CAAC,cAAc,IAAI,CAAC;IAC9C,CAGG;IACH,WAAW,QAAQ,MAAM,WAAW,OAAO,SAAS;GACtD;EACF;CACF,CAAC;CAGD,MAAM,cAAc,cACZ,IAAI,IAAI,gBAAgB,KAAK,MAAM,gBAAgB,EAAE,KAAK,CAAC,CAAC,GAClE,CAAC,eAAe,CAClB;CAKA,gBAAgB;EACd,IAAI,CAAC,YAAY,MACf;EAEF,MAAM,EAAE,QAAQ,gBAAgB,MAAM,SAAS;EAC/C,KAAK,MAAM,CAAC,IAAI,mBAAmB,OAAO,QAAQ,MAAM,GAAG;GACzD,MAAM,SAAS,gBACZ,gBAA+C,KAClD;GACA,IAAI,UAAU,YAAY,IAAI,MAAM,GAClC,YAAY,EAAE;EAElB;CACF,GAAG,CAAC,aAAa,KAAK,CAAC;CAEvB,OAAO;EACL,MAAM;EACN;CACF;AACF"}
1
+ {"version":3,"file":"useTransactionHistory.js","names":[],"sources":["../../../src/hooks/useTransactionHistory.ts"],"sourcesContent":["import type { FullStatusData, StatusResponse } from '@lifi/sdk'\nimport { getTransactionHistory } from '@lifi/sdk'\nimport { useAccount } from '@lifi/wallet-management'\nimport type { QueryFunction } from '@tanstack/react-query'\nimport { useQueries } from '@tanstack/react-query'\nimport { useEffect, useMemo } from 'react'\nimport { useSDKClient } from '../providers/SDKClientProvider.js'\nimport { useWidgetConfig } from '../providers/WidgetProvider/WidgetProvider.js'\nimport { useRouteExecutionStoreContext } from '../stores/routes/RouteExecutionStore.js'\nimport type {\n RouteExecution,\n RouteExecutionState,\n} from '../stores/routes/types.js'\nimport { getSourceTxHash } from '../stores/routes/utils.js'\nimport { buildRouteFromTxHistory } from '../utils/converters.js'\nimport { getQueryKey } from '../utils/queries.js'\nimport { useTools } from './useTools.js'\n\nexport const useTransactionHistory = (): {\n data: RouteExecution[]\n isLoading: boolean\n} => {\n const store = useRouteExecutionStoreContext()\n const { accounts } = useAccount()\n const { storageScopeKey } = useWidgetConfig()\n const sdkClient = useSDKClient()\n const { tools } = useTools()\n\n const { data: routeExecutions, isLoading } = useQueries({\n queries: accounts.map((account) => ({\n queryKey: [\n getQueryKey('transaction-history', storageScopeKey),\n account.address,\n ],\n queryFn: (async ({ queryKey: [, accountAddress], signal }) => {\n if (!accountAddress) {\n return []\n }\n const date = new Date()\n date.setFullYear(date.getFullYear() - 10)\n\n const response = await getTransactionHistory(\n sdkClient,\n {\n wallet: accountAddress,\n fromTimestamp: Math.floor(date.getTime() / 1000),\n toTimestamp: Math.floor(Date.now() / 1000),\n },\n { signal }\n )\n\n return response.transfers\n }) as QueryFunction<StatusResponse[], (string | undefined)[], never>,\n refetchInterval: 300_000,\n enabled: Boolean(account.address),\n })),\n combine: (results) => {\n const uniqueTransactions = new Map<string, StatusResponse>()\n results.forEach((result) => {\n if (result.data) {\n result.data.forEach((transaction) => {\n if (\n (transaction as FullStatusData)?.transactionId &&\n (transaction as FullStatusData)?.receiving?.chainId &&\n transaction?.sending.chainId\n ) {\n uniqueTransactions.set(\n (transaction as FullStatusData).transactionId,\n transaction\n )\n }\n })\n }\n })\n // Convert raw API transactions into RouteExecution objects.\n const data = Array.from(uniqueTransactions.values()).flatMap(\n (transaction) => {\n const routeExecution = buildRouteFromTxHistory(\n transaction as FullStatusData,\n tools\n )\n return routeExecution ? [routeExecution] : []\n }\n )\n return {\n data,\n isLoading: results.some((result) => result.isLoading),\n }\n },\n })\n\n // Stable Set — only recreated when data actually changes (TanStack Query structural sharing).\n const apiTxHashes = useMemo(\n () => new Set(routeExecutions.map((r) => getSourceTxHash(r.route))),\n [routeExecutions]\n )\n\n // Remove local store routes already indexed by the API to avoid duplicates.\n // Must be in an effect — combine runs during render, so store mutations there\n // would trigger \"Cannot update a component while rendering\" in concurrent mode.\n useEffect(() => {\n if (!apiTxHashes.size) {\n return\n }\n const { routes, deleteRoute } = store.getState() as RouteExecutionState\n for (const [id, routeExecution] of Object.entries(routes)) {\n const txHash = getSourceTxHash(\n (routeExecution as RouteExecution | undefined)?.route\n )\n if (txHash && apiTxHashes.has(txHash)) {\n deleteRoute(id)\n }\n }\n }, [apiTxHashes, store])\n\n return {\n data: routeExecutions,\n isLoading,\n }\n}\n"],"mappings":";;;;;;;;;;;;AAkBA,MAAa,8BAGR;CACH,MAAM,QAAQ,8BAA8B;CAC5C,MAAM,EAAE,aAAa,WAAW;CAChC,MAAM,EAAE,oBAAoB,gBAAgB;CAC5C,MAAM,YAAY,aAAa;CAC/B,MAAM,EAAE,UAAU,SAAS;CAE3B,MAAM,EAAE,MAAM,iBAAiB,cAAc,WAAW;EACtD,SAAS,SAAS,KAAK,aAAa;GAClC,UAAU,CACR,YAAY,uBAAuB,eAAe,GAClD,QAAQ,OACV;GACA,UAAU,OAAO,EAAE,UAAU,GAAG,iBAAiB,aAAa;IAC5D,IAAI,CAAC,gBACH,OAAO,CAAC;IAEV,MAAM,uBAAO,IAAI,KAAK;IACtB,KAAK,YAAY,KAAK,YAAY,IAAI,EAAE;IAYxC,QAAO,MAVgB,sBACrB,WACA;KACE,QAAQ;KACR,eAAe,KAAK,MAAM,KAAK,QAAQ,IAAI,GAAI;KAC/C,aAAa,KAAK,MAAM,KAAK,IAAI,IAAI,GAAI;IAC3C,GACA,EAAE,OAAO,CACX,EAAA,CAEgB;GAClB;GACA,iBAAiB;GACjB,SAAS,QAAQ,QAAQ,OAAO;EAClC,EAAE;EACF,UAAU,YAAY;GACpB,MAAM,qCAAqB,IAAI,IAA4B;GAC3D,QAAQ,SAAS,WAAW;IAC1B,IAAI,OAAO,MACT,OAAO,KAAK,SAAS,gBAAgB;KACnC,IACG,aAAgC,iBAChC,aAAgC,WAAW,WAC5C,aAAa,QAAQ,SAErB,mBAAmB,IAChB,YAA+B,eAChC,WACF;IAEJ,CAAC;GAEL,CAAC;GAWD,OAAO;IACL,MAVW,MAAM,KAAK,mBAAmB,OAAO,CAAC,CAAC,CAAC,SAClD,gBAAgB;KACf,MAAM,iBAAiB,wBACrB,aACA,KACF;KACA,OAAO,iBAAiB,CAAC,cAAc,IAAI,CAAC;IAC9C,CAGG;IACH,WAAW,QAAQ,MAAM,WAAW,OAAO,SAAS;GACtD;EACF;CACF,CAAC;CAGD,MAAM,cAAc,cACZ,IAAI,IAAI,gBAAgB,KAAK,MAAM,gBAAgB,EAAE,KAAK,CAAC,CAAC,GAClE,CAAC,eAAe,CAClB;CAKA,gBAAgB;EACd,IAAI,CAAC,YAAY,MACf;EAEF,MAAM,EAAE,QAAQ,gBAAgB,MAAM,SAAS;EAC/C,KAAK,MAAM,CAAC,IAAI,mBAAmB,OAAO,QAAQ,MAAM,GAAG;GACzD,MAAM,SAAS,gBACZ,gBAA+C,KAClD;GACA,IAAI,UAAU,YAAY,IAAI,MAAM,GAClC,YAAY,EAAE;EAElB;CACF,GAAG,CAAC,aAAa,KAAK,CAAC;CAEvB,OAAO;EACL,MAAM;EACN;CACF;AACF"}
@@ -195,7 +195,8 @@
195
195
  "walletAddressInvalid_chain": "",
196
196
  "walletAddressRequired": "ওয়ালেট ঠিকানা প্রয়োজন।",
197
197
  "walletChainTypeInvalid": "",
198
- "walletMismatch": ""
198
+ "walletMismatch": "",
199
+ "zcashAddressInvalid": ""
199
200
  }
200
201
  },
201
202
  "tooltip": {
@@ -195,7 +195,8 @@
195
195
  "walletAddressInvalid_chain": "",
196
196
  "walletAddressRequired": "Wallet-Adresse ist erforderlich.",
197
197
  "walletChainTypeInvalid": "",
198
- "walletMismatch": ""
198
+ "walletMismatch": "",
199
+ "zcashAddressInvalid": ""
199
200
  }
200
201
  },
201
202
  "tooltip": {
@@ -227,7 +227,8 @@
227
227
  "walletAddressInvalid_chain": "Wallet address or domain name is invalid for selected destination chain {{chainName}}",
228
228
  "walletAddressRequired": "Wallet address is required.",
229
229
  "walletChainTypeInvalid": "Wallet address doesn't match the selected destination chain {{chainName}}",
230
- "walletMismatch": "Wallet address mismatch"
230
+ "walletMismatch": "Wallet address mismatch",
231
+ "zcashAddressInvalid": "Enter a transparent Zcash address (t1 or t3) or a unified address (u1) with an Orchard receiver. Sapling (zs1) and TEX addresses are not supported."
231
232
  }
232
233
  },
233
234
  "tooltip": {
@@ -195,7 +195,8 @@
195
195
  "walletAddressInvalid_chain": "La dirección de la billetera o nombre de dominio no es válida para la cadena de destino seleccionada {{chainName}}",
196
196
  "walletAddressRequired": "Dirección de billetera es requerida.",
197
197
  "walletChainTypeInvalid": "La dirección de la billetera no coincide con la cadena de destino seleccionada {{chainName}}",
198
- "walletMismatch": "La dirección de la billetera no coincide"
198
+ "walletMismatch": "La dirección de la billetera no coincide",
199
+ "zcashAddressInvalid": ""
199
200
  }
200
201
  },
201
202
  "tooltip": {
@@ -195,7 +195,8 @@
195
195
  "walletAddressInvalid_chain": "L'adresse du portefeuille ou le nom de domaine est invalide pour la chaîne de destination sélectionnée {{chainName}}",
196
196
  "walletAddressRequired": "L'adresse du portefeuille est nécessaire.",
197
197
  "walletChainTypeInvalid": "L'adresse du portefeuille ne correspond pas à la chaîne de destination sélectionnée - {{chainName}}",
198
- "walletMismatch": "Incompatibilité de l'adresse du portefeuille"
198
+ "walletMismatch": "Incompatibilité de l'adresse du portefeuille",
199
+ "zcashAddressInvalid": ""
199
200
  }
200
201
  },
201
202
  "tooltip": {
@@ -195,7 +195,8 @@
195
195
  "walletAddressInvalid_chain": "",
196
196
  "walletAddressRequired": "",
197
197
  "walletChainTypeInvalid": "",
198
- "walletMismatch": ""
198
+ "walletMismatch": "",
199
+ "zcashAddressInvalid": ""
199
200
  }
200
201
  },
201
202
  "tooltip": {
@@ -195,7 +195,8 @@
195
195
  "walletAddressInvalid_chain": "Alamat dompet atau nama domain tidak valid untuk jaringan tujuan yang dipilih {{chainName}}",
196
196
  "walletAddressRequired": "Alamat dompet diperlukan.",
197
197
  "walletChainTypeInvalid": "Alamat dompet tidak cocok dengan jaringan tujuan yang dipilih {{chainName}}",
198
- "walletMismatch": "Alamat dompet tidak cocok"
198
+ "walletMismatch": "Alamat dompet tidak cocok",
199
+ "zcashAddressInvalid": ""
199
200
  }
200
201
  },
201
202
  "tooltip": {
@@ -195,7 +195,8 @@
195
195
  "walletAddressInvalid_chain": "",
196
196
  "walletAddressRequired": "L'indirizzo è un campo obbligatorio.",
197
197
  "walletChainTypeInvalid": "",
198
- "walletMismatch": ""
198
+ "walletMismatch": "",
199
+ "zcashAddressInvalid": ""
199
200
  }
200
201
  },
201
202
  "tooltip": {
@@ -195,7 +195,8 @@
195
195
  "walletAddressInvalid_chain": "選択された宛先チェーン {{chainName}} のウォレットアドレスまたはドメイン名が無効です",
196
196
  "walletAddressRequired": "ウォレットアドレスは必須項目です。",
197
197
  "walletChainTypeInvalid": "選択された宛先チェーン {{chainName}} のウォレットアドレスが一致しません",
198
- "walletMismatch": "ウォレットアドレスが一致しません"
198
+ "walletMismatch": "ウォレットアドレスが一致しません",
199
+ "zcashAddressInvalid": ""
199
200
  }
200
201
  },
201
202
  "tooltip": {
@@ -195,7 +195,8 @@
195
195
  "walletAddressInvalid_chain": "",
196
196
  "walletAddressRequired": "지갑 주소가 필요합니다.",
197
197
  "walletChainTypeInvalid": "",
198
- "walletMismatch": ""
198
+ "walletMismatch": "",
199
+ "zcashAddressInvalid": ""
199
200
  }
200
201
  },
201
202
  "tooltip": {
@@ -195,7 +195,8 @@
195
195
  "walletAddressInvalid_chain": "",
196
196
  "walletAddressRequired": "",
197
197
  "walletChainTypeInvalid": "",
198
- "walletMismatch": ""
198
+ "walletMismatch": "",
199
+ "zcashAddressInvalid": ""
199
200
  }
200
201
  },
201
202
  "tooltip": {
@@ -195,7 +195,8 @@
195
195
  "walletAddressInvalid_chain": "O endereço da carteira ou o nome de domínio é inválido para a rede de destino selecionada {{chainName}}",
196
196
  "walletAddressRequired": "Endereço da carteira é necessário.",
197
197
  "walletChainTypeInvalid": "O endereço da carteira não corresponde à rede de destino selecionada - {{chainName}}",
198
- "walletMismatch": "Incompatibilidade de endereço da carteira"
198
+ "walletMismatch": "Incompatibilidade de endereço da carteira",
199
+ "zcashAddressInvalid": ""
199
200
  }
200
201
  },
201
202
  "tooltip": {
@@ -195,7 +195,8 @@
195
195
  "walletAddressInvalid_chain": "ที่อยู่กระเป๋าเงินหรือชื่อโดเมนไม่ถูกต้องสำหรับเครือข่ายปลายทางที่เลือก {{chainName}}",
196
196
  "walletAddressRequired": "กรุณากรอกที่อยู่กระเป๋าเงิน.",
197
197
  "walletChainTypeInvalid": "ที่อยู่กระเป๋าเงินหรือชื่อโดเมนไม่ถูกต้องสำหรับเครือข่ายปลายทางที่เลือก {{chainName}}",
198
- "walletMismatch": "ที่อยู่ของกระเป๋าเงินไม่ตรงกัน"
198
+ "walletMismatch": "ที่อยู่ของกระเป๋าเงินไม่ตรงกัน",
199
+ "zcashAddressInvalid": ""
199
200
  }
200
201
  },
201
202
  "tooltip": {
@@ -195,7 +195,8 @@
195
195
  "walletAddressInvalid_chain": "Cüzdan adresi ya da domain adı {{chainName}} hedef ağında geçerli değil",
196
196
  "walletAddressRequired": "Cüzdan adresi gereklidir.",
197
197
  "walletChainTypeInvalid": "Cüzdan adresi ile {{chainName}} hedef ağ eşleşmiyor",
198
- "walletMismatch": "Cüzdan adresi uyuşmazlığı"
198
+ "walletMismatch": "Cüzdan adresi uyuşmazlığı",
199
+ "zcashAddressInvalid": ""
199
200
  }
200
201
  },
201
202
  "tooltip": {
@@ -195,7 +195,8 @@
195
195
  "walletAddressInvalid_chain": "Адреса гаманця не відповідає обраному чейну призначення - {{chainName}}",
196
196
  "walletAddressRequired": "Необхідно вказати адресу гаманця.",
197
197
  "walletChainTypeInvalid": "Адреса гаманця не відповідає обраному чейну призначення - {{chainName}}",
198
- "walletMismatch": "Невідповідність адреси гаманця"
198
+ "walletMismatch": "Невідповідність адреси гаманця",
199
+ "zcashAddressInvalid": ""
199
200
  }
200
201
  },
201
202
  "tooltip": {
@@ -195,7 +195,8 @@
195
195
  "walletAddressInvalid_chain": "Địa chỉ ví hoặc tên miền không hợp lệ đối với chuỗi đích đã chọn {{chainName}}",
196
196
  "walletAddressRequired": "Yêu cầu địa chỉ ví.",
197
197
  "walletChainTypeInvalid": "Địa chỉ ví không khớp với chuỗi đích đã chọn {{chainName}}",
198
- "walletMismatch": "Địa chỉ ví không khớp"
198
+ "walletMismatch": "Địa chỉ ví không khớp",
199
+ "zcashAddressInvalid": ""
199
200
  }
200
201
  },
201
202
  "tooltip": {
@@ -195,7 +195,8 @@
195
195
  "walletAddressInvalid_chain": "钱包地址或者域名在所选中的 {{chainName}} 链无效",
196
196
  "walletAddressRequired": "请输入钱包地址。",
197
197
  "walletChainTypeInvalid": "钱包地址与所选中目标的 {{chainName}} 链不匹配",
198
- "walletMismatch": "钱包地址不匹配"
198
+ "walletMismatch": "钱包地址不匹配",
199
+ "zcashAddressInvalid": ""
199
200
  }
200
201
  },
201
202
  "tooltip": {
@@ -14,6 +14,10 @@ import { useWidgetChains } from "./hooks/useWidgetChains.js";
14
14
  import { navigationRoutes } from "./utils/navigationRoutes.js";
15
15
  import { ChainPinned, ChainTokenSelected, ContactSupport, FormFieldChanged, LowAddressActivityConfirmed, NavigationTabChanged, RouteExecutionUpdate, RouteHighValueLossUpdate, RouteSelected, SettingUpdated, TokenSearch, WidgetEvent, WidgetEvents } from "./types/events.js";
16
16
  import { WidgetEventEmitter, useWidgetEvents, widgetEvents } from "./hooks/useWidgetEvents.js";
17
+ import { QueryParameter, ScopeKeyParameter } from "./queries/types.js";
18
+ import { GetChainsOptions, GetChainsQueryFnData, GetChainsQueryKey, GetChainsQueryKeyParameters, GetChainsQueryOptions, getChainsQueryKey, getChainsQueryOptions, supportedChainTypes } from "./queries/getChains.js";
19
+ import { GetToolsOptions, GetToolsQueryFnData, GetToolsQueryKey, GetToolsQueryKeyParameters, GetToolsQueryOptions, getToolsQueryKey, getToolsQueryOptions } from "./queries/getTools.js";
20
+ import "./queries/index.js";
17
21
  import { Bookmark, BookmarkActions, BookmarkProps, BookmarkState, BookmarkStore } from "./stores/bookmarks/types.js";
18
22
  import { useFieldActions } from "./stores/form/useFieldActions.js";
19
23
  import { useFieldValues } from "./stores/form/useFieldValues.js";
@@ -31,4 +35,4 @@ import { getPriceImpact } from "./utils/getPriceImpact.js";
31
35
  import { percentFormatter } from "./utils/percentFormatter.js";
32
36
  import { ChainId, ChainType, CoinKey } from "@lifi/sdk";
33
37
  export type * from "@lifi/sdk";
34
- export { AllowDeny, AllowDenyItems, AllowDenySet, AllowDenySetItem, AllowDenySets, Appearance, Bookmark, BookmarkActions, BookmarkProps, BookmarkState, BookmarkStore, CalculateFeeParams, ChainId, ChainPinned, ChainTokenSelected, ChainType, CoinKey, ContactSupport, CustomMode, DefaultFieldValues, DefaultUI, DefaultValues, DisabledUIConfig, ExpansionType, ExplorerUrl, ExtractValueType, FieldNames, FieldValues, FormActions, FormFieldArray, FormFieldChanged, FormFieldNames, FormFieldOptions, FormKeyHelper, FormProps, FormRef, FormRefProps, FormState, FormStoreStore, FormType, FormTypeProps, FormValueControl, FormValues, FormValuesState, GenericFormValue, HiddenUIConfig, InternalNavigationTabKey, InternalWidgetMode, ItemPrice, ItemPriceProps, App as LiFiWidget, LowAddressActivityConfirmed, ModeOptions, NFT, NFTBase, NFTBaseProps, NFTOwner, NFTProps, NavigationProps, NavigationTabChanged, NavigationTabKey, PoweredByType, RequiredUIConfig, ResetOptions, RouteExecutionUpdate, RouteHighValueLossUpdate, RouteLabel, RouteLabelRule, RouteSelected, SetFieldValueFunction, SetOptions, SettingUpdated, SplitMode, SplitModeOptions, SplitNavigationTabKey, ToAddress, type TokenAmount, TokenSearch, TouchedFields, ValidationActions, ValidationProps, WidgetChains, WidgetConfig, WidgetConfigPartialProps, WidgetConfigProps, WidgetContractTool, type WidgetDrawer, WidgetDrawerProps, WidgetEvent, type WidgetEventEmitter, WidgetEvents, WidgetFeeConfig, WidgetLanguages, WidgetMode, WidgetProps, WidgetProvider, WidgetSDKConfig, WidgetSkeleton, WidgetTheme, WidgetThemeComponents, WidgetTokens, WidgetVariant, WidgetWalletConfig, azureLightTheme, compactNumberFormatter, createTheme, currencyExtendedFormatter, defaultMaxHeight, formatDuration, formatInputAmount, formatSlippage, formatTokenAmount, formatTokenPrice, getPriceImpact, jumperTheme, name, navigationRoutes, palette, paletteDark, paletteLight, percentFormatter, priceToTokenAmount, usdDecimals, useFieldActions, useFieldValues, useWidgetChains, useWidgetEvents, version, watermelonLightTheme, widgetEvents, windows95Theme, wrapLongWords };
38
+ export { AllowDeny, AllowDenyItems, AllowDenySet, AllowDenySetItem, AllowDenySets, Appearance, Bookmark, BookmarkActions, BookmarkProps, BookmarkState, BookmarkStore, CalculateFeeParams, ChainId, ChainPinned, ChainTokenSelected, ChainType, CoinKey, ContactSupport, CustomMode, DefaultFieldValues, DefaultUI, DefaultValues, DisabledUIConfig, ExpansionType, ExplorerUrl, ExtractValueType, FieldNames, FieldValues, FormActions, FormFieldArray, FormFieldChanged, FormFieldNames, FormFieldOptions, FormKeyHelper, FormProps, FormRef, FormRefProps, FormState, FormStoreStore, FormType, FormTypeProps, FormValueControl, FormValues, FormValuesState, GenericFormValue, type GetChainsOptions, type GetChainsQueryFnData, type GetChainsQueryKey, type GetChainsQueryKeyParameters, type GetChainsQueryOptions, type GetToolsOptions, type GetToolsQueryFnData, type GetToolsQueryKey, type GetToolsQueryKeyParameters, type GetToolsQueryOptions, HiddenUIConfig, InternalNavigationTabKey, InternalWidgetMode, ItemPrice, ItemPriceProps, App as LiFiWidget, LowAddressActivityConfirmed, ModeOptions, NFT, NFTBase, NFTBaseProps, NFTOwner, NFTProps, NavigationProps, NavigationTabChanged, NavigationTabKey, PoweredByType, type QueryParameter, RequiredUIConfig, ResetOptions, RouteExecutionUpdate, RouteHighValueLossUpdate, RouteLabel, RouteLabelRule, RouteSelected, type ScopeKeyParameter, SetFieldValueFunction, SetOptions, SettingUpdated, SplitMode, SplitModeOptions, SplitNavigationTabKey, ToAddress, type TokenAmount, TokenSearch, TouchedFields, ValidationActions, ValidationProps, WidgetChains, WidgetConfig, WidgetConfigPartialProps, WidgetConfigProps, WidgetContractTool, type WidgetDrawer, WidgetDrawerProps, WidgetEvent, type WidgetEventEmitter, WidgetEvents, WidgetFeeConfig, WidgetLanguages, WidgetMode, WidgetProps, WidgetProvider, WidgetSDKConfig, WidgetSkeleton, WidgetTheme, WidgetThemeComponents, WidgetTokens, WidgetVariant, WidgetWalletConfig, azureLightTheme, compactNumberFormatter, createTheme, currencyExtendedFormatter, defaultMaxHeight, formatDuration, formatInputAmount, formatSlippage, formatTokenAmount, formatTokenPrice, getChainsQueryKey, getChainsQueryOptions, getPriceImpact, getToolsQueryKey, getToolsQueryOptions, jumperTheme, name, navigationRoutes, palette, paletteDark, paletteLight, percentFormatter, priceToTokenAmount, supportedChainTypes, usdDecimals, useFieldActions, useFieldValues, useWidgetChains, useWidgetEvents, version, watermelonLightTheme, widgetEvents, windows95Theme, wrapLongWords };
package/dist/esm/index.js CHANGED
@@ -4,11 +4,13 @@ import { defaultMaxHeight } from "./config/constants.js";
4
4
  import { ExpansionType } from "./types/widget.js";
5
5
  import { navigationRoutes } from "./utils/navigationRoutes.js";
6
6
  import { name, version } from "./config/version.js";
7
+ import { getChainsQueryKey, getChainsQueryOptions, supportedChainTypes } from "./queries/getChains.js";
7
8
  import { useFieldActions } from "./stores/form/useFieldActions.js";
8
9
  import { formatDuration, formatInputAmount, formatSlippage, formatTokenAmount, formatTokenPrice, priceToTokenAmount, usdDecimals, wrapLongWords } from "./utils/format.js";
9
10
  import { FormKeyHelper } from "./stores/form/types.js";
10
11
  import { useFieldValues } from "./stores/form/useFieldValues.js";
11
12
  import { getPriceImpact } from "./utils/getPriceImpact.js";
13
+ import { getToolsQueryKey, getToolsQueryOptions } from "./queries/getTools.js";
12
14
  import { compactNumberFormatter } from "./utils/compactNumberFormatter.js";
13
15
  import { currencyExtendedFormatter } from "./utils/currencyExtendedFormatter.js";
14
16
  import { percentFormatter } from "./utils/percentFormatter.js";
@@ -25,4 +27,4 @@ import { jumperTheme } from "./themes/jumper.js";
25
27
  import { watermelonLightTheme } from "./themes/watermelonLight.js";
26
28
  import { windows95Theme } from "./themes/windows95.js";
27
29
  import { ChainId, ChainType, CoinKey } from "@lifi/sdk";
28
- export { ChainId, ChainType, CoinKey, ExpansionType, FormKeyHelper, ItemPrice, App as LiFiWidget, NFT, NFTBase, WidgetEvent, WidgetSkeleton, azureLightTheme, compactNumberFormatter, createTheme, currencyExtendedFormatter, defaultMaxHeight, formatDuration, formatInputAmount, formatSlippage, formatTokenAmount, formatTokenPrice, getPriceImpact, jumperTheme, name, navigationRoutes, palette, paletteDark, paletteLight, percentFormatter, priceToTokenAmount, usdDecimals, useFieldActions, useFieldValues, useWidgetChains, useWidgetEvents, version, watermelonLightTheme, widgetEvents, windows95Theme, wrapLongWords };
30
+ export { ChainId, ChainType, CoinKey, ExpansionType, FormKeyHelper, ItemPrice, App as LiFiWidget, NFT, NFTBase, WidgetEvent, WidgetSkeleton, azureLightTheme, compactNumberFormatter, createTheme, currencyExtendedFormatter, defaultMaxHeight, formatDuration, formatInputAmount, formatSlippage, formatTokenAmount, formatTokenPrice, getChainsQueryKey, getChainsQueryOptions, getPriceImpact, getToolsQueryKey, getToolsQueryOptions, jumperTheme, name, navigationRoutes, palette, paletteDark, paletteLight, percentFormatter, priceToTokenAmount, supportedChainTypes, usdDecimals, useFieldActions, useFieldValues, useWidgetChains, useWidgetEvents, version, watermelonLightTheme, widgetEvents, windows95Theme, wrapLongWords };
@@ -1 +1 @@
1
- {"version":3,"file":"RoutesPage.style.d.ts","names":[],"sources":["../../../../src/pages/RoutesPage/RoutesPage.style.ts"],"mappings":";;;cAGa,SAAO,MAAM,GAAG,MAAM,sBAAsB"}
1
+ {"version":3,"file":"RoutesPage.style.d.ts","names":["Stack","MuiStack"],"sources":["../../../../src/pages/RoutesPage/RoutesPage.style.ts"],"mappings":";;;cAGaA,SAAO,MAAM,GAAG,MAAM,sBAAsBC"}
@@ -37,7 +37,8 @@ const BookmarkAddressSheet = ({ validatedWallet, onAddBookmark, ref }) => {
37
37
  return {
38
38
  name: nameValue,
39
39
  address: validationResult.address,
40
- chainType: validationResult.chainType
40
+ chainType: validationResult.chainType,
41
+ chainId: validationResult.chainId
41
42
  };
42
43
  };
43
44
  const validateWithValidatedWallet = (validatedWallet) => {
@@ -45,7 +46,8 @@ const BookmarkAddressSheet = ({ validatedWallet, onAddBookmark, ref }) => {
45
46
  return {
46
47
  name: nameValue,
47
48
  address: validatedWallet.address,
48
- chainType: validatedWallet.chainType
49
+ chainType: validatedWallet.chainType,
50
+ chainId: validatedWallet.chainId
49
51
  };
50
52
  };
51
53
  const handleBookmark = async () => {
@@ -78,7 +80,8 @@ const BookmarkAddressSheet = ({ validatedWallet, onAddBookmark, ref }) => {
78
80
  onAddBookmark({
79
81
  name: validatedBookmark.name,
80
82
  address: validatedBookmark.address,
81
- chainType: validatedBookmark.chainType
83
+ chainType: validatedBookmark.chainType,
84
+ chainId: validatedBookmark.chainId
82
85
  });
83
86
  }
84
87
  };
@@ -136,7 +139,7 @@ const BookmarkAddressSheet = ({ validatedWallet, onAddBookmark, ref }) => {
136
139
  placeholder: t("sendToWallet.enterAddress", { context: "long" }),
137
140
  "aria-label": t("sendToWallet.enterAddress", { context: "long" }),
138
141
  maxRows: 2,
139
- inputProps: { maxLength: 128 },
142
+ inputProps: { maxLength: 512 },
140
143
  multiline: true
141
144
  })
142
145
  }),
@@ -1 +1 @@
1
- {"version":3,"file":"BookmarkAddressSheet.js","names":[],"sources":["../../../../src/pages/SendToWallet/BookmarkAddressSheet.tsx"],"sourcesContent":["import ErrorIcon from '@mui/icons-material/Error'\nimport TurnedIn from '@mui/icons-material/TurnedIn'\nimport WarningRounded from '@mui/icons-material/WarningRounded'\nimport { Button, Typography } from '@mui/material'\nimport type { ChangeEvent, JSX, Ref, RefObject } from 'react'\nimport { useState } from 'react'\nimport { useTranslation } from 'react-i18next'\nimport { BottomSheet } from '../../components/BottomSheet/BottomSheet.js'\nimport type { BottomSheetBase } from '../../components/BottomSheet/types.js'\nimport { Input } from '../../components/Input.js'\nimport { AlertMessage } from '../../components/Messages/AlertMessage.js'\nimport { useAddressValidation } from '../../hooks/useAddressValidation.js'\nimport type { Bookmark } from '../../stores/bookmarks/types.js'\nimport { useBookmarkActions } from '../../stores/bookmarks/useBookmarkActions.js'\nimport {\n AddressInput,\n BookmarkInputFields,\n IconContainer,\n SendToWalletButtonRow,\n SendToWalletCard,\n SendToWalletSheetContainer,\n SheetAddressContainer,\n SheetTitle,\n ValidationAlert,\n} from './SendToWalletPage.style.js'\nimport type { BookmarkError } from './types.js'\n\ninterface BookmarkAddressProps {\n onAddBookmark: (bookmark: Bookmark) => void\n validatedWallet?: Bookmark\n}\n\nexport const BookmarkAddressSheet = ({\n validatedWallet,\n onAddBookmark,\n ref,\n}: BookmarkAddressProps & {\n ref?: Ref<BottomSheetBase>\n}): JSX.Element => {\n const { t } = useTranslation()\n const [name, setName] = useState('')\n const [address, setAddress] = useState('')\n const [error, setError] = useState<BookmarkError>()\n const { validateAddress, isValidating } = useAddressValidation()\n const { getBookmark } = useBookmarkActions()\n\n const nameValue = name.trim() || validatedWallet?.name || ''\n const addressValue = address || validatedWallet?.address || ''\n\n const handleCancel = () => {\n setError(undefined)\n ;(ref as RefObject<BottomSheetBase>).current?.close()\n }\n\n const validateWithAddressFromInput = async () => {\n const validationResult = await validateAddress({ value: address })\n if (!validationResult.isValid) {\n setError({ type: 'address', message: validationResult.error })\n return\n }\n\n return {\n name: nameValue,\n address: validationResult.address,\n chainType: validationResult.chainType,\n }\n }\n\n const validateWithValidatedWallet = (validatedWallet: Bookmark) => {\n if (error) {\n setError(undefined)\n }\n return {\n name: nameValue,\n address: validatedWallet.address,\n chainType: validatedWallet.chainType,\n }\n }\n\n const handleBookmark = async () => {\n if (isValidating) {\n return\n }\n if (!nameValue) {\n setError({\n type: 'name',\n message: t('error.title.bookmarkNameRequired'),\n })\n return\n }\n if (!addressValue) {\n setError({\n type: 'address',\n message: t('error.title.walletAddressRequired'),\n })\n return\n }\n\n // If the validatedWallet is supplied as a prop then we should assume\n // the address has already been validated\n const validatedBookmark = validatedWallet\n ? validateWithValidatedWallet(validatedWallet)\n : await validateWithAddressFromInput()\n\n if (validatedBookmark) {\n const existingBookmark = getBookmark(validatedBookmark.address)\n if (existingBookmark) {\n setError({\n type: 'address',\n message: t('error.title.bookmarkAlreadyExists', {\n name: existingBookmark.name,\n }),\n })\n return\n }\n ;(ref as RefObject<BottomSheetBase>).current?.close()\n\n onAddBookmark({\n name: validatedBookmark.name,\n address: validatedBookmark.address,\n chainType: validatedBookmark.chainType,\n })\n }\n }\n\n const handleAddressInputChange = (e: ChangeEvent) => {\n if (error) {\n setError(undefined)\n }\n setAddress((e.target as HTMLInputElement).value.trim())\n }\n\n const handleNameInputChange = (e: ChangeEvent) => {\n if (error) {\n setError(undefined)\n }\n setName((e.target as HTMLInputElement).value)\n }\n\n const resetValues = () => {\n setName('')\n setAddress('')\n }\n\n return (\n <BottomSheet ref={ref} onClose={resetValues}>\n <SendToWalletSheetContainer>\n <IconContainer>\n <TurnedIn sx={{ fontSize: 40 }} />\n </IconContainer>\n <SheetTitle>{t('sendToWallet.bookmarkWallet')}</SheetTitle>\n {validatedWallet ? (\n <SheetAddressContainer>\n {validatedWallet?.name ? (\n <Typography\n sx={{\n fontWeight: 600,\n mb: 0.5,\n }}\n >\n {validatedWallet?.name}\n </Typography>\n ) : null}\n <Typography>{validatedWallet?.address}</Typography>\n </SheetAddressContainer>\n ) : null}\n <BookmarkInputFields>\n <SendToWalletCard type={error?.type === 'name' ? 'error' : 'default'}>\n <Input\n size=\"small\"\n autoComplete=\"off\"\n autoCorrect=\"off\"\n autoCapitalize=\"off\"\n spellCheck=\"false\"\n onChange={handleNameInputChange}\n value={name}\n placeholder={validatedWallet?.name || t('sendToWallet.enterName')}\n aria-label={validatedWallet?.name || t('sendToWallet.enterName')}\n inputProps={{ maxLength: 128 }}\n />\n </SendToWalletCard>\n {!validatedWallet && (\n <SendToWalletCard\n type={error?.type === 'address' ? 'error' : 'default'}\n >\n <AddressInput\n size=\"small\"\n autoComplete=\"off\"\n autoCorrect=\"off\"\n autoCapitalize=\"off\"\n spellCheck=\"false\"\n onChange={handleAddressInputChange}\n value={address}\n placeholder={t('sendToWallet.enterAddress', {\n context: 'long',\n })}\n aria-label={t('sendToWallet.enterAddress', {\n context: 'long',\n })}\n maxRows={2}\n inputProps={{ maxLength: 128 }}\n multiline\n />\n </SendToWalletCard>\n )}\n {error ? (\n <ValidationAlert icon={<ErrorIcon />}>\n {error.message}\n </ValidationAlert>\n ) : null}\n </BookmarkInputFields>\n <AlertMessage\n title={\n <Typography variant=\"body2\" sx={{ color: 'text.primary' }}>\n {t('warning.message.fundsLossPrevention')}\n </Typography>\n }\n icon={<WarningRounded />}\n />\n <SendToWalletButtonRow>\n <Button variant=\"text\" onClick={handleCancel} fullWidth>\n {t('button.cancel')}\n </Button>\n <Button\n variant=\"contained\"\n onClick={handleBookmark}\n loading={isValidating}\n loadingPosition=\"center\"\n fullWidth\n focusRipple\n >\n {t('button.bookmark')}\n </Button>\n </SendToWalletButtonRow>\n </SendToWalletSheetContainer>\n </BottomSheet>\n )\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"BookmarkAddressSheet.js","names":[],"sources":["../../../../src/pages/SendToWallet/BookmarkAddressSheet.tsx"],"sourcesContent":["import ErrorIcon from '@mui/icons-material/Error'\nimport TurnedIn from '@mui/icons-material/TurnedIn'\nimport WarningRounded from '@mui/icons-material/WarningRounded'\nimport { Button, Typography } from '@mui/material'\nimport type { ChangeEvent, JSX, Ref, RefObject } from 'react'\nimport { useState } from 'react'\nimport { useTranslation } from 'react-i18next'\nimport { BottomSheet } from '../../components/BottomSheet/BottomSheet.js'\nimport type { BottomSheetBase } from '../../components/BottomSheet/types.js'\nimport { Input } from '../../components/Input.js'\nimport { AlertMessage } from '../../components/Messages/AlertMessage.js'\nimport { addressInputMaxLength } from '../../config/constants.js'\nimport { useAddressValidation } from '../../hooks/useAddressValidation.js'\nimport type { Bookmark } from '../../stores/bookmarks/types.js'\nimport { useBookmarkActions } from '../../stores/bookmarks/useBookmarkActions.js'\nimport {\n AddressInput,\n BookmarkInputFields,\n IconContainer,\n SendToWalletButtonRow,\n SendToWalletCard,\n SendToWalletSheetContainer,\n SheetAddressContainer,\n SheetTitle,\n ValidationAlert,\n} from './SendToWalletPage.style.js'\nimport type { BookmarkError } from './types.js'\n\ninterface BookmarkAddressProps {\n onAddBookmark: (bookmark: Bookmark) => void\n validatedWallet?: Bookmark\n}\n\nexport const BookmarkAddressSheet = ({\n validatedWallet,\n onAddBookmark,\n ref,\n}: BookmarkAddressProps & {\n ref?: Ref<BottomSheetBase>\n}): JSX.Element => {\n const { t } = useTranslation()\n const [name, setName] = useState('')\n const [address, setAddress] = useState('')\n const [error, setError] = useState<BookmarkError>()\n const { validateAddress, isValidating } = useAddressValidation()\n const { getBookmark } = useBookmarkActions()\n\n const nameValue = name.trim() || validatedWallet?.name || ''\n const addressValue = address || validatedWallet?.address || ''\n\n const handleCancel = () => {\n setError(undefined)\n ;(ref as RefObject<BottomSheetBase>).current?.close()\n }\n\n const validateWithAddressFromInput = async () => {\n const validationResult = await validateAddress({ value: address })\n if (!validationResult.isValid) {\n setError({ type: 'address', message: validationResult.error })\n return\n }\n\n return {\n name: nameValue,\n address: validationResult.address,\n chainType: validationResult.chainType,\n chainId: validationResult.chainId,\n }\n }\n\n const validateWithValidatedWallet = (validatedWallet: Bookmark) => {\n if (error) {\n setError(undefined)\n }\n return {\n name: nameValue,\n address: validatedWallet.address,\n chainType: validatedWallet.chainType,\n chainId: validatedWallet.chainId,\n }\n }\n\n const handleBookmark = async () => {\n if (isValidating) {\n return\n }\n if (!nameValue) {\n setError({\n type: 'name',\n message: t('error.title.bookmarkNameRequired'),\n })\n return\n }\n if (!addressValue) {\n setError({\n type: 'address',\n message: t('error.title.walletAddressRequired'),\n })\n return\n }\n\n // If the validatedWallet is supplied as a prop then we should assume\n // the address has already been validated\n const validatedBookmark = validatedWallet\n ? validateWithValidatedWallet(validatedWallet)\n : await validateWithAddressFromInput()\n\n if (validatedBookmark) {\n const existingBookmark = getBookmark(validatedBookmark.address)\n if (existingBookmark) {\n setError({\n type: 'address',\n message: t('error.title.bookmarkAlreadyExists', {\n name: existingBookmark.name,\n }),\n })\n return\n }\n ;(ref as RefObject<BottomSheetBase>).current?.close()\n\n onAddBookmark({\n name: validatedBookmark.name,\n address: validatedBookmark.address,\n chainType: validatedBookmark.chainType,\n chainId: validatedBookmark.chainId,\n })\n }\n }\n\n const handleAddressInputChange = (e: ChangeEvent) => {\n if (error) {\n setError(undefined)\n }\n setAddress((e.target as HTMLInputElement).value.trim())\n }\n\n const handleNameInputChange = (e: ChangeEvent) => {\n if (error) {\n setError(undefined)\n }\n setName((e.target as HTMLInputElement).value)\n }\n\n const resetValues = () => {\n setName('')\n setAddress('')\n }\n\n return (\n <BottomSheet ref={ref} onClose={resetValues}>\n <SendToWalletSheetContainer>\n <IconContainer>\n <TurnedIn sx={{ fontSize: 40 }} />\n </IconContainer>\n <SheetTitle>{t('sendToWallet.bookmarkWallet')}</SheetTitle>\n {validatedWallet ? (\n <SheetAddressContainer>\n {validatedWallet?.name ? (\n <Typography\n sx={{\n fontWeight: 600,\n mb: 0.5,\n }}\n >\n {validatedWallet?.name}\n </Typography>\n ) : null}\n <Typography>{validatedWallet?.address}</Typography>\n </SheetAddressContainer>\n ) : null}\n <BookmarkInputFields>\n <SendToWalletCard type={error?.type === 'name' ? 'error' : 'default'}>\n <Input\n size=\"small\"\n autoComplete=\"off\"\n autoCorrect=\"off\"\n autoCapitalize=\"off\"\n spellCheck=\"false\"\n onChange={handleNameInputChange}\n value={name}\n placeholder={validatedWallet?.name || t('sendToWallet.enterName')}\n aria-label={validatedWallet?.name || t('sendToWallet.enterName')}\n inputProps={{ maxLength: 128 }}\n />\n </SendToWalletCard>\n {!validatedWallet && (\n <SendToWalletCard\n type={error?.type === 'address' ? 'error' : 'default'}\n >\n <AddressInput\n size=\"small\"\n autoComplete=\"off\"\n autoCorrect=\"off\"\n autoCapitalize=\"off\"\n spellCheck=\"false\"\n onChange={handleAddressInputChange}\n value={address}\n placeholder={t('sendToWallet.enterAddress', {\n context: 'long',\n })}\n aria-label={t('sendToWallet.enterAddress', {\n context: 'long',\n })}\n maxRows={2}\n inputProps={{ maxLength: addressInputMaxLength }}\n multiline\n />\n </SendToWalletCard>\n )}\n {error ? (\n <ValidationAlert icon={<ErrorIcon />}>\n {error.message}\n </ValidationAlert>\n ) : null}\n </BookmarkInputFields>\n <AlertMessage\n title={\n <Typography variant=\"body2\" sx={{ color: 'text.primary' }}>\n {t('warning.message.fundsLossPrevention')}\n </Typography>\n }\n icon={<WarningRounded />}\n />\n <SendToWalletButtonRow>\n <Button variant=\"text\" onClick={handleCancel} fullWidth>\n {t('button.cancel')}\n </Button>\n <Button\n variant=\"contained\"\n onClick={handleBookmark}\n loading={isValidating}\n loadingPosition=\"center\"\n fullWidth\n focusRipple\n >\n {t('button.bookmark')}\n </Button>\n </SendToWalletButtonRow>\n </SendToWalletSheetContainer>\n </BottomSheet>\n )\n}\n"],"mappings":"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"}