@lifi/widget 4.5.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 (522) 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/AppDrawer.js +2 -1
  7. package/dist/esm/AppDrawer.js.map +1 -1
  8. package/dist/esm/components/ActionRow/ActionRow.d.ts +1 -2
  9. package/dist/esm/components/ActionRow/ActionRow.d.ts.map +1 -1
  10. package/dist/esm/components/AmountInput/AmountInput.js +13 -7
  11. package/dist/esm/components/AmountInput/AmountInput.js.map +1 -1
  12. package/dist/esm/components/AmountInput/AmountInput.style.d.ts +2 -2
  13. package/dist/esm/components/AmountInput/AmountInput.style.d.ts.map +1 -1
  14. package/dist/esm/components/AmountInput/AmountInputEndAdornment.d.ts +1 -2
  15. package/dist/esm/components/AmountInput/AmountInputEndAdornment.d.ts.map +1 -1
  16. package/dist/esm/components/AmountInput/AmountInputEndAdornment.js +2 -13
  17. package/dist/esm/components/AmountInput/AmountInputEndAdornment.js.map +1 -1
  18. package/dist/esm/components/AmountInput/PriceFormHelperText.style.d.ts +1 -2
  19. package/dist/esm/components/AmountInput/PriceFormHelperText.style.d.ts.map +1 -1
  20. package/dist/esm/components/AmountInputCard/PercentageChips.js +2 -13
  21. package/dist/esm/components/AmountInputCard/PercentageChips.js.map +1 -1
  22. package/dist/esm/components/AmountInputCard/PercentageChips.style.js +1 -1
  23. package/dist/esm/components/AmountInputCard/PercentageChips.style.js.map +1 -1
  24. package/dist/esm/components/AmountInputCard/ReceiveAmountCard.js +6 -2
  25. package/dist/esm/components/AmountInputCard/ReceiveAmountCard.js.map +1 -1
  26. package/dist/esm/components/AmountInputCard/SendAmountCard.js +13 -6
  27. package/dist/esm/components/AmountInputCard/SendAmountCard.js.map +1 -1
  28. package/dist/esm/components/Avatar/Avatar.d.ts +1 -2
  29. package/dist/esm/components/Avatar/Avatar.d.ts.map +1 -1
  30. package/dist/esm/components/Avatar/TokenAvatar.d.ts +1 -2
  31. package/dist/esm/components/Avatar/TokenAvatar.d.ts.map +1 -1
  32. package/dist/esm/components/BaseTransactionButton/BaseTransactionButton.d.ts +1 -2
  33. package/dist/esm/components/BaseTransactionButton/BaseTransactionButton.d.ts.map +1 -1
  34. package/dist/esm/components/BaseTransactionButton/types.d.ts +1 -2
  35. package/dist/esm/components/BaseTransactionButton/types.d.ts.map +1 -1
  36. package/dist/esm/components/BottomSheet/BottomSheet.js +1 -0
  37. package/dist/esm/components/BottomSheet/BottomSheet.js.map +1 -1
  38. package/dist/esm/components/BottomSheet/types.d.ts +1 -2
  39. package/dist/esm/components/BottomSheet/types.d.ts.map +1 -1
  40. package/dist/esm/components/ButtonTertiary.d.ts +1 -2
  41. package/dist/esm/components/ButtonTertiary.d.ts.map +1 -1
  42. package/dist/esm/components/Card/CardIconButton.d.ts +1 -2
  43. package/dist/esm/components/Card/CardIconButton.d.ts.map +1 -1
  44. package/dist/esm/components/Card/CardTitle.d.ts +1 -2
  45. package/dist/esm/components/Card/CardTitle.d.ts.map +1 -1
  46. package/dist/esm/components/Card/InputCard.d.ts +1 -2
  47. package/dist/esm/components/Card/InputCard.d.ts.map +1 -1
  48. package/dist/esm/components/ChainSelect/ChainSelect.d.ts +1 -2
  49. package/dist/esm/components/ChainSelect/ChainSelect.d.ts.map +1 -1
  50. package/dist/esm/components/ChainSelect/ChainSelect.style.d.ts +1 -2
  51. package/dist/esm/components/ChainSelect/ChainSelect.style.d.ts.map +1 -1
  52. package/dist/esm/components/Chains/AllChainsAvatar.js +7 -1
  53. package/dist/esm/components/Chains/AllChainsAvatar.js.map +1 -1
  54. package/dist/esm/components/ContractComponent/ContractComponent.d.ts +1 -2
  55. package/dist/esm/components/ContractComponent/ContractComponent.d.ts.map +1 -1
  56. package/dist/esm/components/ContractComponent/ItemPrice.d.ts +2 -3
  57. package/dist/esm/components/ContractComponent/ItemPrice.d.ts.map +1 -1
  58. package/dist/esm/components/ContractComponent/NFT/NFT.d.ts +1 -2
  59. package/dist/esm/components/ContractComponent/NFT/NFT.d.ts.map +1 -1
  60. package/dist/esm/components/ContractComponent/NFT/NFTBase.d.ts +1 -2
  61. package/dist/esm/components/ContractComponent/NFT/NFTBase.d.ts.map +1 -1
  62. package/dist/esm/components/ContractComponent/NFT/types.d.ts +3 -4
  63. package/dist/esm/components/ContractComponent/NFT/types.d.ts.map +1 -1
  64. package/dist/esm/components/Dialog/Dialog.js +2 -1
  65. package/dist/esm/components/Dialog/Dialog.js.map +1 -1
  66. package/dist/esm/components/ExecutionStatusCard/ExecutionStatusCard.d.ts +1 -2
  67. package/dist/esm/components/ExecutionStatusCard/ExecutionStatusCard.d.ts.map +1 -1
  68. package/dist/esm/components/ExecutionStatusCard/StatusIcon.d.ts +1 -2
  69. package/dist/esm/components/ExecutionStatusCard/StatusIcon.d.ts.map +1 -1
  70. package/dist/esm/components/Expansion/Expansion.js +4 -3
  71. package/dist/esm/components/Expansion/Expansion.js.map +1 -1
  72. package/dist/esm/components/FeeBreakdownTooltip.d.ts +1 -2
  73. package/dist/esm/components/FeeBreakdownTooltip.d.ts.map +1 -1
  74. package/dist/esm/components/Header/SettingsButton.js +2 -1
  75. package/dist/esm/components/Header/SettingsButton.js.map +1 -1
  76. package/dist/esm/components/IconCircle/IconCircle.d.ts +1 -2
  77. package/dist/esm/components/IconCircle/IconCircle.d.ts.map +1 -1
  78. package/dist/esm/components/IconCircle/IconCircle.js +2 -1
  79. package/dist/esm/components/IconCircle/IconCircle.js.map +1 -1
  80. package/dist/esm/components/IconCircle/statusIcons.d.ts +1 -2
  81. package/dist/esm/components/IconCircle/statusIcons.d.ts.map +1 -1
  82. package/dist/esm/components/IconTypography.d.ts +1 -2
  83. package/dist/esm/components/IconTypography.d.ts.map +1 -1
  84. package/dist/esm/components/ListItem/ListItemButton.d.ts +1 -2
  85. package/dist/esm/components/ListItem/ListItemButton.d.ts.map +1 -1
  86. package/dist/esm/components/Messages/UnsupportedToAddressMessage.js +27 -0
  87. package/dist/esm/components/Messages/UnsupportedToAddressMessage.js.map +1 -0
  88. package/dist/esm/components/Messages/WarningMessages.d.ts +1 -2
  89. package/dist/esm/components/Messages/WarningMessages.d.ts.map +1 -1
  90. package/dist/esm/components/Messages/WarningMessages.js +2 -0
  91. package/dist/esm/components/Messages/WarningMessages.js.map +1 -1
  92. package/dist/esm/components/Messages/useMessageQueue.js +6 -1
  93. package/dist/esm/components/Messages/useMessageQueue.js.map +1 -1
  94. package/dist/esm/components/PageContainer.d.ts +2 -3
  95. package/dist/esm/components/PageContainer.d.ts.map +1 -1
  96. package/dist/esm/components/PoweredBy/PoweredBy.d.ts +1 -2
  97. package/dist/esm/components/PoweredBy/PoweredBy.d.ts.map +1 -1
  98. package/dist/esm/components/ProgressToNextUpdate.d.ts +1 -2
  99. package/dist/esm/components/ProgressToNextUpdate.d.ts.map +1 -1
  100. package/dist/esm/components/RouteCard/RouteCard.d.ts +1 -2
  101. package/dist/esm/components/RouteCard/RouteCard.d.ts.map +1 -1
  102. package/dist/esm/components/RouteCard/RouteCardSkeleton.d.ts +1 -2
  103. package/dist/esm/components/RouteCard/RouteCardSkeleton.d.ts.map +1 -1
  104. package/dist/esm/components/RouteCard/RouteDetails.d.ts +1 -2
  105. package/dist/esm/components/RouteCard/RouteDetails.d.ts.map +1 -1
  106. package/dist/esm/components/RouteCard/RouteDetails.js +2 -1
  107. package/dist/esm/components/RouteCard/RouteDetails.js.map +1 -1
  108. package/dist/esm/components/RouteCard/RouteDetails.style.d.ts +5 -6
  109. package/dist/esm/components/RouteCard/RouteDetails.style.d.ts.map +1 -1
  110. package/dist/esm/components/RouteCard/RouteNotFoundCard.d.ts +1 -2
  111. package/dist/esm/components/RouteCard/RouteNotFoundCard.d.ts.map +1 -1
  112. package/dist/esm/components/RouteCard/RouteTokens.d.ts +1 -2
  113. package/dist/esm/components/RouteCard/RouteTokens.d.ts.map +1 -1
  114. package/dist/esm/components/RouteCard/types.d.ts +2 -3
  115. package/dist/esm/components/RouteCard/types.d.ts.map +1 -1
  116. package/dist/esm/components/Routes/LimitOrderRoutes.js +2 -2
  117. package/dist/esm/components/Routes/LimitOrderRoutes.js.map +1 -1
  118. package/dist/esm/components/Routes/RoutesContent.js +2 -2
  119. package/dist/esm/components/Routes/RoutesContent.js.map +1 -1
  120. package/dist/esm/components/Search/SearchInput.d.ts +1 -2
  121. package/dist/esm/components/Search/SearchInput.d.ts.map +1 -1
  122. package/dist/esm/components/SendToWallet/SendToWalletButton.d.ts +1 -2
  123. package/dist/esm/components/SendToWallet/SendToWalletButton.d.ts.map +1 -1
  124. package/dist/esm/components/SendToWallet/SendToWalletExpandButton.js +2 -2
  125. package/dist/esm/components/SendToWallet/SendToWalletExpandButton.js.map +1 -1
  126. package/dist/esm/components/Skeleton/WidgetSkeleton.d.ts +1 -2
  127. package/dist/esm/components/Skeleton/WidgetSkeleton.d.ts.map +1 -1
  128. package/dist/esm/components/Skeleton/WidgetSkeleton.js +2 -1
  129. package/dist/esm/components/Skeleton/WidgetSkeleton.js.map +1 -1
  130. package/dist/esm/components/Step/StepActions.js +18 -16
  131. package/dist/esm/components/Step/StepActions.js.map +1 -1
  132. package/dist/esm/components/StepActions/SentToWalletRow.d.ts +1 -2
  133. package/dist/esm/components/StepActions/SentToWalletRow.d.ts.map +1 -1
  134. package/dist/esm/components/StepActions/StepActionRow.js +2 -1
  135. package/dist/esm/components/StepActions/StepActionRow.js.map +1 -1
  136. package/dist/esm/components/StepActions/StepActionRow.style.d.ts +1 -2
  137. package/dist/esm/components/StepActions/StepActionRow.style.d.ts.map +1 -1
  138. package/dist/esm/components/StepActions/StepActionsList.d.ts +1 -2
  139. package/dist/esm/components/StepActions/StepActionsList.d.ts.map +1 -1
  140. package/dist/esm/components/StepActions/executionRows.d.ts +2 -3
  141. package/dist/esm/components/StepActions/executionRows.d.ts.map +1 -1
  142. package/dist/esm/components/Switch.js +1 -1
  143. package/dist/esm/components/Switch.js.map +1 -1
  144. package/dist/esm/components/Tabs/Tabs.style.js +4 -2
  145. package/dist/esm/components/Tabs/Tabs.style.js.map +1 -1
  146. package/dist/esm/components/Token/Token.d.ts.map +1 -1
  147. package/dist/esm/components/Token/Token.js +2 -4
  148. package/dist/esm/components/Token/Token.js.map +1 -1
  149. package/dist/esm/components/TokenList/RecentTokensHeader.js +44 -0
  150. package/dist/esm/components/TokenList/RecentTokensHeader.js.map +1 -0
  151. package/dist/esm/components/TokenList/RecentTokensToggle.js +36 -0
  152. package/dist/esm/components/TokenList/RecentTokensToggle.js.map +1 -0
  153. package/dist/esm/components/TokenList/RemoveRecentTokenButton.js +32 -0
  154. package/dist/esm/components/TokenList/RemoveRecentTokenButton.js.map +1 -0
  155. package/dist/esm/components/TokenList/TokenList.js +55 -5
  156. package/dist/esm/components/TokenList/TokenList.js.map +1 -1
  157. package/dist/esm/components/TokenList/TokenListItem.js +81 -27
  158. package/dist/esm/components/TokenList/TokenListItem.js.map +1 -1
  159. package/dist/esm/components/TokenList/TokenNotFound.d.ts +1 -2
  160. package/dist/esm/components/TokenList/TokenNotFound.d.ts.map +1 -1
  161. package/dist/esm/components/TokenList/VirtualizedTokenList.d.ts +1 -2
  162. package/dist/esm/components/TokenList/VirtualizedTokenList.d.ts.map +1 -1
  163. package/dist/esm/components/TokenList/VirtualizedTokenList.js +63 -37
  164. package/dist/esm/components/TokenList/VirtualizedTokenList.js.map +1 -1
  165. package/dist/esm/components/TokenList/types.d.ts +9 -2
  166. package/dist/esm/components/TokenList/types.d.ts.map +1 -1
  167. package/dist/esm/components/TokenList/useTokenSelect.d.ts +1 -2
  168. package/dist/esm/components/TokenList/useTokenSelect.d.ts.map +1 -1
  169. package/dist/esm/components/TokenRate/TokenRate.d.ts +1 -2
  170. package/dist/esm/components/TokenRate/TokenRate.d.ts.map +1 -1
  171. package/dist/esm/components/TokenRate/TokenRate.js +2 -1
  172. package/dist/esm/components/TokenRate/TokenRate.js.map +1 -1
  173. package/dist/esm/components/TransactionCard/ActiveTransactionCard.js +22 -21
  174. package/dist/esm/components/TransactionCard/ActiveTransactionCard.js.map +1 -1
  175. package/dist/esm/components/TransactionCard/TransactionCard.style.d.ts +2 -3
  176. package/dist/esm/components/TransactionCard/TransactionCard.style.d.ts.map +1 -1
  177. package/dist/esm/config/constants.d.ts +1 -2
  178. package/dist/esm/config/constants.d.ts.map +1 -1
  179. package/dist/esm/config/version.d.ts +2 -3
  180. package/dist/esm/config/version.d.ts.map +1 -1
  181. package/dist/esm/config/version.js +1 -1
  182. package/dist/esm/config/version.js.map +1 -1
  183. package/dist/esm/hooks/timer/time.js +2 -2
  184. package/dist/esm/hooks/timer/time.js.map +1 -1
  185. package/dist/esm/hooks/useAddressActivity.d.ts +1 -2
  186. package/dist/esm/hooks/useAddressActivity.d.ts.map +1 -1
  187. package/dist/esm/hooks/useAddressValidation.d.ts +2 -3
  188. package/dist/esm/hooks/useAddressValidation.d.ts.map +1 -1
  189. package/dist/esm/hooks/useAvailableChains.d.ts +1 -2
  190. package/dist/esm/hooks/useAvailableChains.d.ts.map +1 -1
  191. package/dist/esm/hooks/useAvailableChains.js +2 -1
  192. package/dist/esm/hooks/useAvailableChains.js.map +1 -1
  193. package/dist/esm/hooks/useChain.d.ts +1 -2
  194. package/dist/esm/hooks/useChain.d.ts.map +1 -1
  195. package/dist/esm/hooks/useContactSupport.d.ts +1 -2
  196. package/dist/esm/hooks/useContactSupport.d.ts.map +1 -1
  197. package/dist/esm/hooks/useDebouncedWatch.d.ts +1 -2
  198. package/dist/esm/hooks/useDebouncedWatch.d.ts.map +1 -1
  199. package/dist/esm/hooks/useDisplayedTokens.js +6 -4
  200. package/dist/esm/hooks/useDisplayedTokens.js.map +1 -1
  201. package/dist/esm/hooks/useExplorer.d.ts +1 -2
  202. package/dist/esm/hooks/useExplorer.d.ts.map +1 -1
  203. package/dist/esm/hooks/useExplorer.js +4 -0
  204. package/dist/esm/hooks/useExplorer.js.map +1 -1
  205. package/dist/esm/hooks/useFlaggedTokenGuard.js +28 -0
  206. package/dist/esm/hooks/useFlaggedTokenGuard.js.map +1 -0
  207. package/dist/esm/hooks/useGasSufficiency.js +3 -1
  208. package/dist/esm/hooks/useGasSufficiency.js.map +1 -1
  209. package/dist/esm/hooks/useHeader.d.ts +1 -2
  210. package/dist/esm/hooks/useHeader.d.ts.map +1 -1
  211. package/dist/esm/hooks/useListHeight.d.ts +1 -2
  212. package/dist/esm/hooks/useListHeight.d.ts.map +1 -1
  213. package/dist/esm/hooks/useMaxSendAmount.js +15 -0
  214. package/dist/esm/hooks/useMaxSendAmount.js.map +1 -0
  215. package/dist/esm/hooks/useNavigateBack.d.ts +1 -2
  216. package/dist/esm/hooks/useNavigateBack.d.ts.map +1 -1
  217. package/dist/esm/hooks/usePacedRouteExecution.js +3 -2
  218. package/dist/esm/hooks/usePacedRouteExecution.js.map +1 -1
  219. package/dist/esm/hooks/useRecentTokens.js +46 -0
  220. package/dist/esm/hooks/useRecentTokens.js.map +1 -0
  221. package/dist/esm/hooks/useRouteExecution.d.ts +1 -2
  222. package/dist/esm/hooks/useRouteExecution.d.ts.map +1 -1
  223. package/dist/esm/hooks/useRouteExecutionMessage.d.ts +1 -2
  224. package/dist/esm/hooks/useRouteExecutionMessage.d.ts.map +1 -1
  225. package/dist/esm/hooks/useRouteExecutionMessage.js +3 -2
  226. package/dist/esm/hooks/useRouteExecutionMessage.js.map +1 -1
  227. package/dist/esm/hooks/useRoutes.d.ts +1 -2
  228. package/dist/esm/hooks/useRoutes.d.ts.map +1 -1
  229. package/dist/esm/hooks/useRoutes.js +8 -1
  230. package/dist/esm/hooks/useRoutes.js.map +1 -1
  231. package/dist/esm/hooks/useToAddressRequirements.d.ts +3 -2
  232. package/dist/esm/hooks/useToAddressRequirements.d.ts.map +1 -1
  233. package/dist/esm/hooks/useToAddressRequirements.js +13 -1
  234. package/dist/esm/hooks/useToAddressRequirements.js.map +1 -1
  235. package/dist/esm/hooks/useToken.d.ts +1 -2
  236. package/dist/esm/hooks/useToken.d.ts.map +1 -1
  237. package/dist/esm/hooks/useTokenAddressBalance.d.ts +1 -2
  238. package/dist/esm/hooks/useTokenAddressBalance.d.ts.map +1 -1
  239. package/dist/esm/hooks/useTokenBalances.d.ts +3 -2
  240. package/dist/esm/hooks/useTokenBalances.d.ts.map +1 -1
  241. package/dist/esm/hooks/useTokenBalances.js +19 -8
  242. package/dist/esm/hooks/useTokenBalances.js.map +1 -1
  243. package/dist/esm/hooks/useTokenBalancesQueries.js +29 -28
  244. package/dist/esm/hooks/useTokenBalancesQueries.js.map +1 -1
  245. package/dist/esm/hooks/useTokenList.d.ts +1 -2
  246. package/dist/esm/hooks/useTokenList.d.ts.map +1 -1
  247. package/dist/esm/hooks/useTokenSearch.js +5 -6
  248. package/dist/esm/hooks/useTokenSearch.js.map +1 -1
  249. package/dist/esm/hooks/useTokens.js +40 -25
  250. package/dist/esm/hooks/useTokens.js.map +1 -1
  251. package/dist/esm/hooks/useTools.d.ts +1 -2
  252. package/dist/esm/hooks/useTools.d.ts.map +1 -1
  253. package/dist/esm/hooks/useWideVariant.js +2 -1
  254. package/dist/esm/hooks/useWideVariant.js.map +1 -1
  255. package/dist/esm/hooks/useWidgetChains.d.ts +1 -2
  256. package/dist/esm/hooks/useWidgetChains.d.ts.map +1 -1
  257. package/dist/esm/hooks/useWidgetEvents.d.ts +3 -4
  258. package/dist/esm/hooks/useWidgetEvents.d.ts.map +1 -1
  259. package/dist/esm/i18n/bn.json +7 -1
  260. package/dist/esm/i18n/de.json +7 -1
  261. package/dist/esm/i18n/en.json +16 -3
  262. package/dist/esm/i18n/es.json +7 -1
  263. package/dist/esm/i18n/fr.json +7 -1
  264. package/dist/esm/i18n/hi.json +7 -1
  265. package/dist/esm/i18n/id.json +7 -1
  266. package/dist/esm/i18n/it.json +7 -1
  267. package/dist/esm/i18n/ja.json +7 -1
  268. package/dist/esm/i18n/ko.json +7 -1
  269. package/dist/esm/i18n/pl.json +7 -1
  270. package/dist/esm/i18n/pt.json +7 -1
  271. package/dist/esm/i18n/th.json +7 -1
  272. package/dist/esm/i18n/tr.json +7 -1
  273. package/dist/esm/i18n/uk.json +7 -1
  274. package/dist/esm/i18n/vi.json +7 -1
  275. package/dist/esm/i18n/zh.json +7 -1
  276. package/dist/esm/pages/MainPage/MainPage.js +2 -1
  277. package/dist/esm/pages/MainPage/MainPage.js.map +1 -1
  278. package/dist/esm/pages/MainPage/MainWarningMessages.d.ts +1 -2
  279. package/dist/esm/pages/MainPage/MainWarningMessages.d.ts.map +1 -1
  280. package/dist/esm/pages/MainPage/ReviewButton.js +2 -2
  281. package/dist/esm/pages/MainPage/ReviewButton.js.map +1 -1
  282. package/dist/esm/pages/RoutesPage/RoutesPage.js +2 -2
  283. package/dist/esm/pages/RoutesPage/RoutesPage.js.map +1 -1
  284. package/dist/esm/pages/SelectChainPage/SelectChainPage.d.ts +1 -2
  285. package/dist/esm/pages/SelectChainPage/SelectChainPage.d.ts.map +1 -1
  286. package/dist/esm/pages/SelectChainPage/SelectChainPage.js +13 -12
  287. package/dist/esm/pages/SelectChainPage/SelectChainPage.js.map +1 -1
  288. package/dist/esm/pages/SelectChainPage/types.d.ts +1 -2
  289. package/dist/esm/pages/SelectChainPage/types.d.ts.map +1 -1
  290. package/dist/esm/pages/SelectEnabledToolsPage.js +8 -5
  291. package/dist/esm/pages/SelectEnabledToolsPage.js.map +1 -1
  292. package/dist/esm/pages/SelectTokenPage/SearchTokenInput.d.ts +1 -2
  293. package/dist/esm/pages/SelectTokenPage/SearchTokenInput.d.ts.map +1 -1
  294. package/dist/esm/pages/SelectTokenPage/SelectTokenPage.js +2 -1
  295. package/dist/esm/pages/SelectTokenPage/SelectTokenPage.js.map +1 -1
  296. package/dist/esm/pages/SettingsPage/SmallBalanceFilterSettings.js +2 -1
  297. package/dist/esm/pages/SettingsPage/SmallBalanceFilterSettings.js.map +1 -1
  298. package/dist/esm/pages/TransactionDetailsPage/ContactSupportButton.d.ts +1 -2
  299. package/dist/esm/pages/TransactionDetailsPage/ContactSupportButton.d.ts.map +1 -1
  300. package/dist/esm/pages/TransactionDetailsPage/ContactSupportButton.js +2 -1
  301. package/dist/esm/pages/TransactionDetailsPage/ContactSupportButton.js.map +1 -1
  302. package/dist/esm/pages/TransactionDetailsPage/TransactionDetailsPage.js +2 -1
  303. package/dist/esm/pages/TransactionDetailsPage/TransactionDetailsPage.js.map +1 -1
  304. package/dist/esm/pages/TransactionPage/ConfirmToAddressSheet.d.ts +1 -2
  305. package/dist/esm/pages/TransactionPage/ConfirmToAddressSheet.d.ts.map +1 -1
  306. package/dist/esm/pages/TransactionPage/ExchangeRateBottomSheet.d.ts +2 -3
  307. package/dist/esm/pages/TransactionPage/ExchangeRateBottomSheet.d.ts.map +1 -1
  308. package/dist/esm/pages/TransactionPage/ExecutionDoneCard.d.ts +1 -2
  309. package/dist/esm/pages/TransactionPage/ExecutionDoneCard.d.ts.map +1 -1
  310. package/dist/esm/pages/TransactionPage/RouteTracker.d.ts +1 -2
  311. package/dist/esm/pages/TransactionPage/RouteTracker.d.ts.map +1 -1
  312. package/dist/esm/pages/TransactionPage/StartTransactionButton.d.ts +1 -2
  313. package/dist/esm/pages/TransactionPage/StartTransactionButton.d.ts.map +1 -1
  314. package/dist/esm/pages/TransactionPage/StartTransactionButton.js +4 -3
  315. package/dist/esm/pages/TransactionPage/StartTransactionButton.js.map +1 -1
  316. package/dist/esm/pages/TransactionPage/TokenValueBottomSheet.d.ts +1 -2
  317. package/dist/esm/pages/TransactionPage/TokenValueBottomSheet.d.ts.map +1 -1
  318. package/dist/esm/pages/TransactionPage/TokenValueBottomSheet.js +0 -1
  319. package/dist/esm/pages/TransactionPage/TokenValueBottomSheet.js.map +1 -1
  320. package/dist/esm/pages/TransactionPage/TokenVerificationBottomSheet.js +63 -0
  321. package/dist/esm/pages/TransactionPage/TokenVerificationBottomSheet.js.map +1 -0
  322. package/dist/esm/pages/TransactionPage/TransactionDoneButtons.d.ts +1 -2
  323. package/dist/esm/pages/TransactionPage/TransactionDoneButtons.d.ts.map +1 -1
  324. package/dist/esm/pages/TransactionPage/TransactionExecutionContent.js +19 -16
  325. package/dist/esm/pages/TransactionPage/TransactionExecutionContent.js.map +1 -1
  326. package/dist/esm/pages/TransactionPage/TransactionFailedButtons.js +38 -10
  327. package/dist/esm/pages/TransactionPage/TransactionFailedButtons.js.map +1 -1
  328. package/dist/esm/pages/TransactionPage/TransactionReview.js +32 -9
  329. package/dist/esm/pages/TransactionPage/TransactionReview.js.map +1 -1
  330. package/dist/esm/pages/TransactionPage/types.d.ts +1 -2
  331. package/dist/esm/pages/TransactionPage/types.d.ts.map +1 -1
  332. package/dist/esm/pages/TransactionPage/utils.d.ts +2 -3
  333. package/dist/esm/pages/TransactionPage/utils.d.ts.map +1 -1
  334. package/dist/esm/pages/TransactionPage/utils.js +23 -1
  335. package/dist/esm/pages/TransactionPage/utils.js.map +1 -1
  336. package/dist/esm/providers/I18nProvider/I18nProvider.d.ts +1 -2
  337. package/dist/esm/providers/I18nProvider/I18nProvider.d.ts.map +1 -1
  338. package/dist/esm/providers/I18nProvider/I18nProvider.js +37 -36
  339. package/dist/esm/providers/I18nProvider/I18nProvider.js.map +1 -1
  340. package/dist/esm/providers/I18nProvider/types.d.ts +4 -5
  341. package/dist/esm/providers/I18nProvider/types.d.ts.map +1 -1
  342. package/dist/esm/providers/QueryClientProvider.d.ts +1 -2
  343. package/dist/esm/providers/QueryClientProvider.d.ts.map +1 -1
  344. package/dist/esm/providers/SDKClientProvider.d.ts +2 -3
  345. package/dist/esm/providers/SDKClientProvider.d.ts.map +1 -1
  346. package/dist/esm/providers/ThemeProvider/ThemeProvider.js +2 -1
  347. package/dist/esm/providers/ThemeProvider/ThemeProvider.js.map +1 -1
  348. package/dist/esm/providers/WalletProvider/WalletProvider.d.ts +1 -2
  349. package/dist/esm/providers/WalletProvider/WalletProvider.d.ts.map +1 -1
  350. package/dist/esm/providers/WalletProvider/WalletProvider.js +10 -9
  351. package/dist/esm/providers/WalletProvider/WalletProvider.js.map +1 -1
  352. package/dist/esm/providers/WalletProvider/useExternalWalletProvider.js +7 -3
  353. package/dist/esm/providers/WalletProvider/useExternalWalletProvider.js.map +1 -1
  354. package/dist/esm/providers/WidgetProvider/WidgetProvider.d.ts +2 -3
  355. package/dist/esm/providers/WidgetProvider/WidgetProvider.d.ts.map +1 -1
  356. package/dist/esm/providers/WidgetProvider/types.d.ts +2 -3
  357. package/dist/esm/providers/WidgetProvider/types.d.ts.map +1 -1
  358. package/dist/esm/stores/StoreProvider.d.ts +1 -2
  359. package/dist/esm/stores/StoreProvider.d.ts.map +1 -1
  360. package/dist/esm/stores/StoreProvider.js +10 -6
  361. package/dist/esm/stores/StoreProvider.js.map +1 -1
  362. package/dist/esm/stores/bookmarks/BookmarkStore.d.ts +1 -2
  363. package/dist/esm/stores/bookmarks/BookmarkStore.d.ts.map +1 -1
  364. package/dist/esm/stores/bookmarks/types.d.ts +5 -6
  365. package/dist/esm/stores/bookmarks/types.d.ts.map +1 -1
  366. package/dist/esm/stores/chains/ChainOrderStore.d.ts +1 -2
  367. package/dist/esm/stores/chains/ChainOrderStore.d.ts.map +1 -1
  368. package/dist/esm/stores/chains/ChainOrderStore.js +11 -5
  369. package/dist/esm/stores/chains/ChainOrderStore.js.map +1 -1
  370. package/dist/esm/stores/chains/types.d.ts +1 -2
  371. package/dist/esm/stores/chains/types.d.ts.map +1 -1
  372. package/dist/esm/stores/form/types.d.ts +20 -21
  373. package/dist/esm/stores/form/types.d.ts.map +1 -1
  374. package/dist/esm/stores/form/useFieldActions.d.ts +1 -2
  375. package/dist/esm/stores/form/useFieldActions.d.ts.map +1 -1
  376. package/dist/esm/stores/form/useFieldValues.d.ts +1 -2
  377. package/dist/esm/stores/form/useFieldValues.d.ts.map +1 -1
  378. package/dist/esm/stores/header/types.d.ts +1 -2
  379. package/dist/esm/stores/header/types.d.ts.map +1 -1
  380. package/dist/esm/stores/header/useHeaderStore.d.ts +2 -3
  381. package/dist/esm/stores/header/useHeaderStore.d.ts.map +1 -1
  382. package/dist/esm/stores/inputMode/useInputModeStore.d.ts +1 -2
  383. package/dist/esm/stores/inputMode/useInputModeStore.d.ts.map +1 -1
  384. package/dist/esm/stores/recentTokens/RecentTokensStore.js +23 -0
  385. package/dist/esm/stores/recentTokens/RecentTokensStore.js.map +1 -0
  386. package/dist/esm/stores/recentTokens/createRecentTokensStore.js +54 -0
  387. package/dist/esm/stores/recentTokens/createRecentTokensStore.js.map +1 -0
  388. package/dist/esm/stores/recentTokens/utils.js +15 -0
  389. package/dist/esm/stores/recentTokens/utils.js.map +1 -0
  390. package/dist/esm/stores/routes/RouteExecutionStore.d.ts +2 -3
  391. package/dist/esm/stores/routes/RouteExecutionStore.d.ts.map +1 -1
  392. package/dist/esm/stores/routes/types.d.ts +3 -4
  393. package/dist/esm/stores/routes/types.d.ts.map +1 -1
  394. package/dist/esm/stores/routes/useRouteExecutionIndicator.js +4 -3
  395. package/dist/esm/stores/routes/useRouteExecutionIndicator.js.map +1 -1
  396. package/dist/esm/stores/routes/utils.d.ts +4 -5
  397. package/dist/esm/stores/routes/utils.d.ts.map +1 -1
  398. package/dist/esm/stores/settings/SettingsStore.d.ts +2 -3
  399. package/dist/esm/stores/settings/SettingsStore.d.ts.map +1 -1
  400. package/dist/esm/stores/settings/types.d.ts +2 -3
  401. package/dist/esm/stores/settings/types.d.ts.map +1 -1
  402. package/dist/esm/stores/types.d.ts +2 -3
  403. package/dist/esm/stores/types.d.ts.map +1 -1
  404. package/dist/esm/themes/azureLight.d.ts +1 -2
  405. package/dist/esm/themes/azureLight.d.ts.map +1 -1
  406. package/dist/esm/themes/jumper.d.ts +1 -2
  407. package/dist/esm/themes/jumper.d.ts.map +1 -1
  408. package/dist/esm/themes/palettes.d.ts +3 -4
  409. package/dist/esm/themes/palettes.d.ts.map +1 -1
  410. package/dist/esm/themes/types.d.ts +1 -0
  411. package/dist/esm/themes/watermelonLight.d.ts +1 -2
  412. package/dist/esm/themes/watermelonLight.d.ts.map +1 -1
  413. package/dist/esm/themes/windows95.d.ts +1 -2
  414. package/dist/esm/themes/windows95.d.ts.map +1 -1
  415. package/dist/esm/types/events.d.ts +13 -14
  416. package/dist/esm/types/events.d.ts.map +1 -1
  417. package/dist/esm/types/token.d.ts +6 -1
  418. package/dist/esm/types/token.d.ts.map +1 -1
  419. package/dist/esm/types/widget.d.ts +55 -51
  420. package/dist/esm/types/widget.d.ts.map +1 -1
  421. package/dist/esm/types/widget.js.map +1 -1
  422. package/dist/esm/utils/address.js +19 -0
  423. package/dist/esm/utils/address.js.map +1 -0
  424. package/dist/esm/utils/compactNumberFormatter.d.ts +1 -2
  425. package/dist/esm/utils/compactNumberFormatter.d.ts.map +1 -1
  426. package/dist/esm/utils/compactNumberFormatter.js +1 -3
  427. package/dist/esm/utils/compactNumberFormatter.js.map +1 -1
  428. package/dist/esm/utils/converters.d.ts +1 -2
  429. package/dist/esm/utils/converters.d.ts.map +1 -1
  430. package/dist/esm/utils/currencyExtendedFormatter.d.ts +1 -2
  431. package/dist/esm/utils/currencyExtendedFormatter.d.ts.map +1 -1
  432. package/dist/esm/utils/customReceiver.js +12 -0
  433. package/dist/esm/utils/customReceiver.js.map +1 -0
  434. package/dist/esm/utils/elements.d.ts +2 -3
  435. package/dist/esm/utils/elements.d.ts.map +1 -1
  436. package/dist/esm/utils/enum.d.ts +1 -2
  437. package/dist/esm/utils/enum.d.ts.map +1 -1
  438. package/dist/esm/utils/fees.d.ts +2 -3
  439. package/dist/esm/utils/fees.d.ts.map +1 -1
  440. package/dist/esm/utils/format.d.ts +8 -9
  441. package/dist/esm/utils/format.d.ts.map +1 -1
  442. package/dist/esm/utils/gas.js +24 -0
  443. package/dist/esm/utils/gas.js.map +1 -0
  444. package/dist/esm/utils/getErrorMessage.js +0 -1
  445. package/dist/esm/utils/getErrorMessage.js.map +1 -1
  446. package/dist/esm/utils/getPriceImpact.d.ts +1 -2
  447. package/dist/esm/utils/getPriceImpact.d.ts.map +1 -1
  448. package/dist/esm/utils/input.d.ts +1 -2
  449. package/dist/esm/utils/input.d.ts.map +1 -1
  450. package/dist/esm/utils/limitOrder.js +1 -1
  451. package/dist/esm/utils/limitOrder.js.map +1 -1
  452. package/dist/esm/utils/navigationRoutes.d.ts +2 -3
  453. package/dist/esm/utils/navigationRoutes.d.ts.map +1 -1
  454. package/dist/esm/utils/percentFormatter.d.ts +1 -2
  455. package/dist/esm/utils/percentFormatter.d.ts.map +1 -1
  456. package/dist/esm/utils/recentTokens.js +97 -0
  457. package/dist/esm/utils/recentTokens.js.map +1 -0
  458. package/dist/esm/utils/token.js +50 -7
  459. package/dist/esm/utils/token.js.map +1 -1
  460. package/dist/esm/utils/tokenList.js +54 -25
  461. package/dist/esm/utils/tokenList.js.map +1 -1
  462. package/dist/esm/utils/tokenListBands.js +85 -0
  463. package/dist/esm/utils/tokenListBands.js.map +1 -0
  464. package/dist/esm/utils/wallet.d.ts +1 -2
  465. package/dist/esm/utils/wallet.d.ts.map +1 -1
  466. package/package.json +15 -15
  467. package/src/components/AmountInput/AmountInputEndAdornment.tsx +2 -21
  468. package/src/components/AmountInputCard/PercentageChips.tsx +2 -18
  469. package/src/components/AmountInputCard/ReceiveAmountCard.tsx +16 -3
  470. package/src/components/BottomSheet/BottomSheet.tsx +3 -0
  471. package/src/components/Chains/AllChainsAvatar.tsx +7 -1
  472. package/src/components/Messages/UnsupportedToAddressMessage.tsx +24 -0
  473. package/src/components/Messages/WarningMessages.tsx +3 -0
  474. package/src/components/Messages/useMessageQueue.ts +9 -0
  475. package/src/components/Routes/LimitOrderRoutes.tsx +5 -2
  476. package/src/components/Routes/RoutesContent.tsx +5 -2
  477. package/src/components/SendToWallet/SendToWalletExpandButton.tsx +2 -1
  478. package/src/components/Token/Token.tsx +2 -1
  479. package/src/components/TokenList/RecentTokensHeader.tsx +52 -0
  480. package/src/components/TokenList/RecentTokensToggle.tsx +45 -0
  481. package/src/components/TokenList/RemoveRecentTokenButton.tsx +38 -0
  482. package/src/components/TokenList/TokenList.tsx +92 -3
  483. package/src/components/TokenList/TokenListItem.tsx +83 -9
  484. package/src/components/TokenList/VirtualizedTokenList.tsx +86 -103
  485. package/src/components/TokenList/types.ts +13 -0
  486. package/src/config/version.ts +1 -1
  487. package/src/hooks/useAvailableChains.ts +1 -0
  488. package/src/hooks/useDisplayedTokens.ts +17 -3
  489. package/src/hooks/useExplorer.ts +2 -0
  490. package/src/hooks/useFlaggedTokenGuard.ts +33 -0
  491. package/src/hooks/useGasSufficiency.ts +9 -1
  492. package/src/hooks/useMaxSendAmount.ts +21 -0
  493. package/src/hooks/useRecentTokens.ts +88 -0
  494. package/src/hooks/useRoutes.ts +10 -0
  495. package/src/hooks/useToAddressRequirements.ts +23 -1
  496. package/src/hooks/useTokenBalances.ts +38 -19
  497. package/src/hooks/useTokenSearch.ts +6 -19
  498. package/src/hooks/useTokens.ts +97 -40
  499. package/src/pages/MainPage/ReviewButton.tsx +6 -2
  500. package/src/pages/RoutesPage/RoutesPage.tsx +5 -2
  501. package/src/pages/TransactionPage/TokenValueBottomSheet.tsx +1 -1
  502. package/src/pages/TransactionPage/TokenVerificationBottomSheet.tsx +93 -0
  503. package/src/pages/TransactionPage/TransactionFailedButtons.tsx +62 -26
  504. package/src/pages/TransactionPage/TransactionReview.tsx +51 -25
  505. package/src/pages/TransactionPage/utils.ts +78 -0
  506. package/src/providers/WalletProvider/useExternalWalletProvider.ts +9 -1
  507. package/src/stores/StoreProvider.tsx +10 -7
  508. package/src/stores/chains/ChainOrderStore.test.tsx +298 -0
  509. package/src/stores/chains/ChainOrderStore.tsx +25 -6
  510. package/src/stores/recentTokens/RecentTokensStore.tsx +39 -0
  511. package/src/stores/recentTokens/createRecentTokensStore.ts +107 -0
  512. package/src/stores/recentTokens/types.ts +37 -0
  513. package/src/stores/recentTokens/utils.ts +18 -0
  514. package/src/types/token.ts +8 -3
  515. package/src/types/widget.ts +5 -0
  516. package/src/utils/address.ts +21 -0
  517. package/src/utils/customReceiver.ts +31 -0
  518. package/src/utils/gas.ts +41 -0
  519. package/src/utils/recentTokens.ts +187 -0
  520. package/src/utils/token.ts +122 -19
  521. package/src/utils/tokenList.ts +60 -14
  522. package/src/utils/tokenListBands.ts +181 -0
@@ -4,7 +4,11 @@ import type { FC } from 'react'
4
4
  import { useCallback, useEffect, useMemo, useRef } from 'react'
5
5
  import { useTranslation } from 'react-i18next'
6
6
  import { useAvailableChains } from '../../hooks/useAvailableChains.js'
7
- import type { TokenAmount } from '../../types/token.js'
7
+ import { getTokenKey } from '../../stores/recentTokens/utils.js'
8
+ import { isHoistableNative } from '../../utils/tokenList.js'
9
+ import { createBandResolver } from '../../utils/tokenListBands.js'
10
+ import { RecentTokensHeader } from './RecentTokensHeader.js'
11
+ import { RecentTokensToggle } from './RecentTokensToggle.js'
8
12
  import { TokenDetailsSheet } from './TokenDetailsSheet.js'
9
13
  import { List } from './TokenList.style.js'
10
14
  import { TokenListItem, TokenListItemSkeleton } from './TokenListItem.js'
@@ -26,6 +30,13 @@ export const VirtualizedTokenList: FC<VirtualizedTokenListProps> = ({
26
30
  showPinnedTokens,
27
31
  onClick,
28
32
  isAllNetworks,
33
+ recentStartIndex = 0,
34
+ recentCount = 0,
35
+ hiddenRecentCount = 0,
36
+ recentExpanded = false,
37
+ onToggleRecent,
38
+ onClearRecent,
39
+ nativeHoisted,
29
40
  }) => {
30
41
  const { t } = useTranslation()
31
42
 
@@ -52,50 +63,65 @@ export const VirtualizedTokenList: FC<VirtualizedTokenListProps> = ({
52
63
  []
53
64
  )
54
65
 
66
+ // Rows below the band keep their key as it changes size, so none remount.
55
67
  const getItemKey = useCallback(
56
68
  (index: number) => {
57
69
  const token = tokens[index]
58
- return `${token.chainId}-${token.address}-${index}`
70
+ if (token.recent) {
71
+ return `recent-${token.chainId}-${token.address}`
72
+ }
73
+ const shift = index >= recentStartIndex + recentCount ? recentCount : 0
74
+ return `${token.chainId}-${token.address}-${index - shift}`
59
75
  },
60
- [tokens]
76
+ [tokens, recentStartIndex, recentCount]
61
77
  )
62
78
 
63
- const estimateSize = useCallback(
64
- (index: number) => {
65
- const currentToken = tokens[index]
66
- const previousToken = tokens[index - 1]
67
- let size = tokenItemHeight
68
-
69
- // Pinned tokens (always shown, even in all networks mode)
70
- if (currentToken.pinned && index === 0) {
71
- size += 24
72
- }
73
- if (previousToken?.pinned && !currentToken.pinned) {
74
- size += 32
75
- }
76
-
77
- if (!showCategories) {
78
- return size
79
- }
79
+ const resolvedNativeHoisted = useMemo(
80
+ () => nativeHoisted ?? isHoistableNative(tokens[0]),
81
+ [nativeHoisted, tokens]
82
+ )
80
83
 
81
- if (currentToken.featured && !currentToken.pinned && index === 0) {
82
- size += 24
83
- }
84
+ const showRecentToggle = recentCount > 0 && !!onToggleRecent
84
85
 
85
- // Category transition (excluding pinned tokens)
86
- const isNotPinned = !currentToken.pinned && !previousToken?.pinned
87
- if (
88
- isNotPinned &&
89
- ((previousToken?.amount && !currentToken.amount) ||
90
- (previousToken?.featured && !currentToken.featured) ||
91
- (previousToken?.popular && !currentToken.popular))
92
- ) {
93
- size += 32
86
+ // The band copy is on screen; its list row may be far below the fold.
87
+ const bandKeys = useMemo(() => {
88
+ if (!recentCount) {
89
+ return undefined
90
+ }
91
+ const keys = new Set<string>()
92
+ for (let i = recentStartIndex; i < recentStartIndex + recentCount; i++) {
93
+ const token = tokens[i]
94
+ if (token) {
95
+ keys.add(getTokenKey(token.chainId, token.address))
94
96
  }
97
+ }
98
+ return keys
99
+ }, [tokens, recentStartIndex, recentCount])
100
+
101
+ const bands = useMemo(
102
+ () =>
103
+ createBandResolver(tokens, {
104
+ showCategories: !!showCategories,
105
+ showPinnedTokens: !!showPinnedTokens,
106
+ nativeHoisted: resolvedNativeHoisted,
107
+ recentStartIndex,
108
+ recentCount,
109
+ showRecentToggle,
110
+ }),
111
+ [
112
+ tokens,
113
+ showCategories,
114
+ showPinnedTokens,
115
+ resolvedNativeHoisted,
116
+ recentStartIndex,
117
+ recentCount,
118
+ showRecentToggle,
119
+ ]
120
+ )
95
121
 
96
- return size
97
- },
98
- [tokens, showCategories]
122
+ const estimateSize = useCallback(
123
+ (index: number) => tokenItemHeight + bands.getRowExtraHeight(index),
124
+ [bands]
99
125
  )
100
126
 
101
127
  const virtualizerConfig = useMemo(
@@ -139,69 +165,16 @@ export const VirtualizedTokenList: FC<VirtualizedTokenListProps> = ({
139
165
  >
140
166
  {getVirtualItems().map((item) => {
141
167
  const currentToken = tokens[item.index]
142
- const previousToken: TokenAmount | undefined = tokens[item.index - 1]
143
168
  const chain = chainsSet?.get(currentToken.chainId)
144
-
145
- const isNotPinned = !currentToken.pinned
146
- const isFirstPinnedToken = currentToken.pinned && item.index === 0
147
- const isTransitionFromPinned = previousToken?.pinned && isNotPinned
148
-
149
- // Category transitions (excluding pinned)
150
- const isTransitionFromFeatured =
151
- previousToken?.featured && !currentToken.featured && isNotPinned
152
- const isTransitionFromMyTokens =
153
- previousToken?.amount && !currentToken.amount && isNotPinned
154
- const isTransitionFromPopular =
155
- previousToken?.popular && !currentToken.popular && isNotPinned
156
-
157
- // Determine which category label to show
158
- const startAdornmentLabel = (() => {
159
- if (showPinnedTokens && isFirstPinnedToken) {
160
- return t('main.pinnedTokens')
161
- }
162
- if (showPinnedTokens && !showCategories && isTransitionFromPinned) {
163
- return t('main.allTokens')
164
- }
165
- if (!showCategories) {
166
- return null
167
- }
168
-
169
- if (
170
- (isTransitionFromPinned && currentToken.featured) ||
171
- (currentToken.featured && isNotPinned && item.index === 0)
172
- ) {
173
- return t('main.featuredTokens')
174
- }
175
- if (
176
- (isTransitionFromFeatured || isTransitionFromPinned) &&
177
- currentToken.amount &&
178
- isNotPinned
179
- ) {
180
- return t('main.myTokens')
181
- }
182
- if (
183
- (isTransitionFromFeatured ||
184
- isTransitionFromMyTokens ||
185
- isTransitionFromPinned) &&
186
- currentToken.popular &&
187
- isNotPinned
188
- ) {
189
- return t('main.popularTokens')
190
- }
191
- if (
192
- isTransitionFromMyTokens ||
193
- isTransitionFromFeatured ||
194
- isTransitionFromPinned ||
195
- isTransitionFromPopular
196
- ) {
197
- return t('main.allTokens')
198
- }
199
- return null
200
- })()
169
+ const band = bands.getRowBandLabel(item.index)
201
170
 
202
171
  const isSelected =
203
172
  selectedTokenAddress === currentToken.address &&
204
- chainId === currentToken.chainId
173
+ chainId === currentToken.chainId &&
174
+ (!!currentToken.recent ||
175
+ !bandKeys?.has(
176
+ getTokenKey(currentToken.chainId, currentToken.address)
177
+ ))
205
178
 
206
179
  return (
207
180
  <TokenListItem
@@ -211,31 +184,41 @@ export const VirtualizedTokenList: FC<VirtualizedTokenListProps> = ({
211
184
  start={item.start}
212
185
  token={currentToken}
213
186
  chain={isAllNetworks ? chain : undefined}
187
+ chainName={chain?.name}
214
188
  selected={isSelected}
215
189
  onShowTokenDetails={onShowTokenDetails}
216
190
  isBalanceLoading={isBalanceLoading}
217
191
  startAdornment={
218
- startAdornmentLabel ? (
192
+ band?.kind === 'recent' ? (
193
+ // Unconditional: the resolver always reserves this height.
194
+ <RecentTokensHeader
195
+ atListStart={band.atListStart}
196
+ onClear={onClearRecent}
197
+ />
198
+ ) : band?.kind === 'text' ? (
219
199
  <Typography
220
200
  sx={{
221
201
  fontSize: 14,
222
202
  fontWeight: 600,
223
203
  lineHeight: '16px',
224
204
  px: 1.5,
225
- pt:
226
- isFirstPinnedToken ||
227
- (currentToken.featured &&
228
- isNotPinned &&
229
- item.index === 0)
230
- ? 0
231
- : 1,
205
+ pt: band.atListStart ? 0 : 1,
232
206
  pb: 1,
233
207
  }}
234
208
  >
235
- {startAdornmentLabel}
209
+ {t(band.key)}
236
210
  </Typography>
237
211
  ) : null
238
212
  }
213
+ endAdornment={
214
+ onToggleRecent && bands.isToggleRow(item.index) ? (
215
+ <RecentTokensToggle
216
+ expanded={recentExpanded}
217
+ hiddenCount={hiddenRecentCount}
218
+ onToggle={onToggleRecent}
219
+ />
220
+ ) : null
221
+ }
239
222
  />
240
223
  )
241
224
  })}
@@ -19,6 +19,15 @@ export interface VirtualizedTokenListProps {
19
19
  onClick(tokenAddress: string, chainId?: number): void
20
20
  selectedTokenAddress?: string
21
21
  isAllNetworks: boolean
22
+ // Optional: public via shared.ts, and widget-checkout passes none of these.
23
+ recentStartIndex?: number
24
+ recentCount?: number
25
+ hiddenRecentCount?: number
26
+ recentExpanded?: boolean
27
+ onToggleRecent?: () => void
28
+ onClearRecent?: () => void
29
+ /** Defaults to this component's own `isHoistableNative(tokens[0])`. */
30
+ nativeHoisted?: boolean
22
31
  }
23
32
 
24
33
  interface TokenListItemBaseProps {
@@ -35,6 +44,8 @@ export interface TokenListItemProps extends TokenListItemBaseProps {
35
44
  chainId: number
36
45
  ) => void
37
46
  chain?: ExtendedChain
47
+ /** Resolved for every row, unlike `chain`, which the list passes only in all-networks mode. */
48
+ chainName?: string
38
49
  isBalanceLoading?: boolean
39
50
  startAdornment?: React.ReactNode
40
51
  endAdornment?: React.ReactNode
@@ -50,6 +61,8 @@ export interface TokenListItemButtonProps {
50
61
  onClick?(tokenAddress: string, chainId?: number): void
51
62
  token: TokenAmount
52
63
  chain?: ExtendedChain
64
+ /** Resolved for every row, unlike `chain`, which the list passes only in all-networks mode. */
65
+ chainName?: string
53
66
  isBalanceLoading?: boolean
54
67
  selected?: boolean
55
68
  }
@@ -1,2 +1,2 @@
1
1
  export const name = '@lifi/widget'
2
- export const version = '4.5.0'
2
+ export const version = '4.7.0'
@@ -19,6 +19,7 @@ const supportedChainTypes = [
19
19
  ChainType.UTXO,
20
20
  ChainType.MVM,
21
21
  ChainType.TVM,
22
+ ChainType.STL,
22
23
  ]
23
24
 
24
25
  export const useAvailableChains = (
@@ -2,11 +2,13 @@ import type { TokenExtended } from '@lifi/sdk'
2
2
  import { useMemo } from 'react'
3
3
  import type { FormType } from '../stores/form/types.js'
4
4
  import { usePinnedTokensStore } from '../stores/pinnedTokens/PinnedTokensStore.js'
5
- import { isSearchMatch } from '../utils/tokenList.js'
5
+ import { createSearchMatcher } from '../utils/tokenList.js'
6
6
  import { useTokens } from './useTokens.js'
7
7
 
8
8
  export type IsPinnedToken = (chainId: number, tokenAddress: string) => boolean
9
9
 
10
+ export type MatchesSearch = ReturnType<typeof createSearchMatcher>
11
+
10
12
  // Balance-free core shared by useTokenList and useTokenBalances.
11
13
  export const useDisplayedTokens = (
12
14
  selectedChainId?: number,
@@ -17,6 +19,11 @@ export const useDisplayedTokens = (
17
19
  allTokens: Record<number, TokenExtended[]> | undefined
18
20
  displayedTokensList: TokenExtended[]
19
21
  isPinnedToken: IsPinnedToken | undefined
22
+ /**
23
+ * The filter this search applies, built once here so every list that shows
24
+ * the same search — with balances or without — cannot disagree with it.
25
+ */
26
+ matchesSearch: MatchesSearch
20
27
  isTokensLoading: boolean
21
28
  isSearchLoading: boolean
22
29
  } => {
@@ -24,6 +31,7 @@ export const useDisplayedTokens = (
24
31
  allTokens,
25
32
  isLoading: isTokensLoading,
26
33
  isSearchLoading,
34
+ isAddressSearch,
27
35
  } = useTokens(formType, search, isAllNetworks ? undefined : selectedChainId)
28
36
 
29
37
  const pinnedTokens = usePinnedTokensStore((state) => state.pinnedTokens)
@@ -51,19 +59,25 @@ export const useDisplayedTokens = (
51
59
  return undefined
52
60
  }, [isAllNetworks, selectedChainId, pinnedTokens])
53
61
 
62
+ const matchesSearch = useMemo<MatchesSearch>(
63
+ () => createSearchMatcher(search, isAddressSearch),
64
+ [search, isAddressSearch]
65
+ )
66
+
54
67
  const displayedTokensList = useMemo(() => {
55
68
  const tokensByChain = isAllNetworks
56
69
  ? Object.values(allTokens ?? {}).flat()
57
70
  : selectedChainId
58
71
  ? allTokens?.[selectedChainId]
59
72
  : undefined
60
- return tokensByChain?.filter((t) => isSearchMatch(t, search)) ?? []
61
- }, [allTokens, isAllNetworks, selectedChainId, search])
73
+ return tokensByChain?.filter(matchesSearch) ?? []
74
+ }, [allTokens, isAllNetworks, selectedChainId, matchesSearch])
62
75
 
63
76
  return {
64
77
  allTokens,
65
78
  displayedTokensList,
66
79
  isPinnedToken,
80
+ matchesSearch,
67
81
  isTokensLoading,
68
82
  isSearchLoading,
69
83
  }
@@ -13,6 +13,8 @@ const explorerPathOverrides: Partial<
13
13
  [ChainId.SUI]: { txPath: 'txblock', addressPath: 'coin' },
14
14
  [ChainId.LTR]: { txPath: 'logs', addressPath: 'accounts' },
15
15
  [ChainType.TVM]: { txPath: '#/transaction', addressPath: '#/address' },
16
+ // StellarExpert and steexp both route accounts at /account, never /address.
17
+ [ChainType.STL]: { txPath: 'tx', addressPath: 'account' },
16
18
  }
17
19
 
18
20
  type TransactionLinkProps = {
@@ -0,0 +1,33 @@
1
+ import type { RouteExtended, Token } from '@lifi/sdk'
2
+ import type { RefObject } from 'react'
3
+ import { useMemo, useRef } from 'react'
4
+ import type { BottomSheetBase } from '../components/BottomSheet/types.js'
5
+ import { getNativeTokenAddresses } from '../utils/token.js'
6
+ import { useAvailableChains } from './useAvailableChains.js'
7
+
8
+ /**
9
+ * Route tokens the screening provider flagged, and the sheet that warns about
10
+ * them before the transaction starts. A native token is exempt: the provider
11
+ * screens the native-address convention and calls it a scam on some chains.
12
+ */
13
+ export const useFlaggedTokenGuard = (
14
+ route: RouteExtended
15
+ ): {
16
+ flaggedTokens: Token[]
17
+ flaggedTokenSheetRef: RefObject<BottomSheetBase | null>
18
+ } => {
19
+ const { chains } = useAvailableChains()
20
+ const flaggedTokenSheetRef = useRef<BottomSheetBase>(null)
21
+
22
+ const flaggedTokens = useMemo(() => {
23
+ const nativeTokenAddresses = getNativeTokenAddresses(chains)
24
+ return [route.fromToken, route.toToken].filter(
25
+ (token) =>
26
+ token.verificationStatus === 'flagged' &&
27
+ nativeTokenAddresses.get(token.chainId)?.toLowerCase() !==
28
+ token.address.toLowerCase()
29
+ )
30
+ }, [chains, route.fromToken, route.toToken])
31
+
32
+ return { flaggedTokens, flaggedTokenSheetRef }
33
+ }
@@ -5,6 +5,7 @@ import { useQuery } from '@tanstack/react-query'
5
5
  import { useMemo } from 'react'
6
6
  import { useSDKClient } from '../providers/SDKClientProvider.js'
7
7
  import { useWidgetConfig } from '../providers/WidgetProvider/WidgetProvider.js'
8
+ import { getSelfFundedGasAmount } from '../utils/gas.js'
8
9
  import { getQueryKey } from '../utils/queries.js'
9
10
  import { useAvailableChains } from './useAvailableChains.js'
10
11
  import { useIsContractAddress } from './useIsContractAddress.js'
@@ -108,7 +109,14 @@ export const useGasSufficiency = (
108
109
  amount + BigInt(Number(gasCost.amount).toFixed(0)),
109
110
  0n
110
111
  )
111
- if (gasCostAmount > 0n) {
112
+ // A previous step can deliver this step's gas token (XLM bridged to
113
+ // Stellar), so the user does not have to hold it up front
114
+ const selfFundedGasAmount = getSelfFundedGasAmount(
115
+ route,
116
+ step,
117
+ getChainById(token.chainId)?.chainType
118
+ )
119
+ if (gasCostAmount > 0n && gasCostAmount > selfFundedGasAmount) {
112
120
  groupedGasCosts[token.chainId] = {
113
121
  gasAmount: groupedGasCosts[token.chainId]
114
122
  ? groupedGasCosts[token.chainId].gasAmount + gasCostAmount
@@ -0,0 +1,21 @@
1
+ import { useGasRecommendation } from './useGasRecommendation.js'
2
+ import { useTokenAddressBalance } from './useTokenAddressBalance.js'
3
+
4
+ // Largest amount of the token the wallet can send: for the native token that is
5
+ // the balance less the gas the chain recommends keeping back.
6
+ export const useMaxSendAmount = (
7
+ chainId?: number,
8
+ tokenAddress?: string
9
+ ): bigint => {
10
+ const { token, chain } = useTokenAddressBalance(chainId, tokenAddress)
11
+ const { data } = useGasRecommendation(chainId)
12
+
13
+ if (!token?.amount) {
14
+ return 0n
15
+ }
16
+ if (chain?.nativeToken.address !== tokenAddress) {
17
+ return token.amount
18
+ }
19
+ const reserved = BigInt(data?.recommended?.amount ?? 0)
20
+ return token.amount > reserved ? token.amount - reserved : token.amount
21
+ }
@@ -0,0 +1,88 @@
1
+ import { useMemo } from 'react'
2
+ import { useWidgetConfig } from '../providers/WidgetProvider/WidgetProvider.js'
3
+ import type { FormType } from '../stores/form/types.js'
4
+ import { useRecentTokensStore } from '../stores/recentTokens/RecentTokensStore.js'
5
+ import type { RecentTokenId } from '../stores/recentTokens/types.js'
6
+ import type { TokenAmount } from '../types/token.js'
7
+ import type { RecentTokensResult } from '../utils/recentTokens.js'
8
+ import { resolveRecentRows, spliceRecentRows } from '../utils/recentTokens.js'
9
+ import { useChains } from './useChains.js'
10
+
11
+ export interface UseRecentTokensOptions {
12
+ selectedChainId?: number
13
+ isAllNetworks?: boolean
14
+ search?: string
15
+ expanded: boolean
16
+ formType: FormType
17
+ isTokensLoading: boolean
18
+ nativeHoisted: boolean
19
+ }
20
+
21
+ export interface UseRecentTokensResult extends RecentTokensResult {
22
+ bandEntries: RecentTokenId[]
23
+ recentStartIndex: number
24
+ }
25
+
26
+ export const useRecentTokens = (
27
+ tokens: TokenAmount[],
28
+ {
29
+ selectedChainId,
30
+ isAllNetworks,
31
+ search,
32
+ expanded,
33
+ formType,
34
+ isTokensLoading,
35
+ nativeHoisted,
36
+ }: UseRecentTokensOptions
37
+ ): UseRecentTokensResult => {
38
+ const { hiddenUI, tokens: configTokens } = useWidgetConfig()
39
+ // useChains, not useAvailableChains: only it applies chains.allow/deny.
40
+ const { chains } = useChains(formType)
41
+ const recentTokens = useRecentTokensStore((state) => state.recentTokens)
42
+
43
+ const availableChainIds = useMemo(
44
+ () => new Set(chains?.map((chain) => chain.id)),
45
+ [chains]
46
+ )
47
+
48
+ // Untrimmed, like the list layout; wait for tokens (no amber flash) and chains.
49
+ const disabled =
50
+ !!search || !!hiddenUI?.recentSearches || isTokensLoading || !chains
51
+
52
+ const resolved = useMemo(
53
+ () =>
54
+ resolveRecentRows(tokens, {
55
+ recentTokens,
56
+ availableChainIds,
57
+ configTokens,
58
+ formType,
59
+ selectedChainId,
60
+ isAllNetworks,
61
+ nativeHoisted,
62
+ disabled,
63
+ }),
64
+ [
65
+ tokens,
66
+ recentTokens,
67
+ availableChainIds,
68
+ configTokens,
69
+ formType,
70
+ selectedChainId,
71
+ isAllNetworks,
72
+ nativeHoisted,
73
+ disabled,
74
+ ]
75
+ )
76
+
77
+ // Separate, so a Show more/less click redoes the slice but not the scan.
78
+ const spliced = useMemo(
79
+ () => spliceRecentRows(tokens, resolved, expanded),
80
+ [tokens, resolved, expanded]
81
+ )
82
+
83
+ return {
84
+ ...spliced,
85
+ bandEntries: resolved.bandEntries,
86
+ recentStartIndex: resolved.recentStartIndex,
87
+ }
88
+ }
@@ -29,6 +29,7 @@ import { defaultSlippage } from '../stores/settings/createSettingsStore.js'
29
29
  import { useSettings } from '../stores/settings/useSettings.js'
30
30
  import { WidgetEvent } from '../types/events.js'
31
31
  import type { TokensByChain } from '../types/token.js'
32
+ import { isCustomReceiverBlocked } from '../utils/customReceiver.js'
32
33
  import { getQueryKey } from '../utils/queries.js'
33
34
  import { updateTokenInCache } from '../utils/token.js'
34
35
  import { useChain } from './useChain.js'
@@ -177,6 +178,14 @@ export const useRoutes = ({
177
178
  ? hasToAddressAndChainTypeSatisfied
178
179
  : true
179
180
 
181
+ // Not `effectiveFromAddress`: a quote placeholder must never match a receiver.
182
+ const customReceiverBlocked = isCustomReceiverBlocked({
183
+ fromChainType: fromChain?.chainType,
184
+ toChainType: toChain?.chainType,
185
+ toAddress,
186
+ signerAddress: account.address,
187
+ })
188
+
180
189
  // toAddress might be an empty string, but we need to pass undefined if there is no value
181
190
  const toWalletAddress = toAddress || undefined
182
191
 
@@ -197,6 +206,7 @@ export const useRoutes = ({
197
206
  !Number.isNaN(slippage) &&
198
207
  hasAmount &&
199
208
  isToAddressSatisfied &&
209
+ !customReceiverBlocked &&
200
210
  contractCallQuoteEnabled &&
201
211
  !isBatchingSupportedLoading
202
212
 
@@ -4,12 +4,18 @@ import { useEthereumContext } from '@lifi/widget-provider'
4
4
  import { useChain } from '../hooks/useChain.js'
5
5
  import { useWidgetConfig } from '../providers/WidgetProvider/WidgetProvider.js'
6
6
  import { useFieldValues } from '../stores/form/useFieldValues.js'
7
+ import {
8
+ isCustomReceiverBlocked,
9
+ isCustomReceiverUnsupported,
10
+ } from '../utils/customReceiver.js'
7
11
  import { useIsContractAddress } from './useIsContractAddress.js'
8
12
 
9
13
  export const useToAddressRequirements = (
10
14
  route?: RouteExtended
11
15
  ): {
12
16
  requiredToAddress: boolean
17
+ unsupportedToAddress: boolean
18
+ unsupportedReceiverBlocking: boolean
13
19
  requiredToChainType: ChainType | undefined
14
20
  accountNotDeployedAtDestination: boolean
15
21
  accountDeployedAtDestination: boolean
@@ -68,11 +74,25 @@ export const useToAddressRequirements = (
68
74
  fromChainId !== toChainId &&
69
75
  !fromContractCodeHasDelegationIndicator
70
76
 
77
+ const unsupportedToAddress = isCustomReceiverUnsupported(
78
+ fromChain?.chainType,
79
+ toChain?.chainType
80
+ )
81
+
82
+ const unsupportedReceiverBlocking = isCustomReceiverBlocked({
83
+ fromChainType: fromChain?.chainType,
84
+ toChainType: toChain?.chainType,
85
+ toAddress,
86
+ signerAddress: fromAddress,
87
+ receiverRequired: requiredUI?.toAddress,
88
+ })
89
+
71
90
  const requiredToAddress = Boolean(
72
91
  (isDifferentChainType ||
73
92
  isCrossChainContractAddress ||
74
93
  requiredUI?.toAddress) &&
75
- !hiddenUI?.toAddress
94
+ !hiddenUI?.toAddress &&
95
+ !unsupportedToAddress
76
96
  )
77
97
 
78
98
  const accountNotDeployedAtDestination = Boolean(
@@ -91,6 +111,8 @@ export const useToAddressRequirements = (
91
111
 
92
112
  return {
93
113
  requiredToAddress,
114
+ unsupportedToAddress,
115
+ unsupportedReceiverBlocking,
94
116
  requiredToChainType: toChain?.chainType,
95
117
  accountNotDeployedAtDestination,
96
118
  accountDeployedAtDestination,