@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
@@ -1 +1 @@
1
- {"version":3,"file":"compactNumberFormatter.d.ts","names":[],"sources":["../../../src/utils/compactNumberFormatter.ts"],"mappings":";;;;;;;;;;cAyBa,yBACX,yBACA,mBACG"}
1
+ {"version":3,"file":"compactNumberFormatter.d.ts","names":[],"sources":["../../../src/utils/compactNumberFormatter.ts"],"mappings":";;;;;;;;;;qBAyBa,yBACX,yBACA,mBACG"}
@@ -45,9 +45,7 @@ const compactNumberFormatter = (lng, options) => {
45
45
  case "decimal":
46
46
  decimalSeparator = p.value;
47
47
  break;
48
- case "minusSign":
49
- minusSign = p.value;
50
- break;
48
+ case "minusSign": minusSign = p.value;
51
49
  }
52
50
  if (!fractionPart) return `${minusSign}${integerPart}`;
53
51
  const match = fractionPart.match(/^0+/);
@@ -1 +1 @@
1
- {"version":3,"file":"compactNumberFormatter.js","names":[],"sources":["../../../src/utils/compactNumberFormatter.ts"],"sourcesContent":["/**\n * Converts a non-negative integer to its subscript representation using Unicode subscript characters.\n * @param n - The number to convert to subscript\n * @returns A string where each digit is converted to its subscript equivalent\n * @example\n * toSubscript(5) => '₅'\n * toSubscript(10) => '₁₀'\n */\nfunction toSubscript(n: number): string {\n return n\n .toString()\n .split('')\n .map((digit) => String.fromCharCode(8320 + Number(digit)))\n .join('')\n}\n\n/**\n * Formats numbers with special handling for small decimal values, converting runs of leading zeros\n * into a more compact subscript notation.\n *\n * @param value - The numeric value to format (expected to be a string representing a BigInt)\n * @param lng - The locale string for number formatting\n * @param options - Formatting options including decimals and Intl.NumberFormat options\n * @returns A formatted string with subscript notation for leading zeros\n */\nexport const compactNumberFormatter = (\n lng: string | undefined,\n options: any\n): ((value: any) => string) => {\n const formatter = new Intl.NumberFormat(lng, {\n notation: 'standard',\n roundingPriority: 'morePrecision',\n maximumSignificantDigits: 20,\n maximumFractionDigits: 20,\n ...options,\n })\n return (value: any) => {\n if (!Number.parseFloat(value) || Number.isNaN(Number(value))) {\n return '0'\n }\n\n const parts = formatter.formatToParts(value as Intl.StringNumericLiteral)\n let integerPart = ''\n let fractionPart = ''\n let decimalSeparator = ''\n let minusSign = ''\n\n for (const p of parts) {\n switch (p.type) {\n case 'integer':\n case 'group':\n integerPart += p.value\n break\n case 'fraction':\n fractionPart += p.value\n break\n case 'decimal':\n decimalSeparator = p.value\n break\n case 'minusSign':\n minusSign = p.value\n break\n }\n }\n\n // For numbers with no decimal part, return early\n if (!fractionPart) {\n return `${minusSign}${integerPart}`\n }\n\n // Count consecutive leading zeros in the fraction part\n const match = fractionPart.match(/^0+/)\n const leadingZerosCount = match ? match[0].length : 0\n\n // For numbers with few leading zeros (≤ 3), format normally\n // but limit the total length and trim trailing zeros\n if (leadingZerosCount <= 3) {\n fractionPart = fractionPart.slice(0, 6).replace(/0+$/, '')\n return `${minusSign}${integerPart}${decimalSeparator}${fractionPart}`\n }\n\n // For numbers with many leading zeros (> 3), use subscript notation\n // Format: \"0.0₍number_of_zeros₎significant_digits\"\n const zerosSubscript = toSubscript(leadingZerosCount)\n const remainder = fractionPart\n .slice(leadingZerosCount, leadingZerosCount + 4)\n .replace(/0+$/, '')\n\n return `${minusSign}${integerPart}${decimalSeparator}0${zerosSubscript}${remainder}`\n }\n}\n"],"mappings":";;;;;;;;;AAQA,SAAS,YAAY,GAAmB;CACtC,OAAO,EACJ,SAAS,CAAC,CACV,MAAM,EAAE,CAAC,CACT,KAAK,UAAU,OAAO,aAAa,OAAO,OAAO,KAAK,CAAC,CAAC,CAAC,CACzD,KAAK,EAAE;AACZ;;;;;;;;;;AAWA,MAAa,0BACX,KACA,YAC6B;CAC7B,MAAM,YAAY,IAAI,KAAK,aAAa,KAAK;EAC3C,UAAU;EACV,kBAAkB;EAClB,0BAA0B;EAC1B,uBAAuB;EACvB,GAAG;CACL,CAAC;CACD,QAAQ,UAAe;EACrB,IAAI,CAAC,OAAO,WAAW,KAAK,KAAK,OAAO,MAAM,OAAO,KAAK,CAAC,GACzD,OAAO;EAGT,MAAM,QAAQ,UAAU,cAAc,KAAkC;EACxE,IAAI,cAAc;EAClB,IAAI,eAAe;EACnB,IAAI,mBAAmB;EACvB,IAAI,YAAY;EAEhB,KAAK,MAAM,KAAK,OACd,QAAQ,EAAE,MAAV;GACE,KAAK;GACL,KAAK;IACH,eAAe,EAAE;IACjB;GACF,KAAK;IACH,gBAAgB,EAAE;IAClB;GACF,KAAK;IACH,mBAAmB,EAAE;IACrB;GACF,KAAK;IACH,YAAY,EAAE;IACd;EACJ;EAIF,IAAI,CAAC,cACH,OAAO,GAAG,YAAY;EAIxB,MAAM,QAAQ,aAAa,MAAM,KAAK;EACtC,MAAM,oBAAoB,QAAQ,MAAM,EAAE,CAAC,SAAS;EAIpD,IAAI,qBAAqB,GAAG;GAC1B,eAAe,aAAa,MAAM,GAAG,CAAC,CAAC,CAAC,QAAQ,OAAO,EAAE;GACzD,OAAO,GAAG,YAAY,cAAc,mBAAmB;EACzD;EAIA,MAAM,iBAAiB,YAAY,iBAAiB;EACpD,MAAM,YAAY,aACf,MAAM,mBAAmB,oBAAoB,CAAC,CAAC,CAC/C,QAAQ,OAAO,EAAE;EAEpB,OAAO,GAAG,YAAY,cAAc,iBAAiB,GAAG,iBAAiB;CAC3E;AACF"}
1
+ {"version":3,"file":"compactNumberFormatter.js","names":[],"sources":["../../../src/utils/compactNumberFormatter.ts"],"sourcesContent":["/**\n * Converts a non-negative integer to its subscript representation using Unicode subscript characters.\n * @param n - The number to convert to subscript\n * @returns A string where each digit is converted to its subscript equivalent\n * @example\n * toSubscript(5) => '₅'\n * toSubscript(10) => '₁₀'\n */\nfunction toSubscript(n: number): string {\n return n\n .toString()\n .split('')\n .map((digit) => String.fromCharCode(8320 + Number(digit)))\n .join('')\n}\n\n/**\n * Formats numbers with special handling for small decimal values, converting runs of leading zeros\n * into a more compact subscript notation.\n *\n * @param value - The numeric value to format (expected to be a string representing a BigInt)\n * @param lng - The locale string for number formatting\n * @param options - Formatting options including decimals and Intl.NumberFormat options\n * @returns A formatted string with subscript notation for leading zeros\n */\nexport const compactNumberFormatter = (\n lng: string | undefined,\n options: any\n): ((value: any) => string) => {\n const formatter = new Intl.NumberFormat(lng, {\n notation: 'standard',\n roundingPriority: 'morePrecision',\n maximumSignificantDigits: 20,\n maximumFractionDigits: 20,\n ...options,\n })\n return (value: any) => {\n if (!Number.parseFloat(value) || Number.isNaN(Number(value))) {\n return '0'\n }\n\n const parts = formatter.formatToParts(value as Intl.StringNumericLiteral)\n let integerPart = ''\n let fractionPart = ''\n let decimalSeparator = ''\n let minusSign = ''\n\n for (const p of parts) {\n switch (p.type) {\n case 'integer':\n case 'group':\n integerPart += p.value\n break\n case 'fraction':\n fractionPart += p.value\n break\n case 'decimal':\n decimalSeparator = p.value\n break\n case 'minusSign':\n minusSign = p.value\n break\n }\n }\n\n // For numbers with no decimal part, return early\n if (!fractionPart) {\n return `${minusSign}${integerPart}`\n }\n\n // Count consecutive leading zeros in the fraction part\n const match = fractionPart.match(/^0+/)\n const leadingZerosCount = match ? match[0].length : 0\n\n // For numbers with few leading zeros (≤ 3), format normally\n // but limit the total length and trim trailing zeros\n if (leadingZerosCount <= 3) {\n fractionPart = fractionPart.slice(0, 6).replace(/0+$/, '')\n return `${minusSign}${integerPart}${decimalSeparator}${fractionPart}`\n }\n\n // For numbers with many leading zeros (> 3), use subscript notation\n // Format: \"0.0₍number_of_zeros₎significant_digits\"\n const zerosSubscript = toSubscript(leadingZerosCount)\n const remainder = fractionPart\n .slice(leadingZerosCount, leadingZerosCount + 4)\n .replace(/0+$/, '')\n\n return `${minusSign}${integerPart}${decimalSeparator}0${zerosSubscript}${remainder}`\n }\n}\n"],"mappings":";;;;;;;;;AAQA,SAAS,YAAY,GAAmB;CACtC,OAAO,EACJ,SAAS,CAAC,CACV,MAAM,EAAE,CAAC,CACT,KAAK,UAAU,OAAO,aAAa,OAAO,OAAO,KAAK,CAAC,CAAC,CAAC,CACzD,KAAK,EAAE;AACZ;;;;;;;;;;AAWA,MAAa,0BACX,KACA,YAC6B;CAC7B,MAAM,YAAY,IAAI,KAAK,aAAa,KAAK;EAC3C,UAAU;EACV,kBAAkB;EAClB,0BAA0B;EAC1B,uBAAuB;EACvB,GAAG;CACL,CAAC;CACD,QAAQ,UAAe;EACrB,IAAI,CAAC,OAAO,WAAW,KAAK,KAAK,OAAO,MAAM,OAAO,KAAK,CAAC,GACzD,OAAO;EAGT,MAAM,QAAQ,UAAU,cAAc,KAAkC;EACxE,IAAI,cAAc;EAClB,IAAI,eAAe;EACnB,IAAI,mBAAmB;EACvB,IAAI,YAAY;EAEhB,KAAK,MAAM,KAAK,OACd,QAAQ,EAAE,MAAV;GACE,KAAK;GACL,KAAK;IACH,eAAe,EAAE;IACjB;GACF,KAAK;IACH,gBAAgB,EAAE;IAClB;GACF,KAAK;IACH,mBAAmB,EAAE;IACrB;GACF,KAAK,aACH,YAAY,EAAE;EAElB;EAIF,IAAI,CAAC,cACH,OAAO,GAAG,YAAY;EAIxB,MAAM,QAAQ,aAAa,MAAM,KAAK;EACtC,MAAM,oBAAoB,QAAQ,MAAM,EAAE,CAAC,SAAS;EAIpD,IAAI,qBAAqB,GAAG;GAC1B,eAAe,aAAa,MAAM,GAAG,CAAC,CAAC,CAAC,QAAQ,OAAO,EAAE;GACzD,OAAO,GAAG,YAAY,cAAc,mBAAmB;EACzD;EAIA,MAAM,iBAAiB,YAAY,iBAAiB;EACpD,MAAM,YAAY,aACf,MAAM,mBAAmB,oBAAoB,CAAC,CAAC,CAC/C,QAAQ,OAAO,EAAE;EAEpB,OAAO,GAAG,YAAY,cAAc,iBAAiB,GAAG,iBAAiB;CAC3E;AACF"}
@@ -1,7 +1,6 @@
1
1
  import { RouteExecution } from "../stores/routes/types.js";
2
2
  import { FullStatusData, ToolsResponse } from "@lifi/sdk";
3
3
  //#region src/utils/converters.d.ts
4
- declare const buildRouteFromTxHistory: (tx: FullStatusData, tools?: ToolsResponse) => RouteExecution | undefined;
4
+ export declare const buildRouteFromTxHistory: (tx: FullStatusData, tools?: ToolsResponse) => RouteExecution | undefined;
5
5
  //#endregion
6
- export { buildRouteFromTxHistory };
7
6
  //# sourceMappingURL=converters.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"converters.d.ts","names":[],"sources":["../../../src/utils/converters.ts"],"mappings":";;;cAiEa,0BACX,IAAI,gBACJ,QAAQ,kBACP"}
1
+ {"version":3,"file":"converters.d.ts","names":[],"sources":["../../../src/utils/converters.ts"],"mappings":";;;qBAiEa,0BACX,IAAI,gBACJ,QAAQ,kBACP"}
@@ -1,5 +1,4 @@
1
1
  //#region src/utils/currencyExtendedFormatter.d.ts
2
- declare const currencyExtendedFormatter: (lng: string | undefined, options: any) => ((value: any) => string);
2
+ export declare const currencyExtendedFormatter: (lng: string | undefined, options: any) => ((value: any) => string);
3
3
  //#endregion
4
- export { currencyExtendedFormatter };
5
4
  //# sourceMappingURL=currencyExtendedFormatter.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"currencyExtendedFormatter.d.ts","names":[],"sources":["../../../src/utils/currencyExtendedFormatter.ts"],"mappings":";cAAa,4BACX,yBACA,mBACG"}
1
+ {"version":3,"file":"currencyExtendedFormatter.d.ts","names":[],"sources":["../../../src/utils/currencyExtendedFormatter.ts"],"mappings":";qBAAa,4BACX,yBACA,mBACG"}
@@ -0,0 +1,12 @@
1
+ import { ChainType } from "@lifi/sdk";
2
+ //#region src/utils/customReceiver.ts
3
+ const isCustomReceiverUnsupported = (fromChainType, toChainType) => fromChainType === ChainType.STL && toChainType === ChainType.STL;
4
+ const isCustomReceiverBlocked = ({ fromChainType, toChainType, toAddress, signerAddress, receiverRequired }) => {
5
+ if (!isCustomReceiverUnsupported(fromChainType, toChainType)) return false;
6
+ if (!toAddress) return Boolean(receiverRequired);
7
+ return toAddress.toLowerCase() !== signerAddress?.toLowerCase();
8
+ };
9
+ //#endregion
10
+ export { isCustomReceiverBlocked, isCustomReceiverUnsupported };
11
+
12
+ //# sourceMappingURL=customReceiver.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"customReceiver.js","names":[],"sources":["../../../src/utils/customReceiver.ts"],"sourcesContent":["import { ChainType } from '@lifi/sdk'\n\n// Stellar routes always settle to the account that signs them.\nexport const isCustomReceiverUnsupported = (\n fromChainType?: ChainType,\n toChainType?: ChainType\n): boolean => fromChainType === ChainType.STL && toChainType === ChainType.STL\n\nexport interface CustomReceiverBlockedArgs {\n fromChainType?: ChainType\n toChainType?: ChainType\n toAddress?: string\n signerAddress?: string\n receiverRequired?: boolean\n}\n\nexport const isCustomReceiverBlocked = ({\n fromChainType,\n toChainType,\n toAddress,\n signerAddress,\n receiverRequired,\n}: CustomReceiverBlockedArgs): boolean => {\n if (!isCustomReceiverUnsupported(fromChainType, toChainType)) {\n return false\n }\n if (!toAddress) {\n return Boolean(receiverRequired)\n }\n return toAddress.toLowerCase() !== signerAddress?.toLowerCase()\n}\n"],"mappings":";;AAGA,MAAa,+BACX,eACA,gBACY,kBAAkB,UAAU,OAAO,gBAAgB,UAAU;AAU3E,MAAa,2BAA2B,EACtC,eACA,aACA,WACA,eACA,uBACwC;CACxC,IAAI,CAAC,4BAA4B,eAAe,WAAW,GACzD,OAAO;CAET,IAAI,CAAC,WACH,OAAO,QAAQ,gBAAgB;CAEjC,OAAO,UAAU,YAAY,MAAM,eAAe,YAAY;AAChE"}
@@ -1,11 +1,10 @@
1
1
  //#region src/utils/elements.d.ts
2
- declare enum ElementId {
2
+ export declare enum ElementId {
3
3
  AppExpandedContainer = "widget-app-expanded-container",
4
4
  Header = "widget-header",
5
5
  RelativeContainer = "widget-relative-container",
6
6
  ScrollableContainer = "widget-scrollable-container"
7
7
  }
8
- declare const createElementId: (ElementId: ElementId, elementId: string) => string;
8
+ export declare const createElementId: (ElementId: ElementId, elementId: string) => string;
9
9
  //#endregion
10
- export { ElementId, createElementId };
11
10
  //# sourceMappingURL=elements.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"elements.d.ts","names":[],"sources":["../../../src/utils/elements.ts"],"mappings":";aAAY;EACV;EACA;EACA;EACA;;cAGW,kBACX,WAAW,WACX"}
1
+ {"version":3,"file":"elements.d.ts","names":[],"sources":["../../../src/utils/elements.ts"],"mappings":";oBAAY;EACV;EACA;EACA;EACA;;qBAGW,kBACX,WAAW,WACX"}
@@ -1,5 +1,4 @@
1
1
  //#region src/utils/enum.d.ts
2
- declare const hasEnumFlag: <T extends number | bigint>(flags: T, flag: T) => boolean;
2
+ export declare const hasEnumFlag: <T extends number | bigint>(flags: T, flag: T) => boolean;
3
3
  //#endregion
4
- export { hasEnumFlag };
5
4
  //# sourceMappingURL=enum.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"enum.d.ts","names":[],"sources":["../../../src/utils/enum.ts"],"mappings":";cAAa,cAAe,2BAC1B,OAAO,GACP,MAAM"}
1
+ {"version":3,"file":"enum.d.ts","names":[],"sources":["../../../src/utils/enum.ts"],"mappings":";qBAAa,cAAe,2BAC1B,OAAO,GACP,MAAM"}
@@ -1,11 +1,11 @@
1
1
  import { RouteExtended, Token } from "@lifi/sdk";
2
2
  //#region src/utils/fees.d.ts
3
- interface FeesBreakdown {
3
+ export interface FeesBreakdown {
4
4
  amount: bigint;
5
5
  amountUSD: number;
6
6
  token: Token;
7
7
  }
8
- declare const getAccumulatedFeeCostsBreakdown: (route: RouteExtended, included?: boolean) => {
8
+ export declare const getAccumulatedFeeCostsBreakdown: (route: RouteExtended, included?: boolean) => {
9
9
  gasCosts: FeesBreakdown[];
10
10
  feeCosts: FeesBreakdown[];
11
11
  gasCostUSD: number;
@@ -13,5 +13,4 @@ declare const getAccumulatedFeeCostsBreakdown: (route: RouteExtended, included?:
13
13
  combinedFeesUSD: number;
14
14
  };
15
15
  //#endregion
16
- export { FeesBreakdown, getAccumulatedFeeCostsBreakdown };
17
16
  //# sourceMappingURL=fees.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"fees.d.ts","names":[],"sources":["../../../src/utils/fees.ts"],"mappings":";;UAGiB;EACf;EACA;EACA,OAAO;;cAGI,kCACX,OAAO,eACP;EAEA,UAAU;EACV,UAAU;EACV;EACA;EACA"}
1
+ {"version":3,"file":"fees.d.ts","names":[],"sources":["../../../src/utils/fees.ts"],"mappings":";;iBAGiB;EACf;EACA;EACA,OAAO;;qBAGI,kCACX,OAAO,eACP;EAEA,UAAU;EACV,UAAU;EACV;EACA;EACA"}
@@ -1,12 +1,12 @@
1
1
  //#region src/utils/format.d.ts
2
- declare const usdDecimals = 2;
2
+ export declare const usdDecimals = 2;
3
3
  /**
4
4
  * Format token amount to at least 6 decimals.
5
5
  * @param amount amount to format.
6
6
  * @returns formatted amount.
7
7
  */
8
- declare function formatTokenAmount(amount: bigint | undefined, decimals: number): string;
9
- declare function formatSlippage(slippage?: string, defaultValue?: string, returnInitial?: boolean): string;
8
+ export declare function formatTokenAmount(amount: bigint | undefined, decimals: number): string;
9
+ export declare function formatSlippage(slippage?: string, defaultValue?: string, returnInitial?: boolean): string;
10
10
  /**
11
11
  * Formats a user input amount string, normalizing it and optionally limiting decimal places.
12
12
  * @param amount - The amount string to format (e.g., '123.45', '1,23', '0..')
@@ -16,14 +16,13 @@ declare function formatSlippage(slippage?: string, defaultValue?: string, return
16
16
  * format on blur (removes leading/trailing zeros, removes negative signs).
17
17
  * @returns The formatted amount string, or empty string for invalid input.
18
18
  */
19
- declare function formatInputAmount(amount: string, decimals?: number | null, returnInitial?: boolean): string;
20
- declare function formatTokenPrice(amount?: string | bigint, price?: string, decimals?: number): number;
19
+ export declare function formatInputAmount(amount: string, decimals?: number | null, returnInitial?: boolean): string;
20
+ export declare function formatTokenPrice(amount?: string | bigint, price?: string, decimals?: number): number;
21
21
  /**
22
22
  * Convert price value to token amount
23
23
  */
24
- declare function priceToTokenAmount(priceValue: string, priceUSD?: string): string;
25
- declare function formatDuration(seconds: number, locale: string, unitDisplay?: Intl.NumberFormatOptions["unitDisplay"]): string;
26
- declare function wrapLongWords(text: string): string;
24
+ export declare function priceToTokenAmount(priceValue: string, priceUSD?: string): string;
25
+ export declare function formatDuration(seconds: number, locale: string, unitDisplay?: Intl.NumberFormatOptions["unitDisplay"]): string;
26
+ export declare function wrapLongWords(text: string): string;
27
27
  //#endregion
28
- export { formatDuration, formatInputAmount, formatSlippage, formatTokenAmount, formatTokenPrice, priceToTokenAmount, usdDecimals, wrapLongWords };
29
28
  //# sourceMappingURL=format.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"format.d.ts","names":[],"sources":["../../../src/utils/format.ts"],"mappings":";cAEa;;;;;;iBAOG,kBACd,4BACA;iBAWc,eACd,mBACA,uBACA;;;;;;;;;;iBAiCc,kBACd,gBACA,0BACA;iBAqDc,iBACd,0BACA,gBACA;;;;iBA+Bc,mBACd,oBACA;iBA2Bc,eACd,iBACA,gBACA,cAAa,KAAK;iBAaJ,cAAc"}
1
+ {"version":3,"file":"format.d.ts","names":[],"sources":["../../../src/utils/format.ts"],"mappings":";qBAEa;;;;;;wBAOG,kBACd,4BACA;wBAWc,eACd,mBACA,uBACA;;;;;;;;;;wBAiCc,kBACd,gBACA,0BACA;wBAqDc,iBACd,0BACA,gBACA;;;;wBA+Bc,mBACd,oBACA;wBA2Bc,eACd,iBACA,gBACA,cAAa,KAAK;wBAaJ,cAAc"}
@@ -0,0 +1,24 @@
1
+ import { ChainType } from "@lifi/sdk";
2
+ //#region src/utils/gas.ts
3
+ /**
4
+ * Returns how much of a step's gas token the route itself delivers before that
5
+ * step runs. The previous step must output the gas token on the same chain, and
6
+ * whatever this step consumes as input is not available for gas.
7
+ * Stellar routes only — they bridge XLM to the receiver and hold back a buffer
8
+ * for the account reserve and the destination step fees.
9
+ */
10
+ const getSelfFundedGasAmount = (route, step, gasChainType) => {
11
+ if (gasChainType !== ChainType.STL) return 0n;
12
+ const gasToken = step.estimate.gasCosts?.[0]?.token;
13
+ const previousStep = route.steps[route.steps.indexOf(step) - 1];
14
+ if (!gasToken || !previousStep) return 0n;
15
+ const { toToken } = previousStep.action;
16
+ if (toToken.chainId !== gasToken.chainId || toToken.address.toLowerCase() !== gasToken.address.toLowerCase()) return 0n;
17
+ const deliveredAmount = BigInt(previousStep.estimate.toAmountMin);
18
+ const consumedAmount = step.action.fromToken.address.toLowerCase() === gasToken.address.toLowerCase() ? BigInt(step.action.fromAmount) : 0n;
19
+ return deliveredAmount > consumedAmount ? deliveredAmount - consumedAmount : 0n;
20
+ };
21
+ //#endregion
22
+ export { getSelfFundedGasAmount };
23
+
24
+ //# sourceMappingURL=gas.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"gas.js","names":[],"sources":["../../../src/utils/gas.ts"],"sourcesContent":["import type { LiFiStepExtended, RouteExtended } from '@lifi/sdk'\nimport { ChainType } from '@lifi/sdk'\n\n/**\n * Returns how much of a step's gas token the route itself delivers before that\n * step runs. The previous step must output the gas token on the same chain, and\n * whatever this step consumes as input is not available for gas.\n * Stellar routes only — they bridge XLM to the receiver and hold back a buffer\n * for the account reserve and the destination step fees.\n */\nexport const getSelfFundedGasAmount = (\n route: RouteExtended,\n step: LiFiStepExtended,\n gasChainType?: ChainType\n): bigint => {\n // TODO: remove the chain gate when the backend reserves gas on every chain\n if (gasChainType !== ChainType.STL) {\n return 0n\n }\n const gasToken = step.estimate.gasCosts?.[0]?.token\n const previousStep = route.steps[route.steps.indexOf(step) - 1]\n if (!gasToken || !previousStep) {\n return 0n\n }\n const { toToken } = previousStep.action\n if (\n toToken.chainId !== gasToken.chainId ||\n toToken.address.toLowerCase() !== gasToken.address.toLowerCase()\n ) {\n return 0n\n }\n const deliveredAmount = BigInt(previousStep.estimate.toAmountMin)\n const consumedAmount =\n step.action.fromToken.address.toLowerCase() ===\n gasToken.address.toLowerCase()\n ? BigInt(step.action.fromAmount)\n : 0n\n return deliveredAmount > consumedAmount\n ? deliveredAmount - consumedAmount\n : 0n\n}\n"],"mappings":";;;;;;;;;AAUA,MAAa,0BACX,OACA,MACA,iBACW;CAEX,IAAI,iBAAiB,UAAU,KAC7B,OAAO;CAET,MAAM,WAAW,KAAK,SAAS,WAAW,EAAE,EAAE;CAC9C,MAAM,eAAe,MAAM,MAAM,MAAM,MAAM,QAAQ,IAAI,IAAI;CAC7D,IAAI,CAAC,YAAY,CAAC,cAChB,OAAO;CAET,MAAM,EAAE,YAAY,aAAa;CACjC,IACE,QAAQ,YAAY,SAAS,WAC7B,QAAQ,QAAQ,YAAY,MAAM,SAAS,QAAQ,YAAY,GAE/D,OAAO;CAET,MAAM,kBAAkB,OAAO,aAAa,SAAS,WAAW;CAChE,MAAM,iBACJ,KAAK,OAAO,UAAU,QAAQ,YAAY,MAC1C,SAAS,QAAQ,YAAY,IACzB,OAAO,KAAK,OAAO,UAAU,IAC7B;CACN,OAAO,kBAAkB,iBACrB,kBAAkB,iBAClB;AACN"}
@@ -103,7 +103,6 @@ function getErrorMessage(t, getChainById, step, failedAction) {
103
103
  title = t("error.title.unknown");
104
104
  if (failedAction?.txHash) message = t("error.message.transactionFailed");
105
105
  else message = error.message || t("error.message.unknown");
106
- break;
107
106
  }
108
107
  message = wrapLongWords(message);
109
108
  return {
@@ -1 +1 @@
1
- {"version":3,"file":"getErrorMessage.js","names":[],"sources":["../../../src/utils/getErrorMessage.ts"],"sourcesContent":["import {\n type EVMChain,\n type ExecutionAction,\n LiFiErrorCode,\n type LiFiStepExtended,\n} from '@lifi/sdk'\nimport type { TFunction } from 'i18next'\nimport { formatTokenAmount, wrapLongWords } from '../utils/format.js'\n\nexport function getErrorMessage(\n t: TFunction,\n getChainById: (chainId: number) => EVMChain | undefined,\n step: LiFiStepExtended,\n failedAction?: ExecutionAction\n): { title: string; message: string } {\n const error = failedAction?.error\n if (!error) {\n return {\n title: t('error.title.unknown'),\n message: t('error.message.unknown'),\n }\n }\n\n const getDefaultErrorMessage = (key?: string) =>\n `${t((key as any) ?? 'error.message.transactionNotSent')} ${t(\n 'error.message.remainInYourWallet',\n {\n amount: formatTokenAmount(\n BigInt(step.action.fromAmount),\n step.action.fromToken.decimals\n ),\n tokenSymbol: step.action.fromToken.symbol,\n chainName: getChainById(step.action.fromChainId)?.name ?? '',\n }\n )}`\n\n let title = ''\n let message = ''\n switch (error.code) {\n case LiFiErrorCode.AllowanceRequired:\n title = t('error.title.allowanceRequired')\n message = t('error.message.allowanceRequired', {\n tokenSymbol: step.action.fromToken.symbol,\n })\n break\n case LiFiErrorCode.BalanceError:\n title = t('error.title.balanceIsTooLow')\n message = getDefaultErrorMessage()\n break\n case LiFiErrorCode.ChainSwitchError:\n title = t('error.title.chainSwitch')\n message = getDefaultErrorMessage()\n break\n case LiFiErrorCode.GasLimitError:\n title = t('error.title.gasLimitIsTooLow')\n message = getDefaultErrorMessage()\n break\n case LiFiErrorCode.InsufficientFunds:\n title = t('error.title.insufficientFunds')\n message = `${t(\n 'error.message.insufficientFunds'\n )} ${getDefaultErrorMessage()}`\n break\n case LiFiErrorCode.InsufficientGas:\n title = t('error.title.insufficientGas')\n message = `${t(\n 'error.message.insufficientFunds'\n )} ${getDefaultErrorMessage()}`\n break\n case LiFiErrorCode.SlippageError:\n title = t('error.title.slippageNotMet')\n message = t('error.message.slippageThreshold')\n break\n case LiFiErrorCode.TransactionFailed:\n title = t('error.title.transactionFailed')\n message = t('error.message.transactionFailed')\n break\n case LiFiErrorCode.TransactionExpired:\n title = t('error.title.transactionExpired')\n message = t('error.message.transactionExpired')\n break\n case LiFiErrorCode.TransactionSimulationFailed:\n title = t('error.title.transactionSimulationFailed')\n message = t('error.message.transactionSimulationFailed')\n break\n case LiFiErrorCode.WalletChangedDuringExecution:\n title = t('error.title.walletMismatch')\n message = t('error.message.walletChangedDuringExecution')\n break\n case LiFiErrorCode.RateLimitExceeded:\n title = t('error.title.rateLimitExceeded')\n message = t('error.message.rateLimitExceeded')\n break\n case LiFiErrorCode.ThirdPartyError:\n title = t('error.title.thirdPartyError')\n message = t('error.message.thirdPartyError')\n break\n case LiFiErrorCode.TransactionUnderpriced:\n title = t('error.title.transactionUnderpriced')\n message = getDefaultErrorMessage()\n break\n case LiFiErrorCode.TransactionUnprepared:\n title = t('error.title.transactionUnprepared')\n message = getDefaultErrorMessage()\n break\n case LiFiErrorCode.TransactionCanceled:\n title = t('error.title.transactionCanceled')\n message = getDefaultErrorMessage('error.message.transactionCanceled')\n break\n case LiFiErrorCode.TransactionRejected:\n title = t('error.title.transactionRejected')\n message = getDefaultErrorMessage('error.message.transactionRejected')\n break\n case LiFiErrorCode.TransactionConflict:\n title = t('error.title.transactionConflict')\n message = getDefaultErrorMessage('error.message.transactionConflict')\n break\n case LiFiErrorCode.ExchangeRateUpdateCanceled:\n title = t('error.title.exchangeRateUpdateCanceled')\n message = getDefaultErrorMessage()\n break\n case LiFiErrorCode.SignatureRejected:\n title = t('error.title.signatureRejected')\n message = t('error.message.signatureRejected', {\n amount: formatTokenAmount(\n BigInt(step.action.fromAmount),\n step.action.fromToken.decimals\n ),\n tokenSymbol: step.action.fromToken.symbol,\n chainName: getChainById(step.action.fromChainId)?.name ?? '',\n })\n break\n default:\n title = t('error.title.unknown')\n if (failedAction?.txHash) {\n message = t('error.message.transactionFailed')\n } else {\n message = error.message || t('error.message.unknown')\n }\n break\n }\n message = wrapLongWords(message)\n return { title, message }\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"getErrorMessage.js","names":[],"sources":["../../../src/utils/getErrorMessage.ts"],"sourcesContent":["import {\n type EVMChain,\n type ExecutionAction,\n LiFiErrorCode,\n type LiFiStepExtended,\n} from '@lifi/sdk'\nimport type { TFunction } from 'i18next'\nimport { formatTokenAmount, wrapLongWords } from '../utils/format.js'\n\nexport function getErrorMessage(\n t: TFunction,\n getChainById: (chainId: number) => EVMChain | undefined,\n step: LiFiStepExtended,\n failedAction?: ExecutionAction\n): { title: string; message: string } {\n const error = failedAction?.error\n if (!error) {\n return {\n title: t('error.title.unknown'),\n message: t('error.message.unknown'),\n }\n }\n\n const getDefaultErrorMessage = (key?: string) =>\n `${t((key as any) ?? 'error.message.transactionNotSent')} ${t(\n 'error.message.remainInYourWallet',\n {\n amount: formatTokenAmount(\n BigInt(step.action.fromAmount),\n step.action.fromToken.decimals\n ),\n tokenSymbol: step.action.fromToken.symbol,\n chainName: getChainById(step.action.fromChainId)?.name ?? '',\n }\n )}`\n\n let title = ''\n let message = ''\n switch (error.code) {\n case LiFiErrorCode.AllowanceRequired:\n title = t('error.title.allowanceRequired')\n message = t('error.message.allowanceRequired', {\n tokenSymbol: step.action.fromToken.symbol,\n })\n break\n case LiFiErrorCode.BalanceError:\n title = t('error.title.balanceIsTooLow')\n message = getDefaultErrorMessage()\n break\n case LiFiErrorCode.ChainSwitchError:\n title = t('error.title.chainSwitch')\n message = getDefaultErrorMessage()\n break\n case LiFiErrorCode.GasLimitError:\n title = t('error.title.gasLimitIsTooLow')\n message = getDefaultErrorMessage()\n break\n case LiFiErrorCode.InsufficientFunds:\n title = t('error.title.insufficientFunds')\n message = `${t(\n 'error.message.insufficientFunds'\n )} ${getDefaultErrorMessage()}`\n break\n case LiFiErrorCode.InsufficientGas:\n title = t('error.title.insufficientGas')\n message = `${t(\n 'error.message.insufficientFunds'\n )} ${getDefaultErrorMessage()}`\n break\n case LiFiErrorCode.SlippageError:\n title = t('error.title.slippageNotMet')\n message = t('error.message.slippageThreshold')\n break\n case LiFiErrorCode.TransactionFailed:\n title = t('error.title.transactionFailed')\n message = t('error.message.transactionFailed')\n break\n case LiFiErrorCode.TransactionExpired:\n title = t('error.title.transactionExpired')\n message = t('error.message.transactionExpired')\n break\n case LiFiErrorCode.TransactionSimulationFailed:\n title = t('error.title.transactionSimulationFailed')\n message = t('error.message.transactionSimulationFailed')\n break\n case LiFiErrorCode.WalletChangedDuringExecution:\n title = t('error.title.walletMismatch')\n message = t('error.message.walletChangedDuringExecution')\n break\n case LiFiErrorCode.RateLimitExceeded:\n title = t('error.title.rateLimitExceeded')\n message = t('error.message.rateLimitExceeded')\n break\n case LiFiErrorCode.ThirdPartyError:\n title = t('error.title.thirdPartyError')\n message = t('error.message.thirdPartyError')\n break\n case LiFiErrorCode.TransactionUnderpriced:\n title = t('error.title.transactionUnderpriced')\n message = getDefaultErrorMessage()\n break\n case LiFiErrorCode.TransactionUnprepared:\n title = t('error.title.transactionUnprepared')\n message = getDefaultErrorMessage()\n break\n case LiFiErrorCode.TransactionCanceled:\n title = t('error.title.transactionCanceled')\n message = getDefaultErrorMessage('error.message.transactionCanceled')\n break\n case LiFiErrorCode.TransactionRejected:\n title = t('error.title.transactionRejected')\n message = getDefaultErrorMessage('error.message.transactionRejected')\n break\n case LiFiErrorCode.TransactionConflict:\n title = t('error.title.transactionConflict')\n message = getDefaultErrorMessage('error.message.transactionConflict')\n break\n case LiFiErrorCode.ExchangeRateUpdateCanceled:\n title = t('error.title.exchangeRateUpdateCanceled')\n message = getDefaultErrorMessage()\n break\n case LiFiErrorCode.SignatureRejected:\n title = t('error.title.signatureRejected')\n message = t('error.message.signatureRejected', {\n amount: formatTokenAmount(\n BigInt(step.action.fromAmount),\n step.action.fromToken.decimals\n ),\n tokenSymbol: step.action.fromToken.symbol,\n chainName: getChainById(step.action.fromChainId)?.name ?? '',\n })\n break\n default:\n title = t('error.title.unknown')\n if (failedAction?.txHash) {\n message = t('error.message.transactionFailed')\n } else {\n message = error.message || t('error.message.unknown')\n }\n break\n }\n message = wrapLongWords(message)\n return { title, message }\n}\n"],"mappings":"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"}
@@ -6,7 +6,6 @@ interface GetPriceImpactProps {
6
6
  fromAmount?: bigint;
7
7
  toAmount?: bigint;
8
8
  }
9
- declare const getPriceImpact: ({ fromToken, toToken, fromAmount, toAmount }: GetPriceImpactProps) => number;
9
+ export declare const getPriceImpact: ({ fromToken, toToken, fromAmount, toAmount }: GetPriceImpactProps) => number;
10
10
  //#endregion
11
- export { getPriceImpact };
12
11
  //# sourceMappingURL=getPriceImpact.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"getPriceImpact.d.ts","names":[],"sources":["../../../src/utils/getPriceImpact.ts"],"mappings":";;UAGU;EACR,WAAW;EACX,SAAS;EACT;EACA;;cAGW,mBACX,WACA,SACA,YACA,YACC"}
1
+ {"version":3,"file":"getPriceImpact.d.ts","names":[],"sources":["../../../src/utils/getPriceImpact.ts"],"mappings":";;UAGU;EACR,WAAW;EACX,SAAS;EACT;EACA;;qBAGW,mBACX,WACA,SACA,YACA,YACC"}
@@ -1,5 +1,4 @@
1
1
  //#region src/utils/input.d.ts
2
- declare const fitInputText: (maxFontSize: number, minFontSize: number, element: HTMLElement) => void;
2
+ export declare const fitInputText: (maxFontSize: number, minFontSize: number, element: HTMLElement) => void;
3
3
  //#endregion
4
- export { fitInputText };
5
4
  //# sourceMappingURL=input.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"input.d.ts","names":[],"sources":["../../../src/utils/input.ts"],"mappings":";cAAa,eACX,qBACA,qBACA,SAAS"}
1
+ {"version":3,"file":"input.d.ts","names":[],"sources":["../../../src/utils/input.ts"],"mappings":";qBAAa,eACX,qBACA,qBACA,SAAS"}
@@ -1,7 +1,7 @@
1
1
  import { formatInputAmount } from "./format.js";
2
2
  //#region src/utils/limitOrder.ts
3
3
  /** Default order validity: 1 day, expressed as a duration in seconds. */
4
- const DEFAULT_VALID_UNTIL_SECONDS = 1440 * 60;
4
+ const DEFAULT_VALID_UNTIL_SECONDS = 86400;
5
5
  /**
6
6
  * High-precision formatter for derived limit-order values. Mirrors the
7
7
  * approach used by `priceToTokenAmount` — these are display-level derivations;
@@ -1 +1 @@
1
- {"version":3,"file":"limitOrder.js","names":[],"sources":["../../../src/utils/limitOrder.ts"],"sourcesContent":["import { formatInputAmount } from './format.js'\n\n/** Default order validity: 1 day, expressed as a duration in seconds. */\nexport const DEFAULT_VALID_UNTIL_SECONDS: number = 24 * 60 * 60\n\n/**\n * High-precision formatter for derived limit-order values. Mirrors the\n * approach used by `priceToTokenAmount` — these are display-level derivations;\n * the route request re-parses amounts via `parseUnits`.\n */\nconst preciseFormatter = new Intl.NumberFormat('en', {\n notation: 'standard',\n roundingPriority: 'morePrecision',\n maximumSignificantDigits: 20,\n maximumFractionDigits: 20,\n useGrouping: false,\n})\n\nfunction parsePositive(value?: string): number | undefined {\n if (!value) {\n return undefined\n }\n const parsed = Number.parseFloat(value)\n if (Number.isNaN(parsed) || parsed <= 0) {\n return undefined\n }\n return parsed\n}\n\n/**\n * Derive the receive amount: `receiveAmount = sendAmount × limitPrice`.\n * Returns an empty string when either input is missing or invalid.\n */\nexport function deriveReceiveAmount(\n sendAmount?: string,\n limitPrice?: string,\n toDecimals?: number\n): string {\n const send = parsePositive(sendAmount)\n const price = parsePositive(limitPrice)\n if (send === undefined || price === undefined) {\n return ''\n }\n return formatInputAmount(\n preciseFormatter.format(send * price),\n toDecimals ?? null\n )\n}\n\n/**\n * Derive the limit price: `limitPrice = receiveAmount ÷ sendAmount`.\n * Returns an empty string when either input is missing or invalid.\n */\nexport function deriveLimitPrice(\n sendAmount?: string,\n receiveAmount?: string\n): string {\n const send = parsePositive(sendAmount)\n const receive = parsePositive(receiveAmount)\n if (send === undefined || receive === undefined) {\n return ''\n }\n return preciseFormatter.format(receive / send)\n}\n\n/** Invert a price for display flipping: `1 ÷ price`. */\nexport function invertPrice(price?: string): string {\n const parsed = parsePositive(price)\n if (parsed === undefined) {\n return ''\n }\n return preciseFormatter.format(1 / parsed)\n}\n\n/**\n * Apply a percentage offset to a price, e.g. `percent = 2` → `price × 1.02`.\n * Used by the quick-set buttons (+2%, +5%).\n */\nexport function applyPriceOffset(\n price: string | undefined,\n percent: number\n): string {\n const parsed = parsePositive(price)\n if (parsed === undefined) {\n return ''\n }\n return preciseFormatter.format(parsed * (1 + percent / 100))\n}\n"],"mappings":";;;AAGA,MAAa,8BAAsC,OAAU;;;;;;AAO7D,MAAM,mBAAmB,IAAI,KAAK,aAAa,MAAM;CACnD,UAAU;CACV,kBAAkB;CAClB,0BAA0B;CAC1B,uBAAuB;CACvB,aAAa;AACf,CAAC;AAED,SAAS,cAAc,OAAoC;CACzD,IAAI,CAAC,OACH;CAEF,MAAM,SAAS,OAAO,WAAW,KAAK;CACtC,IAAI,OAAO,MAAM,MAAM,KAAK,UAAU,GACpC;CAEF,OAAO;AACT;;;;;AAMA,SAAgB,oBACd,YACA,YACA,YACQ;CACR,MAAM,OAAO,cAAc,UAAU;CACrC,MAAM,QAAQ,cAAc,UAAU;CACtC,IAAI,SAAS,KAAA,KAAa,UAAU,KAAA,GAClC,OAAO;CAET,OAAO,kBACL,iBAAiB,OAAO,OAAO,KAAK,GACpC,cAAc,IAChB;AACF;;;;;AAMA,SAAgB,iBACd,YACA,eACQ;CACR,MAAM,OAAO,cAAc,UAAU;CACrC,MAAM,UAAU,cAAc,aAAa;CAC3C,IAAI,SAAS,KAAA,KAAa,YAAY,KAAA,GACpC,OAAO;CAET,OAAO,iBAAiB,OAAO,UAAU,IAAI;AAC/C;;AAGA,SAAgB,YAAY,OAAwB;CAClD,MAAM,SAAS,cAAc,KAAK;CAClC,IAAI,WAAW,KAAA,GACb,OAAO;CAET,OAAO,iBAAiB,OAAO,IAAI,MAAM;AAC3C;;;;;AAMA,SAAgB,iBACd,OACA,SACQ;CACR,MAAM,SAAS,cAAc,KAAK;CAClC,IAAI,WAAW,KAAA,GACb,OAAO;CAET,OAAO,iBAAiB,OAAO,UAAU,IAAI,UAAU,IAAI;AAC7D"}
1
+ {"version":3,"file":"limitOrder.js","names":[],"sources":["../../../src/utils/limitOrder.ts"],"sourcesContent":["import { formatInputAmount } from './format.js'\n\n/** Default order validity: 1 day, expressed as a duration in seconds. */\nexport const DEFAULT_VALID_UNTIL_SECONDS: number = 24 * 60 * 60\n\n/**\n * High-precision formatter for derived limit-order values. Mirrors the\n * approach used by `priceToTokenAmount` — these are display-level derivations;\n * the route request re-parses amounts via `parseUnits`.\n */\nconst preciseFormatter = new Intl.NumberFormat('en', {\n notation: 'standard',\n roundingPriority: 'morePrecision',\n maximumSignificantDigits: 20,\n maximumFractionDigits: 20,\n useGrouping: false,\n})\n\nfunction parsePositive(value?: string): number | undefined {\n if (!value) {\n return undefined\n }\n const parsed = Number.parseFloat(value)\n if (Number.isNaN(parsed) || parsed <= 0) {\n return undefined\n }\n return parsed\n}\n\n/**\n * Derive the receive amount: `receiveAmount = sendAmount × limitPrice`.\n * Returns an empty string when either input is missing or invalid.\n */\nexport function deriveReceiveAmount(\n sendAmount?: string,\n limitPrice?: string,\n toDecimals?: number\n): string {\n const send = parsePositive(sendAmount)\n const price = parsePositive(limitPrice)\n if (send === undefined || price === undefined) {\n return ''\n }\n return formatInputAmount(\n preciseFormatter.format(send * price),\n toDecimals ?? null\n )\n}\n\n/**\n * Derive the limit price: `limitPrice = receiveAmount ÷ sendAmount`.\n * Returns an empty string when either input is missing or invalid.\n */\nexport function deriveLimitPrice(\n sendAmount?: string,\n receiveAmount?: string\n): string {\n const send = parsePositive(sendAmount)\n const receive = parsePositive(receiveAmount)\n if (send === undefined || receive === undefined) {\n return ''\n }\n return preciseFormatter.format(receive / send)\n}\n\n/** Invert a price for display flipping: `1 ÷ price`. */\nexport function invertPrice(price?: string): string {\n const parsed = parsePositive(price)\n if (parsed === undefined) {\n return ''\n }\n return preciseFormatter.format(1 / parsed)\n}\n\n/**\n * Apply a percentage offset to a price, e.g. `percent = 2` → `price × 1.02`.\n * Used by the quick-set buttons (+2%, +5%).\n */\nexport function applyPriceOffset(\n price: string | undefined,\n percent: number\n): string {\n const parsed = parsePositive(price)\n if (parsed === undefined) {\n return ''\n }\n return preciseFormatter.format(parsed * (1 + percent / 100))\n}\n"],"mappings":";;;AAGA,MAAa,8BAAsC;;;;;;AAOnD,MAAM,mBAAmB,IAAI,KAAK,aAAa,MAAM;CACnD,UAAU;CACV,kBAAkB;CAClB,0BAA0B;CAC1B,uBAAuB;CACvB,aAAa;AACf,CAAC;AAED,SAAS,cAAc,OAAoC;CACzD,IAAI,CAAC,OACH;CAEF,MAAM,SAAS,OAAO,WAAW,KAAK;CACtC,IAAI,OAAO,MAAM,MAAM,KAAK,UAAU,GACpC;CAEF,OAAO;AACT;;;;;AAMA,SAAgB,oBACd,YACA,YACA,YACQ;CACR,MAAM,OAAO,cAAc,UAAU;CACrC,MAAM,QAAQ,cAAc,UAAU;CACtC,IAAI,SAAS,KAAA,KAAa,UAAU,KAAA,GAClC,OAAO;CAET,OAAO,kBACL,iBAAiB,OAAO,OAAO,KAAK,GACpC,cAAc,IAChB;AACF;;;;;AAMA,SAAgB,iBACd,YACA,eACQ;CACR,MAAM,OAAO,cAAc,UAAU;CACrC,MAAM,UAAU,cAAc,aAAa;CAC3C,IAAI,SAAS,KAAA,KAAa,YAAY,KAAA,GACpC,OAAO;CAET,OAAO,iBAAiB,OAAO,UAAU,IAAI;AAC/C;;AAGA,SAAgB,YAAY,OAAwB;CAClD,MAAM,SAAS,cAAc,KAAK;CAClC,IAAI,WAAW,KAAA,GACb,OAAO;CAET,OAAO,iBAAiB,OAAO,IAAI,MAAM;AAC3C;;;;;AAMA,SAAgB,iBACd,OACA,SACQ;CACR,MAAM,SAAS,cAAc,KAAK;CAClC,IAAI,WAAW,KAAA,GACb,OAAO;CAET,OAAO,iBAAiB,OAAO,UAAU,IAAI,UAAU,IAAI;AAC7D"}
@@ -1,5 +1,5 @@
1
1
  //#region src/utils/navigationRoutes.d.ts
2
- declare const navigationRoutes: {
2
+ export declare const navigationRoutes: {
3
3
  home: string;
4
4
  activities: string;
5
5
  bridges: string;
@@ -23,7 +23,6 @@ declare const navigationRoutes: {
23
23
  configuredWallets: string;
24
24
  };
25
25
  type NavigationRouteTypeKeys = keyof typeof navigationRoutes;
26
- type NavigationRouteType = (typeof navigationRoutes)[NavigationRouteTypeKeys];
26
+ export type NavigationRouteType = (typeof navigationRoutes)[NavigationRouteTypeKeys];
27
27
  //#endregion
28
- export { NavigationRouteType, navigationRoutes };
29
28
  //# sourceMappingURL=navigationRoutes.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"navigationRoutes.d.ts","names":[],"sources":["../../../src/utils/navigationRoutes.ts"],"mappings":";cAAa;EACX;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;KAiDG,uCAAuC;KAEhC,8BACF,kBAAkB"}
1
+ {"version":3,"file":"navigationRoutes.d.ts","names":[],"sources":["../../../src/utils/navigationRoutes.ts"],"mappings":";qBAAa;EACX;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;KAiDG,uCAAuC;YAEhC,8BACF,kBAAkB"}
@@ -5,7 +5,6 @@
5
5
  * +0.007% -> <0.01%
6
6
  * -0.003% -> <0.01%
7
7
  */
8
- declare const percentFormatter: (lng: string | undefined, options: any) => ((value: any) => string);
8
+ export declare const percentFormatter: (lng: string | undefined, options: any) => ((value: any) => string);
9
9
  //#endregion
10
- export { percentFormatter };
11
10
  //# sourceMappingURL=percentFormatter.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"percentFormatter.d.ts","names":[],"sources":["../../../src/utils/percentFormatter.ts"],"mappings":";;;;;;;cAMa,mBACX,yBACA,mBACG"}
1
+ {"version":3,"file":"percentFormatter.d.ts","names":[],"sources":["../../../src/utils/percentFormatter.ts"],"mappings":";;;;;;;qBAMa,mBACX,yBACA,mBACG"}
@@ -0,0 +1,97 @@
1
+ import { isFormItemAllowed } from "./item.js";
2
+ import { getChainTokenAllowSets } from "./token.js";
3
+ import { getTokenKey } from "../stores/recentTokens/utils.js";
4
+ const toSnapshotRow = (recent) => ({
5
+ chainId: recent.chainId,
6
+ address: recent.address,
7
+ symbol: recent.symbol,
8
+ name: recent.name,
9
+ decimals: recent.decimals,
10
+ logoURI: recent.logoURI,
11
+ priceUSD: "",
12
+ verificationStatus: recent.flagged ? "flagged" : void 0
13
+ });
14
+ const isFeaturedCopy = (token) => !!token.featured && !token.amount;
15
+ const resolveRecentRows = (tokens, { recentTokens, availableChainIds, configTokens, formType, selectedChainId, isAllNetworks, nativeHoisted, disabled }) => {
16
+ let recentStartIndex = nativeHoisted ? 1 : 0;
17
+ while (tokens[recentStartIndex]?.pinned) recentStartIndex++;
18
+ const inactive = {
19
+ rows: [],
20
+ bandEntries: [],
21
+ recentStartIndex
22
+ };
23
+ if (disabled || !recentTokens.length || !tokens.length) return inactive;
24
+ const candidates = recentTokens.filter((recent) => (isAllNetworks || recent.chainId === selectedChainId) && availableChainIds.has(recent.chainId));
25
+ if (!candidates.length) return inactive;
26
+ const wanted = new Set(candidates.map((recent) => getTokenKey(recent.chainId, recent.address)));
27
+ const wantedChains = new Set(candidates.map((recent) => recent.chainId));
28
+ const fresh = /* @__PURE__ */ new Map();
29
+ let awaitingBalance = 0;
30
+ for (const token of tokens) {
31
+ if (!wantedChains.has(token.chainId)) continue;
32
+ const key = getTokenKey(token.chainId, token.address);
33
+ if (!wanted.has(key)) continue;
34
+ const found = fresh.get(key);
35
+ if (!found) {
36
+ fresh.set(key, token);
37
+ if (isFeaturedCopy(token)) awaitingBalance++;
38
+ } else if (token.amount && isFeaturedCopy(found)) {
39
+ fresh.set(key, {
40
+ ...found,
41
+ amount: token.amount,
42
+ priceUSD: token.priceUSD || found.priceUSD
43
+ });
44
+ awaitingBalance--;
45
+ }
46
+ if (fresh.size === wanted.size && !awaitingBalance) break;
47
+ }
48
+ const allowedByChain = /* @__PURE__ */ new Map();
49
+ const allowedFor = (chainId) => {
50
+ if (!allowedByChain.has(chainId)) allowedByChain.set(chainId, getChainTokenAllowSets(configTokens, chainId, formType));
51
+ return allowedByChain.get(chainId);
52
+ };
53
+ const hoistedKey = nativeHoisted ? getTokenKey(tokens[0].chainId, tokens[0].address) : void 0;
54
+ const rows = [];
55
+ const bandEntries = [];
56
+ for (const recent of candidates) {
57
+ const key = getTokenKey(recent.chainId, recent.address);
58
+ const resolved = fresh.get(key) ?? toSnapshotRow(recent);
59
+ if (!isFormItemAllowed(resolved, allowedFor(recent.chainId), formType, (t) => t.address.toLowerCase())) continue;
60
+ bandEntries.push({
61
+ chainId: recent.chainId,
62
+ address: recent.address
63
+ });
64
+ if (key === hoistedKey || resolved.pinned) continue;
65
+ rows.push({
66
+ ...resolved,
67
+ recent: true
68
+ });
69
+ }
70
+ if (!rows.length) return inactive;
71
+ return {
72
+ rows,
73
+ bandEntries,
74
+ recentStartIndex
75
+ };
76
+ };
77
+ const spliceRecentRows = (tokens, { rows, recentStartIndex }, expanded) => {
78
+ if (!rows.length) return {
79
+ tokens,
80
+ recentCount: 0,
81
+ totalRecentCount: 0
82
+ };
83
+ const visible = expanded ? rows : rows.slice(0, 4);
84
+ return {
85
+ tokens: [
86
+ ...tokens.slice(0, recentStartIndex),
87
+ ...visible,
88
+ ...tokens.slice(recentStartIndex)
89
+ ],
90
+ recentCount: visible.length,
91
+ totalRecentCount: rows.length
92
+ };
93
+ };
94
+ //#endregion
95
+ export { resolveRecentRows, spliceRecentRows };
96
+
97
+ //# sourceMappingURL=recentTokens.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"recentTokens.js","names":[],"sources":["../../../src/utils/recentTokens.ts"],"sourcesContent":["import type { FormType } from '../stores/form/types.js'\nimport type {\n RecentToken,\n RecentTokenId,\n} from '../stores/recentTokens/types.js'\nimport { getTokenKey } from '../stores/recentTokens/utils.js'\nimport type { TokenAmount } from '../types/token.js'\nimport type { AllowDenySets, WidgetTokens } from '../types/widget.js'\nimport { isFormItemAllowed } from './item.js'\nimport { getChainTokenAllowSets } from './token.js'\n\nexport const collapsedRecentCount = 4\n\nexport interface ResolveRecentRowsParams {\n recentTokens: RecentToken[]\n availableChainIds: Set<number>\n configTokens: WidgetTokens | undefined\n formType: FormType\n selectedChainId?: number\n isAllNetworks?: boolean\n nativeHoisted: boolean\n disabled: boolean\n}\n\nexport interface RecentRows {\n /** Unsliced; empty when the band is inactive. */\n rows: TokenAmount[]\n /** Everything Clear removes, including toggled-away and displaced rows. */\n bandEntries: RecentTokenId[]\n recentStartIndex: number\n}\n\nexport interface RecentTokensResult {\n tokens: TokenAmount[]\n recentCount: number\n totalRecentCount: number\n}\n\n// Whitelisted fields; a flag is the one verdict kept, as stale it only over-warns.\nconst toSnapshotRow = (recent: RecentToken): TokenAmount =>\n ({\n chainId: recent.chainId,\n address: recent.address,\n symbol: recent.symbol,\n name: recent.name,\n decimals: recent.decimals,\n logoURI: recent.logoURI,\n priceUSD: '',\n verificationStatus: recent.flagged ? 'flagged' : undefined,\n }) as TokenAmount\n\nconst isFeaturedCopy = (token: TokenAmount): boolean =>\n !!token.featured && !token.amount\n\nexport const resolveRecentRows = (\n tokens: TokenAmount[],\n {\n recentTokens,\n availableChainIds,\n configTokens,\n formType,\n selectedChainId,\n isAllNetworks,\n nativeHoisted,\n disabled,\n }: ResolveRecentRowsParams\n): RecentRows => {\n let recentStartIndex = nativeHoisted ? 1 : 0\n while (tokens[recentStartIndex]?.pinned) {\n recentStartIndex++\n }\n\n const inactive: RecentRows = { rows: [], bandEntries: [], recentStartIndex }\n\n if (disabled || !recentTokens.length || !tokens.length) {\n return inactive\n }\n\n const candidates = recentTokens.filter(\n (recent) =>\n (isAllNetworks || recent.chainId === selectedChainId) &&\n availableChainIds.has(recent.chainId)\n )\n\n if (!candidates.length) {\n return inactive\n }\n\n const wanted = new Set(\n candidates.map((recent) => getTokenKey(recent.chainId, recent.address))\n )\n // All-networks holds tens of thousands of rows: test the chain before the key.\n const wantedChains = new Set(candidates.map((recent) => recent.chainId))\n const fresh = new Map<string, TokenAmount>()\n // A featured config copy has no balance and sits above the row with one.\n let awaitingBalance = 0\n for (const token of tokens) {\n if (!wantedChains.has(token.chainId)) {\n continue\n }\n const key = getTokenKey(token.chainId, token.address)\n if (!wanted.has(key)) {\n continue\n }\n const found = fresh.get(key)\n if (!found) {\n fresh.set(key, token)\n if (isFeaturedCopy(token)) {\n awaitingBalance++\n }\n } else if (token.amount && isFeaturedCopy(found)) {\n fresh.set(key, {\n ...found,\n amount: token.amount,\n priceUSD: token.priceUSD || found.priceUSD,\n })\n awaitingBalance--\n }\n if (fresh.size === wanted.size && !awaitingBalance) {\n break\n }\n }\n\n const allowedByChain = new Map<number, AllowDenySets | undefined>()\n const allowedFor = (chainId: number) => {\n if (!allowedByChain.has(chainId)) {\n allowedByChain.set(\n chainId,\n getChainTokenAllowSets(configTokens, chainId, formType)\n )\n }\n return allowedByChain.get(chainId)\n }\n\n const hoistedKey = nativeHoisted\n ? getTokenKey(tokens[0].chainId, tokens[0].address)\n : undefined\n\n const rows: TokenAmount[] = []\n const bandEntries: RecentTokenId[] = []\n for (const recent of candidates) {\n const key = getTokenKey(recent.chainId, recent.address)\n const resolved = fresh.get(key) ?? toSnapshotRow(recent)\n if (\n !isFormItemAllowed(resolved, allowedFor(recent.chainId), formType, (t) =>\n t.address.toLowerCase()\n )\n ) {\n // Denied on this side only, so Clear must leave it for the other side.\n continue\n }\n // Clear owns displaced entries too, or they reappear once unpinned.\n bandEntries.push({ chainId: recent.chainId, address: recent.address })\n if (key === hoistedKey || resolved.pinned) {\n continue\n }\n rows.push({ ...resolved, recent: true })\n }\n\n if (!rows.length) {\n return inactive\n }\n\n return { rows, bandEntries, recentStartIndex }\n}\n\nexport const spliceRecentRows = (\n tokens: TokenAmount[],\n { rows, recentStartIndex }: RecentRows,\n expanded: boolean\n): RecentTokensResult => {\n if (!rows.length) {\n return { tokens, recentCount: 0, totalRecentCount: 0 }\n }\n\n const visible = expanded ? rows : rows.slice(0, collapsedRecentCount)\n\n return {\n tokens: [\n ...tokens.slice(0, recentStartIndex),\n ...visible,\n ...tokens.slice(recentStartIndex),\n ],\n recentCount: visible.length,\n totalRecentCount: rows.length,\n }\n}\n"],"mappings":"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"}
@@ -1,5 +1,7 @@
1
1
  import { getConfigItemSets, isFormItemAllowed } from "./item.js";
2
+ import { ChainId } from "@lifi/sdk";
2
3
  //#region src/utils/token.ts
4
+ const getChainTokenAllowSets = (configTokens, chainId, formType) => getConfigItemSets(configTokens, (tokens) => new Set(tokens.filter((t) => Number(t.chainId) === chainId).map((t) => t.address.toLowerCase())), formType);
3
5
  /**
4
6
  * Builds per-chain sets of lowercase token addresses from the
5
7
  * `tokens.verified` config allowlist.
@@ -36,24 +38,49 @@ const mergeVerifiedWithSearchTokens = (verifiedTokens, searchTokens) => {
36
38
  return result;
37
39
  };
38
40
  /**
41
+ * `priceUSD` is a required string, so an unknown price arrives as `'0'` or `''`
42
+ * rather than as an absent key — the same reading as in `useLimitMarketRate`. A
43
+ * known price must never lose to one, or a route that cannot price its output
44
+ * blanks a value the cache already knew.
45
+ */
46
+ const knownPriceUSD = (fresher, cached) => Number(fresher) ? fresher : cached;
47
+ /**
48
+ * Merges a cached token into a route token for display. The route wins on every
49
+ * field it carries; the cache only fills gaps. Letting the cache win instead
50
+ * swaps the quoted price for a stale feed price.
51
+ */
52
+ const mergeFallbackToken = (routeToken, cachedToken) => cachedToken ? {
53
+ ...cachedToken,
54
+ ...routeToken,
55
+ priceUSD: knownPriceUSD(routeToken.priceUSD, cachedToken.priceUSD),
56
+ logoURI: routeToken.logoURI || cachedToken.logoURI
57
+ } : routeToken;
58
+ /**
39
59
  * Updates a token in the cache by chainId and address.
40
60
  * Returns a new cache object with the token updated, or the original if not found.
61
+ * Addresses are compared case-insensitively: the token list and the route can
62
+ * spell the same address differently. The incoming token only overwrites what it
63
+ * actually knows, so an unpriced or logo-less route cannot blank the cache.
41
64
  */
42
65
  const updateTokenInCache = (data, token) => {
43
66
  if (!data) return data;
44
67
  const chainTokens = data[token.chainId];
45
68
  if (!chainTokens) return data;
46
- const index = chainTokens.findIndex((t) => t.address === token.address);
69
+ const address = token.address.toLowerCase();
70
+ const index = chainTokens.findIndex((t) => t.address.toLowerCase() === address);
47
71
  if (index < 0) return data;
48
72
  return {
49
73
  ...data,
50
74
  [token.chainId]: chainTokens.map((t, i) => i === index ? {
51
75
  ...t,
52
- ...token
76
+ ...token,
77
+ address: t.address,
78
+ priceUSD: knownPriceUSD(token.priceUSD, t.priceUSD),
79
+ logoURI: token.logoURI || t.logoURI
53
80
  } : t)
54
81
  };
55
82
  };
56
- const filterAllowedTokens = (dataTokens, configTokens, chainsConfig, formType) => {
83
+ const filterAllowedTokens = (dataTokens, configTokens, chainsConfig, formType, nativeTokenAddresses) => {
57
84
  if (!dataTokens) return;
58
85
  const includedTokens = configTokens?.include || [];
59
86
  const allChainIds = Array.from(/* @__PURE__ */ new Set([...includedTokens.map((t) => t.chainId), ...Object.keys(dataTokens)])).map((chainId) => Number(chainId));
@@ -64,8 +91,9 @@ const filterAllowedTokens = (dataTokens, configTokens, chainsConfig, formType) =
64
91
  for (const chainId of allowedChainIds) {
65
92
  const chainIncludedTokens = includedTokens.filter((t) => Number(t.chainId) === chainId);
66
93
  const includedAddresses = new Set(chainIncludedTokens.map((t) => t.address.toLowerCase()));
67
- const allowedAddresses = getConfigItemSets(configTokens, (tokens) => new Set(tokens.filter((t) => Number(t.chainId) === chainId).map((t) => t.address.toLowerCase())), formType);
94
+ const allowedAddresses = getChainTokenAllowSets(configTokens, chainId, formType);
68
95
  const verifiedAddresses = verifiedTokensSets?.get(chainId);
96
+ const nativeAddress = nativeTokenAddresses?.get(chainId)?.toLowerCase();
69
97
  const chainTokens = [...dataTokens[chainId] ?? [], ...chainIncludedTokens];
70
98
  const filtered = [];
71
99
  const seenAddresses = /* @__PURE__ */ new Set();
@@ -74,9 +102,12 @@ const filterAllowedTokens = (dataTokens, configTokens, chainsConfig, formType) =
74
102
  if (seenAddresses.has(address)) continue;
75
103
  seenAddresses.add(address);
76
104
  if (!isFormItemAllowed(token, allowedAddresses, formType, (t) => t.address.toLowerCase())) continue;
77
- if (!token.verified && (includedAddresses.has(address) || verifiedAddresses?.has(address))) filtered.push({
105
+ const markVerified = !token.verified && (includedAddresses.has(address) || verifiedAddresses?.has(address));
106
+ const markNative = !!nativeAddress && nativeAddress === address;
107
+ if (markVerified || markNative) filtered.push({
78
108
  ...token,
79
- verified: true
109
+ ...markVerified ? { verified: true } : {},
110
+ ...markNative ? { native: true } : {}
80
111
  });
81
112
  else filtered.push(token);
82
113
  }
@@ -88,7 +119,19 @@ const getExecutionToToken = (route) => ({
88
119
  ...route.steps.at(-1)?.execution?.toToken ?? route.toToken,
89
120
  amount: BigInt(route.steps.at(-1)?.execution?.toAmount ?? route.steps.at(-1)?.estimate.toAmount ?? route.toAmount)
90
121
  });
122
+ /** Capitalized name of the first provider that verified the token. */
123
+ const getTokenVerificationProvider = (token) => {
124
+ const provider = token.verificationStatusBreakdown?.find((entry) => entry.result === "verified")?.provider;
125
+ return provider ? `${provider.charAt(0).toUpperCase()}${provider.slice(1)}` : void 0;
126
+ };
127
+ /**
128
+ * Hyperliquid declares Arbitrum USDC as its native token, Lighter declares
129
+ * Ethereum USDC. Neither is a gas token you hold there. A chain-local
130
+ * stablecoin gas token, as on Arc or Stable, is genuine and stays.
131
+ */
132
+ const chainIdsWithoutNativeToken = /* @__PURE__ */ new Set([ChainId.HPL, ChainId.LTR]);
133
+ const getNativeTokenAddresses = (chains) => new Map(chains?.filter((chain) => !chainIdsWithoutNativeToken.has(chain.id)).map((chain) => [chain.id, chain.nativeToken.address]));
91
134
  //#endregion
92
- export { filterAllowedTokens, getExecutionToToken, getVerifiedTokensSets, mergeVerifiedWithSearchTokens, updateTokenInCache };
135
+ export { filterAllowedTokens, getChainTokenAllowSets, getExecutionToToken, getNativeTokenAddresses, getTokenVerificationProvider, getVerifiedTokensSets, knownPriceUSD, mergeFallbackToken, mergeVerifiedWithSearchTokens, updateTokenInCache };
93
136
 
94
137
  //# sourceMappingURL=token.js.map