@lifi/widget 4.0.0-beta.13 → 4.0.0-beta.17

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 (289) hide show
  1. package/dist/esm/AppDefault.js +31 -29
  2. package/dist/esm/AppDefault.js.map +1 -1
  3. package/dist/esm/AppLayout.js +2 -2
  4. package/dist/esm/AppLayout.js.map +1 -1
  5. package/dist/esm/components/AmountInput/AmountInput.js +2 -2
  6. package/dist/esm/components/AmountInput/AmountInput.js.map +1 -1
  7. package/dist/esm/components/AmountInput/PriceFormHelperText.style.js +2 -2
  8. package/dist/esm/components/AmountInput/PriceFormHelperText.style.js.map +1 -1
  9. package/dist/esm/components/AppContainer.js +3 -3
  10. package/dist/esm/components/AppContainer.js.map +1 -1
  11. package/dist/esm/components/ButtonTertiary.js +6 -6
  12. package/dist/esm/components/ButtonTertiary.js.map +1 -1
  13. package/dist/esm/components/Card/Card.js +2 -2
  14. package/dist/esm/components/Card/Card.js.map +1 -1
  15. package/dist/esm/components/Card/CardIconButton.js +2 -2
  16. package/dist/esm/components/Card/CardIconButton.js.map +1 -1
  17. package/dist/esm/components/Card/CardLabel.js +2 -2
  18. package/dist/esm/components/Card/CardLabel.js.map +1 -1
  19. package/dist/esm/components/Chains/AllChainsAvatar.js +6 -0
  20. package/dist/esm/components/Chains/AllChainsAvatar.js.map +1 -1
  21. package/dist/esm/components/ContextMenu.style.js +1 -1
  22. package/dist/esm/components/ContextMenu.style.js.map +1 -1
  23. package/dist/esm/components/ContractComponent/ItemPrice.js +1 -1
  24. package/dist/esm/components/ContractComponent/ItemPrice.js.map +1 -1
  25. package/dist/esm/components/ContractComponent/NFT/NFTBase.js +1 -1
  26. package/dist/esm/components/ContractComponent/NFT/NFTBase.js.map +1 -1
  27. package/dist/esm/components/Expansion/Expansion.js +4 -4
  28. package/dist/esm/components/Expansion/Expansion.js.map +1 -1
  29. package/dist/esm/components/Header/ActivitiesButton.js +1 -1
  30. package/dist/esm/components/Header/ActivitiesButton.js.map +1 -1
  31. package/dist/esm/components/Header/ActivitiesButton.style.js +4 -4
  32. package/dist/esm/components/Header/ActivitiesButton.style.js.map +1 -1
  33. package/dist/esm/components/Header/Header.js +2 -2
  34. package/dist/esm/components/Header/Header.js.map +1 -1
  35. package/dist/esm/components/Header/Header.style.js +2 -2
  36. package/dist/esm/components/Header/Header.style.js.map +1 -1
  37. package/dist/esm/components/Header/NavigationHeader.js +3 -3
  38. package/dist/esm/components/Header/NavigationHeader.js.map +1 -1
  39. package/dist/esm/components/Header/SettingsButton.style.js +8 -8
  40. package/dist/esm/components/Header/SettingsButton.style.js.map +1 -1
  41. package/dist/esm/components/Header/WalletHeader.js +3 -3
  42. package/dist/esm/components/Header/WalletHeader.js.map +1 -1
  43. package/dist/esm/components/IconCircle/IconCircle.style.js +7 -7
  44. package/dist/esm/components/IconCircle/IconCircle.style.js.map +1 -1
  45. package/dist/esm/components/IconTypography.js +2 -2
  46. package/dist/esm/components/IconTypography.js.map +1 -1
  47. package/dist/esm/components/ListItemButton.js +1 -1
  48. package/dist/esm/components/ListItemButton.js.map +1 -1
  49. package/dist/esm/components/Messages/AlertMessage.js +1 -1
  50. package/dist/esm/components/Messages/AlertMessage.js.map +1 -1
  51. package/dist/esm/components/Messages/AlertMessage.style.js +4 -4
  52. package/dist/esm/components/Messages/AlertMessage.style.js.map +1 -1
  53. package/dist/esm/components/Messages/GasRefuelMessage.style.js +2 -2
  54. package/dist/esm/components/Messages/GasRefuelMessage.style.js.map +1 -1
  55. package/dist/esm/components/PageEntered.js +2 -2
  56. package/dist/esm/components/PageEntered.js.map +1 -1
  57. package/dist/esm/components/RouteCard/RouteCard.js +2 -2
  58. package/dist/esm/components/RouteCard/RouteCard.js.map +1 -1
  59. package/dist/esm/components/RouteCard/RouteCardEssentials.js +10 -4
  60. package/dist/esm/components/RouteCard/RouteCardEssentials.js.map +1 -1
  61. package/dist/esm/components/RouteCard/RouteToken.js +2 -2
  62. package/dist/esm/components/RouteCard/RouteToken.js.map +1 -1
  63. package/dist/esm/components/Routes/RoutesExpanded.js +3 -3
  64. package/dist/esm/components/Routes/RoutesExpanded.js.map +1 -1
  65. package/dist/esm/components/SelectChainAndToken.js +8 -5
  66. package/dist/esm/components/SelectChainAndToken.js.map +1 -1
  67. package/dist/esm/components/SelectTokenButton/SelectTokenButton.style.js +1 -2
  68. package/dist/esm/components/SelectTokenButton/SelectTokenButton.style.js.map +1 -1
  69. package/dist/esm/components/SendToWallet/SendToWalletButton.js +3 -3
  70. package/dist/esm/components/SendToWallet/SendToWalletButton.js.map +1 -1
  71. package/dist/esm/components/SendToWallet/SendToWalletExpandButton.js +3 -3
  72. package/dist/esm/components/SendToWallet/SendToWalletExpandButton.js.map +1 -1
  73. package/dist/esm/components/Step/CircularProgress.style.js +4 -4
  74. package/dist/esm/components/Step/CircularProgress.style.js.map +1 -1
  75. package/dist/esm/components/Step/Step.js +20 -9
  76. package/dist/esm/components/Step/Step.js.map +1 -1
  77. package/dist/esm/components/Step/StepActions.js +2 -2
  78. package/dist/esm/components/Step/StepActions.js.map +1 -1
  79. package/dist/esm/components/StepActions/StepActions.js +2 -2
  80. package/dist/esm/components/StepActions/StepActions.js.map +1 -1
  81. package/dist/esm/components/StepActions/StepActions.style.js +4 -4
  82. package/dist/esm/components/StepActions/StepActions.style.js.map +1 -1
  83. package/dist/esm/components/Switch.js +2 -2
  84. package/dist/esm/components/Switch.js.map +1 -1
  85. package/dist/esm/components/Tabs/NavigationTabs.js +2 -2
  86. package/dist/esm/components/Tabs/NavigationTabs.js.map +1 -1
  87. package/dist/esm/components/Tabs/Tabs.style.js +3 -3
  88. package/dist/esm/components/Tabs/Tabs.style.js.map +1 -1
  89. package/dist/esm/components/Timer/TimerContent.js +1 -0
  90. package/dist/esm/components/Timer/TimerContent.js.map +1 -1
  91. package/dist/esm/components/Token/Token.js +2 -2
  92. package/dist/esm/components/Token/Token.js.map +1 -1
  93. package/dist/esm/components/Token/Token.style.js +1 -1
  94. package/dist/esm/components/Token/Token.style.js.map +1 -1
  95. package/dist/esm/components/TokenList/TokenDetailsSheetContent.js +6 -4
  96. package/dist/esm/components/TokenList/TokenDetailsSheetContent.js.map +1 -1
  97. package/dist/esm/components/TokenList/TokenList.js +2 -2
  98. package/dist/esm/components/TokenList/TokenList.js.map +1 -1
  99. package/dist/esm/components/TokenList/TokenList.style.js +1 -1
  100. package/dist/esm/components/TokenList/TokenList.style.js.map +1 -1
  101. package/dist/esm/components/TokenList/useTokenSelect.js +2 -2
  102. package/dist/esm/components/TokenList/useTokenSelect.js.map +1 -1
  103. package/dist/esm/components/TransactionCard/ActiveTransactionCard.js +2 -3
  104. package/dist/esm/components/TransactionCard/ActiveTransactionCard.js.map +1 -1
  105. package/dist/esm/components/TransactionCard/ActiveTransactionCard.style.js +1 -1
  106. package/dist/esm/components/TransactionCard/ActiveTransactionCard.style.js.map +1 -1
  107. package/dist/esm/components/TransactionDetails.js +5 -2
  108. package/dist/esm/components/TransactionDetails.js.map +1 -1
  109. package/dist/esm/config/version.d.ts +1 -1
  110. package/dist/esm/config/version.js +1 -1
  111. package/dist/esm/config/version.js.map +1 -1
  112. package/dist/esm/hooks/useAddressValidation.js +3 -8
  113. package/dist/esm/hooks/useAddressValidation.js.map +1 -1
  114. package/dist/esm/hooks/useAvailableChains.js +2 -1
  115. package/dist/esm/hooks/useAvailableChains.js.map +1 -1
  116. package/dist/esm/hooks/useContactSupport.js +3 -3
  117. package/dist/esm/hooks/useContactSupport.js.map +1 -1
  118. package/dist/esm/hooks/useExplorer.js +15 -4
  119. package/dist/esm/hooks/useExplorer.js.map +1 -1
  120. package/dist/esm/hooks/useGasRecommendation.js +2 -2
  121. package/dist/esm/hooks/useGasRecommendation.js.map +1 -1
  122. package/dist/esm/hooks/useGasRefuel.js +2 -2
  123. package/dist/esm/hooks/useGasRefuel.js.map +1 -1
  124. package/dist/esm/hooks/useGasSufficiency.js +2 -2
  125. package/dist/esm/hooks/useGasSufficiency.js.map +1 -1
  126. package/dist/esm/hooks/useHasChainExpansion.js +3 -3
  127. package/dist/esm/hooks/useHasChainExpansion.js.map +1 -1
  128. package/dist/esm/hooks/useListHeight.js +2 -2
  129. package/dist/esm/hooks/useListHeight.js.map +1 -1
  130. package/dist/esm/hooks/useRouteExecution.js +5 -5
  131. package/dist/esm/hooks/useRouteExecution.js.map +1 -1
  132. package/dist/esm/hooks/useRoutes.js +4 -4
  133. package/dist/esm/hooks/useRoutes.js.map +1 -1
  134. package/dist/esm/hooks/useToAddressRequirements.js +2 -2
  135. package/dist/esm/hooks/useToAddressRequirements.js.map +1 -1
  136. package/dist/esm/hooks/useToAddressReset.js +2 -2
  137. package/dist/esm/hooks/useToAddressReset.js.map +1 -1
  138. package/dist/esm/hooks/useTokenBalances.js +2 -2
  139. package/dist/esm/hooks/useTokenBalances.js.map +1 -1
  140. package/dist/esm/hooks/useTokens.js +4 -2
  141. package/dist/esm/hooks/useTokens.js.map +1 -1
  142. package/dist/esm/hooks/useTransactionList.js +2 -3
  143. package/dist/esm/hooks/useTransactionList.js.map +1 -1
  144. package/dist/esm/i18n/en.json +3 -0
  145. package/dist/esm/pages/ActivitiesPage/ActivitiesPage.js +1 -2
  146. package/dist/esm/pages/ActivitiesPage/ActivitiesPage.js.map +1 -1
  147. package/dist/esm/pages/ActivitiesPage/ActivitiesPageMenuButton.js +1 -1
  148. package/dist/esm/pages/ActivitiesPage/ActivitiesPageMenuButton.js.map +1 -1
  149. package/dist/esm/pages/MainPage/MainPage.js +6 -6
  150. package/dist/esm/pages/MainPage/MainPage.js.map +1 -1
  151. package/dist/esm/pages/MainPage/ReviewButton.js +2 -2
  152. package/dist/esm/pages/MainPage/ReviewButton.js.map +1 -1
  153. package/dist/esm/pages/RoutesPage/RoutesPage.js +3 -3
  154. package/dist/esm/pages/RoutesPage/RoutesPage.js.map +1 -1
  155. package/dist/esm/pages/SelectTokenPage/SelectTokenPage.js +3 -3
  156. package/dist/esm/pages/SelectTokenPage/SelectTokenPage.js.map +1 -1
  157. package/dist/esm/pages/SendToWallet/BookmarksPage.js +1 -1
  158. package/dist/esm/pages/SendToWallet/BookmarksPage.js.map +1 -1
  159. package/dist/esm/pages/SendToWallet/RecentWalletsPage.js +1 -1
  160. package/dist/esm/pages/SendToWallet/RecentWalletsPage.js.map +1 -1
  161. package/dist/esm/pages/SendToWallet/SendToWalletPage.js +6 -6
  162. package/dist/esm/pages/SendToWallet/SendToWalletPage.js.map +1 -1
  163. package/dist/esm/pages/SettingsPage/BridgeAndExchangeSettings.js +2 -2
  164. package/dist/esm/pages/SettingsPage/BridgeAndExchangeSettings.js.map +1 -1
  165. package/dist/esm/pages/SettingsPage/LanguageSetting.js +2 -2
  166. package/dist/esm/pages/SettingsPage/LanguageSetting.js.map +1 -1
  167. package/dist/esm/pages/SettingsPage/ResetSettingsButton.style.js +2 -2
  168. package/dist/esm/pages/SettingsPage/ResetSettingsButton.style.js.map +1 -1
  169. package/dist/esm/pages/SettingsPage/SettingsPage.js +2 -2
  170. package/dist/esm/pages/SettingsPage/SettingsPage.js.map +1 -1
  171. package/dist/esm/pages/SettingsPage/SlippageSettings/SlippageSettings.style.js +5 -5
  172. package/dist/esm/pages/SettingsPage/SlippageSettings/SlippageSettings.style.js.map +1 -1
  173. package/dist/esm/pages/SettingsPage/ThemeSettings.js +2 -2
  174. package/dist/esm/pages/SettingsPage/ThemeSettings.js.map +1 -1
  175. package/dist/esm/pages/TransactionDetailsPage/ActionRow.style.js +2 -2
  176. package/dist/esm/pages/TransactionDetailsPage/ActionRow.style.js.map +1 -1
  177. package/dist/esm/pages/TransactionDetailsPage/ReceiptsCard.style.js +1 -1
  178. package/dist/esm/pages/TransactionDetailsPage/ReceiptsCard.style.js.map +1 -1
  179. package/dist/esm/pages/TransactionDetailsPage/TransferIdCard.js +2 -2
  180. package/dist/esm/pages/TransactionDetailsPage/TransferIdCard.js.map +1 -1
  181. package/dist/esm/pages/TransactionPage/ConfirmToAddressSheet.js +2 -2
  182. package/dist/esm/pages/TransactionPage/ConfirmToAddressSheet.js.map +1 -1
  183. package/dist/esm/pages/TransactionPage/ExchangeRateBottomSheet.js +1 -1
  184. package/dist/esm/pages/TransactionPage/ExchangeRateBottomSheet.js.map +1 -1
  185. package/dist/esm/pages/TransactionPage/StatusBottomSheet.js +20 -21
  186. package/dist/esm/pages/TransactionPage/StatusBottomSheet.js.map +1 -1
  187. package/dist/esm/pages/TransactionPage/StatusBottomSheet.style.js +12 -13
  188. package/dist/esm/pages/TransactionPage/StatusBottomSheet.style.js.map +1 -1
  189. package/dist/esm/pages/TransactionPage/TokenValueBottomSheet.js +14 -4
  190. package/dist/esm/pages/TransactionPage/TokenValueBottomSheet.js.map +1 -1
  191. package/dist/esm/pages/TransactionPage/TransactionPage.js +15 -19
  192. package/dist/esm/pages/TransactionPage/TransactionPage.js.map +1 -1
  193. package/dist/esm/providers/WalletProvider/useExternalWalletProvider.js +7 -3
  194. package/dist/esm/providers/WalletProvider/useExternalWalletProvider.js.map +1 -1
  195. package/dist/esm/stores/chains/ChainOrderStore.js +2 -2
  196. package/dist/esm/stores/chains/ChainOrderStore.js.map +1 -1
  197. package/dist/esm/stores/chains/createChainOrderStore.js +2 -2
  198. package/dist/esm/stores/chains/createChainOrderStore.js.map +1 -1
  199. package/dist/esm/stores/form/useFieldActions.js +3 -3
  200. package/dist/esm/stores/form/useFieldActions.js.map +1 -1
  201. package/dist/esm/stores/form/useFormRef.js +2 -2
  202. package/dist/esm/stores/form/useFormRef.js.map +1 -1
  203. package/dist/esm/stores/routes/createRouteExecutionStore.js +8 -9
  204. package/dist/esm/stores/routes/createRouteExecutionStore.js.map +1 -1
  205. package/dist/esm/stores/routes/useRouteExecutionIndicator.js +2 -3
  206. package/dist/esm/stores/routes/useRouteExecutionIndicator.js.map +1 -1
  207. package/dist/esm/stores/settings/createSettingsStore.js +1 -5
  208. package/dist/esm/stores/settings/createSettingsStore.js.map +1 -1
  209. package/dist/esm/stores/settings/useSettingsActions.js +2 -2
  210. package/dist/esm/stores/settings/useSettingsActions.js.map +1 -1
  211. package/dist/esm/themes/createTheme.js +19 -23
  212. package/dist/esm/themes/createTheme.js.map +1 -1
  213. package/dist/esm/themes/types.d.ts +0 -11
  214. package/dist/esm/themes/types.d.ts.map +1 -1
  215. package/dist/esm/themes/watermelonLight.js +1 -1
  216. package/dist/esm/themes/watermelonLight.js.map +1 -1
  217. package/dist/esm/types/events.d.ts +0 -5
  218. package/dist/esm/types/events.d.ts.map +1 -1
  219. package/dist/esm/types/events.js +0 -4
  220. package/dist/esm/types/events.js.map +1 -1
  221. package/dist/esm/types/widget.d.ts +1 -5
  222. package/dist/esm/types/widget.d.ts.map +1 -1
  223. package/dist/esm/types/widget.js.map +1 -1
  224. package/dist/esm/utils/elements.js +5 -12
  225. package/dist/esm/utils/elements.js.map +1 -1
  226. package/package.json +7 -7
  227. package/src/AppDefault.tsx +9 -11
  228. package/src/components/AmountInput/PriceFormHelperText.style.tsx +2 -2
  229. package/src/components/ButtonTertiary.tsx +6 -6
  230. package/src/components/Card/Card.tsx +2 -2
  231. package/src/components/Card/CardIconButton.tsx +2 -2
  232. package/src/components/Card/CardLabel.tsx +2 -2
  233. package/src/components/Chains/AllChainsAvatar.tsx +6 -0
  234. package/src/components/ContextMenu.style.tsx +1 -1
  235. package/src/components/ContractComponent/ItemPrice.tsx +1 -1
  236. package/src/components/ContractComponent/NFT/NFTBase.tsx +1 -1
  237. package/src/components/Header/ActivitiesButton.style.tsx +4 -4
  238. package/src/components/Header/ActivitiesButton.tsx +1 -1
  239. package/src/components/Header/Header.style.ts +2 -2
  240. package/src/components/Header/SettingsButton.style.tsx +8 -8
  241. package/src/components/IconCircle/IconCircle.style.tsx +7 -7
  242. package/src/components/IconTypography.ts +8 -8
  243. package/src/components/ListItemButton.tsx +1 -1
  244. package/src/components/Messages/AlertMessage.style.tsx +4 -4
  245. package/src/components/Messages/AlertMessage.tsx +1 -1
  246. package/src/components/Messages/GasRefuelMessage.style.ts +2 -2
  247. package/src/components/RouteCard/RouteCardEssentials.tsx +2 -2
  248. package/src/components/SelectChainAndToken.tsx +1 -1
  249. package/src/components/Step/CircularProgress.style.tsx +4 -4
  250. package/src/components/Step/Step.tsx +6 -7
  251. package/src/components/StepActions/StepActions.style.tsx +4 -4
  252. package/src/components/Switch.tsx +2 -2
  253. package/src/components/Tabs/NavigationTabs.tsx +2 -2
  254. package/src/components/Tabs/Tabs.style.tsx +3 -3
  255. package/src/components/Timer/TimerContent.tsx +1 -0
  256. package/src/components/Token/Token.style.tsx +1 -1
  257. package/src/components/Token/Token.tsx +2 -2
  258. package/src/components/TokenList/TokenDetailsSheetContent.tsx +6 -4
  259. package/src/components/TokenList/TokenList.style.tsx +1 -1
  260. package/src/components/TransactionCard/ActiveTransactionCard.style.tsx +1 -1
  261. package/src/components/TransactionCard/ActiveTransactionCard.tsx +1 -1
  262. package/src/components/TransactionDetails.tsx +1 -1
  263. package/src/config/version.ts +1 -1
  264. package/src/hooks/useAvailableChains.ts +1 -0
  265. package/src/hooks/useExplorer.ts +16 -5
  266. package/src/hooks/useTokens.ts +2 -0
  267. package/src/pages/ActivitiesPage/ActivitiesPageMenuButton.tsx +1 -1
  268. package/src/pages/MainPage/MainPage.tsx +3 -3
  269. package/src/pages/RoutesPage/RoutesPage.tsx +6 -1
  270. package/src/pages/SendToWallet/BookmarksPage.tsx +1 -1
  271. package/src/pages/SendToWallet/RecentWalletsPage.tsx +1 -1
  272. package/src/pages/SettingsPage/ResetSettingsButton.style.tsx +2 -2
  273. package/src/pages/SettingsPage/SlippageSettings/SlippageSettings.style.tsx +5 -5
  274. package/src/pages/TransactionDetailsPage/ActionRow.style.tsx +2 -2
  275. package/src/pages/TransactionDetailsPage/ReceiptsCard.style.tsx +1 -1
  276. package/src/pages/TransactionPage/ExchangeRateBottomSheet.tsx +1 -1
  277. package/src/pages/TransactionPage/StatusBottomSheet.style.tsx +7 -7
  278. package/src/pages/TransactionPage/StatusBottomSheet.tsx +1 -1
  279. package/src/pages/TransactionPage/TokenValueBottomSheet.tsx +27 -5
  280. package/src/pages/TransactionPage/TransactionPage.tsx +2 -9
  281. package/src/providers/WalletProvider/useExternalWalletProvider.ts +9 -1
  282. package/src/stores/settings/createSettingsStore.ts +1 -9
  283. package/src/themes/createTheme.ts +18 -24
  284. package/src/themes/types.ts +0 -12
  285. package/src/themes/watermelonLight.ts +1 -1
  286. package/src/types/events.ts +0 -5
  287. package/src/types/widget.ts +1 -4
  288. package/dist/esm/stores/routes/types.js +0 -14
  289. package/dist/esm/stores/routes/types.js.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"file":"TokenList.style.js","names":["ListItem","ListItemBase","List","MuiList","IconButton","MuiIconButton"],"sources":["../../../../src/components/TokenList/TokenList.style.tsx"],"sourcesContent":["import type { IconButtonProps, LinkProps } from '@mui/material'\nimport {\n IconButton as MuiIconButton,\n List as MuiList,\n styled,\n} from '@mui/material'\nimport type React from 'react'\nimport { ListItem as ListItemBase } from '../ListItem/ListItem.js'\n\nexport const ListItem: React.FC<\n React.ComponentProps<typeof ListItemBase> & IconButtonProps & LinkProps\n> = styled(ListItemBase)(() => ({\n position: 'absolute',\n top: 0,\n left: 0,\n}))\n\nexport const List: React.FC<\n React.ComponentProps<typeof MuiList> & IconButtonProps & LinkProps\n> = styled(MuiList)(({ theme }) => ({\n cursor: 'pointer',\n marginLeft: theme.spacing(1.5),\n marginRight: theme.spacing(1.5),\n}))\n\nexport const IconButton: React.FC<\n React.ComponentProps<typeof MuiIconButton> & IconButtonProps & LinkProps\n> = styled(MuiIconButton)<IconButtonProps & LinkProps>(({ theme }) => ({\n lineHeight: 1,\n fontSize: 12,\n fontWeight: 400,\n padding: theme.spacing(0.375, 0.375),\n margin: theme.spacing(0, 0, 0, 0.25),\n color: 'inherit',\n backgroundColor: 'unset',\n minWidth: 'unset',\n borderRadius: theme.vars.shape.borderRadiusTertiary,\n '&:hover': {\n backgroundColor: `rgba(${theme.vars.palette.common.onBackgroundChannel} / 0.04)`,\n },\n svg: {\n fontSize: 14,\n },\n}))\n"],"mappings":";;;AASA,MAAaA,aAET,OAAOC,WAAa,QAAQ;CAC9B,UAAU;CACV,KAAK;CACL,MAAM;CACP,EAAE;AAEH,MAAaC,SAET,OAAOC,KAAQ,EAAE,EAAE,aAAa;CAClC,QAAQ;CACR,YAAY,MAAM,QAAQ,IAAI;CAC9B,aAAa,MAAM,QAAQ,IAAI;CAChC,EAAE;AAEH,MAAaC,eAET,OAAOC,WAAc,EAA+B,EAAE,aAAa;CACrE,YAAY;CACZ,UAAU;CACV,YAAY;CACZ,SAAS,MAAM,QAAQ,MAAO,KAAM;CACpC,QAAQ,MAAM,QAAQ,GAAG,GAAG,GAAG,IAAK;CACpC,OAAO;CACP,iBAAiB;CACjB,UAAU;CACV,cAAc,MAAM,KAAK,MAAM;CAC/B,WAAW,EACT,iBAAiB,QAAQ,MAAM,KAAK,QAAQ,OAAO,oBAAoB,WACxE;CACD,KAAK,EACH,UAAU,IACX;CACF,EAAE"}
1
+ {"version":3,"file":"TokenList.style.js","names":["ListItem","ListItemBase","List","MuiList","IconButton","MuiIconButton"],"sources":["../../../../src/components/TokenList/TokenList.style.tsx"],"sourcesContent":["import type { IconButtonProps, LinkProps } from '@mui/material'\nimport {\n IconButton as MuiIconButton,\n List as MuiList,\n styled,\n} from '@mui/material'\nimport type React from 'react'\nimport { ListItem as ListItemBase } from '../ListItem/ListItem.js'\n\nexport const ListItem: React.FC<\n React.ComponentProps<typeof ListItemBase> & IconButtonProps & LinkProps\n> = styled(ListItemBase)(() => ({\n position: 'absolute',\n top: 0,\n left: 0,\n}))\n\nexport const List: React.FC<\n React.ComponentProps<typeof MuiList> & IconButtonProps & LinkProps\n> = styled(MuiList)(({ theme }) => ({\n cursor: 'pointer',\n marginLeft: theme.spacing(1.5),\n marginRight: theme.spacing(1.5),\n}))\n\nexport const IconButton: React.FC<\n React.ComponentProps<typeof MuiIconButton> & IconButtonProps & LinkProps\n> = styled(MuiIconButton)<IconButtonProps & LinkProps>(({ theme }) => ({\n lineHeight: 1,\n fontSize: 12,\n fontWeight: 400,\n padding: theme.spacing(0.375, 0.375),\n margin: theme.spacing(0, 0, 0, 0.25),\n color: 'inherit',\n backgroundColor: 'unset',\n minWidth: 'unset',\n borderRadius: theme.vars.shape.borderRadiusTertiary,\n '&:hover': {\n backgroundColor: `color-mix(in srgb, ${theme.vars.palette.common.onBackground} 4%, transparent)`,\n },\n svg: {\n fontSize: 14,\n },\n}))\n"],"mappings":";;;AASA,MAAaA,aAET,OAAOC,WAAa,QAAQ;CAC9B,UAAU;CACV,KAAK;CACL,MAAM;CACP,EAAE;AAEH,MAAaC,SAET,OAAOC,KAAQ,EAAE,EAAE,aAAa;CAClC,QAAQ;CACR,YAAY,MAAM,QAAQ,IAAI;CAC9B,aAAa,MAAM,QAAQ,IAAI;CAChC,EAAE;AAEH,MAAaC,eAET,OAAOC,WAAc,EAA+B,EAAE,aAAa;CACrE,YAAY;CACZ,UAAU;CACV,YAAY;CACZ,SAAS,MAAM,QAAQ,MAAO,KAAM;CACpC,QAAQ,MAAM,QAAQ,GAAG,GAAG,GAAG,IAAK;CACpC,OAAO;CACP,iBAAiB;CACjB,UAAU;CACV,cAAc,MAAM,KAAK,MAAM;CAC/B,WAAW,EACT,iBAAiB,sBAAsB,MAAM,KAAK,QAAQ,OAAO,aAAa,oBAC/E;CACD,KAAK,EACH,UAAU,IACX;CACF,EAAE"}
@@ -1,5 +1,5 @@
1
1
  import { useWidgetEvents } from "../../hooks/useWidgetEvents.js";
2
- import { WidgetEvent } from "../../types/events.js";
2
+ import "../../types/events.js";
3
3
  import { useWidgetConfig } from "../../providers/WidgetProvider/WidgetProvider.js";
4
4
  import { useSplitSubvariantStore } from "../../stores/settings/useSplitSubvariantStore.js";
5
5
  import { FormKeyHelper } from "../../stores/form/types.js";
@@ -50,7 +50,7 @@ const useTokenSelect = (formType, onClick) => {
50
50
  selectedOppositeChainId,
51
51
  selectedOppositeTokenAddress
52
52
  });
53
- const eventToEmit = formType === "from" ? WidgetEvent.SourceChainTokenSelected : WidgetEvent.DestinationChainTokenSelected;
53
+ const eventToEmit = formType === "from" ? "sourceChainTokenSelected" : "destinationChainTokenSelected";
54
54
  if (selectedChainId) emitter.emit(eventToEmit, {
55
55
  chainId: selectedChainId,
56
56
  tokenAddress
@@ -1 +1 @@
1
- {"version":3,"file":"useTokenSelect.js","names":[],"sources":["../../../../src/components/TokenList/useTokenSelect.ts"],"sourcesContent":["import { useCallback } from 'react'\nimport { useToAddressAutoPopulate } from '../../hooks/useToAddressAutoPopulate.js'\nimport { useWidgetEvents } from '../../hooks/useWidgetEvents.js'\nimport { useWidgetConfig } from '../../providers/WidgetProvider/WidgetProvider.js'\nimport { useChainOrderStore } from '../../stores/chains/ChainOrderStore.js'\nimport type { FormType } from '../../stores/form/types.js'\nimport { FormKeyHelper } from '../../stores/form/types.js'\nimport { useFieldActions } from '../../stores/form/useFieldActions.js'\nimport { useSplitSubvariantStore } from '../../stores/settings/useSplitSubvariantStore.js'\nimport { WidgetEvent } from '../../types/events.js'\nimport type { DisabledUI } from '../../types/widget.js'\nimport { isItemAllowed } from '../../utils/item.js'\n\nexport const useTokenSelect = (\n formType: FormType,\n onClick?: () => void\n): ((tokenAddress: string, chainId?: number) => void) => {\n const { subvariant, disabledUI, chains: chainsConfig } = useWidgetConfig()\n const splitSubvariant = useSplitSubvariantStore((store) => store.state)\n const emitter = useWidgetEvents()\n const { setFieldValue, getFieldValues } = useFieldActions()\n const autoPopulateToAddress = useToAddressAutoPopulate()\n const [setChain, setIsAllNetworks] = useChainOrderStore((state) => [\n state.setChain,\n state.setIsAllNetworks,\n ])\n\n const tokenKey = FormKeyHelper.getTokenKey(formType)\n\n return useCallback(\n (tokenAddress: string, chainId?: number) => {\n setFieldValue(tokenKey, tokenAddress, { isDirty: true, isTouched: true })\n const selectedChainId =\n chainId ?? getFieldValues(FormKeyHelper.getChainKey(formType))[0]\n // Set chain again to trigger URL builder update\n setFieldValue(FormKeyHelper.getChainKey(formType), selectedChainId, {\n isDirty: true,\n isTouched: true,\n })\n const amountKey = FormKeyHelper.getAmountKey(formType)\n if (!disabledUI?.includes(amountKey as DisabledUI)) {\n setFieldValue(amountKey, '')\n }\n const oppositeFormType = formType === 'from' ? 'to' : 'from'\n const [\n selectedOppositeTokenAddress,\n selectedOppositeChainId,\n selectedToAddress,\n ] = getFieldValues(\n FormKeyHelper.getTokenKey(oppositeFormType),\n FormKeyHelper.getChainKey(oppositeFormType),\n 'toAddress'\n )\n\n // TODO: remove when we enable same chain/token transfers\n const isSameTokenTransfer =\n selectedOppositeTokenAddress === tokenAddress &&\n selectedOppositeChainId === selectedChainId\n\n const isBridgeToSameChain =\n subvariant === 'split' &&\n splitSubvariant === 'bridge' &&\n selectedOppositeChainId === selectedChainId\n\n if (\n (isSameTokenTransfer || isBridgeToSameChain) &&\n subvariant !== 'custom'\n ) {\n setFieldValue(FormKeyHelper.getTokenKey(oppositeFormType), '', {\n isDirty: true,\n isTouched: true,\n })\n }\n\n // If no opposite token is selected, synchronize the opposite chain\n // to match the currently selected chain (if allowed).\n // In default exchange mode, also collapse \"All Networks\" on the opposite\n // side - same-chain swap is the most common action.\n if (\n !selectedOppositeTokenAddress &&\n selectedChainId &&\n isItemAllowed(selectedChainId, chainsConfig?.[oppositeFormType])\n ) {\n const isDefaultExchange = !subvariant || subvariant === 'default'\n if (isDefaultExchange) {\n setIsAllNetworks(false, oppositeFormType)\n }\n setFieldValue(\n FormKeyHelper.getChainKey(oppositeFormType),\n selectedChainId,\n {\n isDirty: true,\n isTouched: true,\n }\n )\n setChain(selectedChainId, oppositeFormType)\n }\n\n // Automatically populate toAddress field if bridging across ecosystems and compatible wallet is connected\n autoPopulateToAddress({\n formType,\n selectedToAddress,\n selectedChainId,\n selectedOppositeChainId,\n selectedOppositeTokenAddress,\n })\n\n const eventToEmit =\n formType === 'from'\n ? WidgetEvent.SourceChainTokenSelected\n : WidgetEvent.DestinationChainTokenSelected\n\n if (selectedChainId) {\n emitter.emit(eventToEmit, {\n chainId: selectedChainId,\n tokenAddress,\n })\n }\n\n onClick?.()\n },\n [\n autoPopulateToAddress,\n disabledUI,\n emitter,\n formType,\n getFieldValues,\n onClick,\n setChain,\n setIsAllNetworks,\n setFieldValue,\n subvariant,\n splitSubvariant,\n tokenKey,\n chainsConfig,\n ]\n )\n}\n"],"mappings":";;;;;;;;;;;AAaA,MAAa,kBACX,UACA,YACuD;CACvD,MAAM,EAAE,YAAY,YAAY,QAAQ,iBAAiB,iBAAiB;CAC1E,MAAM,kBAAkB,yBAAyB,UAAU,MAAM,MAAM;CACvE,MAAM,UAAU,iBAAiB;CACjC,MAAM,EAAE,eAAe,mBAAmB,iBAAiB;CAC3D,MAAM,wBAAwB,0BAA0B;CACxD,MAAM,CAAC,UAAU,oBAAoB,oBAAoB,UAAU,CACjE,MAAM,UACN,MAAM,iBACP,CAAC;CAEF,MAAM,WAAW,cAAc,YAAY,SAAS;AAEpD,QAAO,aACJ,cAAsB,YAAqB;AAC1C,gBAAc,UAAU,cAAc;GAAE,SAAS;GAAM,WAAW;GAAM,CAAC;EACzE,MAAM,kBACJ,WAAW,eAAe,cAAc,YAAY,SAAS,CAAC,CAAC;AAEjE,gBAAc,cAAc,YAAY,SAAS,EAAE,iBAAiB;GAClE,SAAS;GACT,WAAW;GACZ,CAAC;EACF,MAAM,YAAY,cAAc,aAAa,SAAS;AACtD,MAAI,CAAC,YAAY,SAAS,UAAwB,CAChD,eAAc,WAAW,GAAG;EAE9B,MAAM,mBAAmB,aAAa,SAAS,OAAO;EACtD,MAAM,CACJ,8BACA,yBACA,qBACE,eACF,cAAc,YAAY,iBAAiB,EAC3C,cAAc,YAAY,iBAAiB,EAC3C,YACD;AAYD,OARE,iCAAiC,gBACjC,4BAA4B,mBAG5B,eAAe,WACf,oBAAoB,YACpB,4BAA4B,oBAI5B,eAAe,SAEf,eAAc,cAAc,YAAY,iBAAiB,EAAE,IAAI;GAC7D,SAAS;GACT,WAAW;GACZ,CAAC;AAOJ,MACE,CAAC,gCACD,mBACA,cAAc,iBAAiB,eAAe,kBAAkB,EAChE;AAEA,OAD0B,CAAC,cAAc,eAAe,UAEtD,kBAAiB,OAAO,iBAAiB;AAE3C,iBACE,cAAc,YAAY,iBAAiB,EAC3C,iBACA;IACE,SAAS;IACT,WAAW;IACZ,CACF;AACD,YAAS,iBAAiB,iBAAiB;;AAI7C,wBAAsB;GACpB;GACA;GACA;GACA;GACA;GACD,CAAC;EAEF,MAAM,cACJ,aAAa,SACT,YAAY,2BACZ,YAAY;AAElB,MAAI,gBACF,SAAQ,KAAK,aAAa;GACxB,SAAS;GACT;GACD,CAAC;AAGJ,aAAW;IAEb;EACE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACD,CACF"}
1
+ {"version":3,"file":"useTokenSelect.js","names":[],"sources":["../../../../src/components/TokenList/useTokenSelect.ts"],"sourcesContent":["import { useCallback } from 'react'\nimport { useToAddressAutoPopulate } from '../../hooks/useToAddressAutoPopulate.js'\nimport { useWidgetEvents } from '../../hooks/useWidgetEvents.js'\nimport { useWidgetConfig } from '../../providers/WidgetProvider/WidgetProvider.js'\nimport { useChainOrderStore } from '../../stores/chains/ChainOrderStore.js'\nimport type { FormType } from '../../stores/form/types.js'\nimport { FormKeyHelper } from '../../stores/form/types.js'\nimport { useFieldActions } from '../../stores/form/useFieldActions.js'\nimport { useSplitSubvariantStore } from '../../stores/settings/useSplitSubvariantStore.js'\nimport { WidgetEvent } from '../../types/events.js'\nimport type { DisabledUI } from '../../types/widget.js'\nimport { isItemAllowed } from '../../utils/item.js'\n\nexport const useTokenSelect = (\n formType: FormType,\n onClick?: () => void\n): ((tokenAddress: string, chainId?: number) => void) => {\n const { subvariant, disabledUI, chains: chainsConfig } = useWidgetConfig()\n const splitSubvariant = useSplitSubvariantStore((store) => store.state)\n const emitter = useWidgetEvents()\n const { setFieldValue, getFieldValues } = useFieldActions()\n const autoPopulateToAddress = useToAddressAutoPopulate()\n const [setChain, setIsAllNetworks] = useChainOrderStore((state) => [\n state.setChain,\n state.setIsAllNetworks,\n ])\n\n const tokenKey = FormKeyHelper.getTokenKey(formType)\n\n return useCallback(\n (tokenAddress: string, chainId?: number) => {\n setFieldValue(tokenKey, tokenAddress, { isDirty: true, isTouched: true })\n const selectedChainId =\n chainId ?? getFieldValues(FormKeyHelper.getChainKey(formType))[0]\n // Set chain again to trigger URL builder update\n setFieldValue(FormKeyHelper.getChainKey(formType), selectedChainId, {\n isDirty: true,\n isTouched: true,\n })\n const amountKey = FormKeyHelper.getAmountKey(formType)\n if (!disabledUI?.includes(amountKey as DisabledUI)) {\n setFieldValue(amountKey, '')\n }\n const oppositeFormType = formType === 'from' ? 'to' : 'from'\n const [\n selectedOppositeTokenAddress,\n selectedOppositeChainId,\n selectedToAddress,\n ] = getFieldValues(\n FormKeyHelper.getTokenKey(oppositeFormType),\n FormKeyHelper.getChainKey(oppositeFormType),\n 'toAddress'\n )\n\n // TODO: remove when we enable same chain/token transfers\n const isSameTokenTransfer =\n selectedOppositeTokenAddress === tokenAddress &&\n selectedOppositeChainId === selectedChainId\n\n const isBridgeToSameChain =\n subvariant === 'split' &&\n splitSubvariant === 'bridge' &&\n selectedOppositeChainId === selectedChainId\n\n if (\n (isSameTokenTransfer || isBridgeToSameChain) &&\n subvariant !== 'custom'\n ) {\n setFieldValue(FormKeyHelper.getTokenKey(oppositeFormType), '', {\n isDirty: true,\n isTouched: true,\n })\n }\n\n // If no opposite token is selected, synchronize the opposite chain\n // to match the currently selected chain (if allowed).\n // In default exchange mode, also collapse \"All Networks\" on the opposite\n // side - same-chain swap is the most common action.\n if (\n !selectedOppositeTokenAddress &&\n selectedChainId &&\n isItemAllowed(selectedChainId, chainsConfig?.[oppositeFormType])\n ) {\n const isDefaultExchange = !subvariant || subvariant === 'default'\n if (isDefaultExchange) {\n setIsAllNetworks(false, oppositeFormType)\n }\n setFieldValue(\n FormKeyHelper.getChainKey(oppositeFormType),\n selectedChainId,\n {\n isDirty: true,\n isTouched: true,\n }\n )\n setChain(selectedChainId, oppositeFormType)\n }\n\n // Automatically populate toAddress field if bridging across ecosystems and compatible wallet is connected\n autoPopulateToAddress({\n formType,\n selectedToAddress,\n selectedChainId,\n selectedOppositeChainId,\n selectedOppositeTokenAddress,\n })\n\n const eventToEmit =\n formType === 'from'\n ? WidgetEvent.SourceChainTokenSelected\n : WidgetEvent.DestinationChainTokenSelected\n\n if (selectedChainId) {\n emitter.emit(eventToEmit, {\n chainId: selectedChainId,\n tokenAddress,\n })\n }\n\n onClick?.()\n },\n [\n autoPopulateToAddress,\n disabledUI,\n emitter,\n formType,\n getFieldValues,\n onClick,\n setChain,\n setIsAllNetworks,\n setFieldValue,\n subvariant,\n splitSubvariant,\n tokenKey,\n chainsConfig,\n ]\n )\n}\n"],"mappings":";;;;;;;;;;;AAaA,MAAa,kBACX,UACA,YACuD;CACvD,MAAM,EAAE,YAAY,YAAY,QAAQ,iBAAiB,iBAAiB;CAC1E,MAAM,kBAAkB,yBAAyB,UAAU,MAAM,MAAM;CACvE,MAAM,UAAU,iBAAiB;CACjC,MAAM,EAAE,eAAe,mBAAmB,iBAAiB;CAC3D,MAAM,wBAAwB,0BAA0B;CACxD,MAAM,CAAC,UAAU,oBAAoB,oBAAoB,UAAU,CACjE,MAAM,UACN,MAAM,iBACP,CAAC;CAEF,MAAM,WAAW,cAAc,YAAY,SAAS;AAEpD,QAAO,aACJ,cAAsB,YAAqB;AAC1C,gBAAc,UAAU,cAAc;GAAE,SAAS;GAAM,WAAW;GAAM,CAAC;EACzE,MAAM,kBACJ,WAAW,eAAe,cAAc,YAAY,SAAS,CAAC,CAAC;AAEjE,gBAAc,cAAc,YAAY,SAAS,EAAE,iBAAiB;GAClE,SAAS;GACT,WAAW;GACZ,CAAC;EACF,MAAM,YAAY,cAAc,aAAa,SAAS;AACtD,MAAI,CAAC,YAAY,SAAS,UAAwB,CAChD,eAAc,WAAW,GAAG;EAE9B,MAAM,mBAAmB,aAAa,SAAS,OAAO;EACtD,MAAM,CACJ,8BACA,yBACA,qBACE,eACF,cAAc,YAAY,iBAAiB,EAC3C,cAAc,YAAY,iBAAiB,EAC3C,YACD;AAYD,OARE,iCAAiC,gBACjC,4BAA4B,mBAG5B,eAAe,WACf,oBAAoB,YACpB,4BAA4B,oBAI5B,eAAe,SAEf,eAAc,cAAc,YAAY,iBAAiB,EAAE,IAAI;GAC7D,SAAS;GACT,WAAW;GACZ,CAAC;AAOJ,MACE,CAAC,gCACD,mBACA,cAAc,iBAAiB,eAAe,kBAAkB,EAChE;AAEA,OAD0B,CAAC,cAAc,eAAe,UAEtD,kBAAiB,OAAO,iBAAiB;AAE3C,iBACE,cAAc,YAAY,iBAAiB,EAC3C,iBACA;IACE,SAAS;IACT,WAAW;IACZ,CACF;AACD,YAAS,iBAAiB,iBAAiB;;AAI7C,wBAAsB;GACpB;GACA;GACA;GACA;GACA;GACD,CAAC;EAEF,MAAM,cACJ,aAAa,SAAA,6BAAA;AAIf,MAAI,gBACF,SAAQ,KAAK,aAAa;GACxB,SAAS;GACT;GACD,CAAC;AAGJ,aAAW;IAEb;EACE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACD,CACF"}
@@ -1,5 +1,4 @@
1
1
  import { Card as Card$1 } from "../Card/Card.js";
2
- import { RouteExecutionStatus } from "../../stores/routes/types.js";
3
2
  import { CircularProgressPending } from "../Step/CircularProgress.style.js";
4
3
  import { useActionMessage } from "../../hooks/useActionMessage.js";
5
4
  import { IconCircle } from "../IconCircle/IconCircle.js";
@@ -9,14 +8,14 @@ import { DeleteButton, PendingCircle, StatusRow } from "./ActiveTransactionCard.
9
8
  import { Box, Tooltip, Typography } from "@mui/material";
10
9
  import { jsx, jsxs } from "react/jsx-runtime";
11
10
  import { useTranslation } from "react-i18next";
12
- import DeleteOutline from "@mui/icons-material/DeleteOutline";
11
+ import DeleteOutline from "@mui/icons-material/DeleteOutlined";
13
12
  //#region src/components/TransactionCard/ActiveTransactionCard.tsx
14
13
  const ActiveTransactionCard = ({ route, status, onClick, onDelete }) => {
15
14
  const { t } = useTranslation();
16
15
  const lastActiveStep = route.steps.findLast((step) => step.execution);
17
16
  const lastActiveAction = lastActiveStep?.execution?.actions?.at(-1);
18
17
  const { title } = useActionMessage(lastActiveStep, lastActiveAction);
19
- const isFailed = status === RouteExecutionStatus.Failed;
18
+ const isFailed = status === 8;
20
19
  return /* @__PURE__ */ jsxs(Card$1, {
21
20
  onClick,
22
21
  indented: true,
@@ -1 +1 @@
1
- {"version":3,"file":"ActiveTransactionCard.js","names":["Card"],"sources":["../../../../src/components/TransactionCard/ActiveTransactionCard.tsx"],"sourcesContent":["import type { RouteExtended } from '@lifi/sdk'\nimport DeleteOutline from '@mui/icons-material/DeleteOutline'\nimport { Box, Tooltip, Typography } from '@mui/material'\nimport type { JSX, MouseEvent } from 'react'\nimport { useTranslation } from 'react-i18next'\nimport { useActionMessage } from '../../hooks/useActionMessage.js'\nimport { RouteExecutionStatus } from '../../stores/routes/types.js'\nimport { Card } from '../Card/Card.js'\nimport { IconCircle } from '../IconCircle/IconCircle.js'\nimport { RouteTokens } from '../RouteCard/RouteTokens.js'\nimport { CircularProgressPending } from '../Step/CircularProgress.style.js'\nimport { ExecutionTimerText, getExpiryTimestamp } from '../Timer/StepTimer.js'\nimport {\n DeleteButton,\n PendingCircle,\n StatusRow,\n} from './ActiveTransactionCard.style.js'\n\ninterface ActiveTransactionCardProps {\n route: RouteExtended\n status?: RouteExecutionStatus\n onClick: () => void\n onDelete: (e: MouseEvent) => void\n}\n\nexport const ActiveTransactionCard = ({\n route,\n status,\n onClick,\n onDelete,\n}: ActiveTransactionCardProps): JSX.Element => {\n const { t } = useTranslation()\n\n const lastActiveStep = route.steps.findLast((step) => step.execution)\n const lastActiveAction = lastActiveStep?.execution?.actions?.at(-1)\n const { title } = useActionMessage(lastActiveStep, lastActiveAction)\n\n const isFailed = status === RouteExecutionStatus.Failed\n\n const statusIcon = (() => {\n if (isFailed) {\n return <IconCircle status=\"error\" size={24} />\n }\n if (\n ['ACTION_REQUIRED', 'MESSAGE_REQUIRED', 'RESET_REQUIRED'].includes(\n lastActiveAction?.status ?? ''\n )\n ) {\n return <IconCircle status=\"info\" size={24} />\n }\n return (\n <PendingCircle>\n <CircularProgressPending size={24} sx={{ top: -2, left: -2 }} />\n </PendingCircle>\n )\n })()\n\n return (\n <Card onClick={onClick} indented>\n <StatusRow sx={{ mb: 1.5 }}>\n <Box sx={{ display: 'flex', alignItems: 'center', gap: 1.5 }}>\n {statusIcon}\n <Typography sx={{ fontSize: 12, fontWeight: 500 }}>\n {title}\n </Typography>\n </Box>\n {isFailed ? (\n <Tooltip title={t('button.clearTransaction')}>\n <DeleteButton size=\"small\" onClick={onDelete}>\n <DeleteOutline sx={{ fontSize: 16 }} />\n </DeleteButton>\n </Tooltip>\n ) : lastActiveStep?.execution?.signedAt ? (\n <Typography sx={{ fontSize: 12, fontWeight: 600 }}>\n <ExecutionTimerText\n expiryTimestamp={getExpiryTimestamp(lastActiveStep)}\n />\n </Typography>\n ) : null}\n </StatusRow>\n <RouteTokens route={route} />\n </Card>\n )\n}\n"],"mappings":";;;;;;;;;;;;;AAyBA,MAAa,yBAAyB,EACpC,OACA,QACA,SACA,eAC6C;CAC7C,MAAM,EAAE,MAAM,gBAAgB;CAE9B,MAAM,iBAAiB,MAAM,MAAM,UAAU,SAAS,KAAK,UAAU;CACrE,MAAM,mBAAmB,gBAAgB,WAAW,SAAS,GAAG,GAAG;CACnE,MAAM,EAAE,UAAU,iBAAiB,gBAAgB,iBAAiB;CAEpE,MAAM,WAAW,WAAW,qBAAqB;AAoBjD,QACE,qBAACA,QAAD;EAAe;EAAS,UAAA;YAAxB,CACE,qBAAC,WAAD;GAAW,IAAI,EAAE,IAAI,KAAK;aAA1B,CACE,qBAAC,KAAD;IAAK,IAAI;KAAE,SAAS;KAAQ,YAAY;KAAU,KAAK;KAAK;cAA5D,QArBoB;AACxB,SAAI,SACF,QAAO,oBAAC,YAAD;MAAY,QAAO;MAAQ,MAAM;MAAM,CAAA;AAEhD,SACE;MAAC;MAAmB;MAAoB;MAAiB,CAAC,SACxD,kBAAkB,UAAU,GAC7B,CAED,QAAO,oBAAC,YAAD;MAAY,QAAO;MAAO,MAAM;MAAM,CAAA;AAE/C,YACE,oBAAC,eAAD,EAAA,UACE,oBAAC,yBAAD;MAAyB,MAAM;MAAI,IAAI;OAAE,KAAK;OAAI,MAAM;OAAI;MAAI,CAAA,EAClD,CAAA;QAEhB,EAOI,oBAAC,YAAD;KAAY,IAAI;MAAE,UAAU;MAAI,YAAY;MAAK;eAC9C;KACU,CAAA,CACT;OACL,WACC,oBAAC,SAAD;IAAS,OAAO,EAAE,0BAA0B;cAC1C,oBAAC,cAAD;KAAc,MAAK;KAAQ,SAAS;eAClC,oBAAC,eAAD,EAAe,IAAI,EAAE,UAAU,IAAI,EAAI,CAAA;KAC1B,CAAA;IACP,CAAA,GACR,gBAAgB,WAAW,WAC7B,oBAAC,YAAD;IAAY,IAAI;KAAE,UAAU;KAAI,YAAY;KAAK;cAC/C,oBAAC,oBAAD,EACE,iBAAiB,mBAAmB,eAAe,EACnD,CAAA;IACS,CAAA,GACX,KACM;MACZ,oBAAC,aAAD,EAAoB,OAAS,CAAA,CACxB"}
1
+ {"version":3,"file":"ActiveTransactionCard.js","names":["Card"],"sources":["../../../../src/components/TransactionCard/ActiveTransactionCard.tsx"],"sourcesContent":["import type { RouteExtended } from '@lifi/sdk'\nimport DeleteOutline from '@mui/icons-material/DeleteOutlined'\nimport { Box, Tooltip, Typography } from '@mui/material'\nimport type { JSX, MouseEvent } from 'react'\nimport { useTranslation } from 'react-i18next'\nimport { useActionMessage } from '../../hooks/useActionMessage.js'\nimport { RouteExecutionStatus } from '../../stores/routes/types.js'\nimport { Card } from '../Card/Card.js'\nimport { IconCircle } from '../IconCircle/IconCircle.js'\nimport { RouteTokens } from '../RouteCard/RouteTokens.js'\nimport { CircularProgressPending } from '../Step/CircularProgress.style.js'\nimport { ExecutionTimerText, getExpiryTimestamp } from '../Timer/StepTimer.js'\nimport {\n DeleteButton,\n PendingCircle,\n StatusRow,\n} from './ActiveTransactionCard.style.js'\n\ninterface ActiveTransactionCardProps {\n route: RouteExtended\n status?: RouteExecutionStatus\n onClick: () => void\n onDelete: (e: MouseEvent) => void\n}\n\nexport const ActiveTransactionCard = ({\n route,\n status,\n onClick,\n onDelete,\n}: ActiveTransactionCardProps): JSX.Element => {\n const { t } = useTranslation()\n\n const lastActiveStep = route.steps.findLast((step) => step.execution)\n const lastActiveAction = lastActiveStep?.execution?.actions?.at(-1)\n const { title } = useActionMessage(lastActiveStep, lastActiveAction)\n\n const isFailed = status === RouteExecutionStatus.Failed\n\n const statusIcon = (() => {\n if (isFailed) {\n return <IconCircle status=\"error\" size={24} />\n }\n if (\n ['ACTION_REQUIRED', 'MESSAGE_REQUIRED', 'RESET_REQUIRED'].includes(\n lastActiveAction?.status ?? ''\n )\n ) {\n return <IconCircle status=\"info\" size={24} />\n }\n return (\n <PendingCircle>\n <CircularProgressPending size={24} sx={{ top: -2, left: -2 }} />\n </PendingCircle>\n )\n })()\n\n return (\n <Card onClick={onClick} indented>\n <StatusRow sx={{ mb: 1.5 }}>\n <Box sx={{ display: 'flex', alignItems: 'center', gap: 1.5 }}>\n {statusIcon}\n <Typography sx={{ fontSize: 12, fontWeight: 500 }}>\n {title}\n </Typography>\n </Box>\n {isFailed ? (\n <Tooltip title={t('button.clearTransaction')}>\n <DeleteButton size=\"small\" onClick={onDelete}>\n <DeleteOutline sx={{ fontSize: 16 }} />\n </DeleteButton>\n </Tooltip>\n ) : lastActiveStep?.execution?.signedAt ? (\n <Typography sx={{ fontSize: 12, fontWeight: 600 }}>\n <ExecutionTimerText\n expiryTimestamp={getExpiryTimestamp(lastActiveStep)}\n />\n </Typography>\n ) : null}\n </StatusRow>\n <RouteTokens route={route} />\n </Card>\n )\n}\n"],"mappings":";;;;;;;;;;;;AAyBA,MAAa,yBAAyB,EACpC,OACA,QACA,SACA,eAC6C;CAC7C,MAAM,EAAE,MAAM,gBAAgB;CAE9B,MAAM,iBAAiB,MAAM,MAAM,UAAU,SAAS,KAAK,UAAU;CACrE,MAAM,mBAAmB,gBAAgB,WAAW,SAAS,GAAG,GAAG;CACnE,MAAM,EAAE,UAAU,iBAAiB,gBAAgB,iBAAiB;CAEpE,MAAM,WAAW,WAAA;AAoBjB,QACE,qBAACA,QAAD;EAAe;EAAS,UAAA;YAAxB,CACE,qBAAC,WAAD;GAAW,IAAI,EAAE,IAAI,KAAK;aAA1B,CACE,qBAAC,KAAD;IAAK,IAAI;KAAE,SAAS;KAAQ,YAAY;KAAU,KAAK;KAAK;cAA5D,QArBoB;AACxB,SAAI,SACF,QAAO,oBAAC,YAAD;MAAY,QAAO;MAAQ,MAAM;MAAM,CAAA;AAEhD,SACE;MAAC;MAAmB;MAAoB;MAAiB,CAAC,SACxD,kBAAkB,UAAU,GAC7B,CAED,QAAO,oBAAC,YAAD;MAAY,QAAO;MAAO,MAAM;MAAM,CAAA;AAE/C,YACE,oBAAC,eAAD,EAAA,UACE,oBAAC,yBAAD;MAAyB,MAAM;MAAI,IAAI;OAAE,KAAK;OAAI,MAAM;OAAI;MAAI,CAAA,EAClD,CAAA;QAEhB,EAOI,oBAAC,YAAD;KAAY,IAAI;MAAE,UAAU;MAAI,YAAY;MAAK;eAC9C;KACU,CAAA,CACT;OACL,WACC,oBAAC,SAAD;IAAS,OAAO,EAAE,0BAA0B;cAC1C,oBAAC,cAAD;KAAc,MAAK;KAAQ,SAAS;eAClC,oBAAC,eAAD,EAAe,IAAI,EAAE,UAAU,IAAI,EAAI,CAAA;KAC1B,CAAA;IACP,CAAA,GACR,gBAAgB,WAAW,WAC7B,oBAAC,YAAD;IAAY,IAAI;KAAE,UAAU;KAAI,YAAY;KAAK;cAC/C,oBAAC,oBAAD,EACE,iBAAiB,mBAAmB,eAAe,EACnD,CAAA;IACS,CAAA,GACX,KACM;MACZ,oBAAC,aAAD,EAAoB,OAAS,CAAA,CACxB"}
@@ -16,7 +16,7 @@ const StatusRow = styled(Box)(({ theme }) => ({
16
16
  gap: theme.spacing(1),
17
17
  padding: theme.spacing(1),
18
18
  borderRadius: theme.vars.shape.borderRadiusTertiary,
19
- backgroundColor: `rgba(${theme.vars.palette.common.onBackgroundChannel} / 0.04)`
19
+ backgroundColor: `color-mix(in srgb, ${theme.vars.palette.common.onBackground} 4%, transparent)`
20
20
  }));
21
21
  const DeleteButton = styled(IconButton)(({ theme }) => ({
22
22
  padding: theme.spacing(.5),
@@ -1 +1 @@
1
- {"version":3,"file":"ActiveTransactionCard.style.js","names":[],"sources":["../../../../src/components/TransactionCard/ActiveTransactionCard.style.tsx"],"sourcesContent":["import { Box, IconButton, styled } from '@mui/material'\nimport type React from 'react'\n\nexport const PendingCircle: React.FC<React.ComponentProps<typeof Box>> = styled(\n Box\n)(({ theme }) => ({\n position: 'relative',\n width: 24,\n height: 24,\n flexShrink: 0,\n borderRadius: '50%',\n border: `2px solid ${theme.vars.palette.grey[300]}`,\n ...theme.applyStyles('dark', {\n borderColor: theme.vars.palette.grey[800],\n }),\n}))\n\nexport const StatusRow: React.FC<React.ComponentProps<typeof Box>> = styled(\n Box\n)(({ theme }) => ({\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'space-between',\n gap: theme.spacing(1),\n padding: theme.spacing(1),\n borderRadius: theme.vars.shape.borderRadiusTertiary,\n backgroundColor: `rgba(${theme.vars.palette.common.onBackgroundChannel} / 0.04)`,\n}))\n\nexport const DeleteButton: React.FC<React.ComponentProps<typeof IconButton>> =\n styled(IconButton)(({ theme }) => ({\n padding: theme.spacing(0.5),\n backgroundColor: theme.vars.palette.background.paper,\n width: 24,\n height: 24,\n }))\n"],"mappings":";;AAGA,MAAa,gBAA4D,OACvE,IACD,EAAE,EAAE,aAAa;CAChB,UAAU;CACV,OAAO;CACP,QAAQ;CACR,YAAY;CACZ,cAAc;CACd,QAAQ,aAAa,MAAM,KAAK,QAAQ,KAAK;CAC7C,GAAG,MAAM,YAAY,QAAQ,EAC3B,aAAa,MAAM,KAAK,QAAQ,KAAK,MACtC,CAAC;CACH,EAAE;AAEH,MAAa,YAAwD,OACnE,IACD,EAAE,EAAE,aAAa;CAChB,SAAS;CACT,YAAY;CACZ,gBAAgB;CAChB,KAAK,MAAM,QAAQ,EAAE;CACrB,SAAS,MAAM,QAAQ,EAAE;CACzB,cAAc,MAAM,KAAK,MAAM;CAC/B,iBAAiB,QAAQ,MAAM,KAAK,QAAQ,OAAO,oBAAoB;CACxE,EAAE;AAEH,MAAa,eACX,OAAO,WAAW,EAAE,EAAE,aAAa;CACjC,SAAS,MAAM,QAAQ,GAAI;CAC3B,iBAAiB,MAAM,KAAK,QAAQ,WAAW;CAC/C,OAAO;CACP,QAAQ;CACT,EAAE"}
1
+ {"version":3,"file":"ActiveTransactionCard.style.js","names":[],"sources":["../../../../src/components/TransactionCard/ActiveTransactionCard.style.tsx"],"sourcesContent":["import { Box, IconButton, styled } from '@mui/material'\nimport type React from 'react'\n\nexport const PendingCircle: React.FC<React.ComponentProps<typeof Box>> = styled(\n Box\n)(({ theme }) => ({\n position: 'relative',\n width: 24,\n height: 24,\n flexShrink: 0,\n borderRadius: '50%',\n border: `2px solid ${theme.vars.palette.grey[300]}`,\n ...theme.applyStyles('dark', {\n borderColor: theme.vars.palette.grey[800],\n }),\n}))\n\nexport const StatusRow: React.FC<React.ComponentProps<typeof Box>> = styled(\n Box\n)(({ theme }) => ({\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'space-between',\n gap: theme.spacing(1),\n padding: theme.spacing(1),\n borderRadius: theme.vars.shape.borderRadiusTertiary,\n backgroundColor: `color-mix(in srgb, ${theme.vars.palette.common.onBackground} 4%, transparent)`,\n}))\n\nexport const DeleteButton: React.FC<React.ComponentProps<typeof IconButton>> =\n styled(IconButton)(({ theme }) => ({\n padding: theme.spacing(0.5),\n backgroundColor: theme.vars.palette.background.paper,\n width: 24,\n height: 24,\n }))\n"],"mappings":";;AAGA,MAAa,gBAA4D,OACvE,IACD,EAAE,EAAE,aAAa;CAChB,UAAU;CACV,OAAO;CACP,QAAQ;CACR,YAAY;CACZ,cAAc;CACd,QAAQ,aAAa,MAAM,KAAK,QAAQ,KAAK;CAC7C,GAAG,MAAM,YAAY,QAAQ,EAC3B,aAAa,MAAM,KAAK,QAAQ,KAAK,MACtC,CAAC;CACH,EAAE;AAEH,MAAa,YAAwD,OACnE,IACD,EAAE,EAAE,aAAa;CAChB,SAAS;CACT,YAAY;CACZ,gBAAgB;CAChB,KAAK,MAAM,QAAQ,EAAE;CACrB,SAAS,MAAM,QAAQ,EAAE;CACzB,cAAc,MAAM,KAAK,MAAM;CAC/B,iBAAiB,sBAAsB,MAAM,KAAK,QAAQ,OAAO,aAAa;CAC/E,EAAE;AAEH,MAAa,eACX,OAAO,WAAW,EAAE,EAAE,aAAa;CACjC,SAAS,MAAM,QAAQ,GAAI;CAC3B,iBAAiB,MAAM,KAAK,QAAQ,WAAW;CAC/C,OAAO;CACP,QAAQ;CACT,EAAE"}
@@ -79,8 +79,11 @@ const TransactionDetails = ({ route, ...props }) => {
79
79
  cursor: "pointer"
80
80
  },
81
81
  children: [/* @__PURE__ */ jsx(IconTypography, {
82
- mr: .5,
83
- fontSize: 16,
82
+ component: "span",
83
+ sx: {
84
+ mr: .5,
85
+ fontSize: 16
86
+ },
84
87
  children: /* @__PURE__ */ jsx(LocalGasStationRounded, { fontSize: "inherit" })
85
88
  }), /* @__PURE__ */ jsx(Typography, {
86
89
  "data-value": combinedFeesUSD,
@@ -1 +1 @@
1
- {"version":3,"file":"TransactionDetails.js","names":["Card"],"sources":["../../../src/components/TransactionDetails.tsx"],"sourcesContent":["import type { RouteExtended } from '@lifi/sdk'\nimport { useEthereumContext } from '@lifi/widget-provider'\nimport ExpandLess from '@mui/icons-material/ExpandLess'\nimport ExpandMore from '@mui/icons-material/ExpandMore'\nimport LocalGasStationRounded from '@mui/icons-material/LocalGasStationRounded'\nimport type { CardProps } from '@mui/material'\nimport { Box, Collapse, Tooltip, Typography } from '@mui/material'\nimport { useState } from 'react'\nimport { useTranslation } from 'react-i18next'\nimport { useWidgetConfig } from '../providers/WidgetProvider/WidgetProvider.js'\nimport { isRouteDone } from '../stores/routes/utils.js'\nimport { getAccumulatedFeeCostsBreakdown } from '../utils/fees.js'\nimport { formatTokenAmount, formatTokenPrice } from '../utils/format.js'\nimport { getPriceImpact } from '../utils/getPriceImpact.js'\nimport { Card } from './Card/Card.js'\nimport { CardIconButton } from './Card/CardIconButton.js'\nimport { FeeBreakdownTooltip } from './FeeBreakdownTooltip.js'\nimport { IconTypography } from './IconTypography.js'\nimport { TokenRate } from './TokenRate/TokenRate.js'\n\ninterface TransactionDetailsProps extends CardProps {\n route: RouteExtended\n}\n\nexport const TransactionDetails: React.FC<TransactionDetailsProps> = ({\n route,\n ...props\n}) => {\n const { t } = useTranslation()\n const { feeConfig, defaultUI } = useWidgetConfig()\n const [cardExpanded, setCardExpanded] = useState(\n defaultUI?.transactionDetailsExpanded ?? false\n )\n const { isGaslessStep } = useEthereumContext()\n\n const toggleCard = () => {\n setCardExpanded((cardExpanded) => !cardExpanded)\n }\n const { gasCosts, feeCosts, gasCostUSD, feeCostUSD, combinedFeesUSD } =\n getAccumulatedFeeCostsBreakdown(route)\n\n const priceImpact = getPriceImpact({\n fromAmount: BigInt(route.fromAmount),\n toAmount: BigInt(route.toAmount),\n fromToken: route.fromToken,\n toToken: route.toToken,\n })\n\n const feeCollectionStep = route.steps[0].includedSteps.find(\n (includedStep) => includedStep.tool === 'feeCollection'\n )\n\n let feeAmountUSD = 0\n let feePercentage = 0\n\n if (feeCollectionStep) {\n const estimatedFromAmount =\n BigInt(feeCollectionStep.estimate.fromAmount) -\n BigInt(feeCollectionStep.estimate.toAmount)\n\n feeAmountUSD = formatTokenPrice(\n estimatedFromAmount,\n feeCollectionStep.action.fromToken.priceUSD,\n feeCollectionStep.action.fromToken.decimals\n )\n\n feePercentage =\n feeCollectionStep.estimate.feeCosts?.reduce(\n (percentage, feeCost) =>\n percentage + Number.parseFloat(feeCost.percentage || '0'),\n 0\n ) ?? 0\n }\n\n const hasGaslessSupport = route.steps.every((step) => isGaslessStep?.(step))\n\n const showIntegratorFeeCollectionDetails =\n (feeAmountUSD || Number.isFinite(feeConfig?.fee)) && !hasGaslessSupport\n\n return (\n <Card selectionColor=\"secondary\" {...props}>\n <Box\n sx={{\n display: 'flex',\n alignItems: 'center',\n px: 2,\n py: 1.75,\n }}\n >\n <Box\n sx={{\n display: 'flex',\n flex: 1,\n alignItems: 'center',\n justifyContent: 'left',\n }}\n >\n <TokenRate route={route} />\n </Box>\n <Collapse timeout={100} in={!cardExpanded} mountOnEnter>\n <FeeBreakdownTooltip\n gasCosts={gasCosts}\n feeCosts={feeCosts}\n gasless={hasGaslessSupport}\n >\n <Box\n onClick={toggleCard}\n role=\"button\"\n sx={{\n display: 'flex',\n alignItems: 'center',\n px: 1,\n cursor: 'pointer',\n }}\n >\n <IconTypography mr={0.5} fontSize={16}>\n <LocalGasStationRounded fontSize=\"inherit\" />\n </IconTypography>\n <Typography\n data-value={combinedFeesUSD}\n sx={{\n fontSize: 14,\n color: 'text.primary',\n fontWeight: 600,\n lineHeight: 1.429,\n }}\n >\n {!combinedFeesUSD\n ? t('main.fees.free')\n : t('format.currency', { value: combinedFeesUSD })}\n </Typography>\n </Box>\n </FeeBreakdownTooltip>\n </Collapse>\n <CardIconButton onClick={toggleCard} size=\"small\">\n {cardExpanded ? (\n <ExpandLess fontSize=\"inherit\" />\n ) : (\n <ExpandMore fontSize=\"inherit\" />\n )}\n </CardIconButton>\n </Box>\n <Collapse timeout={225} in={cardExpanded} mountOnEnter>\n <Box\n sx={{\n px: 2,\n pb: 2,\n }}\n >\n <Box\n sx={{\n display: 'flex',\n justifyContent: 'space-between',\n mb: 0.5,\n }}\n >\n <Typography variant=\"body2\">{t('main.fees.network')}</Typography>\n <FeeBreakdownTooltip\n gasCosts={gasCosts}\n gasless={hasGaslessSupport}\n >\n <Typography\n variant=\"body2\"\n sx={{ fontWeight: 600, cursor: 'help' }}\n >\n {!gasCostUSD\n ? t('main.fees.free')\n : t('format.currency', {\n value: gasCostUSD,\n })}\n </Typography>\n </FeeBreakdownTooltip>\n </Box>\n {feeCosts.length ? (\n <Box\n sx={{\n display: 'flex',\n justifyContent: 'space-between',\n mb: 0.5,\n }}\n >\n <Typography variant=\"body2\">{t('main.fees.provider')}</Typography>\n <FeeBreakdownTooltip feeCosts={feeCosts}>\n <Typography\n variant=\"body2\"\n sx={{ fontWeight: 600, cursor: 'help' }}\n >\n {t('format.currency', {\n value: feeCostUSD,\n })}\n </Typography>\n </FeeBreakdownTooltip>\n </Box>\n ) : null}\n {showIntegratorFeeCollectionDetails ? (\n <Box\n sx={{\n display: 'flex',\n justifyContent: 'space-between',\n mb: 0.5,\n }}\n >\n <Typography variant=\"body2\">\n {feeConfig?.name || t('main.fees.defaultIntegrator')}\n {feeConfig?.showFeePercentage && (\n <> ({t('format.percent', { value: feePercentage })})</>\n )}\n </Typography>\n {feeConfig?.showFeeTooltip &&\n (feeConfig?.name || feeConfig?.feeTooltipComponent) ? (\n <Tooltip\n title={\n feeConfig?.feeTooltipComponent ||\n t('tooltip.feeCollection', { tool: feeConfig.name })\n }\n >\n <Typography\n variant=\"body2\"\n sx={{ fontWeight: 600, cursor: 'help' }}\n >\n {t('format.currency', {\n value: feeAmountUSD,\n })}\n </Typography>\n </Tooltip>\n ) : (\n <Typography variant=\"body2\" sx={{ fontWeight: 600 }}>\n {t('format.currency', {\n value: feeAmountUSD,\n })}\n </Typography>\n )}\n </Box>\n ) : null}\n <Box\n sx={{\n display: 'flex',\n justifyContent: 'space-between',\n mb: 0.5,\n }}\n >\n <Typography variant=\"body2\">{t('main.priceImpact')}</Typography>\n <Tooltip title={t('tooltip.priceImpact')}>\n <Typography\n variant=\"body2\"\n sx={{ fontWeight: 600, cursor: 'help' }}\n >\n {t('format.percent', {\n value: priceImpact,\n usePlusSign: true,\n })}\n </Typography>\n </Tooltip>\n </Box>\n {!isRouteDone(route) ? (\n <>\n <Box\n sx={{\n display: 'flex',\n justifyContent: 'space-between',\n mb: 0.5,\n }}\n >\n <Typography variant=\"body2\">{t('main.maxSlippage')}</Typography>\n <Tooltip title={t('tooltip.slippage')}>\n <Typography\n variant=\"body2\"\n sx={{ fontWeight: 600, cursor: 'help' }}\n >\n {route.steps[0].action.slippage\n ? t('format.percent', {\n value: route.steps[0].action.slippage,\n })\n : t('button.auto')}\n </Typography>\n </Tooltip>\n </Box>\n <Box\n sx={{\n display: 'flex',\n justifyContent: 'space-between',\n }}\n >\n <Typography variant=\"body2\">{t('main.minReceived')}</Typography>\n <Tooltip title={t('tooltip.minReceived')}>\n <Typography\n variant=\"body2\"\n sx={{ fontWeight: 600, cursor: 'help' }}\n >\n {t('format.tokenAmount', {\n value: formatTokenAmount(\n BigInt(route.toAmountMin),\n route.toToken.decimals\n ),\n })}{' '}\n {route.toToken.symbol}\n </Typography>\n </Tooltip>\n </Box>\n </>\n ) : null}\n </Box>\n </Collapse>\n </Card>\n )\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"TransactionDetails.js","names":["Card"],"sources":["../../../src/components/TransactionDetails.tsx"],"sourcesContent":["import type { RouteExtended } from '@lifi/sdk'\nimport { useEthereumContext } from '@lifi/widget-provider'\nimport ExpandLess from '@mui/icons-material/ExpandLess'\nimport ExpandMore from '@mui/icons-material/ExpandMore'\nimport LocalGasStationRounded from '@mui/icons-material/LocalGasStationRounded'\nimport type { CardProps } from '@mui/material'\nimport { Box, Collapse, Tooltip, Typography } from '@mui/material'\nimport { useState } from 'react'\nimport { useTranslation } from 'react-i18next'\nimport { useWidgetConfig } from '../providers/WidgetProvider/WidgetProvider.js'\nimport { isRouteDone } from '../stores/routes/utils.js'\nimport { getAccumulatedFeeCostsBreakdown } from '../utils/fees.js'\nimport { formatTokenAmount, formatTokenPrice } from '../utils/format.js'\nimport { getPriceImpact } from '../utils/getPriceImpact.js'\nimport { Card } from './Card/Card.js'\nimport { CardIconButton } from './Card/CardIconButton.js'\nimport { FeeBreakdownTooltip } from './FeeBreakdownTooltip.js'\nimport { IconTypography } from './IconTypography.js'\nimport { TokenRate } from './TokenRate/TokenRate.js'\n\ninterface TransactionDetailsProps extends CardProps {\n route: RouteExtended\n}\n\nexport const TransactionDetails: React.FC<TransactionDetailsProps> = ({\n route,\n ...props\n}) => {\n const { t } = useTranslation()\n const { feeConfig, defaultUI } = useWidgetConfig()\n const [cardExpanded, setCardExpanded] = useState(\n defaultUI?.transactionDetailsExpanded ?? false\n )\n const { isGaslessStep } = useEthereumContext()\n\n const toggleCard = () => {\n setCardExpanded((cardExpanded) => !cardExpanded)\n }\n const { gasCosts, feeCosts, gasCostUSD, feeCostUSD, combinedFeesUSD } =\n getAccumulatedFeeCostsBreakdown(route)\n\n const priceImpact = getPriceImpact({\n fromAmount: BigInt(route.fromAmount),\n toAmount: BigInt(route.toAmount),\n fromToken: route.fromToken,\n toToken: route.toToken,\n })\n\n const feeCollectionStep = route.steps[0].includedSteps.find(\n (includedStep) => includedStep.tool === 'feeCollection'\n )\n\n let feeAmountUSD = 0\n let feePercentage = 0\n\n if (feeCollectionStep) {\n const estimatedFromAmount =\n BigInt(feeCollectionStep.estimate.fromAmount) -\n BigInt(feeCollectionStep.estimate.toAmount)\n\n feeAmountUSD = formatTokenPrice(\n estimatedFromAmount,\n feeCollectionStep.action.fromToken.priceUSD,\n feeCollectionStep.action.fromToken.decimals\n )\n\n feePercentage =\n feeCollectionStep.estimate.feeCosts?.reduce(\n (percentage, feeCost) =>\n percentage + Number.parseFloat(feeCost.percentage || '0'),\n 0\n ) ?? 0\n }\n\n const hasGaslessSupport = route.steps.every((step) => isGaslessStep?.(step))\n\n const showIntegratorFeeCollectionDetails =\n (feeAmountUSD || Number.isFinite(feeConfig?.fee)) && !hasGaslessSupport\n\n return (\n <Card selectionColor=\"secondary\" {...props}>\n <Box\n sx={{\n display: 'flex',\n alignItems: 'center',\n px: 2,\n py: 1.75,\n }}\n >\n <Box\n sx={{\n display: 'flex',\n flex: 1,\n alignItems: 'center',\n justifyContent: 'left',\n }}\n >\n <TokenRate route={route} />\n </Box>\n <Collapse timeout={100} in={!cardExpanded} mountOnEnter>\n <FeeBreakdownTooltip\n gasCosts={gasCosts}\n feeCosts={feeCosts}\n gasless={hasGaslessSupport}\n >\n <Box\n onClick={toggleCard}\n role=\"button\"\n sx={{\n display: 'flex',\n alignItems: 'center',\n px: 1,\n cursor: 'pointer',\n }}\n >\n <IconTypography component=\"span\" sx={{ mr: 0.5, fontSize: 16 }}>\n <LocalGasStationRounded fontSize=\"inherit\" />\n </IconTypography>\n <Typography\n data-value={combinedFeesUSD}\n sx={{\n fontSize: 14,\n color: 'text.primary',\n fontWeight: 600,\n lineHeight: 1.429,\n }}\n >\n {!combinedFeesUSD\n ? t('main.fees.free')\n : t('format.currency', { value: combinedFeesUSD })}\n </Typography>\n </Box>\n </FeeBreakdownTooltip>\n </Collapse>\n <CardIconButton onClick={toggleCard} size=\"small\">\n {cardExpanded ? (\n <ExpandLess fontSize=\"inherit\" />\n ) : (\n <ExpandMore fontSize=\"inherit\" />\n )}\n </CardIconButton>\n </Box>\n <Collapse timeout={225} in={cardExpanded} mountOnEnter>\n <Box\n sx={{\n px: 2,\n pb: 2,\n }}\n >\n <Box\n sx={{\n display: 'flex',\n justifyContent: 'space-between',\n mb: 0.5,\n }}\n >\n <Typography variant=\"body2\">{t('main.fees.network')}</Typography>\n <FeeBreakdownTooltip\n gasCosts={gasCosts}\n gasless={hasGaslessSupport}\n >\n <Typography\n variant=\"body2\"\n sx={{ fontWeight: 600, cursor: 'help' }}\n >\n {!gasCostUSD\n ? t('main.fees.free')\n : t('format.currency', {\n value: gasCostUSD,\n })}\n </Typography>\n </FeeBreakdownTooltip>\n </Box>\n {feeCosts.length ? (\n <Box\n sx={{\n display: 'flex',\n justifyContent: 'space-between',\n mb: 0.5,\n }}\n >\n <Typography variant=\"body2\">{t('main.fees.provider')}</Typography>\n <FeeBreakdownTooltip feeCosts={feeCosts}>\n <Typography\n variant=\"body2\"\n sx={{ fontWeight: 600, cursor: 'help' }}\n >\n {t('format.currency', {\n value: feeCostUSD,\n })}\n </Typography>\n </FeeBreakdownTooltip>\n </Box>\n ) : null}\n {showIntegratorFeeCollectionDetails ? (\n <Box\n sx={{\n display: 'flex',\n justifyContent: 'space-between',\n mb: 0.5,\n }}\n >\n <Typography variant=\"body2\">\n {feeConfig?.name || t('main.fees.defaultIntegrator')}\n {feeConfig?.showFeePercentage && (\n <> ({t('format.percent', { value: feePercentage })})</>\n )}\n </Typography>\n {feeConfig?.showFeeTooltip &&\n (feeConfig?.name || feeConfig?.feeTooltipComponent) ? (\n <Tooltip\n title={\n feeConfig?.feeTooltipComponent ||\n t('tooltip.feeCollection', { tool: feeConfig.name })\n }\n >\n <Typography\n variant=\"body2\"\n sx={{ fontWeight: 600, cursor: 'help' }}\n >\n {t('format.currency', {\n value: feeAmountUSD,\n })}\n </Typography>\n </Tooltip>\n ) : (\n <Typography variant=\"body2\" sx={{ fontWeight: 600 }}>\n {t('format.currency', {\n value: feeAmountUSD,\n })}\n </Typography>\n )}\n </Box>\n ) : null}\n <Box\n sx={{\n display: 'flex',\n justifyContent: 'space-between',\n mb: 0.5,\n }}\n >\n <Typography variant=\"body2\">{t('main.priceImpact')}</Typography>\n <Tooltip title={t('tooltip.priceImpact')}>\n <Typography\n variant=\"body2\"\n sx={{ fontWeight: 600, cursor: 'help' }}\n >\n {t('format.percent', {\n value: priceImpact,\n usePlusSign: true,\n })}\n </Typography>\n </Tooltip>\n </Box>\n {!isRouteDone(route) ? (\n <>\n <Box\n sx={{\n display: 'flex',\n justifyContent: 'space-between',\n mb: 0.5,\n }}\n >\n <Typography variant=\"body2\">{t('main.maxSlippage')}</Typography>\n <Tooltip title={t('tooltip.slippage')}>\n <Typography\n variant=\"body2\"\n sx={{ fontWeight: 600, cursor: 'help' }}\n >\n {route.steps[0].action.slippage\n ? t('format.percent', {\n value: route.steps[0].action.slippage,\n })\n : t('button.auto')}\n </Typography>\n </Tooltip>\n </Box>\n <Box\n sx={{\n display: 'flex',\n justifyContent: 'space-between',\n }}\n >\n <Typography variant=\"body2\">{t('main.minReceived')}</Typography>\n <Tooltip title={t('tooltip.minReceived')}>\n <Typography\n variant=\"body2\"\n sx={{ fontWeight: 600, cursor: 'help' }}\n >\n {t('format.tokenAmount', {\n value: formatTokenAmount(\n BigInt(route.toAmountMin),\n route.toToken.decimals\n ),\n })}{' '}\n {route.toToken.symbol}\n </Typography>\n </Tooltip>\n </Box>\n </>\n ) : null}\n </Box>\n </Collapse>\n </Card>\n )\n}\n"],"mappings":"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"}
@@ -1,6 +1,6 @@
1
1
  //#region src/config/version.d.ts
2
2
  declare const name = "@lifi/widget";
3
- declare const version = "4.0.0-beta.13";
3
+ declare const version = "4.0.0-beta.17";
4
4
  //#endregion
5
5
  export { name, version };
6
6
  //# sourceMappingURL=version.d.ts.map
@@ -1,6 +1,6 @@
1
1
  //#region src/config/version.ts
2
2
  const name = "@lifi/widget";
3
- const version = "4.0.0-beta.13";
3
+ const version = "4.0.0-beta.17";
4
4
  //#endregion
5
5
  export { name, version };
6
6
 
@@ -1 +1 @@
1
- {"version":3,"file":"version.js","names":[],"sources":["../../../src/config/version.ts"],"sourcesContent":["export const name = '@lifi/widget'\nexport const version = '4.0.0-beta.13'\n"],"mappings":";AAAA,MAAa,OAAO;AACpB,MAAa,UAAU"}
1
+ {"version":3,"file":"version.js","names":[],"sources":["../../../src/config/version.ts"],"sourcesContent":["export const name = '@lifi/widget'\nexport const version = '4.0.0-beta.17'\n"],"mappings":";AAAA,MAAa,OAAO;AACpB,MAAa,UAAU"}
@@ -4,11 +4,6 @@ import { useMutation } from "@tanstack/react-query";
4
4
  import { useChainTypeFromAddress } from "@lifi/widget-provider";
5
5
  import { useTranslation } from "react-i18next";
6
6
  //#region src/hooks/useAddressValidation.ts
7
- let AddressType = /* @__PURE__ */ function(AddressType) {
8
- AddressType[AddressType["Address"] = 0] = "Address";
9
- AddressType[AddressType["NameService"] = 1] = "NameService";
10
- return AddressType;
11
- }({});
12
7
  const useAddressValidation = () => {
13
8
  const { t } = useTranslation();
14
9
  const { getChainTypeFromAddress } = useChainTypeFromAddress();
@@ -19,7 +14,7 @@ const useAddressValidation = () => {
19
14
  const _chainType = getChainTypeFromAddress(value);
20
15
  if (_chainType) return {
21
16
  address: value,
22
- addressType: AddressType.Address,
17
+ addressType: 0,
23
18
  chainType: _chainType,
24
19
  isValid: true
25
20
  };
@@ -28,7 +23,7 @@ const useAddressValidation = () => {
28
23
  const _chainType = getChainTypeFromAddress(address);
29
24
  if (_chainType) return {
30
25
  address,
31
- addressType: AddressType.NameService,
26
+ addressType: 1,
32
27
  chainType: _chainType,
33
28
  isValid: true
34
29
  };
@@ -50,6 +45,6 @@ const useAddressValidation = () => {
50
45
  };
51
46
  };
52
47
  //#endregion
53
- export { AddressType, useAddressValidation };
48
+ export { useAddressValidation };
54
49
 
55
50
  //# sourceMappingURL=useAddressValidation.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"useAddressValidation.js","names":[],"sources":["../../../src/hooks/useAddressValidation.ts"],"sourcesContent":["import type { Chain, ChainType } from '@lifi/sdk'\nimport { getNameServiceAddress } from '@lifi/sdk'\nimport { useChainTypeFromAddress } from '@lifi/widget-provider'\nimport { useMutation } from '@tanstack/react-query'\nimport { useTranslation } from 'react-i18next'\nimport { useSDKClient } from '../providers/SDKClientProvider.js'\n\nexport enum AddressType {\n Address = 0,\n NameService = 1,\n}\n\ntype ValidationArgs = {\n value: string\n chainType?: ChainType\n chain?: Chain\n}\n\ntype ValidResponse = {\n address: string\n addressType: AddressType\n chainType: ChainType\n isValid: true\n}\n\ntype InvalidResponse = {\n error: string\n isValid: false\n}\n\nexport const useAddressValidation = (): {\n validateAddress: (\n args: ValidationArgs\n ) => Promise<ValidResponse | InvalidResponse>\n isValidating: boolean\n} => {\n const { t } = useTranslation()\n const { getChainTypeFromAddress } = useChainTypeFromAddress()\n const sdkClient = useSDKClient()\n\n const { mutateAsync: validateAddress, isPending: isValidating } = useMutation(\n {\n mutationFn: async ({\n value,\n chainType,\n chain,\n }: ValidationArgs): Promise<ValidResponse | InvalidResponse> => {\n try {\n if (!value) {\n throw new Error()\n }\n\n const _chainType = getChainTypeFromAddress(value)\n if (_chainType) {\n return {\n address: value,\n addressType: AddressType.Address,\n chainType: _chainType,\n isValid: true,\n }\n }\n\n const address = await getNameServiceAddress(\n sdkClient,\n value,\n chainType\n )\n\n if (address) {\n const _chainType = getChainTypeFromAddress(address)\n if (_chainType) {\n return {\n address: address,\n addressType: AddressType.NameService,\n chainType: _chainType,\n isValid: true,\n }\n }\n }\n\n throw new Error()\n } catch (_) {\n return {\n isValid: false,\n error: t(\n 'error.title.walletAddressInvalid',\n chain?.name\n ? { context: 'chain', chainName: chain.name }\n : undefined\n ),\n }\n }\n },\n }\n )\n\n return {\n validateAddress,\n isValidating,\n }\n}\n"],"mappings":";;;;;;AAOA,IAAY,cAAL,yBAAA,aAAA;AACL,aAAA,YAAA,aAAA,KAAA;AACA,aAAA,YAAA,iBAAA,KAAA;;KACD;AAoBD,MAAa,6BAKR;CACH,MAAM,EAAE,MAAM,gBAAgB;CAC9B,MAAM,EAAE,4BAA4B,yBAAyB;CAC7D,MAAM,YAAY,cAAc;CAEhC,MAAM,EAAE,aAAa,iBAAiB,WAAW,iBAAiB,YAChE,EACE,YAAY,OAAO,EACjB,OACA,WACA,YAC8D;AAC9D,MAAI;AACF,OAAI,CAAC,MACH,OAAM,IAAI,OAAO;GAGnB,MAAM,aAAa,wBAAwB,MAAM;AACjD,OAAI,WACF,QAAO;IACL,SAAS;IACT,aAAa,YAAY;IACzB,WAAW;IACX,SAAS;IACV;GAGH,MAAM,UAAU,MAAM,sBACpB,WACA,OACA,UACD;AAED,OAAI,SAAS;IACX,MAAM,aAAa,wBAAwB,QAAQ;AACnD,QAAI,WACF,QAAO;KACI;KACT,aAAa,YAAY;KACzB,WAAW;KACX,SAAS;KACV;;AAIL,SAAM,IAAI,OAAO;WACV,GAAG;AACV,UAAO;IACL,SAAS;IACT,OAAO,EACL,oCACA,OAAO,OACH;KAAE,SAAS;KAAS,WAAW,MAAM;KAAM,GAC3C,KAAA,EACL;IACF;;IAGN,CACF;AAED,QAAO;EACL;EACA;EACD"}
1
+ {"version":3,"file":"useAddressValidation.js","names":[],"sources":["../../../src/hooks/useAddressValidation.ts"],"sourcesContent":["import type { Chain, ChainType } from '@lifi/sdk'\nimport { getNameServiceAddress } from '@lifi/sdk'\nimport { useChainTypeFromAddress } from '@lifi/widget-provider'\nimport { useMutation } from '@tanstack/react-query'\nimport { useTranslation } from 'react-i18next'\nimport { useSDKClient } from '../providers/SDKClientProvider.js'\n\nexport enum AddressType {\n Address = 0,\n NameService = 1,\n}\n\ntype ValidationArgs = {\n value: string\n chainType?: ChainType\n chain?: Chain\n}\n\ntype ValidResponse = {\n address: string\n addressType: AddressType\n chainType: ChainType\n isValid: true\n}\n\ntype InvalidResponse = {\n error: string\n isValid: false\n}\n\nexport const useAddressValidation = (): {\n validateAddress: (\n args: ValidationArgs\n ) => Promise<ValidResponse | InvalidResponse>\n isValidating: boolean\n} => {\n const { t } = useTranslation()\n const { getChainTypeFromAddress } = useChainTypeFromAddress()\n const sdkClient = useSDKClient()\n\n const { mutateAsync: validateAddress, isPending: isValidating } = useMutation(\n {\n mutationFn: async ({\n value,\n chainType,\n chain,\n }: ValidationArgs): Promise<ValidResponse | InvalidResponse> => {\n try {\n if (!value) {\n throw new Error()\n }\n\n const _chainType = getChainTypeFromAddress(value)\n if (_chainType) {\n return {\n address: value,\n addressType: AddressType.Address,\n chainType: _chainType,\n isValid: true,\n }\n }\n\n const address = await getNameServiceAddress(\n sdkClient,\n value,\n chainType\n )\n\n if (address) {\n const _chainType = getChainTypeFromAddress(address)\n if (_chainType) {\n return {\n address: address,\n addressType: AddressType.NameService,\n chainType: _chainType,\n isValid: true,\n }\n }\n }\n\n throw new Error()\n } catch (_) {\n return {\n isValid: false,\n error: t(\n 'error.title.walletAddressInvalid',\n chain?.name\n ? { context: 'chain', chainName: chain.name }\n : undefined\n ),\n }\n }\n },\n }\n )\n\n return {\n validateAddress,\n isValidating,\n }\n}\n"],"mappings":";;;;;;AA8BA,MAAa,6BAKR;CACH,MAAM,EAAE,MAAM,gBAAgB;CAC9B,MAAM,EAAE,4BAA4B,yBAAyB;CAC7D,MAAM,YAAY,cAAc;CAEhC,MAAM,EAAE,aAAa,iBAAiB,WAAW,iBAAiB,YAChE,EACE,YAAY,OAAO,EACjB,OACA,WACA,YAC8D;AAC9D,MAAI;AACF,OAAI,CAAC,MACH,OAAM,IAAI,OAAO;GAGnB,MAAM,aAAa,wBAAwB,MAAM;AACjD,OAAI,WACF,QAAO;IACL,SAAS;IACT,aAAA;IACA,WAAW;IACX,SAAS;IACV;GAGH,MAAM,UAAU,MAAM,sBACpB,WACA,OACA,UACD;AAED,OAAI,SAAS;IACX,MAAM,aAAa,wBAAwB,QAAQ;AACnD,QAAI,WACF,QAAO;KACI;KACT,aAAA;KACA,WAAW;KACX,SAAS;KACV;;AAIL,SAAM,IAAI,OAAO;WACV,GAAG;AACV,UAAO;IACL,SAAS;IACT,OAAO,EACL,oCACA,OAAO,OACH;KAAE,SAAS;KAAS,WAAW,MAAM;KAAM,GAC3C,KAAA,EACL;IACF;;IAGN,CACF;AAED,QAAO;EACL;EACA;EACD"}
@@ -10,7 +10,8 @@ const supportedChainTypes = [
10
10
  ChainType.EVM,
11
11
  ChainType.SVM,
12
12
  ChainType.UTXO,
13
- ChainType.MVM
13
+ ChainType.MVM,
14
+ ChainType.TVM
14
15
  ];
15
16
  const useAvailableChains = (chainTypes, widgetConfig) => {
16
17
  const { chains: internalChains, keyPrefix: internalKeyPrefix } = useWidgetConfig();
@@ -1 +1 @@
1
- {"version":3,"file":"useAvailableChains.js","names":[],"sources":["../../../src/hooks/useAvailableChains.ts"],"sourcesContent":["import type { ExtendedChain } from '@lifi/sdk'\nimport { ChainType, createClient, getChains } from '@lifi/sdk'\nimport { useQuery } from '@tanstack/react-query'\nimport { useCallback, useEffect, useMemo } from 'react'\nimport { useSDKClient } from '../providers/SDKClientProvider.js'\nimport { useWidgetConfig } from '../providers/WidgetProvider/WidgetProvider.js'\nimport type { WidgetConfig } from '../types/widget.js'\nimport { getConfigItemSets, isItemAllowedForSets } from '../utils/item.js'\nimport { getQueryKey } from '../utils/queries.js'\n\ntype GetChainById = (\n chainId?: number,\n chains?: ExtendedChain[]\n) => ExtendedChain | undefined\n\nconst supportedChainTypes = [\n ChainType.EVM,\n ChainType.SVM,\n ChainType.UTXO,\n ChainType.MVM,\n]\n\nexport const useAvailableChains = (\n chainTypes?: ChainType[],\n widgetConfig?: WidgetConfig\n): {\n chains: ExtendedChain[] | undefined\n getChainById: GetChainById\n isLoading: boolean\n} => {\n const { chains: internalChains, keyPrefix: internalKeyPrefix } =\n useWidgetConfig()\n const internalClient = useSDKClient()\n\n const externalClient = useMemo(() => {\n if (!widgetConfig) {\n return undefined\n }\n return createClient({\n ...widgetConfig.sdkConfig,\n apiKey: widgetConfig.apiKey,\n integrator: widgetConfig.integrator ?? window?.location.hostname,\n })\n }, [widgetConfig])\n\n // Overwrite widget config if passed as param\n const keyPrefix = widgetConfig?.keyPrefix ?? internalKeyPrefix\n const chains = widgetConfig?.chains ?? internalChains\n\n const { data, isLoading } = useQuery({\n queryKey: [\n getQueryKey('chains', keyPrefix),\n chains?.types,\n chains?.allow,\n chains?.deny,\n chains?.from,\n chains?.to,\n !!externalClient,\n ] as const,\n queryFn: async ({ queryKey: [, chainTypesConfig] }) => {\n const chainsConfigSets = getConfigItemSets(\n chainTypesConfig,\n (chains) => new Set(chains)\n )\n const chainTypesRequest = supportedChainTypes.filter((chainType) =>\n isItemAllowedForSets(chainType, chainsConfigSets)\n )\n const client = externalClient ?? internalClient\n const availableChains = await getChains(client, {\n chainTypes: chainTypes || chainTypesRequest,\n })\n client.setChains(availableChains)\n return availableChains\n },\n refetchInterval: 300_000,\n staleTime: 300_000,\n })\n\n // Ensure the current internal client always has chains, even when:\n // - the query result came from cache (external call populated it first)\n // - the client was recreated due to config changes (stale closure in queryFn)\n useEffect(() => {\n if (data && !externalClient) {\n internalClient.setChains(data)\n }\n }, [data, externalClient, internalClient])\n\n const getChainById: GetChainById = useCallback(\n (chainId?: number, chains: ExtendedChain[] | undefined = data) => {\n if (!chainId) {\n return\n }\n const chain = chains?.find((chain) => chain.id === chainId)\n // if (!chain) {\n // throw new Error('Chain not found or chainId is invalid.');\n // }\n return chain\n },\n [data]\n )\n\n return {\n chains: data,\n getChainById,\n isLoading,\n }\n}\n"],"mappings":";;;;;;;;AAeA,MAAM,sBAAsB;CAC1B,UAAU;CACV,UAAU;CACV,UAAU;CACV,UAAU;CACX;AAED,MAAa,sBACX,YACA,iBAKG;CACH,MAAM,EAAE,QAAQ,gBAAgB,WAAW,sBACzC,iBAAiB;CACnB,MAAM,iBAAiB,cAAc;CAErC,MAAM,iBAAiB,cAAc;AACnC,MAAI,CAAC,aACH;AAEF,SAAO,aAAa;GAClB,GAAG,aAAa;GAChB,QAAQ,aAAa;GACrB,YAAY,aAAa,cAAc,QAAQ,SAAS;GACzD,CAAC;IACD,CAAC,aAAa,CAAC;CAGlB,MAAM,YAAY,cAAc,aAAa;CAC7C,MAAM,SAAS,cAAc,UAAU;CAEvC,MAAM,EAAE,MAAM,cAAc,SAAS;EACnC,UAAU;GACR,YAAY,UAAU,UAAU;GAChC,QAAQ;GACR,QAAQ;GACR,QAAQ;GACR,QAAQ;GACR,QAAQ;GACR,CAAC,CAAC;GACH;EACD,SAAS,OAAO,EAAE,UAAU,GAAG,wBAAwB;GACrD,MAAM,mBAAmB,kBACvB,mBACC,WAAW,IAAI,IAAI,OAAO,CAC5B;GACD,MAAM,oBAAoB,oBAAoB,QAAQ,cACpD,qBAAqB,WAAW,iBAAiB,CAClD;GACD,MAAM,SAAS,kBAAkB;GACjC,MAAM,kBAAkB,MAAM,UAAU,QAAQ,EAC9C,YAAY,cAAc,mBAC3B,CAAC;AACF,UAAO,UAAU,gBAAgB;AACjC,UAAO;;EAET,iBAAiB;EACjB,WAAW;EACZ,CAAC;AAKF,iBAAgB;AACd,MAAI,QAAQ,CAAC,eACX,gBAAe,UAAU,KAAK;IAE/B;EAAC;EAAM;EAAgB;EAAe,CAAC;AAgB1C,QAAO;EACL,QAAQ;EACR,cAhBiC,aAChC,SAAkB,SAAsC,SAAS;AAChE,OAAI,CAAC,QACH;AAMF,UAJc,QAAQ,MAAM,UAAU,MAAM,OAAO,QAAQ;KAM7D,CAAC,KAAK,CACP;EAKC;EACD"}
1
+ {"version":3,"file":"useAvailableChains.js","names":[],"sources":["../../../src/hooks/useAvailableChains.ts"],"sourcesContent":["import type { ExtendedChain } from '@lifi/sdk'\nimport { ChainType, createClient, getChains } from '@lifi/sdk'\nimport { useQuery } from '@tanstack/react-query'\nimport { useCallback, useEffect, useMemo } from 'react'\nimport { useSDKClient } from '../providers/SDKClientProvider.js'\nimport { useWidgetConfig } from '../providers/WidgetProvider/WidgetProvider.js'\nimport type { WidgetConfig } from '../types/widget.js'\nimport { getConfigItemSets, isItemAllowedForSets } from '../utils/item.js'\nimport { getQueryKey } from '../utils/queries.js'\n\ntype GetChainById = (\n chainId?: number,\n chains?: ExtendedChain[]\n) => ExtendedChain | undefined\n\nconst supportedChainTypes = [\n ChainType.EVM,\n ChainType.SVM,\n ChainType.UTXO,\n ChainType.MVM,\n ChainType.TVM,\n]\n\nexport const useAvailableChains = (\n chainTypes?: ChainType[],\n widgetConfig?: WidgetConfig\n): {\n chains: ExtendedChain[] | undefined\n getChainById: GetChainById\n isLoading: boolean\n} => {\n const { chains: internalChains, keyPrefix: internalKeyPrefix } =\n useWidgetConfig()\n const internalClient = useSDKClient()\n\n const externalClient = useMemo(() => {\n if (!widgetConfig) {\n return undefined\n }\n return createClient({\n ...widgetConfig.sdkConfig,\n apiKey: widgetConfig.apiKey,\n integrator: widgetConfig.integrator ?? window?.location.hostname,\n })\n }, [widgetConfig])\n\n // Overwrite widget config if passed as param\n const keyPrefix = widgetConfig?.keyPrefix ?? internalKeyPrefix\n const chains = widgetConfig?.chains ?? internalChains\n\n const { data, isLoading } = useQuery({\n queryKey: [\n getQueryKey('chains', keyPrefix),\n chains?.types,\n chains?.allow,\n chains?.deny,\n chains?.from,\n chains?.to,\n !!externalClient,\n ] as const,\n queryFn: async ({ queryKey: [, chainTypesConfig] }) => {\n const chainsConfigSets = getConfigItemSets(\n chainTypesConfig,\n (chains) => new Set(chains)\n )\n const chainTypesRequest = supportedChainTypes.filter((chainType) =>\n isItemAllowedForSets(chainType, chainsConfigSets)\n )\n const client = externalClient ?? internalClient\n const availableChains = await getChains(client, {\n chainTypes: chainTypes || chainTypesRequest,\n })\n client.setChains(availableChains)\n return availableChains\n },\n refetchInterval: 300_000,\n staleTime: 300_000,\n })\n\n // Ensure the current internal client always has chains, even when:\n // - the query result came from cache (external call populated it first)\n // - the client was recreated due to config changes (stale closure in queryFn)\n useEffect(() => {\n if (data && !externalClient) {\n internalClient.setChains(data)\n }\n }, [data, externalClient, internalClient])\n\n const getChainById: GetChainById = useCallback(\n (chainId?: number, chains: ExtendedChain[] | undefined = data) => {\n if (!chainId) {\n return\n }\n const chain = chains?.find((chain) => chain.id === chainId)\n // if (!chain) {\n // throw new Error('Chain not found or chainId is invalid.');\n // }\n return chain\n },\n [data]\n )\n\n return {\n chains: data,\n getChainById,\n isLoading,\n }\n}\n"],"mappings":";;;;;;;;AAeA,MAAM,sBAAsB;CAC1B,UAAU;CACV,UAAU;CACV,UAAU;CACV,UAAU;CACV,UAAU;CACX;AAED,MAAa,sBACX,YACA,iBAKG;CACH,MAAM,EAAE,QAAQ,gBAAgB,WAAW,sBACzC,iBAAiB;CACnB,MAAM,iBAAiB,cAAc;CAErC,MAAM,iBAAiB,cAAc;AACnC,MAAI,CAAC,aACH;AAEF,SAAO,aAAa;GAClB,GAAG,aAAa;GAChB,QAAQ,aAAa;GACrB,YAAY,aAAa,cAAc,QAAQ,SAAS;GACzD,CAAC;IACD,CAAC,aAAa,CAAC;CAGlB,MAAM,YAAY,cAAc,aAAa;CAC7C,MAAM,SAAS,cAAc,UAAU;CAEvC,MAAM,EAAE,MAAM,cAAc,SAAS;EACnC,UAAU;GACR,YAAY,UAAU,UAAU;GAChC,QAAQ;GACR,QAAQ;GACR,QAAQ;GACR,QAAQ;GACR,QAAQ;GACR,CAAC,CAAC;GACH;EACD,SAAS,OAAO,EAAE,UAAU,GAAG,wBAAwB;GACrD,MAAM,mBAAmB,kBACvB,mBACC,WAAW,IAAI,IAAI,OAAO,CAC5B;GACD,MAAM,oBAAoB,oBAAoB,QAAQ,cACpD,qBAAqB,WAAW,iBAAiB,CAClD;GACD,MAAM,SAAS,kBAAkB;GACjC,MAAM,kBAAkB,MAAM,UAAU,QAAQ,EAC9C,YAAY,cAAc,mBAC3B,CAAC;AACF,UAAO,UAAU,gBAAgB;AACjC,UAAO;;EAET,iBAAiB;EACjB,WAAW;EACZ,CAAC;AAKF,iBAAgB;AACd,MAAI,QAAQ,CAAC,eACX,gBAAe,UAAU,KAAK;IAE/B;EAAC;EAAM;EAAgB;EAAe,CAAC;AAgB1C,QAAO;EACL,QAAQ;EACR,cAhBiC,aAChC,SAAkB,SAAsC,SAAS;AAChE,OAAI,CAAC,QACH;AAMF,UAJc,QAAQ,MAAM,UAAU,MAAM,OAAO,QAAQ;KAM7D,CAAC,KAAK,CACP;EAKC;EACD"}
@@ -1,11 +1,11 @@
1
1
  import { useWidgetEvents } from "./useWidgetEvents.js";
2
- import { WidgetEvent } from "../types/events.js";
2
+ import "../types/events.js";
3
3
  //#region src/hooks/useContactSupport.ts
4
4
  const useContactSupport = (supportId) => {
5
5
  const widgetEvents = useWidgetEvents();
6
6
  const handleContactSupport = () => {
7
- if (!widgetEvents.all.has(WidgetEvent.ContactSupport)) window.open("https://help.li.fi", "_blank", "nofollow noreferrer");
8
- else widgetEvents.emit(WidgetEvent.ContactSupport, { supportId });
7
+ if (!widgetEvents.all.has("contactSupport")) window.open("https://help.li.fi", "_blank", "nofollow noreferrer");
8
+ else widgetEvents.emit("contactSupport", { supportId });
9
9
  };
10
10
  return handleContactSupport;
11
11
  };
@@ -1 +1 @@
1
- {"version":3,"file":"useContactSupport.js","names":[],"sources":["../../../src/hooks/useContactSupport.ts"],"sourcesContent":["import { WidgetEvent } from '../types/events.js'\nimport { useWidgetEvents } from './useWidgetEvents.js'\n\nexport const useContactSupport = (supportId?: string): (() => void) => {\n const widgetEvents = useWidgetEvents()\n\n const handleContactSupport = () => {\n if (!widgetEvents.all.has(WidgetEvent.ContactSupport)) {\n window.open('https://help.li.fi', '_blank', 'nofollow noreferrer')\n } else {\n widgetEvents.emit(WidgetEvent.ContactSupport, { supportId })\n }\n }\n\n return handleContactSupport\n}\n"],"mappings":";;;AAGA,MAAa,qBAAqB,cAAqC;CACrE,MAAM,eAAe,iBAAiB;CAEtC,MAAM,6BAA6B;AACjC,MAAI,CAAC,aAAa,IAAI,IAAI,YAAY,eAAe,CACnD,QAAO,KAAK,sBAAsB,UAAU,sBAAsB;MAElE,cAAa,KAAK,YAAY,gBAAgB,EAAE,WAAW,CAAC;;AAIhE,QAAO"}
1
+ {"version":3,"file":"useContactSupport.js","names":[],"sources":["../../../src/hooks/useContactSupport.ts"],"sourcesContent":["import { WidgetEvent } from '../types/events.js'\nimport { useWidgetEvents } from './useWidgetEvents.js'\n\nexport const useContactSupport = (supportId?: string): (() => void) => {\n const widgetEvents = useWidgetEvents()\n\n const handleContactSupport = () => {\n if (!widgetEvents.all.has(WidgetEvent.ContactSupport)) {\n window.open('https://help.li.fi', '_blank', 'nofollow noreferrer')\n } else {\n widgetEvents.emit(WidgetEvent.ContactSupport, { supportId })\n }\n }\n\n return handleContactSupport\n}\n"],"mappings":";;;AAGA,MAAa,qBAAqB,cAAqC;CACrE,MAAM,eAAe,iBAAiB;CAEtC,MAAM,6BAA6B;AACjC,MAAI,CAAC,aAAa,IAAI,IAAA,iBAA+B,CACnD,QAAO,KAAK,sBAAsB,UAAU,sBAAsB;MAElE,cAAa,KAAA,kBAAiC,EAAE,WAAW,CAAC;;AAIhE,QAAO"}
@@ -4,19 +4,30 @@ import { useAvailableChains } from "./useAvailableChains.js";
4
4
  import { ChainId, ChainType, isHex } from "@lifi/sdk";
5
5
  //#region src/hooks/useExplorer.ts
6
6
  const sanitiseBaseUrl = (baseUrl) => baseUrl.trim().replace(/\/+$/, "");
7
+ const explorerPathOverrides = {
8
+ [ChainId.SUI]: {
9
+ txPath: "txblock",
10
+ addressPath: "coin"
11
+ },
12
+ [ChainType.TVM]: {
13
+ txPath: "#/transaction",
14
+ addressPath: "#/address"
15
+ }
16
+ };
7
17
  const useExplorer = () => {
8
18
  const { explorerUrls } = useWidgetConfig();
9
19
  const { getChainById } = useAvailableChains();
10
20
  const getExplorerConfig = (chain) => {
11
21
  const resolvedChain = Number.isFinite(chain) ? getChainById(chain) : chain;
12
22
  const explorerUrl = (resolvedChain ? explorerUrls?.[resolvedChain.id]?.[0] ?? resolvedChain.metamask.blockExplorerUrls[0] : explorerUrls?.internal?.[0]) || "https://scan.li.fi";
13
- const url = typeof explorerUrl === "string" ? explorerUrl : explorerUrl.url;
14
- const defaultTxPath = resolvedChain?.id === ChainId.SUI ? "txblock" : "tx";
15
- const defaultAddressPath = resolvedChain?.id === ChainId.SUI ? "coin" : "address";
23
+ const baseUrl = typeof explorerUrl === "string" ? explorerUrl : explorerUrl.url;
24
+ const overrides = explorerPathOverrides[resolvedChain?.id] ?? explorerPathOverrides[resolvedChain?.chainType];
25
+ const defaultTxPath = overrides?.txPath ?? "tx";
26
+ const defaultAddressPath = overrides?.addressPath ?? "address";
16
27
  const txPath = typeof explorerUrl === "string" ? defaultTxPath : explorerUrl.txPath || defaultTxPath;
17
28
  const addressPath = typeof explorerUrl === "string" ? defaultAddressPath : explorerUrl.addressPath || defaultAddressPath;
18
29
  return {
19
- url: sanitiseBaseUrl(url),
30
+ url: sanitiseBaseUrl(baseUrl),
20
31
  txPath,
21
32
  addressPath,
22
33
  resolvedChain
@@ -1 +1 @@
1
- {"version":3,"file":"useExplorer.js","names":[],"sources":["../../../src/hooks/useExplorer.ts"],"sourcesContent":["import type { Chain } from '@lifi/sdk'\nimport { ChainId, ChainType, isHex } from '@lifi/sdk'\nimport { internalExplorerUrl } from '../config/constants.js'\nimport { useAvailableChains } from '../hooks/useAvailableChains.js'\nimport { useWidgetConfig } from '../providers/WidgetProvider/WidgetProvider.js'\n\nconst sanitiseBaseUrl = (baseUrl: string) => baseUrl.trim().replace(/\\/+$/, '')\n\ntype TransactionLinkProps = { chain?: Chain | number } & (\n | {\n txHash: string\n txLink?: never\n }\n | {\n txHash?: never\n txLink: string\n }\n)\n\nexport const useExplorer = (): {\n getTransactionLink: (props: TransactionLinkProps) => string | undefined\n getAddressLink: (address: string, chain?: Chain | number) => string\n} => {\n const { explorerUrls } = useWidgetConfig()\n const { getChainById } = useAvailableChains()\n\n const getExplorerConfig = (chain?: Chain | number) => {\n const resolvedChain = Number.isFinite(chain)\n ? getChainById(chain as number)\n : (chain as Chain)\n\n const explorerUrl =\n (resolvedChain\n ? (explorerUrls?.[resolvedChain.id]?.[0] ??\n resolvedChain.metamask.blockExplorerUrls[0])\n : explorerUrls?.internal?.[0]) || internalExplorerUrl\n\n const url = typeof explorerUrl === 'string' ? explorerUrl : explorerUrl.url\n\n const defaultTxPath = resolvedChain?.id === ChainId.SUI ? 'txblock' : 'tx'\n const defaultAddressPath =\n resolvedChain?.id === ChainId.SUI ? 'coin' : 'address'\n const txPath =\n typeof explorerUrl === 'string'\n ? defaultTxPath\n : explorerUrl.txPath || defaultTxPath\n const addressPath =\n typeof explorerUrl === 'string'\n ? defaultAddressPath\n : explorerUrl.addressPath || defaultAddressPath\n\n return {\n url: sanitiseBaseUrl(url),\n txPath,\n addressPath,\n resolvedChain,\n }\n }\n\n const getTransactionLink = ({\n txHash,\n txLink,\n chain,\n }: TransactionLinkProps): string | undefined => {\n if (!txHash) {\n return txLink\n }\n\n const config = getExplorerConfig(chain)\n\n // For EVM chains, validate the transaction hash as some relayers return custom task hashes that are not visible on-chain\n if (config.resolvedChain?.chainType === ChainType.EVM) {\n if (!isHex(txHash, { strict: true })) {\n return undefined\n }\n }\n\n return `${config.url}/${config.txPath}/${txHash}`\n }\n\n const getAddressLink = (address: string, chain?: Chain | number) => {\n const config = getExplorerConfig(chain)\n return `${config.url}/${config.addressPath}/${address}`\n }\n\n return {\n getTransactionLink,\n getAddressLink,\n }\n}\n"],"mappings":";;;;;AAMA,MAAM,mBAAmB,YAAoB,QAAQ,MAAM,CAAC,QAAQ,QAAQ,GAAG;AAa/E,MAAa,oBAGR;CACH,MAAM,EAAE,iBAAiB,iBAAiB;CAC1C,MAAM,EAAE,iBAAiB,oBAAoB;CAE7C,MAAM,qBAAqB,UAA2B;EACpD,MAAM,gBAAgB,OAAO,SAAS,MAAM,GACxC,aAAa,MAAgB,GAC5B;EAEL,MAAM,eACH,gBACI,eAAe,cAAc,MAAM,MACpC,cAAc,SAAS,kBAAkB,KACzC,cAAc,WAAW,OAAA;EAE/B,MAAM,MAAM,OAAO,gBAAgB,WAAW,cAAc,YAAY;EAExE,MAAM,gBAAgB,eAAe,OAAO,QAAQ,MAAM,YAAY;EACtE,MAAM,qBACJ,eAAe,OAAO,QAAQ,MAAM,SAAS;EAC/C,MAAM,SACJ,OAAO,gBAAgB,WACnB,gBACA,YAAY,UAAU;EAC5B,MAAM,cACJ,OAAO,gBAAgB,WACnB,qBACA,YAAY,eAAe;AAEjC,SAAO;GACL,KAAK,gBAAgB,IAAI;GACzB;GACA;GACA;GACD;;CAGH,MAAM,sBAAsB,EAC1B,QACA,QACA,YAC8C;AAC9C,MAAI,CAAC,OACH,QAAO;EAGT,MAAM,SAAS,kBAAkB,MAAM;AAGvC,MAAI,OAAO,eAAe,cAAc,UAAU;OAC5C,CAAC,MAAM,QAAQ,EAAE,QAAQ,MAAM,CAAC,CAClC;;AAIJ,SAAO,GAAG,OAAO,IAAI,GAAG,OAAO,OAAO,GAAG;;CAG3C,MAAM,kBAAkB,SAAiB,UAA2B;EAClE,MAAM,SAAS,kBAAkB,MAAM;AACvC,SAAO,GAAG,OAAO,IAAI,GAAG,OAAO,YAAY,GAAG;;AAGhD,QAAO;EACL;EACA;EACD"}
1
+ {"version":3,"file":"useExplorer.js","names":[],"sources":["../../../src/hooks/useExplorer.ts"],"sourcesContent":["import type { Chain } from '@lifi/sdk'\nimport { ChainId, ChainType, isHex } from '@lifi/sdk'\nimport { internalExplorerUrl } from '../config/constants.js'\nimport { useAvailableChains } from '../hooks/useAvailableChains.js'\nimport { useWidgetConfig } from '../providers/WidgetProvider/WidgetProvider.js'\n\nconst sanitiseBaseUrl = (baseUrl: string) => baseUrl.trim().replace(/\\/+$/, '')\n\nconst explorerPathOverrides: Partial<\n Record<ChainType | ChainId, { txPath: string; addressPath: string }>\n> = {\n [ChainId.SUI]: { txPath: 'txblock', addressPath: 'coin' },\n [ChainType.TVM]: { txPath: '#/transaction', addressPath: '#/address' },\n}\n\ntype TransactionLinkProps = { chain?: Chain | number } & (\n | {\n txHash: string\n txLink?: never\n }\n | {\n txHash?: never\n txLink: string\n }\n)\n\nexport const useExplorer = (): {\n getTransactionLink: (props: TransactionLinkProps) => string | undefined\n getAddressLink: (address: string, chain?: Chain | number) => string\n} => {\n const { explorerUrls } = useWidgetConfig()\n const { getChainById } = useAvailableChains()\n\n const getExplorerConfig = (chain?: Chain | number) => {\n const resolvedChain = Number.isFinite(chain)\n ? getChainById(chain as number)\n : (chain as Chain)\n\n const explorerUrl =\n (resolvedChain\n ? (explorerUrls?.[resolvedChain.id]?.[0] ??\n resolvedChain.metamask.blockExplorerUrls[0])\n : explorerUrls?.internal?.[0]) || internalExplorerUrl\n\n const baseUrl =\n typeof explorerUrl === 'string' ? explorerUrl : explorerUrl.url\n\n const overrides =\n explorerPathOverrides[resolvedChain?.id as ChainId] ??\n explorerPathOverrides[resolvedChain?.chainType as ChainType]\n\n const defaultTxPath = overrides?.txPath ?? 'tx'\n const defaultAddressPath = overrides?.addressPath ?? 'address'\n const txPath =\n typeof explorerUrl === 'string'\n ? defaultTxPath\n : explorerUrl.txPath || defaultTxPath\n const addressPath =\n typeof explorerUrl === 'string'\n ? defaultAddressPath\n : explorerUrl.addressPath || defaultAddressPath\n\n return {\n url: sanitiseBaseUrl(baseUrl),\n txPath,\n addressPath,\n resolvedChain,\n }\n }\n\n const getTransactionLink = ({\n txHash,\n txLink,\n chain,\n }: TransactionLinkProps): string | undefined => {\n if (!txHash) {\n return txLink\n }\n\n const config = getExplorerConfig(chain)\n\n // For EVM chains, validate the transaction hash as some relayers return custom task hashes that are not visible on-chain\n if (config.resolvedChain?.chainType === ChainType.EVM) {\n if (!isHex(txHash, { strict: true })) {\n return undefined\n }\n }\n\n return `${config.url}/${config.txPath}/${txHash}`\n }\n\n const getAddressLink = (address: string, chain?: Chain | number) => {\n const config = getExplorerConfig(chain)\n return `${config.url}/${config.addressPath}/${address}`\n }\n\n return {\n getTransactionLink,\n getAddressLink,\n }\n}\n"],"mappings":";;;;;AAMA,MAAM,mBAAmB,YAAoB,QAAQ,MAAM,CAAC,QAAQ,QAAQ,GAAG;AAE/E,MAAM,wBAEF;EACD,QAAQ,MAAM;EAAE,QAAQ;EAAW,aAAa;EAAQ;EACxD,UAAU,MAAM;EAAE,QAAQ;EAAiB,aAAa;EAAa;CACvE;AAaD,MAAa,oBAGR;CACH,MAAM,EAAE,iBAAiB,iBAAiB;CAC1C,MAAM,EAAE,iBAAiB,oBAAoB;CAE7C,MAAM,qBAAqB,UAA2B;EACpD,MAAM,gBAAgB,OAAO,SAAS,MAAM,GACxC,aAAa,MAAgB,GAC5B;EAEL,MAAM,eACH,gBACI,eAAe,cAAc,MAAM,MACpC,cAAc,SAAS,kBAAkB,KACzC,cAAc,WAAW,OAAA;EAE/B,MAAM,UACJ,OAAO,gBAAgB,WAAW,cAAc,YAAY;EAE9D,MAAM,YACJ,sBAAsB,eAAe,OACrC,sBAAsB,eAAe;EAEvC,MAAM,gBAAgB,WAAW,UAAU;EAC3C,MAAM,qBAAqB,WAAW,eAAe;EACrD,MAAM,SACJ,OAAO,gBAAgB,WACnB,gBACA,YAAY,UAAU;EAC5B,MAAM,cACJ,OAAO,gBAAgB,WACnB,qBACA,YAAY,eAAe;AAEjC,SAAO;GACL,KAAK,gBAAgB,QAAQ;GAC7B;GACA;GACA;GACD;;CAGH,MAAM,sBAAsB,EAC1B,QACA,QACA,YAC8C;AAC9C,MAAI,CAAC,OACH,QAAO;EAGT,MAAM,SAAS,kBAAkB,MAAM;AAGvC,MAAI,OAAO,eAAe,cAAc,UAAU;OAC5C,CAAC,MAAM,QAAQ,EAAE,QAAQ,MAAM,CAAC,CAClC;;AAIJ,SAAO,GAAG,OAAO,IAAI,GAAG,OAAO,OAAO,GAAG;;CAG3C,MAAM,kBAAkB,SAAiB,UAA2B;EAClE,MAAM,SAAS,kBAAkB,MAAM;AACvC,SAAO,GAAG,OAAO,IAAI,GAAG,OAAO,YAAY,GAAG;;AAGhD,QAAO;EACL;EACA;EACD"}
@@ -1,5 +1,5 @@
1
1
  import { useWidgetConfig } from "../providers/WidgetProvider/WidgetProvider.js";
2
- import { HiddenUI } from "../types/widget.js";
2
+ import "../types/widget.js";
3
3
  import { useSDKClient } from "../providers/SDKClientProvider.js";
4
4
  import { getQueryKey } from "../utils/queries.js";
5
5
  import { useAvailableChains } from "./useAvailableChains.js";
@@ -28,7 +28,7 @@ const useGasRecommendation = (toChainId, fromChain, fromToken) => {
28
28
  fromToken
29
29
  }, { signal });
30
30
  },
31
- enabled: (checkRecommendationLiFuel || checkRecommendationMaxButton) && !hiddenUI?.includes(HiddenUI.GasRefuelMessage),
31
+ enabled: (checkRecommendationLiFuel || checkRecommendationMaxButton) && !hiddenUI?.includes("gasRefuelMessage"),
32
32
  refetchInterval,
33
33
  staleTime: refetchInterval
34
34
  });
@@ -1 +1 @@
1
- {"version":3,"file":"useGasRecommendation.js","names":[],"sources":["../../../src/hooks/useGasRecommendation.ts"],"sourcesContent":["import { type ChainId, getGasRecommendation } from '@lifi/sdk'\nimport type { UseQueryResult } from '@tanstack/react-query'\nimport { useQuery } from '@tanstack/react-query'\nimport { useSDKClient } from '../providers/SDKClientProvider.js'\nimport { useWidgetConfig } from '../providers/WidgetProvider/WidgetProvider.js'\nimport { HiddenUI } from '../types/widget.js'\nimport { getQueryKey } from '../utils/queries.js'\nimport { useAvailableChains } from './useAvailableChains.js'\n\nconst refetchInterval = 60_000\n\nexport const useGasRecommendation = (\n toChainId?: ChainId,\n fromChain?: ChainId,\n fromToken?: string\n): UseQueryResult<Awaited<ReturnType<typeof getGasRecommendation>> | null> => {\n const { chains } = useAvailableChains()\n const { keyPrefix, hiddenUI } = useWidgetConfig()\n const sdkClient = useSDKClient()\n\n const checkRecommendationLiFuel =\n Boolean(toChainId) &&\n Boolean(fromChain) &&\n Boolean(fromToken) &&\n Boolean(chains?.length)\n\n const checkRecommendationMaxButton =\n Boolean(toChainId) && !fromChain && !fromToken && Boolean(chains?.length)\n\n return useQuery({\n queryKey: [\n getQueryKey('gas-recommendation', keyPrefix),\n toChainId,\n fromChain,\n fromToken,\n ],\n queryFn: async ({\n queryKey: [_, toChainId, fromChain, fromToken],\n signal,\n }) => {\n if (!chains?.some((chain) => chain.id === toChainId)) {\n return null\n }\n const gasRecommendation = await getGasRecommendation(\n sdkClient,\n {\n chainId: toChainId as ChainId,\n fromChain: fromChain as ChainId,\n fromToken: fromToken as string,\n },\n { signal }\n )\n return gasRecommendation\n },\n enabled:\n (checkRecommendationLiFuel || checkRecommendationMaxButton) &&\n !hiddenUI?.includes(HiddenUI.GasRefuelMessage),\n refetchInterval,\n staleTime: refetchInterval,\n })\n}\n"],"mappings":";;;;;;;;AASA,MAAM,kBAAkB;AAExB,MAAa,wBACX,WACA,WACA,cAC4E;CAC5E,MAAM,EAAE,WAAW,oBAAoB;CACvC,MAAM,EAAE,WAAW,aAAa,iBAAiB;CACjD,MAAM,YAAY,cAAc;CAEhC,MAAM,4BACJ,QAAQ,UAAU,IAClB,QAAQ,UAAU,IAClB,QAAQ,UAAU,IAClB,QAAQ,QAAQ,OAAO;CAEzB,MAAM,+BACJ,QAAQ,UAAU,IAAI,CAAC,aAAa,CAAC,aAAa,QAAQ,QAAQ,OAAO;AAE3E,QAAO,SAAS;EACd,UAAU;GACR,YAAY,sBAAsB,UAAU;GAC5C;GACA;GACA;GACD;EACD,SAAS,OAAO,EACd,UAAU,CAAC,GAAG,WAAW,WAAW,YACpC,aACI;AACJ,OAAI,CAAC,QAAQ,MAAM,UAAU,MAAM,OAAO,UAAU,CAClD,QAAO;AAWT,UAT0B,MAAM,qBAC9B,WACA;IACE,SAAS;IACE;IACA;IACZ,EACD,EAAE,QAAQ,CACX;;EAGH,UACG,6BAA6B,iCAC9B,CAAC,UAAU,SAAS,SAAS,iBAAiB;EAChD;EACA,WAAW;EACZ,CAAC"}
1
+ {"version":3,"file":"useGasRecommendation.js","names":[],"sources":["../../../src/hooks/useGasRecommendation.ts"],"sourcesContent":["import { type ChainId, getGasRecommendation } from '@lifi/sdk'\nimport type { UseQueryResult } from '@tanstack/react-query'\nimport { useQuery } from '@tanstack/react-query'\nimport { useSDKClient } from '../providers/SDKClientProvider.js'\nimport { useWidgetConfig } from '../providers/WidgetProvider/WidgetProvider.js'\nimport { HiddenUI } from '../types/widget.js'\nimport { getQueryKey } from '../utils/queries.js'\nimport { useAvailableChains } from './useAvailableChains.js'\n\nconst refetchInterval = 60_000\n\nexport const useGasRecommendation = (\n toChainId?: ChainId,\n fromChain?: ChainId,\n fromToken?: string\n): UseQueryResult<Awaited<ReturnType<typeof getGasRecommendation>> | null> => {\n const { chains } = useAvailableChains()\n const { keyPrefix, hiddenUI } = useWidgetConfig()\n const sdkClient = useSDKClient()\n\n const checkRecommendationLiFuel =\n Boolean(toChainId) &&\n Boolean(fromChain) &&\n Boolean(fromToken) &&\n Boolean(chains?.length)\n\n const checkRecommendationMaxButton =\n Boolean(toChainId) && !fromChain && !fromToken && Boolean(chains?.length)\n\n return useQuery({\n queryKey: [\n getQueryKey('gas-recommendation', keyPrefix),\n toChainId,\n fromChain,\n fromToken,\n ],\n queryFn: async ({\n queryKey: [_, toChainId, fromChain, fromToken],\n signal,\n }) => {\n if (!chains?.some((chain) => chain.id === toChainId)) {\n return null\n }\n const gasRecommendation = await getGasRecommendation(\n sdkClient,\n {\n chainId: toChainId as ChainId,\n fromChain: fromChain as ChainId,\n fromToken: fromToken as string,\n },\n { signal }\n )\n return gasRecommendation\n },\n enabled:\n (checkRecommendationLiFuel || checkRecommendationMaxButton) &&\n !hiddenUI?.includes(HiddenUI.GasRefuelMessage),\n refetchInterval,\n staleTime: refetchInterval,\n })\n}\n"],"mappings":";;;;;;;;AASA,MAAM,kBAAkB;AAExB,MAAa,wBACX,WACA,WACA,cAC4E;CAC5E,MAAM,EAAE,WAAW,oBAAoB;CACvC,MAAM,EAAE,WAAW,aAAa,iBAAiB;CACjD,MAAM,YAAY,cAAc;CAEhC,MAAM,4BACJ,QAAQ,UAAU,IAClB,QAAQ,UAAU,IAClB,QAAQ,UAAU,IAClB,QAAQ,QAAQ,OAAO;CAEzB,MAAM,+BACJ,QAAQ,UAAU,IAAI,CAAC,aAAa,CAAC,aAAa,QAAQ,QAAQ,OAAO;AAE3E,QAAO,SAAS;EACd,UAAU;GACR,YAAY,sBAAsB,UAAU;GAC5C;GACA;GACA;GACD;EACD,SAAS,OAAO,EACd,UAAU,CAAC,GAAG,WAAW,WAAW,YACpC,aACI;AACJ,OAAI,CAAC,QAAQ,MAAM,UAAU,MAAM,OAAO,UAAU,CAClD,QAAO;AAWT,UAT0B,MAAM,qBAC9B,WACA;IACE,SAAS;IACE;IACA;IACZ,EACD,EAAE,QAAQ,CACX;;EAGH,UACG,6BAA6B,iCAC9B,CAAC,UAAU,SAAA,mBAAmC;EAChD;EACA,WAAW;EACZ,CAAC"}
@@ -1,5 +1,5 @@
1
1
  import { useWidgetConfig } from "../providers/WidgetProvider/WidgetProvider.js";
2
- import { HiddenUI } from "../types/widget.js";
2
+ import "../types/widget.js";
3
3
  import { useFieldValues } from "../stores/form/useFieldValues.js";
4
4
  import { useAvailableChains } from "./useAvailableChains.js";
5
5
  import { useGasRecommendation } from "./useGasRecommendation.js";
@@ -23,7 +23,7 @@ const useGasRefuel = () => {
23
23
  const isToAddressSatisfied = effectiveToAddress && !isToContractAddress;
24
24
  return {
25
25
  enabled: useMemo(() => {
26
- if (fromChainId === toChainId || !gasRecommendation?.available || !gasRecommendation?.recommended || !destinationNativeToken || !isChainTypeSatisfied || !isToAddressSatisfied || hiddenUI?.includes(HiddenUI.GasRefuelMessage)) return false;
26
+ if (fromChainId === toChainId || !gasRecommendation?.available || !gasRecommendation?.recommended || !destinationNativeToken || !isChainTypeSatisfied || !isToAddressSatisfied || hiddenUI?.includes("gasRefuelMessage")) return false;
27
27
  return (destinationNativeToken.amount ?? 0n) < BigInt(gasRecommendation.recommended.amount) / 2n;
28
28
  }, [
29
29
  fromChainId,
@@ -1 +1 @@
1
- {"version":3,"file":"useGasRefuel.js","names":[],"sources":["../../../src/hooks/useGasRefuel.ts"],"sourcesContent":["import type { ExtendedChain } from '@lifi/sdk'\nimport { useAccount } from '@lifi/wallet-management'\nimport { useMemo } from 'react'\nimport { useWidgetConfig } from '../providers/WidgetProvider/WidgetProvider.js'\nimport { useFieldValues } from '../stores/form/useFieldValues.js'\nimport { HiddenUI } from '../types/widget.js'\nimport { useAvailableChains } from './useAvailableChains.js'\nimport { useGasRecommendation } from './useGasRecommendation.js'\nimport { useIsContractAddress } from './useIsContractAddress.js'\nimport { useTokenBalance } from './useTokenBalance.js'\n\nexport const useGasRefuel = (): {\n enabled: boolean\n availble: boolean | undefined\n isLoading: boolean\n chain: ExtendedChain | undefined\n fromAmount: string | undefined\n} => {\n const { getChainById } = useAvailableChains()\n const { hiddenUI } = useWidgetConfig()\n const [fromChainId, fromTokenAddress, toChainId, toAddress] = useFieldValues(\n 'fromChain',\n 'fromToken',\n 'toChain',\n 'toAddress'\n )\n\n const toChain = getChainById(toChainId)\n const fromChain = getChainById(fromChainId)\n\n const { account: toAccount } = useAccount({ chainType: toChain?.chainType })\n\n const effectiveToAddress = toAddress || toAccount?.address\n\n const { isContractAddress: isToContractAddress } = useIsContractAddress(\n effectiveToAddress,\n toChainId,\n toChain?.chainType\n )\n\n const { token: destinationNativeToken } = useTokenBalance(\n effectiveToAddress,\n toChainId ? toChain?.nativeToken : undefined\n )\n\n const { data: gasRecommendation, isLoading } = useGasRecommendation(\n toChainId,\n fromChainId,\n fromTokenAddress\n )\n\n // When we bridge between ecosystems we need to be sure toAddress is set\n const isChainTypeSatisfied =\n fromChain?.chainType !== toChain?.chainType ? Boolean(toAddress) : true\n\n // We should not refuel to the contract address\n const isToAddressSatisfied = effectiveToAddress && !isToContractAddress\n\n const enabled = useMemo(() => {\n if (\n // Same chain refuel is not allowed since users need gas on source chain to initiate transaction\n // We allow refuel when bridging to native token since bridging routes may require gas for destination swaps\n fromChainId === toChainId ||\n !gasRecommendation?.available ||\n !gasRecommendation?.recommended ||\n !destinationNativeToken ||\n !isChainTypeSatisfied ||\n !isToAddressSatisfied ||\n hiddenUI?.includes(HiddenUI.GasRefuelMessage)\n ) {\n return false\n }\n const tokenBalance = destinationNativeToken.amount ?? 0n\n\n // Check if the user balance < 50% of the recommended amount\n const recommendedAmount = BigInt(gasRecommendation.recommended.amount) / 2n\n\n const insufficientGas = tokenBalance < recommendedAmount\n return insufficientGas\n }, [\n fromChainId,\n gasRecommendation,\n isChainTypeSatisfied,\n isToAddressSatisfied,\n destinationNativeToken,\n toChainId,\n hiddenUI,\n ])\n\n return {\n enabled: enabled,\n availble: gasRecommendation?.available,\n isLoading: isLoading,\n chain: toChain,\n fromAmount: gasRecommendation?.available\n ? gasRecommendation.fromAmount\n : undefined,\n }\n}\n"],"mappings":";;;;;;;;;;AAWA,MAAa,qBAMR;CACH,MAAM,EAAE,iBAAiB,oBAAoB;CAC7C,MAAM,EAAE,aAAa,iBAAiB;CACtC,MAAM,CAAC,aAAa,kBAAkB,WAAW,aAAa,eAC5D,aACA,aACA,WACA,YACD;CAED,MAAM,UAAU,aAAa,UAAU;CACvC,MAAM,YAAY,aAAa,YAAY;CAE3C,MAAM,EAAE,SAAS,cAAc,WAAW,EAAE,WAAW,SAAS,WAAW,CAAC;CAE5E,MAAM,qBAAqB,aAAa,WAAW;CAEnD,MAAM,EAAE,mBAAmB,wBAAwB,qBACjD,oBACA,WACA,SAAS,UACV;CAED,MAAM,EAAE,OAAO,2BAA2B,gBACxC,oBACA,YAAY,SAAS,cAAc,KAAA,EACpC;CAED,MAAM,EAAE,MAAM,mBAAmB,cAAc,qBAC7C,WACA,aACA,iBACD;CAGD,MAAM,uBACJ,WAAW,cAAc,SAAS,YAAY,QAAQ,UAAU,GAAG;CAGrE,MAAM,uBAAuB,sBAAsB,CAAC;AAiCpD,QAAO;EACL,SAhCc,cAAc;AAC5B,OAGE,gBAAgB,aAChB,CAAC,mBAAmB,aACpB,CAAC,mBAAmB,eACpB,CAAC,0BACD,CAAC,wBACD,CAAC,wBACD,UAAU,SAAS,SAAS,iBAAiB,CAE7C,QAAO;AAQT,WANqB,uBAAuB,UAAU,MAG5B,OAAO,kBAAkB,YAAY,OAAO,GAAG;KAIxE;GACD;GACA;GACA;GACA;GACA;GACA;GACA;GACD,CAAC;EAIA,UAAU,mBAAmB;EAClB;EACX,OAAO;EACP,YAAY,mBAAmB,YAC3B,kBAAkB,aAClB,KAAA;EACL"}
1
+ {"version":3,"file":"useGasRefuel.js","names":[],"sources":["../../../src/hooks/useGasRefuel.ts"],"sourcesContent":["import type { ExtendedChain } from '@lifi/sdk'\nimport { useAccount } from '@lifi/wallet-management'\nimport { useMemo } from 'react'\nimport { useWidgetConfig } from '../providers/WidgetProvider/WidgetProvider.js'\nimport { useFieldValues } from '../stores/form/useFieldValues.js'\nimport { HiddenUI } from '../types/widget.js'\nimport { useAvailableChains } from './useAvailableChains.js'\nimport { useGasRecommendation } from './useGasRecommendation.js'\nimport { useIsContractAddress } from './useIsContractAddress.js'\nimport { useTokenBalance } from './useTokenBalance.js'\n\nexport const useGasRefuel = (): {\n enabled: boolean\n availble: boolean | undefined\n isLoading: boolean\n chain: ExtendedChain | undefined\n fromAmount: string | undefined\n} => {\n const { getChainById } = useAvailableChains()\n const { hiddenUI } = useWidgetConfig()\n const [fromChainId, fromTokenAddress, toChainId, toAddress] = useFieldValues(\n 'fromChain',\n 'fromToken',\n 'toChain',\n 'toAddress'\n )\n\n const toChain = getChainById(toChainId)\n const fromChain = getChainById(fromChainId)\n\n const { account: toAccount } = useAccount({ chainType: toChain?.chainType })\n\n const effectiveToAddress = toAddress || toAccount?.address\n\n const { isContractAddress: isToContractAddress } = useIsContractAddress(\n effectiveToAddress,\n toChainId,\n toChain?.chainType\n )\n\n const { token: destinationNativeToken } = useTokenBalance(\n effectiveToAddress,\n toChainId ? toChain?.nativeToken : undefined\n )\n\n const { data: gasRecommendation, isLoading } = useGasRecommendation(\n toChainId,\n fromChainId,\n fromTokenAddress\n )\n\n // When we bridge between ecosystems we need to be sure toAddress is set\n const isChainTypeSatisfied =\n fromChain?.chainType !== toChain?.chainType ? Boolean(toAddress) : true\n\n // We should not refuel to the contract address\n const isToAddressSatisfied = effectiveToAddress && !isToContractAddress\n\n const enabled = useMemo(() => {\n if (\n // Same chain refuel is not allowed since users need gas on source chain to initiate transaction\n // We allow refuel when bridging to native token since bridging routes may require gas for destination swaps\n fromChainId === toChainId ||\n !gasRecommendation?.available ||\n !gasRecommendation?.recommended ||\n !destinationNativeToken ||\n !isChainTypeSatisfied ||\n !isToAddressSatisfied ||\n hiddenUI?.includes(HiddenUI.GasRefuelMessage)\n ) {\n return false\n }\n const tokenBalance = destinationNativeToken.amount ?? 0n\n\n // Check if the user balance < 50% of the recommended amount\n const recommendedAmount = BigInt(gasRecommendation.recommended.amount) / 2n\n\n const insufficientGas = tokenBalance < recommendedAmount\n return insufficientGas\n }, [\n fromChainId,\n gasRecommendation,\n isChainTypeSatisfied,\n isToAddressSatisfied,\n destinationNativeToken,\n toChainId,\n hiddenUI,\n ])\n\n return {\n enabled: enabled,\n availble: gasRecommendation?.available,\n isLoading: isLoading,\n chain: toChain,\n fromAmount: gasRecommendation?.available\n ? gasRecommendation.fromAmount\n : undefined,\n }\n}\n"],"mappings":";;;;;;;;;;AAWA,MAAa,qBAMR;CACH,MAAM,EAAE,iBAAiB,oBAAoB;CAC7C,MAAM,EAAE,aAAa,iBAAiB;CACtC,MAAM,CAAC,aAAa,kBAAkB,WAAW,aAAa,eAC5D,aACA,aACA,WACA,YACD;CAED,MAAM,UAAU,aAAa,UAAU;CACvC,MAAM,YAAY,aAAa,YAAY;CAE3C,MAAM,EAAE,SAAS,cAAc,WAAW,EAAE,WAAW,SAAS,WAAW,CAAC;CAE5E,MAAM,qBAAqB,aAAa,WAAW;CAEnD,MAAM,EAAE,mBAAmB,wBAAwB,qBACjD,oBACA,WACA,SAAS,UACV;CAED,MAAM,EAAE,OAAO,2BAA2B,gBACxC,oBACA,YAAY,SAAS,cAAc,KAAA,EACpC;CAED,MAAM,EAAE,MAAM,mBAAmB,cAAc,qBAC7C,WACA,aACA,iBACD;CAGD,MAAM,uBACJ,WAAW,cAAc,SAAS,YAAY,QAAQ,UAAU,GAAG;CAGrE,MAAM,uBAAuB,sBAAsB,CAAC;AAiCpD,QAAO;EACL,SAhCc,cAAc;AAC5B,OAGE,gBAAgB,aAChB,CAAC,mBAAmB,aACpB,CAAC,mBAAmB,eACpB,CAAC,0BACD,CAAC,wBACD,CAAC,wBACD,UAAU,SAAA,mBAAmC,CAE7C,QAAO;AAQT,WANqB,uBAAuB,UAAU,MAG5B,OAAO,kBAAkB,YAAY,OAAO,GAAG;KAIxE;GACD;GACA;GACA;GACA;GACA;GACA;GACA;GACD,CAAC;EAIA,UAAU,mBAAmB;EAClB;EACX,OAAO;EACP,YAAY,mBAAmB,YAC3B,kBAAkB,aAClB,KAAA;EACL"}
@@ -1,5 +1,5 @@
1
1
  import { useWidgetConfig } from "../providers/WidgetProvider/WidgetProvider.js";
2
- import { HiddenUI } from "../types/widget.js";
2
+ import "../types/widget.js";
3
3
  import { useSDKClient } from "../providers/SDKClientProvider.js";
4
4
  import { getQueryKey } from "../utils/queries.js";
5
5
  import { useAvailableChains } from "./useAvailableChains.js";
@@ -90,7 +90,7 @@ const useGasSufficiency = (route) => {
90
90
  });
91
91
  return Object.values(gasCosts).filter((gasCost) => gasCost.insufficient);
92
92
  },
93
- enabled: Boolean(!isContractAddress && !isContractAddressLoading && relevantAccounts.length > 0 && route && !hiddenUI?.includes(HiddenUI.InsufficientGasMessage)),
93
+ enabled: Boolean(!isContractAddress && !isContractAddressLoading && relevantAccounts.length > 0 && route && !hiddenUI?.includes("insufficientGasMessage")),
94
94
  refetchInterval,
95
95
  staleTime: refetchInterval
96
96
  });
@@ -1 +1 @@
1
- {"version":3,"file":"useGasSufficiency.js","names":[],"sources":["../../../src/hooks/useGasSufficiency.ts"],"sourcesContent":["import type { EVMChain, RouteExtended, Token, TokenAmount } from '@lifi/sdk'\nimport { ChainType } from '@lifi/sdk'\nimport { useAccount } from '@lifi/wallet-management'\nimport { useQuery } from '@tanstack/react-query'\nimport { useMemo } from 'react'\nimport { useSDKClient } from '../providers/SDKClientProvider.js'\nimport { useWidgetConfig } from '../providers/WidgetProvider/WidgetProvider.js'\nimport { HiddenUI } from '../types/widget.js'\nimport { getQueryKey } from '../utils/queries.js'\nimport { useAvailableChains } from './useAvailableChains.js'\nimport { useIsContractAddress } from './useIsContractAddress.js'\nimport { getTokenBalancesWithRetry } from './useTokenBalance.js'\n\nexport interface GasSufficiency {\n gasAmount: bigint\n tokenAmount?: bigint\n insufficientAmount?: bigint\n insufficient?: boolean\n token: Token\n chain?: EVMChain\n}\n\nconst refetchInterval = 30_000\n\nexport const useGasSufficiency = (\n route?: RouteExtended\n): {\n insufficientGas: GasSufficiency[] | undefined\n isLoading: boolean\n} => {\n const { getChainById } = useAvailableChains()\n const { account: EVMAccount, accounts } = useAccount({\n chainType: ChainType.EVM,\n })\n const { keyPrefix, hiddenUI } = useWidgetConfig()\n const sdkClient = useSDKClient()\n\n const { relevantAccounts, relevantAccountsQueryKey } = useMemo(() => {\n const chainTypes = route?.steps.reduce((acc, step) => {\n const chainType = getChainById(step.action.fromChainId)?.chainType\n if (chainType) {\n acc.add(chainType)\n }\n return acc\n }, new Set<ChainType>())\n\n const relevantAccounts = accounts.filter(\n (account) =>\n account.isConnected &&\n account.address &&\n chainTypes?.has(account.chainType)\n )\n return {\n relevantAccounts,\n relevantAccountsQueryKey: relevantAccounts\n .map((account) => account.address)\n .join(','),\n }\n }, [accounts, route?.steps, getChainById])\n\n const { isContractAddress, isLoading: isContractAddressLoading } =\n useIsContractAddress(\n EVMAccount.address,\n route?.fromChainId,\n EVMAccount.chainType\n )\n\n const { data: insufficientGas, isLoading } = useQuery<GasSufficiency[]>({\n queryKey: [\n getQueryKey('gas-sufficiency-check', keyPrefix),\n relevantAccountsQueryKey,\n route?.id,\n isContractAddress,\n ] as const,\n queryFn: async () => {\n if (!route) {\n return []\n }\n\n // Filter out steps that are relayer steps or have primaryType 'Permit' or 'Order'\n const filteredSteps = route.steps.filter(\n (step) =>\n !step.typedData?.some(\n (t) => t.primaryType === 'Permit' || t.primaryType === 'Order'\n )\n )\n\n // If all steps are filtered out, we don't need to check for gas sufficiency\n if (!filteredSteps.length) {\n return []\n }\n\n // We assume that LI.Fuel protocol always refuels the destination chain\n const hasRefuelStep = route.steps\n .flatMap((step) => step.includedSteps)\n .some((includedStep) => includedStep.tool === 'gasZip')\n\n const gasCosts = filteredSteps\n .filter((step) => !step.execution || step.execution.status !== 'DONE')\n .reduce(\n (groupedGasCosts, step) => {\n // We need to avoid destination chain step sufficiency check if we have LI.Fuel protocol sub-step\n const skipDueToRefuel =\n step.action.fromChainId === route.toChainId && hasRefuelStep\n if (step.estimate.gasCosts && !skipDueToRefuel) {\n const { token } = step.estimate.gasCosts[0]\n const gasCostAmount = step.estimate.gasCosts.reduce(\n (amount, gasCost) =>\n amount + BigInt(Number(gasCost.amount).toFixed(0)),\n 0n\n )\n if (gasCostAmount > 0n) {\n groupedGasCosts[token.chainId] = {\n gasAmount: groupedGasCosts[token.chainId]\n ? groupedGasCosts[token.chainId].gasAmount + gasCostAmount\n : gasCostAmount,\n token,\n chain: getChainById(token.chainId),\n }\n }\n }\n // Add fees paid in native tokens to gas sufficiency check (included: false)\n const nonIncludedFeeCosts = step.estimate.feeCosts?.filter(\n (feeCost) => !feeCost.included\n )\n if (nonIncludedFeeCosts?.length) {\n const { token } = nonIncludedFeeCosts[0]\n const feeCostAmount = nonIncludedFeeCosts.reduce(\n (amount, feeCost) =>\n amount + BigInt(Number(feeCost.amount).toFixed(0)),\n 0n\n )\n if (feeCostAmount > 0n) {\n groupedGasCosts[token.chainId] = {\n gasAmount: groupedGasCosts[token.chainId]\n ? groupedGasCosts[token.chainId].gasAmount + feeCostAmount\n : feeCostAmount,\n token,\n chain: getChainById(token.chainId),\n }\n }\n }\n return groupedGasCosts\n },\n {} as Record<string, GasSufficiency>\n )\n\n // Check whether we are sending a native token\n // For native tokens we want to check for the total amount, including the network fee\n if (\n route.fromToken.address === gasCosts[route.fromChainId]?.token.address\n ) {\n gasCosts[route.fromChainId].tokenAmount =\n gasCosts[route.fromChainId]?.gasAmount + BigInt(route.fromAmount)\n }\n\n const gasCostsValues = Object.values(gasCosts)\n\n const balanceChecks = await Promise.allSettled(\n relevantAccounts.map((account) => {\n const relevantTokens = gasCostsValues\n .filter((gasCost) => gasCost.chain?.chainType === account.chainType)\n .map((item) => item.token)\n\n return getTokenBalancesWithRetry(\n sdkClient,\n account.address!,\n relevantTokens\n )\n })\n )\n\n const tokenBalances = balanceChecks\n .filter(\n (result): result is PromiseFulfilledResult<TokenAmount[]> =>\n result.status === 'fulfilled' && Boolean(result.value)\n )\n .flatMap((result) => result.value)\n\n if (!tokenBalances?.length) {\n return []\n }\n\n Object.keys(gasCosts).forEach((chainId) => {\n if (gasCosts[chainId]) {\n const gasTokenBalance =\n tokenBalances?.find(\n (t) =>\n t.chainId === gasCosts[chainId].token.chainId &&\n t.address === gasCosts[chainId].token.address\n )?.amount ?? 0n\n const insufficient =\n gasTokenBalance <= 0n ||\n gasTokenBalance < gasCosts[chainId].gasAmount ||\n gasTokenBalance < (gasCosts[chainId].tokenAmount ?? 0n)\n\n const insufficientAmount = insufficient\n ? gasCosts[chainId].tokenAmount\n ? gasCosts[chainId].tokenAmount! - gasTokenBalance\n : gasCosts[chainId].gasAmount - gasTokenBalance\n : undefined\n\n gasCosts[chainId] = {\n ...gasCosts[chainId],\n insufficient,\n insufficientAmount,\n chain: insufficient ? getChainById(Number(chainId)) : undefined,\n }\n }\n })\n\n const gasCostResult = Object.values(gasCosts).filter(\n (gasCost) => gasCost.insufficient\n )\n\n return gasCostResult\n },\n\n enabled: Boolean(\n !isContractAddress &&\n !isContractAddressLoading &&\n relevantAccounts.length > 0 &&\n route &&\n !hiddenUI?.includes(HiddenUI.InsufficientGasMessage)\n ),\n refetchInterval,\n staleTime: refetchInterval,\n })\n\n return {\n insufficientGas,\n isLoading,\n }\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"useGasSufficiency.js","names":[],"sources":["../../../src/hooks/useGasSufficiency.ts"],"sourcesContent":["import type { EVMChain, RouteExtended, Token, TokenAmount } from '@lifi/sdk'\nimport { ChainType } from '@lifi/sdk'\nimport { useAccount } from '@lifi/wallet-management'\nimport { useQuery } from '@tanstack/react-query'\nimport { useMemo } from 'react'\nimport { useSDKClient } from '../providers/SDKClientProvider.js'\nimport { useWidgetConfig } from '../providers/WidgetProvider/WidgetProvider.js'\nimport { HiddenUI } from '../types/widget.js'\nimport { getQueryKey } from '../utils/queries.js'\nimport { useAvailableChains } from './useAvailableChains.js'\nimport { useIsContractAddress } from './useIsContractAddress.js'\nimport { getTokenBalancesWithRetry } from './useTokenBalance.js'\n\nexport interface GasSufficiency {\n gasAmount: bigint\n tokenAmount?: bigint\n insufficientAmount?: bigint\n insufficient?: boolean\n token: Token\n chain?: EVMChain\n}\n\nconst refetchInterval = 30_000\n\nexport const useGasSufficiency = (\n route?: RouteExtended\n): {\n insufficientGas: GasSufficiency[] | undefined\n isLoading: boolean\n} => {\n const { getChainById } = useAvailableChains()\n const { account: EVMAccount, accounts } = useAccount({\n chainType: ChainType.EVM,\n })\n const { keyPrefix, hiddenUI } = useWidgetConfig()\n const sdkClient = useSDKClient()\n\n const { relevantAccounts, relevantAccountsQueryKey } = useMemo(() => {\n const chainTypes = route?.steps.reduce((acc, step) => {\n const chainType = getChainById(step.action.fromChainId)?.chainType\n if (chainType) {\n acc.add(chainType)\n }\n return acc\n }, new Set<ChainType>())\n\n const relevantAccounts = accounts.filter(\n (account) =>\n account.isConnected &&\n account.address &&\n chainTypes?.has(account.chainType)\n )\n return {\n relevantAccounts,\n relevantAccountsQueryKey: relevantAccounts\n .map((account) => account.address)\n .join(','),\n }\n }, [accounts, route?.steps, getChainById])\n\n const { isContractAddress, isLoading: isContractAddressLoading } =\n useIsContractAddress(\n EVMAccount.address,\n route?.fromChainId,\n EVMAccount.chainType\n )\n\n const { data: insufficientGas, isLoading } = useQuery<GasSufficiency[]>({\n queryKey: [\n getQueryKey('gas-sufficiency-check', keyPrefix),\n relevantAccountsQueryKey,\n route?.id,\n isContractAddress,\n ] as const,\n queryFn: async () => {\n if (!route) {\n return []\n }\n\n // Filter out steps that are relayer steps or have primaryType 'Permit' or 'Order'\n const filteredSteps = route.steps.filter(\n (step) =>\n !step.typedData?.some(\n (t) => t.primaryType === 'Permit' || t.primaryType === 'Order'\n )\n )\n\n // If all steps are filtered out, we don't need to check for gas sufficiency\n if (!filteredSteps.length) {\n return []\n }\n\n // We assume that LI.Fuel protocol always refuels the destination chain\n const hasRefuelStep = route.steps\n .flatMap((step) => step.includedSteps)\n .some((includedStep) => includedStep.tool === 'gasZip')\n\n const gasCosts = filteredSteps\n .filter((step) => !step.execution || step.execution.status !== 'DONE')\n .reduce(\n (groupedGasCosts, step) => {\n // We need to avoid destination chain step sufficiency check if we have LI.Fuel protocol sub-step\n const skipDueToRefuel =\n step.action.fromChainId === route.toChainId && hasRefuelStep\n if (step.estimate.gasCosts && !skipDueToRefuel) {\n const { token } = step.estimate.gasCosts[0]\n const gasCostAmount = step.estimate.gasCosts.reduce(\n (amount, gasCost) =>\n amount + BigInt(Number(gasCost.amount).toFixed(0)),\n 0n\n )\n if (gasCostAmount > 0n) {\n groupedGasCosts[token.chainId] = {\n gasAmount: groupedGasCosts[token.chainId]\n ? groupedGasCosts[token.chainId].gasAmount + gasCostAmount\n : gasCostAmount,\n token,\n chain: getChainById(token.chainId),\n }\n }\n }\n // Add fees paid in native tokens to gas sufficiency check (included: false)\n const nonIncludedFeeCosts = step.estimate.feeCosts?.filter(\n (feeCost) => !feeCost.included\n )\n if (nonIncludedFeeCosts?.length) {\n const { token } = nonIncludedFeeCosts[0]\n const feeCostAmount = nonIncludedFeeCosts.reduce(\n (amount, feeCost) =>\n amount + BigInt(Number(feeCost.amount).toFixed(0)),\n 0n\n )\n if (feeCostAmount > 0n) {\n groupedGasCosts[token.chainId] = {\n gasAmount: groupedGasCosts[token.chainId]\n ? groupedGasCosts[token.chainId].gasAmount + feeCostAmount\n : feeCostAmount,\n token,\n chain: getChainById(token.chainId),\n }\n }\n }\n return groupedGasCosts\n },\n {} as Record<string, GasSufficiency>\n )\n\n // Check whether we are sending a native token\n // For native tokens we want to check for the total amount, including the network fee\n if (\n route.fromToken.address === gasCosts[route.fromChainId]?.token.address\n ) {\n gasCosts[route.fromChainId].tokenAmount =\n gasCosts[route.fromChainId]?.gasAmount + BigInt(route.fromAmount)\n }\n\n const gasCostsValues = Object.values(gasCosts)\n\n const balanceChecks = await Promise.allSettled(\n relevantAccounts.map((account) => {\n const relevantTokens = gasCostsValues\n .filter((gasCost) => gasCost.chain?.chainType === account.chainType)\n .map((item) => item.token)\n\n return getTokenBalancesWithRetry(\n sdkClient,\n account.address!,\n relevantTokens\n )\n })\n )\n\n const tokenBalances = balanceChecks\n .filter(\n (result): result is PromiseFulfilledResult<TokenAmount[]> =>\n result.status === 'fulfilled' && Boolean(result.value)\n )\n .flatMap((result) => result.value)\n\n if (!tokenBalances?.length) {\n return []\n }\n\n Object.keys(gasCosts).forEach((chainId) => {\n if (gasCosts[chainId]) {\n const gasTokenBalance =\n tokenBalances?.find(\n (t) =>\n t.chainId === gasCosts[chainId].token.chainId &&\n t.address === gasCosts[chainId].token.address\n )?.amount ?? 0n\n const insufficient =\n gasTokenBalance <= 0n ||\n gasTokenBalance < gasCosts[chainId].gasAmount ||\n gasTokenBalance < (gasCosts[chainId].tokenAmount ?? 0n)\n\n const insufficientAmount = insufficient\n ? gasCosts[chainId].tokenAmount\n ? gasCosts[chainId].tokenAmount! - gasTokenBalance\n : gasCosts[chainId].gasAmount - gasTokenBalance\n : undefined\n\n gasCosts[chainId] = {\n ...gasCosts[chainId],\n insufficient,\n insufficientAmount,\n chain: insufficient ? getChainById(Number(chainId)) : undefined,\n }\n }\n })\n\n const gasCostResult = Object.values(gasCosts).filter(\n (gasCost) => gasCost.insufficient\n )\n\n return gasCostResult\n },\n\n enabled: Boolean(\n !isContractAddress &&\n !isContractAddressLoading &&\n relevantAccounts.length > 0 &&\n route &&\n !hiddenUI?.includes(HiddenUI.InsufficientGasMessage)\n ),\n refetchInterval,\n staleTime: refetchInterval,\n })\n\n return {\n insufficientGas,\n isLoading,\n }\n}\n"],"mappings":";;;;;;;;;;;;AAsBA,MAAM,kBAAkB;AAExB,MAAa,qBACX,UAIG;CACH,MAAM,EAAE,iBAAiB,oBAAoB;CAC7C,MAAM,EAAE,SAAS,YAAY,aAAa,WAAW,EACnD,WAAW,UAAU,KACtB,CAAC;CACF,MAAM,EAAE,WAAW,aAAa,iBAAiB;CACjD,MAAM,YAAY,cAAc;CAEhC,MAAM,EAAE,kBAAkB,6BAA6B,cAAc;EACnE,MAAM,aAAa,OAAO,MAAM,QAAQ,KAAK,SAAS;GACpD,MAAM,YAAY,aAAa,KAAK,OAAO,YAAY,EAAE;AACzD,OAAI,UACF,KAAI,IAAI,UAAU;AAEpB,UAAO;qBACN,IAAI,KAAgB,CAAC;EAExB,MAAM,mBAAmB,SAAS,QAC/B,YACC,QAAQ,eACR,QAAQ,WACR,YAAY,IAAI,QAAQ,UAAU,CACrC;AACD,SAAO;GACL;GACA,0BAA0B,iBACvB,KAAK,YAAY,QAAQ,QAAQ,CACjC,KAAK,IAAI;GACb;IACA;EAAC;EAAU,OAAO;EAAO;EAAa,CAAC;CAE1C,MAAM,EAAE,mBAAmB,WAAW,6BACpC,qBACE,WAAW,SACX,OAAO,aACP,WAAW,UACZ;CAEH,MAAM,EAAE,MAAM,iBAAiB,cAAc,SAA2B;EACtE,UAAU;GACR,YAAY,yBAAyB,UAAU;GAC/C;GACA,OAAO;GACP;GACD;EACD,SAAS,YAAY;AACnB,OAAI,CAAC,MACH,QAAO,EAAE;GAIX,MAAM,gBAAgB,MAAM,MAAM,QAC/B,SACC,CAAC,KAAK,WAAW,MACd,MAAM,EAAE,gBAAgB,YAAY,EAAE,gBAAgB,QACxD,CACJ;AAGD,OAAI,CAAC,cAAc,OACjB,QAAO,EAAE;GAIX,MAAM,gBAAgB,MAAM,MACzB,SAAS,SAAS,KAAK,cAAc,CACrC,MAAM,iBAAiB,aAAa,SAAS,SAAS;GAEzD,MAAM,WAAW,cACd,QAAQ,SAAS,CAAC,KAAK,aAAa,KAAK,UAAU,WAAW,OAAO,CACrE,QACE,iBAAiB,SAAS;IAEzB,MAAM,kBACJ,KAAK,OAAO,gBAAgB,MAAM,aAAa;AACjD,QAAI,KAAK,SAAS,YAAY,CAAC,iBAAiB;KAC9C,MAAM,EAAE,UAAU,KAAK,SAAS,SAAS;KACzC,MAAM,gBAAgB,KAAK,SAAS,SAAS,QAC1C,QAAQ,YACP,SAAS,OAAO,OAAO,QAAQ,OAAO,CAAC,QAAQ,EAAE,CAAC,EACpD,GACD;AACD,SAAI,gBAAgB,GAClB,iBAAgB,MAAM,WAAW;MAC/B,WAAW,gBAAgB,MAAM,WAC7B,gBAAgB,MAAM,SAAS,YAAY,gBAC3C;MACJ;MACA,OAAO,aAAa,MAAM,QAAQ;MACnC;;IAIL,MAAM,sBAAsB,KAAK,SAAS,UAAU,QACjD,YAAY,CAAC,QAAQ,SACvB;AACD,QAAI,qBAAqB,QAAQ;KAC/B,MAAM,EAAE,UAAU,oBAAoB;KACtC,MAAM,gBAAgB,oBAAoB,QACvC,QAAQ,YACP,SAAS,OAAO,OAAO,QAAQ,OAAO,CAAC,QAAQ,EAAE,CAAC,EACpD,GACD;AACD,SAAI,gBAAgB,GAClB,iBAAgB,MAAM,WAAW;MAC/B,WAAW,gBAAgB,MAAM,WAC7B,gBAAgB,MAAM,SAAS,YAAY,gBAC3C;MACJ;MACA,OAAO,aAAa,MAAM,QAAQ;MACnC;;AAGL,WAAO;MAET,EAAE,CACH;AAIH,OACE,MAAM,UAAU,YAAY,SAAS,MAAM,cAAc,MAAM,QAE/D,UAAS,MAAM,aAAa,cAC1B,SAAS,MAAM,cAAc,YAAY,OAAO,MAAM,WAAW;GAGrE,MAAM,iBAAiB,OAAO,OAAO,SAAS;GAgB9C,MAAM,iBAdgB,MAAM,QAAQ,WAClC,iBAAiB,KAAK,YAAY;IAChC,MAAM,iBAAiB,eACpB,QAAQ,YAAY,QAAQ,OAAO,cAAc,QAAQ,UAAU,CACnE,KAAK,SAAS,KAAK,MAAM;AAE5B,WAAO,0BACL,WACA,QAAQ,SACR,eACD;KACD,CACH,EAGE,QACE,WACC,OAAO,WAAW,eAAe,QAAQ,OAAO,MAAM,CACzD,CACA,SAAS,WAAW,OAAO,MAAM;AAEpC,OAAI,CAAC,eAAe,OAClB,QAAO,EAAE;AAGX,UAAO,KAAK,SAAS,CAAC,SAAS,YAAY;AACzC,QAAI,SAAS,UAAU;KACrB,MAAM,kBACJ,eAAe,MACZ,MACC,EAAE,YAAY,SAAS,SAAS,MAAM,WACtC,EAAE,YAAY,SAAS,SAAS,MAAM,QACzC,EAAE,UAAU;KACf,MAAM,eACJ,mBAAmB,MACnB,kBAAkB,SAAS,SAAS,aACpC,mBAAmB,SAAS,SAAS,eAAe;KAEtD,MAAM,qBAAqB,eACvB,SAAS,SAAS,cAChB,SAAS,SAAS,cAAe,kBACjC,SAAS,SAAS,YAAY,kBAChC,KAAA;AAEJ,cAAS,WAAW;MAClB,GAAG,SAAS;MACZ;MACA;MACA,OAAO,eAAe,aAAa,OAAO,QAAQ,CAAC,GAAG,KAAA;MACvD;;KAEH;AAMF,UAJsB,OAAO,OAAO,SAAS,CAAC,QAC3C,YAAY,QAAQ,aACtB;;EAKH,SAAS,QACP,CAAC,qBACC,CAAC,4BACD,iBAAiB,SAAS,KAC1B,SACA,CAAC,UAAU,SAAA,yBAAyC,CACvD;EACD;EACA,WAAW;EACZ,CAAC;AAEF,QAAO;EACL;EACA;EACD"}