@lifi/widget 4.5.0 → 4.6.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (199) hide show
  1. package/dist/esm/AppDrawer.js +2 -1
  2. package/dist/esm/AppDrawer.js.map +1 -1
  3. package/dist/esm/components/AmountInput/AmountInput.js +13 -7
  4. package/dist/esm/components/AmountInput/AmountInput.js.map +1 -1
  5. package/dist/esm/components/AmountInput/AmountInputEndAdornment.js +2 -13
  6. package/dist/esm/components/AmountInput/AmountInputEndAdornment.js.map +1 -1
  7. package/dist/esm/components/AmountInputCard/PercentageChips.js +2 -13
  8. package/dist/esm/components/AmountInputCard/PercentageChips.js.map +1 -1
  9. package/dist/esm/components/AmountInputCard/PercentageChips.style.js +1 -1
  10. package/dist/esm/components/AmountInputCard/PercentageChips.style.js.map +1 -1
  11. package/dist/esm/components/AmountInputCard/SendAmountCard.js +13 -6
  12. package/dist/esm/components/AmountInputCard/SendAmountCard.js.map +1 -1
  13. package/dist/esm/components/Chains/AllChainsAvatar.js +7 -1
  14. package/dist/esm/components/Chains/AllChainsAvatar.js.map +1 -1
  15. package/dist/esm/components/Dialog/Dialog.js +2 -1
  16. package/dist/esm/components/Dialog/Dialog.js.map +1 -1
  17. package/dist/esm/components/Expansion/Expansion.js +4 -3
  18. package/dist/esm/components/Expansion/Expansion.js.map +1 -1
  19. package/dist/esm/components/Header/SettingsButton.js +2 -1
  20. package/dist/esm/components/Header/SettingsButton.js.map +1 -1
  21. package/dist/esm/components/IconCircle/IconCircle.js +2 -1
  22. package/dist/esm/components/IconCircle/IconCircle.js.map +1 -1
  23. package/dist/esm/components/Messages/UnsupportedToAddressMessage.js +27 -0
  24. package/dist/esm/components/Messages/UnsupportedToAddressMessage.js.map +1 -0
  25. package/dist/esm/components/Messages/WarningMessages.d.ts.map +1 -1
  26. package/dist/esm/components/Messages/WarningMessages.js +2 -0
  27. package/dist/esm/components/Messages/WarningMessages.js.map +1 -1
  28. package/dist/esm/components/Messages/useMessageQueue.js +6 -1
  29. package/dist/esm/components/Messages/useMessageQueue.js.map +1 -1
  30. package/dist/esm/components/RouteCard/RouteDetails.js +2 -1
  31. package/dist/esm/components/RouteCard/RouteDetails.js.map +1 -1
  32. package/dist/esm/components/Routes/LimitOrderRoutes.js +2 -2
  33. package/dist/esm/components/Routes/LimitOrderRoutes.js.map +1 -1
  34. package/dist/esm/components/Routes/RoutesContent.js +2 -2
  35. package/dist/esm/components/Routes/RoutesContent.js.map +1 -1
  36. package/dist/esm/components/SendToWallet/SendToWalletExpandButton.js +2 -2
  37. package/dist/esm/components/SendToWallet/SendToWalletExpandButton.js.map +1 -1
  38. package/dist/esm/components/Skeleton/WidgetSkeleton.js +2 -1
  39. package/dist/esm/components/Skeleton/WidgetSkeleton.js.map +1 -1
  40. package/dist/esm/components/Step/StepActions.js +18 -16
  41. package/dist/esm/components/Step/StepActions.js.map +1 -1
  42. package/dist/esm/components/StepActions/StepActionRow.js +2 -1
  43. package/dist/esm/components/StepActions/StepActionRow.js.map +1 -1
  44. package/dist/esm/components/Switch.js +1 -1
  45. package/dist/esm/components/Switch.js.map +1 -1
  46. package/dist/esm/components/Tabs/Tabs.style.js +4 -2
  47. package/dist/esm/components/Tabs/Tabs.style.js.map +1 -1
  48. package/dist/esm/components/TokenList/TokenListItem.js +46 -8
  49. package/dist/esm/components/TokenList/TokenListItem.js.map +1 -1
  50. package/dist/esm/components/TokenList/VirtualizedTokenList.js +22 -9
  51. package/dist/esm/components/TokenList/VirtualizedTokenList.js.map +1 -1
  52. package/dist/esm/components/TokenRate/TokenRate.js +2 -1
  53. package/dist/esm/components/TokenRate/TokenRate.js.map +1 -1
  54. package/dist/esm/components/TransactionCard/ActiveTransactionCard.js +22 -21
  55. package/dist/esm/components/TransactionCard/ActiveTransactionCard.js.map +1 -1
  56. package/dist/esm/config/version.d.ts +1 -1
  57. package/dist/esm/config/version.js +1 -1
  58. package/dist/esm/config/version.js.map +1 -1
  59. package/dist/esm/hooks/timer/time.js +2 -2
  60. package/dist/esm/hooks/timer/time.js.map +1 -1
  61. package/dist/esm/hooks/useAvailableChains.d.ts.map +1 -1
  62. package/dist/esm/hooks/useAvailableChains.js +2 -1
  63. package/dist/esm/hooks/useAvailableChains.js.map +1 -1
  64. package/dist/esm/hooks/useExplorer.d.ts.map +1 -1
  65. package/dist/esm/hooks/useExplorer.js +4 -0
  66. package/dist/esm/hooks/useExplorer.js.map +1 -1
  67. package/dist/esm/hooks/useFlaggedTokenGuard.js +28 -0
  68. package/dist/esm/hooks/useFlaggedTokenGuard.js.map +1 -0
  69. package/dist/esm/hooks/useGasSufficiency.js +3 -1
  70. package/dist/esm/hooks/useGasSufficiency.js.map +1 -1
  71. package/dist/esm/hooks/useMaxSendAmount.js +15 -0
  72. package/dist/esm/hooks/useMaxSendAmount.js.map +1 -0
  73. package/dist/esm/hooks/usePacedRouteExecution.js +3 -2
  74. package/dist/esm/hooks/usePacedRouteExecution.js.map +1 -1
  75. package/dist/esm/hooks/useRouteExecutionMessage.js +3 -2
  76. package/dist/esm/hooks/useRouteExecutionMessage.js.map +1 -1
  77. package/dist/esm/hooks/useRoutes.d.ts.map +1 -1
  78. package/dist/esm/hooks/useRoutes.js +3 -1
  79. package/dist/esm/hooks/useRoutes.js.map +1 -1
  80. package/dist/esm/hooks/useToAddressRequirements.d.ts +2 -0
  81. package/dist/esm/hooks/useToAddressRequirements.d.ts.map +1 -1
  82. package/dist/esm/hooks/useToAddressRequirements.js +7 -1
  83. package/dist/esm/hooks/useToAddressRequirements.js.map +1 -1
  84. package/dist/esm/hooks/useTokenBalances.d.ts.map +1 -1
  85. package/dist/esm/hooks/useTokenBalances.js +7 -2
  86. package/dist/esm/hooks/useTokenBalances.js.map +1 -1
  87. package/dist/esm/hooks/useTokenBalancesQueries.js +29 -28
  88. package/dist/esm/hooks/useTokenBalancesQueries.js.map +1 -1
  89. package/dist/esm/hooks/useTokenSearch.js +3 -5
  90. package/dist/esm/hooks/useTokenSearch.js.map +1 -1
  91. package/dist/esm/hooks/useTokens.js +14 -10
  92. package/dist/esm/hooks/useTokens.js.map +1 -1
  93. package/dist/esm/hooks/useWideVariant.js +2 -1
  94. package/dist/esm/hooks/useWideVariant.js.map +1 -1
  95. package/dist/esm/i18n/bn.json +3 -1
  96. package/dist/esm/i18n/de.json +3 -1
  97. package/dist/esm/i18n/en.json +12 -3
  98. package/dist/esm/i18n/es.json +3 -1
  99. package/dist/esm/i18n/fr.json +3 -1
  100. package/dist/esm/i18n/hi.json +3 -1
  101. package/dist/esm/i18n/id.json +3 -1
  102. package/dist/esm/i18n/it.json +3 -1
  103. package/dist/esm/i18n/ja.json +3 -1
  104. package/dist/esm/i18n/ko.json +3 -1
  105. package/dist/esm/i18n/pl.json +3 -1
  106. package/dist/esm/i18n/pt.json +3 -1
  107. package/dist/esm/i18n/th.json +3 -1
  108. package/dist/esm/i18n/tr.json +3 -1
  109. package/dist/esm/i18n/uk.json +3 -1
  110. package/dist/esm/i18n/vi.json +3 -1
  111. package/dist/esm/i18n/zh.json +3 -1
  112. package/dist/esm/pages/MainPage/MainPage.js +2 -1
  113. package/dist/esm/pages/MainPage/MainPage.js.map +1 -1
  114. package/dist/esm/pages/MainPage/ReviewButton.js +2 -2
  115. package/dist/esm/pages/MainPage/ReviewButton.js.map +1 -1
  116. package/dist/esm/pages/RoutesPage/RoutesPage.js +2 -2
  117. package/dist/esm/pages/RoutesPage/RoutesPage.js.map +1 -1
  118. package/dist/esm/pages/SelectChainPage/SelectChainPage.js +13 -12
  119. package/dist/esm/pages/SelectChainPage/SelectChainPage.js.map +1 -1
  120. package/dist/esm/pages/SelectEnabledToolsPage.js +8 -5
  121. package/dist/esm/pages/SelectEnabledToolsPage.js.map +1 -1
  122. package/dist/esm/pages/SelectTokenPage/SelectTokenPage.js +2 -1
  123. package/dist/esm/pages/SelectTokenPage/SelectTokenPage.js.map +1 -1
  124. package/dist/esm/pages/SettingsPage/SmallBalanceFilterSettings.js +2 -1
  125. package/dist/esm/pages/SettingsPage/SmallBalanceFilterSettings.js.map +1 -1
  126. package/dist/esm/pages/TransactionDetailsPage/ContactSupportButton.js +2 -1
  127. package/dist/esm/pages/TransactionDetailsPage/ContactSupportButton.js.map +1 -1
  128. package/dist/esm/pages/TransactionDetailsPage/TransactionDetailsPage.js +2 -1
  129. package/dist/esm/pages/TransactionDetailsPage/TransactionDetailsPage.js.map +1 -1
  130. package/dist/esm/pages/TransactionPage/StartTransactionButton.js +4 -3
  131. package/dist/esm/pages/TransactionPage/StartTransactionButton.js.map +1 -1
  132. package/dist/esm/pages/TransactionPage/TokenVerificationBottomSheet.js +64 -0
  133. package/dist/esm/pages/TransactionPage/TokenVerificationBottomSheet.js.map +1 -0
  134. package/dist/esm/pages/TransactionPage/TransactionExecutionContent.js +19 -16
  135. package/dist/esm/pages/TransactionPage/TransactionExecutionContent.js.map +1 -1
  136. package/dist/esm/pages/TransactionPage/TransactionFailedButtons.js +3 -1
  137. package/dist/esm/pages/TransactionPage/TransactionFailedButtons.js.map +1 -1
  138. package/dist/esm/pages/TransactionPage/TransactionReview.js +24 -2
  139. package/dist/esm/pages/TransactionPage/TransactionReview.js.map +1 -1
  140. package/dist/esm/providers/I18nProvider/I18nProvider.js +37 -36
  141. package/dist/esm/providers/I18nProvider/I18nProvider.js.map +1 -1
  142. package/dist/esm/providers/ThemeProvider/ThemeProvider.js +2 -1
  143. package/dist/esm/providers/ThemeProvider/ThemeProvider.js.map +1 -1
  144. package/dist/esm/providers/WalletProvider/WalletProvider.js +10 -9
  145. package/dist/esm/providers/WalletProvider/WalletProvider.js.map +1 -1
  146. package/dist/esm/providers/WalletProvider/useExternalWalletProvider.js +7 -3
  147. package/dist/esm/providers/WalletProvider/useExternalWalletProvider.js.map +1 -1
  148. package/dist/esm/stores/routes/useRouteExecutionIndicator.js +4 -3
  149. package/dist/esm/stores/routes/useRouteExecutionIndicator.js.map +1 -1
  150. package/dist/esm/types/token.d.ts +4 -1
  151. package/dist/esm/types/token.d.ts.map +1 -1
  152. package/dist/esm/utils/compactNumberFormatter.js +1 -3
  153. package/dist/esm/utils/compactNumberFormatter.js.map +1 -1
  154. package/dist/esm/utils/customReceiver.js +7 -0
  155. package/dist/esm/utils/customReceiver.js.map +1 -0
  156. package/dist/esm/utils/gas.js +24 -0
  157. package/dist/esm/utils/gas.js.map +1 -0
  158. package/dist/esm/utils/getErrorMessage.js +0 -1
  159. package/dist/esm/utils/getErrorMessage.js.map +1 -1
  160. package/dist/esm/utils/limitOrder.js +1 -1
  161. package/dist/esm/utils/limitOrder.js.map +1 -1
  162. package/dist/esm/utils/token.js +21 -4
  163. package/dist/esm/utils/token.js.map +1 -1
  164. package/dist/esm/utils/tokenList.js +38 -21
  165. package/dist/esm/utils/tokenList.js.map +1 -1
  166. package/package.json +15 -15
  167. package/src/components/AmountInput/AmountInputEndAdornment.tsx +2 -21
  168. package/src/components/AmountInputCard/PercentageChips.tsx +2 -18
  169. package/src/components/Chains/AllChainsAvatar.tsx +7 -1
  170. package/src/components/Messages/UnsupportedToAddressMessage.tsx +24 -0
  171. package/src/components/Messages/WarningMessages.tsx +3 -0
  172. package/src/components/Messages/useMessageQueue.ts +9 -0
  173. package/src/components/Routes/LimitOrderRoutes.tsx +5 -2
  174. package/src/components/Routes/RoutesContent.tsx +5 -2
  175. package/src/components/SendToWallet/SendToWalletExpandButton.tsx +2 -1
  176. package/src/components/TokenList/TokenListItem.tsx +68 -9
  177. package/src/components/TokenList/VirtualizedTokenList.tsx +33 -9
  178. package/src/components/TokenList/types.ts +4 -0
  179. package/src/config/version.ts +1 -1
  180. package/src/hooks/useAvailableChains.ts +1 -0
  181. package/src/hooks/useExplorer.ts +2 -0
  182. package/src/hooks/useFlaggedTokenGuard.ts +33 -0
  183. package/src/hooks/useGasSufficiency.ts +9 -1
  184. package/src/hooks/useMaxSendAmount.ts +21 -0
  185. package/src/hooks/useRoutes.ts +7 -0
  186. package/src/hooks/useToAddressRequirements.ts +17 -1
  187. package/src/hooks/useTokenBalances.ts +18 -2
  188. package/src/hooks/useTokenSearch.ts +1 -5
  189. package/src/hooks/useTokens.ts +28 -13
  190. package/src/pages/MainPage/ReviewButton.tsx +6 -2
  191. package/src/pages/RoutesPage/RoutesPage.tsx +5 -2
  192. package/src/pages/TransactionPage/TokenVerificationBottomSheet.tsx +93 -0
  193. package/src/pages/TransactionPage/TransactionReview.tsx +28 -1
  194. package/src/providers/WalletProvider/useExternalWalletProvider.ts +9 -1
  195. package/src/types/token.ts +6 -3
  196. package/src/utils/customReceiver.ts +7 -0
  197. package/src/utils/gas.ts +41 -0
  198. package/src/utils/token.ts +53 -9
  199. package/src/utils/tokenList.ts +28 -0
@@ -1 +1 @@
1
- {"version":3,"file":"TransactionFailedButtons.js","names":[],"sources":["../../../../src/pages/TransactionPage/TransactionFailedButtons.tsx"],"sourcesContent":["import type { RouteExtended } from '@lifi/sdk'\nimport { Box, Button } from '@mui/material'\nimport { useRef } from 'react'\nimport { useTranslation } from 'react-i18next'\nimport type { BottomSheetBase } from '../../components/BottomSheet/types.js'\nimport { useAddressActivity } from '../../hooks/useAddressActivity.js'\nimport { useNavigateBack } from '../../hooks/useNavigateBack.js'\nimport { useWidgetConfig } from '../../providers/WidgetProvider/WidgetProvider.js'\nimport { getAccumulatedFeeCostsBreakdown } from '../../utils/fees.js'\nimport { ConfirmToAddressSheet } from './ConfirmToAddressSheet.js'\nimport { StartTransactionButton } from './StartTransactionButton.js'\nimport { TokenValueBottomSheet } from './TokenValueBottomSheet.js'\nimport { getTokenValueLossThreshold } from './utils.js'\n\ninterface TransactionFailedButtonsProps {\n route: RouteExtended\n restartRoute: () => void\n deleteRoute: () => void\n}\n\nexport const TransactionFailedButtons: React.FC<\n TransactionFailedButtonsProps\n> = ({ route, restartRoute, deleteRoute }) => {\n const { t } = useTranslation()\n const navigateBack = useNavigateBack()\n const { mode, hiddenUI } = useWidgetConfig()\n\n const tokenValueBottomSheetRef = useRef<BottomSheetBase>(null)\n const confirmToAddressSheetRef = useRef<BottomSheetBase>(null)\n\n const {\n toAddress,\n hasActivity,\n isLoading: isLoadingAddressActivity,\n isFetched: isActivityAddressFetched,\n } = useAddressActivity(route.toChainId)\n\n const handleRemoveRoute = () => {\n navigateBack()\n deleteRoute()\n }\n\n const handleRetryClick = () => {\n if (\n toAddress &&\n !hasActivity &&\n !isLoadingAddressActivity &&\n isActivityAddressFetched &&\n !hiddenUI?.lowAddressActivityConfirmation\n ) {\n confirmToAddressSheetRef.current?.open()\n return\n }\n\n const { gasCostUSD, feeCostUSD } = getAccumulatedFeeCostsBreakdown(route)\n const fromAmountUSD = Number.parseFloat(route.fromAmountUSD)\n const toAmountUSD = Number.parseFloat(route.toAmountUSD)\n const tokenValueLossThresholdExceeded = getTokenValueLossThreshold(\n fromAmountUSD,\n toAmountUSD,\n gasCostUSD,\n feeCostUSD\n )\n if (tokenValueLossThresholdExceeded && mode !== 'custom') {\n tokenValueBottomSheetRef.current?.open()\n } else {\n restartRoute()\n }\n }\n\n return (\n <Box sx={{ display: 'flex', flexDirection: 'column', gap: 1.5 }}>\n <Box sx={{ display: 'flex', gap: 1.5 }}>\n <Box sx={{ flex: 1 }}>\n <Button onClick={handleRemoveRoute} fullWidth>\n {t('button.delete')}\n </Button>\n </Box>\n <Box sx={{ flex: 1 }}>\n <StartTransactionButton\n text={t('button.tryAgain')}\n onClick={handleRetryClick}\n route={route}\n loading={isLoadingAddressActivity}\n />\n </Box>\n </Box>\n {mode !== 'custom' ? (\n <TokenValueBottomSheet\n route={route}\n ref={tokenValueBottomSheetRef}\n onContinue={restartRoute}\n />\n ) : null}\n {!hiddenUI?.lowAddressActivityConfirmation ? (\n <ConfirmToAddressSheet\n ref={confirmToAddressSheetRef}\n onContinue={restartRoute}\n toAddress={toAddress!}\n toChainId={route.toChainId!}\n />\n ) : null}\n </Box>\n )\n}\n"],"mappings":";;;;;;;;;;;;;AAoBA,MAAa,4BAER,EAAE,OAAO,cAAc,kBAAkB;CAC5C,MAAM,EAAE,MAAM,eAAe;CAC7B,MAAM,eAAe,gBAAgB;CACrC,MAAM,EAAE,MAAM,aAAa,gBAAgB;CAE3C,MAAM,2BAA2B,OAAwB,IAAI;CAC7D,MAAM,2BAA2B,OAAwB,IAAI;CAE7D,MAAM,EACJ,WACA,aACA,WAAW,0BACX,WAAW,6BACT,mBAAmB,MAAM,SAAS;CAEtC,MAAM,0BAA0B;EAC9B,aAAa;EACb,YAAY;CACd;CAEA,MAAM,yBAAyB;EAC7B,IACE,aACA,CAAC,eACD,CAAC,4BACD,4BACA,CAAC,UAAU,gCACX;GACA,yBAAyB,SAAS,KAAK;GACvC;EACF;EAEA,MAAM,EAAE,YAAY,eAAe,gCAAgC,KAAK;EASxE,IANwC,2BAFlB,OAAO,WAAW,MAAM,aAGhC,GAFM,OAAO,WAAW,MAAM,WAGhC,GACV,YACA,UAEgC,KAAK,SAAS,UAC9C,yBAAyB,SAAS,KAAK;OAEvC,aAAa;CAEjB;CAEA,OACE,qBAAC,KAAD;EAAK,IAAI;GAAE,SAAS;GAAQ,eAAe;GAAU,KAAK;EAAI;EAA9D,UAAA;GACE,qBAAC,KAAD;IAAK,IAAI;KAAE,SAAS;KAAQ,KAAK;IAAI;IAArC,UAAA,CACE,oBAAC,KAAD;KAAK,IAAI,EAAE,MAAM,EAAE;KACjB,UAAA,oBAAC,QAAD;MAAQ,SAAS;MAAmB,WAAA;MACjC,UAAA,EAAE,eAAe;KACZ,CAAA;IACL,CAAA,GACL,oBAAC,KAAD;KAAK,IAAI,EAAE,MAAM,EAAE;KACjB,UAAA,oBAAC,wBAAD;MACE,MAAM,EAAE,iBAAiB;MACzB,SAAS;MACF;MACP,SAAS;KACV,CAAA;IACE,CAAA,CACF;;GACJ,SAAS,WACR,oBAAC,uBAAD;IACS;IACP,KAAK;IACL,YAAY;GACb,CAAA,IACC;GACH,CAAC,UAAU,iCACV,oBAAC,uBAAD;IACE,KAAK;IACL,YAAY;IACD;IACX,WAAW,MAAM;GAClB,CAAA,IACC;EACD;;AAET"}
1
+ {"version":3,"file":"TransactionFailedButtons.js","names":[],"sources":["../../../../src/pages/TransactionPage/TransactionFailedButtons.tsx"],"sourcesContent":["import type { RouteExtended } from '@lifi/sdk'\nimport { Box, Button } from '@mui/material'\nimport { useRef } from 'react'\nimport { useTranslation } from 'react-i18next'\nimport type { BottomSheetBase } from '../../components/BottomSheet/types.js'\nimport { useAddressActivity } from '../../hooks/useAddressActivity.js'\nimport { useNavigateBack } from '../../hooks/useNavigateBack.js'\nimport { useWidgetConfig } from '../../providers/WidgetProvider/WidgetProvider.js'\nimport { getAccumulatedFeeCostsBreakdown } from '../../utils/fees.js'\nimport { ConfirmToAddressSheet } from './ConfirmToAddressSheet.js'\nimport { StartTransactionButton } from './StartTransactionButton.js'\nimport { TokenValueBottomSheet } from './TokenValueBottomSheet.js'\nimport { getTokenValueLossThreshold } from './utils.js'\n\ninterface TransactionFailedButtonsProps {\n route: RouteExtended\n restartRoute: () => void\n deleteRoute: () => void\n}\n\nexport const TransactionFailedButtons: React.FC<\n TransactionFailedButtonsProps\n> = ({ route, restartRoute, deleteRoute }) => {\n const { t } = useTranslation()\n const navigateBack = useNavigateBack()\n const { mode, hiddenUI } = useWidgetConfig()\n\n const tokenValueBottomSheetRef = useRef<BottomSheetBase>(null)\n const confirmToAddressSheetRef = useRef<BottomSheetBase>(null)\n\n const {\n toAddress,\n hasActivity,\n isLoading: isLoadingAddressActivity,\n isFetched: isActivityAddressFetched,\n } = useAddressActivity(route.toChainId)\n\n const handleRemoveRoute = () => {\n navigateBack()\n deleteRoute()\n }\n\n const handleRetryClick = () => {\n if (\n toAddress &&\n !hasActivity &&\n !isLoadingAddressActivity &&\n isActivityAddressFetched &&\n !hiddenUI?.lowAddressActivityConfirmation\n ) {\n confirmToAddressSheetRef.current?.open()\n return\n }\n\n const { gasCostUSD, feeCostUSD } = getAccumulatedFeeCostsBreakdown(route)\n const fromAmountUSD = Number.parseFloat(route.fromAmountUSD)\n const toAmountUSD = Number.parseFloat(route.toAmountUSD)\n const tokenValueLossThresholdExceeded = getTokenValueLossThreshold(\n fromAmountUSD,\n toAmountUSD,\n gasCostUSD,\n feeCostUSD\n )\n if (tokenValueLossThresholdExceeded && mode !== 'custom') {\n tokenValueBottomSheetRef.current?.open()\n } else {\n restartRoute()\n }\n }\n\n return (\n <Box sx={{ display: 'flex', flexDirection: 'column', gap: 1.5 }}>\n <Box sx={{ display: 'flex', gap: 1.5 }}>\n <Box sx={{ flex: 1 }}>\n <Button onClick={handleRemoveRoute} fullWidth>\n {t('button.delete')}\n </Button>\n </Box>\n <Box sx={{ flex: 1 }}>\n <StartTransactionButton\n text={t('button.tryAgain')}\n onClick={handleRetryClick}\n route={route}\n loading={isLoadingAddressActivity}\n />\n </Box>\n </Box>\n {mode !== 'custom' ? (\n <TokenValueBottomSheet\n route={route}\n ref={tokenValueBottomSheetRef}\n onContinue={restartRoute}\n />\n ) : null}\n {!hiddenUI?.lowAddressActivityConfirmation ? (\n <ConfirmToAddressSheet\n ref={confirmToAddressSheetRef}\n onContinue={restartRoute}\n toAddress={toAddress!}\n toChainId={route.toChainId!}\n />\n ) : null}\n </Box>\n )\n}\n"],"mappings":";;;;;;;;;;;;;AAoBA,MAAa,4BAER,EAAE,OAAO,cAAc,kBAAkB;CAC5C,MAAM,EAAE,MAAM,eAAe;CAC7B,MAAM,eAAe,gBAAgB;CACrC,MAAM,EAAE,MAAM,aAAa,gBAAgB;CAE3C,MAAM,2BAA2B,OAAwB,IAAI;CAC7D,MAAM,2BAA2B,OAAwB,IAAI;CAE7D,MAAM,EACJ,WACA,aACA,WAAW,0BACX,WAAW,6BACT,mBAAmB,MAAM,SAAS;CAEtC,MAAM,0BAA0B;EAC9B,aAAa;EACb,YAAY;CACd;CAEA,MAAM,yBAAyB;EAC7B,IACE,aACA,CAAC,eACD,CAAC,4BACD,4BACA,CAAC,UAAU,gCACX;GACA,yBAAyB,SAAS,KAAK;GACvC;EACF;EAEA,MAAM,EAAE,YAAY,eAAe,gCAAgC,KAAK;EACxE,MAAM,gBAAgB,OAAO,WAAW,MAAM,aAAa;EAC3D,MAAM,cAAc,OAAO,WAAW,MAAM,WAAW;EAOvD,IANwC,2BACtC,eACA,aACA,YACA,UAEgC,KAAK,SAAS,UAC9C,yBAAyB,SAAS,KAAK;OAEvC,aAAa;CAEjB;CAEA,OACE,qBAAC,KAAD;EAAK,IAAI;GAAE,SAAS;GAAQ,eAAe;GAAU,KAAK;EAAI;EAA9D,UAAA;GACE,qBAAC,KAAD;IAAK,IAAI;KAAE,SAAS;KAAQ,KAAK;IAAI;IAArC,UAAA,CACE,oBAAC,KAAD;KAAK,IAAI,EAAE,MAAM,EAAE;KACjB,UAAA,oBAAC,QAAD;MAAQ,SAAS;MAAmB,WAAA;MACjC,UAAA,EAAE,eAAe;KACZ,CAAA;IACL,CAAA,GACL,oBAAC,KAAD;KAAK,IAAI,EAAE,MAAM,EAAE;KACjB,UAAA,oBAAC,wBAAD;MACE,MAAM,EAAE,iBAAiB;MACzB,SAAS;MACF;MACP,SAAS;KACV,CAAA;IACE,CAAA,CACF;;GACJ,SAAS,WACR,oBAAC,uBAAD;IACS;IACP,KAAK;IACL,YAAY;GACb,CAAA,IACC;GACH,CAAC,UAAU,iCACV,oBAAC,uBAAD;IACE,KAAK;IACL,YAAY;IACD;IACX,WAAW,MAAM;GAClB,CAAA,IACC;EACD;;AAET"}
@@ -13,6 +13,8 @@ import { ConfirmToAddressSheet } from "./ConfirmToAddressSheet.js";
13
13
  import { StartTransactionButton } from "./StartTransactionButton.js";
14
14
  import { calculateValueLossPercentage, getTokenValueLossThreshold } from "./utils.js";
15
15
  import { TokenValueBottomSheet } from "./TokenValueBottomSheet.js";
16
+ import { useFlaggedTokenGuard } from "../../hooks/useFlaggedTokenGuard.js";
17
+ import { TokenVerificationBottomSheet } from "./TokenVerificationBottomSheet.js";
16
18
  import { useRef } from "react";
17
19
  import { useNavigate } from "@tanstack/react-router";
18
20
  import { Box } from "@mui/material";
@@ -28,6 +30,7 @@ const TransactionReview = ({ route, executeRoute, routeRefreshing }) => {
28
30
  const { mode, modeOptions, hiddenUI, defaultUI } = useWidgetConfig();
29
31
  const tokenValueBottomSheetRef = useRef(null);
30
32
  const confirmToAddressSheetRef = useRef(null);
33
+ const { flaggedTokens, flaggedTokenSheetRef } = useFlaggedTokenGuard(route);
31
34
  const { toAddress, hasActivity, isLoading: isLoadingAddressActivity, isFetched: isActivityAddressFetched } = useAddressActivity(route.toChainId);
32
35
  const handleExecuteRoute = () => {
33
36
  if (tokenValueBottomSheetRef.current?.isOpen()) {
@@ -43,6 +46,7 @@ const TransactionReview = ({ route, executeRoute, routeRefreshing }) => {
43
46
  });
44
47
  }
45
48
  tokenValueBottomSheetRef.current?.close();
49
+ flaggedTokenSheetRef.current?.close();
46
50
  executeRoute();
47
51
  setFieldValue("fromAmount", "");
48
52
  if (mode === "custom") {
@@ -56,15 +60,28 @@ const TransactionReview = ({ route, executeRoute, routeRefreshing }) => {
56
60
  });
57
61
  });
58
62
  };
59
- const handleStartClick = () => {
63
+ const handleStartAfterTokenCheck = () => {
60
64
  if (toAddress && !hasActivity && !isLoadingAddressActivity && isActivityAddressFetched && !hiddenUI?.lowAddressActivityConfirmation) {
61
65
  confirmToAddressSheetRef.current?.open();
62
66
  return;
63
67
  }
64
68
  const { gasCostUSD, feeCostUSD } = getAccumulatedFeeCostsBreakdown(route);
65
- if (getTokenValueLossThreshold(Number.parseFloat(route.fromAmountUSD), Number.parseFloat(route.toAmountUSD), gasCostUSD, feeCostUSD) && mode !== "custom") tokenValueBottomSheetRef.current?.open();
69
+ const fromAmountUSD = Number.parseFloat(route.fromAmountUSD);
70
+ const toAmountUSD = Number.parseFloat(route.toAmountUSD);
71
+ if (getTokenValueLossThreshold(fromAmountUSD, toAmountUSD, gasCostUSD, feeCostUSD) && mode !== "custom") tokenValueBottomSheetRef.current?.open();
66
72
  else handleExecuteRoute();
67
73
  };
74
+ const handleStartClick = () => {
75
+ if (flaggedTokens.length) {
76
+ flaggedTokenSheetRef.current?.open();
77
+ return;
78
+ }
79
+ handleStartAfterTokenCheck();
80
+ };
81
+ const handleFlaggedTokensContinue = () => {
82
+ flaggedTokenSheetRef.current?.close();
83
+ handleStartAfterTokenCheck();
84
+ };
68
85
  const getButtonText = () => {
69
86
  switch (mode) {
70
87
  case "custom": return modeOptions?.custom?.type === "deposit" ? t("button.deposit") : t("button.buy");
@@ -104,6 +121,11 @@ const TransactionReview = ({ route, executeRoute, routeRefreshing }) => {
104
121
  ref: tokenValueBottomSheetRef,
105
122
  onContinue: handleExecuteRoute
106
123
  }) : null,
124
+ flaggedTokens.length ? /* @__PURE__ */ jsx(TokenVerificationBottomSheet, {
125
+ ref: flaggedTokenSheetRef,
126
+ tokens: flaggedTokens,
127
+ onContinue: handleFlaggedTokensContinue
128
+ }) : null,
107
129
  !hiddenUI?.lowAddressActivityConfirmation ? /* @__PURE__ */ jsx(ConfirmToAddressSheet, {
108
130
  ref: confirmToAddressSheetRef,
109
131
  onContinue: handleExecuteRoute,
@@ -1 +1 @@
1
- {"version":3,"file":"TransactionReview.js","names":["Card"],"sources":["../../../../src/pages/TransactionPage/TransactionReview.tsx"],"sourcesContent":["import type { RouteExtended } from '@lifi/sdk'\nimport { Box } from '@mui/material'\nimport { useNavigate } from '@tanstack/react-router'\nimport { useRef } from 'react'\nimport { useTranslation } from 'react-i18next'\nimport type { BottomSheetBase } from '../../components/BottomSheet/types.js'\nimport { Card } from '../../components/Card/Card.js'\nimport { WarningMessages } from '../../components/Messages/WarningMessages.js'\nimport { RouteTokens } from '../../components/RouteCard/RouteTokens.js'\nimport { useAddressActivity } from '../../hooks/useAddressActivity.js'\nimport { useWidgetEvents } from '../../hooks/useWidgetEvents.js'\nimport { useWidgetConfig } from '../../providers/WidgetProvider/WidgetProvider.js'\nimport { useFieldActions } from '../../stores/form/useFieldActions.js'\nimport { useHeaderStore } from '../../stores/header/useHeaderStore.js'\nimport { WidgetEvent } from '../../types/events.js'\nimport { getAccumulatedFeeCostsBreakdown } from '../../utils/fees.js'\nimport { navigationRoutes } from '../../utils/navigationRoutes.js'\nimport { ConfirmToAddressSheet } from './ConfirmToAddressSheet.js'\nimport { StartTransactionButton } from './StartTransactionButton.js'\nimport { TokenValueBottomSheet } from './TokenValueBottomSheet.js'\nimport {\n calculateValueLossPercentage,\n getTokenValueLossThreshold,\n} from './utils.js'\n\ninterface TransactionReviewProps {\n route: RouteExtended\n executeRoute: () => void\n routeRefreshing: boolean\n}\n\nexport const TransactionReview: React.FC<TransactionReviewProps> = ({\n route,\n executeRoute,\n routeRefreshing,\n}) => {\n const { t } = useTranslation()\n const navigate = useNavigate()\n const { setFieldValue } = useFieldActions()\n const emitter = useWidgetEvents()\n const setBackAction = useHeaderStore((state) => state.setBackAction)\n const { mode, modeOptions, hiddenUI, defaultUI } = useWidgetConfig()\n\n const tokenValueBottomSheetRef = useRef<BottomSheetBase>(null)\n const confirmToAddressSheetRef = useRef<BottomSheetBase>(null)\n\n const {\n toAddress,\n hasActivity,\n isLoading: isLoadingAddressActivity,\n isFetched: isActivityAddressFetched,\n } = useAddressActivity(route.toChainId)\n\n const handleExecuteRoute = () => {\n if (tokenValueBottomSheetRef.current?.isOpen()) {\n const { gasCostUSD, feeCostUSD } = getAccumulatedFeeCostsBreakdown(route)\n const fromAmountUSD = Number.parseFloat(route.fromAmountUSD)\n const toAmountUSD = Number.parseFloat(route.toAmountUSD)\n emitter.emit(WidgetEvent.RouteHighValueLoss, {\n fromAmountUSD,\n toAmountUSD,\n gasCostUSD,\n feeCostUSD,\n valueLoss: calculateValueLossPercentage(\n fromAmountUSD,\n toAmountUSD,\n gasCostUSD,\n feeCostUSD\n ),\n })\n }\n tokenValueBottomSheetRef.current?.close()\n executeRoute()\n setFieldValue('fromAmount', '')\n if (mode === 'custom') {\n setFieldValue('fromToken', '')\n setFieldValue('toToken', '')\n }\n setBackAction(() => {\n navigate({ to: navigationRoutes.home, replace: true })\n })\n }\n\n const handleStartClick = () => {\n if (\n toAddress &&\n !hasActivity &&\n !isLoadingAddressActivity &&\n isActivityAddressFetched &&\n !hiddenUI?.lowAddressActivityConfirmation\n ) {\n confirmToAddressSheetRef.current?.open()\n return\n }\n\n const { gasCostUSD, feeCostUSD } = getAccumulatedFeeCostsBreakdown(route)\n const fromAmountUSD = Number.parseFloat(route.fromAmountUSD)\n const toAmountUSD = Number.parseFloat(route.toAmountUSD)\n const tokenValueLossThresholdExceeded = getTokenValueLossThreshold(\n fromAmountUSD,\n toAmountUSD,\n gasCostUSD,\n feeCostUSD\n )\n if (tokenValueLossThresholdExceeded && mode !== 'custom') {\n tokenValueBottomSheetRef.current?.open()\n } else {\n handleExecuteRoute()\n }\n }\n\n const getButtonText = (): string => {\n switch (mode) {\n case 'custom':\n return modeOptions?.custom?.type === 'deposit'\n ? t('button.deposit')\n : t('button.buy')\n case 'refuel':\n return t('button.startBridging')\n default: {\n const transactionType =\n route.fromChainId === route.toChainId ? 'Swapping' : 'Bridging'\n return t(`button.start${transactionType}`)\n }\n }\n }\n\n return (\n <>\n <Card type=\"default\" indented>\n <RouteTokens\n route={route}\n showEssentials\n defaultExpanded={defaultUI?.transactionDetailsExpanded}\n />\n </Card>\n <WarningMessages sx={{ mt: 2 }} route={route} allowInteraction />\n <Box sx={{ flex: 1 }}>\n <StartTransactionButton\n text={getButtonText()}\n onClick={handleStartClick}\n route={route}\n loading={routeRefreshing || isLoadingAddressActivity}\n />\n </Box>\n {mode !== 'custom' ? (\n <TokenValueBottomSheet\n route={route}\n ref={tokenValueBottomSheetRef}\n onContinue={handleExecuteRoute}\n />\n ) : null}\n {!hiddenUI?.lowAddressActivityConfirmation ? (\n <ConfirmToAddressSheet\n ref={confirmToAddressSheetRef}\n onContinue={handleExecuteRoute}\n toAddress={toAddress!}\n toChainId={route.toChainId!}\n />\n ) : null}\n </>\n )\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;AA+BA,MAAa,qBAAuD,EAClE,OACA,cACA,sBACI;CACJ,MAAM,EAAE,MAAM,eAAe;CAC7B,MAAM,WAAW,YAAY;CAC7B,MAAM,EAAE,kBAAkB,gBAAgB;CAC1C,MAAM,UAAU,gBAAgB;CAChC,MAAM,gBAAgB,gBAAgB,UAAU,MAAM,aAAa;CACnE,MAAM,EAAE,MAAM,aAAa,UAAU,cAAc,gBAAgB;CAEnE,MAAM,2BAA2B,OAAwB,IAAI;CAC7D,MAAM,2BAA2B,OAAwB,IAAI;CAE7D,MAAM,EACJ,WACA,aACA,WAAW,0BACX,WAAW,6BACT,mBAAmB,MAAM,SAAS;CAEtC,MAAM,2BAA2B;EAC/B,IAAI,yBAAyB,SAAS,OAAO,GAAG;GAC9C,MAAM,EAAE,YAAY,eAAe,gCAAgC,KAAK;GACxE,MAAM,gBAAgB,OAAO,WAAW,MAAM,aAAa;GAC3D,MAAM,cAAc,OAAO,WAAW,MAAM,WAAW;GACvD,QAAQ,KAAA,sBAAqC;IAC3C;IACA;IACA;IACA;IACA,WAAW,6BACT,eACA,aACA,YACA,UACF;GACF,CAAC;EACH;EACA,yBAAyB,SAAS,MAAM;EACxC,aAAa;EACb,cAAc,cAAc,EAAE;EAC9B,IAAI,SAAS,UAAU;GACrB,cAAc,aAAa,EAAE;GAC7B,cAAc,WAAW,EAAE;EAC7B;EACA,oBAAoB;GAClB,SAAS;IAAE,IAAI,iBAAiB;IAAM,SAAS;GAAK,CAAC;EACvD,CAAC;CACH;CAEA,MAAM,yBAAyB;EAC7B,IACE,aACA,CAAC,eACD,CAAC,4BACD,4BACA,CAAC,UAAU,gCACX;GACA,yBAAyB,SAAS,KAAK;GACvC;EACF;EAEA,MAAM,EAAE,YAAY,eAAe,gCAAgC,KAAK;EASxE,IANwC,2BAFlB,OAAO,WAAW,MAAM,aAGhC,GAFM,OAAO,WAAW,MAAM,WAGhC,GACV,YACA,UAEgC,KAAK,SAAS,UAC9C,yBAAyB,SAAS,KAAK;OAEvC,mBAAmB;CAEvB;CAEA,MAAM,sBAA8B;EAClC,QAAQ,MAAR;GACE,KAAK,UACH,OAAO,aAAa,QAAQ,SAAS,YACjC,EAAE,gBAAgB,IAClB,EAAE,YAAY;GACpB,KAAK,UACH,OAAO,EAAE,sBAAsB;GACjC,SAAS;IACP,MAAM,kBACJ,MAAM,gBAAgB,MAAM,YAAY,aAAa;IACvD,OAAO,EAAE,eAAe,iBAAiB;GAC3C;EACF;CACF;CAEA,OACE,qBAAA,YAAA,EAAA,UAAA;EACE,oBAACA,QAAD;GAAM,MAAK;GAAU,UAAA;GACnB,UAAA,oBAAC,aAAD;IACS;IACP,gBAAA;IACA,iBAAiB,WAAW;GAC7B,CAAA;EACG,CAAA;EACN,oBAAC,iBAAD;GAAiB,IAAI,EAAE,IAAI,EAAE;GAAU;GAAO,kBAAA;EAAkB,CAAA;EAChE,oBAAC,KAAD;GAAK,IAAI,EAAE,MAAM,EAAE;GACjB,UAAA,oBAAC,wBAAD;IACE,MAAM,cAAc;IACpB,SAAS;IACF;IACP,SAAS,mBAAmB;GAC7B,CAAA;EACE,CAAA;EACJ,SAAS,WACR,oBAAC,uBAAD;GACS;GACP,KAAK;GACL,YAAY;EACb,CAAA,IACC;EACH,CAAC,UAAU,iCACV,oBAAC,uBAAD;GACE,KAAK;GACL,YAAY;GACD;GACX,WAAW,MAAM;EAClB,CAAA,IACC;CACJ,EAAA,CAAA;AAEN"}
1
+ {"version":3,"file":"TransactionReview.js","names":["Card"],"sources":["../../../../src/pages/TransactionPage/TransactionReview.tsx"],"sourcesContent":["import type { RouteExtended } from '@lifi/sdk'\nimport { Box } from '@mui/material'\nimport { useNavigate } from '@tanstack/react-router'\nimport { useRef } from 'react'\nimport { useTranslation } from 'react-i18next'\nimport type { BottomSheetBase } from '../../components/BottomSheet/types.js'\nimport { Card } from '../../components/Card/Card.js'\nimport { WarningMessages } from '../../components/Messages/WarningMessages.js'\nimport { RouteTokens } from '../../components/RouteCard/RouteTokens.js'\nimport { useAddressActivity } from '../../hooks/useAddressActivity.js'\nimport { useFlaggedTokenGuard } from '../../hooks/useFlaggedTokenGuard.js'\nimport { useWidgetEvents } from '../../hooks/useWidgetEvents.js'\nimport { useWidgetConfig } from '../../providers/WidgetProvider/WidgetProvider.js'\nimport { useFieldActions } from '../../stores/form/useFieldActions.js'\nimport { useHeaderStore } from '../../stores/header/useHeaderStore.js'\nimport { WidgetEvent } from '../../types/events.js'\nimport { getAccumulatedFeeCostsBreakdown } from '../../utils/fees.js'\nimport { navigationRoutes } from '../../utils/navigationRoutes.js'\nimport { ConfirmToAddressSheet } from './ConfirmToAddressSheet.js'\nimport { StartTransactionButton } from './StartTransactionButton.js'\nimport { TokenValueBottomSheet } from './TokenValueBottomSheet.js'\nimport { TokenVerificationBottomSheet } from './TokenVerificationBottomSheet.js'\nimport {\n calculateValueLossPercentage,\n getTokenValueLossThreshold,\n} from './utils.js'\n\ninterface TransactionReviewProps {\n route: RouteExtended\n executeRoute: () => void\n routeRefreshing: boolean\n}\n\nexport const TransactionReview: React.FC<TransactionReviewProps> = ({\n route,\n executeRoute,\n routeRefreshing,\n}) => {\n const { t } = useTranslation()\n const navigate = useNavigate()\n const { setFieldValue } = useFieldActions()\n const emitter = useWidgetEvents()\n const setBackAction = useHeaderStore((state) => state.setBackAction)\n const { mode, modeOptions, hiddenUI, defaultUI } = useWidgetConfig()\n\n const tokenValueBottomSheetRef = useRef<BottomSheetBase>(null)\n const confirmToAddressSheetRef = useRef<BottomSheetBase>(null)\n\n const { flaggedTokens, flaggedTokenSheetRef } = useFlaggedTokenGuard(route)\n\n const {\n toAddress,\n hasActivity,\n isLoading: isLoadingAddressActivity,\n isFetched: isActivityAddressFetched,\n } = useAddressActivity(route.toChainId)\n\n const handleExecuteRoute = () => {\n if (tokenValueBottomSheetRef.current?.isOpen()) {\n const { gasCostUSD, feeCostUSD } = getAccumulatedFeeCostsBreakdown(route)\n const fromAmountUSD = Number.parseFloat(route.fromAmountUSD)\n const toAmountUSD = Number.parseFloat(route.toAmountUSD)\n emitter.emit(WidgetEvent.RouteHighValueLoss, {\n fromAmountUSD,\n toAmountUSD,\n gasCostUSD,\n feeCostUSD,\n valueLoss: calculateValueLossPercentage(\n fromAmountUSD,\n toAmountUSD,\n gasCostUSD,\n feeCostUSD\n ),\n })\n }\n tokenValueBottomSheetRef.current?.close()\n flaggedTokenSheetRef.current?.close()\n executeRoute()\n setFieldValue('fromAmount', '')\n if (mode === 'custom') {\n setFieldValue('fromToken', '')\n setFieldValue('toToken', '')\n }\n setBackAction(() => {\n navigate({ to: navigationRoutes.home, replace: true })\n })\n }\n\n // Runs the remaining gates. The flagged-token sheet continues into this\n // rather than executing, so accepting it does not skip the others.\n const handleStartAfterTokenCheck = () => {\n if (\n toAddress &&\n !hasActivity &&\n !isLoadingAddressActivity &&\n isActivityAddressFetched &&\n !hiddenUI?.lowAddressActivityConfirmation\n ) {\n confirmToAddressSheetRef.current?.open()\n return\n }\n\n const { gasCostUSD, feeCostUSD } = getAccumulatedFeeCostsBreakdown(route)\n const fromAmountUSD = Number.parseFloat(route.fromAmountUSD)\n const toAmountUSD = Number.parseFloat(route.toAmountUSD)\n const tokenValueLossThresholdExceeded = getTokenValueLossThreshold(\n fromAmountUSD,\n toAmountUSD,\n gasCostUSD,\n feeCostUSD\n )\n if (tokenValueLossThresholdExceeded && mode !== 'custom') {\n tokenValueBottomSheetRef.current?.open()\n } else {\n handleExecuteRoute()\n }\n }\n\n const handleStartClick = () => {\n if (flaggedTokens.length) {\n flaggedTokenSheetRef.current?.open()\n return\n }\n handleStartAfterTokenCheck()\n }\n\n const handleFlaggedTokensContinue = () => {\n flaggedTokenSheetRef.current?.close()\n handleStartAfterTokenCheck()\n }\n\n const getButtonText = (): string => {\n switch (mode) {\n case 'custom':\n return modeOptions?.custom?.type === 'deposit'\n ? t('button.deposit')\n : t('button.buy')\n case 'refuel':\n return t('button.startBridging')\n default: {\n const transactionType =\n route.fromChainId === route.toChainId ? 'Swapping' : 'Bridging'\n return t(`button.start${transactionType}`)\n }\n }\n }\n\n return (\n <>\n <Card type=\"default\" indented>\n <RouteTokens\n route={route}\n showEssentials\n defaultExpanded={defaultUI?.transactionDetailsExpanded}\n />\n </Card>\n <WarningMessages sx={{ mt: 2 }} route={route} allowInteraction />\n <Box sx={{ flex: 1 }}>\n <StartTransactionButton\n text={getButtonText()}\n onClick={handleStartClick}\n route={route}\n loading={routeRefreshing || isLoadingAddressActivity}\n />\n </Box>\n {mode !== 'custom' ? (\n <TokenValueBottomSheet\n route={route}\n ref={tokenValueBottomSheetRef}\n onContinue={handleExecuteRoute}\n />\n ) : null}\n {flaggedTokens.length ? (\n <TokenVerificationBottomSheet\n ref={flaggedTokenSheetRef}\n tokens={flaggedTokens}\n onContinue={handleFlaggedTokensContinue}\n />\n ) : null}\n {!hiddenUI?.lowAddressActivityConfirmation ? (\n <ConfirmToAddressSheet\n ref={confirmToAddressSheetRef}\n onContinue={handleExecuteRoute}\n toAddress={toAddress!}\n toChainId={route.toChainId!}\n />\n ) : null}\n </>\n )\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;AAiCA,MAAa,qBAAuD,EAClE,OACA,cACA,sBACI;CACJ,MAAM,EAAE,MAAM,eAAe;CAC7B,MAAM,WAAW,YAAY;CAC7B,MAAM,EAAE,kBAAkB,gBAAgB;CAC1C,MAAM,UAAU,gBAAgB;CAChC,MAAM,gBAAgB,gBAAgB,UAAU,MAAM,aAAa;CACnE,MAAM,EAAE,MAAM,aAAa,UAAU,cAAc,gBAAgB;CAEnE,MAAM,2BAA2B,OAAwB,IAAI;CAC7D,MAAM,2BAA2B,OAAwB,IAAI;CAE7D,MAAM,EAAE,eAAe,yBAAyB,qBAAqB,KAAK;CAE1E,MAAM,EACJ,WACA,aACA,WAAW,0BACX,WAAW,6BACT,mBAAmB,MAAM,SAAS;CAEtC,MAAM,2BAA2B;EAC/B,IAAI,yBAAyB,SAAS,OAAO,GAAG;GAC9C,MAAM,EAAE,YAAY,eAAe,gCAAgC,KAAK;GACxE,MAAM,gBAAgB,OAAO,WAAW,MAAM,aAAa;GAC3D,MAAM,cAAc,OAAO,WAAW,MAAM,WAAW;GACvD,QAAQ,KAAA,sBAAqC;IAC3C;IACA;IACA;IACA;IACA,WAAW,6BACT,eACA,aACA,YACA,UACF;GACF,CAAC;EACH;EACA,yBAAyB,SAAS,MAAM;EACxC,qBAAqB,SAAS,MAAM;EACpC,aAAa;EACb,cAAc,cAAc,EAAE;EAC9B,IAAI,SAAS,UAAU;GACrB,cAAc,aAAa,EAAE;GAC7B,cAAc,WAAW,EAAE;EAC7B;EACA,oBAAoB;GAClB,SAAS;IAAE,IAAI,iBAAiB;IAAM,SAAS;GAAK,CAAC;EACvD,CAAC;CACH;CAIA,MAAM,mCAAmC;EACvC,IACE,aACA,CAAC,eACD,CAAC,4BACD,4BACA,CAAC,UAAU,gCACX;GACA,yBAAyB,SAAS,KAAK;GACvC;EACF;EAEA,MAAM,EAAE,YAAY,eAAe,gCAAgC,KAAK;EACxE,MAAM,gBAAgB,OAAO,WAAW,MAAM,aAAa;EAC3D,MAAM,cAAc,OAAO,WAAW,MAAM,WAAW;EAOvD,IANwC,2BACtC,eACA,aACA,YACA,UAEgC,KAAK,SAAS,UAC9C,yBAAyB,SAAS,KAAK;OAEvC,mBAAmB;CAEvB;CAEA,MAAM,yBAAyB;EAC7B,IAAI,cAAc,QAAQ;GACxB,qBAAqB,SAAS,KAAK;GACnC;EACF;EACA,2BAA2B;CAC7B;CAEA,MAAM,oCAAoC;EACxC,qBAAqB,SAAS,MAAM;EACpC,2BAA2B;CAC7B;CAEA,MAAM,sBAA8B;EAClC,QAAQ,MAAR;GACE,KAAK,UACH,OAAO,aAAa,QAAQ,SAAS,YACjC,EAAE,gBAAgB,IAClB,EAAE,YAAY;GACpB,KAAK,UACH,OAAO,EAAE,sBAAsB;GACjC,SAAS;IACP,MAAM,kBACJ,MAAM,gBAAgB,MAAM,YAAY,aAAa;IACvD,OAAO,EAAE,eAAe,iBAAiB;GAC3C;EACF;CACF;CAEA,OACE,qBAAA,YAAA,EAAA,UAAA;EACE,oBAACA,QAAD;GAAM,MAAK;GAAU,UAAA;GACnB,UAAA,oBAAC,aAAD;IACS;IACP,gBAAA;IACA,iBAAiB,WAAW;GAC7B,CAAA;EACG,CAAA;EACN,oBAAC,iBAAD;GAAiB,IAAI,EAAE,IAAI,EAAE;GAAU;GAAO,kBAAA;EAAkB,CAAA;EAChE,oBAAC,KAAD;GAAK,IAAI,EAAE,MAAM,EAAE;GACjB,UAAA,oBAAC,wBAAD;IACE,MAAM,cAAc;IACpB,SAAS;IACF;IACP,SAAS,mBAAmB;GAC7B,CAAA;EACE,CAAA;EACJ,SAAS,WACR,oBAAC,uBAAD;GACS;GACP,KAAK;GACL,YAAY;EACb,CAAA,IACC;EACH,cAAc,SACb,oBAAC,8BAAD;GACE,KAAK;GACL,QAAQ;GACR,YAAY;EACb,CAAA,IACC;EACH,CAAC,UAAU,iCACV,oBAAC,uBAAD;GACE,KAAK;GACL,YAAY;GACD;GACX,WAAW,MAAM;EAClB,CAAA,IACC;CACJ,EAAA,CAAA;AAEN"}
@@ -17,43 +17,44 @@ const I18nProvider = ({ children }) => {
17
17
  const { languages, languageResources } = useWidgetConfig();
18
18
  const { language, languageCache } = useSettings(["language", "languageCache"]);
19
19
  const i18nInstanceRef = useRef(null);
20
+ const i18nInstance = useMemo(() => {
21
+ if (i18nInstanceRef.current) {
22
+ if (language && languageCache && language !== "en") i18nInstanceRef.current.addResourceBundle(language, "translation", languageCache, true, true);
23
+ return i18nInstanceRef.current;
24
+ }
25
+ const customLanguageKeys = languageResources ? Object.keys(languageResources).filter((key) => !allLanguages.includes(key)) : [];
26
+ const initialLanguage = language || languages?.default;
27
+ const i18n = createInstance({
28
+ lng: initialLanguage,
29
+ fallbackLng: "en",
30
+ lowerCaseLng: true,
31
+ interpolation: { escapeValue: false },
32
+ resources: {
33
+ en: { translation: mergeWithLanguageResources(en, languageResources?.en) },
34
+ ...initialLanguage && initialLanguage !== "en" && languageCache && { [initialLanguage]: { translation: languageCache } },
35
+ ...customLanguageKeys.reduce((acc, key) => {
36
+ const customResource = languageResources?.[key];
37
+ if (customResource) acc[key] = { translation: customResource };
38
+ return acc;
39
+ }, {})
40
+ },
41
+ detection: { caches: [] },
42
+ returnEmptyString: false
43
+ });
44
+ i18n.init();
45
+ i18n.services.formatter?.addCached("numberExt", compactNumberFormatter);
46
+ i18n.services.formatter?.addCached("currencyExt", currencyExtendedFormatter);
47
+ i18n.services.formatter?.addCached("percent", percentFormatter);
48
+ i18nInstanceRef.current = i18n;
49
+ return i18n;
50
+ }, [
51
+ language,
52
+ languageResources,
53
+ languages?.default,
54
+ languageCache
55
+ ]);
20
56
  return /* @__PURE__ */ jsxs(I18nextProvider, {
21
- i18n: useMemo(() => {
22
- if (i18nInstanceRef.current) {
23
- if (language && languageCache && language !== "en") i18nInstanceRef.current.addResourceBundle(language, "translation", languageCache, true, true);
24
- return i18nInstanceRef.current;
25
- }
26
- const customLanguageKeys = languageResources ? Object.keys(languageResources).filter((key) => !allLanguages.includes(key)) : [];
27
- const initialLanguage = language || languages?.default;
28
- const i18n = createInstance({
29
- lng: initialLanguage,
30
- fallbackLng: "en",
31
- lowerCaseLng: true,
32
- interpolation: { escapeValue: false },
33
- resources: {
34
- en: { translation: mergeWithLanguageResources(en, languageResources?.en) },
35
- ...initialLanguage && initialLanguage !== "en" && languageCache && { [initialLanguage]: { translation: languageCache } },
36
- ...customLanguageKeys.reduce((acc, key) => {
37
- const customResource = languageResources?.[key];
38
- if (customResource) acc[key] = { translation: customResource };
39
- return acc;
40
- }, {})
41
- },
42
- detection: { caches: [] },
43
- returnEmptyString: false
44
- });
45
- i18n.init();
46
- i18n.services.formatter?.addCached("numberExt", compactNumberFormatter);
47
- i18n.services.formatter?.addCached("currencyExt", currencyExtendedFormatter);
48
- i18n.services.formatter?.addCached("percent", percentFormatter);
49
- i18nInstanceRef.current = i18n;
50
- return i18n;
51
- }, [
52
- language,
53
- languageResources,
54
- languages?.default,
55
- languageCache
56
- ]),
57
+ i18n: i18nInstance,
57
58
  children: [children, /* @__PURE__ */ jsx(DefaultLanguageHandler, {})]
58
59
  });
59
60
  };
@@ -1 +1 @@
1
- {"version":3,"file":"I18nProvider.js","names":["enResource"],"sources":["../../../../src/providers/I18nProvider/I18nProvider.tsx"],"sourcesContent":["import { createInstance, type i18n } from 'i18next'\nimport { useEffect, useMemo, useRef } from 'react'\nimport { I18nextProvider } from 'react-i18next'\nimport { useLanguages } from '../../hooks/useLanguages.js'\nimport { useSettingsStore } from '../../stores/settings/SettingsStore.js'\nimport { useSettings } from '../../stores/settings/useSettings.js'\nimport { compactNumberFormatter } from '../../utils/compactNumberFormatter.js'\nimport { currencyExtendedFormatter } from '../../utils/currencyExtendedFormatter.js'\nimport { percentFormatter } from '../../utils/percentFormatter.js'\nimport { useWidgetConfig } from '../WidgetProvider/WidgetProvider.js'\nimport { allLanguages } from './constants.js'\nimport { enResource } from './enResource.js'\nimport { mergeWithLanguageResources } from './i18n.js'\nimport type { LanguageKey, LanguageResource, PartialResource } from './types.js'\n\nexport const I18nProvider: React.FC<React.PropsWithChildren> = ({\n children,\n}) => {\n const { languages, languageResources } = useWidgetConfig()\n const { language, languageCache } = useSettings(['language', 'languageCache'])\n const i18nInstanceRef = useRef<i18n | null>(null)\n\n const i18nInstance = useMemo(() => {\n if (i18nInstanceRef.current) {\n // Update i18n instance with language and language cache updates\n if (language && languageCache && language !== 'en') {\n i18nInstanceRef.current.addResourceBundle(\n language,\n 'translation',\n languageCache,\n true,\n true\n )\n }\n return i18nInstanceRef.current\n }\n\n // Custom language resources (of non-default languages) are added statically.\n // If custom language resources extend existing languages, they are merged with dynamically loaded resources.\n const customLanguageKeys = languageResources\n ? Object.keys(languageResources).filter(\n (key: string) => !allLanguages.includes(key as LanguageKey)\n )\n : []\n const initialLanguage = language || languages?.default\n const i18n = createInstance({\n lng: initialLanguage,\n fallbackLng: 'en',\n lowerCaseLng: true,\n interpolation: { escapeValue: false },\n resources: {\n en: {\n translation: mergeWithLanguageResources(\n enResource,\n languageResources?.en\n ),\n },\n ...(initialLanguage &&\n initialLanguage !== 'en' &&\n languageCache && {\n [initialLanguage]: {\n translation: languageCache,\n },\n }),\n // Add non-existing custom language resources\n ...customLanguageKeys.reduce(\n (acc, key) => {\n const customResource = languageResources?.[key as LanguageKey]\n if (customResource) {\n acc[key] = {\n translation: customResource,\n }\n }\n return acc\n },\n {} as Record<\n string,\n { translation: PartialResource<LanguageResource> }\n >\n ),\n },\n detection: {\n caches: [],\n },\n returnEmptyString: false,\n })\n\n i18n.init()\n\n i18n.services.formatter?.addCached('numberExt', compactNumberFormatter)\n i18n.services.formatter?.addCached('currencyExt', currencyExtendedFormatter)\n i18n.services.formatter?.addCached('percent', percentFormatter)\n i18nInstanceRef.current = i18n\n return i18n\n }, [language, languageResources, languages?.default, languageCache])\n\n return (\n <I18nextProvider i18n={i18nInstance}>\n {children}\n <DefaultLanguageHandler />\n </I18nextProvider>\n )\n}\n\n// Sync language settings internally when config.languages.default changes externally\nconst DefaultLanguageHandler: React.FC = () => {\n const { languages } = useWidgetConfig()\n const [lastDefaultLanguage, setValue] = useSettingsStore((state) => [\n state.lastDefaultLanguage,\n state.setValue,\n ])\n const { setLanguageWithCode: setLanguage } = useLanguages()\n\n useEffect(() => {\n const currentDefaultLanguage = languages?.default\n\n const defaultLanguageChanged =\n currentDefaultLanguage && currentDefaultLanguage !== lastDefaultLanguage\n\n if (!defaultLanguageChanged) {\n return\n }\n\n const updateLanguage = async () => {\n await setLanguage(currentDefaultLanguage)\n setValue('lastDefaultLanguage', currentDefaultLanguage)\n }\n\n updateLanguage()\n }, [languages?.default, setValue, lastDefaultLanguage, setLanguage])\n\n return null\n}\n"],"mappings":";;;;;;;;;;;;;;;AAeA,MAAa,gBAAmD,EAC9D,eACI;CACJ,MAAM,EAAE,WAAW,sBAAsB,gBAAgB;CACzD,MAAM,EAAE,UAAU,kBAAkB,YAAY,CAAC,YAAY,eAAe,CAAC;CAC7E,MAAM,kBAAkB,OAAoB,IAAI;CA4EhD,OACE,qBAAC,iBAAD;EAAiB,MA3EE,cAAc;GACjC,IAAI,gBAAgB,SAAS;IAE3B,IAAI,YAAY,iBAAiB,aAAa,MAC5C,gBAAgB,QAAQ,kBACtB,UACA,eACA,eACA,MACA,IACF;IAEF,OAAO,gBAAgB;GACzB;GAIA,MAAM,qBAAqB,oBACvB,OAAO,KAAK,iBAAiB,CAAC,CAAC,QAC5B,QAAgB,CAAC,aAAa,SAAS,GAAkB,CAC5D,IACA,CAAC;GACL,MAAM,kBAAkB,YAAY,WAAW;GAC/C,MAAM,OAAO,eAAe;IAC1B,KAAK;IACL,aAAa;IACb,cAAc;IACd,eAAe,EAAE,aAAa,MAAM;IACpC,WAAW;KACT,IAAI,EACF,aAAa,2BACXA,IACA,mBAAmB,EACrB,EACF;KACA,GAAI,mBACF,oBAAoB,QACpB,iBAAiB,GACd,kBAAkB,EACjB,aAAa,cACf,EACF;KAEF,GAAG,mBAAmB,QACnB,KAAK,QAAQ;MACZ,MAAM,iBAAiB,oBAAoB;MAC3C,IAAI,gBACF,IAAI,OAAO,EACT,aAAa,eACf;MAEF,OAAO;KACT,GACA,CAAC,CAIH;IACF;IACA,WAAW,EACT,QAAQ,CAAC,EACX;IACA,mBAAmB;GACrB,CAAC;GAED,KAAK,KAAK;GAEV,KAAK,SAAS,WAAW,UAAU,aAAa,sBAAsB;GACtE,KAAK,SAAS,WAAW,UAAU,eAAe,yBAAyB;GAC3E,KAAK,SAAS,WAAW,UAAU,WAAW,gBAAgB;GAC9D,gBAAgB,UAAU;GAC1B,OAAO;EACT,GAAG;GAAC;GAAU;GAAmB,WAAW;GAAS;EAAa,CAG9B;EAAlC,UAAA,CACG,UACD,oBAAC,wBAAD,CAAyB,CAAA,CACV;;AAErB;AAGA,MAAM,+BAAyC;CAC7C,MAAM,EAAE,cAAc,gBAAgB;CACtC,MAAM,CAAC,qBAAqB,YAAY,kBAAkB,UAAU,CAClE,MAAM,qBACN,MAAM,QACR,CAAC;CACD,MAAM,EAAE,qBAAqB,gBAAgB,aAAa;CAE1D,gBAAgB;EACd,MAAM,yBAAyB,WAAW;EAK1C,IAAI,EAFF,0BAA0B,2BAA2B,sBAGrD;EAGF,MAAM,iBAAiB,YAAY;GACjC,MAAM,YAAY,sBAAsB;GACxC,SAAS,uBAAuB,sBAAsB;EACxD;EAEA,eAAe;CACjB,GAAG;EAAC,WAAW;EAAS;EAAU;EAAqB;CAAW,CAAC;CAEnE,OAAO;AACT"}
1
+ {"version":3,"file":"I18nProvider.js","names":["enResource"],"sources":["../../../../src/providers/I18nProvider/I18nProvider.tsx"],"sourcesContent":["import { createInstance, type i18n } from 'i18next'\nimport { useEffect, useMemo, useRef } from 'react'\nimport { I18nextProvider } from 'react-i18next'\nimport { useLanguages } from '../../hooks/useLanguages.js'\nimport { useSettingsStore } from '../../stores/settings/SettingsStore.js'\nimport { useSettings } from '../../stores/settings/useSettings.js'\nimport { compactNumberFormatter } from '../../utils/compactNumberFormatter.js'\nimport { currencyExtendedFormatter } from '../../utils/currencyExtendedFormatter.js'\nimport { percentFormatter } from '../../utils/percentFormatter.js'\nimport { useWidgetConfig } from '../WidgetProvider/WidgetProvider.js'\nimport { allLanguages } from './constants.js'\nimport { enResource } from './enResource.js'\nimport { mergeWithLanguageResources } from './i18n.js'\nimport type { LanguageKey, LanguageResource, PartialResource } from './types.js'\n\nexport const I18nProvider: React.FC<React.PropsWithChildren> = ({\n children,\n}) => {\n const { languages, languageResources } = useWidgetConfig()\n const { language, languageCache } = useSettings(['language', 'languageCache'])\n const i18nInstanceRef = useRef<i18n | null>(null)\n\n const i18nInstance = useMemo(() => {\n if (i18nInstanceRef.current) {\n // Update i18n instance with language and language cache updates\n if (language && languageCache && language !== 'en') {\n i18nInstanceRef.current.addResourceBundle(\n language,\n 'translation',\n languageCache,\n true,\n true\n )\n }\n return i18nInstanceRef.current\n }\n\n // Custom language resources (of non-default languages) are added statically.\n // If custom language resources extend existing languages, they are merged with dynamically loaded resources.\n const customLanguageKeys = languageResources\n ? Object.keys(languageResources).filter(\n (key: string) => !allLanguages.includes(key as LanguageKey)\n )\n : []\n const initialLanguage = language || languages?.default\n const i18n = createInstance({\n lng: initialLanguage,\n fallbackLng: 'en',\n lowerCaseLng: true,\n interpolation: { escapeValue: false },\n resources: {\n en: {\n translation: mergeWithLanguageResources(\n enResource,\n languageResources?.en\n ),\n },\n ...(initialLanguage &&\n initialLanguage !== 'en' &&\n languageCache && {\n [initialLanguage]: {\n translation: languageCache,\n },\n }),\n // Add non-existing custom language resources\n ...customLanguageKeys.reduce(\n (acc, key) => {\n const customResource = languageResources?.[key as LanguageKey]\n if (customResource) {\n acc[key] = {\n translation: customResource,\n }\n }\n return acc\n },\n {} as Record<\n string,\n { translation: PartialResource<LanguageResource> }\n >\n ),\n },\n detection: {\n caches: [],\n },\n returnEmptyString: false,\n })\n\n i18n.init()\n\n i18n.services.formatter?.addCached('numberExt', compactNumberFormatter)\n i18n.services.formatter?.addCached('currencyExt', currencyExtendedFormatter)\n i18n.services.formatter?.addCached('percent', percentFormatter)\n i18nInstanceRef.current = i18n\n return i18n\n }, [language, languageResources, languages?.default, languageCache])\n\n return (\n <I18nextProvider i18n={i18nInstance}>\n {children}\n <DefaultLanguageHandler />\n </I18nextProvider>\n )\n}\n\n// Sync language settings internally when config.languages.default changes externally\nconst DefaultLanguageHandler: React.FC = () => {\n const { languages } = useWidgetConfig()\n const [lastDefaultLanguage, setValue] = useSettingsStore((state) => [\n state.lastDefaultLanguage,\n state.setValue,\n ])\n const { setLanguageWithCode: setLanguage } = useLanguages()\n\n useEffect(() => {\n const currentDefaultLanguage = languages?.default\n\n const defaultLanguageChanged =\n currentDefaultLanguage && currentDefaultLanguage !== lastDefaultLanguage\n\n if (!defaultLanguageChanged) {\n return\n }\n\n const updateLanguage = async () => {\n await setLanguage(currentDefaultLanguage)\n setValue('lastDefaultLanguage', currentDefaultLanguage)\n }\n\n updateLanguage()\n }, [languages?.default, setValue, lastDefaultLanguage, setLanguage])\n\n return null\n}\n"],"mappings":";;;;;;;;;;;;;;;AAeA,MAAa,gBAAmD,EAC9D,eACI;CACJ,MAAM,EAAE,WAAW,sBAAsB,gBAAgB;CACzD,MAAM,EAAE,UAAU,kBAAkB,YAAY,CAAC,YAAY,eAAe,CAAC;CAC7E,MAAM,kBAAkB,OAAoB,IAAI;CAEhD,MAAM,eAAe,cAAc;EACjC,IAAI,gBAAgB,SAAS;GAE3B,IAAI,YAAY,iBAAiB,aAAa,MAC5C,gBAAgB,QAAQ,kBACtB,UACA,eACA,eACA,MACA,IACF;GAEF,OAAO,gBAAgB;EACzB;EAIA,MAAM,qBAAqB,oBACvB,OAAO,KAAK,iBAAiB,CAAC,CAAC,QAC5B,QAAgB,CAAC,aAAa,SAAS,GAAkB,CAC5D,IACA,CAAC;EACL,MAAM,kBAAkB,YAAY,WAAW;EAC/C,MAAM,OAAO,eAAe;GAC1B,KAAK;GACL,aAAa;GACb,cAAc;GACd,eAAe,EAAE,aAAa,MAAM;GACpC,WAAW;IACT,IAAI,EACF,aAAa,2BACXA,IACA,mBAAmB,EACrB,EACF;IACA,GAAI,mBACF,oBAAoB,QACpB,iBAAiB,GACd,kBAAkB,EACjB,aAAa,cACf,EACF;IAEF,GAAG,mBAAmB,QACnB,KAAK,QAAQ;KACZ,MAAM,iBAAiB,oBAAoB;KAC3C,IAAI,gBACF,IAAI,OAAO,EACT,aAAa,eACf;KAEF,OAAO;IACT,GACA,CAAC,CAIH;GACF;GACA,WAAW,EACT,QAAQ,CAAC,EACX;GACA,mBAAmB;EACrB,CAAC;EAED,KAAK,KAAK;EAEV,KAAK,SAAS,WAAW,UAAU,aAAa,sBAAsB;EACtE,KAAK,SAAS,WAAW,UAAU,eAAe,yBAAyB;EAC3E,KAAK,SAAS,WAAW,UAAU,WAAW,gBAAgB;EAC9D,gBAAgB,UAAU;EAC1B,OAAO;CACT,GAAG;EAAC;EAAU;EAAmB,WAAW;EAAS;CAAa,CAAC;CAEnE,OACE,qBAAC,iBAAD;EAAiB,MAAM;EAAvB,UAAA,CACG,UACD,oBAAC,wBAAD,CAAyB,CAAA,CACV;;AAErB;AAGA,MAAM,+BAAyC;CAC7C,MAAM,EAAE,cAAc,gBAAgB;CACtC,MAAM,CAAC,qBAAqB,YAAY,kBAAkB,UAAU,CAClE,MAAM,qBACN,MAAM,QACR,CAAC;CACD,MAAM,EAAE,qBAAqB,gBAAgB,aAAa;CAE1D,gBAAgB;EACd,MAAM,yBAAyB,WAAW;EAK1C,IAAI,EAFF,0BAA0B,2BAA2B,sBAGrD;EAGF,MAAM,iBAAiB,YAAY;GACjC,MAAM,YAAY,sBAAsB;GACxC,SAAS,uBAAuB,sBAAsB;EACxD;EAEA,eAAe;CACjB,GAAG;EAAC,WAAW;EAAS;EAAU;EAAqB;CAAW,CAAC;CAEnE,OAAO;AACT"}
@@ -10,8 +10,9 @@ const ThemeProvider$1 = ({ children }) => {
10
10
  useEffect(() => {
11
11
  if (colorSchemeMode) setMode(colorSchemeMode);
12
12
  }, [colorSchemeMode]);
13
+ const theme = useMemo(() => createTheme$1(themeConfig), [themeConfig]);
13
14
  return /* @__PURE__ */ jsx(ThemeProvider, {
14
- theme: useMemo(() => createTheme$1(themeConfig), [themeConfig]),
15
+ theme,
15
16
  defaultMode: colorSchemeMode ?? "system",
16
17
  modeStorageKey: "li.fi-widget-mode",
17
18
  colorSchemeStorageKey: "li.fi-widget-color-scheme",
@@ -1 +1 @@
1
- {"version":3,"file":"ThemeProvider.js","names":["ThemeProvider","MuiThemeProvider","createTheme"],"sources":["../../../../src/providers/ThemeProvider/ThemeProvider.tsx"],"sourcesContent":["import {\n ThemeProvider as MuiThemeProvider,\n useColorScheme,\n} from '@mui/material'\nimport { useEffect, useMemo } from 'react'\nimport { createTheme } from '../../themes/createTheme.js'\nimport { useWidgetConfig } from '../WidgetProvider/WidgetProvider.js'\n\nexport const ThemeProvider: React.FC<React.PropsWithChildren> = ({\n children,\n}) => {\n const { appearance: colorSchemeMode, theme: themeConfig } = useWidgetConfig()\n const { setMode } = useColorScheme()\n\n // biome-ignore lint/correctness/useExhaustiveDependencies: setMode is stable\n useEffect(() => {\n if (colorSchemeMode) {\n setMode(colorSchemeMode)\n }\n }, [colorSchemeMode])\n\n const theme = useMemo(() => createTheme(themeConfig), [themeConfig])\n\n return (\n <MuiThemeProvider\n theme={theme}\n defaultMode={colorSchemeMode ?? 'system'}\n modeStorageKey=\"li.fi-widget-mode\"\n colorSchemeStorageKey=\"li.fi-widget-color-scheme\"\n disableTransitionOnChange\n >\n {children}\n </MuiThemeProvider>\n )\n}\n"],"mappings":";;;;;;AAQA,MAAaA,mBAAoD,EAC/D,eACI;CACJ,MAAM,EAAE,YAAY,iBAAiB,OAAO,gBAAgB,gBAAgB;CAC5E,MAAM,EAAE,YAAY,eAAe;CAGnC,gBAAgB;EACd,IAAI,iBACF,QAAQ,eAAe;CAE3B,GAAG,CAAC,eAAe,CAAC;CAIpB,OACE,oBAACC,eAAD;EACE,OAJU,cAAcC,cAAY,WAAW,GAAG,CAAC,WAAW,CAInD;EACX,aAAa,mBAAmB;EAChC,gBAAe;EACf,uBAAsB;EACtB,2BAAA;EAEC;CACe,CAAA;AAEtB"}
1
+ {"version":3,"file":"ThemeProvider.js","names":["ThemeProvider","createTheme","MuiThemeProvider"],"sources":["../../../../src/providers/ThemeProvider/ThemeProvider.tsx"],"sourcesContent":["import {\n ThemeProvider as MuiThemeProvider,\n useColorScheme,\n} from '@mui/material'\nimport { useEffect, useMemo } from 'react'\nimport { createTheme } from '../../themes/createTheme.js'\nimport { useWidgetConfig } from '../WidgetProvider/WidgetProvider.js'\n\nexport const ThemeProvider: React.FC<React.PropsWithChildren> = ({\n children,\n}) => {\n const { appearance: colorSchemeMode, theme: themeConfig } = useWidgetConfig()\n const { setMode } = useColorScheme()\n\n // biome-ignore lint/correctness/useExhaustiveDependencies: setMode is stable\n useEffect(() => {\n if (colorSchemeMode) {\n setMode(colorSchemeMode)\n }\n }, [colorSchemeMode])\n\n const theme = useMemo(() => createTheme(themeConfig), [themeConfig])\n\n return (\n <MuiThemeProvider\n theme={theme}\n defaultMode={colorSchemeMode ?? 'system'}\n modeStorageKey=\"li.fi-widget-mode\"\n colorSchemeStorageKey=\"li.fi-widget-color-scheme\"\n disableTransitionOnChange\n >\n {children}\n </MuiThemeProvider>\n )\n}\n"],"mappings":";;;;;;AAQA,MAAaA,mBAAoD,EAC/D,eACI;CACJ,MAAM,EAAE,YAAY,iBAAiB,OAAO,gBAAgB,gBAAgB;CAC5E,MAAM,EAAE,YAAY,eAAe;CAGnC,gBAAgB;EACd,IAAI,iBACF,QAAQ,eAAe;CAE3B,GAAG,CAAC,eAAe,CAAC;CAEpB,MAAM,QAAQ,cAAcC,cAAY,WAAW,GAAG,CAAC,WAAW,CAAC;CAEnE,OACE,oBAACC,eAAD;EACS;EACP,aAAa,mBAAmB;EAChC,gBAAe;EACf,uBAAsB;EACtB,2BAAA;EAEC;CACe,CAAA;AAEtB"}
@@ -19,16 +19,17 @@ const WalletProvider = ({ children, providers }) => {
19
19
  }, [internalChainTypes, chainsConfig?.types]);
20
20
  if (!providers.length && !useExternalWalletProvidersOnly && process.env.NODE_ENV === "development") console.warn("No widget providers specified");
21
21
  const effectiveProviders = useExternalWalletProvidersOnly ? [] : providers;
22
+ const walletManagementConfig = useMemo(() => ({
23
+ locale: i18n.resolvedLanguage,
24
+ enabledChainTypes,
25
+ walletEcosystemsOrder: walletConfig?.walletEcosystemsOrder
26
+ }), [
27
+ i18n.resolvedLanguage,
28
+ enabledChainTypes,
29
+ walletConfig?.walletEcosystemsOrder
30
+ ]);
22
31
  return /* @__PURE__ */ jsx(WalletManagementProviders, {
23
- config: useMemo(() => ({
24
- locale: i18n.resolvedLanguage,
25
- enabledChainTypes,
26
- walletEcosystemsOrder: walletConfig?.walletEcosystemsOrder
27
- }), [
28
- i18n.resolvedLanguage,
29
- enabledChainTypes,
30
- walletConfig?.walletEcosystemsOrder
31
- ]),
32
+ config: walletManagementConfig,
32
33
  providers: effectiveProviders,
33
34
  chains,
34
35
  forceInternalWalletManagement: walletConfig?.forceInternalWalletManagement,
@@ -1 +1 @@
1
- {"version":3,"file":"WalletProvider.js","names":[],"sources":["../../../../src/providers/WalletProvider/WalletProvider.tsx"],"sourcesContent":["import { WalletManagementProviders } from '@lifi/wallet-management'\nimport type { WidgetProviderProps } from '@lifi/widget-provider'\nimport {\n type FC,\n type JSX,\n type PropsWithChildren,\n type ReactNode,\n useMemo,\n} from 'react'\nimport { useTranslation } from 'react-i18next'\nimport { useAvailableChains } from '../../hooks/useAvailableChains.js'\nimport { useInitializeSDKProviders } from '../../hooks/useInitializeSDKProviders.js'\nimport { getConfigItemSets, isItemAllowedForSets } from '../../utils/item.js'\nimport { useWidgetConfig } from '../WidgetProvider/WidgetProvider.js'\nimport { useExternalWalletProvider } from './useExternalWalletProvider.js'\n\ninterface WalletProviderProps extends PropsWithChildren {\n providers: ((props: PropsWithChildren<WidgetProviderProps>) => ReactNode)[]\n}\n\nexport const WalletProvider = ({\n children,\n providers,\n}: PropsWithChildren<WalletProviderProps>): JSX.Element => {\n const { walletConfig, chains: chainsConfig } = useWidgetConfig()\n const { chains } = useAvailableChains()\n const { i18n } = useTranslation()\n const { useExternalWalletProvidersOnly, internalChainTypes } =\n useExternalWalletProvider()\n\n // Restrict offered wallets to the ecosystems allowed by chains.types config.\n const enabledChainTypes = useMemo(() => {\n const chainTypeSets = getConfigItemSets(\n chainsConfig?.types,\n (items) => new Set(items)\n )\n return internalChainTypes.filter((chainType) =>\n isItemAllowedForSets(chainType, chainTypeSets)\n )\n }, [internalChainTypes, chainsConfig?.types])\n\n if (\n !providers.length &&\n !useExternalWalletProvidersOnly &&\n process.env.NODE_ENV === 'development'\n ) {\n console.warn('No widget providers specified')\n }\n\n const effectiveProviders = useExternalWalletProvidersOnly ? [] : providers\n\n const walletManagementConfig = useMemo(\n () => ({\n locale: i18n.resolvedLanguage as never,\n enabledChainTypes,\n walletEcosystemsOrder: walletConfig?.walletEcosystemsOrder,\n }),\n [\n i18n.resolvedLanguage,\n enabledChainTypes,\n walletConfig?.walletEcosystemsOrder,\n ]\n )\n\n return (\n <WalletManagementProviders\n config={walletManagementConfig}\n providers={effectiveProviders}\n chains={chains}\n forceInternalWalletManagement={\n walletConfig?.forceInternalWalletManagement\n }\n >\n <SDKProviderInitializer>{children}</SDKProviderInitializer>\n </WalletManagementProviders>\n )\n}\n\nconst SDKProviderInitializer: FC<PropsWithChildren> = ({ children }) => {\n useInitializeSDKProviders()\n return children\n}\n"],"mappings":";;;;;;;;;;AAoBA,MAAa,kBAAkB,EAC7B,UACA,gBACyD;CACzD,MAAM,EAAE,cAAc,QAAQ,iBAAiB,gBAAgB;CAC/D,MAAM,EAAE,WAAW,mBAAmB;CACtC,MAAM,EAAE,SAAS,eAAe;CAChC,MAAM,EAAE,gCAAgC,uBACtC,0BAA0B;CAG5B,MAAM,oBAAoB,cAAc;EACtC,MAAM,gBAAgB,kBACpB,cAAc,QACb,UAAU,IAAI,IAAI,KAAK,CAC1B;EACA,OAAO,mBAAmB,QAAQ,cAChC,qBAAqB,WAAW,aAAa,CAC/C;CACF,GAAG,CAAC,oBAAoB,cAAc,KAAK,CAAC;CAE5C,IACE,CAAC,UAAU,UACX,CAAC,kCACD,QAAQ,IAAI,aAAa,eAEzB,QAAQ,KAAK,+BAA+B;CAG9C,MAAM,qBAAqB,iCAAiC,CAAC,IAAI;CAejE,OACE,oBAAC,2BAAD;EACE,QAf2B,eACtB;GACL,QAAQ,KAAK;GACb;GACA,uBAAuB,cAAc;EACvC,IACA;GACE,KAAK;GACL;GACA,cAAc;EAChB,CAK+B;EAC7B,WAAW;EACH;EACR,+BACE,cAAc;EAGhB,UAAA,oBAAC,wBAAD,EAAyB,SAAiC,CAAA;CACjC,CAAA;AAE/B;AAEA,MAAM,0BAAiD,EAAE,eAAe;CACtE,0BAA0B;CAC1B,OAAO;AACT"}
1
+ {"version":3,"file":"WalletProvider.js","names":[],"sources":["../../../../src/providers/WalletProvider/WalletProvider.tsx"],"sourcesContent":["import { WalletManagementProviders } from '@lifi/wallet-management'\nimport type { WidgetProviderProps } from '@lifi/widget-provider'\nimport {\n type FC,\n type JSX,\n type PropsWithChildren,\n type ReactNode,\n useMemo,\n} from 'react'\nimport { useTranslation } from 'react-i18next'\nimport { useAvailableChains } from '../../hooks/useAvailableChains.js'\nimport { useInitializeSDKProviders } from '../../hooks/useInitializeSDKProviders.js'\nimport { getConfigItemSets, isItemAllowedForSets } from '../../utils/item.js'\nimport { useWidgetConfig } from '../WidgetProvider/WidgetProvider.js'\nimport { useExternalWalletProvider } from './useExternalWalletProvider.js'\n\ninterface WalletProviderProps extends PropsWithChildren {\n providers: ((props: PropsWithChildren<WidgetProviderProps>) => ReactNode)[]\n}\n\nexport const WalletProvider = ({\n children,\n providers,\n}: PropsWithChildren<WalletProviderProps>): JSX.Element => {\n const { walletConfig, chains: chainsConfig } = useWidgetConfig()\n const { chains } = useAvailableChains()\n const { i18n } = useTranslation()\n const { useExternalWalletProvidersOnly, internalChainTypes } =\n useExternalWalletProvider()\n\n // Restrict offered wallets to the ecosystems allowed by chains.types config.\n const enabledChainTypes = useMemo(() => {\n const chainTypeSets = getConfigItemSets(\n chainsConfig?.types,\n (items) => new Set(items)\n )\n return internalChainTypes.filter((chainType) =>\n isItemAllowedForSets(chainType, chainTypeSets)\n )\n }, [internalChainTypes, chainsConfig?.types])\n\n if (\n !providers.length &&\n !useExternalWalletProvidersOnly &&\n process.env.NODE_ENV === 'development'\n ) {\n console.warn('No widget providers specified')\n }\n\n const effectiveProviders = useExternalWalletProvidersOnly ? [] : providers\n\n const walletManagementConfig = useMemo(\n () => ({\n locale: i18n.resolvedLanguage as never,\n enabledChainTypes,\n walletEcosystemsOrder: walletConfig?.walletEcosystemsOrder,\n }),\n [\n i18n.resolvedLanguage,\n enabledChainTypes,\n walletConfig?.walletEcosystemsOrder,\n ]\n )\n\n return (\n <WalletManagementProviders\n config={walletManagementConfig}\n providers={effectiveProviders}\n chains={chains}\n forceInternalWalletManagement={\n walletConfig?.forceInternalWalletManagement\n }\n >\n <SDKProviderInitializer>{children}</SDKProviderInitializer>\n </WalletManagementProviders>\n )\n}\n\nconst SDKProviderInitializer: FC<PropsWithChildren> = ({ children }) => {\n useInitializeSDKProviders()\n return children\n}\n"],"mappings":";;;;;;;;;;AAoBA,MAAa,kBAAkB,EAC7B,UACA,gBACyD;CACzD,MAAM,EAAE,cAAc,QAAQ,iBAAiB,gBAAgB;CAC/D,MAAM,EAAE,WAAW,mBAAmB;CACtC,MAAM,EAAE,SAAS,eAAe;CAChC,MAAM,EAAE,gCAAgC,uBACtC,0BAA0B;CAG5B,MAAM,oBAAoB,cAAc;EACtC,MAAM,gBAAgB,kBACpB,cAAc,QACb,UAAU,IAAI,IAAI,KAAK,CAC1B;EACA,OAAO,mBAAmB,QAAQ,cAChC,qBAAqB,WAAW,aAAa,CAC/C;CACF,GAAG,CAAC,oBAAoB,cAAc,KAAK,CAAC;CAE5C,IACE,CAAC,UAAU,UACX,CAAC,kCACD,QAAQ,IAAI,aAAa,eAEzB,QAAQ,KAAK,+BAA+B;CAG9C,MAAM,qBAAqB,iCAAiC,CAAC,IAAI;CAEjE,MAAM,yBAAyB,eACtB;EACL,QAAQ,KAAK;EACb;EACA,uBAAuB,cAAc;CACvC,IACA;EACE,KAAK;EACL;EACA,cAAc;CAChB,CACF;CAEA,OACE,oBAAC,2BAAD;EACE,QAAQ;EACR,WAAW;EACH;EACR,+BACE,cAAc;EAGhB,UAAA,oBAAC,wBAAD,EAAyB,SAAiC,CAAA;CACjC,CAAA;AAE/B;AAEA,MAAM,0BAAiD,EAAE,eAAe;CACtE,0BAA0B;CAC1B,OAAO;AACT"}
@@ -1,14 +1,15 @@
1
1
  import { useWidgetConfig } from "../WidgetProvider/WidgetProvider.js";
2
2
  import { ChainType } from "@lifi/sdk";
3
3
  import { useMemo } from "react";
4
- import { useBitcoinContext, useEthereumContext, useSolanaContext, useSuiContext, useTronContext } from "@lifi/widget-provider";
4
+ import { useBitcoinContext, useEthereumContext, useSolanaContext, useStellarContext, useSuiContext, useTronContext } from "@lifi/widget-provider";
5
5
  //#region src/providers/WalletProvider/useExternalWalletProvider.ts
6
6
  const internalChainTypes = [
7
7
  ChainType.EVM,
8
8
  ChainType.SVM,
9
9
  ChainType.UTXO,
10
10
  ChainType.MVM,
11
- ChainType.TVM
11
+ ChainType.TVM,
12
+ ChainType.STL
12
13
  ];
13
14
  function useExternalWalletProvider() {
14
15
  const { walletConfig } = useWidgetConfig();
@@ -17,6 +18,7 @@ function useExternalWalletProvider() {
17
18
  const { isExternalContext: hasExternalBitcoinContext } = useBitcoinContext();
18
19
  const { isExternalContext: hasExternalSuiContext } = useSuiContext();
19
20
  const { isExternalContext: hasExternalTronContext } = useTronContext();
21
+ const { isExternalContext: hasExternalStellarContext } = useStellarContext();
20
22
  return useMemo(() => {
21
23
  const providers = [];
22
24
  if (hasExternalEthereumContext) providers.push(ChainType.EVM);
@@ -24,8 +26,9 @@ function useExternalWalletProvider() {
24
26
  if (hasExternalBitcoinContext) providers.push(ChainType.UTXO);
25
27
  if (hasExternalSuiContext) providers.push(ChainType.MVM);
26
28
  if (hasExternalTronContext) providers.push(ChainType.TVM);
29
+ if (hasExternalStellarContext) providers.push(ChainType.STL);
27
30
  return {
28
- useExternalWalletProvidersOnly: (hasExternalEthereumContext || hasExternalSolanaContext || hasExternalBitcoinContext || hasExternalSuiContext || hasExternalTronContext) && !walletConfig?.usePartialWalletManagement && !walletConfig?.forceInternalWalletManagement,
31
+ useExternalWalletProvidersOnly: (hasExternalEthereumContext || hasExternalSolanaContext || hasExternalBitcoinContext || hasExternalSuiContext || hasExternalTronContext || hasExternalStellarContext) && !walletConfig?.usePartialWalletManagement && !walletConfig?.forceInternalWalletManagement,
29
32
  externalChainTypes: providers,
30
33
  internalChainTypes: internalChainTypes.filter((chainType) => !providers.includes(chainType))
31
34
  };
@@ -35,6 +38,7 @@ function useExternalWalletProvider() {
35
38
  hasExternalBitcoinContext,
36
39
  hasExternalSuiContext,
37
40
  hasExternalTronContext,
41
+ hasExternalStellarContext,
38
42
  walletConfig?.usePartialWalletManagement,
39
43
  walletConfig?.forceInternalWalletManagement
40
44
  ]);
@@ -1 +1 @@
1
- {"version":3,"file":"useExternalWalletProvider.js","names":[],"sources":["../../../../src/providers/WalletProvider/useExternalWalletProvider.ts"],"sourcesContent":["import { ChainType } from '@lifi/sdk'\nimport {\n useBitcoinContext,\n useEthereumContext,\n useSolanaContext,\n useSuiContext,\n useTronContext,\n} from '@lifi/widget-provider'\nimport { useMemo } from 'react'\nimport { useWidgetConfig } from '../WidgetProvider/WidgetProvider.js'\n\ninterface ExternalWalletProvider {\n useExternalWalletProvidersOnly: boolean\n externalChainTypes: ChainType[]\n internalChainTypes: ChainType[]\n}\n\nconst internalChainTypes = [\n ChainType.EVM,\n ChainType.SVM,\n ChainType.UTXO,\n ChainType.MVM,\n ChainType.TVM,\n]\n\nexport function useExternalWalletProvider(): ExternalWalletProvider {\n const { walletConfig } = useWidgetConfig()\n const { isExternalContext: hasExternalEthereumContext } = useEthereumContext()\n const { isExternalContext: hasExternalSolanaContext } = useSolanaContext()\n const { isExternalContext: hasExternalBitcoinContext } = useBitcoinContext()\n const { isExternalContext: hasExternalSuiContext } = useSuiContext()\n const { isExternalContext: hasExternalTronContext } = useTronContext()\n const data = useMemo(() => {\n const providers: ChainType[] = []\n if (hasExternalEthereumContext) {\n providers.push(ChainType.EVM)\n }\n if (hasExternalSolanaContext) {\n providers.push(ChainType.SVM)\n }\n if (hasExternalBitcoinContext) {\n providers.push(ChainType.UTXO)\n }\n if (hasExternalSuiContext) {\n providers.push(ChainType.MVM)\n }\n if (hasExternalTronContext) {\n providers.push(ChainType.TVM)\n }\n const hasExternalProvider =\n hasExternalEthereumContext ||\n hasExternalSolanaContext ||\n hasExternalBitcoinContext ||\n hasExternalSuiContext ||\n hasExternalTronContext\n\n const useExternalWalletProvidersOnly =\n hasExternalProvider &&\n !walletConfig?.usePartialWalletManagement &&\n !walletConfig?.forceInternalWalletManagement\n return {\n useExternalWalletProvidersOnly,\n externalChainTypes: providers,\n internalChainTypes: internalChainTypes.filter(\n (chainType) => !providers.includes(chainType)\n ),\n }\n }, [\n hasExternalEthereumContext,\n hasExternalSolanaContext,\n hasExternalBitcoinContext,\n hasExternalSuiContext,\n hasExternalTronContext,\n walletConfig?.usePartialWalletManagement,\n walletConfig?.forceInternalWalletManagement,\n ])\n\n return data\n}\n"],"mappings":";;;;;AAiBA,MAAM,qBAAqB;CACzB,UAAU;CACV,UAAU;CACV,UAAU;CACV,UAAU;CACV,UAAU;AACZ;AAEA,SAAgB,4BAAoD;CAClE,MAAM,EAAE,iBAAiB,gBAAgB;CACzC,MAAM,EAAE,mBAAmB,+BAA+B,mBAAmB;CAC7E,MAAM,EAAE,mBAAmB,6BAA6B,iBAAiB;CACzE,MAAM,EAAE,mBAAmB,8BAA8B,kBAAkB;CAC3E,MAAM,EAAE,mBAAmB,0BAA0B,cAAc;CACnE,MAAM,EAAE,mBAAmB,2BAA2B,eAAe;CA8CrE,OA7Ca,cAAc;EACzB,MAAM,YAAyB,CAAC;EAChC,IAAI,4BACF,UAAU,KAAK,UAAU,GAAG;EAE9B,IAAI,0BACF,UAAU,KAAK,UAAU,GAAG;EAE9B,IAAI,2BACF,UAAU,KAAK,UAAU,IAAI;EAE/B,IAAI,uBACF,UAAU,KAAK,UAAU,GAAG;EAE9B,IAAI,wBACF,UAAU,KAAK,UAAU,GAAG;EAa9B,OAAO;GACL,iCAXA,8BACA,4BACA,6BACA,yBACA,2BAIA,CAAC,cAAc,8BACf,CAAC,cAAc;GAGf,oBAAoB;GACpB,oBAAoB,mBAAmB,QACpC,cAAc,CAAC,UAAU,SAAS,SAAS,CAC9C;EACF;CACF,GAAG;EACD;EACA;EACA;EACA;EACA;EACA,cAAc;EACd,cAAc;CAChB,CAEU;AACZ"}
1
+ {"version":3,"file":"useExternalWalletProvider.js","names":[],"sources":["../../../../src/providers/WalletProvider/useExternalWalletProvider.ts"],"sourcesContent":["import { ChainType } from '@lifi/sdk'\nimport {\n useBitcoinContext,\n useEthereumContext,\n useSolanaContext,\n useStellarContext,\n useSuiContext,\n useTronContext,\n} from '@lifi/widget-provider'\nimport { useMemo } from 'react'\nimport { useWidgetConfig } from '../WidgetProvider/WidgetProvider.js'\n\ninterface ExternalWalletProvider {\n useExternalWalletProvidersOnly: boolean\n externalChainTypes: ChainType[]\n internalChainTypes: ChainType[]\n}\n\nconst internalChainTypes = [\n ChainType.EVM,\n ChainType.SVM,\n ChainType.UTXO,\n ChainType.MVM,\n ChainType.TVM,\n ChainType.STL,\n]\n\nexport function useExternalWalletProvider(): ExternalWalletProvider {\n const { walletConfig } = useWidgetConfig()\n const { isExternalContext: hasExternalEthereumContext } = useEthereumContext()\n const { isExternalContext: hasExternalSolanaContext } = useSolanaContext()\n const { isExternalContext: hasExternalBitcoinContext } = useBitcoinContext()\n const { isExternalContext: hasExternalSuiContext } = useSuiContext()\n const { isExternalContext: hasExternalTronContext } = useTronContext()\n const { isExternalContext: hasExternalStellarContext } = useStellarContext()\n const data = useMemo(() => {\n const providers: ChainType[] = []\n if (hasExternalEthereumContext) {\n providers.push(ChainType.EVM)\n }\n if (hasExternalSolanaContext) {\n providers.push(ChainType.SVM)\n }\n if (hasExternalBitcoinContext) {\n providers.push(ChainType.UTXO)\n }\n if (hasExternalSuiContext) {\n providers.push(ChainType.MVM)\n }\n if (hasExternalTronContext) {\n providers.push(ChainType.TVM)\n }\n if (hasExternalStellarContext) {\n providers.push(ChainType.STL)\n }\n const hasExternalProvider =\n hasExternalEthereumContext ||\n hasExternalSolanaContext ||\n hasExternalBitcoinContext ||\n hasExternalSuiContext ||\n hasExternalTronContext ||\n hasExternalStellarContext\n\n const useExternalWalletProvidersOnly =\n hasExternalProvider &&\n !walletConfig?.usePartialWalletManagement &&\n !walletConfig?.forceInternalWalletManagement\n return {\n useExternalWalletProvidersOnly,\n externalChainTypes: providers,\n internalChainTypes: internalChainTypes.filter(\n (chainType) => !providers.includes(chainType)\n ),\n }\n }, [\n hasExternalEthereumContext,\n hasExternalSolanaContext,\n hasExternalBitcoinContext,\n hasExternalSuiContext,\n hasExternalTronContext,\n hasExternalStellarContext,\n walletConfig?.usePartialWalletManagement,\n walletConfig?.forceInternalWalletManagement,\n ])\n\n return data\n}\n"],"mappings":";;;;;AAkBA,MAAM,qBAAqB;CACzB,UAAU;CACV,UAAU;CACV,UAAU;CACV,UAAU;CACV,UAAU;CACV,UAAU;AACZ;AAEA,SAAgB,4BAAoD;CAClE,MAAM,EAAE,iBAAiB,gBAAgB;CACzC,MAAM,EAAE,mBAAmB,+BAA+B,mBAAmB;CAC7E,MAAM,EAAE,mBAAmB,6BAA6B,iBAAiB;CACzE,MAAM,EAAE,mBAAmB,8BAA8B,kBAAkB;CAC3E,MAAM,EAAE,mBAAmB,0BAA0B,cAAc;CACnE,MAAM,EAAE,mBAAmB,2BAA2B,eAAe;CACrE,MAAM,EAAE,mBAAmB,8BAA8B,kBAAkB;CAmD3E,OAlDa,cAAc;EACzB,MAAM,YAAyB,CAAC;EAChC,IAAI,4BACF,UAAU,KAAK,UAAU,GAAG;EAE9B,IAAI,0BACF,UAAU,KAAK,UAAU,GAAG;EAE9B,IAAI,2BACF,UAAU,KAAK,UAAU,IAAI;EAE/B,IAAI,uBACF,UAAU,KAAK,UAAU,GAAG;EAE9B,IAAI,wBACF,UAAU,KAAK,UAAU,GAAG;EAE9B,IAAI,2BACF,UAAU,KAAK,UAAU,GAAG;EAc9B,OAAO;GACL,iCAZA,8BACA,4BACA,6BACA,yBACA,0BACA,8BAIA,CAAC,cAAc,8BACf,CAAC,cAAc;GAGf,oBAAoB;GACpB,oBAAoB,mBAAmB,QACpC,cAAc,CAAC,UAAU,SAAS,SAAS,CAC9C;EACF;CACF,GAAG;EACD;EACA;EACA;EACA;EACA;EACA;EACA,cAAc;EACd,cAAc;CAChB,CAEU;AACZ"}
@@ -5,18 +5,19 @@ import { useAccount } from "@lifi/wallet-management";
5
5
  //#region src/stores/routes/useRouteExecutionIndicator.ts
6
6
  const isRecentTransaction = (route) => {
7
7
  const startedAt = route.route.steps[0]?.execution?.startedAt ?? 0;
8
- return startedAt > 0 && Date.now() - startedAt < 1e3 * 60 * 60 * 24;
8
+ return startedAt > 0 && Date.now() - startedAt < 864e5;
9
9
  };
10
10
  const useRouteExecutionIndicator = () => {
11
11
  const { accounts } = useAccount();
12
12
  const accountAddresses = useMemo(() => accounts.map((account) => account.address), [accounts]);
13
- return useRouteExecutionStore(useCallback((state) => {
13
+ const selector = useCallback((state) => {
14
14
  const recentOwnedRoutes = Object.values(state.routes).filter((route) => accountAddresses.includes(route.route.fromAddress) && isRecentTransaction(route));
15
15
  return {
16
16
  failed: recentOwnedRoutes.some((r) => r.status === 8),
17
17
  active: recentOwnedRoutes.some((r) => r.status === 2)
18
18
  };
19
- }, [accountAddresses]));
19
+ }, [accountAddresses]);
20
+ return useRouteExecutionStore(selector);
20
21
  };
21
22
  //#endregion
22
23
  export { useRouteExecutionIndicator };
@@ -1 +1 @@
1
- {"version":3,"file":"useRouteExecutionIndicator.js","names":[],"sources":["../../../../src/stores/routes/useRouteExecutionIndicator.ts"],"sourcesContent":["import { useAccount } from '@lifi/wallet-management'\nimport { useCallback, useMemo } from 'react'\nimport { useRouteExecutionStore } from './RouteExecutionStore.js'\nimport type { RouteExecution, RouteExecutionState } from './types.js'\nimport { RouteExecutionStatus } from './types.js'\n\nexport type RouteExecutionIndicator = {\n failed: boolean\n active: boolean\n}\n\nconst isRecentTransaction = (route: RouteExecution): boolean => {\n const startedAt = route.route.steps[0]?.execution?.startedAt ?? 0\n return startedAt > 0 && Date.now() - startedAt < 1000 * 60 * 60 * 24 // 1 day\n}\n\nexport const useRouteExecutionIndicator = (): RouteExecutionIndicator => {\n const { accounts } = useAccount()\n const accountAddresses = useMemo(\n () => accounts.map((account) => account.address),\n [accounts]\n )\n const selector = useCallback(\n (state: RouteExecutionState): RouteExecutionIndicator => {\n const routes = Object.values(state.routes) as RouteExecution[]\n const recentOwnedRoutes = routes.filter(\n (route) =>\n accountAddresses.includes(route.route.fromAddress) &&\n isRecentTransaction(route)\n )\n return {\n failed: recentOwnedRoutes.some(\n (r) => r.status === RouteExecutionStatus.Failed\n ),\n active: recentOwnedRoutes.some(\n (r) => r.status === RouteExecutionStatus.Pending\n ),\n }\n },\n [accountAddresses]\n )\n return useRouteExecutionStore(selector)\n}\n"],"mappings":";;;;;AAWA,MAAM,uBAAuB,UAAmC;CAC9D,MAAM,YAAY,MAAM,MAAM,MAAM,EAAE,EAAE,WAAW,aAAa;CAChE,OAAO,YAAY,KAAK,KAAK,IAAI,IAAI,YAAY,MAAO,KAAK,KAAK;AACpE;AAEA,MAAa,mCAA4D;CACvE,MAAM,EAAE,aAAa,WAAW;CAChC,MAAM,mBAAmB,cACjB,SAAS,KAAK,YAAY,QAAQ,OAAO,GAC/C,CAAC,QAAQ,CACX;CAoBA,OAAO,uBAnBU,aACd,UAAwD;EAEvD,MAAM,oBADS,OAAO,OAAO,MAAM,MACJ,CAAC,CAAC,QAC9B,UACC,iBAAiB,SAAS,MAAM,MAAM,WAAW,KACjD,oBAAoB,KAAK,CAC7B;EACA,OAAO;GACL,QAAQ,kBAAkB,MACvB,MAAM,EAAE,WAAA,CACX;GACA,QAAQ,kBAAkB,MACvB,MAAM,EAAE,WAAA,CACX;EACF;CACF,GACA,CAAC,gBAAgB,CAEkB,CAAC;AACxC"}
1
+ {"version":3,"file":"useRouteExecutionIndicator.js","names":[],"sources":["../../../../src/stores/routes/useRouteExecutionIndicator.ts"],"sourcesContent":["import { useAccount } from '@lifi/wallet-management'\nimport { useCallback, useMemo } from 'react'\nimport { useRouteExecutionStore } from './RouteExecutionStore.js'\nimport type { RouteExecution, RouteExecutionState } from './types.js'\nimport { RouteExecutionStatus } from './types.js'\n\nexport type RouteExecutionIndicator = {\n failed: boolean\n active: boolean\n}\n\nconst isRecentTransaction = (route: RouteExecution): boolean => {\n const startedAt = route.route.steps[0]?.execution?.startedAt ?? 0\n return startedAt > 0 && Date.now() - startedAt < 1000 * 60 * 60 * 24 // 1 day\n}\n\nexport const useRouteExecutionIndicator = (): RouteExecutionIndicator => {\n const { accounts } = useAccount()\n const accountAddresses = useMemo(\n () => accounts.map((account) => account.address),\n [accounts]\n )\n const selector = useCallback(\n (state: RouteExecutionState): RouteExecutionIndicator => {\n const routes = Object.values(state.routes) as RouteExecution[]\n const recentOwnedRoutes = routes.filter(\n (route) =>\n accountAddresses.includes(route.route.fromAddress) &&\n isRecentTransaction(route)\n )\n return {\n failed: recentOwnedRoutes.some(\n (r) => r.status === RouteExecutionStatus.Failed\n ),\n active: recentOwnedRoutes.some(\n (r) => r.status === RouteExecutionStatus.Pending\n ),\n }\n },\n [accountAddresses]\n )\n return useRouteExecutionStore(selector)\n}\n"],"mappings":";;;;;AAWA,MAAM,uBAAuB,UAAmC;CAC9D,MAAM,YAAY,MAAM,MAAM,MAAM,EAAE,EAAE,WAAW,aAAa;CAChE,OAAO,YAAY,KAAK,KAAK,IAAI,IAAI,YAAY;AACnD;AAEA,MAAa,mCAA4D;CACvE,MAAM,EAAE,aAAa,WAAW;CAChC,MAAM,mBAAmB,cACjB,SAAS,KAAK,YAAY,QAAQ,OAAO,GAC/C,CAAC,QAAQ,CACX;CACA,MAAM,WAAW,aACd,UAAwD;EAEvD,MAAM,oBADS,OAAO,OAAO,MAAM,MACJ,CAAC,CAAC,QAC9B,UACC,iBAAiB,SAAS,MAAM,MAAM,WAAW,KACjD,oBAAoB,KAAK,CAC7B;EACA,OAAO;GACL,QAAQ,kBAAkB,MACvB,MAAM,EAAE,WAAA,CACX;GACA,QAAQ,kBAAkB,MACvB,MAAM,EAAE,WAAA,CACX;EACF;CACF,GACA,CAAC,gBAAgB,CACnB;CACA,OAAO,uBAAuB,QAAQ;AACxC"}
@@ -5,8 +5,11 @@ interface TokenFlags {
5
5
  popular?: boolean;
6
6
  pinned?: boolean;
7
7
  verified?: boolean;
8
+ native?: boolean;
9
+ /** Came from the main token list rather than from a search. */
10
+ listed?: boolean;
8
11
  }
9
12
  interface TokenAmount$1 extends TokenAmount, TokenFlags {}
10
13
  //#endregion
11
- export { TokenAmount$1 as TokenAmount };
14
+ export { TokenAmount$1 as TokenAmount, TokenFlags };
12
15
  //# sourceMappingURL=token.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"token.d.ts","names":[],"sources":["../../../src/types/token.ts"],"mappings":";;UAMU;EACR;EACA;EACA;EACA;;UAGe,sBAAoB,aAAgB"}
1
+ {"version":3,"file":"token.d.ts","names":[],"sources":["../../../src/types/token.ts"],"mappings":";;UAMiB;EACf;EACA;EACA;EACA;EACA;;EAEA;;UAGe,sBAAoB,aAAgB"}
@@ -45,9 +45,7 @@ const compactNumberFormatter = (lng, options) => {
45
45
  case "decimal":
46
46
  decimalSeparator = p.value;
47
47
  break;
48
- case "minusSign":
49
- minusSign = p.value;
50
- break;
48
+ case "minusSign": minusSign = p.value;
51
49
  }
52
50
  if (!fractionPart) return `${minusSign}${integerPart}`;
53
51
  const match = fractionPart.match(/^0+/);
@@ -1 +1 @@
1
- {"version":3,"file":"compactNumberFormatter.js","names":[],"sources":["../../../src/utils/compactNumberFormatter.ts"],"sourcesContent":["/**\n * Converts a non-negative integer to its subscript representation using Unicode subscript characters.\n * @param n - The number to convert to subscript\n * @returns A string where each digit is converted to its subscript equivalent\n * @example\n * toSubscript(5) => '₅'\n * toSubscript(10) => '₁₀'\n */\nfunction toSubscript(n: number): string {\n return n\n .toString()\n .split('')\n .map((digit) => String.fromCharCode(8320 + Number(digit)))\n .join('')\n}\n\n/**\n * Formats numbers with special handling for small decimal values, converting runs of leading zeros\n * into a more compact subscript notation.\n *\n * @param value - The numeric value to format (expected to be a string representing a BigInt)\n * @param lng - The locale string for number formatting\n * @param options - Formatting options including decimals and Intl.NumberFormat options\n * @returns A formatted string with subscript notation for leading zeros\n */\nexport const compactNumberFormatter = (\n lng: string | undefined,\n options: any\n): ((value: any) => string) => {\n const formatter = new Intl.NumberFormat(lng, {\n notation: 'standard',\n roundingPriority: 'morePrecision',\n maximumSignificantDigits: 20,\n maximumFractionDigits: 20,\n ...options,\n })\n return (value: any) => {\n if (!Number.parseFloat(value) || Number.isNaN(Number(value))) {\n return '0'\n }\n\n const parts = formatter.formatToParts(value as Intl.StringNumericLiteral)\n let integerPart = ''\n let fractionPart = ''\n let decimalSeparator = ''\n let minusSign = ''\n\n for (const p of parts) {\n switch (p.type) {\n case 'integer':\n case 'group':\n integerPart += p.value\n break\n case 'fraction':\n fractionPart += p.value\n break\n case 'decimal':\n decimalSeparator = p.value\n break\n case 'minusSign':\n minusSign = p.value\n break\n }\n }\n\n // For numbers with no decimal part, return early\n if (!fractionPart) {\n return `${minusSign}${integerPart}`\n }\n\n // Count consecutive leading zeros in the fraction part\n const match = fractionPart.match(/^0+/)\n const leadingZerosCount = match ? match[0].length : 0\n\n // For numbers with few leading zeros (≤ 3), format normally\n // but limit the total length and trim trailing zeros\n if (leadingZerosCount <= 3) {\n fractionPart = fractionPart.slice(0, 6).replace(/0+$/, '')\n return `${minusSign}${integerPart}${decimalSeparator}${fractionPart}`\n }\n\n // For numbers with many leading zeros (> 3), use subscript notation\n // Format: \"0.0₍number_of_zeros₎significant_digits\"\n const zerosSubscript = toSubscript(leadingZerosCount)\n const remainder = fractionPart\n .slice(leadingZerosCount, leadingZerosCount + 4)\n .replace(/0+$/, '')\n\n return `${minusSign}${integerPart}${decimalSeparator}0${zerosSubscript}${remainder}`\n }\n}\n"],"mappings":";;;;;;;;;AAQA,SAAS,YAAY,GAAmB;CACtC,OAAO,EACJ,SAAS,CAAC,CACV,MAAM,EAAE,CAAC,CACT,KAAK,UAAU,OAAO,aAAa,OAAO,OAAO,KAAK,CAAC,CAAC,CAAC,CACzD,KAAK,EAAE;AACZ;;;;;;;;;;AAWA,MAAa,0BACX,KACA,YAC6B;CAC7B,MAAM,YAAY,IAAI,KAAK,aAAa,KAAK;EAC3C,UAAU;EACV,kBAAkB;EAClB,0BAA0B;EAC1B,uBAAuB;EACvB,GAAG;CACL,CAAC;CACD,QAAQ,UAAe;EACrB,IAAI,CAAC,OAAO,WAAW,KAAK,KAAK,OAAO,MAAM,OAAO,KAAK,CAAC,GACzD,OAAO;EAGT,MAAM,QAAQ,UAAU,cAAc,KAAkC;EACxE,IAAI,cAAc;EAClB,IAAI,eAAe;EACnB,IAAI,mBAAmB;EACvB,IAAI,YAAY;EAEhB,KAAK,MAAM,KAAK,OACd,QAAQ,EAAE,MAAV;GACE,KAAK;GACL,KAAK;IACH,eAAe,EAAE;IACjB;GACF,KAAK;IACH,gBAAgB,EAAE;IAClB;GACF,KAAK;IACH,mBAAmB,EAAE;IACrB;GACF,KAAK;IACH,YAAY,EAAE;IACd;EACJ;EAIF,IAAI,CAAC,cACH,OAAO,GAAG,YAAY;EAIxB,MAAM,QAAQ,aAAa,MAAM,KAAK;EACtC,MAAM,oBAAoB,QAAQ,MAAM,EAAE,CAAC,SAAS;EAIpD,IAAI,qBAAqB,GAAG;GAC1B,eAAe,aAAa,MAAM,GAAG,CAAC,CAAC,CAAC,QAAQ,OAAO,EAAE;GACzD,OAAO,GAAG,YAAY,cAAc,mBAAmB;EACzD;EAIA,MAAM,iBAAiB,YAAY,iBAAiB;EACpD,MAAM,YAAY,aACf,MAAM,mBAAmB,oBAAoB,CAAC,CAAC,CAC/C,QAAQ,OAAO,EAAE;EAEpB,OAAO,GAAG,YAAY,cAAc,iBAAiB,GAAG,iBAAiB;CAC3E;AACF"}
1
+ {"version":3,"file":"compactNumberFormatter.js","names":[],"sources":["../../../src/utils/compactNumberFormatter.ts"],"sourcesContent":["/**\n * Converts a non-negative integer to its subscript representation using Unicode subscript characters.\n * @param n - The number to convert to subscript\n * @returns A string where each digit is converted to its subscript equivalent\n * @example\n * toSubscript(5) => '₅'\n * toSubscript(10) => '₁₀'\n */\nfunction toSubscript(n: number): string {\n return n\n .toString()\n .split('')\n .map((digit) => String.fromCharCode(8320 + Number(digit)))\n .join('')\n}\n\n/**\n * Formats numbers with special handling for small decimal values, converting runs of leading zeros\n * into a more compact subscript notation.\n *\n * @param value - The numeric value to format (expected to be a string representing a BigInt)\n * @param lng - The locale string for number formatting\n * @param options - Formatting options including decimals and Intl.NumberFormat options\n * @returns A formatted string with subscript notation for leading zeros\n */\nexport const compactNumberFormatter = (\n lng: string | undefined,\n options: any\n): ((value: any) => string) => {\n const formatter = new Intl.NumberFormat(lng, {\n notation: 'standard',\n roundingPriority: 'morePrecision',\n maximumSignificantDigits: 20,\n maximumFractionDigits: 20,\n ...options,\n })\n return (value: any) => {\n if (!Number.parseFloat(value) || Number.isNaN(Number(value))) {\n return '0'\n }\n\n const parts = formatter.formatToParts(value as Intl.StringNumericLiteral)\n let integerPart = ''\n let fractionPart = ''\n let decimalSeparator = ''\n let minusSign = ''\n\n for (const p of parts) {\n switch (p.type) {\n case 'integer':\n case 'group':\n integerPart += p.value\n break\n case 'fraction':\n fractionPart += p.value\n break\n case 'decimal':\n decimalSeparator = p.value\n break\n case 'minusSign':\n minusSign = p.value\n break\n }\n }\n\n // For numbers with no decimal part, return early\n if (!fractionPart) {\n return `${minusSign}${integerPart}`\n }\n\n // Count consecutive leading zeros in the fraction part\n const match = fractionPart.match(/^0+/)\n const leadingZerosCount = match ? match[0].length : 0\n\n // For numbers with few leading zeros (≤ 3), format normally\n // but limit the total length and trim trailing zeros\n if (leadingZerosCount <= 3) {\n fractionPart = fractionPart.slice(0, 6).replace(/0+$/, '')\n return `${minusSign}${integerPart}${decimalSeparator}${fractionPart}`\n }\n\n // For numbers with many leading zeros (> 3), use subscript notation\n // Format: \"0.0₍number_of_zeros₎significant_digits\"\n const zerosSubscript = toSubscript(leadingZerosCount)\n const remainder = fractionPart\n .slice(leadingZerosCount, leadingZerosCount + 4)\n .replace(/0+$/, '')\n\n return `${minusSign}${integerPart}${decimalSeparator}0${zerosSubscript}${remainder}`\n }\n}\n"],"mappings":";;;;;;;;;AAQA,SAAS,YAAY,GAAmB;CACtC,OAAO,EACJ,SAAS,CAAC,CACV,MAAM,EAAE,CAAC,CACT,KAAK,UAAU,OAAO,aAAa,OAAO,OAAO,KAAK,CAAC,CAAC,CAAC,CACzD,KAAK,EAAE;AACZ;;;;;;;;;;AAWA,MAAa,0BACX,KACA,YAC6B;CAC7B,MAAM,YAAY,IAAI,KAAK,aAAa,KAAK;EAC3C,UAAU;EACV,kBAAkB;EAClB,0BAA0B;EAC1B,uBAAuB;EACvB,GAAG;CACL,CAAC;CACD,QAAQ,UAAe;EACrB,IAAI,CAAC,OAAO,WAAW,KAAK,KAAK,OAAO,MAAM,OAAO,KAAK,CAAC,GACzD,OAAO;EAGT,MAAM,QAAQ,UAAU,cAAc,KAAkC;EACxE,IAAI,cAAc;EAClB,IAAI,eAAe;EACnB,IAAI,mBAAmB;EACvB,IAAI,YAAY;EAEhB,KAAK,MAAM,KAAK,OACd,QAAQ,EAAE,MAAV;GACE,KAAK;GACL,KAAK;IACH,eAAe,EAAE;IACjB;GACF,KAAK;IACH,gBAAgB,EAAE;IAClB;GACF,KAAK;IACH,mBAAmB,EAAE;IACrB;GACF,KAAK,aACH,YAAY,EAAE;EAElB;EAIF,IAAI,CAAC,cACH,OAAO,GAAG,YAAY;EAIxB,MAAM,QAAQ,aAAa,MAAM,KAAK;EACtC,MAAM,oBAAoB,QAAQ,MAAM,EAAE,CAAC,SAAS;EAIpD,IAAI,qBAAqB,GAAG;GAC1B,eAAe,aAAa,MAAM,GAAG,CAAC,CAAC,CAAC,QAAQ,OAAO,EAAE;GACzD,OAAO,GAAG,YAAY,cAAc,mBAAmB;EACzD;EAIA,MAAM,iBAAiB,YAAY,iBAAiB;EACpD,MAAM,YAAY,aACf,MAAM,mBAAmB,oBAAoB,CAAC,CAAC,CAC/C,QAAQ,OAAO,EAAE;EAEpB,OAAO,GAAG,YAAY,cAAc,iBAAiB,GAAG,iBAAiB;CAC3E;AACF"}
@@ -0,0 +1,7 @@
1
+ import { ChainType } from "@lifi/sdk";
2
+ //#region src/utils/customReceiver.ts
3
+ const isCustomReceiverUnsupported = (fromChainType, toChainType) => fromChainType === ChainType.STL && toChainType === ChainType.STL;
4
+ //#endregion
5
+ export { isCustomReceiverUnsupported };
6
+
7
+ //# sourceMappingURL=customReceiver.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"customReceiver.js","names":[],"sources":["../../../src/utils/customReceiver.ts"],"sourcesContent":["import { ChainType } from '@lifi/sdk'\n\n// Stellar routes always settle to the account that signs them.\nexport const isCustomReceiverUnsupported = (\n fromChainType?: ChainType,\n toChainType?: ChainType\n): boolean => fromChainType === ChainType.STL && toChainType === ChainType.STL\n"],"mappings":";;AAGA,MAAa,+BACX,eACA,gBACY,kBAAkB,UAAU,OAAO,gBAAgB,UAAU"}
@@ -0,0 +1,24 @@
1
+ import { ChainType } from "@lifi/sdk";
2
+ //#region src/utils/gas.ts
3
+ /**
4
+ * Returns how much of a step's gas token the route itself delivers before that
5
+ * step runs. The previous step must output the gas token on the same chain, and
6
+ * whatever this step consumes as input is not available for gas.
7
+ * Stellar routes only — they bridge XLM to the receiver and hold back a buffer
8
+ * for the account reserve and the destination step fees.
9
+ */
10
+ const getSelfFundedGasAmount = (route, step, gasChainType) => {
11
+ if (gasChainType !== ChainType.STL) return 0n;
12
+ const gasToken = step.estimate.gasCosts?.[0]?.token;
13
+ const previousStep = route.steps[route.steps.indexOf(step) - 1];
14
+ if (!gasToken || !previousStep) return 0n;
15
+ const { toToken } = previousStep.action;
16
+ if (toToken.chainId !== gasToken.chainId || toToken.address.toLowerCase() !== gasToken.address.toLowerCase()) return 0n;
17
+ const deliveredAmount = BigInt(previousStep.estimate.toAmountMin);
18
+ const consumedAmount = step.action.fromToken.address.toLowerCase() === gasToken.address.toLowerCase() ? BigInt(step.action.fromAmount) : 0n;
19
+ return deliveredAmount > consumedAmount ? deliveredAmount - consumedAmount : 0n;
20
+ };
21
+ //#endregion
22
+ export { getSelfFundedGasAmount };
23
+
24
+ //# sourceMappingURL=gas.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"gas.js","names":[],"sources":["../../../src/utils/gas.ts"],"sourcesContent":["import type { LiFiStepExtended, RouteExtended } from '@lifi/sdk'\nimport { ChainType } from '@lifi/sdk'\n\n/**\n * Returns how much of a step's gas token the route itself delivers before that\n * step runs. The previous step must output the gas token on the same chain, and\n * whatever this step consumes as input is not available for gas.\n * Stellar routes only — they bridge XLM to the receiver and hold back a buffer\n * for the account reserve and the destination step fees.\n */\nexport const getSelfFundedGasAmount = (\n route: RouteExtended,\n step: LiFiStepExtended,\n gasChainType?: ChainType\n): bigint => {\n // TODO: remove the chain gate when the backend reserves gas on every chain\n if (gasChainType !== ChainType.STL) {\n return 0n\n }\n const gasToken = step.estimate.gasCosts?.[0]?.token\n const previousStep = route.steps[route.steps.indexOf(step) - 1]\n if (!gasToken || !previousStep) {\n return 0n\n }\n const { toToken } = previousStep.action\n if (\n toToken.chainId !== gasToken.chainId ||\n toToken.address.toLowerCase() !== gasToken.address.toLowerCase()\n ) {\n return 0n\n }\n const deliveredAmount = BigInt(previousStep.estimate.toAmountMin)\n const consumedAmount =\n step.action.fromToken.address.toLowerCase() ===\n gasToken.address.toLowerCase()\n ? BigInt(step.action.fromAmount)\n : 0n\n return deliveredAmount > consumedAmount\n ? deliveredAmount - consumedAmount\n : 0n\n}\n"],"mappings":";;;;;;;;;AAUA,MAAa,0BACX,OACA,MACA,iBACW;CAEX,IAAI,iBAAiB,UAAU,KAC7B,OAAO;CAET,MAAM,WAAW,KAAK,SAAS,WAAW,EAAE,EAAE;CAC9C,MAAM,eAAe,MAAM,MAAM,MAAM,MAAM,QAAQ,IAAI,IAAI;CAC7D,IAAI,CAAC,YAAY,CAAC,cAChB,OAAO;CAET,MAAM,EAAE,YAAY,aAAa;CACjC,IACE,QAAQ,YAAY,SAAS,WAC7B,QAAQ,QAAQ,YAAY,MAAM,SAAS,QAAQ,YAAY,GAE/D,OAAO;CAET,MAAM,kBAAkB,OAAO,aAAa,SAAS,WAAW;CAChE,MAAM,iBACJ,KAAK,OAAO,UAAU,QAAQ,YAAY,MAC1C,SAAS,QAAQ,YAAY,IACzB,OAAO,KAAK,OAAO,UAAU,IAC7B;CACN,OAAO,kBAAkB,iBACrB,kBAAkB,iBAClB;AACN"}
@@ -103,7 +103,6 @@ function getErrorMessage(t, getChainById, step, failedAction) {
103
103
  title = t("error.title.unknown");
104
104
  if (failedAction?.txHash) message = t("error.message.transactionFailed");
105
105
  else message = error.message || t("error.message.unknown");
106
- break;
107
106
  }
108
107
  message = wrapLongWords(message);
109
108
  return {
@@ -1 +1 @@
1
- {"version":3,"file":"getErrorMessage.js","names":[],"sources":["../../../src/utils/getErrorMessage.ts"],"sourcesContent":["import {\n type EVMChain,\n type ExecutionAction,\n LiFiErrorCode,\n type LiFiStepExtended,\n} from '@lifi/sdk'\nimport type { TFunction } from 'i18next'\nimport { formatTokenAmount, wrapLongWords } from '../utils/format.js'\n\nexport function getErrorMessage(\n t: TFunction,\n getChainById: (chainId: number) => EVMChain | undefined,\n step: LiFiStepExtended,\n failedAction?: ExecutionAction\n): { title: string; message: string } {\n const error = failedAction?.error\n if (!error) {\n return {\n title: t('error.title.unknown'),\n message: t('error.message.unknown'),\n }\n }\n\n const getDefaultErrorMessage = (key?: string) =>\n `${t((key as any) ?? 'error.message.transactionNotSent')} ${t(\n 'error.message.remainInYourWallet',\n {\n amount: formatTokenAmount(\n BigInt(step.action.fromAmount),\n step.action.fromToken.decimals\n ),\n tokenSymbol: step.action.fromToken.symbol,\n chainName: getChainById(step.action.fromChainId)?.name ?? '',\n }\n )}`\n\n let title = ''\n let message = ''\n switch (error.code) {\n case LiFiErrorCode.AllowanceRequired:\n title = t('error.title.allowanceRequired')\n message = t('error.message.allowanceRequired', {\n tokenSymbol: step.action.fromToken.symbol,\n })\n break\n case LiFiErrorCode.BalanceError:\n title = t('error.title.balanceIsTooLow')\n message = getDefaultErrorMessage()\n break\n case LiFiErrorCode.ChainSwitchError:\n title = t('error.title.chainSwitch')\n message = getDefaultErrorMessage()\n break\n case LiFiErrorCode.GasLimitError:\n title = t('error.title.gasLimitIsTooLow')\n message = getDefaultErrorMessage()\n break\n case LiFiErrorCode.InsufficientFunds:\n title = t('error.title.insufficientFunds')\n message = `${t(\n 'error.message.insufficientFunds'\n )} ${getDefaultErrorMessage()}`\n break\n case LiFiErrorCode.InsufficientGas:\n title = t('error.title.insufficientGas')\n message = `${t(\n 'error.message.insufficientFunds'\n )} ${getDefaultErrorMessage()}`\n break\n case LiFiErrorCode.SlippageError:\n title = t('error.title.slippageNotMet')\n message = t('error.message.slippageThreshold')\n break\n case LiFiErrorCode.TransactionFailed:\n title = t('error.title.transactionFailed')\n message = t('error.message.transactionFailed')\n break\n case LiFiErrorCode.TransactionExpired:\n title = t('error.title.transactionExpired')\n message = t('error.message.transactionExpired')\n break\n case LiFiErrorCode.TransactionSimulationFailed:\n title = t('error.title.transactionSimulationFailed')\n message = t('error.message.transactionSimulationFailed')\n break\n case LiFiErrorCode.WalletChangedDuringExecution:\n title = t('error.title.walletMismatch')\n message = t('error.message.walletChangedDuringExecution')\n break\n case LiFiErrorCode.RateLimitExceeded:\n title = t('error.title.rateLimitExceeded')\n message = t('error.message.rateLimitExceeded')\n break\n case LiFiErrorCode.ThirdPartyError:\n title = t('error.title.thirdPartyError')\n message = t('error.message.thirdPartyError')\n break\n case LiFiErrorCode.TransactionUnderpriced:\n title = t('error.title.transactionUnderpriced')\n message = getDefaultErrorMessage()\n break\n case LiFiErrorCode.TransactionUnprepared:\n title = t('error.title.transactionUnprepared')\n message = getDefaultErrorMessage()\n break\n case LiFiErrorCode.TransactionCanceled:\n title = t('error.title.transactionCanceled')\n message = getDefaultErrorMessage('error.message.transactionCanceled')\n break\n case LiFiErrorCode.TransactionRejected:\n title = t('error.title.transactionRejected')\n message = getDefaultErrorMessage('error.message.transactionRejected')\n break\n case LiFiErrorCode.TransactionConflict:\n title = t('error.title.transactionConflict')\n message = getDefaultErrorMessage('error.message.transactionConflict')\n break\n case LiFiErrorCode.ExchangeRateUpdateCanceled:\n title = t('error.title.exchangeRateUpdateCanceled')\n message = getDefaultErrorMessage()\n break\n case LiFiErrorCode.SignatureRejected:\n title = t('error.title.signatureRejected')\n message = t('error.message.signatureRejected', {\n amount: formatTokenAmount(\n BigInt(step.action.fromAmount),\n step.action.fromToken.decimals\n ),\n tokenSymbol: step.action.fromToken.symbol,\n chainName: getChainById(step.action.fromChainId)?.name ?? '',\n })\n break\n default:\n title = t('error.title.unknown')\n if (failedAction?.txHash) {\n message = t('error.message.transactionFailed')\n } else {\n message = error.message || t('error.message.unknown')\n }\n break\n }\n message = wrapLongWords(message)\n return { title, message }\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"getErrorMessage.js","names":[],"sources":["../../../src/utils/getErrorMessage.ts"],"sourcesContent":["import {\n type EVMChain,\n type ExecutionAction,\n LiFiErrorCode,\n type LiFiStepExtended,\n} from '@lifi/sdk'\nimport type { TFunction } from 'i18next'\nimport { formatTokenAmount, wrapLongWords } from '../utils/format.js'\n\nexport function getErrorMessage(\n t: TFunction,\n getChainById: (chainId: number) => EVMChain | undefined,\n step: LiFiStepExtended,\n failedAction?: ExecutionAction\n): { title: string; message: string } {\n const error = failedAction?.error\n if (!error) {\n return {\n title: t('error.title.unknown'),\n message: t('error.message.unknown'),\n }\n }\n\n const getDefaultErrorMessage = (key?: string) =>\n `${t((key as any) ?? 'error.message.transactionNotSent')} ${t(\n 'error.message.remainInYourWallet',\n {\n amount: formatTokenAmount(\n BigInt(step.action.fromAmount),\n step.action.fromToken.decimals\n ),\n tokenSymbol: step.action.fromToken.symbol,\n chainName: getChainById(step.action.fromChainId)?.name ?? '',\n }\n )}`\n\n let title = ''\n let message = ''\n switch (error.code) {\n case LiFiErrorCode.AllowanceRequired:\n title = t('error.title.allowanceRequired')\n message = t('error.message.allowanceRequired', {\n tokenSymbol: step.action.fromToken.symbol,\n })\n break\n case LiFiErrorCode.BalanceError:\n title = t('error.title.balanceIsTooLow')\n message = getDefaultErrorMessage()\n break\n case LiFiErrorCode.ChainSwitchError:\n title = t('error.title.chainSwitch')\n message = getDefaultErrorMessage()\n break\n case LiFiErrorCode.GasLimitError:\n title = t('error.title.gasLimitIsTooLow')\n message = getDefaultErrorMessage()\n break\n case LiFiErrorCode.InsufficientFunds:\n title = t('error.title.insufficientFunds')\n message = `${t(\n 'error.message.insufficientFunds'\n )} ${getDefaultErrorMessage()}`\n break\n case LiFiErrorCode.InsufficientGas:\n title = t('error.title.insufficientGas')\n message = `${t(\n 'error.message.insufficientFunds'\n )} ${getDefaultErrorMessage()}`\n break\n case LiFiErrorCode.SlippageError:\n title = t('error.title.slippageNotMet')\n message = t('error.message.slippageThreshold')\n break\n case LiFiErrorCode.TransactionFailed:\n title = t('error.title.transactionFailed')\n message = t('error.message.transactionFailed')\n break\n case LiFiErrorCode.TransactionExpired:\n title = t('error.title.transactionExpired')\n message = t('error.message.transactionExpired')\n break\n case LiFiErrorCode.TransactionSimulationFailed:\n title = t('error.title.transactionSimulationFailed')\n message = t('error.message.transactionSimulationFailed')\n break\n case LiFiErrorCode.WalletChangedDuringExecution:\n title = t('error.title.walletMismatch')\n message = t('error.message.walletChangedDuringExecution')\n break\n case LiFiErrorCode.RateLimitExceeded:\n title = t('error.title.rateLimitExceeded')\n message = t('error.message.rateLimitExceeded')\n break\n case LiFiErrorCode.ThirdPartyError:\n title = t('error.title.thirdPartyError')\n message = t('error.message.thirdPartyError')\n break\n case LiFiErrorCode.TransactionUnderpriced:\n title = t('error.title.transactionUnderpriced')\n message = getDefaultErrorMessage()\n break\n case LiFiErrorCode.TransactionUnprepared:\n title = t('error.title.transactionUnprepared')\n message = getDefaultErrorMessage()\n break\n case LiFiErrorCode.TransactionCanceled:\n title = t('error.title.transactionCanceled')\n message = getDefaultErrorMessage('error.message.transactionCanceled')\n break\n case LiFiErrorCode.TransactionRejected:\n title = t('error.title.transactionRejected')\n message = getDefaultErrorMessage('error.message.transactionRejected')\n break\n case LiFiErrorCode.TransactionConflict:\n title = t('error.title.transactionConflict')\n message = getDefaultErrorMessage('error.message.transactionConflict')\n break\n case LiFiErrorCode.ExchangeRateUpdateCanceled:\n title = t('error.title.exchangeRateUpdateCanceled')\n message = getDefaultErrorMessage()\n break\n case LiFiErrorCode.SignatureRejected:\n title = t('error.title.signatureRejected')\n message = t('error.message.signatureRejected', {\n amount: formatTokenAmount(\n BigInt(step.action.fromAmount),\n step.action.fromToken.decimals\n ),\n tokenSymbol: step.action.fromToken.symbol,\n chainName: getChainById(step.action.fromChainId)?.name ?? '',\n })\n break\n default:\n title = t('error.title.unknown')\n if (failedAction?.txHash) {\n message = t('error.message.transactionFailed')\n } else {\n message = error.message || t('error.message.unknown')\n }\n break\n }\n message = wrapLongWords(message)\n return { title, message }\n}\n"],"mappings":";;;AASA,SAAgB,gBACd,GACA,cACA,MACA,cACoC;CACpC,MAAM,QAAQ,cAAc;CAC5B,IAAI,CAAC,OACH,OAAO;EACL,OAAO,EAAE,qBAAqB;EAC9B,SAAS,EAAE,uBAAuB;CACpC;CAGF,MAAM,0BAA0B,QAC9B,GAAG,EAAG,OAAe,kCAAkC,EAAE,GAAG,EAC1D,oCACA;EACE,QAAQ,kBACN,OAAO,KAAK,OAAO,UAAU,GAC7B,KAAK,OAAO,UAAU,QACxB;EACA,aAAa,KAAK,OAAO,UAAU;EACnC,WAAW,aAAa,KAAK,OAAO,WAAW,CAAC,EAAE,QAAQ;CAC5D,CACF;CAEF,IAAI,QAAQ;CACZ,IAAI,UAAU;CACd,QAAQ,MAAM,MAAd;EACE,KAAK,cAAc;GACjB,QAAQ,EAAE,+BAA+B;GACzC,UAAU,EAAE,mCAAmC,EAC7C,aAAa,KAAK,OAAO,UAAU,OACrC,CAAC;GACD;EACF,KAAK,cAAc;GACjB,QAAQ,EAAE,6BAA6B;GACvC,UAAU,uBAAuB;GACjC;EACF,KAAK,cAAc;GACjB,QAAQ,EAAE,yBAAyB;GACnC,UAAU,uBAAuB;GACjC;EACF,KAAK,cAAc;GACjB,QAAQ,EAAE,8BAA8B;GACxC,UAAU,uBAAuB;GACjC;EACF,KAAK,cAAc;GACjB,QAAQ,EAAE,+BAA+B;GACzC,UAAU,GAAG,EACX,iCACF,EAAE,GAAG,uBAAuB;GAC5B;EACF,KAAK,cAAc;GACjB,QAAQ,EAAE,6BAA6B;GACvC,UAAU,GAAG,EACX,iCACF,EAAE,GAAG,uBAAuB;GAC5B;EACF,KAAK,cAAc;GACjB,QAAQ,EAAE,4BAA4B;GACtC,UAAU,EAAE,iCAAiC;GAC7C;EACF,KAAK,cAAc;GACjB,QAAQ,EAAE,+BAA+B;GACzC,UAAU,EAAE,iCAAiC;GAC7C;EACF,KAAK,cAAc;GACjB,QAAQ,EAAE,gCAAgC;GAC1C,UAAU,EAAE,kCAAkC;GAC9C;EACF,KAAK,cAAc;GACjB,QAAQ,EAAE,yCAAyC;GACnD,UAAU,EAAE,2CAA2C;GACvD;EACF,KAAK,cAAc;GACjB,QAAQ,EAAE,4BAA4B;GACtC,UAAU,EAAE,4CAA4C;GACxD;EACF,KAAK,cAAc;GACjB,QAAQ,EAAE,+BAA+B;GACzC,UAAU,EAAE,iCAAiC;GAC7C;EACF,KAAK,cAAc;GACjB,QAAQ,EAAE,6BAA6B;GACvC,UAAU,EAAE,+BAA+B;GAC3C;EACF,KAAK,cAAc;GACjB,QAAQ,EAAE,oCAAoC;GAC9C,UAAU,uBAAuB;GACjC;EACF,KAAK,cAAc;GACjB,QAAQ,EAAE,mCAAmC;GAC7C,UAAU,uBAAuB;GACjC;EACF,KAAK,cAAc;GACjB,QAAQ,EAAE,iCAAiC;GAC3C,UAAU,uBAAuB,mCAAmC;GACpE;EACF,KAAK,cAAc;GACjB,QAAQ,EAAE,iCAAiC;GAC3C,UAAU,uBAAuB,mCAAmC;GACpE;EACF,KAAK,cAAc;GACjB,QAAQ,EAAE,iCAAiC;GAC3C,UAAU,uBAAuB,mCAAmC;GACpE;EACF,KAAK,cAAc;GACjB,QAAQ,EAAE,wCAAwC;GAClD,UAAU,uBAAuB;GACjC;EACF,KAAK,cAAc;GACjB,QAAQ,EAAE,+BAA+B;GACzC,UAAU,EAAE,mCAAmC;IAC7C,QAAQ,kBACN,OAAO,KAAK,OAAO,UAAU,GAC7B,KAAK,OAAO,UAAU,QACxB;IACA,aAAa,KAAK,OAAO,UAAU;IACnC,WAAW,aAAa,KAAK,OAAO,WAAW,CAAC,EAAE,QAAQ;GAC5D,CAAC;GACD;EACF;GACE,QAAQ,EAAE,qBAAqB;GAC/B,IAAI,cAAc,QAChB,UAAU,EAAE,iCAAiC;QAE7C,UAAU,MAAM,WAAW,EAAE,uBAAuB;CAG1D;CACA,UAAU,cAAc,OAAO;CAC/B,OAAO;EAAE;EAAO;CAAQ;AAC1B"}
@@ -1,7 +1,7 @@
1
1
  import { formatInputAmount } from "./format.js";
2
2
  //#region src/utils/limitOrder.ts
3
3
  /** Default order validity: 1 day, expressed as a duration in seconds. */
4
- const DEFAULT_VALID_UNTIL_SECONDS = 1440 * 60;
4
+ const DEFAULT_VALID_UNTIL_SECONDS = 86400;
5
5
  /**
6
6
  * High-precision formatter for derived limit-order values. Mirrors the
7
7
  * approach used by `priceToTokenAmount` — these are display-level derivations;