@lifi/widget 4.6.0 → 4.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 (394) hide show
  1. package/README.md +26 -3
  2. package/dist/esm/App.d.ts +1 -2
  3. package/dist/esm/App.d.ts.map +1 -1
  4. package/dist/esm/AppDrawer.d.ts +1 -2
  5. package/dist/esm/AppDrawer.d.ts.map +1 -1
  6. package/dist/esm/components/ActionRow/ActionRow.d.ts +1 -2
  7. package/dist/esm/components/ActionRow/ActionRow.d.ts.map +1 -1
  8. package/dist/esm/components/AmountInput/AmountInput.style.d.ts +2 -2
  9. package/dist/esm/components/AmountInput/AmountInput.style.d.ts.map +1 -1
  10. package/dist/esm/components/AmountInput/AmountInputEndAdornment.d.ts +1 -2
  11. package/dist/esm/components/AmountInput/AmountInputEndAdornment.d.ts.map +1 -1
  12. package/dist/esm/components/AmountInput/PriceFormHelperText.style.d.ts +1 -2
  13. package/dist/esm/components/AmountInput/PriceFormHelperText.style.d.ts.map +1 -1
  14. package/dist/esm/components/AmountInputCard/ReceiveAmountCard.js +6 -2
  15. package/dist/esm/components/AmountInputCard/ReceiveAmountCard.js.map +1 -1
  16. package/dist/esm/components/Avatar/Avatar.d.ts +1 -2
  17. package/dist/esm/components/Avatar/Avatar.d.ts.map +1 -1
  18. package/dist/esm/components/Avatar/TokenAvatar.d.ts +1 -2
  19. package/dist/esm/components/Avatar/TokenAvatar.d.ts.map +1 -1
  20. package/dist/esm/components/BaseTransactionButton/BaseTransactionButton.d.ts +1 -2
  21. package/dist/esm/components/BaseTransactionButton/BaseTransactionButton.d.ts.map +1 -1
  22. package/dist/esm/components/BaseTransactionButton/types.d.ts +1 -2
  23. package/dist/esm/components/BaseTransactionButton/types.d.ts.map +1 -1
  24. package/dist/esm/components/BottomSheet/BottomSheet.js +1 -0
  25. package/dist/esm/components/BottomSheet/BottomSheet.js.map +1 -1
  26. package/dist/esm/components/BottomSheet/types.d.ts +1 -2
  27. package/dist/esm/components/BottomSheet/types.d.ts.map +1 -1
  28. package/dist/esm/components/ButtonTertiary.d.ts +1 -2
  29. package/dist/esm/components/ButtonTertiary.d.ts.map +1 -1
  30. package/dist/esm/components/Card/CardIconButton.d.ts +1 -2
  31. package/dist/esm/components/Card/CardIconButton.d.ts.map +1 -1
  32. package/dist/esm/components/Card/CardTitle.d.ts +1 -2
  33. package/dist/esm/components/Card/CardTitle.d.ts.map +1 -1
  34. package/dist/esm/components/Card/InputCard.d.ts +1 -2
  35. package/dist/esm/components/Card/InputCard.d.ts.map +1 -1
  36. package/dist/esm/components/ChainSelect/ChainSelect.d.ts +1 -2
  37. package/dist/esm/components/ChainSelect/ChainSelect.d.ts.map +1 -1
  38. package/dist/esm/components/ChainSelect/ChainSelect.style.d.ts +1 -2
  39. package/dist/esm/components/ChainSelect/ChainSelect.style.d.ts.map +1 -1
  40. package/dist/esm/components/ContractComponent/ContractComponent.d.ts +1 -2
  41. package/dist/esm/components/ContractComponent/ContractComponent.d.ts.map +1 -1
  42. package/dist/esm/components/ContractComponent/ItemPrice.d.ts +2 -3
  43. package/dist/esm/components/ContractComponent/ItemPrice.d.ts.map +1 -1
  44. package/dist/esm/components/ContractComponent/NFT/NFT.d.ts +1 -2
  45. package/dist/esm/components/ContractComponent/NFT/NFT.d.ts.map +1 -1
  46. package/dist/esm/components/ContractComponent/NFT/NFTBase.d.ts +1 -2
  47. package/dist/esm/components/ContractComponent/NFT/NFTBase.d.ts.map +1 -1
  48. package/dist/esm/components/ContractComponent/NFT/types.d.ts +3 -4
  49. package/dist/esm/components/ContractComponent/NFT/types.d.ts.map +1 -1
  50. package/dist/esm/components/ExecutionStatusCard/ExecutionStatusCard.d.ts +1 -2
  51. package/dist/esm/components/ExecutionStatusCard/ExecutionStatusCard.d.ts.map +1 -1
  52. package/dist/esm/components/ExecutionStatusCard/StatusIcon.d.ts +1 -2
  53. package/dist/esm/components/ExecutionStatusCard/StatusIcon.d.ts.map +1 -1
  54. package/dist/esm/components/FeeBreakdownTooltip.d.ts +1 -2
  55. package/dist/esm/components/FeeBreakdownTooltip.d.ts.map +1 -1
  56. package/dist/esm/components/IconCircle/IconCircle.d.ts +1 -2
  57. package/dist/esm/components/IconCircle/IconCircle.d.ts.map +1 -1
  58. package/dist/esm/components/IconCircle/statusIcons.d.ts +1 -2
  59. package/dist/esm/components/IconCircle/statusIcons.d.ts.map +1 -1
  60. package/dist/esm/components/IconTypography.d.ts +1 -2
  61. package/dist/esm/components/IconTypography.d.ts.map +1 -1
  62. package/dist/esm/components/ListItem/ListItemButton.d.ts +1 -2
  63. package/dist/esm/components/ListItem/ListItemButton.d.ts.map +1 -1
  64. package/dist/esm/components/Messages/WarningMessages.d.ts +1 -2
  65. package/dist/esm/components/Messages/WarningMessages.d.ts.map +1 -1
  66. package/dist/esm/components/PageContainer.d.ts +2 -3
  67. package/dist/esm/components/PageContainer.d.ts.map +1 -1
  68. package/dist/esm/components/PoweredBy/PoweredBy.d.ts +1 -2
  69. package/dist/esm/components/PoweredBy/PoweredBy.d.ts.map +1 -1
  70. package/dist/esm/components/ProgressToNextUpdate.d.ts +1 -2
  71. package/dist/esm/components/ProgressToNextUpdate.d.ts.map +1 -1
  72. package/dist/esm/components/RouteCard/RouteCard.d.ts +1 -2
  73. package/dist/esm/components/RouteCard/RouteCard.d.ts.map +1 -1
  74. package/dist/esm/components/RouteCard/RouteCardSkeleton.d.ts +1 -2
  75. package/dist/esm/components/RouteCard/RouteCardSkeleton.d.ts.map +1 -1
  76. package/dist/esm/components/RouteCard/RouteDetails.d.ts +1 -2
  77. package/dist/esm/components/RouteCard/RouteDetails.d.ts.map +1 -1
  78. package/dist/esm/components/RouteCard/RouteDetails.style.d.ts +5 -6
  79. package/dist/esm/components/RouteCard/RouteDetails.style.d.ts.map +1 -1
  80. package/dist/esm/components/RouteCard/RouteNotFoundCard.d.ts +1 -2
  81. package/dist/esm/components/RouteCard/RouteNotFoundCard.d.ts.map +1 -1
  82. package/dist/esm/components/RouteCard/RouteTokens.d.ts +1 -2
  83. package/dist/esm/components/RouteCard/RouteTokens.d.ts.map +1 -1
  84. package/dist/esm/components/RouteCard/types.d.ts +2 -3
  85. package/dist/esm/components/RouteCard/types.d.ts.map +1 -1
  86. package/dist/esm/components/Search/SearchInput.d.ts +1 -2
  87. package/dist/esm/components/Search/SearchInput.d.ts.map +1 -1
  88. package/dist/esm/components/SendToWallet/SendToWalletButton.d.ts +1 -2
  89. package/dist/esm/components/SendToWallet/SendToWalletButton.d.ts.map +1 -1
  90. package/dist/esm/components/Skeleton/WidgetSkeleton.d.ts +1 -2
  91. package/dist/esm/components/Skeleton/WidgetSkeleton.d.ts.map +1 -1
  92. package/dist/esm/components/StepActions/SentToWalletRow.d.ts +1 -2
  93. package/dist/esm/components/StepActions/SentToWalletRow.d.ts.map +1 -1
  94. package/dist/esm/components/StepActions/StepActionRow.style.d.ts +1 -2
  95. package/dist/esm/components/StepActions/StepActionRow.style.d.ts.map +1 -1
  96. package/dist/esm/components/StepActions/StepActionsList.d.ts +1 -2
  97. package/dist/esm/components/StepActions/StepActionsList.d.ts.map +1 -1
  98. package/dist/esm/components/StepActions/executionRows.d.ts +2 -3
  99. package/dist/esm/components/StepActions/executionRows.d.ts.map +1 -1
  100. package/dist/esm/components/Token/Token.d.ts.map +1 -1
  101. package/dist/esm/components/Token/Token.js +2 -4
  102. package/dist/esm/components/Token/Token.js.map +1 -1
  103. package/dist/esm/components/TokenList/RecentTokensHeader.js +44 -0
  104. package/dist/esm/components/TokenList/RecentTokensHeader.js.map +1 -0
  105. package/dist/esm/components/TokenList/RecentTokensToggle.js +36 -0
  106. package/dist/esm/components/TokenList/RecentTokensToggle.js.map +1 -0
  107. package/dist/esm/components/TokenList/RemoveRecentTokenButton.js +32 -0
  108. package/dist/esm/components/TokenList/RemoveRecentTokenButton.js.map +1 -0
  109. package/dist/esm/components/TokenList/TokenList.js +55 -5
  110. package/dist/esm/components/TokenList/TokenList.js.map +1 -1
  111. package/dist/esm/components/TokenList/TokenListItem.js +35 -19
  112. package/dist/esm/components/TokenList/TokenListItem.js.map +1 -1
  113. package/dist/esm/components/TokenList/TokenNotFound.d.ts +1 -2
  114. package/dist/esm/components/TokenList/TokenNotFound.d.ts.map +1 -1
  115. package/dist/esm/components/TokenList/VirtualizedTokenList.d.ts +1 -2
  116. package/dist/esm/components/TokenList/VirtualizedTokenList.d.ts.map +1 -1
  117. package/dist/esm/components/TokenList/VirtualizedTokenList.js +55 -42
  118. package/dist/esm/components/TokenList/VirtualizedTokenList.js.map +1 -1
  119. package/dist/esm/components/TokenList/types.d.ts +9 -2
  120. package/dist/esm/components/TokenList/types.d.ts.map +1 -1
  121. package/dist/esm/components/TokenList/useTokenSelect.d.ts +1 -2
  122. package/dist/esm/components/TokenList/useTokenSelect.d.ts.map +1 -1
  123. package/dist/esm/components/TokenRate/TokenRate.d.ts +1 -2
  124. package/dist/esm/components/TokenRate/TokenRate.d.ts.map +1 -1
  125. package/dist/esm/components/TransactionCard/TransactionCard.style.d.ts +2 -3
  126. package/dist/esm/components/TransactionCard/TransactionCard.style.d.ts.map +1 -1
  127. package/dist/esm/config/constants.d.ts +1 -2
  128. package/dist/esm/config/constants.d.ts.map +1 -1
  129. package/dist/esm/config/version.d.ts +2 -3
  130. package/dist/esm/config/version.d.ts.map +1 -1
  131. package/dist/esm/config/version.js +1 -1
  132. package/dist/esm/config/version.js.map +1 -1
  133. package/dist/esm/hooks/useAddressActivity.d.ts +1 -2
  134. package/dist/esm/hooks/useAddressActivity.d.ts.map +1 -1
  135. package/dist/esm/hooks/useAddressValidation.d.ts +2 -3
  136. package/dist/esm/hooks/useAddressValidation.d.ts.map +1 -1
  137. package/dist/esm/hooks/useAvailableChains.d.ts +1 -2
  138. package/dist/esm/hooks/useAvailableChains.d.ts.map +1 -1
  139. package/dist/esm/hooks/useChain.d.ts +1 -2
  140. package/dist/esm/hooks/useChain.d.ts.map +1 -1
  141. package/dist/esm/hooks/useContactSupport.d.ts +1 -2
  142. package/dist/esm/hooks/useContactSupport.d.ts.map +1 -1
  143. package/dist/esm/hooks/useDebouncedWatch.d.ts +1 -2
  144. package/dist/esm/hooks/useDebouncedWatch.d.ts.map +1 -1
  145. package/dist/esm/hooks/useDisplayedTokens.js +6 -4
  146. package/dist/esm/hooks/useDisplayedTokens.js.map +1 -1
  147. package/dist/esm/hooks/useExplorer.d.ts +1 -2
  148. package/dist/esm/hooks/useExplorer.d.ts.map +1 -1
  149. package/dist/esm/hooks/useHeader.d.ts +1 -2
  150. package/dist/esm/hooks/useHeader.d.ts.map +1 -1
  151. package/dist/esm/hooks/useListHeight.d.ts +1 -2
  152. package/dist/esm/hooks/useListHeight.d.ts.map +1 -1
  153. package/dist/esm/hooks/useNavigateBack.d.ts +1 -2
  154. package/dist/esm/hooks/useNavigateBack.d.ts.map +1 -1
  155. package/dist/esm/hooks/useRecentTokens.js +46 -0
  156. package/dist/esm/hooks/useRecentTokens.js.map +1 -0
  157. package/dist/esm/hooks/useRouteExecution.d.ts +1 -2
  158. package/dist/esm/hooks/useRouteExecution.d.ts.map +1 -1
  159. package/dist/esm/hooks/useRouteExecutionMessage.d.ts +1 -2
  160. package/dist/esm/hooks/useRouteExecutionMessage.d.ts.map +1 -1
  161. package/dist/esm/hooks/useRoutes.d.ts +1 -2
  162. package/dist/esm/hooks/useRoutes.d.ts.map +1 -1
  163. package/dist/esm/hooks/useRoutes.js +7 -2
  164. package/dist/esm/hooks/useRoutes.js.map +1 -1
  165. package/dist/esm/hooks/useToAddressRequirements.d.ts +1 -2
  166. package/dist/esm/hooks/useToAddressRequirements.d.ts.map +1 -1
  167. package/dist/esm/hooks/useToAddressRequirements.js +8 -2
  168. package/dist/esm/hooks/useToAddressRequirements.js.map +1 -1
  169. package/dist/esm/hooks/useToken.d.ts +1 -2
  170. package/dist/esm/hooks/useToken.d.ts.map +1 -1
  171. package/dist/esm/hooks/useTokenAddressBalance.d.ts +1 -2
  172. package/dist/esm/hooks/useTokenAddressBalance.d.ts.map +1 -1
  173. package/dist/esm/hooks/useTokenBalances.d.ts +3 -2
  174. package/dist/esm/hooks/useTokenBalances.d.ts.map +1 -1
  175. package/dist/esm/hooks/useTokenBalances.js +15 -9
  176. package/dist/esm/hooks/useTokenBalances.js.map +1 -1
  177. package/dist/esm/hooks/useTokenList.d.ts +1 -2
  178. package/dist/esm/hooks/useTokenList.d.ts.map +1 -1
  179. package/dist/esm/hooks/useTokenSearch.js +3 -2
  180. package/dist/esm/hooks/useTokenSearch.js.map +1 -1
  181. package/dist/esm/hooks/useTokens.js +26 -15
  182. package/dist/esm/hooks/useTokens.js.map +1 -1
  183. package/dist/esm/hooks/useTools.d.ts +1 -2
  184. package/dist/esm/hooks/useTools.d.ts.map +1 -1
  185. package/dist/esm/hooks/useWidgetChains.d.ts +1 -2
  186. package/dist/esm/hooks/useWidgetChains.d.ts.map +1 -1
  187. package/dist/esm/hooks/useWidgetEvents.d.ts +3 -4
  188. package/dist/esm/hooks/useWidgetEvents.d.ts.map +1 -1
  189. package/dist/esm/i18n/bn.json +4 -0
  190. package/dist/esm/i18n/de.json +4 -0
  191. package/dist/esm/i18n/en.json +4 -0
  192. package/dist/esm/i18n/es.json +4 -0
  193. package/dist/esm/i18n/fr.json +4 -0
  194. package/dist/esm/i18n/hi.json +4 -0
  195. package/dist/esm/i18n/id.json +4 -0
  196. package/dist/esm/i18n/it.json +4 -0
  197. package/dist/esm/i18n/ja.json +4 -0
  198. package/dist/esm/i18n/ko.json +4 -0
  199. package/dist/esm/i18n/pl.json +4 -0
  200. package/dist/esm/i18n/pt.json +4 -0
  201. package/dist/esm/i18n/th.json +4 -0
  202. package/dist/esm/i18n/tr.json +4 -0
  203. package/dist/esm/i18n/uk.json +4 -0
  204. package/dist/esm/i18n/vi.json +4 -0
  205. package/dist/esm/i18n/zh.json +4 -0
  206. package/dist/esm/pages/MainPage/MainWarningMessages.d.ts +1 -2
  207. package/dist/esm/pages/MainPage/MainWarningMessages.d.ts.map +1 -1
  208. package/dist/esm/pages/SelectChainPage/SelectChainPage.d.ts +1 -2
  209. package/dist/esm/pages/SelectChainPage/SelectChainPage.d.ts.map +1 -1
  210. package/dist/esm/pages/SelectChainPage/types.d.ts +1 -2
  211. package/dist/esm/pages/SelectChainPage/types.d.ts.map +1 -1
  212. package/dist/esm/pages/SelectTokenPage/SearchTokenInput.d.ts +1 -2
  213. package/dist/esm/pages/SelectTokenPage/SearchTokenInput.d.ts.map +1 -1
  214. package/dist/esm/pages/TransactionDetailsPage/ContactSupportButton.d.ts +1 -2
  215. package/dist/esm/pages/TransactionDetailsPage/ContactSupportButton.d.ts.map +1 -1
  216. package/dist/esm/pages/TransactionPage/ConfirmToAddressSheet.d.ts +1 -2
  217. package/dist/esm/pages/TransactionPage/ConfirmToAddressSheet.d.ts.map +1 -1
  218. package/dist/esm/pages/TransactionPage/ExchangeRateBottomSheet.d.ts +2 -3
  219. package/dist/esm/pages/TransactionPage/ExchangeRateBottomSheet.d.ts.map +1 -1
  220. package/dist/esm/pages/TransactionPage/ExecutionDoneCard.d.ts +1 -2
  221. package/dist/esm/pages/TransactionPage/ExecutionDoneCard.d.ts.map +1 -1
  222. package/dist/esm/pages/TransactionPage/RouteTracker.d.ts +1 -2
  223. package/dist/esm/pages/TransactionPage/RouteTracker.d.ts.map +1 -1
  224. package/dist/esm/pages/TransactionPage/StartTransactionButton.d.ts +1 -2
  225. package/dist/esm/pages/TransactionPage/StartTransactionButton.d.ts.map +1 -1
  226. package/dist/esm/pages/TransactionPage/TokenValueBottomSheet.d.ts +1 -2
  227. package/dist/esm/pages/TransactionPage/TokenValueBottomSheet.d.ts.map +1 -1
  228. package/dist/esm/pages/TransactionPage/TokenValueBottomSheet.js +0 -1
  229. package/dist/esm/pages/TransactionPage/TokenValueBottomSheet.js.map +1 -1
  230. package/dist/esm/pages/TransactionPage/TokenVerificationBottomSheet.js +0 -1
  231. package/dist/esm/pages/TransactionPage/TokenVerificationBottomSheet.js.map +1 -1
  232. package/dist/esm/pages/TransactionPage/TransactionDoneButtons.d.ts +1 -2
  233. package/dist/esm/pages/TransactionPage/TransactionDoneButtons.d.ts.map +1 -1
  234. package/dist/esm/pages/TransactionPage/TransactionFailedButtons.js +38 -12
  235. package/dist/esm/pages/TransactionPage/TransactionFailedButtons.js.map +1 -1
  236. package/dist/esm/pages/TransactionPage/TransactionReview.js +22 -21
  237. package/dist/esm/pages/TransactionPage/TransactionReview.js.map +1 -1
  238. package/dist/esm/pages/TransactionPage/types.d.ts +1 -2
  239. package/dist/esm/pages/TransactionPage/types.d.ts.map +1 -1
  240. package/dist/esm/pages/TransactionPage/utils.d.ts +2 -3
  241. package/dist/esm/pages/TransactionPage/utils.d.ts.map +1 -1
  242. package/dist/esm/pages/TransactionPage/utils.js +23 -1
  243. package/dist/esm/pages/TransactionPage/utils.js.map +1 -1
  244. package/dist/esm/providers/I18nProvider/I18nProvider.d.ts +1 -2
  245. package/dist/esm/providers/I18nProvider/I18nProvider.d.ts.map +1 -1
  246. package/dist/esm/providers/I18nProvider/types.d.ts +4 -5
  247. package/dist/esm/providers/I18nProvider/types.d.ts.map +1 -1
  248. package/dist/esm/providers/QueryClientProvider.d.ts +1 -2
  249. package/dist/esm/providers/QueryClientProvider.d.ts.map +1 -1
  250. package/dist/esm/providers/SDKClientProvider.d.ts +2 -3
  251. package/dist/esm/providers/SDKClientProvider.d.ts.map +1 -1
  252. package/dist/esm/providers/WalletProvider/WalletProvider.d.ts +1 -2
  253. package/dist/esm/providers/WalletProvider/WalletProvider.d.ts.map +1 -1
  254. package/dist/esm/providers/WidgetProvider/WidgetProvider.d.ts +2 -3
  255. package/dist/esm/providers/WidgetProvider/WidgetProvider.d.ts.map +1 -1
  256. package/dist/esm/providers/WidgetProvider/types.d.ts +2 -3
  257. package/dist/esm/providers/WidgetProvider/types.d.ts.map +1 -1
  258. package/dist/esm/stores/StoreProvider.d.ts +1 -2
  259. package/dist/esm/stores/StoreProvider.d.ts.map +1 -1
  260. package/dist/esm/stores/StoreProvider.js +10 -6
  261. package/dist/esm/stores/StoreProvider.js.map +1 -1
  262. package/dist/esm/stores/bookmarks/BookmarkStore.d.ts +1 -2
  263. package/dist/esm/stores/bookmarks/BookmarkStore.d.ts.map +1 -1
  264. package/dist/esm/stores/bookmarks/types.d.ts +5 -6
  265. package/dist/esm/stores/bookmarks/types.d.ts.map +1 -1
  266. package/dist/esm/stores/chains/ChainOrderStore.d.ts +1 -2
  267. package/dist/esm/stores/chains/ChainOrderStore.d.ts.map +1 -1
  268. package/dist/esm/stores/chains/ChainOrderStore.js +11 -5
  269. package/dist/esm/stores/chains/ChainOrderStore.js.map +1 -1
  270. package/dist/esm/stores/chains/types.d.ts +1 -2
  271. package/dist/esm/stores/chains/types.d.ts.map +1 -1
  272. package/dist/esm/stores/form/types.d.ts +20 -21
  273. package/dist/esm/stores/form/types.d.ts.map +1 -1
  274. package/dist/esm/stores/form/useFieldActions.d.ts +1 -2
  275. package/dist/esm/stores/form/useFieldActions.d.ts.map +1 -1
  276. package/dist/esm/stores/form/useFieldValues.d.ts +1 -2
  277. package/dist/esm/stores/form/useFieldValues.d.ts.map +1 -1
  278. package/dist/esm/stores/header/types.d.ts +1 -2
  279. package/dist/esm/stores/header/types.d.ts.map +1 -1
  280. package/dist/esm/stores/header/useHeaderStore.d.ts +2 -3
  281. package/dist/esm/stores/header/useHeaderStore.d.ts.map +1 -1
  282. package/dist/esm/stores/inputMode/useInputModeStore.d.ts +1 -2
  283. package/dist/esm/stores/inputMode/useInputModeStore.d.ts.map +1 -1
  284. package/dist/esm/stores/recentTokens/RecentTokensStore.js +23 -0
  285. package/dist/esm/stores/recentTokens/RecentTokensStore.js.map +1 -0
  286. package/dist/esm/stores/recentTokens/createRecentTokensStore.js +54 -0
  287. package/dist/esm/stores/recentTokens/createRecentTokensStore.js.map +1 -0
  288. package/dist/esm/stores/recentTokens/utils.js +15 -0
  289. package/dist/esm/stores/recentTokens/utils.js.map +1 -0
  290. package/dist/esm/stores/routes/RouteExecutionStore.d.ts +2 -3
  291. package/dist/esm/stores/routes/RouteExecutionStore.d.ts.map +1 -1
  292. package/dist/esm/stores/routes/types.d.ts +3 -4
  293. package/dist/esm/stores/routes/types.d.ts.map +1 -1
  294. package/dist/esm/stores/routes/utils.d.ts +4 -5
  295. package/dist/esm/stores/routes/utils.d.ts.map +1 -1
  296. package/dist/esm/stores/settings/SettingsStore.d.ts +2 -3
  297. package/dist/esm/stores/settings/SettingsStore.d.ts.map +1 -1
  298. package/dist/esm/stores/settings/types.d.ts +2 -3
  299. package/dist/esm/stores/settings/types.d.ts.map +1 -1
  300. package/dist/esm/stores/types.d.ts +2 -3
  301. package/dist/esm/stores/types.d.ts.map +1 -1
  302. package/dist/esm/themes/azureLight.d.ts +1 -2
  303. package/dist/esm/themes/azureLight.d.ts.map +1 -1
  304. package/dist/esm/themes/jumper.d.ts +1 -2
  305. package/dist/esm/themes/jumper.d.ts.map +1 -1
  306. package/dist/esm/themes/palettes.d.ts +3 -4
  307. package/dist/esm/themes/palettes.d.ts.map +1 -1
  308. package/dist/esm/themes/types.d.ts +1 -0
  309. package/dist/esm/themes/watermelonLight.d.ts +1 -2
  310. package/dist/esm/themes/watermelonLight.d.ts.map +1 -1
  311. package/dist/esm/themes/windows95.d.ts +1 -2
  312. package/dist/esm/themes/windows95.d.ts.map +1 -1
  313. package/dist/esm/types/events.d.ts +13 -14
  314. package/dist/esm/types/events.d.ts.map +1 -1
  315. package/dist/esm/types/token.d.ts +4 -2
  316. package/dist/esm/types/token.d.ts.map +1 -1
  317. package/dist/esm/types/widget.d.ts +55 -51
  318. package/dist/esm/types/widget.d.ts.map +1 -1
  319. package/dist/esm/types/widget.js.map +1 -1
  320. package/dist/esm/utils/address.js +19 -0
  321. package/dist/esm/utils/address.js.map +1 -0
  322. package/dist/esm/utils/compactNumberFormatter.d.ts +1 -2
  323. package/dist/esm/utils/compactNumberFormatter.d.ts.map +1 -1
  324. package/dist/esm/utils/converters.d.ts +1 -2
  325. package/dist/esm/utils/converters.d.ts.map +1 -1
  326. package/dist/esm/utils/currencyExtendedFormatter.d.ts +1 -2
  327. package/dist/esm/utils/currencyExtendedFormatter.d.ts.map +1 -1
  328. package/dist/esm/utils/customReceiver.js +6 -1
  329. package/dist/esm/utils/customReceiver.js.map +1 -1
  330. package/dist/esm/utils/elements.d.ts +2 -3
  331. package/dist/esm/utils/elements.d.ts.map +1 -1
  332. package/dist/esm/utils/enum.d.ts +1 -2
  333. package/dist/esm/utils/enum.d.ts.map +1 -1
  334. package/dist/esm/utils/fees.d.ts +2 -3
  335. package/dist/esm/utils/fees.d.ts.map +1 -1
  336. package/dist/esm/utils/format.d.ts +8 -9
  337. package/dist/esm/utils/format.d.ts.map +1 -1
  338. package/dist/esm/utils/getPriceImpact.d.ts +1 -2
  339. package/dist/esm/utils/getPriceImpact.d.ts.map +1 -1
  340. package/dist/esm/utils/input.d.ts +1 -2
  341. package/dist/esm/utils/input.d.ts.map +1 -1
  342. package/dist/esm/utils/navigationRoutes.d.ts +2 -3
  343. package/dist/esm/utils/navigationRoutes.d.ts.map +1 -1
  344. package/dist/esm/utils/percentFormatter.d.ts +1 -2
  345. package/dist/esm/utils/percentFormatter.d.ts.map +1 -1
  346. package/dist/esm/utils/recentTokens.js +97 -0
  347. package/dist/esm/utils/recentTokens.js.map +1 -0
  348. package/dist/esm/utils/token.js +30 -4
  349. package/dist/esm/utils/token.js.map +1 -1
  350. package/dist/esm/utils/tokenList.js +18 -6
  351. package/dist/esm/utils/tokenList.js.map +1 -1
  352. package/dist/esm/utils/tokenListBands.js +85 -0
  353. package/dist/esm/utils/tokenListBands.js.map +1 -0
  354. package/dist/esm/utils/wallet.d.ts +1 -2
  355. package/dist/esm/utils/wallet.d.ts.map +1 -1
  356. package/package.json +9 -9
  357. package/src/components/AmountInputCard/ReceiveAmountCard.tsx +16 -3
  358. package/src/components/BottomSheet/BottomSheet.tsx +3 -0
  359. package/src/components/Token/Token.tsx +2 -1
  360. package/src/components/TokenList/RecentTokensHeader.tsx +52 -0
  361. package/src/components/TokenList/RecentTokensToggle.tsx +45 -0
  362. package/src/components/TokenList/RemoveRecentTokenButton.tsx +38 -0
  363. package/src/components/TokenList/TokenList.tsx +92 -3
  364. package/src/components/TokenList/TokenListItem.tsx +15 -0
  365. package/src/components/TokenList/VirtualizedTokenList.tsx +84 -125
  366. package/src/components/TokenList/types.ts +9 -0
  367. package/src/config/version.ts +1 -1
  368. package/src/hooks/useDisplayedTokens.ts +17 -3
  369. package/src/hooks/useRecentTokens.ts +88 -0
  370. package/src/hooks/useRoutes.ts +8 -5
  371. package/src/hooks/useToAddressRequirements.ts +11 -5
  372. package/src/hooks/useTokenBalances.ts +34 -31
  373. package/src/hooks/useTokenSearch.ts +5 -14
  374. package/src/hooks/useTokens.ts +69 -27
  375. package/src/pages/TransactionPage/TokenValueBottomSheet.tsx +1 -1
  376. package/src/pages/TransactionPage/TokenVerificationBottomSheet.tsx +1 -1
  377. package/src/pages/TransactionPage/TransactionFailedButtons.tsx +62 -26
  378. package/src/pages/TransactionPage/TransactionReview.tsx +36 -37
  379. package/src/pages/TransactionPage/utils.ts +78 -0
  380. package/src/stores/StoreProvider.tsx +10 -7
  381. package/src/stores/chains/ChainOrderStore.test.tsx +298 -0
  382. package/src/stores/chains/ChainOrderStore.tsx +25 -6
  383. package/src/stores/recentTokens/RecentTokensStore.tsx +39 -0
  384. package/src/stores/recentTokens/createRecentTokensStore.ts +107 -0
  385. package/src/stores/recentTokens/types.ts +37 -0
  386. package/src/stores/recentTokens/utils.ts +18 -0
  387. package/src/types/token.ts +2 -0
  388. package/src/types/widget.ts +5 -0
  389. package/src/utils/address.ts +21 -0
  390. package/src/utils/customReceiver.ts +24 -0
  391. package/src/utils/recentTokens.ts +187 -0
  392. package/src/utils/token.ts +69 -10
  393. package/src/utils/tokenList.ts +41 -23
  394. package/src/utils/tokenListBands.ts +181 -0
@@ -1,6 +1,6 @@
1
1
  import { useWidgetConfig } from "../providers/WidgetProvider/WidgetProvider.js";
2
2
  import { useFieldValues } from "../stores/form/useFieldValues.js";
3
- import { isCustomReceiverUnsupported } from "../utils/customReceiver.js";
3
+ import { isCustomReceiverBlocked, isCustomReceiverUnsupported } from "../utils/customReceiver.js";
4
4
  import { useChain } from "./useChain.js";
5
5
  import { useIsContractAddress } from "./useIsContractAddress.js";
6
6
  import { useEthereumContext } from "@lifi/widget-provider";
@@ -23,7 +23,13 @@ const useToAddressRequirements = (route) => {
23
23
  const fromContractCodeHasDelegationIndicator = isDelegationDesignatorCode?.(fromContractCode);
24
24
  const isCrossChainContractAddress = isFromContractAddress && fromChainId !== toChainId && !fromContractCodeHasDelegationIndicator;
25
25
  const unsupportedToAddress = isCustomReceiverUnsupported(fromChain?.chainType, toChain?.chainType);
26
- const unsupportedReceiverBlocking = Boolean(unsupportedToAddress && (toAddress || requiredUI?.toAddress));
26
+ const unsupportedReceiverBlocking = isCustomReceiverBlocked({
27
+ fromChainType: fromChain?.chainType,
28
+ toChainType: toChain?.chainType,
29
+ toAddress,
30
+ signerAddress: fromAddress,
31
+ receiverRequired: requiredUI?.toAddress
32
+ });
27
33
  const requiredToAddress = Boolean((isDifferentChainType || isCrossChainContractAddress || requiredUI?.toAddress) && !hiddenUI?.toAddress && !unsupportedToAddress);
28
34
  const accountNotDeployedAtDestination = Boolean(isFromContractAddress && !fromContractCodeHasDelegationIndicator && !isToContractAddress && fromAddress?.toLowerCase() === toAddress?.toLowerCase());
29
35
  const accountDeployedAtDestination = Boolean(isFromContractAddress && isToContractAddress && !fromContractCodeHasDelegationIndicator && fromAddress?.toLowerCase() === toAddress?.toLowerCase());
@@ -1 +1 @@
1
- {"version":3,"file":"useToAddressRequirements.js","names":[],"sources":["../../../src/hooks/useToAddressRequirements.ts"],"sourcesContent":["import type { ChainType, RouteExtended } from '@lifi/sdk'\nimport { useAccount } from '@lifi/wallet-management'\nimport { useEthereumContext } from '@lifi/widget-provider'\nimport { useChain } from '../hooks/useChain.js'\nimport { useWidgetConfig } from '../providers/WidgetProvider/WidgetProvider.js'\nimport { useFieldValues } from '../stores/form/useFieldValues.js'\nimport { isCustomReceiverUnsupported } from '../utils/customReceiver.js'\nimport { useIsContractAddress } from './useIsContractAddress.js'\n\nexport const useToAddressRequirements = (\n route?: RouteExtended\n): {\n requiredToAddress: boolean\n unsupportedToAddress: boolean\n unsupportedReceiverBlocking: boolean\n requiredToChainType: ChainType | undefined\n accountNotDeployedAtDestination: boolean\n accountDeployedAtDestination: boolean\n toAddress: string | undefined\n isFromContractAddress: boolean | undefined\n isToContractAddress: boolean | undefined\n isLoading: boolean\n isFetched: boolean\n} => {\n const { requiredUI, hiddenUI } = useWidgetConfig()\n const [formFromChainId, formToChainId, formToAddress] = useFieldValues(\n 'fromChain',\n 'toChain',\n 'toAddress'\n )\n const { isDelegationDesignatorCode } = useEthereumContext()\n\n const fromChainId = route?.fromChainId ?? formFromChainId\n const toChainId = route?.toChainId ?? formToChainId\n\n const { chain: fromChain } = useChain(fromChainId)\n const { chain: toChain } = useChain(toChainId)\n const { account } = useAccount({\n chainType: fromChain?.chainType,\n })\n\n const fromAddress = route?.fromAddress ?? account.address\n const toAddress = route\n ? route.fromAddress !== route.toAddress\n ? route.toAddress\n : formToAddress\n : formToAddress\n\n const {\n isContractAddress: isFromContractAddress,\n contractCode: fromContractCode,\n isLoading: isFromContractLoading,\n isFetched: isFromContractFetched,\n } = useIsContractAddress(account.address, fromChain?.id, account.chainType)\n const {\n isContractAddress: isToContractAddress,\n isLoading: isToContractLoading,\n isFetched: isToContractFetched,\n } = useIsContractAddress(toAddress, toChain?.id, toChain?.chainType)\n\n const isDifferentChainType =\n fromChain && toChain && fromChain.chainType !== toChain.chainType\n\n // We don't want to block transfers for EIP-7702 accounts since they are designed\n // to maintain EOA-like properties while delegating execution.\n const fromContractCodeHasDelegationIndicator =\n isDelegationDesignatorCode?.(fromContractCode)\n\n const isCrossChainContractAddress =\n isFromContractAddress &&\n fromChainId !== toChainId &&\n !fromContractCodeHasDelegationIndicator\n\n const unsupportedToAddress = isCustomReceiverUnsupported(\n fromChain?.chainType,\n toChain?.chainType\n )\n\n // Stellar routes settle to the signer, so a required receiver is never honoured.\n const unsupportedReceiverBlocking = Boolean(\n unsupportedToAddress && (toAddress || requiredUI?.toAddress)\n )\n\n const requiredToAddress = Boolean(\n (isDifferentChainType ||\n isCrossChainContractAddress ||\n requiredUI?.toAddress) &&\n !hiddenUI?.toAddress &&\n !unsupportedToAddress\n )\n\n const accountNotDeployedAtDestination = Boolean(\n isFromContractAddress &&\n !fromContractCodeHasDelegationIndicator &&\n !isToContractAddress &&\n fromAddress?.toLowerCase() === toAddress?.toLowerCase()\n )\n\n const accountDeployedAtDestination = Boolean(\n isFromContractAddress &&\n isToContractAddress &&\n !fromContractCodeHasDelegationIndicator &&\n fromAddress?.toLowerCase() === toAddress?.toLowerCase()\n )\n\n return {\n requiredToAddress,\n unsupportedToAddress,\n unsupportedReceiverBlocking,\n requiredToChainType: toChain?.chainType,\n accountNotDeployedAtDestination,\n accountDeployedAtDestination,\n toAddress,\n isFromContractAddress,\n isToContractAddress,\n isLoading: isFromContractLoading || isToContractLoading,\n isFetched: isFromContractFetched && isToContractFetched,\n }\n}\n"],"mappings":";;;;;;;;AASA,MAAa,4BACX,UAaG;CACH,MAAM,EAAE,YAAY,aAAa,gBAAgB;CACjD,MAAM,CAAC,iBAAiB,eAAe,iBAAiB,eACtD,aACA,WACA,WACF;CACA,MAAM,EAAE,+BAA+B,mBAAmB;CAE1D,MAAM,cAAc,OAAO,eAAe;CAC1C,MAAM,YAAY,OAAO,aAAa;CAEtC,MAAM,EAAE,OAAO,cAAc,SAAS,WAAW;CACjD,MAAM,EAAE,OAAO,YAAY,SAAS,SAAS;CAC7C,MAAM,EAAE,YAAY,WAAW,EAC7B,WAAW,WAAW,UACxB,CAAC;CAED,MAAM,cAAc,OAAO,eAAe,QAAQ;CAClD,MAAM,YAAY,QACd,MAAM,gBAAgB,MAAM,YAC1B,MAAM,YACN,gBACF;CAEJ,MAAM,EACJ,mBAAmB,uBACnB,cAAc,kBACd,WAAW,uBACX,WAAW,0BACT,qBAAqB,QAAQ,SAAS,WAAW,IAAI,QAAQ,SAAS;CAC1E,MAAM,EACJ,mBAAmB,qBACnB,WAAW,qBACX,WAAW,wBACT,qBAAqB,WAAW,SAAS,IAAI,SAAS,SAAS;CAEnE,MAAM,uBACJ,aAAa,WAAW,UAAU,cAAc,QAAQ;CAI1D,MAAM,yCACJ,6BAA6B,gBAAgB;CAE/C,MAAM,8BACJ,yBACA,gBAAgB,aAChB,CAAC;CAEH,MAAM,uBAAuB,4BAC3B,WAAW,WACX,SAAS,SACX;CAGA,MAAM,8BAA8B,QAClC,yBAAyB,aAAa,YAAY,UACpD;CAEA,MAAM,oBAAoB,SACvB,wBACC,+BACA,YAAY,cACZ,CAAC,UAAU,aACX,CAAC,oBACL;CAEA,MAAM,kCAAkC,QACtC,yBACE,CAAC,0CACD,CAAC,uBACD,aAAa,YAAY,MAAM,WAAW,YAAY,CAC1D;CAEA,MAAM,+BAA+B,QACnC,yBACE,uBACA,CAAC,0CACD,aAAa,YAAY,MAAM,WAAW,YAAY,CAC1D;CAEA,OAAO;EACL;EACA;EACA;EACA,qBAAqB,SAAS;EAC9B;EACA;EACA;EACA;EACA;EACA,WAAW,yBAAyB;EACpC,WAAW,yBAAyB;CACtC;AACF"}
1
+ {"version":3,"file":"useToAddressRequirements.js","names":[],"sources":["../../../src/hooks/useToAddressRequirements.ts"],"sourcesContent":["import type { ChainType, RouteExtended } from '@lifi/sdk'\nimport { useAccount } from '@lifi/wallet-management'\nimport { useEthereumContext } from '@lifi/widget-provider'\nimport { useChain } from '../hooks/useChain.js'\nimport { useWidgetConfig } from '../providers/WidgetProvider/WidgetProvider.js'\nimport { useFieldValues } from '../stores/form/useFieldValues.js'\nimport {\n isCustomReceiverBlocked,\n isCustomReceiverUnsupported,\n} from '../utils/customReceiver.js'\nimport { useIsContractAddress } from './useIsContractAddress.js'\n\nexport const useToAddressRequirements = (\n route?: RouteExtended\n): {\n requiredToAddress: boolean\n unsupportedToAddress: boolean\n unsupportedReceiverBlocking: boolean\n requiredToChainType: ChainType | undefined\n accountNotDeployedAtDestination: boolean\n accountDeployedAtDestination: boolean\n toAddress: string | undefined\n isFromContractAddress: boolean | undefined\n isToContractAddress: boolean | undefined\n isLoading: boolean\n isFetched: boolean\n} => {\n const { requiredUI, hiddenUI } = useWidgetConfig()\n const [formFromChainId, formToChainId, formToAddress] = useFieldValues(\n 'fromChain',\n 'toChain',\n 'toAddress'\n )\n const { isDelegationDesignatorCode } = useEthereumContext()\n\n const fromChainId = route?.fromChainId ?? formFromChainId\n const toChainId = route?.toChainId ?? formToChainId\n\n const { chain: fromChain } = useChain(fromChainId)\n const { chain: toChain } = useChain(toChainId)\n const { account } = useAccount({\n chainType: fromChain?.chainType,\n })\n\n const fromAddress = route?.fromAddress ?? account.address\n const toAddress = route\n ? route.fromAddress !== route.toAddress\n ? route.toAddress\n : formToAddress\n : formToAddress\n\n const {\n isContractAddress: isFromContractAddress,\n contractCode: fromContractCode,\n isLoading: isFromContractLoading,\n isFetched: isFromContractFetched,\n } = useIsContractAddress(account.address, fromChain?.id, account.chainType)\n const {\n isContractAddress: isToContractAddress,\n isLoading: isToContractLoading,\n isFetched: isToContractFetched,\n } = useIsContractAddress(toAddress, toChain?.id, toChain?.chainType)\n\n const isDifferentChainType =\n fromChain && toChain && fromChain.chainType !== toChain.chainType\n\n // We don't want to block transfers for EIP-7702 accounts since they are designed\n // to maintain EOA-like properties while delegating execution.\n const fromContractCodeHasDelegationIndicator =\n isDelegationDesignatorCode?.(fromContractCode)\n\n const isCrossChainContractAddress =\n isFromContractAddress &&\n fromChainId !== toChainId &&\n !fromContractCodeHasDelegationIndicator\n\n const unsupportedToAddress = isCustomReceiverUnsupported(\n fromChain?.chainType,\n toChain?.chainType\n )\n\n const unsupportedReceiverBlocking = isCustomReceiverBlocked({\n fromChainType: fromChain?.chainType,\n toChainType: toChain?.chainType,\n toAddress,\n signerAddress: fromAddress,\n receiverRequired: requiredUI?.toAddress,\n })\n\n const requiredToAddress = Boolean(\n (isDifferentChainType ||\n isCrossChainContractAddress ||\n requiredUI?.toAddress) &&\n !hiddenUI?.toAddress &&\n !unsupportedToAddress\n )\n\n const accountNotDeployedAtDestination = Boolean(\n isFromContractAddress &&\n !fromContractCodeHasDelegationIndicator &&\n !isToContractAddress &&\n fromAddress?.toLowerCase() === toAddress?.toLowerCase()\n )\n\n const accountDeployedAtDestination = Boolean(\n isFromContractAddress &&\n isToContractAddress &&\n !fromContractCodeHasDelegationIndicator &&\n fromAddress?.toLowerCase() === toAddress?.toLowerCase()\n )\n\n return {\n requiredToAddress,\n unsupportedToAddress,\n unsupportedReceiverBlocking,\n requiredToChainType: toChain?.chainType,\n accountNotDeployedAtDestination,\n accountDeployedAtDestination,\n toAddress,\n isFromContractAddress,\n isToContractAddress,\n isLoading: isFromContractLoading || isToContractLoading,\n isFetched: isFromContractFetched && isToContractFetched,\n }\n}\n"],"mappings":";;;;;;;;AAYA,MAAa,4BACX,UAaG;CACH,MAAM,EAAE,YAAY,aAAa,gBAAgB;CACjD,MAAM,CAAC,iBAAiB,eAAe,iBAAiB,eACtD,aACA,WACA,WACF;CACA,MAAM,EAAE,+BAA+B,mBAAmB;CAE1D,MAAM,cAAc,OAAO,eAAe;CAC1C,MAAM,YAAY,OAAO,aAAa;CAEtC,MAAM,EAAE,OAAO,cAAc,SAAS,WAAW;CACjD,MAAM,EAAE,OAAO,YAAY,SAAS,SAAS;CAC7C,MAAM,EAAE,YAAY,WAAW,EAC7B,WAAW,WAAW,UACxB,CAAC;CAED,MAAM,cAAc,OAAO,eAAe,QAAQ;CAClD,MAAM,YAAY,QACd,MAAM,gBAAgB,MAAM,YAC1B,MAAM,YACN,gBACF;CAEJ,MAAM,EACJ,mBAAmB,uBACnB,cAAc,kBACd,WAAW,uBACX,WAAW,0BACT,qBAAqB,QAAQ,SAAS,WAAW,IAAI,QAAQ,SAAS;CAC1E,MAAM,EACJ,mBAAmB,qBACnB,WAAW,qBACX,WAAW,wBACT,qBAAqB,WAAW,SAAS,IAAI,SAAS,SAAS;CAEnE,MAAM,uBACJ,aAAa,WAAW,UAAU,cAAc,QAAQ;CAI1D,MAAM,yCACJ,6BAA6B,gBAAgB;CAE/C,MAAM,8BACJ,yBACA,gBAAgB,aAChB,CAAC;CAEH,MAAM,uBAAuB,4BAC3B,WAAW,WACX,SAAS,SACX;CAEA,MAAM,8BAA8B,wBAAwB;EAC1D,eAAe,WAAW;EAC1B,aAAa,SAAS;EACtB;EACA,eAAe;EACf,kBAAkB,YAAY;CAChC,CAAC;CAED,MAAM,oBAAoB,SACvB,wBACC,+BACA,YAAY,cACZ,CAAC,UAAU,aACX,CAAC,oBACL;CAEA,MAAM,kCAAkC,QACtC,yBACE,CAAC,0CACD,CAAC,uBACD,aAAa,YAAY,MAAM,WAAW,YAAY,CAC1D;CAEA,MAAM,+BAA+B,QACnC,yBACE,uBACA,CAAC,0CACD,aAAa,YAAY,MAAM,WAAW,YAAY,CAC1D;CAEA,OAAO;EACL;EACA;EACA;EACA,qBAAqB,SAAS;EAC9B;EACA;EACA;EACA;EACA;EACA,WAAW,yBAAyB;EACpC,WAAW,yBAAyB;CACtC;AACF"}
@@ -1,9 +1,8 @@
1
1
  import { TokenExtended } from "@lifi/sdk";
2
2
  //#region src/hooks/useToken.d.ts
3
- declare const useToken: (chainId?: number, tokenAddress?: string, latest?: boolean) => {
3
+ export declare const useToken: (chainId?: number, tokenAddress?: string, latest?: boolean) => {
4
4
  token: TokenExtended | undefined;
5
5
  isLoading: boolean;
6
6
  };
7
7
  //#endregion
8
- export { useToken };
9
8
  //# sourceMappingURL=useToken.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"useToken.d.ts","names":[],"sources":["../../../src/hooks/useToken.ts"],"mappings":";;cAKa,WACX,kBACA,uBACA;EAEA,OAAO;EACP"}
1
+ {"version":3,"file":"useToken.d.ts","names":[],"sources":["../../../src/hooks/useToken.ts"],"mappings":";;qBAKa,WACX,kBACA,uBACA;EAEA,OAAO;EACP"}
@@ -1,11 +1,10 @@
1
1
  import { ExtendedChain, TokenAmount } from "@lifi/sdk";
2
2
  //#region src/hooks/useTokenAddressBalance.d.ts
3
- declare const useTokenAddressBalance: (chainId?: number, tokenAddress?: string) => {
3
+ export declare const useTokenAddressBalance: (chainId?: number, tokenAddress?: string) => {
4
4
  token: TokenAmount;
5
5
  chain: ExtendedChain | undefined;
6
6
  isLoading: boolean;
7
7
  refetch: () => void;
8
8
  };
9
9
  //#endregion
10
- export { useTokenAddressBalance };
11
10
  //# sourceMappingURL=useTokenAddressBalance.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"useTokenAddressBalance.d.ts","names":[],"sources":["../../../src/hooks/useTokenAddressBalance.ts"],"mappings":";;cAMa,yBACX,kBACA;EAEA,OAAO;EACP,OAAO;EACP;EACA"}
1
+ {"version":3,"file":"useTokenAddressBalance.d.ts","names":[],"sources":["../../../src/hooks/useTokenAddressBalance.ts"],"mappings":";;qBAMa,yBACX,kBACA;EAEA,OAAO;EACP,OAAO;EACP;EACA"}
@@ -1,14 +1,15 @@
1
1
  import { FormType } from "../stores/form/types.js";
2
2
  import { TokenAmount } from "../types/token.js";
3
3
  //#region src/hooks/useTokenBalances.d.ts
4
- declare const useTokenBalances: (selectedChainId?: number, formType?: FormType, isAllNetworks?: boolean, search?: string) => {
4
+ export declare const useTokenBalances: (selectedChainId?: number, formType?: FormType, isAllNetworks?: boolean, search?: string) => {
5
5
  tokens: TokenAmount[];
6
6
  withCategories: boolean;
7
7
  withPinnedTokens: boolean;
8
8
  isTokensLoading: boolean;
9
9
  isSearchLoading: boolean;
10
10
  isBalanceLoading: boolean;
11
+ /** Always set; optional so hand-built results of this public shape stay valid. */
12
+ nativeHoisted?: boolean;
11
13
  };
12
14
  //#endregion
13
- export { useTokenBalances };
14
15
  //# sourceMappingURL=useTokenBalances.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"useTokenBalances.d.ts","names":[],"sources":["../../../src/hooks/useTokenBalances.ts"],"mappings":";;;cAea,mBACX,0BACA,WAAW,UACX,yBACA;EAEA,QAAQ;EACR;EACA;EACA;EACA;EACA"}
1
+ {"version":3,"file":"useTokenBalances.d.ts","names":[],"sources":["../../../src/hooks/useTokenBalances.ts"],"mappings":";;;qBAea,mBACX,0BACA,WAAW,UACX,yBACA;EAEA,QAAQ;EACR;EACA;EACA;EACA;EACA;;EAEA"}
@@ -1,7 +1,7 @@
1
1
  import { useWidgetConfig } from "../providers/WidgetProvider/WidgetProvider.js";
2
2
  import { formatTokenPrice } from "../utils/format.js";
3
3
  import { useSettings } from "../stores/settings/useSettings.js";
4
- import { hoistNativeToken, isSearchMatch, processTokenList } from "../utils/tokenList.js";
4
+ import { hoistNativeToken, isHoistableNative, processTokenList } from "../utils/tokenList.js";
5
5
  import { useAccountsBalancesData } from "./useAccountsBalancesData.js";
6
6
  import { useDisplayedTokens } from "./useDisplayedTokens.js";
7
7
  import { useTokenBalancesQueries } from "./useTokenBalancesQueries.js";
@@ -9,7 +9,7 @@ import { useMemo } from "react";
9
9
  //#region src/hooks/useTokenBalances.ts
10
10
  const useTokenBalances = (selectedChainId, formType, isAllNetworks, search) => {
11
11
  const { hiddenUI, tokens: configTokens } = useWidgetConfig();
12
- const { allTokens, displayedTokensList, isPinnedToken, isTokensLoading, isSearchLoading } = useDisplayedTokens(selectedChainId, formType, isAllNetworks, search);
12
+ const { allTokens, displayedTokensList, isPinnedToken, matchesSearch, isTokensLoading, isSearchLoading } = useDisplayedTokens(selectedChainId, formType, isAllNetworks, search);
13
13
  const { data: accountsWithAllTokens, isLoading: isAccountsLoading } = useAccountsBalancesData(selectedChainId, formType, isAllNetworks, allTokens);
14
14
  const { data: allTokensWithBalances, isLoading: isBalanceQueriesLoading } = useTokenBalancesQueries(accountsWithAllTokens, Boolean(accountsWithAllTokens) && !isAccountsLoading);
15
15
  const { smallBalanceThreshold } = useSettings(["smallBalanceThreshold"]);
@@ -23,8 +23,8 @@ const useTokenBalances = (selectedChainId, formType, isAllNetworks, search) => {
23
23
  return balancesByChain.reduce((acc, token) => {
24
24
  const tokenKey = `${token.chainId}-${token.address.toLowerCase()}`;
25
25
  const isInDisplayedList = displayedTokensSet.has(tokenKey) && token.amount;
26
- const matchesSearch = isSearchMatch(token, search);
27
- if (!isInDisplayedList && !matchesSearch) return acc;
26
+ const matchesTheSearch = matchesSearch(token);
27
+ if (!isInDisplayedList && !matchesTheSearch) return acc;
28
28
  let processedToken = token;
29
29
  if (hideSmallBalances && threshold !== void 0 && threshold >= 0 && token.amount) {
30
30
  if (formatTokenPrice(token.amount, token.priceUSD, token.decimals) < threshold) processedToken = {
@@ -38,18 +38,23 @@ const useTokenBalances = (selectedChainId, formType, isAllNetworks, search) => {
38
38
  }, [
39
39
  allTokensWithBalances,
40
40
  displayedTokensList,
41
- search,
41
+ matchesSearch,
42
42
  selectedChainId,
43
43
  isAllNetworks,
44
44
  smallBalanceThreshold,
45
45
  hiddenUI
46
46
  ]);
47
- const { processedTokens, withCategories, withPinnedTokens } = useMemo(() => {
47
+ const { processedTokens, withCategories, withPinnedTokens, nativeHoisted } = useMemo(() => {
48
48
  const result = processTokenList(isBalanceLoading, isAllNetworks || !!search, configTokens, selectedChainId, displayedTokensList, displayedTokensWithBalances, isPinnedToken);
49
- if (isAllNetworks || search) return result;
49
+ if (isAllNetworks || search) return {
50
+ ...result,
51
+ nativeHoisted: false
52
+ };
53
+ const hoisted = hoistNativeToken(result.processedTokens, selectedChainId);
50
54
  return {
51
55
  ...result,
52
- processedTokens: hoistNativeToken(result.processedTokens, selectedChainId)
56
+ processedTokens: hoisted,
57
+ nativeHoisted: isHoistableNative(hoisted[0], selectedChainId)
53
58
  };
54
59
  }, [
55
60
  isBalanceLoading,
@@ -67,7 +72,8 @@ const useTokenBalances = (selectedChainId, formType, isAllNetworks, search) => {
67
72
  withPinnedTokens,
68
73
  isTokensLoading,
69
74
  isSearchLoading,
70
- isBalanceLoading
75
+ isBalanceLoading,
76
+ nativeHoisted
71
77
  };
72
78
  };
73
79
  //#endregion
@@ -1 +1 @@
1
- {"version":3,"file":"useTokenBalances.js","names":[],"sources":["../../../src/hooks/useTokenBalances.ts"],"sourcesContent":["import { useMemo } from 'react'\nimport { useWidgetConfig } from '../providers/WidgetProvider/WidgetProvider.js'\nimport type { FormType } from '../stores/form/types.js'\nimport { useSettings } from '../stores/settings/useSettings.js'\nimport type { TokenAmount } from '../types/token.js'\nimport { formatTokenPrice } from '../utils/format.js'\nimport {\n hoistNativeToken,\n isSearchMatch,\n processTokenList,\n} from '../utils/tokenList.js'\nimport { useAccountsBalancesData } from './useAccountsBalancesData.js'\nimport { useDisplayedTokens } from './useDisplayedTokens.js'\nimport { useTokenBalancesQueries } from './useTokenBalancesQueries.js'\n\nexport const useTokenBalances = (\n selectedChainId?: number,\n formType?: FormType,\n isAllNetworks?: boolean,\n search?: string\n): {\n tokens: TokenAmount[]\n withCategories: boolean\n withPinnedTokens: boolean\n isTokensLoading: boolean\n isSearchLoading: boolean\n isBalanceLoading: boolean\n} => {\n const { hiddenUI, tokens: configTokens } = useWidgetConfig()\n const {\n allTokens,\n displayedTokensList,\n isPinnedToken,\n isTokensLoading,\n isSearchLoading,\n } = useDisplayedTokens(selectedChainId, formType, isAllNetworks, search)\n\n const { data: accountsWithAllTokens, isLoading: isAccountsLoading } =\n useAccountsBalancesData(selectedChainId, formType, isAllNetworks, allTokens)\n\n const isBalanceLoadingEnabled =\n Boolean(accountsWithAllTokens) && !isAccountsLoading\n\n const { data: allTokensWithBalances, isLoading: isBalanceQueriesLoading } =\n useTokenBalancesQueries(accountsWithAllTokens, isBalanceLoadingEnabled)\n\n const { smallBalanceThreshold } = useSettings(['smallBalanceThreshold'])\n\n const isBalanceLoading =\n (isBalanceQueriesLoading || isAccountsLoading) &&\n !allTokensWithBalances?.length\n\n const displayedTokensWithBalances = useMemo(() => {\n const balancesByChain = isAllNetworks\n ? allTokensWithBalances\n : selectedChainId\n ? allTokensWithBalances?.filter((t) => t.chainId === selectedChainId)\n : undefined\n const displayedTokensSet = new Set(\n displayedTokensList?.map(\n (t) => `${t.chainId}-${t.address.toLowerCase()}`\n ) || []\n )\n\n const hideSmallBalances =\n !!smallBalanceThreshold && !hiddenUI?.hideSmallBalances\n const threshold = hideSmallBalances\n ? Number.parseFloat(smallBalanceThreshold)\n : undefined\n\n if (!balancesByChain) {\n return undefined\n }\n\n return balancesByChain.reduce<typeof balancesByChain>((acc, token) => {\n const tokenKey = `${token.chainId}-${token.address.toLowerCase()}`\n // Check if token is in displayed list and has amount\n const isInDisplayedList = displayedTokensSet.has(tokenKey) && token.amount\n // Check if it matches search (for cached appended tokens)\n const matchesSearch = isSearchMatch(token, search)\n\n // Filter: only include tokens that match our criteria\n if (!isInDisplayedList && !matchesSearch) {\n return acc\n }\n\n // Apply small balance threshold transformation if enabled\n let processedToken = token\n if (\n hideSmallBalances &&\n threshold !== undefined &&\n threshold >= 0 &&\n token.amount\n ) {\n const balanceUSD = formatTokenPrice(\n token.amount,\n token.priceUSD,\n token.decimals\n )\n if (balanceUSD < threshold) {\n processedToken = {\n ...token,\n amount: 0n,\n }\n }\n }\n\n acc.push(processedToken)\n return acc\n }, [])\n }, [\n allTokensWithBalances,\n displayedTokensList,\n search,\n selectedChainId,\n isAllNetworks,\n smallBalanceThreshold,\n hiddenUI,\n ])\n\n const { processedTokens, withCategories, withPinnedTokens } = useMemo(() => {\n const result = processTokenList(\n isBalanceLoading,\n isAllNetworks || !!search,\n configTokens,\n selectedChainId,\n displayedTokensList,\n displayedTokensWithBalances,\n isPinnedToken\n )\n // A search keeps its results ranked by match, and \"All networks\" has no\n // single native token to lead with.\n if (isAllNetworks || search) {\n return result\n }\n return {\n ...result,\n processedTokens: hoistNativeToken(\n result.processedTokens,\n selectedChainId\n ),\n }\n }, [\n isBalanceLoading,\n isAllNetworks,\n configTokens,\n selectedChainId,\n displayedTokensList,\n displayedTokensWithBalances,\n search,\n isPinnedToken,\n ])\n\n return {\n tokens: processedTokens ?? [],\n withCategories,\n withPinnedTokens,\n isTokensLoading,\n isSearchLoading,\n isBalanceLoading,\n }\n}\n"],"mappings":";;;;;;;;;AAeA,MAAa,oBACX,iBACA,UACA,eACA,WAQG;CACH,MAAM,EAAE,UAAU,QAAQ,iBAAiB,gBAAgB;CAC3D,MAAM,EACJ,WACA,qBACA,eACA,iBACA,oBACE,mBAAmB,iBAAiB,UAAU,eAAe,MAAM;CAEvE,MAAM,EAAE,MAAM,uBAAuB,WAAW,sBAC9C,wBAAwB,iBAAiB,UAAU,eAAe,SAAS;CAK7E,MAAM,EAAE,MAAM,uBAAuB,WAAW,4BAC9C,wBAAwB,uBAHxB,QAAQ,qBAAqB,KAAK,CAAC,iBAGmC;CAExE,MAAM,EAAE,0BAA0B,YAAY,CAAC,uBAAuB,CAAC;CAEvE,MAAM,oBACH,2BAA2B,sBAC5B,CAAC,uBAAuB;CAE1B,MAAM,8BAA8B,cAAc;EAChD,MAAM,kBAAkB,gBACpB,wBACA,kBACE,uBAAuB,QAAQ,MAAM,EAAE,YAAY,eAAe,IAClE,KAAA;EACN,MAAM,qBAAqB,IAAI,IAC7B,qBAAqB,KAClB,MAAM,GAAG,EAAE,QAAQ,GAAG,EAAE,QAAQ,YAAY,GAC/C,KAAK,CAAC,CACR;EAEA,MAAM,oBACJ,CAAC,CAAC,yBAAyB,CAAC,UAAU;EACxC,MAAM,YAAY,oBACd,OAAO,WAAW,qBAAqB,IACvC,KAAA;EAEJ,IAAI,CAAC,iBACH;EAGF,OAAO,gBAAgB,QAAgC,KAAK,UAAU;GACpE,MAAM,WAAW,GAAG,MAAM,QAAQ,GAAG,MAAM,QAAQ,YAAY;GAE/D,MAAM,oBAAoB,mBAAmB,IAAI,QAAQ,KAAK,MAAM;GAEpE,MAAM,gBAAgB,cAAc,OAAO,MAAM;GAGjD,IAAI,CAAC,qBAAqB,CAAC,eACzB,OAAO;GAIT,IAAI,iBAAiB;GACrB,IACE,qBACA,cAAc,KAAA,KACd,aAAa,KACb,MAAM,QAEa;QAAA,iBACjB,MAAM,QACN,MAAM,UACN,MAAM,QAEK,IAAI,WACf,iBAAiB;KACf,GAAG;KACH,QAAQ;IACV;GAAA;GAIJ,IAAI,KAAK,cAAc;GACvB,OAAO;EACT,GAAG,CAAC,CAAC;CACP,GAAG;EACD;EACA;EACA;EACA;EACA;EACA;EACA;CACF,CAAC;CAED,MAAM,EAAE,iBAAiB,gBAAgB,qBAAqB,cAAc;EAC1E,MAAM,SAAS,iBACb,kBACA,iBAAiB,CAAC,CAAC,QACnB,cACA,iBACA,qBACA,6BACA,aACF;EAGA,IAAI,iBAAiB,QACnB,OAAO;EAET,OAAO;GACL,GAAG;GACH,iBAAiB,iBACf,OAAO,iBACP,eACF;EACF;CACF,GAAG;EACD;EACA;EACA;EACA;EACA;EACA;EACA;EACA;CACF,CAAC;CAED,OAAO;EACL,QAAQ,mBAAmB,CAAC;EAC5B;EACA;EACA;EACA;EACA;CACF;AACF"}
1
+ {"version":3,"file":"useTokenBalances.js","names":[],"sources":["../../../src/hooks/useTokenBalances.ts"],"sourcesContent":["import { useMemo } from 'react'\nimport { useWidgetConfig } from '../providers/WidgetProvider/WidgetProvider.js'\nimport type { FormType } from '../stores/form/types.js'\nimport { useSettings } from '../stores/settings/useSettings.js'\nimport type { TokenAmount } from '../types/token.js'\nimport { formatTokenPrice } from '../utils/format.js'\nimport {\n hoistNativeToken,\n isHoistableNative,\n processTokenList,\n} from '../utils/tokenList.js'\nimport { useAccountsBalancesData } from './useAccountsBalancesData.js'\nimport { useDisplayedTokens } from './useDisplayedTokens.js'\nimport { useTokenBalancesQueries } from './useTokenBalancesQueries.js'\n\nexport const useTokenBalances = (\n selectedChainId?: number,\n formType?: FormType,\n isAllNetworks?: boolean,\n search?: string\n): {\n tokens: TokenAmount[]\n withCategories: boolean\n withPinnedTokens: boolean\n isTokensLoading: boolean\n isSearchLoading: boolean\n isBalanceLoading: boolean\n /** Always set; optional so hand-built results of this public shape stay valid. */\n nativeHoisted?: boolean\n} => {\n const { hiddenUI, tokens: configTokens } = useWidgetConfig()\n const {\n allTokens,\n displayedTokensList,\n isPinnedToken,\n matchesSearch,\n isTokensLoading,\n isSearchLoading,\n } = useDisplayedTokens(selectedChainId, formType, isAllNetworks, search)\n\n const { data: accountsWithAllTokens, isLoading: isAccountsLoading } =\n useAccountsBalancesData(selectedChainId, formType, isAllNetworks, allTokens)\n\n const isBalanceLoadingEnabled =\n Boolean(accountsWithAllTokens) && !isAccountsLoading\n\n const { data: allTokensWithBalances, isLoading: isBalanceQueriesLoading } =\n useTokenBalancesQueries(accountsWithAllTokens, isBalanceLoadingEnabled)\n\n const { smallBalanceThreshold } = useSettings(['smallBalanceThreshold'])\n\n const isBalanceLoading =\n (isBalanceQueriesLoading || isAccountsLoading) &&\n !allTokensWithBalances?.length\n\n const displayedTokensWithBalances = useMemo(() => {\n const balancesByChain = isAllNetworks\n ? allTokensWithBalances\n : selectedChainId\n ? allTokensWithBalances?.filter((t) => t.chainId === selectedChainId)\n : undefined\n const displayedTokensSet = new Set(\n displayedTokensList?.map(\n (t) => `${t.chainId}-${t.address.toLowerCase()}`\n ) || []\n )\n\n const hideSmallBalances =\n !!smallBalanceThreshold && !hiddenUI?.hideSmallBalances\n const threshold = hideSmallBalances\n ? Number.parseFloat(smallBalanceThreshold)\n : undefined\n\n if (!balancesByChain) {\n return undefined\n }\n\n return balancesByChain.reduce<typeof balancesByChain>((acc, token) => {\n const tokenKey = `${token.chainId}-${token.address.toLowerCase()}`\n // Check if token is in displayed list and has amount\n const isInDisplayedList = displayedTokensSet.has(tokenKey) && token.amount\n // Check if it matches search (for cached appended tokens)\n const matchesTheSearch = matchesSearch(token)\n\n // Filter: only include tokens that match our criteria\n if (!isInDisplayedList && !matchesTheSearch) {\n return acc\n }\n\n // Apply small balance threshold transformation if enabled\n let processedToken = token\n if (\n hideSmallBalances &&\n threshold !== undefined &&\n threshold >= 0 &&\n token.amount\n ) {\n const balanceUSD = formatTokenPrice(\n token.amount,\n token.priceUSD,\n token.decimals\n )\n if (balanceUSD < threshold) {\n processedToken = {\n ...token,\n amount: 0n,\n }\n }\n }\n\n acc.push(processedToken)\n return acc\n }, [])\n }, [\n allTokensWithBalances,\n displayedTokensList,\n matchesSearch,\n selectedChainId,\n isAllNetworks,\n smallBalanceThreshold,\n hiddenUI,\n ])\n\n const { processedTokens, withCategories, withPinnedTokens, nativeHoisted } =\n useMemo(() => {\n const result = processTokenList(\n isBalanceLoading,\n isAllNetworks || !!search,\n configTokens,\n selectedChainId,\n displayedTokensList,\n displayedTokensWithBalances,\n isPinnedToken\n )\n // Search results stay ranked, and All networks has no single native.\n if (isAllNetworks || search) {\n return { ...result, nativeHoisted: false }\n }\n const hoisted = hoistNativeToken(result.processedTokens, selectedChainId)\n return {\n ...result,\n processedTokens: hoisted,\n nativeHoisted: isHoistableNative(hoisted[0], selectedChainId),\n }\n }, [\n isBalanceLoading,\n isAllNetworks,\n configTokens,\n selectedChainId,\n displayedTokensList,\n displayedTokensWithBalances,\n search,\n isPinnedToken,\n ])\n\n return {\n tokens: processedTokens ?? [],\n withCategories,\n withPinnedTokens,\n isTokensLoading,\n isSearchLoading,\n isBalanceLoading,\n nativeHoisted,\n }\n}\n"],"mappings":";;;;;;;;;AAeA,MAAa,oBACX,iBACA,UACA,eACA,WAUG;CACH,MAAM,EAAE,UAAU,QAAQ,iBAAiB,gBAAgB;CAC3D,MAAM,EACJ,WACA,qBACA,eACA,eACA,iBACA,oBACE,mBAAmB,iBAAiB,UAAU,eAAe,MAAM;CAEvE,MAAM,EAAE,MAAM,uBAAuB,WAAW,sBAC9C,wBAAwB,iBAAiB,UAAU,eAAe,SAAS;CAK7E,MAAM,EAAE,MAAM,uBAAuB,WAAW,4BAC9C,wBAAwB,uBAHxB,QAAQ,qBAAqB,KAAK,CAAC,iBAGmC;CAExE,MAAM,EAAE,0BAA0B,YAAY,CAAC,uBAAuB,CAAC;CAEvE,MAAM,oBACH,2BAA2B,sBAC5B,CAAC,uBAAuB;CAE1B,MAAM,8BAA8B,cAAc;EAChD,MAAM,kBAAkB,gBACpB,wBACA,kBACE,uBAAuB,QAAQ,MAAM,EAAE,YAAY,eAAe,IAClE,KAAA;EACN,MAAM,qBAAqB,IAAI,IAC7B,qBAAqB,KAClB,MAAM,GAAG,EAAE,QAAQ,GAAG,EAAE,QAAQ,YAAY,GAC/C,KAAK,CAAC,CACR;EAEA,MAAM,oBACJ,CAAC,CAAC,yBAAyB,CAAC,UAAU;EACxC,MAAM,YAAY,oBACd,OAAO,WAAW,qBAAqB,IACvC,KAAA;EAEJ,IAAI,CAAC,iBACH;EAGF,OAAO,gBAAgB,QAAgC,KAAK,UAAU;GACpE,MAAM,WAAW,GAAG,MAAM,QAAQ,GAAG,MAAM,QAAQ,YAAY;GAE/D,MAAM,oBAAoB,mBAAmB,IAAI,QAAQ,KAAK,MAAM;GAEpE,MAAM,mBAAmB,cAAc,KAAK;GAG5C,IAAI,CAAC,qBAAqB,CAAC,kBACzB,OAAO;GAIT,IAAI,iBAAiB;GACrB,IACE,qBACA,cAAc,KAAA,KACd,aAAa,KACb,MAAM,QAEa;QAAA,iBACjB,MAAM,QACN,MAAM,UACN,MAAM,QAEK,IAAI,WACf,iBAAiB;KACf,GAAG;KACH,QAAQ;IACV;GAAA;GAIJ,IAAI,KAAK,cAAc;GACvB,OAAO;EACT,GAAG,CAAC,CAAC;CACP,GAAG;EACD;EACA;EACA;EACA;EACA;EACA;EACA;CACF,CAAC;CAED,MAAM,EAAE,iBAAiB,gBAAgB,kBAAkB,kBACzD,cAAc;EACZ,MAAM,SAAS,iBACb,kBACA,iBAAiB,CAAC,CAAC,QACnB,cACA,iBACA,qBACA,6BACA,aACF;EAEA,IAAI,iBAAiB,QACnB,OAAO;GAAE,GAAG;GAAQ,eAAe;EAAM;EAE3C,MAAM,UAAU,iBAAiB,OAAO,iBAAiB,eAAe;EACxE,OAAO;GACL,GAAG;GACH,iBAAiB;GACjB,eAAe,kBAAkB,QAAQ,IAAI,eAAe;EAC9D;CACF,GAAG;EACD;EACA;EACA;EACA;EACA;EACA;EACA;EACA;CACF,CAAC;CAEH,OAAO;EACL,QAAQ,mBAAmB,CAAC;EAC5B;EACA;EACA;EACA;EACA;EACA;CACF;AACF"}
@@ -4,7 +4,7 @@ import { TokenAmount } from "../types/token.js";
4
4
  /**
5
5
  * Token-selection list without wallet balances - No accounts are resolved and no balance queries are fired.
6
6
  */
7
- declare const useTokenList: (selectedChainId?: number, formType?: FormType, isAllNetworks?: boolean, search?: string) => {
7
+ export declare const useTokenList: (selectedChainId?: number, formType?: FormType, isAllNetworks?: boolean, search?: string) => {
8
8
  tokens: TokenAmount[];
9
9
  withCategories: boolean;
10
10
  withPinnedTokens: boolean;
@@ -12,5 +12,4 @@ declare const useTokenList: (selectedChainId?: number, formType?: FormType, isAl
12
12
  isSearchLoading: boolean;
13
13
  };
14
14
  //#endregion
15
- export { useTokenList };
16
15
  //# sourceMappingURL=useTokenList.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"useTokenList.d.ts","names":[],"sources":["../../../src/hooks/useTokenList.ts"],"mappings":";;;;;;cAUa,eACX,0BACA,WAAW,UACX,yBACA;EAEA,QAAQ;EACR;EACA;EACA;EACA"}
1
+ {"version":3,"file":"useTokenList.d.ts","names":[],"sources":["../../../src/hooks/useTokenList.ts"],"mappings":";;;;;;qBAUa,eACX,0BACA,WAAW,UACX,yBACA;EAEA,QAAQ;EACR;EACA;EACA;EACA"}
@@ -1,7 +1,8 @@
1
- import { getConfigItemSets, isFormItemAllowed } from "../utils/item.js";
1
+ import { isFormItemAllowed } from "../utils/item.js";
2
2
  import { useWidgetConfig } from "../providers/WidgetProvider/WidgetProvider.js";
3
3
  import { useSDKClient } from "../providers/SDKClientProvider.js";
4
4
  import { getQueryKey } from "../utils/queries.js";
5
+ import { getChainTokenAllowSets } from "../utils/token.js";
5
6
  import { getToken } from "@lifi/sdk";
6
7
  import { useQuery, useQueryClient } from "@tanstack/react-query";
7
8
  //#region src/hooks/useTokenSearch.ts
@@ -18,7 +19,7 @@ const useTokenSearch = (chainId, tokenQuery, enabled, formType) => {
18
19
  queryFn: async ({ queryKey: [, chainId, tokenQuery], signal }) => {
19
20
  const token = await getToken(sdkClient, chainId, tokenQuery, { signal });
20
21
  if (token) {
21
- const filteredConfigTokens = getConfigItemSets(configTokens, (tokens) => new Set(tokens.filter((t) => t.chainId === token.chainId).map((t) => t.address.toLowerCase())), formType);
22
+ const filteredConfigTokens = getChainTokenAllowSets(configTokens, token.chainId, formType);
22
23
  if (!isFormItemAllowed(token, filteredConfigTokens, formType, (t) => t.address.toLowerCase())) return null;
23
24
  queryClient.setQueriesData({ queryKey: [getQueryKey("tokens", keyPrefix)] }, (data) => {
24
25
  if (!data) return data;
@@ -1 +1 @@
1
- {"version":3,"file":"useTokenSearch.js","names":[],"sources":["../../../src/hooks/useTokenSearch.ts"],"sourcesContent":["import {\n type BaseToken,\n type ChainId,\n getToken,\n type TokenExtended,\n} from '@lifi/sdk'\nimport { useQuery, useQueryClient } from '@tanstack/react-query'\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 { getConfigItemSets, isFormItemAllowed } from '../utils/item.js'\nimport { getQueryKey } from '../utils/queries.js'\n\nexport const useTokenSearch = (\n chainId?: number,\n tokenQuery?: string,\n enabled?: boolean,\n formType?: FormType\n): {\n token: TokenExtended | undefined\n isLoading: boolean\n} => {\n const queryClient = useQueryClient()\n const { tokens: configTokens, keyPrefix } = useWidgetConfig()\n const sdkClient = useSDKClient()\n\n const { data, isLoading } = useQuery({\n queryKey: [getQueryKey('token-search', keyPrefix), chainId, tokenQuery],\n queryFn: async ({ queryKey: [, chainId, tokenQuery], signal }) => {\n const token = await getToken(\n sdkClient,\n chainId as ChainId,\n tokenQuery as string,\n {\n signal,\n }\n )\n\n if (token) {\n // Filter config tokens by chain before checking if token is allowed\n const filteredConfigTokens = getConfigItemSets(\n configTokens,\n (tokens: BaseToken[]) =>\n new Set(\n tokens\n .filter((t) => t.chainId === token.chainId)\n .map((t) => t.address.toLowerCase())\n ),\n formType\n )\n\n // Return undefined if the token is denied\n if (\n !isFormItemAllowed(token, filteredConfigTokens, formType, (t) =>\n t.address.toLowerCase()\n )\n ) {\n return null\n }\n\n // Add token to main tokens cache\n queryClient.setQueriesData<TokensByChain>(\n { queryKey: [getQueryKey('tokens', keyPrefix)] },\n (data) => {\n if (!data) {\n return data\n }\n const chainTokens = data[chainId as number]\n if (\n chainTokens?.some(\n (t) => t.address.toLowerCase() === token.address.toLowerCase()\n )\n ) {\n return data\n }\n return {\n ...data,\n [chainId as number]: [...(chainTokens ?? []), token],\n }\n }\n )\n }\n return token as TokenExtended\n },\n\n enabled: Boolean(chainId && tokenQuery && enabled),\n retry: false,\n })\n return {\n token: data || undefined,\n isLoading,\n }\n}\n"],"mappings":";;;;;;;AAcA,MAAa,kBACX,SACA,YACA,SACA,aAIG;CACH,MAAM,cAAc,eAAe;CACnC,MAAM,EAAE,QAAQ,cAAc,cAAc,gBAAgB;CAC5D,MAAM,YAAY,aAAa;CAE/B,MAAM,EAAE,MAAM,cAAc,SAAS;EACnC,UAAU;GAAC,YAAY,gBAAgB,SAAS;GAAG;GAAS;EAAU;EACtE,SAAS,OAAO,EAAE,UAAU,GAAG,SAAS,aAAa,aAAa;GAChE,MAAM,QAAQ,MAAM,SAClB,WACA,SACA,YACA,EACE,OACF,CACF;GAEA,IAAI,OAAO;IAET,MAAM,uBAAuB,kBAC3B,eACC,WACC,IAAI,IACF,OACG,QAAQ,MAAM,EAAE,YAAY,MAAM,OAAO,CAAC,CAC1C,KAAK,MAAM,EAAE,QAAQ,YAAY,CAAC,CACvC,GACF,QACF;IAGA,IACE,CAAC,kBAAkB,OAAO,sBAAsB,WAAW,MACzD,EAAE,QAAQ,YAAY,CACxB,GAEA,OAAO;IAIT,YAAY,eACV,EAAE,UAAU,CAAC,YAAY,UAAU,SAAS,CAAC,EAAE,IAC9C,SAAS;KACR,IAAI,CAAC,MACH,OAAO;KAET,MAAM,cAAc,KAAK;KACzB,IACE,aAAa,MACV,MAAM,EAAE,QAAQ,YAAY,MAAM,MAAM,QAAQ,YAAY,CAC/D,GAEA,OAAO;KAET,OAAO;MACL,GAAG;OACF,UAAoB,CAAC,GAAI,eAAe,CAAC,GAAI,KAAK;KACrD;IACF,CACF;GACF;GACA,OAAO;EACT;EAEA,SAAS,QAAQ,WAAW,cAAc,OAAO;EACjD,OAAO;CACT,CAAC;CACD,OAAO;EACL,OAAO,QAAQ,KAAA;EACf;CACF;AACF"}
1
+ {"version":3,"file":"useTokenSearch.js","names":[],"sources":["../../../src/hooks/useTokenSearch.ts"],"sourcesContent":["import { type ChainId, getToken, type TokenExtended } from '@lifi/sdk'\nimport { useQuery, useQueryClient } from '@tanstack/react-query'\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 { isFormItemAllowed } from '../utils/item.js'\nimport { getQueryKey } from '../utils/queries.js'\nimport { getChainTokenAllowSets } from '../utils/token.js'\n\nexport const useTokenSearch = (\n chainId?: number,\n tokenQuery?: string,\n enabled?: boolean,\n formType?: FormType\n): {\n token: TokenExtended | undefined\n isLoading: boolean\n} => {\n const queryClient = useQueryClient()\n const { tokens: configTokens, keyPrefix } = useWidgetConfig()\n const sdkClient = useSDKClient()\n\n const { data, isLoading } = useQuery({\n queryKey: [getQueryKey('token-search', keyPrefix), chainId, tokenQuery],\n queryFn: async ({ queryKey: [, chainId, tokenQuery], signal }) => {\n const token = await getToken(\n sdkClient,\n chainId as ChainId,\n tokenQuery as string,\n {\n signal,\n }\n )\n\n if (token) {\n // Filter config tokens by chain before checking if token is allowed\n const filteredConfigTokens = getChainTokenAllowSets(\n configTokens,\n token.chainId,\n formType\n )\n\n // Return undefined if the token is denied\n if (\n !isFormItemAllowed(token, filteredConfigTokens, formType, (t) =>\n t.address.toLowerCase()\n )\n ) {\n return null\n }\n\n // Add token to main tokens cache\n queryClient.setQueriesData<TokensByChain>(\n { queryKey: [getQueryKey('tokens', keyPrefix)] },\n (data) => {\n if (!data) {\n return data\n }\n const chainTokens = data[chainId as number]\n if (\n chainTokens?.some(\n (t) => t.address.toLowerCase() === token.address.toLowerCase()\n )\n ) {\n return data\n }\n return {\n ...data,\n [chainId as number]: [...(chainTokens ?? []), token],\n }\n }\n )\n }\n return token as TokenExtended\n },\n\n enabled: Boolean(chainId && tokenQuery && enabled),\n retry: false,\n })\n return {\n token: data || undefined,\n isLoading,\n }\n}\n"],"mappings":";;;;;;;;AAUA,MAAa,kBACX,SACA,YACA,SACA,aAIG;CACH,MAAM,cAAc,eAAe;CACnC,MAAM,EAAE,QAAQ,cAAc,cAAc,gBAAgB;CAC5D,MAAM,YAAY,aAAa;CAE/B,MAAM,EAAE,MAAM,cAAc,SAAS;EACnC,UAAU;GAAC,YAAY,gBAAgB,SAAS;GAAG;GAAS;EAAU;EACtE,SAAS,OAAO,EAAE,UAAU,GAAG,SAAS,aAAa,aAAa;GAChE,MAAM,QAAQ,MAAM,SAClB,WACA,SACA,YACA,EACE,OACF,CACF;GAEA,IAAI,OAAO;IAET,MAAM,uBAAuB,uBAC3B,cACA,MAAM,SACN,QACF;IAGA,IACE,CAAC,kBAAkB,OAAO,sBAAsB,WAAW,MACzD,EAAE,QAAQ,YAAY,CACxB,GAEA,OAAO;IAIT,YAAY,eACV,EAAE,UAAU,CAAC,YAAY,UAAU,SAAS,CAAC,EAAE,IAC9C,SAAS;KACR,IAAI,CAAC,MACH,OAAO;KAET,MAAM,cAAc,KAAK;KACzB,IACE,aAAa,MACV,MAAM,EAAE,QAAQ,YAAY,MAAM,MAAM,QAAQ,YAAY,CAC/D,GAEA,OAAO;KAET,OAAO;MACL,GAAG;OACF,UAAoB,CAAC,GAAI,eAAe,CAAC,GAAI,KAAK;KACrD;IACF,CACF;GACF;GACA,OAAO;EACT;EAEA,SAAS,QAAQ,WAAW,cAAc,OAAO;EACjD,OAAO;CACT,CAAC;CACD,OAAO;EACL,OAAO,QAAQ,KAAA;EACf;CACF;AACF"}
@@ -4,6 +4,7 @@ import { useSDKClient } from "../providers/SDKClientProvider.js";
4
4
  import { getQueryKey } from "../utils/queries.js";
5
5
  import { useAvailableChains } from "./useAvailableChains.js";
6
6
  import { filterAllowedTokens, getNativeTokenAddresses, mergeVerifiedWithSearchTokens } from "../utils/token.js";
7
+ import { isAddressQuery } from "../utils/address.js";
7
8
  import { defaultChainIdsByType } from "../utils/chainType.js";
8
9
  import { ChainType, getToken, getTokens } from "@lifi/sdk";
9
10
  import { useMemo } from "react";
@@ -14,7 +15,9 @@ const refetchInterval = 3e5;
14
15
  const useTokens = (formType, search, chainId) => {
15
16
  const { tokens: configTokens, chains: chainsConfig, keyPrefix } = useWidgetConfig();
16
17
  const sdkClient = useSDKClient();
17
- const { getChainTypeFromAddress } = useChainTypeFromAddress();
18
+ const { getChainTypeFromTokenAddress } = useChainTypeFromAddress();
19
+ const trimmedSearch = search?.trim();
20
+ const isAddressSearch = useMemo(() => isAddressQuery(trimmedSearch, getChainTypeFromTokenAddress), [trimmedSearch, getChainTypeFromTokenAddress]);
18
21
  const { data: verifiedTokens, isLoading } = useQuery({
19
22
  queryKey: [getQueryKey("tokens", keyPrefix)],
20
23
  queryFn: async ({ signal }) => {
@@ -44,11 +47,12 @@ const useTokens = (formType, search, chainId) => {
44
47
  const { data: searchTokens, isLoading: isSearchLoading } = useQuery({
45
48
  queryKey: [
46
49
  getQueryKey("tokens-search", keyPrefix),
47
- search,
48
- chainId
50
+ trimmedSearch,
51
+ chainId,
52
+ isAddressSearch
49
53
  ],
50
54
  queryFn: async ({ queryKey, signal }) => {
51
- const [, searchQuery, searchChainId] = queryKey;
55
+ const [, searchQuery, searchChainId, addressSearch] = queryKey;
52
56
  const chainTypes = [
53
57
  ChainType.EVM,
54
58
  ChainType.SVM,
@@ -65,20 +69,26 @@ const useTokens = (formType, search, chainId) => {
65
69
  limit: 1e3,
66
70
  minPriceUSD: 1e-6
67
71
  }, { signal });
68
- let _chainId = searchChainId;
69
- if (!_chainId) {
70
- const chainType = getChainTypeFromAddress(searchQuery);
71
- if (chainType && chainType in defaultChainIdsByType) _chainId = defaultChainIdsByType[chainType];
72
- }
73
- if (_chainId && searchQuery) {
74
- if (!(tokensResponse.tokens[_chainId] || []).length) {
75
- const token = await getToken(sdkClient, _chainId, searchQuery, { signal });
76
- if (token) tokensResponse.tokens[_chainId] = [token];
72
+ if (searchQuery) {
73
+ const chainType = getChainTypeFromTokenAddress(searchQuery);
74
+ const lookupChainId = searchChainId ?? (chainType ? defaultChainIdsByType[chainType] : void 0);
75
+ if (lookupChainId) {
76
+ const existingTokens = tokensResponse.tokens[lookupChainId] ?? [];
77
+ const hasTokenAtAddress = () => {
78
+ const address = searchQuery.toLowerCase();
79
+ return (searchChainId ? [existingTokens] : Object.values(tokensResponse.tokens)).some((tokens) => tokens.some((token) => token.address?.toLowerCase() === address));
80
+ };
81
+ if (addressSearch ? !hasTokenAtAddress() : !existingTokens.length) try {
82
+ const token = await getToken(sdkClient, lookupChainId, searchQuery, { signal });
83
+ if (token) tokensResponse.tokens[lookupChainId] = [...existingTokens, token];
84
+ } catch (error) {
85
+ if (signal.aborted) throw error;
86
+ }
77
87
  }
78
88
  }
79
89
  return tokensResponse.tokens;
80
90
  },
81
- enabled: !!search,
91
+ enabled: !!trimmedSearch,
82
92
  refetchInterval,
83
93
  staleTime: refetchInterval
84
94
  });
@@ -97,7 +107,8 @@ const useTokens = (formType, search, chainId) => {
97
107
  nativeTokenAddresses
98
108
  ]),
99
109
  isLoading,
100
- isSearchLoading
110
+ isSearchLoading,
111
+ isAddressSearch
101
112
  };
102
113
  };
103
114
  //#endregion
@@ -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 { 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} => {\n const {\n tokens: configTokens,\n chains: chainsConfig,\n keyPrefix,\n } = useWidgetConfig()\n const sdkClient = useSDKClient()\n const { getChainTypeFromAddress } = useChainTypeFromAddress()\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: [getQueryKey('tokens-search', keyPrefix), search, chainId],\n queryFn: async ({ queryKey, signal }) => {\n const [, searchQuery, searchChainId] = queryKey as [\n string,\n string,\n number,\n ]\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 // If the chainId is not provided, try to get it from the search query\n let _chainId = searchChainId\n if (!_chainId) {\n const chainType = getChainTypeFromAddress(searchQuery)\n if (chainType && chainType in defaultChainIdsByType) {\n _chainId = defaultChainIdsByType[chainType]\n }\n }\n\n // Fallback: If the main search returned no tokens for the specific chainId,\n // fetch a single token using the /token endpoint\n if (_chainId && searchQuery) {\n const existingTokens = tokensResponse.tokens[_chainId] || []\n if (!existingTokens.length) {\n const token = await getToken(sdkClient, _chainId, searchQuery, {\n signal,\n })\n if (token) {\n tokensResponse.tokens[_chainId] = [token]\n }\n }\n }\n\n return tokensResponse.tokens as TokensByChain\n },\n enabled: !!search,\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 }\n}\n"],"mappings":";;;;;;;;;;;;AAwBA,MAAM,kBAAkB;AAExB,MAAa,aACX,UACA,QACA,YAKG;CACH,MAAM,EACJ,QAAQ,cACR,QAAQ,cACR,cACE,gBAAgB;CACpB,MAAM,YAAY,aAAa;CAC/B,MAAM,EAAE,4BAA4B,wBAAwB;CAG5D,MAAM,EAAE,MAAM,gBAAgB,cAAc,SAAS;EACnD,UAAU,CAAC,YAAY,UAAU,SAAS,CAAC;EAC3C,SAAS,OAAO,EAAE,aAAa;GAC7B,MAAM,aAAa;IACjB,UAAU;IACV,UAAU;IACV,UAAU;IACV,UAAU;IACV,UAAU;IACV,UAAU;GACZ,CAAC,CAAC,QAAQ,cAAc,cAAc,WAAW,cAAc,KAAK,CAAC;GAErE,MAAM,iBAAyC,MAAM,UACnD,WACA;IACE;IACA,SAAS;IACT,UAAU;IACV,OAAO;IACP,aAAa;GACf,GACA,EAAE,OAAO,CACX;GAUA,OAP8B,OAAO,YACnC,OAAO,QAAQ,eAAe,MAAM,CAAC,CAAC,KAAK,CAAC,SAAS,YAAY,CAC/D,SACA,OAAO,KAAK,WAAW;IAAE,GAAG;IAAO,QAAQ;GAAK,EAAE,CACpD,CAAC,CAGS;EACd;EACA;EACA,WAAW;CACb,CAAC;CAGD,MAAM,EAAE,MAAM,cAAc,WAAW,oBAAoB,SAAS;EAClE,UAAU;GAAC,YAAY,iBAAiB,SAAS;GAAG;GAAQ;EAAO;EACnE,SAAS,OAAO,EAAE,UAAU,aAAa;GACvC,MAAM,GAAG,aAAa,iBAAiB;GAKvC,MAAM,aAAa;IACjB,UAAU;IACV,UAAU;IACV,UAAU;IACV,UAAU;IACV,UAAU;IACV,UAAU;GACZ,CAAC,CAAC,QAAQ,cAAc,cAAc,WAAW,cAAc,KAAK,CAAC;GAErE,MAAM,iBAAyC,MAAM,UACnD,WACA;IACE;IACA,SAAS;IACT,UAAU;IACV,QAAQ;IACR,OAAO;IACP,aAAa;GACf,GACA,EAAE,OAAO,CACX;GAGA,IAAI,WAAW;GACf,IAAI,CAAC,UAAU;IACb,MAAM,YAAY,wBAAwB,WAAW;IACrD,IAAI,aAAa,aAAa,uBAC5B,WAAW,sBAAsB;GAErC;GAIA,IAAI,YAAY,aAEV;QAAA,EADmB,eAAe,OAAO,aAAa,CAAC,EAAA,CACvC,QAAQ;KAC1B,MAAM,QAAQ,MAAM,SAAS,WAAW,UAAU,aAAa,EAC7D,OACF,CAAC;KACD,IAAI,OACF,eAAe,OAAO,YAAY,CAAC,KAAK;IAE5C;;GAGF,OAAO,eAAe;EACxB;EACA,SAAS,CAAC,CAAC;EACX;EACA,WAAW;CACb,CAAC;CAED,MAAM,EAAE,WAAW,mBAAmB;CACtC,MAAM,uBAAuB,cACrB,wBAAwB,MAAM,GACpC,CAAC,MAAM,CACT;CAqBA,OAAO;EACL,WAnBgB,cAAc;GAC9B,MAAM,SAAS,8BAA8B,gBAAgB,YAAY;GACzE,OAAO,oBACL,QACA,cACA,cACA,UACA,oBACF;EACF,GAAG;GACD;GACA;GACA;GACA;GACA;GACA;EACF,CAGU;EACR;EACA;CACF;AACF"}
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":";;;;;;;;;;;;;AAyBA,MAAM,kBAAkB;AAExB,MAAa,aACX,UACA,QACA,YAOG;CACH,MAAM,EACJ,QAAQ,cACR,QAAQ,cACR,cACE,gBAAgB;CACpB,MAAM,YAAY,aAAa;CAC/B,MAAM,EAAE,iCAAiC,wBAAwB;CAGjE,MAAM,gBAAgB,QAAQ,KAAK;CAGnC,MAAM,kBAAkB,cAChB,eAAe,eAAe,4BAA4B,GAChE,CAAC,eAAe,4BAA4B,CAC9C;CAGA,MAAM,EAAE,MAAM,gBAAgB,cAAc,SAAS;EACnD,UAAU,CAAC,YAAY,UAAU,SAAS,CAAC;EAC3C,SAAS,OAAO,EAAE,aAAa;GAC7B,MAAM,aAAa;IACjB,UAAU;IACV,UAAU;IACV,UAAU;IACV,UAAU;IACV,UAAU;IACV,UAAU;GACZ,CAAC,CAAC,QAAQ,cAAc,cAAc,WAAW,cAAc,KAAK,CAAC;GAErE,MAAM,iBAAyC,MAAM,UACnD,WACA;IACE;IACA,SAAS;IACT,UAAU;IACV,OAAO;IACP,aAAa;GACf,GACA,EAAE,OAAO,CACX;GAUA,OAP8B,OAAO,YACnC,OAAO,QAAQ,eAAe,MAAM,CAAC,CAAC,KAAK,CAAC,SAAS,YAAY,CAC/D,SACA,OAAO,KAAK,WAAW;IAAE,GAAG;IAAO,QAAQ;GAAK,EAAE,CACpD,CAAC,CAGS;EACd;EACA;EACA,WAAW;CACb,CAAC;CAGD,MAAM,EAAE,MAAM,cAAc,WAAW,oBAAoB,SAAS;EAClE,UAAU;GACR,YAAY,iBAAiB,SAAS;GACtC;GACA;GACA;EACF;EACA,SAAS,OAAO,EAAE,UAAU,aAAa;GACvC,MAAM,GAAG,aAAa,eAAe,iBAAiB;GACtD,MAAM,aAAa;IACjB,UAAU;IACV,UAAU;IACV,UAAU;IACV,UAAU;IACV,UAAU;IACV,UAAU;GACZ,CAAC,CAAC,QAAQ,cAAc,cAAc,WAAW,cAAc,KAAK,CAAC;GAErE,MAAM,iBAAyC,MAAM,UACnD,WACA;IACE;IACA,SAAS;IACT,UAAU;IACV,QAAQ;IACR,OAAO;IACP,aAAa;GACf,GACA,EAAE,OAAO,CACX;GAKA,IAAI,aAAa;IACf,MAAM,YAAY,6BAA6B,WAAW;IAC1D,MAAM,gBACJ,kBACC,YAAY,sBAAsB,aAAa,KAAA;IAClD,IAAI,eAAe;KACjB,MAAM,iBAAiB,eAAe,OAAO,kBAAkB,CAAC;KAKhE,MAAM,0BAA0B;MAC9B,MAAM,UAAU,YAAY,YAAY;MAIxC,QAHmB,gBACf,CAAC,cAAc,IACf,OAAO,OAAO,eAAe,MAAM,EAAA,CACrB,MAAM,WACtB,OAAO,MAAM,UAAU,MAAM,SAAS,YAAY,MAAM,OAAO,CACjE;KACF;KAIA,IAHuB,gBACnB,CAAC,kBAAkB,IACnB,CAAC,eAAe,QAElB,IAAI;MACF,MAAM,QAAQ,MAAM,SAClB,WACA,eACA,aACA,EAAE,OAAO,CACX;MACA,IAAI,OACF,eAAe,OAAO,iBAAiB,CACrC,GAAG,gBACH,KACF;KAEJ,SAAS,OAAO;MAGd,IAAI,OAAO,SACT,MAAM;KAEV;IAEJ;GACF;GAEA,OAAO,eAAe;EACxB;EACA,SAAS,CAAC,CAAC;EACX;EACA,WAAW;CACb,CAAC;CAED,MAAM,EAAE,WAAW,mBAAmB;CACtC,MAAM,uBAAuB,cACrB,wBAAwB,MAAM,GACpC,CAAC,MAAM,CACT;CAqBA,OAAO;EACL,WAnBgB,cAAc;GAC9B,MAAM,SAAS,8BAA8B,gBAAgB,YAAY;GACzE,OAAO,oBACL,QACA,cACA,cACA,UACA,oBACF;EACF,GAAG;GACD;GACA;GACA;GACA;GACA;GACA;EACF,CAGU;EACR;EACA;EACA;CACF;AACF"}
@@ -1,8 +1,7 @@
1
1
  import { ToolsResponse } from "@lifi/sdk";
2
2
  //#region src/hooks/useTools.d.ts
3
- declare const useTools: () => {
3
+ export declare const useTools: () => {
4
4
  tools: ToolsResponse | undefined;
5
5
  };
6
6
  //#endregion
7
- export { useTools };
8
7
  //# sourceMappingURL=useTools.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"useTools.d.ts","names":[],"sources":["../../../src/hooks/useTools.ts"],"mappings":";;cAQa;EAAiB,OAAO"}
1
+ {"version":3,"file":"useTools.d.ts","names":[],"sources":["../../../src/hooks/useTools.ts"],"mappings":";;qBAQa;EAAiB,OAAO"}
@@ -1,11 +1,10 @@
1
1
  import { WidgetConfig } from "../types/widget.js";
2
2
  import { ExtendedChain } from "@lifi/sdk";
3
3
  //#region src/hooks/useWidgetChains.d.ts
4
- declare const useWidgetChains: (widgetConfig: WidgetConfig) => {
4
+ export declare const useWidgetChains: (widgetConfig: WidgetConfig) => {
5
5
  chains: ExtendedChain[] | undefined;
6
6
  getChainById: (chainId?: number, chains?: ExtendedChain[]) => ExtendedChain | undefined;
7
7
  isLoading: boolean;
8
8
  };
9
9
  //#endregion
10
- export { useWidgetChains };
11
10
  //# sourceMappingURL=useWidgetChains.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"useWidgetChains.d.ts","names":[],"sources":["../../../src/hooks/useWidgetChains.ts"],"mappings":";;;cAIa,kBACX,cAAc;EAEd,QAAQ;EACR,eACE,kBACA,SAAS,oBACN;EACL"}
1
+ {"version":3,"file":"useWidgetChains.d.ts","names":[],"sources":["../../../src/hooks/useWidgetChains.ts"],"mappings":";;;qBAIa,kBACX,cAAc;EAEd,QAAQ;EACR,eACE,kBACA,SAAS,oBACN;EACL"}
@@ -1,9 +1,8 @@
1
1
  import { WidgetEvents } from "../types/events.js";
2
2
  import EventEmitter from "eventemitter3";
3
3
  //#region src/hooks/useWidgetEvents.d.ts
4
- type WidgetEventEmitter = EventEmitter<WidgetEvents>;
5
- declare const widgetEvents: WidgetEventEmitter;
6
- declare const useWidgetEvents: () => WidgetEventEmitter;
4
+ export type WidgetEventEmitter = EventEmitter<WidgetEvents>;
5
+ export declare const widgetEvents: WidgetEventEmitter;
6
+ export declare const useWidgetEvents: () => WidgetEventEmitter;
7
7
  //#endregion
8
- export { WidgetEventEmitter, useWidgetEvents, widgetEvents };
9
8
  //# sourceMappingURL=useWidgetEvents.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"useWidgetEvents.d.ts","names":[],"sources":["../../../src/hooks/useWidgetEvents.ts"],"mappings":";;;KAGY,qBAAqB,aAAa;cAEjC,cAAc;cAEd,uBAAsB"}
1
+ {"version":3,"file":"useWidgetEvents.d.ts","names":[],"sources":["../../../src/hooks/useWidgetEvents.ts"],"mappings":";;;YAGY,qBAAqB,aAAa;qBAEjC,cAAc;qBAEd,uBAAsB"}
@@ -18,6 +18,7 @@
18
18
  "buy": "",
19
19
  "cancel": "বাতিল করুন",
20
20
  "checkoutReview": "",
21
+ "clear": "",
21
22
  "clearAllFailed": "",
22
23
  "clearTransaction": "",
23
24
  "close": "",
@@ -45,6 +46,8 @@
45
46
  "resetSettings": "সেটিংস রিসেট করুন",
46
47
  "seeDetails": "বিস্তারিত দেখুন",
47
48
  "showAll": "সবগুলো দেখুন",
49
+ "showLess": "",
50
+ "showMore": "",
48
51
  "startBridging": "",
49
52
  "startSwapping": "",
50
53
  "swap": "সোওয়াপ",
@@ -287,6 +290,7 @@
287
290
  "quotedAmount": "উদ্ধৃত পরিমাণ",
288
291
  "rateChange": "রেট পরিবর্তন",
289
292
  "receiving": "রিসিভিং",
293
+ "recentSearches": "",
290
294
  "refuelStepDetails": "{{tool}} এর মাধ্যমে গ্যাস পান",
291
295
  "route": "",
292
296
  "select": "",
@@ -18,6 +18,7 @@
18
18
  "buy": "Buy",
19
19
  "cancel": "Abbrechen",
20
20
  "checkoutReview": "",
21
+ "clear": "",
21
22
  "clearAllFailed": "",
22
23
  "clearTransaction": "",
23
24
  "close": "",
@@ -45,6 +46,8 @@
45
46
  "resetSettings": "Einstellungen zurücksetzen",
46
47
  "seeDetails": "Siehe Einzelheiten",
47
48
  "showAll": "Alles anzeigen",
49
+ "showLess": "",
50
+ "showMore": "",
48
51
  "startBridging": "Starte Bridge Protokoll",
49
52
  "startSwapping": "Swap starten",
50
53
  "swap": "Swap",
@@ -287,6 +290,7 @@
287
290
  "quotedAmount": "Angebotsbetrag",
288
291
  "rateChange": "Wechselkurs geändert",
289
292
  "receiving": "Eingehend",
293
+ "recentSearches": "",
290
294
  "refuelStepDetails": "Gas über {{tool}} erhalten",
291
295
  "route": "",
292
296
  "select": "",
@@ -18,6 +18,7 @@
18
18
  "buy": "Buy",
19
19
  "cancel": "Cancel",
20
20
  "checkoutReview": "Review purchase",
21
+ "clear": "Clear",
21
22
  "clearAllFailed": "Clear all failed",
22
23
  "clearTransaction": "Clear transaction",
23
24
  "close": "Close",
@@ -56,6 +57,8 @@
56
57
  "viewRefundStatus": "View refund status",
57
58
  "viewTransferDetails": "View transfer details",
58
59
  "showAll": "Show all",
60
+ "showLess": "Show less",
61
+ "showMore": "Show {{count}} more",
59
62
  "startBridging": "Start bridging",
60
63
  "startSwapping": "Start swapping",
61
64
  "swap": "Swap",
@@ -321,6 +324,7 @@
321
324
  "quotedAmount": "Quoted amount",
322
325
  "rateChange": "Rate change",
323
326
  "receiving": "Receiving",
327
+ "recentSearches": "Recent searches",
324
328
  "refuelStepDetails": "Get gas via {{tool}}",
325
329
  "route": "Route",
326
330
  "select": "Select",
@@ -18,6 +18,7 @@
18
18
  "buy": "Comprar",
19
19
  "cancel": "Cancelar",
20
20
  "checkoutReview": "Revisar compra",
21
+ "clear": "",
21
22
  "clearAllFailed": "",
22
23
  "clearTransaction": "",
23
24
  "close": "Cerrar",
@@ -45,6 +46,8 @@
45
46
  "resetSettings": "Reiniciar ajustes",
46
47
  "seeDetails": "Ver detalles",
47
48
  "showAll": "Mostrar todo",
49
+ "showLess": "",
50
+ "showMore": "",
48
51
  "startBridging": "Comenzar puente",
49
52
  "startSwapping": "Iniciar intercambio",
50
53
  "swap": "Swap",
@@ -287,6 +290,7 @@
287
290
  "quotedAmount": "Monto citado",
288
291
  "rateChange": "Cambios de precio detectado",
289
292
  "receiving": "Recibiendo",
293
+ "recentSearches": "",
290
294
  "refuelStepDetails": "Obtener gas a través de {{tool}}",
291
295
  "route": "",
292
296
  "select": "",
@@ -18,6 +18,7 @@
18
18
  "buy": "Acheter",
19
19
  "cancel": "Annuler",
20
20
  "checkoutReview": "",
21
+ "clear": "",
21
22
  "clearAllFailed": "",
22
23
  "clearTransaction": "",
23
24
  "close": "Fermer",
@@ -45,6 +46,8 @@
45
46
  "resetSettings": "Réinitialiser les paramètres",
46
47
  "seeDetails": "Voir les détails",
47
48
  "showAll": "Afficher tout",
49
+ "showLess": "",
50
+ "showMore": "",
48
51
  "startBridging": "Commencer le pont",
49
52
  "startSwapping": "Commencer à échanger",
50
53
  "swap": "Échanger",
@@ -287,6 +290,7 @@
287
290
  "quotedAmount": "Montant indiqué",
288
291
  "rateChange": "Taux de change",
289
292
  "receiving": "En cours de réception",
293
+ "recentSearches": "",
290
294
  "refuelStepDetails": "Obtenir du gaz via {{tool}}",
291
295
  "route": "",
292
296
  "select": "",
@@ -18,6 +18,7 @@
18
18
  "buy": "",
19
19
  "cancel": "रद्द करें",
20
20
  "checkoutReview": "",
21
+ "clear": "",
21
22
  "clearAllFailed": "",
22
23
  "clearTransaction": "",
23
24
  "close": "",
@@ -45,6 +46,8 @@
45
46
  "resetSettings": "कुंजी: बटन. सेटिंग्स रीसेट करें\nबटन -> सेटिंग्स रीसेट करें",
46
47
  "seeDetails": "कुंजी: बटन. जानकारी देखें\nबटन -> जानकारी देखें",
47
48
  "showAll": "कुंजी: बटन. सभी दिखाएँ\nबटन -> सभी दिखाएँ",
49
+ "showLess": "",
50
+ "showMore": "",
48
51
  "startBridging": "",
49
52
  "startSwapping": "",
50
53
  "swap": "कुंजी: बटन. विनिमय \nबटन -> विनिमय ",
@@ -287,6 +290,7 @@
287
290
  "quotedAmount": "",
288
291
  "rateChange": "",
289
292
  "receiving": "",
293
+ "recentSearches": "",
290
294
  "refuelStepDetails": "",
291
295
  "route": "",
292
296
  "select": "",