@rango-dev/widget-embedded 0.0.0-experimental-936229e8-20251208
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.
- package/CHANGELOG.md +878 -0
- package/dist/QueueManager.d.ts +7 -0
- package/dist/QueueManager.d.ts.map +1 -0
- package/dist/components/AppRouter.d.ts +4 -0
- package/dist/components/AppRouter.d.ts.map +1 -0
- package/dist/components/AppRoutes.d.ts +3 -0
- package/dist/components/AppRoutes.d.ts.map +1 -0
- package/dist/components/BlockchainList/BlockchainList.d.ts +4 -0
- package/dist/components/BlockchainList/BlockchainList.d.ts.map +1 -0
- package/dist/components/BlockchainList/BlockchainList.helpers.d.ts +3 -0
- package/dist/components/BlockchainList/BlockchainList.helpers.d.ts.map +1 -0
- package/dist/components/BlockchainList/BlockchainList.styles.d.ts +480 -0
- package/dist/components/BlockchainList/BlockchainList.styles.d.ts.map +1 -0
- package/dist/components/BlockchainList/BlockchainList.types.d.ts +9 -0
- package/dist/components/BlockchainList/BlockchainList.types.d.ts.map +1 -0
- package/dist/components/BlockchainList/LoadingBlockchainList.d.ts +3 -0
- package/dist/components/BlockchainList/LoadingBlockchainList.d.ts.map +1 -0
- package/dist/components/BlockchainList/index.d.ts +2 -0
- package/dist/components/BlockchainList/index.d.ts.map +1 -0
- package/dist/components/BlockchainSelectorButton/BlockchainSelectorButton.d.ts +4 -0
- package/dist/components/BlockchainSelectorButton/BlockchainSelectorButton.d.ts.map +1 -0
- package/dist/components/BlockchainSelectorButton/BlockchainSelectorButton.styles.d.ts +483 -0
- package/dist/components/BlockchainSelectorButton/BlockchainSelectorButton.styles.d.ts.map +1 -0
- package/dist/components/BlockchainSelectorButton/BlockchainSelectorButton.types.d.ts +12 -0
- package/dist/components/BlockchainSelectorButton/BlockchainSelectorButton.types.d.ts.map +1 -0
- package/dist/components/BlockchainSelectorButton/index.d.ts +2 -0
- package/dist/components/BlockchainSelectorButton/index.d.ts.map +1 -0
- package/dist/components/BlockchainsSection/BlockchainsSection.d.ts +4 -0
- package/dist/components/BlockchainsSection/BlockchainsSection.d.ts.map +1 -0
- package/dist/components/BlockchainsSection/BlockchainsSection.styles.d.ts +161 -0
- package/dist/components/BlockchainsSection/BlockchainsSection.styles.d.ts.map +1 -0
- package/dist/components/BlockchainsSection/BlockchainsSection.types.d.ts +9 -0
- package/dist/components/BlockchainsSection/BlockchainsSection.types.d.ts.map +1 -0
- package/dist/components/BlockchainsSection/index.d.ts +2 -0
- package/dist/components/BlockchainsSection/index.d.ts.map +1 -0
- package/dist/components/ConfirmWalletsModal/ConfirmWallets.styles.d.ts +1763 -0
- package/dist/components/ConfirmWalletsModal/ConfirmWallets.styles.d.ts.map +1 -0
- package/dist/components/ConfirmWalletsModal/ConfirmWalletsModal.d.ts +4 -0
- package/dist/components/ConfirmWalletsModal/ConfirmWalletsModal.d.ts.map +1 -0
- package/dist/components/ConfirmWalletsModal/ConfirmWalletsModal.types.d.ts +9 -0
- package/dist/components/ConfirmWalletsModal/ConfirmWalletsModal.types.d.ts.map +1 -0
- package/dist/components/ConfirmWalletsModal/WalletList.d.ts +4 -0
- package/dist/components/ConfirmWalletsModal/WalletList.d.ts.map +1 -0
- package/dist/components/ConfirmWalletsModal/WalletList.styles.d.ts +481 -0
- package/dist/components/ConfirmWalletsModal/WalletList.styles.d.ts.map +1 -0
- package/dist/components/ConfirmWalletsModal/WalletList.type.d.ts +11 -0
- package/dist/components/ConfirmWalletsModal/WalletList.type.d.ts.map +1 -0
- package/dist/components/CustomCollapsible/CustomCollapsible.d.ts +5 -0
- package/dist/components/CustomCollapsible/CustomCollapsible.d.ts.map +1 -0
- package/dist/components/CustomCollapsible/CustomCollapsible.styles.d.ts +649 -0
- package/dist/components/CustomCollapsible/CustomCollapsible.styles.d.ts.map +1 -0
- package/dist/components/CustomCollapsible/CustomCollapsible.types.d.ts +10 -0
- package/dist/components/CustomCollapsible/CustomCollapsible.types.d.ts.map +1 -0
- package/dist/components/CustomDestination/CustomDestination.d.ts +4 -0
- package/dist/components/CustomDestination/CustomDestination.d.ts.map +1 -0
- package/dist/components/CustomDestination/CustomDestination.styles.d.ts +494 -0
- package/dist/components/CustomDestination/CustomDestination.styles.d.ts.map +1 -0
- package/dist/components/CustomDestination/CustomDestination.types.d.ts +7 -0
- package/dist/components/CustomDestination/CustomDestination.types.d.ts.map +1 -0
- package/dist/components/CustomTokenModal/CustomTokenModal.constants.d.ts +2 -0
- package/dist/components/CustomTokenModal/CustomTokenModal.constants.d.ts.map +1 -0
- package/dist/components/CustomTokenModal/CustomTokenModal.d.ts +4 -0
- package/dist/components/CustomTokenModal/CustomTokenModal.d.ts.map +1 -0
- package/dist/components/CustomTokenModal/CustomTokenModal.helpers.d.ts +3 -0
- package/dist/components/CustomTokenModal/CustomTokenModal.helpers.d.ts.map +1 -0
- package/dist/components/CustomTokenModal/CustomTokenModal.styles.d.ts +1085 -0
- package/dist/components/CustomTokenModal/CustomTokenModal.styles.d.ts.map +1 -0
- package/dist/components/CustomTokenModal/CustomTokenModal.types.d.ts +10 -0
- package/dist/components/CustomTokenModal/CustomTokenModal.types.d.ts.map +1 -0
- package/dist/components/CustomTokenModal/index.d.ts +2 -0
- package/dist/components/CustomTokenModal/index.d.ts.map +1 -0
- package/dist/components/FilterSelector/FilterSelector.d.ts +4 -0
- package/dist/components/FilterSelector/FilterSelector.d.ts.map +1 -0
- package/dist/components/FilterSelector/FilterSelector.style.d.ts +967 -0
- package/dist/components/FilterSelector/FilterSelector.style.d.ts.map +1 -0
- package/dist/components/FilterSelector/FilterSelector.type.d.ts +14 -0
- package/dist/components/FilterSelector/FilterSelector.type.d.ts.map +1 -0
- package/dist/components/FilterSelector/FilterSelectorContent.d.ts +4 -0
- package/dist/components/FilterSelector/FilterSelectorContent.d.ts.map +1 -0
- package/dist/components/FilterSelector/index.d.ts +2 -0
- package/dist/components/FilterSelector/index.d.ts.map +1 -0
- package/dist/components/HeaderButtons/BackButton.d.ts +5 -0
- package/dist/components/HeaderButtons/BackButton.d.ts.map +1 -0
- package/dist/components/HeaderButtons/CancelButton.d.ts +5 -0
- package/dist/components/HeaderButtons/CancelButton.d.ts.map +1 -0
- package/dist/components/HeaderButtons/HeaderButtons.d.ts +4 -0
- package/dist/components/HeaderButtons/HeaderButtons.d.ts.map +1 -0
- package/dist/components/HeaderButtons/HeaderButtons.styles.d.ts +1287 -0
- package/dist/components/HeaderButtons/HeaderButtons.styles.d.ts.map +1 -0
- package/dist/components/HeaderButtons/HeaderButtons.types.d.ts +13 -0
- package/dist/components/HeaderButtons/HeaderButtons.types.d.ts.map +1 -0
- package/dist/components/HeaderButtons/InProgressTransactionBadge.d.ts +4 -0
- package/dist/components/HeaderButtons/InProgressTransactionBadge.d.ts.map +1 -0
- package/dist/components/HeaderButtons/NotificationsBadge.d.ts +3 -0
- package/dist/components/HeaderButtons/NotificationsBadge.d.ts.map +1 -0
- package/dist/components/HeaderButtons/RefreshButton.d.ts +6 -0
- package/dist/components/HeaderButtons/RefreshButton.d.ts.map +1 -0
- package/dist/components/HeaderButtons/WalletButton.d.ts +5 -0
- package/dist/components/HeaderButtons/WalletButton.d.ts.map +1 -0
- package/dist/components/HeaderButtons/index.d.ts +5 -0
- package/dist/components/HeaderButtons/index.d.ts.map +1 -0
- package/dist/components/HistoryGroupedList/HistoryGroupedList.d.ts +4 -0
- package/dist/components/HistoryGroupedList/HistoryGroupedList.d.ts.map +1 -0
- package/dist/components/HistoryGroupedList/HistoryGroupedList.helpers.d.ts +2 -0
- package/dist/components/HistoryGroupedList/HistoryGroupedList.helpers.d.ts.map +1 -0
- package/dist/components/HistoryGroupedList/HistoryGroupedList.styles.d.ts +961 -0
- package/dist/components/HistoryGroupedList/HistoryGroupedList.styles.d.ts.map +1 -0
- package/dist/components/HistoryGroupedList/HistoryGroupedList.types.d.ts +13 -0
- package/dist/components/HistoryGroupedList/HistoryGroupedList.types.d.ts.map +1 -0
- package/dist/components/HistoryGroupedList/index.d.ts +2 -0
- package/dist/components/HistoryGroupedList/index.d.ts.map +1 -0
- package/dist/components/ImportCustomToken/ImportCustomToken.d.ts +4 -0
- package/dist/components/ImportCustomToken/ImportCustomToken.d.ts.map +1 -0
- package/dist/components/ImportCustomToken/ImportCustomToken.types.d.ts +15 -0
- package/dist/components/ImportCustomToken/ImportCustomToken.types.d.ts.map +1 -0
- package/dist/components/ImportCustomToken/index.d.ts +2 -0
- package/dist/components/ImportCustomToken/index.d.ts.map +1 -0
- package/dist/components/Layout/Layout.constants.d.ts +6 -0
- package/dist/components/Layout/Layout.constants.d.ts.map +1 -0
- package/dist/components/Layout/Layout.d.ts +6 -0
- package/dist/components/Layout/Layout.d.ts.map +1 -0
- package/dist/components/Layout/Layout.helpers.d.ts +2 -0
- package/dist/components/Layout/Layout.helpers.d.ts.map +1 -0
- package/dist/components/Layout/Layout.styles.d.ts +804 -0
- package/dist/components/Layout/Layout.styles.d.ts.map +1 -0
- package/dist/components/Layout/Layout.types.d.ts +19 -0
- package/dist/components/Layout/Layout.types.d.ts.map +1 -0
- package/dist/components/Layout/PageContainer.d.ts +165 -0
- package/dist/components/Layout/PageContainer.d.ts.map +1 -0
- package/dist/components/Layout/ScrollableArea.d.ts +163 -0
- package/dist/components/Layout/ScrollableArea.d.ts.map +1 -0
- package/dist/components/Layout/index.d.ts +4 -0
- package/dist/components/Layout/index.d.ts.map +1 -0
- package/dist/components/LoadingLiquiditySourceList/LoadingLiquiditySourceList.d.ts +3 -0
- package/dist/components/LoadingLiquiditySourceList/LoadingLiquiditySourceList.d.ts.map +1 -0
- package/dist/components/LoadingLiquiditySourceList/LoadingLiquiditySourceList.styles.d.ts +162 -0
- package/dist/components/LoadingLiquiditySourceList/LoadingLiquiditySourceList.styles.d.ts.map +1 -0
- package/dist/components/LoadingLiquiditySourceList/index.d.ts +2 -0
- package/dist/components/LoadingLiquiditySourceList/index.d.ts.map +1 -0
- package/dist/components/LoadingSwapDetails/LoadingSwapDetails.d.ts +3 -0
- package/dist/components/LoadingSwapDetails/LoadingSwapDetails.d.ts.map +1 -0
- package/dist/components/LoadingSwapDetails/LoadingSwapDetails.styles.d.ts +2081 -0
- package/dist/components/LoadingSwapDetails/LoadingSwapDetails.styles.d.ts.map +1 -0
- package/dist/components/LoadingSwapDetails/index.d.ts +2 -0
- package/dist/components/LoadingSwapDetails/index.d.ts.map +1 -0
- package/dist/components/NamespaceItem/NamespaceItem.d.ts +4 -0
- package/dist/components/NamespaceItem/NamespaceItem.d.ts.map +1 -0
- package/dist/components/NamespaceItem/NamespaceItem.helpers.d.ts +3 -0
- package/dist/components/NamespaceItem/NamespaceItem.helpers.d.ts.map +1 -0
- package/dist/components/NamespaceItem/NamespaceItem.styles.d.ts +1452 -0
- package/dist/components/NamespaceItem/NamespaceItem.styles.d.ts.map +1 -0
- package/dist/components/NamespaceItem/NamespaceItem.types.d.ts +13 -0
- package/dist/components/NamespaceItem/NamespaceItem.types.d.ts.map +1 -0
- package/dist/components/NamespaceItem/NamespaceUnsupportedItem.d.ts +4 -0
- package/dist/components/NamespaceItem/NamespaceUnsupportedItem.d.ts.map +1 -0
- package/dist/components/NamespaceItem/SupportedChainsList.d.ts +4 -0
- package/dist/components/NamespaceItem/SupportedChainsList.d.ts.map +1 -0
- package/dist/components/NamespaceItem/SupportedChainsList.styles.d.ts +323 -0
- package/dist/components/NamespaceItem/SupportedChainsList.styles.d.ts.map +1 -0
- package/dist/components/NamespaceItem/SupportedChainsList.types.d.ts +5 -0
- package/dist/components/NamespaceItem/SupportedChainsList.types.d.ts.map +1 -0
- package/dist/components/NamespaceItem/index.d.ts +2 -0
- package/dist/components/NamespaceItem/index.d.ts.map +1 -0
- package/dist/components/NoResult/NoResult.d.ts +4 -0
- package/dist/components/NoResult/NoResult.d.ts.map +1 -0
- package/dist/components/NoResult/NoResult.helpers.d.ts +12 -0
- package/dist/components/NoResult/NoResult.helpers.d.ts.map +1 -0
- package/dist/components/NoResult/NoResult.styles.d.ts +645 -0
- package/dist/components/NoResult/NoResult.styles.d.ts.map +1 -0
- package/dist/components/NoResult/NoResult.types.d.ts +22 -0
- package/dist/components/NoResult/NoResult.types.d.ts.map +1 -0
- package/dist/components/NoResult/index.d.ts +2 -0
- package/dist/components/NoResult/index.d.ts.map +1 -0
- package/dist/components/NotificationContent/NotificationContent.d.ts +3 -0
- package/dist/components/NotificationContent/NotificationContent.d.ts.map +1 -0
- package/dist/components/NotificationContent/index.d.ts +2 -0
- package/dist/components/NotificationContent/index.d.ts.map +1 -0
- package/dist/components/Quote/Quote.d.ts +4 -0
- package/dist/components/Quote/Quote.d.ts.map +1 -0
- package/dist/components/Quote/Quote.styles.d.ts +3667 -0
- package/dist/components/Quote/Quote.styles.d.ts.map +1 -0
- package/dist/components/Quote/Quote.types.d.ts +57 -0
- package/dist/components/Quote/Quote.types.d.ts.map +1 -0
- package/dist/components/Quote/QuoteCostDetails.d.ts +4 -0
- package/dist/components/Quote/QuoteCostDetails.d.ts.map +1 -0
- package/dist/components/Quote/QuoteCostDetails.styles.d.ts +801 -0
- package/dist/components/Quote/QuoteCostDetails.styles.d.ts.map +1 -0
- package/dist/components/Quote/QuoteSummary.d.ts +11 -0
- package/dist/components/Quote/QuoteSummary.d.ts.map +1 -0
- package/dist/components/Quote/QuoteSummary.styles.d.ts +321 -0
- package/dist/components/Quote/QuoteSummary.styles.d.ts.map +1 -0
- package/dist/components/Quote/QuoteTrigger.d.ts +4 -0
- package/dist/components/Quote/QuoteTrigger.d.ts.map +1 -0
- package/dist/components/Quote/index.d.ts +3 -0
- package/dist/components/Quote/index.d.ts.map +1 -0
- package/dist/components/QuoteSkeleton/QuoteSkeleton.d.ts +4 -0
- package/dist/components/QuoteSkeleton/QuoteSkeleton.d.ts.map +1 -0
- package/dist/components/QuoteSkeleton/QuoteSkeleton.styles.d.ts +646 -0
- package/dist/components/QuoteSkeleton/QuoteSkeleton.styles.d.ts.map +1 -0
- package/dist/components/QuoteSkeleton/QuoteSkeleton.types.d.ts +7 -0
- package/dist/components/QuoteSkeleton/QuoteSkeleton.types.d.ts.map +1 -0
- package/dist/components/QuoteSkeleton/QuoteSummarySkeleton.d.ts +4 -0
- package/dist/components/QuoteSkeleton/QuoteSummarySkeleton.d.ts.map +1 -0
- package/dist/components/QuoteSkeleton/QuoteSummarySkeleton.styles.d.ts +1601 -0
- package/dist/components/QuoteSkeleton/QuoteSummarySkeleton.styles.d.ts.map +1 -0
- package/dist/components/QuoteSkeleton/QuoteSummarySkeleton.types.d.ts +6 -0
- package/dist/components/QuoteSkeleton/QuoteSummarySkeleton.types.d.ts.map +1 -0
- package/dist/components/QuoteSkeleton/StepSkeleton.d.ts +4 -0
- package/dist/components/QuoteSkeleton/StepSkeleton.d.ts.map +1 -0
- package/dist/components/QuoteSkeleton/StepSkeleton.styles.d.ts +803 -0
- package/dist/components/QuoteSkeleton/StepSkeleton.styles.d.ts.map +1 -0
- package/dist/components/QuoteSkeleton/StepSkeleton.types.d.ts +4 -0
- package/dist/components/QuoteSkeleton/StepSkeleton.types.d.ts.map +1 -0
- package/dist/components/QuoteSkeleton/index.d.ts +4 -0
- package/dist/components/QuoteSkeleton/index.d.ts.map +1 -0
- package/dist/components/QuoteWarningsAndErrors/HighValueLossWarningModal.d.ts +12 -0
- package/dist/components/QuoteWarningsAndErrors/HighValueLossWarningModal.d.ts.map +1 -0
- package/dist/components/QuoteWarningsAndErrors/QuoteErrorsModalItem.d.ts +4 -0
- package/dist/components/QuoteWarningsAndErrors/QuoteErrorsModalItem.d.ts.map +1 -0
- package/dist/components/QuoteWarningsAndErrors/QuoteWarningsAndErrors.d.ts +4 -0
- package/dist/components/QuoteWarningsAndErrors/QuoteWarningsAndErrors.d.ts.map +1 -0
- package/dist/components/QuoteWarningsAndErrors/QuoteWarningsAndErrors.helpers.d.ts +11 -0
- package/dist/components/QuoteWarningsAndErrors/QuoteWarningsAndErrors.helpers.d.ts.map +1 -0
- package/dist/components/QuoteWarningsAndErrors/QuoteWarningsAndErrors.styles.d.ts +1403 -0
- package/dist/components/QuoteWarningsAndErrors/QuoteWarningsAndErrors.styles.d.ts.map +1 -0
- package/dist/components/QuoteWarningsAndErrors/QuoteWarningsAndErrors.types.d.ts +26 -0
- package/dist/components/QuoteWarningsAndErrors/QuoteWarningsAndErrors.types.d.ts.map +1 -0
- package/dist/components/QuoteWarningsAndErrors/SlippageWariningModal.d.ts +12 -0
- package/dist/components/QuoteWarningsAndErrors/SlippageWariningModal.d.ts.map +1 -0
- package/dist/components/QuoteWarningsAndErrors/UnknownPriceWarningModal.d.ts +12 -0
- package/dist/components/QuoteWarningsAndErrors/UnknownPriceWarningModal.d.ts.map +1 -0
- package/dist/components/QuoteWarningsAndErrors/index.d.ts +2 -0
- package/dist/components/QuoteWarningsAndErrors/index.d.ts.map +1 -0
- package/dist/components/Quotes/Quotes.d.ts +4 -0
- package/dist/components/Quotes/Quotes.d.ts.map +1 -0
- package/dist/components/Quotes/Quotes.styles.d.ts +481 -0
- package/dist/components/Quotes/Quotes.styles.d.ts.map +1 -0
- package/dist/components/Quotes/Quotes.types.d.ts +11 -0
- package/dist/components/Quotes/Quotes.types.d.ts.map +1 -0
- package/dist/components/Quotes/SelectStrategy.d.ts +5 -0
- package/dist/components/Quotes/SelectStrategy.d.ts.map +1 -0
- package/dist/components/Quotes/index.d.ts +2 -0
- package/dist/components/Quotes/index.d.ts.map +1 -0
- package/dist/components/RefreshModal/RefreshModal.d.ts +4 -0
- package/dist/components/RefreshModal/RefreshModal.d.ts.map +1 -0
- package/dist/components/RefreshModal/RefreshModal.styles.d.ts +441 -0
- package/dist/components/RefreshModal/RefreshModal.styles.d.ts.map +1 -0
- package/dist/components/RefreshModal/RefreshModal.types.d.ts +5 -0
- package/dist/components/RefreshModal/RefreshModal.types.d.ts.map +1 -0
- package/dist/components/RefreshModal/index.d.ts +2 -0
- package/dist/components/RefreshModal/index.d.ts.map +1 -0
- package/dist/components/SameTokensWarning/SameTokensWarning.d.ts +3 -0
- package/dist/components/SameTokensWarning/SameTokensWarning.d.ts.map +1 -0
- package/dist/components/SameTokensWarning/SameTokensWarning.styles.d.ts +161 -0
- package/dist/components/SameTokensWarning/SameTokensWarning.styles.d.ts.map +1 -0
- package/dist/components/SameTokensWarning/index.d.ts +2 -0
- package/dist/components/SameTokensWarning/index.d.ts.map +1 -0
- package/dist/components/SearchInput/SearchInput.d.ts +4 -0
- package/dist/components/SearchInput/SearchInput.d.ts.map +1 -0
- package/dist/components/SearchInput/SearchInput.styles.d.ts +321 -0
- package/dist/components/SearchInput/SearchInput.styles.d.ts.map +1 -0
- package/dist/components/SearchInput/SearchInput.types.d.ts +14 -0
- package/dist/components/SearchInput/SearchInput.types.d.ts.map +1 -0
- package/dist/components/SearchInput/index.d.ts +2 -0
- package/dist/components/SearchInput/index.d.ts.map +1 -0
- package/dist/components/SettingsContainer/SettingsContainer.style.d.ts +483 -0
- package/dist/components/SettingsContainer/SettingsContainer.style.d.ts.map +1 -0
- package/dist/components/SettingsContainer/index.d.ts +2 -0
- package/dist/components/SettingsContainer/index.d.ts.map +1 -0
- package/dist/components/Slippage/Slippage.d.ts +3 -0
- package/dist/components/Slippage/Slippage.d.ts.map +1 -0
- package/dist/components/Slippage/Slippage.styles.d.ts +802 -0
- package/dist/components/Slippage/Slippage.styles.d.ts.map +1 -0
- package/dist/components/Slippage/SlippageTooltipContent.d.ts +3 -0
- package/dist/components/Slippage/SlippageTooltipContent.d.ts.map +1 -0
- package/dist/components/Slippage/index.d.ts +2 -0
- package/dist/components/Slippage/index.d.ts.map +1 -0
- package/dist/components/SlippageWarningsAndErrors/SlippageWarningsAndErrors.d.ts +4 -0
- package/dist/components/SlippageWarningsAndErrors/SlippageWarningsAndErrors.d.ts.map +1 -0
- package/dist/components/SlippageWarningsAndErrors/SlippageWarningsAndErrors.helpers.d.ts +8 -0
- package/dist/components/SlippageWarningsAndErrors/SlippageWarningsAndErrors.helpers.d.ts.map +1 -0
- package/dist/components/SlippageWarningsAndErrors/SlippageWarningsAndErrors.types.d.ts +4 -0
- package/dist/components/SlippageWarningsAndErrors/SlippageWarningsAndErrors.types.d.ts.map +1 -0
- package/dist/components/StatefulConnectModal/StatefulConnectModal.d.ts +14 -0
- package/dist/components/StatefulConnectModal/StatefulConnectModal.d.ts.map +1 -0
- package/dist/components/StatefulConnectModal/helpers.d.ts +13 -0
- package/dist/components/StatefulConnectModal/helpers.d.ts.map +1 -0
- package/dist/components/StatefulConnectModal/index.d.ts +3 -0
- package/dist/components/StatefulConnectModal/index.d.ts.map +1 -0
- package/dist/components/SwapDetails/RequestIdRow.d.ts +4 -0
- package/dist/components/SwapDetails/RequestIdRow.d.ts.map +1 -0
- package/dist/components/SwapDetails/SwapDateRow.d.ts +4 -0
- package/dist/components/SwapDetails/SwapDateRow.d.ts.map +1 -0
- package/dist/components/SwapDetails/SwapDetails.Placeholder.d.ts +4 -0
- package/dist/components/SwapDetails/SwapDetails.Placeholder.d.ts.map +1 -0
- package/dist/components/SwapDetails/SwapDetails.d.ts +4 -0
- package/dist/components/SwapDetails/SwapDetails.d.ts.map +1 -0
- package/dist/components/SwapDetails/SwapDetails.helpers.d.ts +8 -0
- package/dist/components/SwapDetails/SwapDetails.helpers.d.ts.map +1 -0
- package/dist/components/SwapDetails/SwapDetails.styles.d.ts +2565 -0
- package/dist/components/SwapDetails/SwapDetails.styles.d.ts.map +1 -0
- package/dist/components/SwapDetails/SwapDetails.types.d.ts +19 -0
- package/dist/components/SwapDetails/SwapDetails.types.d.ts.map +1 -0
- package/dist/components/SwapDetails/index.d.ts +2 -0
- package/dist/components/SwapDetails/index.d.ts.map +1 -0
- package/dist/components/SwapDetailsAlerts/SwapDetailsAlerts.Failed.d.ts +4 -0
- package/dist/components/SwapDetailsAlerts/SwapDetailsAlerts.Failed.d.ts.map +1 -0
- package/dist/components/SwapDetailsAlerts/SwapDetailsAlerts.Warning.d.ts +4 -0
- package/dist/components/SwapDetailsAlerts/SwapDetailsAlerts.Warning.d.ts.map +1 -0
- package/dist/components/SwapDetailsAlerts/SwapDetailsAlerts.d.ts +4 -0
- package/dist/components/SwapDetailsAlerts/SwapDetailsAlerts.d.ts.map +1 -0
- package/dist/components/SwapDetailsAlerts/SwapDetailsAlerts.styles.d.ts +485 -0
- package/dist/components/SwapDetailsAlerts/SwapDetailsAlerts.styles.d.ts.map +1 -0
- package/dist/components/SwapDetailsAlerts/SwapDetailsAlerts.types.d.ts +23 -0
- package/dist/components/SwapDetailsAlerts/SwapDetailsAlerts.types.d.ts.map +1 -0
- package/dist/components/SwapDetailsAlerts/index.d.ts +3 -0
- package/dist/components/SwapDetailsAlerts/index.d.ts.map +1 -0
- package/dist/components/SwapDetailsModal/SwapDetailsCompleteModal.d.ts +4 -0
- package/dist/components/SwapDetailsModal/SwapDetailsCompleteModal.d.ts.map +1 -0
- package/dist/components/SwapDetailsModal/SwapDetailsModal.Cancel.d.ts +4 -0
- package/dist/components/SwapDetailsModal/SwapDetailsModal.Cancel.d.ts.map +1 -0
- package/dist/components/SwapDetailsModal/SwapDetailsModal.ConnectWallet.d.ts +4 -0
- package/dist/components/SwapDetailsModal/SwapDetailsModal.ConnectWallet.d.ts.map +1 -0
- package/dist/components/SwapDetailsModal/SwapDetailsModal.Delete.d.ts +4 -0
- package/dist/components/SwapDetailsModal/SwapDetailsModal.Delete.d.ts.map +1 -0
- package/dist/components/SwapDetailsModal/SwapDetailsModal.InstallWallet.d.ts +4 -0
- package/dist/components/SwapDetailsModal/SwapDetailsModal.InstallWallet.d.ts.map +1 -0
- package/dist/components/SwapDetailsModal/SwapDetailsModal.NetworkState.d.ts +4 -0
- package/dist/components/SwapDetailsModal/SwapDetailsModal.NetworkState.d.ts.map +1 -0
- package/dist/components/SwapDetailsModal/SwapDetailsModal.WalletState.d.ts +4 -0
- package/dist/components/SwapDetailsModal/SwapDetailsModal.WalletState.d.ts.map +1 -0
- package/dist/components/SwapDetailsModal/SwapDetailsModal.d.ts +4 -0
- package/dist/components/SwapDetailsModal/SwapDetailsModal.d.ts.map +1 -0
- package/dist/components/SwapDetailsModal/SwapDetailsModal.styles.d.ts +641 -0
- package/dist/components/SwapDetailsModal/SwapDetailsModal.styles.d.ts.map +1 -0
- package/dist/components/SwapDetailsModal/SwapDetailsModal.types.d.ts +71 -0
- package/dist/components/SwapDetailsModal/SwapDetailsModal.types.d.ts.map +1 -0
- package/dist/components/SwapDetailsModal/index.d.ts +4 -0
- package/dist/components/SwapDetailsModal/index.d.ts.map +1 -0
- package/dist/components/SwapMetrics/SwapMetrics.constants.d.ts +5 -0
- package/dist/components/SwapMetrics/SwapMetrics.constants.d.ts.map +1 -0
- package/dist/components/SwapMetrics/SwapMetrics.d.ts +4 -0
- package/dist/components/SwapMetrics/SwapMetrics.d.ts.map +1 -0
- package/dist/components/SwapMetrics/SwapMetrics.helpers.d.ts +11 -0
- package/dist/components/SwapMetrics/SwapMetrics.helpers.d.ts.map +1 -0
- package/dist/components/SwapMetrics/SwapMetrics.styles.d.ts +483 -0
- package/dist/components/SwapMetrics/SwapMetrics.styles.d.ts.map +1 -0
- package/dist/components/SwapMetrics/SwapMetrics.types.d.ts +27 -0
- package/dist/components/SwapMetrics/SwapMetrics.types.d.ts.map +1 -0
- package/dist/components/SwapMetrics/index.d.ts +2 -0
- package/dist/components/SwapMetrics/index.d.ts.map +1 -0
- package/dist/components/SwitchFromAndTo/SwitchFromAndTo.d.ts +3 -0
- package/dist/components/SwitchFromAndTo/SwitchFromAndTo.d.ts.map +1 -0
- package/dist/components/SwitchFromAndTo/SwitchFromAndTo.styles.d.ts +322 -0
- package/dist/components/SwitchFromAndTo/SwitchFromAndTo.styles.d.ts.map +1 -0
- package/dist/components/SwitchFromAndTo/index.d.ts +2 -0
- package/dist/components/SwitchFromAndTo/index.d.ts.map +1 -0
- package/dist/components/TokenList/LoadingTokenList.d.ts +4 -0
- package/dist/components/TokenList/LoadingTokenList.d.ts.map +1 -0
- package/dist/components/TokenList/TokenList.d.ts +4 -0
- package/dist/components/TokenList/TokenList.d.ts.map +1 -0
- package/dist/components/TokenList/TokenList.helpers.d.ts +3 -0
- package/dist/components/TokenList/TokenList.helpers.d.ts.map +1 -0
- package/dist/components/TokenList/TokenList.styles.d.ts +3208 -0
- package/dist/components/TokenList/TokenList.styles.d.ts.map +1 -0
- package/dist/components/TokenList/TokenList.types.d.ts +43 -0
- package/dist/components/TokenList/TokenList.types.d.ts.map +1 -0
- package/dist/components/TokenList/index.d.ts +2 -0
- package/dist/components/TokenList/index.d.ts.map +1 -0
- package/dist/components/WalletStatefulConnect/ConnectStatus.d.ts +4 -0
- package/dist/components/WalletStatefulConnect/ConnectStatus.d.ts.map +1 -0
- package/dist/components/WalletStatefulConnect/ConnectStatus.styles.d.ts +481 -0
- package/dist/components/WalletStatefulConnect/ConnectStatus.styles.d.ts.map +1 -0
- package/dist/components/WalletStatefulConnect/ConnectStatus.types.d.ts +8 -0
- package/dist/components/WalletStatefulConnect/ConnectStatus.types.d.ts.map +1 -0
- package/dist/components/WalletStatefulConnect/DerivationPath.d.ts +4 -0
- package/dist/components/WalletStatefulConnect/DerivationPath.d.ts.map +1 -0
- package/dist/components/WalletStatefulConnect/DerivationPath.helpers.d.ts +5 -0
- package/dist/components/WalletStatefulConnect/DerivationPath.helpers.d.ts.map +1 -0
- package/dist/components/WalletStatefulConnect/DerivationPath.styles.d.ts +768 -0
- package/dist/components/WalletStatefulConnect/DerivationPath.styles.d.ts.map +1 -0
- package/dist/components/WalletStatefulConnect/DerivationPath.types.d.ts +6 -0
- package/dist/components/WalletStatefulConnect/DerivationPath.types.d.ts.map +1 -0
- package/dist/components/WalletStatefulConnect/Detached.d.ts +4 -0
- package/dist/components/WalletStatefulConnect/Detached.d.ts.map +1 -0
- package/dist/components/WalletStatefulConnect/Detached.styles.d.ts +161 -0
- package/dist/components/WalletStatefulConnect/Detached.styles.d.ts.map +1 -0
- package/dist/components/WalletStatefulConnect/Detached.types.d.ts +14 -0
- package/dist/components/WalletStatefulConnect/Detached.types.d.ts.map +1 -0
- package/dist/components/WalletStatefulConnect/ExperimentalChain.d.ts +9 -0
- package/dist/components/WalletStatefulConnect/ExperimentalChain.d.ts.map +1 -0
- package/dist/components/WalletStatefulConnect/ExperimentalChainStatus.d.ts +4 -0
- package/dist/components/WalletStatefulConnect/ExperimentalChainStatus.d.ts.map +1 -0
- package/dist/components/WalletStatefulConnect/ExperimentalChainStatus.helpers.d.ts +8 -0
- package/dist/components/WalletStatefulConnect/ExperimentalChainStatus.helpers.d.ts.map +1 -0
- package/dist/components/WalletStatefulConnect/ExperimentalChainStatus.types.d.ts +6 -0
- package/dist/components/WalletStatefulConnect/ExperimentalChainStatus.types.d.ts.map +1 -0
- package/dist/components/WalletStatefulConnect/NamespaceDetachedItem.d.ts +4 -0
- package/dist/components/WalletStatefulConnect/NamespaceDetachedItem.d.ts.map +1 -0
- package/dist/components/WalletStatefulConnect/NamespaceListItem.d.ts +4 -0
- package/dist/components/WalletStatefulConnect/NamespaceListItem.d.ts.map +1 -0
- package/dist/components/WalletStatefulConnect/Namespaces.d.ts +4 -0
- package/dist/components/WalletStatefulConnect/Namespaces.d.ts.map +1 -0
- package/dist/components/WalletStatefulConnect/Namespaces.styles.d.ts +601 -0
- package/dist/components/WalletStatefulConnect/Namespaces.styles.d.ts.map +1 -0
- package/dist/components/WalletStatefulConnect/Namespaces.types.d.ts +33 -0
- package/dist/components/WalletStatefulConnect/Namespaces.types.d.ts.map +1 -0
- package/dist/components/WalletStatefulConnect/index.d.ts +6 -0
- package/dist/components/WalletStatefulConnect/index.d.ts.map +1 -0
- package/dist/components/common/ActivateTabAlert/ActivateTabAlert.d.ts +4 -0
- package/dist/components/common/ActivateTabAlert/ActivateTabAlert.d.ts.map +1 -0
- package/dist/components/common/ActivateTabAlert/ActivateTabAlert.types.d.ts +4 -0
- package/dist/components/common/ActivateTabAlert/ActivateTabAlert.types.d.ts.map +1 -0
- package/dist/components/common/ActivateTabAlert/index.d.ts +2 -0
- package/dist/components/common/ActivateTabAlert/index.d.ts.map +1 -0
- package/dist/components/common/ActivateTabModal/ActivateTabModal.d.ts +4 -0
- package/dist/components/common/ActivateTabModal/ActivateTabModal.d.ts.map +1 -0
- package/dist/components/common/ActivateTabModal/ActivateTabModal.types.d.ts +6 -0
- package/dist/components/common/ActivateTabModal/ActivateTabModal.types.d.ts.map +1 -0
- package/dist/components/common/ActivateTabModal/index.d.ts +2 -0
- package/dist/components/common/ActivateTabModal/index.d.ts.map +1 -0
- package/dist/components/common/WatermarkedModal/WatermarkedModal.d.ts +5 -0
- package/dist/components/common/WatermarkedModal/WatermarkedModal.d.ts.map +1 -0
- package/dist/components/common/WatermarkedModal/index.d.ts +2 -0
- package/dist/components/common/WatermarkedModal/index.d.ts.map +1 -0
- package/dist/constants/configs.d.ts +3 -0
- package/dist/constants/configs.d.ts.map +1 -0
- package/dist/constants/customTokens.d.ts +3 -0
- package/dist/constants/customTokens.d.ts.map +1 -0
- package/dist/constants/errors.d.ts +33 -0
- package/dist/constants/errors.d.ts.map +1 -0
- package/dist/constants/fonts.d.ts +7 -0
- package/dist/constants/fonts.d.ts.map +1 -0
- package/dist/constants/index.d.ts +12 -0
- package/dist/constants/index.d.ts.map +1 -0
- package/dist/constants/languages.d.ts +10 -0
- package/dist/constants/languages.d.ts.map +1 -0
- package/dist/constants/messages.d.ts +7 -0
- package/dist/constants/messages.d.ts.map +1 -0
- package/dist/constants/navigationRoutes.d.ts +19 -0
- package/dist/constants/navigationRoutes.d.ts.map +1 -0
- package/dist/constants/numbers.d.ts +3 -0
- package/dist/constants/numbers.d.ts.map +1 -0
- package/dist/constants/profileBanner.d.ts +3 -0
- package/dist/constants/profileBanner.d.ts.map +1 -0
- package/dist/constants/quote.d.ts +25 -0
- package/dist/constants/quote.d.ts.map +1 -0
- package/dist/constants/routing.d.ts +13 -0
- package/dist/constants/routing.d.ts.map +1 -0
- package/dist/constants/searchFor.d.ts +7 -0
- package/dist/constants/searchFor.d.ts.map +1 -0
- package/dist/constants/searchParams.d.ts +12 -0
- package/dist/constants/searchParams.d.ts.map +1 -0
- package/dist/constants/settings.d.ts +6 -0
- package/dist/constants/settings.d.ts.map +1 -0
- package/dist/constants/swapSettings.d.ts +6 -0
- package/dist/constants/swapSettings.d.ts.map +1 -0
- package/dist/constants/wallets.d.ts +4 -0
- package/dist/constants/wallets.d.ts.map +1 -0
- package/dist/containers/App/App.d.ts +3 -0
- package/dist/containers/App/App.d.ts.map +1 -0
- package/dist/containers/App/App.styles.d.ts +161 -0
- package/dist/containers/App/App.styles.d.ts.map +1 -0
- package/dist/containers/App/index.d.ts +2 -0
- package/dist/containers/App/index.d.ts.map +1 -0
- package/dist/containers/ExpandedQuotes/ExpandedQuotes.d.ts +5 -0
- package/dist/containers/ExpandedQuotes/ExpandedQuotes.d.ts.map +1 -0
- package/dist/containers/ExpandedQuotes/ExpandedQuotes.styles.d.ts +323 -0
- package/dist/containers/ExpandedQuotes/ExpandedQuotes.styles.d.ts.map +1 -0
- package/dist/containers/ExpandedQuotes/ExpandedQuotes.types.d.ts +9 -0
- package/dist/containers/ExpandedQuotes/ExpandedQuotes.types.d.ts.map +1 -0
- package/dist/containers/ExpandedQuotes/index.d.ts +2 -0
- package/dist/containers/ExpandedQuotes/index.d.ts.map +1 -0
- package/dist/containers/Inputs/Inputs.d.ts +4 -0
- package/dist/containers/Inputs/Inputs.d.ts.map +1 -0
- package/dist/containers/Inputs/Inputs.styles.d.ts +321 -0
- package/dist/containers/Inputs/Inputs.styles.d.ts.map +1 -0
- package/dist/containers/Inputs/Inputs.types.d.ts +8 -0
- package/dist/containers/Inputs/Inputs.types.d.ts.map +1 -0
- package/dist/containers/Inputs/index.d.ts +2 -0
- package/dist/containers/Inputs/index.d.ts.map +1 -0
- package/dist/containers/QuoteInfo/QuoteInfo.d.ts +4 -0
- package/dist/containers/QuoteInfo/QuoteInfo.d.ts.map +1 -0
- package/dist/containers/QuoteInfo/QuoteInfo.styles.d.ts +483 -0
- package/dist/containers/QuoteInfo/QuoteInfo.styles.d.ts.map +1 -0
- package/dist/containers/QuoteInfo/QuoteInfo.types.d.ts +20 -0
- package/dist/containers/QuoteInfo/QuoteInfo.types.d.ts.map +1 -0
- package/dist/containers/QuoteInfo/index.d.ts +2 -0
- package/dist/containers/QuoteInfo/index.d.ts.map +1 -0
- package/dist/containers/Refuel/Refuel.d.ts +5 -0
- package/dist/containers/Refuel/Refuel.d.ts.map +1 -0
- package/dist/containers/Refuel/Refuel.types.d.ts +5 -0
- package/dist/containers/Refuel/Refuel.types.d.ts.map +1 -0
- package/dist/containers/Refuel/index.d.ts +2 -0
- package/dist/containers/Refuel/index.d.ts.map +1 -0
- package/dist/containers/Settings/Lists.d.ts +3 -0
- package/dist/containers/Settings/Lists.d.ts.map +1 -0
- package/dist/containers/Wallets/Wallets.d.ts +6 -0
- package/dist/containers/Wallets/Wallets.d.ts.map +1 -0
- package/dist/containers/Wallets/Wallets.helpers.d.ts +4 -0
- package/dist/containers/Wallets/Wallets.helpers.d.ts.map +1 -0
- package/dist/containers/Wallets/Wallets.types.d.ts +28 -0
- package/dist/containers/Wallets/Wallets.types.d.ts.map +1 -0
- package/dist/containers/Wallets/index.d.ts +2 -0
- package/dist/containers/Wallets/index.d.ts.map +1 -0
- package/dist/containers/Wallets/useUpdates.d.ts +12 -0
- package/dist/containers/Wallets/useUpdates.d.ts.map +1 -0
- package/dist/containers/Widget/Widget.d.ts +5 -0
- package/dist/containers/Widget/Widget.d.ts.map +1 -0
- package/dist/containers/Widget/Widget.types.d.ts +5 -0
- package/dist/containers/Widget/Widget.types.d.ts.map +1 -0
- package/dist/containers/Widget/index.d.ts +3 -0
- package/dist/containers/Widget/index.d.ts.map +1 -0
- package/dist/containers/WidgetInfo/WidgetInfo.d.ts +6 -0
- package/dist/containers/WidgetInfo/WidgetInfo.d.ts.map +1 -0
- package/dist/containers/WidgetInfo/WidgetInfo.helpers.d.ts +22 -0
- package/dist/containers/WidgetInfo/WidgetInfo.helpers.d.ts.map +1 -0
- package/dist/containers/WidgetInfo/WidgetInfo.types.d.ts +34 -0
- package/dist/containers/WidgetInfo/WidgetInfo.types.d.ts.map +1 -0
- package/dist/containers/WidgetInfo/index.d.ts +2 -0
- package/dist/containers/WidgetInfo/index.d.ts.map +1 -0
- package/dist/containers/WidgetProvider/WidgetProvider.d.ts +5 -0
- package/dist/containers/WidgetProvider/WidgetProvider.d.ts.map +1 -0
- package/dist/containers/WidgetProvider/WidgetProvider.types.d.ts +7 -0
- package/dist/containers/WidgetProvider/WidgetProvider.types.d.ts.map +1 -0
- package/dist/containers/WidgetProvider/index.d.ts +2 -0
- package/dist/containers/WidgetProvider/index.d.ts.map +1 -0
- package/dist/globalStyles.d.ts +2 -0
- package/dist/globalStyles.d.ts.map +1 -0
- package/dist/hooks/useBootstrap/index.d.ts +2 -0
- package/dist/hooks/useBootstrap/index.d.ts.map +1 -0
- package/dist/hooks/useBootstrap/useBootstrap.d.ts +2 -0
- package/dist/hooks/useBootstrap/useBootstrap.d.ts.map +1 -0
- package/dist/hooks/useConfirmSwap/index.d.ts +2 -0
- package/dist/hooks/useConfirmSwap/index.d.ts.map +1 -0
- package/dist/hooks/useConfirmSwap/useConfirmSwap.d.ts +3 -0
- package/dist/hooks/useConfirmSwap/useConfirmSwap.d.ts.map +1 -0
- package/dist/hooks/useConfirmSwap/useConfirmSwap.helpers.d.ts +23 -0
- package/dist/hooks/useConfirmSwap/useConfirmSwap.helpers.d.ts.map +1 -0
- package/dist/hooks/useConfirmSwap/useConfirmSwap.types.d.ts +17 -0
- package/dist/hooks/useConfirmSwap/useConfirmSwap.types.d.ts.map +1 -0
- package/dist/hooks/useFetch.d.ts +12 -0
- package/dist/hooks/useFetch.d.ts.map +1 -0
- package/dist/hooks/useFetchAllQuotes.d.ts +4 -0
- package/dist/hooks/useFetchAllQuotes.d.ts.map +1 -0
- package/dist/hooks/useFetchApiConfig.d.ts +7 -0
- package/dist/hooks/useFetchApiConfig.d.ts.map +1 -0
- package/dist/hooks/useFetchConfirmQuote.d.ts +4 -0
- package/dist/hooks/useFetchConfirmQuote.d.ts.map +1 -0
- package/dist/hooks/useFetchCustomToken.d.ts +20 -0
- package/dist/hooks/useFetchCustomToken.d.ts.map +1 -0
- package/dist/hooks/useFontLoader.d.ts +5 -0
- package/dist/hooks/useFontLoader.d.ts.map +1 -0
- package/dist/hooks/useForceAutoConnect.d.ts +2 -0
- package/dist/hooks/useForceAutoConnect.d.ts.map +1 -0
- package/dist/hooks/useIframe/index.d.ts +2 -0
- package/dist/hooks/useIframe/index.d.ts.map +1 -0
- package/dist/hooks/useIframe/useIframe.d.ts +9 -0
- package/dist/hooks/useIframe/useIframe.d.ts.map +1 -0
- package/dist/hooks/useIframe/useIframe.helpers.d.ts +2 -0
- package/dist/hooks/useIframe/useIframe.helpers.d.ts.map +1 -0
- package/dist/hooks/useIframe/useIframe.types.d.ts +10 -0
- package/dist/hooks/useIframe/useIframe.types.d.ts.map +1 -0
- package/dist/hooks/useLanguage.d.ts +12 -0
- package/dist/hooks/useLanguage.d.ts.map +1 -0
- package/dist/hooks/useNavigateBack.d.ts +2 -0
- package/dist/hooks/useNavigateBack.d.ts.map +1 -0
- package/dist/hooks/usePrepareBlockchainList/index.d.ts +2 -0
- package/dist/hooks/usePrepareBlockchainList/index.d.ts.map +1 -0
- package/dist/hooks/usePrepareBlockchainList/usePrepareBlockchainList.constants.d.ts +2 -0
- package/dist/hooks/usePrepareBlockchainList/usePrepareBlockchainList.constants.d.ts.map +1 -0
- package/dist/hooks/usePrepareBlockchainList/usePrepareBlockchainList.d.ts +10 -0
- package/dist/hooks/usePrepareBlockchainList/usePrepareBlockchainList.d.ts.map +1 -0
- package/dist/hooks/usePrepareBlockchainList/usePrepareBlockchainList.helpers.d.ts +8 -0
- package/dist/hooks/usePrepareBlockchainList/usePrepareBlockchainList.helpers.d.ts.map +1 -0
- package/dist/hooks/usePrepareBlockchainList/usePrepareBlockchainList.mock.d.ts +4 -0
- package/dist/hooks/usePrepareBlockchainList/usePrepareBlockchainList.mock.d.ts.map +1 -0
- package/dist/hooks/usePrepareBlockchainList/usePrepareBlockchainList.test.d.ts +2 -0
- package/dist/hooks/usePrepareBlockchainList/usePrepareBlockchainList.test.d.ts.map +1 -0
- package/dist/hooks/usePrepareBlockchainList/usePrepareBlockchainList.types.d.ts +15 -0
- package/dist/hooks/usePrepareBlockchainList/usePrepareBlockchainList.types.d.ts.map +1 -0
- package/dist/hooks/usePrevious.d.ts +2 -0
- package/dist/hooks/usePrevious.d.ts.map +1 -0
- package/dist/hooks/useScreenDetect.d.ts +9 -0
- package/dist/hooks/useScreenDetect.d.ts.map +1 -0
- package/dist/hooks/useSearchCustomTokens/index.d.ts +2 -0
- package/dist/hooks/useSearchCustomTokens/index.d.ts.map +1 -0
- package/dist/hooks/useSearchCustomTokens/types.d.ts +9 -0
- package/dist/hooks/useSearchCustomTokens/types.d.ts.map +1 -0
- package/dist/hooks/useSearchCustomTokens/useSearchCustomTokens.constants.d.ts +2 -0
- package/dist/hooks/useSearchCustomTokens/useSearchCustomTokens.constants.d.ts.map +1 -0
- package/dist/hooks/useSearchCustomTokens/useSearchCustomTokens.d.ts +3 -0
- package/dist/hooks/useSearchCustomTokens/useSearchCustomTokens.d.ts.map +1 -0
- package/dist/hooks/useStatefulConnect/index.d.ts +6 -0
- package/dist/hooks/useStatefulConnect/index.d.ts.map +1 -0
- package/dist/hooks/useStatefulConnect/useStatefulConnect.d.ts +27 -0
- package/dist/hooks/useStatefulConnect/useStatefulConnect.d.ts.map +1 -0
- package/dist/hooks/useStatefulConnect/useStatefulConnect.helpers.d.ts +8 -0
- package/dist/hooks/useStatefulConnect/useStatefulConnect.helpers.d.ts.map +1 -0
- package/dist/hooks/useStatefulConnect/useStatefulConnect.state.d.ts +14 -0
- package/dist/hooks/useStatefulConnect/useStatefulConnect.state.d.ts.map +1 -0
- package/dist/hooks/useStatefulConnect/useStatefulConnect.types.d.ts +57 -0
- package/dist/hooks/useStatefulConnect/useStatefulConnect.types.d.ts.map +1 -0
- package/dist/hooks/useSubscribeToWidgetEvents/index.d.ts +2 -0
- package/dist/hooks/useSubscribeToWidgetEvents/index.d.ts.map +1 -0
- package/dist/hooks/useSubscribeToWidgetEvents/useSubscribeToWidgetEvents.d.ts +2 -0
- package/dist/hooks/useSubscribeToWidgetEvents/useSubscribeToWidgetEvents.d.ts.map +1 -0
- package/dist/hooks/useSwapInput.d.ts +14 -0
- package/dist/hooks/useSwapInput.d.ts.map +1 -0
- package/dist/hooks/useSwapMode.d.ts +11 -0
- package/dist/hooks/useSwapMode.d.ts.map +1 -0
- package/dist/hooks/useSyncNotifications/index.d.ts +2 -0
- package/dist/hooks/useSyncNotifications/index.d.ts.map +1 -0
- package/dist/hooks/useSyncNotifications/useSyncNotifications.d.ts +2 -0
- package/dist/hooks/useSyncNotifications/useSyncNotifications.d.ts.map +1 -0
- package/dist/hooks/useSyncStoresWithConfig.d.ts +2 -0
- package/dist/hooks/useSyncStoresWithConfig.d.ts.map +1 -0
- package/dist/hooks/useSyncUrlAndStore/index.d.ts +2 -0
- package/dist/hooks/useSyncUrlAndStore/index.d.ts.map +1 -0
- package/dist/hooks/useSyncUrlAndStore/useSyncUrlAndStore.d.ts +2 -0
- package/dist/hooks/useSyncUrlAndStore/useSyncUrlAndStore.d.ts.map +1 -0
- package/dist/hooks/useSyncUrlAndStore/useSyncUrlAndStore.helpers.d.ts +4 -0
- package/dist/hooks/useSyncUrlAndStore/useSyncUrlAndStore.helpers.d.ts.map +1 -0
- package/dist/hooks/useTheme.d.ts +6 -0
- package/dist/hooks/useTheme.d.ts.map +1 -0
- package/dist/hooks/useUpdateQuoteInputs/index.d.ts +2 -0
- package/dist/hooks/useUpdateQuoteInputs/index.d.ts.map +1 -0
- package/dist/hooks/useUpdateQuoteInputs/useUpdateQuoteInputs.d.ts +3 -0
- package/dist/hooks/useUpdateQuoteInputs/useUpdateQuoteInputs.d.ts.map +1 -0
- package/dist/hooks/useWalletList.d.ts +18 -0
- package/dist/hooks/useWalletList.d.ts.map +1 -0
- package/dist/hooks/useWalletProviders/index.d.ts +2 -0
- package/dist/hooks/useWalletProviders/index.d.ts.map +1 -0
- package/dist/hooks/useWalletProviders/useWalletProviders.d.ts +6 -0
- package/dist/hooks/useWalletProviders/useWalletProviders.d.ts.map +1 -0
- package/dist/hooks/useWalletProviders/useWalletProviders.helpers.d.ts +4 -0
- package/dist/hooks/useWalletProviders/useWalletProviders.helpers.d.ts.map +1 -0
- package/dist/hooks/useWidgetEvents/index.d.ts +2 -0
- package/dist/hooks/useWidgetEvents/index.d.ts.map +1 -0
- package/dist/hooks/useWidgetEvents/useWidgetEvents.d.ts +3 -0
- package/dist/hooks/useWidgetEvents/useWidgetEvents.d.ts.map +1 -0
- package/dist/index.d.ts +55 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +3 -0
- package/dist/index.js.map +7 -0
- package/dist/libs/tabManager/index.d.ts +3 -0
- package/dist/libs/tabManager/index.d.ts.map +1 -0
- package/dist/libs/tabManager/tabManager.constants.d.ts +4 -0
- package/dist/libs/tabManager/tabManager.constants.d.ts.map +1 -0
- package/dist/libs/tabManager/tabManager.d.ts +64 -0
- package/dist/libs/tabManager/tabManager.d.ts.map +1 -0
- package/dist/libs/tabManager/tabManager.types.d.ts +30 -0
- package/dist/libs/tabManager/tabManager.types.d.ts.map +1 -0
- package/dist/pages/AddCustomTokenPage.d.ts +3 -0
- package/dist/pages/AddCustomTokenPage.d.ts.map +1 -0
- package/dist/pages/ConfirmSwapPage.d.ts +3 -0
- package/dist/pages/ConfirmSwapPage.d.ts.map +1 -0
- package/dist/pages/CustomTokensPage.d.ts +3 -0
- package/dist/pages/CustomTokensPage.d.ts.map +1 -0
- package/dist/pages/HistoryPage.d.ts +3 -0
- package/dist/pages/HistoryPage.d.ts.map +1 -0
- package/dist/pages/Home.d.ts +4 -0
- package/dist/pages/Home.d.ts.map +1 -0
- package/dist/pages/LanguagePage.d.ts +3 -0
- package/dist/pages/LanguagePage.d.ts.map +1 -0
- package/dist/pages/LiquiditySourcePage.d.ts +7 -0
- package/dist/pages/LiquiditySourcePage.d.ts.map +1 -0
- package/dist/pages/Routes.d.ts +3 -0
- package/dist/pages/Routes.d.ts.map +1 -0
- package/dist/pages/SelectBlockchainPage.d.ts +8 -0
- package/dist/pages/SelectBlockchainPage.d.ts.map +1 -0
- package/dist/pages/SelectSwapItemPage/SelectSwapItemPage.constants.d.ts +3 -0
- package/dist/pages/SelectSwapItemPage/SelectSwapItemPage.constants.d.ts.map +1 -0
- package/dist/pages/SelectSwapItemPage/SelectSwapItemPage.helpers.d.ts +4 -0
- package/dist/pages/SelectSwapItemPage/SelectSwapItemPage.helpers.d.ts.map +1 -0
- package/dist/pages/SelectSwapItemPage/SelectSwapItemsPage.d.ts +7 -0
- package/dist/pages/SelectSwapItemPage/SelectSwapItemsPage.d.ts.map +1 -0
- package/dist/pages/SelectSwapItemPage/index.d.ts +2 -0
- package/dist/pages/SelectSwapItemPage/index.d.ts.map +1 -0
- package/dist/pages/SettingsPage.d.ts +3 -0
- package/dist/pages/SettingsPage.d.ts.map +1 -0
- package/dist/pages/SwapDetailsPage.d.ts +3 -0
- package/dist/pages/SwapDetailsPage.d.ts.map +1 -0
- package/dist/pages/WalletsPage.d.ts +3 -0
- package/dist/pages/WalletsPage.d.ts.map +1 -0
- package/dist/services/cacheService.d.ts +21 -0
- package/dist/services/cacheService.d.ts.map +1 -0
- package/dist/services/eventEmitter.d.ts +4 -0
- package/dist/services/eventEmitter.d.ts.map +1 -0
- package/dist/services/httpService.d.ts +3 -0
- package/dist/services/httpService.d.ts.map +1 -0
- package/dist/store/AppStore.d.ts +51 -0
- package/dist/store/AppStore.d.ts.map +1 -0
- package/dist/store/app.d.ts +47 -0
- package/dist/store/app.d.ts.map +1 -0
- package/dist/store/middlewares/keepLastUpdated.d.ts +8 -0
- package/dist/store/middlewares/keepLastUpdated.d.ts.map +1 -0
- package/dist/store/notification.d.ts +59 -0
- package/dist/store/notification.d.ts.map +1 -0
- package/dist/store/quote.d.ts +238 -0
- package/dist/store/quote.d.ts.map +1 -0
- package/dist/store/selectors.d.ts +12 -0
- package/dist/store/selectors.d.ts.map +1 -0
- package/dist/store/slices/config.d.ts +32 -0
- package/dist/store/slices/config.d.ts.map +1 -0
- package/dist/store/slices/data.d.ts +36 -0
- package/dist/store/slices/data.d.ts.map +1 -0
- package/dist/store/slices/data.test.d.ts +2 -0
- package/dist/store/slices/data.test.d.ts.map +1 -0
- package/dist/store/slices/settings.d.ts +49 -0
- package/dist/store/slices/settings.d.ts.map +1 -0
- package/dist/store/slices/types.d.ts +6 -0
- package/dist/store/slices/types.d.ts.map +1 -0
- package/dist/store/slices/wallets.d.ts +95 -0
- package/dist/store/slices/wallets.d.ts.map +1 -0
- package/dist/store/ui.d.ts +37 -0
- package/dist/store/ui.d.ts.map +1 -0
- package/dist/store/utils/data.d.ts +23 -0
- package/dist/store/utils/data.d.ts.map +1 -0
- package/dist/store/utils/data.test.d.ts +2 -0
- package/dist/store/utils/data.test.d.ts.map +1 -0
- package/dist/store/utils/index.d.ts +2 -0
- package/dist/store/utils/index.d.ts.map +1 -0
- package/dist/store/utils/wallets.d.ts +37 -0
- package/dist/store/utils/wallets.d.ts.map +1 -0
- package/dist/test-utils/fixtures.d.ts +31 -0
- package/dist/test-utils/fixtures.d.ts.map +1 -0
- package/dist/types/config.d.ts +261 -0
- package/dist/types/config.d.ts.map +1 -0
- package/dist/types/event.d.ts +74 -0
- package/dist/types/event.d.ts.map +1 -0
- package/dist/types/index.d.ts +6 -0
- package/dist/types/index.d.ts.map +1 -0
- package/dist/types/notification.d.ts +21 -0
- package/dist/types/notification.d.ts.map +1 -0
- package/dist/types/quote.d.ts +100 -0
- package/dist/types/quote.d.ts.map +1 -0
- package/dist/types/swap.d.ts +14 -0
- package/dist/types/swap.d.ts.map +1 -0
- package/dist/types/wallets.d.ts +25 -0
- package/dist/types/wallets.d.ts.map +1 -0
- package/dist/utils/colors.d.ts +10 -0
- package/dist/utils/colors.d.ts.map +1 -0
- package/dist/utils/common.d.ts +22 -0
- package/dist/utils/common.d.ts.map +1 -0
- package/dist/utils/configs.d.ts +23 -0
- package/dist/utils/configs.d.ts.map +1 -0
- package/dist/utils/date.d.ts +3 -0
- package/dist/utils/date.d.ts.map +1 -0
- package/dist/utils/events.d.ts +8 -0
- package/dist/utils/events.d.ts.map +1 -0
- package/dist/utils/hash.d.ts +2 -0
- package/dist/utils/hash.d.ts.map +1 -0
- package/dist/utils/meta.d.ts +11 -0
- package/dist/utils/meta.d.ts.map +1 -0
- package/dist/utils/numbers.d.ts +13 -0
- package/dist/utils/numbers.d.ts.map +1 -0
- package/dist/utils/providers.d.ts +25 -0
- package/dist/utils/providers.d.ts.map +1 -0
- package/dist/utils/queue.d.ts +4 -0
- package/dist/utils/queue.d.ts.map +1 -0
- package/dist/utils/quote.d.ts +32 -0
- package/dist/utils/quote.d.ts.map +1 -0
- package/dist/utils/sanitizers.d.ts +27 -0
- package/dist/utils/sanitizers.d.ts.map +1 -0
- package/dist/utils/sanitizers.test.d.ts +2 -0
- package/dist/utils/sanitizers.test.d.ts.map +1 -0
- package/dist/utils/settings.d.ts +20 -0
- package/dist/utils/settings.d.ts.map +1 -0
- package/dist/utils/swap.d.ts +89 -0
- package/dist/utils/swap.d.ts.map +1 -0
- package/dist/utils/time.d.ts +4 -0
- package/dist/utils/time.d.ts.map +1 -0
- package/dist/utils/ui.d.ts +19 -0
- package/dist/utils/ui.d.ts.map +1 -0
- package/dist/utils/validation.d.ts +26 -0
- package/dist/utils/validation.d.ts.map +1 -0
- package/dist/utils/validation.test.d.ts +2 -0
- package/dist/utils/validation.test.d.ts.map +1 -0
- package/dist/utils/wallets.d.ts +36 -0
- package/dist/utils/wallets.d.ts.map +1 -0
- package/dist/widget-embedded.build.json +1 -0
- package/package.json +57 -0
- package/readme.md +4 -0
- package/src/QueueManager.tsx +120 -0
- package/src/components/AppRouter.tsx +11 -0
- package/src/components/AppRoutes.tsx +137 -0
- package/src/components/BlockchainList/BlockchainList.helpers.ts +18 -0
- package/src/components/BlockchainList/BlockchainList.styles.ts +22 -0
- package/src/components/BlockchainList/BlockchainList.tsx +86 -0
- package/src/components/BlockchainList/BlockchainList.types.ts +9 -0
- package/src/components/BlockchainList/LoadingBlockchainList.tsx +20 -0
- package/src/components/BlockchainList/index.ts +1 -0
- package/src/components/BlockchainSelectorButton/BlockchainSelectorButton.styles.ts +49 -0
- package/src/components/BlockchainSelectorButton/BlockchainSelectorButton.tsx +48 -0
- package/src/components/BlockchainSelectorButton/BlockchainSelectorButton.types.ts +11 -0
- package/src/components/BlockchainSelectorButton/index.ts +1 -0
- package/src/components/BlockchainsSection/BlockchainsSection.styles.ts +7 -0
- package/src/components/BlockchainsSection/BlockchainsSection.tsx +134 -0
- package/src/components/BlockchainsSection/BlockchainsSection.types.ts +9 -0
- package/src/components/BlockchainsSection/index.ts +1 -0
- package/src/components/ConfirmWalletsModal/ConfirmWallets.styles.ts +57 -0
- package/src/components/ConfirmWalletsModal/ConfirmWalletsModal.tsx +485 -0
- package/src/components/ConfirmWalletsModal/ConfirmWalletsModal.types.ts +9 -0
- package/src/components/ConfirmWalletsModal/WalletList.styles.ts +34 -0
- package/src/components/ConfirmWalletsModal/WalletList.tsx +283 -0
- package/src/components/ConfirmWalletsModal/WalletList.type.ts +11 -0
- package/src/components/CustomCollapsible/CustomCollapsible.styles.ts +76 -0
- package/src/components/CustomCollapsible/CustomCollapsible.tsx +46 -0
- package/src/components/CustomCollapsible/CustomCollapsible.types.ts +10 -0
- package/src/components/CustomDestination/CustomDestination.styles.ts +47 -0
- package/src/components/CustomDestination/CustomDestination.tsx +157 -0
- package/src/components/CustomDestination/CustomDestination.types.ts +7 -0
- package/src/components/CustomTokenModal/CustomTokenModal.constants.ts +2 -0
- package/src/components/CustomTokenModal/CustomTokenModal.helpers.ts +19 -0
- package/src/components/CustomTokenModal/CustomTokenModal.styles.ts +74 -0
- package/src/components/CustomTokenModal/CustomTokenModal.tsx +131 -0
- package/src/components/CustomTokenModal/CustomTokenModal.types.ts +10 -0
- package/src/components/CustomTokenModal/index.ts +1 -0
- package/src/components/FilterSelector/FilterSelector.style.ts +95 -0
- package/src/components/FilterSelector/FilterSelector.tsx +43 -0
- package/src/components/FilterSelector/FilterSelector.type.ts +15 -0
- package/src/components/FilterSelector/FilterSelectorContent.tsx +65 -0
- package/src/components/FilterSelector/index.ts +1 -0
- package/src/components/HeaderButtons/BackButton.tsx +20 -0
- package/src/components/HeaderButtons/CancelButton.tsx +25 -0
- package/src/components/HeaderButtons/HeaderButtons.styles.ts +96 -0
- package/src/components/HeaderButtons/HeaderButtons.tsx +106 -0
- package/src/components/HeaderButtons/HeaderButtons.types.ts +12 -0
- package/src/components/HeaderButtons/InProgressTransactionBadge.tsx +26 -0
- package/src/components/HeaderButtons/NotificationsBadge.tsx +32 -0
- package/src/components/HeaderButtons/RefreshButton.tsx +83 -0
- package/src/components/HeaderButtons/WalletButton.tsx +49 -0
- package/src/components/HeaderButtons/index.ts +4 -0
- package/src/components/HistoryGroupedList/HistoryGroupedList.helpers.ts +19 -0
- package/src/components/HistoryGroupedList/HistoryGroupedList.styles.ts +44 -0
- package/src/components/HistoryGroupedList/HistoryGroupedList.tsx +174 -0
- package/src/components/HistoryGroupedList/HistoryGroupedList.types.ts +14 -0
- package/src/components/HistoryGroupedList/index.ts +1 -0
- package/src/components/ImportCustomToken/ImportCustomToken.tsx +121 -0
- package/src/components/ImportCustomToken/ImportCustomToken.types.ts +18 -0
- package/src/components/ImportCustomToken/index.ts +1 -0
- package/src/components/Layout/Layout.constants.ts +5 -0
- package/src/components/Layout/Layout.helpers.ts +16 -0
- package/src/components/Layout/Layout.styles.ts +79 -0
- package/src/components/Layout/Layout.tsx +226 -0
- package/src/components/Layout/Layout.types.ts +21 -0
- package/src/components/Layout/PageContainer.tsx +24 -0
- package/src/components/Layout/ScrollableArea.tsx +11 -0
- package/src/components/Layout/index.ts +3 -0
- package/src/components/LoadingLiquiditySourceList/LoadingLiquiditySourceList.styles.ts +5 -0
- package/src/components/LoadingLiquiditySourceList/LoadingLiquiditySourceList.tsx +23 -0
- package/src/components/LoadingLiquiditySourceList/index.ts +1 -0
- package/src/components/LoadingSwapDetails/LoadingSwapDetails.styles.ts +76 -0
- package/src/components/LoadingSwapDetails/LoadingSwapDetails.tsx +47 -0
- package/src/components/LoadingSwapDetails/index.ts +1 -0
- package/src/components/NamespaceItem/NamespaceItem.helpers.ts +9 -0
- package/src/components/NamespaceItem/NamespaceItem.styles.ts +93 -0
- package/src/components/NamespaceItem/NamespaceItem.tsx +117 -0
- package/src/components/NamespaceItem/NamespaceItem.types.ts +14 -0
- package/src/components/NamespaceItem/NamespaceUnsupportedItem.tsx +42 -0
- package/src/components/NamespaceItem/SupportedChainsList.styles.ts +25 -0
- package/src/components/NamespaceItem/SupportedChainsList.tsx +58 -0
- package/src/components/NamespaceItem/SupportedChainsList.types.ts +5 -0
- package/src/components/NamespaceItem/index.ts +1 -0
- package/src/components/NoResult/NoResult.helpers.ts +69 -0
- package/src/components/NoResult/NoResult.styles.ts +33 -0
- package/src/components/NoResult/NoResult.tsx +93 -0
- package/src/components/NoResult/NoResult.types.ts +24 -0
- package/src/components/NoResult/index.ts +1 -0
- package/src/components/NotificationContent/NotificationContent.tsx +37 -0
- package/src/components/NotificationContent/index.ts +1 -0
- package/src/components/Quote/Quote.styles.ts +401 -0
- package/src/components/Quote/Quote.tsx +554 -0
- package/src/components/Quote/Quote.types.ts +55 -0
- package/src/components/Quote/QuoteCostDetails.styles.ts +49 -0
- package/src/components/Quote/QuoteCostDetails.tsx +235 -0
- package/src/components/Quote/QuoteSummary.styles.ts +16 -0
- package/src/components/Quote/QuoteSummary.tsx +64 -0
- package/src/components/Quote/QuoteTrigger.tsx +216 -0
- package/src/components/Quote/index.ts +2 -0
- package/src/components/QuoteSkeleton/QuoteSkeleton.styles.ts +50 -0
- package/src/components/QuoteSkeleton/QuoteSkeleton.tsx +30 -0
- package/src/components/QuoteSkeleton/QuoteSkeleton.types.ts +7 -0
- package/src/components/QuoteSkeleton/QuoteSummarySkeleton.styles.ts +55 -0
- package/src/components/QuoteSkeleton/QuoteSummarySkeleton.tsx +96 -0
- package/src/components/QuoteSkeleton/QuoteSummarySkeleton.types.ts +6 -0
- package/src/components/QuoteSkeleton/StepSkeleton.styles.ts +40 -0
- package/src/components/QuoteSkeleton/StepSkeleton.tsx +44 -0
- package/src/components/QuoteSkeleton/StepSkeleton.types.ts +1 -0
- package/src/components/QuoteSkeleton/index.ts +3 -0
- package/src/components/QuoteWarningsAndErrors/HighValueLossWarningModal.tsx +105 -0
- package/src/components/QuoteWarningsAndErrors/QuoteErrorsModalItem.tsx +40 -0
- package/src/components/QuoteWarningsAndErrors/QuoteWarningsAndErrors.helpers.ts +119 -0
- package/src/components/QuoteWarningsAndErrors/QuoteWarningsAndErrors.styles.ts +57 -0
- package/src/components/QuoteWarningsAndErrors/QuoteWarningsAndErrors.tsx +142 -0
- package/src/components/QuoteWarningsAndErrors/QuoteWarningsAndErrors.types.ts +28 -0
- package/src/components/QuoteWarningsAndErrors/SlippageWariningModal.tsx +83 -0
- package/src/components/QuoteWarningsAndErrors/UnknownPriceWarningModal.tsx +45 -0
- package/src/components/QuoteWarningsAndErrors/index.ts +1 -0
- package/src/components/Quotes/Quotes.styles.ts +18 -0
- package/src/components/Quotes/Quotes.tsx +154 -0
- package/src/components/Quotes/Quotes.types.ts +11 -0
- package/src/components/Quotes/SelectStrategy.tsx +51 -0
- package/src/components/Quotes/index.ts +1 -0
- package/src/components/RefreshModal/RefreshModal.styles.ts +9 -0
- package/src/components/RefreshModal/RefreshModal.tsx +41 -0
- package/src/components/RefreshModal/RefreshModal.types.ts +4 -0
- package/src/components/RefreshModal/index.ts +1 -0
- package/src/components/SameTokensWarning/SameTokensWarning.styles.ts +7 -0
- package/src/components/SameTokensWarning/SameTokensWarning.tsx +31 -0
- package/src/components/SameTokensWarning/index.ts +1 -0
- package/src/components/SearchInput/SearchInput.styles.ts +21 -0
- package/src/components/SearchInput/SearchInput.tsx +62 -0
- package/src/components/SearchInput/SearchInput.types.ts +14 -0
- package/src/components/SearchInput/index.ts +1 -0
- package/src/components/SettingsContainer/SettingsContainer.style.ts +30 -0
- package/src/components/SettingsContainer/index.ts +5 -0
- package/src/components/Slippage/Slippage.styles.ts +35 -0
- package/src/components/Slippage/Slippage.tsx +134 -0
- package/src/components/Slippage/SlippageTooltipContent.tsx +23 -0
- package/src/components/Slippage/index.ts +1 -0
- package/src/components/SlippageWarningsAndErrors/SlippageWarningsAndErrors.helpers.ts +33 -0
- package/src/components/SlippageWarningsAndErrors/SlippageWarningsAndErrors.tsx +48 -0
- package/src/components/SlippageWarningsAndErrors/SlippageWarningsAndErrors.types.ts +3 -0
- package/src/components/StatefulConnectModal/StatefulConnectModal.tsx +215 -0
- package/src/components/StatefulConnectModal/helpers.ts +29 -0
- package/src/components/StatefulConnectModal/index.ts +2 -0
- package/src/components/SwapDetails/RequestIdRow.tsx +73 -0
- package/src/components/SwapDetails/SwapDateRow.tsx +21 -0
- package/src/components/SwapDetails/SwapDetails.Placeholder.tsx +71 -0
- package/src/components/SwapDetails/SwapDetails.helpers.tsx +138 -0
- package/src/components/SwapDetails/SwapDetails.styles.ts +115 -0
- package/src/components/SwapDetails/SwapDetails.tsx +554 -0
- package/src/components/SwapDetails/SwapDetails.types.ts +19 -0
- package/src/components/SwapDetails/index.ts +1 -0
- package/src/components/SwapDetailsAlerts/SwapDetailsAlerts.Failed.tsx +46 -0
- package/src/components/SwapDetailsAlerts/SwapDetailsAlerts.Warning.tsx +67 -0
- package/src/components/SwapDetailsAlerts/SwapDetailsAlerts.styles.ts +31 -0
- package/src/components/SwapDetailsAlerts/SwapDetailsAlerts.tsx +90 -0
- package/src/components/SwapDetailsAlerts/SwapDetailsAlerts.types.ts +31 -0
- package/src/components/SwapDetailsAlerts/index.ts +2 -0
- package/src/components/SwapDetailsModal/SwapDetailsCompleteModal.tsx +140 -0
- package/src/components/SwapDetailsModal/SwapDetailsModal.Cancel.tsx +36 -0
- package/src/components/SwapDetailsModal/SwapDetailsModal.ConnectWallet.tsx +177 -0
- package/src/components/SwapDetailsModal/SwapDetailsModal.Delete.tsx +38 -0
- package/src/components/SwapDetailsModal/SwapDetailsModal.InstallWallet.tsx +52 -0
- package/src/components/SwapDetailsModal/SwapDetailsModal.NetworkState.tsx +31 -0
- package/src/components/SwapDetailsModal/SwapDetailsModal.WalletState.tsx +49 -0
- package/src/components/SwapDetailsModal/SwapDetailsModal.styles.ts +29 -0
- package/src/components/SwapDetailsModal/SwapDetailsModal.tsx +61 -0
- package/src/components/SwapDetailsModal/SwapDetailsModal.types.ts +84 -0
- package/src/components/SwapDetailsModal/index.ts +3 -0
- package/src/components/SwapMetrics/SwapMetrics.constants.ts +4 -0
- package/src/components/SwapMetrics/SwapMetrics.helpers.ts +80 -0
- package/src/components/SwapMetrics/SwapMetrics.styles.ts +32 -0
- package/src/components/SwapMetrics/SwapMetrics.tsx +134 -0
- package/src/components/SwapMetrics/SwapMetrics.types.ts +26 -0
- package/src/components/SwapMetrics/index.ts +1 -0
- package/src/components/SwitchFromAndTo/SwitchFromAndTo.styles.ts +48 -0
- package/src/components/SwitchFromAndTo/SwitchFromAndTo.tsx +33 -0
- package/src/components/SwitchFromAndTo/index.ts +1 -0
- package/src/components/TokenList/LoadingTokenList.tsx +34 -0
- package/src/components/TokenList/TokenList.helpers.ts +11 -0
- package/src/components/TokenList/TokenList.styles.ts +211 -0
- package/src/components/TokenList/TokenList.tsx +390 -0
- package/src/components/TokenList/TokenList.types.ts +51 -0
- package/src/components/TokenList/index.ts +1 -0
- package/src/components/WalletStatefulConnect/ConnectStatus.styles.ts +38 -0
- package/src/components/WalletStatefulConnect/ConnectStatus.tsx +66 -0
- package/src/components/WalletStatefulConnect/ConnectStatus.types.ts +11 -0
- package/src/components/WalletStatefulConnect/DerivationPath.helpers.ts +24 -0
- package/src/components/WalletStatefulConnect/DerivationPath.styles.ts +21 -0
- package/src/components/WalletStatefulConnect/DerivationPath.tsx +147 -0
- package/src/components/WalletStatefulConnect/DerivationPath.types.ts +6 -0
- package/src/components/WalletStatefulConnect/Detached.styles.ts +6 -0
- package/src/components/WalletStatefulConnect/Detached.tsx +193 -0
- package/src/components/WalletStatefulConnect/Detached.types.ts +13 -0
- package/src/components/WalletStatefulConnect/ExperimentalChain.tsx +39 -0
- package/src/components/WalletStatefulConnect/ExperimentalChainStatus.helpers.ts +53 -0
- package/src/components/WalletStatefulConnect/ExperimentalChainStatus.tsx +36 -0
- package/src/components/WalletStatefulConnect/ExperimentalChainStatus.types.ts +5 -0
- package/src/components/WalletStatefulConnect/NamespaceDetachedItem.tsx +100 -0
- package/src/components/WalletStatefulConnect/NamespaceListItem.tsx +24 -0
- package/src/components/WalletStatefulConnect/Namespaces.styles.ts +11 -0
- package/src/components/WalletStatefulConnect/Namespaces.tsx +194 -0
- package/src/components/WalletStatefulConnect/Namespaces.types.tsx +39 -0
- package/src/components/WalletStatefulConnect/index.ts +5 -0
- package/src/components/common/ActivateTabAlert/ActivateTabAlert.tsx +25 -0
- package/src/components/common/ActivateTabAlert/ActivateTabAlert.types.ts +3 -0
- package/src/components/common/ActivateTabAlert/index.ts +1 -0
- package/src/components/common/ActivateTabModal/ActivateTabModal.tsx +39 -0
- package/src/components/common/ActivateTabModal/ActivateTabModal.types.ts +5 -0
- package/src/components/common/ActivateTabModal/index.ts +1 -0
- package/src/components/common/WatermarkedModal/WatermarkedModal.tsx +18 -0
- package/src/components/common/WatermarkedModal/index.ts +1 -0
- package/src/constants/configs.ts +2 -0
- package/src/constants/customTokens.ts +9 -0
- package/src/constants/errors.ts +62 -0
- package/src/constants/fonts.ts +85 -0
- package/src/constants/index.ts +11 -0
- package/src/constants/languages.ts +100 -0
- package/src/constants/messages.ts +10 -0
- package/src/constants/navigationRoutes.ts +18 -0
- package/src/constants/numbers.ts +3 -0
- package/src/constants/profileBanner.ts +3 -0
- package/src/constants/quote.ts +60 -0
- package/src/constants/routing.ts +17 -0
- package/src/constants/searchFor.ts +6 -0
- package/src/constants/searchParams.ts +18 -0
- package/src/constants/settings.ts +5 -0
- package/src/constants/swapSettings.ts +13 -0
- package/src/constants/wallets.ts +5 -0
- package/src/containers/App/App.styles.ts +16 -0
- package/src/containers/App/App.tsx +25 -0
- package/src/containers/App/index.ts +1 -0
- package/src/containers/ExpandedQuotes/ExpandedQuotes.styles.ts +44 -0
- package/src/containers/ExpandedQuotes/ExpandedQuotes.tsx +78 -0
- package/src/containers/ExpandedQuotes/ExpandedQuotes.types.ts +9 -0
- package/src/containers/ExpandedQuotes/index.ts +1 -0
- package/src/containers/Inputs/Inputs.styles.ts +12 -0
- package/src/containers/Inputs/Inputs.tsx +185 -0
- package/src/containers/Inputs/Inputs.types.ts +8 -0
- package/src/containers/Inputs/index.ts +1 -0
- package/src/containers/QuoteInfo/QuoteInfo.styles.ts +26 -0
- package/src/containers/QuoteInfo/QuoteInfo.tsx +78 -0
- package/src/containers/QuoteInfo/QuoteInfo.types.ts +20 -0
- package/src/containers/QuoteInfo/index.ts +1 -0
- package/src/containers/Refuel/Refuel.tsx +25 -0
- package/src/containers/Refuel/Refuel.types.ts +5 -0
- package/src/containers/Refuel/index.ts +1 -0
- package/src/containers/Settings/Lists.tsx +315 -0
- package/src/containers/Wallets/Wallets.helpers.ts +26 -0
- package/src/containers/Wallets/Wallets.tsx +121 -0
- package/src/containers/Wallets/Wallets.types.ts +39 -0
- package/src/containers/Wallets/index.ts +1 -0
- package/src/containers/Wallets/useUpdates.ts +248 -0
- package/src/containers/Widget/Widget.tsx +25 -0
- package/src/containers/Widget/Widget.types.ts +5 -0
- package/src/containers/Widget/index.ts +2 -0
- package/src/containers/WidgetInfo/WidgetInfo.helpers.ts +73 -0
- package/src/containers/WidgetInfo/WidgetInfo.tsx +107 -0
- package/src/containers/WidgetInfo/WidgetInfo.types.ts +34 -0
- package/src/containers/WidgetInfo/index.ts +1 -0
- package/src/containers/WidgetProvider/WidgetProvider.tsx +53 -0
- package/src/containers/WidgetProvider/WidgetProvider.types.ts +7 -0
- package/src/containers/WidgetProvider/index.ts +1 -0
- package/src/globalStyles.ts +7 -0
- package/src/hooks/useBootstrap/index.ts +1 -0
- package/src/hooks/useBootstrap/useBootstrap.ts +102 -0
- package/src/hooks/useConfirmSwap/index.ts +1 -0
- package/src/hooks/useConfirmSwap/useConfirmSwap.helpers.ts +155 -0
- package/src/hooks/useConfirmSwap/useConfirmSwap.ts +157 -0
- package/src/hooks/useConfirmSwap/useConfirmSwap.types.ts +19 -0
- package/src/hooks/useFetch.ts +59 -0
- package/src/hooks/useFetchAllQuotes.ts +21 -0
- package/src/hooks/useFetchApiConfig.ts +37 -0
- package/src/hooks/useFetchConfirmQuote.ts +21 -0
- package/src/hooks/useFetchCustomToken.ts +141 -0
- package/src/hooks/useFontLoader.ts +40 -0
- package/src/hooks/useForceAutoConnect.ts +27 -0
- package/src/hooks/useIframe/index.ts +1 -0
- package/src/hooks/useIframe/useIframe.helpers.ts +3 -0
- package/src/hooks/useIframe/useIframe.ts +55 -0
- package/src/hooks/useIframe/useIframe.types.ts +13 -0
- package/src/hooks/useLanguage.ts +28 -0
- package/src/hooks/useNavigateBack.ts +6 -0
- package/src/hooks/usePrepareBlockchainList/index.ts +1 -0
- package/src/hooks/usePrepareBlockchainList/usePrepareBlockchainList.constants.ts +1 -0
- package/src/hooks/usePrepareBlockchainList/usePrepareBlockchainList.helpers.ts +138 -0
- package/src/hooks/usePrepareBlockchainList/usePrepareBlockchainList.mock.ts +3292 -0
- package/src/hooks/usePrepareBlockchainList/usePrepareBlockchainList.test.ts +348 -0
- package/src/hooks/usePrepareBlockchainList/usePrepareBlockchainList.ts +47 -0
- package/src/hooks/usePrepareBlockchainList/usePrepareBlockchainList.types.ts +17 -0
- package/src/hooks/usePrevious.ts +13 -0
- package/src/hooks/useScreenDetect.ts +55 -0
- package/src/hooks/useSearchCustomTokens/index.ts +1 -0
- package/src/hooks/useSearchCustomTokens/types.ts +9 -0
- package/src/hooks/useSearchCustomTokens/useSearchCustomTokens.constants.ts +1 -0
- package/src/hooks/useSearchCustomTokens/useSearchCustomTokens.ts +81 -0
- package/src/hooks/useStatefulConnect/index.ts +10 -0
- package/src/hooks/useStatefulConnect/useStatefulConnect.helpers.ts +13 -0
- package/src/hooks/useStatefulConnect/useStatefulConnect.state.ts +60 -0
- package/src/hooks/useStatefulConnect/useStatefulConnect.ts +390 -0
- package/src/hooks/useStatefulConnect/useStatefulConnect.types.ts +72 -0
- package/src/hooks/useSubscribeToWidgetEvents/index.ts +1 -0
- package/src/hooks/useSubscribeToWidgetEvents/useSubscribeToWidgetEvents.ts +134 -0
- package/src/hooks/useSwapInput.ts +289 -0
- package/src/hooks/useSwapMode.ts +20 -0
- package/src/hooks/useSyncNotifications/index.ts +1 -0
- package/src/hooks/useSyncNotifications/useSyncNotifications.ts +25 -0
- package/src/hooks/useSyncStoresWithConfig.ts +138 -0
- package/src/hooks/useSyncUrlAndStore/index.ts +1 -0
- package/src/hooks/useSyncUrlAndStore/useSyncUrlAndStore.helpers.ts +23 -0
- package/src/hooks/useSyncUrlAndStore/useSyncUrlAndStore.ts +185 -0
- package/src/hooks/useTheme.ts +104 -0
- package/src/hooks/useUpdateQuoteInputs/index.ts +1 -0
- package/src/hooks/useUpdateQuoteInputs/useUpdateQuoteInputs.ts +50 -0
- package/src/hooks/useWalletList.ts +144 -0
- package/src/hooks/useWalletProviders/index.ts +1 -0
- package/src/hooks/useWalletProviders/useWalletProviders.helpers.ts +19 -0
- package/src/hooks/useWalletProviders/useWalletProviders.ts +30 -0
- package/src/hooks/useWidgetEvents/index.ts +1 -0
- package/src/hooks/useWidgetEvents/useWidgetEvents.ts +9 -0
- package/src/index.ts +192 -0
- package/src/libs/tabManager/index.ts +2 -0
- package/src/libs/tabManager/tabManager.constants.ts +3 -0
- package/src/libs/tabManager/tabManager.ts +225 -0
- package/src/libs/tabManager/tabManager.types.ts +29 -0
- package/src/pages/AddCustomTokenPage.tsx +153 -0
- package/src/pages/ConfirmSwapPage.tsx +324 -0
- package/src/pages/CustomTokensPage.tsx +191 -0
- package/src/pages/HistoryPage.tsx +311 -0
- package/src/pages/Home.tsx +313 -0
- package/src/pages/LanguagePage.tsx +69 -0
- package/src/pages/LiquiditySourcePage.tsx +177 -0
- package/src/pages/Routes.tsx +71 -0
- package/src/pages/SelectBlockchainPage.tsx +114 -0
- package/src/pages/SelectSwapItemPage/SelectSwapItemPage.constants.ts +2 -0
- package/src/pages/SelectSwapItemPage/SelectSwapItemPage.helpers.ts +51 -0
- package/src/pages/SelectSwapItemPage/SelectSwapItemsPage.tsx +160 -0
- package/src/pages/SelectSwapItemPage/index.ts +1 -0
- package/src/pages/SettingsPage.tsx +67 -0
- package/src/pages/SwapDetailsPage.tsx +78 -0
- package/src/pages/WalletsPage.tsx +110 -0
- package/src/services/cacheService.ts +35 -0
- package/src/services/eventEmitter.ts +11 -0
- package/src/services/httpService.ts +13 -0
- package/src/store/AppStore.tsx +46 -0
- package/src/store/app.ts +66 -0
- package/src/store/middlewares/keepLastUpdated.ts +26 -0
- package/src/store/notification.ts +138 -0
- package/src/store/quote.ts +407 -0
- package/src/store/selectors.ts +21 -0
- package/src/store/slices/config.ts +235 -0
- package/src/store/slices/data.test.ts +456 -0
- package/src/store/slices/data.ts +394 -0
- package/src/store/slices/settings.ts +229 -0
- package/src/store/slices/types.ts +9 -0
- package/src/store/slices/wallets.ts +843 -0
- package/src/store/ui.ts +65 -0
- package/src/store/utils/data.test.ts +188 -0
- package/src/store/utils/data.ts +150 -0
- package/src/store/utils/index.ts +1 -0
- package/src/store/utils/wallets.ts +245 -0
- package/src/test-utils/fixtures.ts +265 -0
- package/src/types/config.ts +284 -0
- package/src/types/event.ts +105 -0
- package/src/types/index.ts +5 -0
- package/src/types/notification.ts +26 -0
- package/src/types/quote.ts +133 -0
- package/src/types/swap.ts +19 -0
- package/src/types/wallets.ts +29 -0
- package/src/utils/colors.ts +180 -0
- package/src/utils/common.ts +297 -0
- package/src/utils/configs.ts +95 -0
- package/src/utils/date.ts +81 -0
- package/src/utils/events.ts +27 -0
- package/src/utils/hash.ts +27 -0
- package/src/utils/meta.ts +72 -0
- package/src/utils/numbers.ts +138 -0
- package/src/utils/providers.ts +121 -0
- package/src/utils/queue.ts +24 -0
- package/src/utils/quote.ts +404 -0
- package/src/utils/sanitizers.test.ts +122 -0
- package/src/utils/sanitizers.ts +41 -0
- package/src/utils/settings.ts +124 -0
- package/src/utils/swap.ts +826 -0
- package/src/utils/time.ts +33 -0
- package/src/utils/ui.ts +89 -0
- package/src/utils/validation.test.ts +121 -0
- package/src/utils/validation.ts +45 -0
- package/src/utils/wallets.ts +551 -0
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../src/index.ts", "../src/components/StatefulConnectModal/StatefulConnectModal.tsx", "../src/hooks/useStatefulConnect/useStatefulConnect.ts", "../src/hooks/useStatefulConnect/useStatefulConnect.helpers.ts", "../src/hooks/useStatefulConnect/useStatefulConnect.state.ts", "../src/hooks/useWalletList.ts", "../src/store/AppStore.tsx", "../src/store/app.ts", "../src/store/slices/config.ts", "../src/services/cacheService.ts", "../src/utils/providers.ts", "../src/utils/meta.ts", "../src/store/utils/data.ts", "../src/constants/customTokens.ts", "../src/services/httpService.ts", "../src/constants/index.ts", "../src/utils/wallets.ts", "../src/constants/numbers.ts", "../src/constants/wallets.ts", "../src/utils/common.ts", "../src/constants/fonts.ts", "../src/utils/numbers.ts", "../src/utils/sanitizers.ts", "../src/utils/validation.ts", "../src/utils/configs.ts", "../src/utils/settings.ts", "../src/constants/swapSettings.ts", "../src/types/quote.ts", "../src/types/event.ts", "../src/store/slices/data.ts", "../src/constants/languages.ts", "../src/store/slices/settings.ts", "../src/store/slices/wallets.ts", "../src/services/eventEmitter.ts", "../src/store/middlewares/keepLastUpdated.ts", "../src/store/utils/wallets.ts", "../src/components/common/WatermarkedModal/WatermarkedModal.tsx", "../src/store/ui.ts", "../src/libs/tabManager/tabManager.constants.ts", "../src/libs/tabManager/tabManager.ts", "../src/store/selectors.ts", "../src/components/WalletStatefulConnect/Namespaces.tsx", "../src/components/NamespaceItem/NamespaceUnsupportedItem.tsx", "../src/components/NamespaceItem/NamespaceItem.helpers.ts", "../src/components/NamespaceItem/NamespaceItem.styles.ts", "../src/components/WalletStatefulConnect/NamespaceListItem.tsx", "../src/components/NamespaceItem/NamespaceItem.tsx", "../src/components/NamespaceItem/SupportedChainsList.tsx", "../src/components/NamespaceItem/SupportedChainsList.styles.ts", "../src/components/WalletStatefulConnect/Namespaces.styles.ts", "../src/components/WalletStatefulConnect/Detached.tsx", "../src/components/WalletStatefulConnect/Detached.styles.ts", "../src/components/WalletStatefulConnect/NamespaceDetachedItem.tsx", "../src/components/WalletStatefulConnect/DerivationPath.tsx", "../src/components/WalletStatefulConnect/DerivationPath.helpers.ts", "../src/components/WalletStatefulConnect/DerivationPath.styles.ts", "../src/components/WalletStatefulConnect/ConnectStatus.tsx", "../src/components/WalletStatefulConnect/ConnectStatus.styles.ts", "../src/components/WalletStatefulConnect/ExperimentalChain.tsx", "../src/components/StatefulConnectModal/helpers.ts", "../src/containers/Refuel/Refuel.tsx", "../src/components/AppRouter.tsx", "../src/containers/App/App.tsx", "../src/components/AppRoutes.tsx", "../src/constants/navigationRoutes.ts", "../src/hooks/useSyncStoresWithConfig.ts", "../src/store/quote.ts", "../src/hooks/useSwapMode.ts", "../src/utils/swap.ts", "../src/constants/errors.ts", "../src/constants/messages.ts", "../src/constants/quote.ts", "../src/utils/quote.ts", "../src/hooks/useSyncUrlAndStore/useSyncUrlAndStore.ts", "../src/hooks/useSyncUrlAndStore/useSyncUrlAndStore.helpers.ts", "../src/pages/AddCustomTokenPage.tsx", "../src/components/BlockchainSelectorButton/BlockchainSelectorButton.tsx", "../src/components/BlockchainSelectorButton/BlockchainSelectorButton.styles.ts", "../src/components/ImportCustomToken/ImportCustomToken.tsx", "../src/components/CustomTokenModal/CustomTokenModal.tsx", "../src/components/CustomTokenModal/CustomTokenModal.constants.ts", "../src/components/CustomTokenModal/CustomTokenModal.helpers.ts", "../src/components/CustomTokenModal/CustomTokenModal.styles.ts", "../src/components/Layout/Layout.tsx", "../src/hooks/useIframe/useIframe.ts", "../src/hooks/useIframe/useIframe.helpers.ts", "../src/hooks/useNavigateBack.ts", "../src/hooks/useTheme.ts", "../src/utils/ui.ts", "../src/utils/colors.ts", "../src/utils/hash.ts", "../src/utils/queue.ts", "../src/components/common/ActivateTabAlert/ActivateTabAlert.tsx", "../src/components/common/ActivateTabModal/ActivateTabModal.tsx", "../src/components/HeaderButtons/BackButton.tsx", "../src/components/HeaderButtons/HeaderButtons.styles.ts", "../src/components/HeaderButtons/CancelButton.tsx", "../src/components/HeaderButtons/WalletButton.tsx", "../src/components/HeaderButtons/HeaderButtons.tsx", "../src/components/NotificationContent/NotificationContent.tsx", "../src/store/notification.ts", "../src/components/HeaderButtons/InProgressTransactionBadge.tsx", "../src/components/HeaderButtons/NotificationsBadge.tsx", "../src/components/HeaderButtons/RefreshButton.tsx", "../src/components/RefreshModal/RefreshModal.tsx", "../src/components/RefreshModal/RefreshModal.styles.ts", "../src/components/Layout/Layout.constants.ts", "../src/components/Layout/Layout.helpers.ts", "../src/components/Layout/Layout.styles.ts", "../src/components/Layout/ScrollableArea.tsx", "../src/components/Layout/PageContainer.tsx", "../src/hooks/useFetchCustomToken.ts", "../src/pages/ConfirmSwapPage.tsx", "../src/components/ConfirmWalletsModal/ConfirmWalletsModal.tsx", "../src/components/CustomDestination/CustomDestination.tsx", "../src/components/CustomCollapsible/CustomCollapsible.tsx", "../src/components/CustomCollapsible/CustomCollapsible.styles.ts", "../src/components/CustomDestination/CustomDestination.styles.ts", "../src/components/ConfirmWalletsModal/ConfirmWallets.styles.ts", "../src/components/ConfirmWalletsModal/WalletList.tsx", "../src/components/WalletStatefulConnect/ExperimentalChainStatus.tsx", "../src/components/ConfirmWalletsModal/WalletList.styles.ts", "../src/components/WalletStatefulConnect/ExperimentalChainStatus.helpers.ts", "../src/components/QuoteWarningsAndErrors/QuoteWarningsAndErrors.tsx", "../src/components/NoResult/NoResult.tsx", "../src/components/NoResult/NoResult.helpers.ts", "../src/components/NoResult/NoResult.styles.ts", "../src/components/QuoteWarningsAndErrors/HighValueLossWarningModal.tsx", "../src/components/QuoteWarningsAndErrors/QuoteErrorsModalItem.tsx", "../src/components/QuoteWarningsAndErrors/QuoteWarningsAndErrors.styles.ts", "../src/components/QuoteWarningsAndErrors/QuoteWarningsAndErrors.helpers.ts", "../src/components/QuoteWarningsAndErrors/SlippageWariningModal.tsx", "../src/components/QuoteWarningsAndErrors/UnknownPriceWarningModal.tsx", "../src/containers/QuoteInfo/QuoteInfo.tsx", "../src/components/Quote/Quote.tsx", "../src/containers/QuoteInfo/QuoteInfo.styles.ts", "../src/components/Quote/Quote.styles.ts", "../src/components/Quote/QuoteCostDetails.tsx", "../src/components/Quote/QuoteCostDetails.styles.ts", "../src/components/Quote/QuoteSummary.tsx", "../src/components/Quote/QuoteSummary.styles.ts", "../src/components/Quote/QuoteTrigger.tsx", "../src/hooks/useScreenDetect.ts", "../src/components/QuoteSkeleton/QuoteSkeleton.tsx", "../src/components/QuoteSkeleton/QuoteSkeleton.styles.ts", "../src/components/QuoteSkeleton/QuoteSummarySkeleton.tsx", "../src/components/QuoteSkeleton/QuoteSummarySkeleton.styles.ts", "../src/components/QuoteSkeleton/StepSkeleton.tsx", "../src/components/QuoteSkeleton/StepSkeleton.styles.ts", "../src/hooks/useConfirmSwap/useConfirmSwap.ts", "../src/hooks/useFetch.ts", "../src/hooks/useFetchConfirmQuote.ts", "../src/hooks/useConfirmSwap/useConfirmSwap.helpers.ts", "../src/pages/CustomTokensPage.tsx", "../src/components/SearchInput/SearchInput.tsx", "../src/components/SearchInput/SearchInput.styles.ts", "../src/components/TokenList/TokenList.tsx", "../src/components/TokenList/LoadingTokenList.tsx", "../src/components/TokenList/TokenList.styles.ts", "../src/pages/HistoryPage.tsx", "../src/components/FilterSelector/FilterSelector.tsx", "../src/components/FilterSelector/FilterSelector.style.ts", "../src/components/FilterSelector/FilterSelectorContent.tsx", "../src/components/HistoryGroupedList/HistoryGroupedList.tsx", "../src/components/HistoryGroupedList/HistoryGroupedList.helpers.ts", "../src/components/HistoryGroupedList/HistoryGroupedList.styles.ts", "../src/utils/date.ts", "../src/pages/Home.tsx", "../src/components/SameTokensWarning/SameTokensWarning.tsx", "../src/components/SameTokensWarning/SameTokensWarning.styles.ts", "../src/components/SlippageWarningsAndErrors/SlippageWarningsAndErrors.tsx", "../src/components/SlippageWarningsAndErrors/SlippageWarningsAndErrors.helpers.ts", "../src/components/SwapMetrics/SwapMetrics.tsx", "../src/components/SwapMetrics/SwapMetrics.helpers.ts", "../src/components/SwapMetrics/SwapMetrics.styles.ts", "../src/containers/ExpandedQuotes/ExpandedQuotes.tsx", "../src/components/Quotes/Quotes.tsx", "../src/components/Quotes/Quotes.styles.ts", "../src/components/Quotes/SelectStrategy.tsx", "../src/containers/ExpandedQuotes/ExpandedQuotes.styles.ts", "../src/containers/Inputs/Inputs.tsx", "../src/components/SwitchFromAndTo/SwitchFromAndTo.tsx", "../src/components/SwitchFromAndTo/SwitchFromAndTo.styles.ts", "../src/containers/Inputs/Inputs.styles.ts", "../src/hooks/useSwapInput.ts", "../src/hooks/useFetchAllQuotes.ts", "../src/utils/events.ts", "../src/pages/LanguagePage.tsx", "../src/hooks/useLanguage.ts", "../src/pages/LiquiditySourcePage.tsx", "../src/components/LoadingLiquiditySourceList/LoadingLiquiditySourceList.tsx", "../src/components/SettingsContainer/SettingsContainer.style.ts", "../src/components/LoadingLiquiditySourceList/LoadingLiquiditySourceList.styles.ts", "../src/pages/Routes.tsx", "../src/pages/SelectBlockchainPage.tsx", "../src/components/BlockchainList/BlockchainList.tsx", "../src/components/BlockchainList/BlockchainList.helpers.ts", "../src/components/BlockchainList/BlockchainList.styles.ts", "../src/components/BlockchainList/LoadingBlockchainList.tsx", "../src/pages/SelectSwapItemPage/SelectSwapItemsPage.tsx", "../src/components/BlockchainsSection/BlockchainsSection.tsx", "../src/hooks/usePrepareBlockchainList/usePrepareBlockchainList.ts", "../src/hooks/usePrepareBlockchainList/usePrepareBlockchainList.constants.ts", "../src/hooks/usePrepareBlockchainList/usePrepareBlockchainList.helpers.ts", "../src/components/BlockchainsSection/BlockchainsSection.styles.ts", "../src/hooks/useSearchCustomTokens/useSearchCustomTokens.ts", "../src/pages/SelectSwapItemPage/SelectSwapItemPage.helpers.ts", "../src/pages/SettingsPage.tsx", "../src/components/Slippage/Slippage.tsx", "../src/components/Slippage/Slippage.styles.ts", "../src/components/Slippage/SlippageTooltipContent.tsx", "../src/containers/Settings/Lists.tsx", "../src/pages/SwapDetailsPage.tsx", "../src/components/SwapDetails/SwapDetails.tsx", "../src/utils/time.ts", "../src/components/SwapDetailsModal/SwapDetailsModal.tsx", "../src/components/SwapDetailsModal/SwapDetailsModal.Cancel.tsx", "../src/components/SwapDetailsModal/SwapDetailsModal.Delete.tsx", "../src/components/SwapDetailsModal/SwapDetailsModal.NetworkState.tsx", "../src/components/SwapDetailsModal/SwapDetailsModal.WalletState.tsx", "../src/components/SwapDetailsModal/SwapDetailsModal.ConnectWallet.tsx", "../src/components/SwapDetailsModal/SwapDetailsModal.styles.ts", "../src/components/SwapDetailsModal/SwapDetailsModal.InstallWallet.tsx", "../src/components/SwapDetailsModal/SwapDetailsCompleteModal.tsx", "../src/constants/profileBanner.ts", "../src/components/SwapDetails/RequestIdRow.tsx", "../src/components/SwapDetails/SwapDetails.helpers.tsx", "../src/components/SwapDetailsAlerts/SwapDetailsAlerts.tsx", "../src/components/SwapDetailsAlerts/SwapDetailsAlerts.Failed.tsx", "../src/components/SwapDetails/SwapDetails.styles.ts", "../src/components/SwapDetailsAlerts/SwapDetailsAlerts.styles.ts", "../src/components/SwapDetailsAlerts/SwapDetailsAlerts.Warning.tsx", "../src/components/SwapDetails/SwapDateRow.tsx", "../src/components/SwapDetails/SwapDetails.Placeholder.tsx", "../src/components/LoadingSwapDetails/LoadingSwapDetails.tsx", "../src/components/LoadingSwapDetails/LoadingSwapDetails.styles.ts", "../src/pages/WalletsPage.tsx", "../src/hooks/useBootstrap/useBootstrap.ts", "../src/containers/Wallets/Wallets.tsx", "../src/hooks/useWalletProviders/useWalletProviders.ts", "../src/hooks/useWalletProviders/useWalletProviders.helpers.ts", "../src/containers/Wallets/useUpdates.ts", "../src/containers/Wallets/Wallets.helpers.ts", "../src/globalStyles.ts", "../src/hooks/useForceAutoConnect.ts", "../src/hooks/useSubscribeToWidgetEvents/useSubscribeToWidgetEvents.ts", "../src/hooks/useSyncNotifications/useSyncNotifications.ts", "../src/containers/App/App.styles.ts", "../src/containers/WidgetProvider/WidgetProvider.tsx", "../src/hooks/useFetchApiConfig.ts", "../src/hooks/useFontLoader.ts", "../src/QueueManager.tsx", "../src/containers/WidgetInfo/WidgetInfo.tsx", "../src/hooks/useUpdateQuoteInputs/useUpdateQuoteInputs.ts", "../src/containers/WidgetInfo/WidgetInfo.helpers.ts", "../src/containers/Widget/Widget.tsx", "../src/hooks/useWidgetEvents/useWidgetEvents.ts"],
|
|
4
|
+
"sourcesContent": ["import type { WidgetProps } from './containers/Widget';\nimport type { UseStatefulConnect } from './hooks/useStatefulConnect';\nimport type { ConnectedWallet } from './store/slices/wallets';\nimport type {\n BlockchainAndTokenConfig,\n QuoteEventData,\n Tokens,\n UiEventData,\n WalletEventData,\n WalletInfoWithExtra,\n WidgetColors,\n WidgetColorsKeys,\n WidgetConfig,\n WidgetTheme,\n WidgetVariant,\n} from './types';\nimport type {\n PendingSwapWithQueueID,\n Route,\n RouteEvent,\n RouteEventData,\n RouteExecutionEvents,\n RouteFailedEvent,\n RouteStartedEvent,\n RouteSucceededEvent,\n Step,\n StepApprovalTxSucceededEvent,\n StepCheckStatusEvent,\n StepEvent,\n StepEventData,\n StepFailedEvent,\n StepOutputRevealedEvent,\n StepStartedEvent,\n StepSucceededEvent,\n StepTxExecutionBlockedEvent,\n StepTxExecutionUpdatedEvent,\n} from '@rango-dev/queue-manager-rango-preset';\nimport type {\n LegacyEventHandler as HandleWalletsUpdate,\n LegacyProviderInterface as ProviderInterface,\n} from '@rango-dev/wallets-core/legacy';\nimport type {\n WalletInfo,\n WalletState,\n WalletType,\n} from '@rango-dev/wallets-shared';\nimport type { PendingSwap, PendingSwapStep } from 'rango-types';\n\nimport {\n EventSeverity,\n RouteEventType,\n StepEventType,\n StepExecutionBlockedEventStatus,\n StepExecutionEventStatus,\n} from '@rango-dev/queue-manager-rango-preset';\nimport { legacyReadAccountAddress as readAccountAddress } from '@rango-dev/wallets-core/legacy';\nimport { useWallets, Events as WalletEvents } from '@rango-dev/wallets-react';\nimport { Networks, WalletTypes } from '@rango-dev/wallets-shared';\nimport { PendingSwapNetworkStatus } from 'rango-types';\n\nimport {\n isOnDerivationPath,\n isOnDetached,\n isOnNamespace,\n} from './components/StatefulConnectModal';\nimport {\n DerivationPath,\n Detached,\n Namespaces,\n} from './components/WalletStatefulConnect';\nimport { WIDGET_UI_ID as UI_ID } from './constants';\nimport { SUPPORTED_FONTS } from './constants/fonts';\nimport { Refuel } from './containers/Refuel';\nimport { WidgetWallets } from './containers/Wallets';\nimport { Widget } from './containers/Widget';\nimport { useWidget } from './containers/WidgetInfo';\nimport { WidgetProvider } from './containers/WidgetProvider';\nimport { useStatefulConnect } from './hooks/useStatefulConnect';\nimport { SwapModeContext } from './hooks/useSwapMode';\nimport { useWalletList } from './hooks/useWalletList';\nimport { useWidgetEvents } from './hooks/useWidgetEvents';\nimport { widgetEventEmitter } from './services/eventEmitter';\nimport {\n WidgetEvents as MainEvents,\n QuoteEventTypes,\n UiEventTypes,\n WalletEventTypes,\n WidgetEvents,\n} from './types';\nimport { pickProviderVersionWithFallbackToLegacy } from './utils/providers';\nimport { customizedThemeTokens } from './utils/ui';\n\nexport const StatefulConnect = {\n DerivationPath,\n Namespaces,\n Detached,\n isOnDerivationPath,\n isOnNamespace,\n isOnDetached,\n};\n\nexport type {\n WidgetConfig,\n WalletType,\n WidgetTheme,\n WidgetColors,\n WidgetColorsKeys,\n ProviderInterface,\n BlockchainAndTokenConfig,\n WidgetProps,\n RouteEvent,\n RouteEventData,\n StepEvent,\n StepEventData,\n Route,\n Step,\n RouteStartedEvent,\n RouteSucceededEvent,\n RouteFailedEvent,\n StepStartedEvent,\n StepSucceededEvent,\n StepFailedEvent,\n StepTxExecutionUpdatedEvent,\n StepTxExecutionBlockedEvent,\n StepCheckStatusEvent,\n StepApprovalTxSucceededEvent,\n StepOutputRevealedEvent,\n HandleWalletsUpdate,\n ConnectedWallet,\n Tokens,\n WidgetVariant,\n WalletEventData,\n QuoteEventData,\n UiEventData,\n WalletInfoWithExtra,\n UseStatefulConnect,\n};\nexport {\n Widget,\n Refuel,\n SwapModeContext,\n /**\n * @deprecated Use `WidgetProvider` instead. This component will be removed in future versions.\n */\n WidgetWallets,\n WidgetProvider,\n useWidget,\n useWallets,\n useStatefulConnect,\n /**\n * @deprecated Use `widgetEventEmitter` instead. This hook will be removed in future versions.\n */\n useWidgetEvents,\n useWalletList,\n customizedThemeTokens,\n widgetEventEmitter,\n WidgetEvents,\n /**\n * @deprecated Use `WidgetEvents` instead. This enum will be removed in future versions.\n */\n MainEvents,\n QuoteEventTypes,\n WalletEventTypes,\n UiEventTypes,\n RouteEventType,\n StepEventType,\n StepExecutionEventStatus,\n StepExecutionBlockedEventStatus,\n UI_ID,\n SUPPORTED_FONTS,\n};\n\n// Internal type exports for Rango\nexport type {\n WalletState,\n WalletInfo,\n PendingSwap,\n PendingSwapWithQueueID,\n PendingSwapStep,\n RouteExecutionEvents,\n};\n\n// Internal function and enum exports for Rango\nexport {\n readAccountAddress,\n pickProviderVersionWithFallbackToLegacy,\n Networks,\n WalletEvents,\n WalletTypes,\n PendingSwapNetworkStatus,\n EventSeverity,\n};\n", "import type { Result } from '../../hooks/useStatefulConnect';\nimport type { WalletInfoWithExtra } from '../../types';\nimport type { Namespace } from '@rango-dev/wallets-core/namespaces/common';\n\nimport { Divider } from '@rango-dev/ui';\nimport React, { useEffect, useRef, useState } from 'react';\n\nimport {\n ResultStatus,\n useStatefulConnect,\n} from '../../hooks/useStatefulConnect';\nimport { useWalletList } from '../../hooks/useWalletList';\nimport { getContainer } from '../../utils/common';\nimport { WatermarkedModal } from '../common/WatermarkedModal';\nimport {\n ConnectStatus,\n DerivationPath,\n Namespaces,\n} from '../WalletStatefulConnect';\nimport { Detached } from '../WalletStatefulConnect/Detached';\n\nimport {\n isOnDerivationPath,\n isOnDetached,\n isOnNamespace,\n isOnStatus,\n} from './helpers';\n\nconst KEEP_SUCCESS_MODAL_FOR = 3_000;\nconst DELAY_SHOWING_MODAL_FOR = 300;\n\ninterface PropTypes {\n wallet: WalletInfoWithExtra | undefined;\n id: string;\n onClose: () => void;\n // When connecting wallet is executed **successfully**, this will be called afterwards.\n onConnect?: () => void;\n options?: {\n defaultSelectedChains?: string[];\n };\n}\n\nexport function StatefulConnectModal(props: PropTypes) {\n const successModalTimerId = useRef<ReturnType<typeof setTimeout>>();\n const [isConnecting, setIsConnecting] = useState(false);\n const [error, setError] = useState<string>();\n const catchErrorOnHandle = (error: Error) => {\n setError(error.message);\n };\n const { terminateConnectingWallets } = useWalletList();\n\n const {\n handleConnect,\n handleDerivationPath,\n handleNamespace,\n getState,\n resetState,\n handleDisconnect,\n } = useStatefulConnect();\n\n const handleConfirmNamespaces = (selectedNamespaces: Namespace[]) => {\n handleNamespace(props.wallet!, selectedNamespaces)\n .then(afterConnected)\n .catch(catchErrorOnHandle);\n };\n\n const handleDetachedConfirm = () => {\n handleClosingModal();\n };\n\n const handleDerivationPathConfirm = (derivationPath: string) => {\n if (!derivationPath) {\n throw new Error(\n \"Derivation path is empty. Please make sure you've filled the field correctly.\"\n );\n }\n\n handleDerivationPath(props.wallet!, derivationPath)\n .then(afterConnected)\n .catch(catchErrorOnHandle);\n };\n\n const handleClosingModal = () => {\n setIsConnecting(false);\n };\n\n const resetModalState = () => {\n setError(undefined);\n resetState();\n setIsConnecting(false);\n\n if (successModalTimerId.current) {\n clearTimeout(successModalTimerId.current);\n }\n };\n\n const afterConnected = (result: Result, isImmediatelyConnected?: boolean) => {\n const resultIsConnected = result.status === ResultStatus.Connected;\n const resultIsDisconnected = [\n ResultStatus.Disconnected,\n ResultStatus.DisconnectedUnhandled,\n ].includes(result.status);\n\n if (resultIsConnected) {\n props.onConnect?.();\n if (!isImmediatelyConnected) {\n successModalTimerId.current = setTimeout(\n handleClosingModal,\n KEEP_SUCCESS_MODAL_FOR\n );\n }\n } else if (resultIsDisconnected) {\n handleClosingModal();\n }\n };\n\n const handleNavigateToDerivationPath = (selectedNamespace: Namespace) => {\n if (!props.wallet?.needsDerivationPath) {\n return;\n }\n void handleNamespace(props.wallet, [selectedNamespace]);\n };\n\n useEffect(() => {\n if (props.wallet) {\n resetModalState();\n let isConnected = false;\n /*\n * If connecting to wallet is happening quickly, we shouldn't show a modal.\n * by default we are assuming we can connect quickly, but if it passes an certain amount of time\n * We set his flag as false which means we a modal has been opened (showing a connection status or Namespace/Derivation path modal)\n */\n let isImmediatelyConnected = true;\n\n const beforeConnecting = () => {\n setTimeout(() => {\n isImmediatelyConnected = false;\n if (!isConnected) {\n setIsConnecting(true);\n }\n }, DELAY_SHOWING_MODAL_FOR);\n };\n\n beforeConnecting();\n handleConnect(props.wallet, {\n disconnectIfConnected: true,\n defaultSelectedChains: props.options?.defaultSelectedChains,\n })\n .then((result) => {\n const resultIsNeedMoreStepsToConnect = [\n ResultStatus.Namespace,\n ResultStatus.Detached,\n ResultStatus.DerivationPath,\n ].includes(result.status);\n\n if (!resultIsNeedMoreStepsToConnect) {\n isConnected = true;\n }\n afterConnected(result, isImmediatelyConnected);\n })\n .catch(catchErrorOnHandle);\n }\n }, [props.wallet]);\n\n return (\n <WatermarkedModal\n id={props.id}\n open={isConnecting}\n onClose={handleClosingModal}\n onExit={() => {\n resetModalState();\n terminateConnectingWallets();\n if (props.onClose) {\n props.onClose();\n }\n }}\n container={getContainer()}>\n {isOnStatus(getState, props.wallet) && (\n <>\n <ConnectStatus\n wallet={{\n type: props.wallet.type,\n image: props.wallet.image,\n }}\n error={error}\n />\n <Divider direction=\"vertical\" size={32} />\n </>\n )}\n {isOnNamespace(getState) && (\n <Namespaces\n onConfirm={handleConfirmNamespaces}\n value={getState().namespace}\n />\n )}\n {isOnDerivationPath(getState) && (\n <DerivationPath\n onConfirm={handleDerivationPathConfirm}\n value={getState().derivationPath}\n />\n )}\n {isOnDetached(getState) && (\n <Detached\n onConfirm={handleDetachedConfirm}\n onDisconnectWallet={() =>\n void handleDisconnect(getState().namespace.targetWallet)\n }\n value={getState().namespace}\n selectedNamespaces={getState().selectedNamespaces}\n navigateToDerivationPath={handleNavigateToDerivationPath}\n />\n )}\n </WatermarkedModal>\n );\n}\n", "import type { HandleConnectOptions, Result } from './useStatefulConnect.types';\nimport type { WalletInfoWithExtra } from '../../types';\nimport type { Namespace } from '@rango-dev/wallets-core/namespaces/common';\nimport type { NamespaceData } from '@rango-dev/wallets-shared';\n\nimport { WalletState } from '@rango-dev/ui';\nimport { useWallets } from '@rango-dev/wallets-react';\nimport { useReducer } from 'react';\n\nimport { isOnDetached } from '../../components/StatefulConnectModal';\nimport { type ExtendedModalWalletInfo } from '../../utils/wallets';\n\nimport {\n isStateOnDerivationPathStep,\n isStateOnNamespace,\n} from './useStatefulConnect.helpers';\nimport { initState, reducer, type State } from './useStatefulConnect.state';\nimport { ResultStatus } from './useStatefulConnect.types';\n\nexport interface UseStatefulConnect {\n handleConnect: (\n wallet: WalletInfoWithExtra,\n options?: HandleConnectOptions\n ) => Promise<Result>;\n handleNamespace: (\n wallet: WalletInfoWithExtra,\n selectedNamespaces: Namespace[]\n ) => Promise<Result>;\n handleDisconnect: (wallet: WalletInfoWithExtra) => Promise<Result>;\n handleDerivationPath: (\n wallet: ExtendedModalWalletInfo,\n path: string,\n options?: {\n forceConnectToNamespaces?: Namespace[];\n }\n ) => Promise<Result>;\n getState(): State;\n resetState(section?: 'derivation'): void;\n}\n\n/**\n *\n * This hook maintains state of wallet and checks if additional information\n * is required to call the `connect` method of `core` package properly.\n *\n * The final goal is running `runConnect` which calls `wallets/core`'s `connect` method.\n * But sometimes it needs to get more information like what namespace it should be connected to,\n * or what derivation path should be used for.\n *\n */\nexport function useStatefulConnect(): UseStatefulConnect {\n const { state, disconnect, connect } = useWallets();\n\n const [connectState, dispatch] = useReducer(reducer, initState);\n\n const runConnect = async (\n wallet: ExtendedModalWalletInfo,\n namespaces?: NamespaceData[],\n options?: HandleConnectOptions & { disconnectOnError?: boolean }\n ): Promise<{ status: ResultStatus }> => {\n /*\n * When running this function, it means all optional steps (like namespace and derivation path) has passed, or wallet doesn't need them at all.\n * By resetting state, we will make sure when user tries to connect other wallets, it doesn't have unexpected states.\n */\n dispatch({\n type: 'reset',\n });\n\n try {\n const legacyNamespacesInput = namespaces?.map((namespaceInput) => ({\n ...namespaceInput,\n network: undefined,\n }));\n await connect(wallet.type, legacyNamespacesInput);\n return { status: ResultStatus.Connected };\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n } catch (e: any) {\n const message = e?.message\n ? `Error: ${e.message}`\n : 'An unknown error happened during connecting wallet.';\n\n if (options?.disconnectOnError) {\n try {\n await handleDisconnect(wallet);\n } catch {\n console.warn(\n 'An error happened during disconnecting wallet after error on connecting.'\n );\n }\n }\n\n throw new Error(message, { cause: e });\n }\n };\n\n const handleConnect = async (\n wallet: ExtendedModalWalletInfo,\n options?: HandleConnectOptions\n ): Promise<{\n status: ResultStatus;\n }> => {\n const isDisconnected = wallet.state === WalletState.DISCONNECTED;\n const forceConnectToNamespaces = options?.forceConnectToNamespaces;\n\n if (isDisconnected) {\n /*\n * Currently, handling connect should be covered for 3 different types of target wallet:\n * 1. Target wallet does not contain any namespaces, in this situation we should just try to connect to the related provider.\n * 2. Target wallet contains more than one namespace, in this situation we should display namespaces modal to allow the user to choose from available namespaces.\n * 3. Target wallet contains only one namespace, in this situation we should check if that namespace needs derivation path and based on that, try to connect to the related provider or display derivation path modal.\n */\n\n // Legacy and hub have different structure to handle each situation.\n const isHub = !!wallet.isHub;\n const needsNamespace = isHub\n ? wallet.properties?.find((item) => item.name === 'namespaces')?.value\n : wallet.needsNamespace;\n\n const needsDerivationPath = isHub\n ? wallet.properties?.find((item) => item.name === 'derivationPath')\n ?.value\n : wallet.needsDerivationPath;\n\n // Forced namespaces are used to bypass namespace selection flow.\n if (forceConnectToNamespaces) {\n const notAvailableForcedNamespace = forceConnectToNamespaces.find(\n (namespace) =>\n !needsNamespace?.data?.map((item) => item.value).includes(namespace)\n );\n if (notAvailableForcedNamespace) {\n throw new Error(\n `One of the forced namespaces is not available in the wallet. Forced namespace: ${notAvailableForcedNamespace}`\n );\n }\n\n if (forceConnectToNamespaces.length > 1 && needsDerivationPath) {\n throw new Error(\n 'Derivation path is not supported when multiple namespaces are selected.'\n );\n }\n\n if (\n forceConnectToNamespaces.length === 1 &&\n forceConnectToNamespaces[0] &&\n needsDerivationPath\n ) {\n dispatch({\n type: 'needsDerivationPath',\n payload: {\n providerType: wallet.type,\n providerImage: wallet.image,\n namespace: forceConnectToNamespaces[0],\n },\n });\n return { status: ResultStatus.DerivationPath };\n }\n return await runConnect(\n wallet,\n forceConnectToNamespaces.map((namespace) => ({ namespace })),\n { ...options, disconnectOnError: true }\n );\n }\n\n // 1. Target wallet does not contain any namespaces\n if (!needsNamespace?.data?.length) {\n return await runConnect(wallet, undefined, options);\n }\n\n // 2. Target wallet contains more than one namespace\n if (needsNamespace?.data.length && needsNamespace.data.length > 1) {\n dispatch({\n type: 'needsNamespace',\n payload: {\n targetWallet: wallet,\n defaultSelectedChains: options?.defaultSelectedChains,\n },\n });\n return { status: ResultStatus.Namespace };\n }\n\n // 3. Target wallet contains only one namespace\n if (needsNamespace?.data.length === 1 && needsNamespace.data[0]) {\n if (needsDerivationPath) {\n const namespace = needsNamespace.data[0];\n\n dispatch({\n type: 'needsDerivationPath',\n payload: {\n providerType: wallet.type,\n providerImage: wallet.image,\n namespace: namespace.value,\n },\n });\n return { status: ResultStatus.DerivationPath };\n }\n return await runConnect(\n wallet,\n needsNamespace?.data?.map((namespace) => ({\n namespace: namespace.value,\n })),\n options\n );\n }\n }\n\n /*\n * If the wallet is a hub wallet and it is connected (fully or partially),\n * and it contains more than one namespace,\n * and forced namespaces are not enabled,\n * we should display detached modal\n */\n if (!!wallet.isHub && !options?.forceConnectToNamespaces) {\n const needsNamespace = wallet.properties?.find(\n (item) => item.name === 'namespaces'\n )?.value;\n if (needsNamespace?.data.length && needsNamespace.data.length > 1) {\n dispatch({\n type: 'detached',\n payload: {\n targetWallet: wallet,\n selectedNamespaces: null,\n },\n });\n return { status: ResultStatus.Detached };\n }\n }\n\n if (options?.disconnectIfConnected) {\n await handleDisconnect(wallet);\n return { status: ResultStatus.Disconnected };\n }\n\n return { status: ResultStatus.DisconnectedUnhandled };\n };\n\n const handleNamespace = async (\n wallet: ExtendedModalWalletInfo,\n selectedNamespaces: Namespace[]\n ): Promise<Result> => {\n const isHub = !!wallet.isHub;\n const needsNamespace = isHub\n ? wallet.properties?.find((item) => item.name === 'namespaces')?.value\n : wallet.needsNamespace;\n\n const needsDerivationPath = isHub\n ? wallet.properties?.find((item) => item.name === 'derivationPath')?.value\n : wallet.needsDerivationPath;\n\n const isSingleNamespace = needsNamespace?.selection === 'single';\n const firstSelectedNamespace = selectedNamespaces[0];\n\n if (!firstSelectedNamespace) {\n throw new Error(\n 'To confirm a namespace, you should select at least one namespace.'\n );\n }\n\n /*\n * Currently we support derivation path only for single namespace wallets.\n *\n * Basically Single namespace is a list with radio buttons to let the user select one value within the list.\n */\n if (isSingleNamespace && needsDerivationPath) {\n dispatch({\n type: 'needsDerivationPath',\n payload: {\n providerType: wallet.type,\n providerImage: wallet.image,\n namespace: firstSelectedNamespace,\n },\n });\n\n return { status: ResultStatus.DerivationPath };\n }\n\n /**\n * If execution reaches here, means we don't have any more optional step (like namespace and derivation)\n * So we should start connecting wallet.\n */\n\n if (!isStateOnNamespace(connectState)) {\n // Unreachable code.\n throw new Error(\n 'Something went wrong on handling namespace. Please retry.'\n );\n }\n\n const namespaces = selectedNamespaces.map((namespace) => ({\n namespace,\n }));\n\n dispatch({\n type: 'detached',\n payload: {\n targetWallet: wallet,\n selectedNamespaces: namespaces ?? null,\n },\n });\n return { status: ResultStatus.Detached };\n };\n\n const handleDerivationPath = async (\n wallet: ExtendedModalWalletInfo,\n derivationPath: string,\n options?: {\n forceConnectToNamespaces?: Namespace[];\n }\n ): Promise<Result> => {\n if (!derivationPath) {\n throw new Error(\n \"Derivation path is empty. Please make sure you've filled the field correctly.\"\n );\n }\n\n if (!isStateOnDerivationPathStep(connectState)) {\n throw new Error(\n 'It seems you are filling derivation path without setting namespace before doing that. Please retry to connect.'\n );\n }\n const selectedNamespace = connectState.derivationPath.namespace;\n const namespaces = [{ namespace: selectedNamespace, derivationPath }];\n\n const isHub = !!wallet.isHub;\n const needsNamespace = isHub\n ? wallet.properties?.find((item) => item.name === 'namespaces')?.value\n : wallet.needsNamespace;\n\n const namespaceIsAvailable =\n !!needsNamespace?.data && needsNamespace.data.length > 1;\n const forceConnectToNamespacesEnabled = !!options?.forceConnectToNamespaces;\n // If forced namespaces are enabled, we should bypass detached modal and go directly to connect.\n if (namespaceIsAvailable && !forceConnectToNamespacesEnabled) {\n dispatch({\n type: 'detached',\n payload: {\n targetWallet: wallet,\n selectedNamespaces: namespaces ?? null,\n derivationPath,\n },\n });\n return { status: ResultStatus.Detached };\n }\n\n return await runConnect(wallet, namespaces);\n };\n\n const getState = () => connectState;\n\n const handleDisconnect = async (\n wallet: ExtendedModalWalletInfo\n ): Promise<Result> => {\n const walletState = state(wallet.type);\n if (walletState.connected || walletState.connecting) {\n await disconnect(wallet.type);\n\n if (isOnDetached(getState)) {\n dispatch({\n type: 'needsNamespace',\n payload: {\n targetWallet: wallet,\n },\n });\n return { status: ResultStatus.Namespace };\n }\n\n return { status: ResultStatus.Disconnected };\n }\n\n return { status: ResultStatus.Noop };\n };\n\n return {\n handleConnect,\n handleDisconnect,\n handleNamespace,\n handleDerivationPath,\n getState,\n resetState: (section?: 'derivation') => {\n if (section === 'derivation') {\n dispatch({\n type: 'resetDerivation',\n });\n } else {\n dispatch({\n type: 'reset',\n });\n }\n },\n };\n}\n", "import type { State } from './useStatefulConnect.state';\n\nexport function isStateOnDerivationPathStep(\n state: State\n): state is State & { derivationPath: NonNullable<State['derivationPath']> } {\n return !!state.derivationPath;\n}\n\nexport function isStateOnNamespace(\n state: State\n): state is State & { namespace: NonNullable<State['namespace']> } {\n return !!state.namespace;\n}\n", "import type {\n Actions,\n NeedsDerivationPathState,\n NeedsNamespacesState,\n} from './useStatefulConnect.types';\nimport type { Namespace } from '@rango-dev/wallets-core/namespaces/common';\n\nexport interface State {\n status: 'init' | 'namespace' | 'derivationPath' | 'detached';\n namespace: NeedsNamespacesState | null;\n derivationPath: NeedsDerivationPathState | null;\n selectedNamespaces:\n | { namespace: Namespace; derivationPath?: string }[]\n | null;\n}\n\nexport const initState: State = {\n status: 'init',\n namespace: null,\n derivationPath: null,\n selectedNamespaces: null,\n};\n\nexport function reducer(state: State, action: Actions): State {\n switch (action.type) {\n case 'needsNamespace':\n return {\n ...state,\n status: 'namespace',\n namespace: action.payload,\n derivationPath: null,\n };\n case 'needsDerivationPath':\n return {\n ...state,\n status: 'derivationPath',\n derivationPath: action.payload,\n };\n case 'detached':\n return {\n ...state,\n status: 'detached',\n namespace: { targetWallet: action.payload.targetWallet },\n selectedNamespaces: action.payload.selectedNamespaces,\n };\n case 'reset':\n return initState;\n case 'resetDerivation':\n if (state.namespace) {\n return {\n ...state,\n derivationPath: null,\n status: 'namespace',\n };\n }\n return initState;\n default:\n throw new Error(`Action hasn't been defined.`);\n }\n}\n", "import type { ExtendedModalWalletInfo } from '../utils/wallets';\nimport type { WalletInfo } from '@rango-dev/ui';\nimport type { BlockchainMeta } from 'rango-sdk';\n\nimport { WalletState } from '@rango-dev/ui';\nimport { useWallets } from '@rango-dev/wallets-react';\nimport {\n detectMobileScreens,\n KEPLR_COMPATIBLE_WALLETS,\n WalletTypes,\n} from '@rango-dev/wallets-shared';\nimport { useCallback, useEffect } from 'react';\n\nimport { useAppStore } from '../store/AppStore';\nimport { configWalletsToWalletName } from '../utils/providers';\nimport {\n hashWalletsState,\n isExperimentalChain,\n mapWalletTypesToWalletInfo,\n sortWalletsBasedOnConnectionState,\n} from '../utils/wallets';\n\nimport { useStatefulConnect } from './useStatefulConnect/useStatefulConnect';\n\ninterface Params {\n chain?: string;\n}\n\ninterface API {\n list: ExtendedModalWalletInfo[];\n terminateConnectingWallets: () => void;\n}\n\n/**\n *\n * Returning list of wallets which has a applied sorting and filtering (some of wallet can be excluded).\n * It can have some functionality on list itself,\n * now it only has a method to disconnect the wallets that has `connecting` status. This is useful for exiting page and terminating wallet connection.\n *\n */\nexport function useWalletList(params?: Params): API {\n const { chain } = params || {};\n const { connectedWallets, getAvailableProviders } = useAppStore();\n const { state, getWalletInfo } = useWallets();\n const blockchains = useAppStore().blockchains();\n const { handleDisconnect } = useStatefulConnect();\n\n /** It can be what has been set by widget config or as a fallback we use all the supported wallets by our library */\n const listAvailableWalletTypes = configWalletsToWalletName(\n getAvailableProviders()\n );\n\n let wallets = mapWalletTypesToWalletInfo(\n state,\n getWalletInfo,\n listAvailableWalletTypes,\n chain\n );\n\n wallets = detectMobileScreens()\n ? wallets.filter(\n (wallet) =>\n wallet.showOnMobile !== false && state(wallet.type).installed\n )\n : wallets;\n\n const sortedWallets = sortWalletsBasedOnConnectionState(wallets);\n\n const isExperimentalChainNotAdded = (walletType: string) =>\n !connectedWallets.find(\n (connectedWallet) =>\n connectedWallet.walletType === walletType &&\n connectedWallet.chain === chain\n );\n\n const terminateConnectingWallets = useCallback(() => {\n const connectingWallets =\n wallets?.filter((wallet) => wallet.state === WalletState.CONNECTING) ||\n [];\n for (const wallet of connectingWallets) {\n void handleDisconnect(wallet);\n }\n }, [hashWalletsState(wallets)]);\n\n useEffect(() => {\n return () => {\n terminateConnectingWallets();\n };\n }, []);\n\n /*\n * Atm, we only support default injected wallet for the EVM\n * so we show default wallet when there is no other evm wallet installed\n * but we have ethereum injected\n */\n const shouldShowDefaultInjectedWallet = (wallets: WalletInfo[]) => {\n // don't show default injected wallet when it's not installed\n const defaultWallet = wallets.find(\n (wallet) => wallet.type === WalletTypes.DEFAULT\n );\n if (!defaultWallet || defaultWallet.state === WalletState.NOT_INSTALLED) {\n return false;\n }\n\n /*\n * if we have another evm wallet installed (except wallet connect),\n * there is no need to show default injected wallet anymore\n */\n const isEvmWalletInstalledExceptDefault = wallets.filter(\n (wallet) =>\n wallet.state != WalletState.NOT_INSTALLED &&\n ![\n WalletTypes.DEFAULT,\n WalletTypes.WALLET_CONNECT_2,\n WalletTypes.LEDGER,\n ].includes(wallet.type as WalletTypes) &&\n getWalletInfo(wallet.type).supportedChains.filter(\n (blockchain) => blockchain.type == 'EVM'\n ).length > 0\n );\n return isEvmWalletInstalledExceptDefault.length == 0;\n };\n\n const shouldExcludeWallet = (\n walletType: string,\n chain: string,\n blockchains: BlockchainMeta[]\n ) => {\n return (\n (isExperimentalChain(blockchains, chain) &&\n isExperimentalChainNotAdded(walletType) &&\n !KEPLR_COMPATIBLE_WALLETS.includes(walletType)) ||\n (walletType == WalletTypes.DEFAULT &&\n !shouldShowDefaultInjectedWallet(wallets))\n );\n };\n\n return {\n list: sortedWallets.filter(\n (wallet) => !shouldExcludeWallet(wallet.type, chain ?? '', blockchains)\n ),\n terminateConnectingWallets,\n };\n}\n", "import type { WidgetConfig } from '../types';\nimport type { PropsWithChildren } from 'react';\n\nimport React, { createContext, useContext, useEffect, useRef } from 'react';\n\nimport { createAppStore } from './app';\n\ntype AppStore = ReturnType<typeof createAppStore>;\ntype AppStoreProviderProps = PropsWithChildren<{ config?: WidgetConfig }>;\n\nexport const AppStoreContext = createContext<AppStore | null>(null);\n\nexport function useAppStore() {\n const store = useContext(AppStoreContext);\n\n useEffect(() => {\n if (store && !store.persist.hasHydrated()) {\n /*\n * folan\n * asds\n *\n */\n void store.persist.rehydrate();\n }\n }, []);\n\n if (!store) {\n throw new Error('Missing AppStoreContext.Provider in the tree');\n }\n\n return store();\n}\n\nexport function AppStoreProvider(props: AppStoreProviderProps) {\n const appStoreRef = useRef<AppStore>();\n\n if (!appStoreRef.current) {\n appStoreRef.current = createAppStore(props.config);\n }\n\n return (\n <AppStoreContext.Provider value={appStoreRef.current}>\n {props.children}\n </AppStoreContext.Provider>\n );\n}\n", "import type { WidgetConfig } from '../types';\nimport type { AppStoreState } from './slices/types';\nimport type { StateCreator } from 'zustand';\n\nimport { create } from 'zustand';\nimport { persist } from 'zustand/middleware';\n\nimport { createConfigSlice } from './slices/config';\nimport { createDataSlice } from './slices/data';\nimport { createSettingsSlice } from './slices/settings';\nimport { createWalletsSlice } from './slices/wallets';\n\nexport type StateCreatorWithInitialData<\n T extends Partial<WidgetConfig>,\n R extends Partial<AppStoreState>,\n V extends Partial<AppStoreState>\n> = (\n initialData: T | undefined,\n ...rest: Parameters<StateCreator<R, [], [], V>>\n) => ReturnType<StateCreator<R, [], [], V>>;\n\nexport type { AppStoreState };\n\nexport function createAppStore(initialData?: WidgetConfig) {\n return create<AppStoreState>()(\n persist(\n (...a) => ({\n ...createWalletsSlice(...a),\n ...createDataSlice(...a),\n ...createSettingsSlice(...a),\n ...createConfigSlice(initialData, ...a),\n }),\n {\n name: 'user-settings',\n skipHydration: true,\n partialize: (state) => {\n return {\n _customTokens: state._customTokens,\n theme: state.theme,\n language: state.language,\n affiliatePercent: state.affiliatePercent,\n affiliateRef: state.affiliateRef,\n affiliateWallets: state.affiliateWallets,\n slippage: state.slippage,\n customSlippage: state.customSlippage,\n infiniteApprove: state.infiniteApprove,\n preferredBlockchains: state.preferredBlockchains,\n disabledLiquiditySources: state.disabledLiquiditySources,\n quoteTokensRate: state.quoteTokensRate,\n };\n },\n version: 1,\n migrate: (persistedState, version) => {\n const state = persistedState as AppStoreState;\n if (version === 0) {\n state._customTokens = state._customTokens.map((token) => ({\n ...token,\n warning: true,\n }));\n }\n return state;\n },\n }\n )\n );\n}\n", "import type { DataSlice } from './data';\nimport type { SettingsSlice } from './settings';\nimport type { WidgetConfig } from '../../types';\nimport type { StateCreatorWithInitialData } from '../app';\n\nimport { allProviders as getAllProviders } from '@rango-dev/provider-all';\nimport { type VersionedProviders } from '@rango-dev/wallets-core';\n\nimport { cacheService } from '../../services/cacheService';\nimport {\n matchAndGenerateProviders,\n type ProvidersOptions,\n} from '../../utils/providers';\nimport { matchTokensFromConfigWithMeta } from '../utils';\n\nfunction makeProvidersOptionsFromConfig(\n config: WidgetConfig\n): ProvidersOptions {\n const options: ProvidersOptions = {\n walletConnectProjectId: config?.walletConnectProjectId,\n trezorManifest: config?.trezorManifest,\n tonConnect: config?.tonConnect,\n walletConnectListedDesktopWalletLink:\n config.__UNSTABLE_OR_INTERNAL__?.walletConnectListedDesktopWalletLink,\n };\n\n return options;\n}\n\nexport const DEFAULT_CONFIG: WidgetConfig = {\n apiKey: '',\n title: undefined,\n multiWallets: true,\n excludeLiquiditySources: true,\n customDestination: true,\n variant: 'default',\n trezorManifest: {\n appUrl: 'https://widget.rango.exchange/',\n email: 'hi+trezorwidget@rango.exchange',\n },\n tonConnect: {\n manifestUrl:\n 'https://raw.githubusercontent.com/rango-exchange/rango-types/main/assets/manifests/tonconnect-manifest.json',\n },\n};\n\ninterface IframeConfigs {\n clientUrl?: string;\n}\n\ninterface CampaignMode {\n liquiditySources?: string[];\n}\n\nconst DEFAULT_IFRAME_CONFIGS: IframeConfigs = {\n clientUrl: undefined,\n};\n\nconst DEFAULT_CAMPAIGN_MODE: CampaignMode = {\n liquiditySources: undefined,\n};\n\nexport interface ConfigSlice {\n // What user can set directly.\n config: WidgetConfig;\n campaignMode: CampaignMode;\n isInCampaignMode: () => boolean;\n getLiquiditySources: () => string[];\n getDisabledLiquiditySources: () => string[];\n excludeLiquiditySources: () => boolean;\n updateConfig: (config: WidgetConfig) => void;\n updateCampaignMode: <K extends keyof CampaignMode>(\n name: K,\n value: CampaignMode[K]\n ) => void;\n // What we are setting based on environments.\n iframe: { clientUrl?: string };\n updateIframe: <K extends keyof IframeConfigs>(\n name: K,\n value: IframeConfigs[K]\n ) => void;\n allProviders: VersionedProviders[];\n buildAndSetProviders: () => void;\n getAvailableProviders: () => VersionedProviders[];\n}\n\nfunction generateProviders(config: WidgetConfig) {\n const options = makeProvidersOptionsFromConfig(config);\n const envs = {\n walletconnect2: {\n WC_PROJECT_ID: options?.walletConnectProjectId || '',\n DISABLE_MODAL_AND_OPEN_LINK:\n options?.walletConnectListedDesktopWalletLink,\n },\n selectedProviders: config.wallets,\n trezor: options?.trezorManifest\n ? { manifest: options.trezorManifest }\n : undefined,\n tonConnect: options?.tonConnect?.manifestUrl\n ? { manifestUrl: options?.tonConnect.manifestUrl }\n : undefined,\n };\n const allProviders = getAllProviders(envs);\n const allBuiltProviders = allProviders.map((build) => build());\n\n return allBuiltProviders;\n}\n\nexport const createConfigSlice: StateCreatorWithInitialData<\n WidgetConfig,\n ConfigSlice & SettingsSlice & DataSlice,\n ConfigSlice\n> = (initialData, set, get) => {\n const allBuiltProviders = generateProviders({\n ...DEFAULT_CONFIG,\n ...initialData,\n });\n return {\n config: { ...DEFAULT_CONFIG, ...initialData },\n iframe: DEFAULT_IFRAME_CONFIGS,\n campaignMode: DEFAULT_CAMPAIGN_MODE,\n allProviders: allBuiltProviders,\n getLiquiditySources: () => {\n const { config, campaignMode } = get();\n return campaignMode.liquiditySources?.length\n ? campaignMode.liquiditySources\n : config.liquiditySources ?? [];\n },\n getDisabledLiquiditySources: () => {\n const { disabledLiquiditySources, campaignMode } = get();\n return campaignMode.liquiditySources?.length\n ? []\n : disabledLiquiditySources;\n },\n excludeLiquiditySources: () => {\n const { config, campaignMode } = get();\n return campaignMode.liquiditySources?.length\n ? false\n : !!config.excludeLiquiditySources;\n },\n isInCampaignMode: () => {\n const { campaignMode } = get();\n return !!campaignMode.liquiditySources?.length;\n },\n\n // Actions\n updateConfig: (nextConfig: WidgetConfig) => {\n const currentConfig = get().config;\n const {\n _tokensMapByTokenHash: tokensMapByTokenHash,\n _tokensMapByBlockchainName: tokensMapByBlockchainName,\n } = get();\n\n const supportedSourceTokens = matchTokensFromConfigWithMeta({\n type: 'source',\n config: {\n blockchains: nextConfig.from?.blockchains,\n tokens: nextConfig.from?.tokens,\n },\n meta: {\n tokensMapByBlockchainName,\n tokensMapByTokenHash,\n },\n });\n\n const supportedDestinationTokens = matchTokensFromConfigWithMeta({\n type: 'destination',\n config: {\n blockchains: nextConfig.to?.blockchains,\n tokens: nextConfig.to?.tokens,\n },\n meta: {\n tokensMapByBlockchainName,\n tokensMapByTokenHash,\n },\n });\n\n cacheService.set('supportedSourceTokens', supportedSourceTokens);\n cacheService.set(\n 'supportedDestinationTokens',\n supportedDestinationTokens\n );\n\n set({\n config: {\n ...currentConfig,\n ...nextConfig,\n },\n });\n },\n\n updateCampaignMode: (name, value) => {\n const currentCampaignMode = get().campaignMode;\n\n set({\n campaignMode: {\n ...currentCampaignMode,\n [name]: value,\n },\n });\n },\n\n updateIframe: (name, value) => {\n const currentIframeConfig = get().iframe;\n\n set({\n iframe: {\n ...currentIframeConfig,\n [name]: value,\n },\n });\n },\n\n buildAndSetProviders: () => {\n const { config } = get();\n const allBuiltProviders = generateProviders(config);\n\n set({\n allProviders: allBuiltProviders,\n });\n },\n\n getAvailableProviders: () => {\n const { allProviders, config } = get();\n const options = makeProvidersOptionsFromConfig(config);\n\n const availableProviders = matchAndGenerateProviders({\n allProviders,\n configWallets: config.wallets,\n options,\n });\n return availableProviders;\n },\n };\n};\n", "import type { Token } from 'rango-sdk';\n\ninterface CacheServiceInterface<V> {\n get<K extends keyof V>(key: K): V[K] | undefined;\n set<K extends keyof V>(key: K, value: V[K]): void;\n remove<K extends keyof V>(key: K): void;\n clear(): void;\n}\n\nclass CacheService<T> implements CacheServiceInterface<T> {\n #cache: Map<string, T[keyof T]> = new Map();\n\n get<K extends keyof T>(key: K): T[K] | undefined {\n return this.#cache.get(key as string) as T[K];\n }\n\n set<K extends keyof T>(key: K, value: T[K]): void {\n this.#cache.set(key as string, value);\n }\n\n remove<K extends keyof T>(key: K): void {\n this.#cache.delete(key as string);\n }\n\n clear(): void {\n this.#cache.clear();\n }\n}\n\nexport type CachedEntries = {\n supportedSourceTokens: Token[];\n supportedDestinationTokens: Token[];\n};\n\nexport const cacheService = new CacheService<CachedEntries>();\n", "import type { WidgetConfig } from '../types';\nimport type { LegacyProviderInterface } from '@rango-dev/wallets-core/legacy';\n\nimport {\n defineVersions,\n pickVersion,\n Provider,\n type VersionedProviders,\n} from '@rango-dev/wallets-core';\n\nexport interface ProvidersOptions {\n walletConnectProjectId?: WidgetConfig['walletConnectProjectId'];\n walletConnectListedDesktopWalletLink?: NonNullable<\n WidgetConfig['__UNSTABLE_OR_INTERNAL__']\n >['walletConnectListedDesktopWalletLink'];\n trezorManifest: WidgetConfig['trezorManifest'];\n tonConnect: WidgetConfig['tonConnect'];\n}\n\n/**\n *\n * Generate a list of providers by passing a provider name (e.g. metamask) or a custom provider which implemented ProviderInterface.\n * @returns BothProvidersInterface[] a list of BothProvidersInterface\n *\n */\ntype BothProvidersInterface = LegacyProviderInterface | Provider;\nexport function matchAndGenerateProviders({\n allProviders,\n configWallets,\n}: {\n allProviders: VersionedProviders[];\n configWallets: WidgetConfig['wallets'];\n options?: ProvidersOptions;\n}): VersionedProviders[] {\n if (configWallets) {\n /*\n * If `wallets` is included in widget config,\n * allProviders should be filtered based on wallets list\n */\n const selectedProviders: VersionedProviders[] = [];\n\n configWallets.forEach((requestedWallet) => {\n /*\n * There are two types of provider we get, the first one is only passing the wallet name\n * then we will match the wallet name with our providers (@rango-dev/provider-*).\n * The second way is passing a custom provider which implemented ProviderInterface.\n */\n if (typeof requestedWallet === 'string') {\n const result = allProviders.find((provider) => {\n /*\n * To find a provider in allProviders,\n * a version of each provider should be picked\n * and validated based on that version scheme.\n * If the corresponding provider to a wallet was found in allProvider,\n * it will be add to selected providers.\n */\n const versionedProvider =\n pickProviderVersionWithFallbackToLegacy(provider);\n if (versionedProvider instanceof Provider) {\n return versionedProvider.id === requestedWallet;\n }\n return versionedProvider.config.type === requestedWallet;\n });\n\n /*\n * A provider may have multiple versions\n * (e.g., 0.0, also known as legacy, and 1.0, also known as hub).\n * We should ensure that all existing versions of a provider are added to selectedProviders.\n */\n if (result) {\n selectedProviders.push(result);\n } else {\n console.warn(\n // A provider name is included in config but was not found in allProviders\n `Couldn't find ${requestedWallet} provider. Please make sure you are passing the correct name.`\n );\n }\n } else {\n // It's a custom provider so we directly push it to the list.\n if (requestedWallet instanceof Provider) {\n selectedProviders.push(\n defineVersions().version('1.0.0', requestedWallet).build()\n );\n } else {\n selectedProviders.push(\n defineVersions().version('0.0.0', requestedWallet).build()\n );\n }\n }\n });\n\n return selectedProviders;\n }\n\n return allProviders;\n}\n\nexport function pickProviderVersionWithFallbackToLegacy(\n provider: VersionedProviders\n): BothProvidersInterface {\n try {\n return pickVersion(provider, '1.0.0')[1];\n } catch {\n // Fallback to legacy version, if target version doesn't exists.\n return pickVersion(provider, '0.0.0')[1];\n }\n}\n\nexport function configWalletsToWalletName(\n providers: VersionedProviders[]\n): string[] {\n const names = providers\n .map((provider) => pickProviderVersionWithFallbackToLegacy(provider))\n .map((provider) => {\n if (provider instanceof Provider) {\n return provider.id;\n }\n return provider.config.type;\n });\n return names;\n}\n", "import type { TokenHash } from '../types';\nimport type { Asset, BlockchainMeta, SwapperMeta, Token } from 'rango-sdk';\n\nexport function getBlockchainDisplayNameFor(\n blockchainName: string,\n blockchains: BlockchainMeta[]\n): string | undefined {\n return blockchains.find((blockchain) => blockchain.name === blockchainName)\n ?.displayName;\n}\nexport function getBlockchainShortNameFor(\n blockchainName: string,\n blockchains: BlockchainMeta[]\n): string | undefined {\n return blockchains.find((blockchain) => blockchain.name === blockchainName)\n ?.shortName;\n}\n\nexport function getBlockchainImage(\n blockchainName: string,\n blockchains: BlockchainMeta[]\n): string | undefined {\n return blockchains.find((blockchain) => blockchain.name === blockchainName)\n ?.logo;\n}\n\nexport function getSwapperDisplayName(\n swapperId: string,\n swappers: SwapperMeta[]\n) {\n return swappers.find((swapper) => swapper.id === swapperId)?.title;\n}\n\nexport function findBlockchain(name: string, blockchains: BlockchainMeta[]) {\n return blockchains.find((blockchain) => blockchain.name === name) ?? null;\n}\n\nexport function isTokenNative(\n token: Token,\n blockchain: BlockchainMeta | undefined\n) {\n if (!blockchain || !token) {\n return false;\n }\n\n for (const feeAsset of blockchain.feeAssets) {\n if (\n token?.blockchain === feeAsset?.blockchain &&\n token?.symbol === feeAsset?.symbol &&\n token?.address === feeAsset?.address\n ) {\n return true;\n }\n }\n\n return false;\n}\n\nexport function createTokenHash(asset: Asset): TokenHash {\n return `${asset.blockchain.toLowerCase()}-${asset.symbol.toLowerCase()}-${(\n asset.address ?? ''\n ).toLowerCase()}`;\n}\n\nexport function isValidTokenAddress(\n chain: BlockchainMeta,\n address: string\n): boolean {\n const regex = chain.addressPatterns;\n const valid = regex.filter((r) => new RegExp(r).test(address)).length > 0;\n return valid;\n}\n", "import type {\n BlockchainAndTokenConfig,\n TokenHash,\n WidgetConfig,\n} from '../../types';\nimport type { DataSlice } from '../slices/data';\nimport type { Asset, Token } from 'rango-sdk';\n\nimport { createTokenHash } from '../../utils/meta';\n\n/**\n * This function retrieves tokens and blockchains from the widget configuration and combines them with token data from the meta response to determine which tokens should be displayed in the widget.\n * To optimize performance, the function minimizes unnecessary iterations over the meta tokens.\n * The result of this function should be cached and recalculated whenever the widget configuration changes.\n */\nexport function matchTokensFromConfigWithMeta(params: {\n type: 'source' | 'destination';\n config: {\n blockchains: BlockchainAndTokenConfig['blockchains'];\n tokens: BlockchainAndTokenConfig['tokens'];\n };\n meta: {\n tokensMapByTokenHash: DataSlice['_tokensMapByTokenHash'];\n tokensMapByBlockchainName: DataSlice['_tokensMapByBlockchainName'];\n };\n}): Token[] {\n const { config, meta } = params;\n const result: Record<TokenHash, Token> = {};\n const configTokens = config.tokens;\n\n // Helper function to add tokens to result\n const addTokens = (tokens: (Asset | TokenHash)[]) => {\n tokens.forEach((item) => {\n if (typeof item !== 'string') {\n item = createTokenHash(item);\n }\n const tokenFromMeta = meta.tokensMapByTokenHash.get(item);\n if (tokenFromMeta) {\n result[item] = tokenFromMeta;\n }\n });\n };\n\n /**\n * We support two types of configurations for passing tokens in the widget config.\n * We check the type of configuration and calculate the result based on that.\n */\n if (Array.isArray(configTokens)) {\n /**\n * If \"config.tokens\" is an array,\n * we iterate through it and include any token that exists in the meta data in the result.\n */\n if (configTokens.length > 0) {\n addTokens(configTokens);\n return Object.values(result);\n }\n return Array.from(meta.tokensMapByTokenHash.values());\n }\n\n /**\n * From this point onward,\n * the function handles the other type of widget configuration.\n */\n if (!configTokens) {\n return Array.from(meta.tokensMapByTokenHash.values());\n }\n\n let configBlockchains: string[];\n\n if (config.blockchains?.length) {\n configBlockchains = config.blockchains;\n } else {\n /**\n * If config.blockchains does not exist,\n * we include all tokens from every blockchain in the meta data that are not specified in the tokens from the config.\n */\n configBlockchains = Object.keys(configTokens);\n const configBlockchainsSet = new Set(configBlockchains);\n\n Object.keys(meta.tokensMapByBlockchainName).forEach((blockchain) => {\n const metaTokensForSelectedBlockchain =\n meta.tokensMapByBlockchainName[blockchain];\n if (\n !configBlockchainsSet.has(blockchain) &&\n metaTokensForSelectedBlockchain\n ) {\n addTokens(metaTokensForSelectedBlockchain);\n }\n });\n }\n //We iterate over each blockchain and retrieve the related tokens for each one from the configuration.\n configBlockchains.forEach((blockchain) => {\n const targetTokensForBlockchain = configTokens[blockchain];\n /**\n * If no tokens exist for a blockchain,\n * we include all tokens for that blockchain from the meta response.\n */\n if (\n !targetTokensForBlockchain &&\n meta.tokensMapByBlockchainName?.[blockchain]\n ) {\n addTokens(meta.tokensMapByBlockchainName[blockchain]);\n return;\n }\n\n if (targetTokensForBlockchain) {\n if (\n targetTokensForBlockchain.isExcluded &&\n meta.tokensMapByBlockchainName[blockchain]\n ) {\n /**\n * If tokens are excluded,\n * we first include all tokens from the meta for that blockchain,\n * then remove the excluded tokens from the result.\n */\n addTokens(meta.tokensMapByBlockchainName[blockchain]);\n targetTokensForBlockchain.tokens.forEach((token) => {\n const tokenHash = createTokenHash(token);\n delete result[tokenHash];\n });\n } else {\n //We retrieve the corresponding token from the meta and include it in the result.\n addTokens(targetTokensForBlockchain.tokens);\n }\n }\n });\n\n return Object.values(result);\n}\n\nexport function getSupportedBlockchainsFromConfig(params: {\n config: WidgetConfig;\n}): string[] {\n const { config } = params;\n const configFromBlockchains = config.from?.blockchains || [];\n const configToBlockchains = config.to?.blockchains || [];\n\n /*\n * Empty array means all blockchains. So if any of to or from has an empty array,\n * it means all blockchains is available to use and there is no limitation from config.\n */\n if (!configFromBlockchains.length || !configToBlockchains.length) {\n return [];\n }\n const blockchains = [...configFromBlockchains, ...configToBlockchains];\n\n const supportedBlockchains = new Set(blockchains);\n\n return Array.from(supportedBlockchains);\n}\n", "import { TransactionType } from 'rango-types';\n\nexport const ACTIVE_BLOCKCHAINS_FOR_CUSTOM_TOKENS: string[] = [\n TransactionType.EVM,\n TransactionType.SOLANA,\n];\n\nexport const DEFAULT_TOKEN_IMAGE_SRC =\n 'https://raw.githubusercontent.com/rango-exchange/assets/refs/heads/main/common/unknown-image.png';\n", "import { RangoClient } from 'rango-sdk';\n\nimport { getConfig } from '../utils/configs';\n\nlet rango: RangoClient | undefined = undefined;\n\nexport const httpService = () => {\n if (rango) {\n return rango;\n }\n rango = new RangoClient(getConfig('API_KEY'), getConfig('BASE_URL'));\n return rango;\n};\n", "import { UI_ID } from '@rango-dev/ui';\n\nexport const RANGO_PUBLIC_API_KEY = 'c6381a79-2817-4602-83bf-6a641a409e32';\nexport const DEFAULT_BASE_URL = 'https://api.rango.exchange';\nexport const SCANNER_BASE_URL = 'https://explorer.rango.exchange';\n\nexport const WIDGET_UI_ID = {\n SWAP_BOX_ID: 'rango-swap-box',\n EXPANDED_BOX_ID: 'rango-expanded-box',\n ...UI_ID,\n};\n", "import type { BalanceState, ConnectedWallet } from '../store/slices/wallets';\nimport type {\n Balance,\n SelectedQuote,\n Wallet,\n WalletInfoWithExtra,\n} from '../types';\nimport type {\n ExtendedWalletInfo,\n ProviderContext,\n} from '@rango-dev/wallets-react';\nimport type {\n Network,\n WalletType,\n WalletTypes,\n} from '@rango-dev/wallets-shared';\nimport type { BlockchainMeta, Token, TransactionType } from 'rango-sdk';\n\nimport {\n BlockchainCategories,\n WalletState as WalletStatus,\n} from '@rango-dev/ui';\nimport { legacyReadAccountAddress as readAccountAddress } from '@rango-dev/wallets-core/legacy';\nimport {\n detectInstallLink,\n getCosmosExperimentalChainInfo,\n isEvmAddress,\n KEPLR_COMPATIBLE_WALLETS,\n Networks,\n} from '@rango-dev/wallets-shared';\nimport BigNumber from 'bignumber.js';\nimport { isCosmosBlockchain } from 'rango-types';\n\nimport { ZERO } from '../constants/numbers';\nimport {\n BALANCE_MAX_DECIMALS,\n BALANCE_MIN_DECIMALS,\n USD_VALUE_MAX_DECIMALS,\n USD_VALUE_MIN_DECIMALS,\n} from '../constants/routing';\nimport { EXCLUDED_WALLETS } from '../constants/wallets';\n\nimport { isBlockchainTypeInCategory, removeDuplicateFrom } from './common';\nimport { numberToString } from './numbers';\nimport { formatThousandsWithCommas } from './sanitizers';\n\nexport type ExtendedModalWalletInfo = WalletInfoWithExtra &\n Pick<ExtendedWalletInfo, 'properties' | 'isHub'>;\n\nexport function getWalletConnectionStatus(\n wallet: ExtendedWalletInfo,\n walletState: ReturnType<ProviderContext['state']>\n): WalletStatus {\n if (checkIsWalletPartiallyConnected(wallet, walletState)) {\n return WalletStatus.PARTIALLY_CONNECTED;\n }\n if (walletState.connected) {\n return WalletStatus.CONNECTED;\n }\n if (walletState.connecting) {\n return WalletStatus.CONNECTING;\n }\n if (!walletState.installed) {\n return WalletStatus.NOT_INSTALLED;\n }\n return WalletStatus.DISCONNECTED;\n}\n\nexport function mapWalletTypesToWalletInfo(\n getState: ProviderContext['state'],\n getWalletInfo: (type: WalletType) => ExtendedWalletInfo,\n list: WalletType[],\n chain?: string\n): ExtendedModalWalletInfo[] {\n return list\n .filter((wallet) => !EXCLUDED_WALLETS.includes(wallet as WalletTypes))\n .filter((wallet) => {\n const { supportedChains, isContractWallet } = getWalletInfo(wallet);\n\n const { installed, network } = getState(wallet);\n const filterContractWallets =\n isContractWallet && (!installed || (!!chain && network !== chain));\n if (filterContractWallets) {\n return false;\n }\n if (chain) {\n return !!supportedChains.find(\n (supportedChain) => supportedChain.name === chain\n );\n }\n return true;\n })\n .map((type) => {\n const {\n name,\n img: image,\n installLink,\n showOnMobile,\n needsNamespace,\n supportedChains,\n needsDerivationPath,\n properties,\n isHub,\n } = getWalletInfo(type);\n const blockchainTypes = removeDuplicateFrom(\n supportedChains.map((item) => item.type)\n );\n\n const state = getWalletConnectionStatus(\n getWalletInfo(type),\n getState(type)\n );\n return {\n title: name,\n image,\n link: detectInstallLink(installLink),\n state,\n type,\n showOnMobile,\n needsNamespace,\n blockchainTypes,\n needsDerivationPath,\n properties,\n isHub,\n };\n });\n}\n\nexport function walletAndSupportedChainsNames(\n supportedBlockchains: BlockchainMeta[]\n): Network[] | null {\n if (!supportedBlockchains) {\n return null;\n }\n let walletAndSupportedChainsNames: Network[] = [];\n walletAndSupportedChainsNames = supportedBlockchains.map(\n (blockchainMeta) => blockchainMeta.name\n );\n\n return walletAndSupportedChainsNames;\n}\n\nexport function prepareAccountsForWalletStore(\n wallet: WalletType,\n accounts: string[],\n evmBasedChains: string[],\n supportedChainNames: Network[] | null,\n isContractWallet: boolean\n): Wallet[] {\n const result: Wallet[] = [];\n\n function addAccount(\n network: Network,\n address: string,\n isContractWallet?: boolean\n ) {\n const accountForChainAlreadyExists = !!result.find(\n (account) => account.chain === network\n );\n if (!accountForChainAlreadyExists) {\n const newAccount: Wallet = {\n address,\n chain: network,\n walletType: wallet,\n isContractWallet: isContractWallet ?? false,\n };\n\n result.push(newAccount);\n }\n }\n\n const supportedBlockchains = supportedChainNames || [];\n\n accounts.forEach((account) => {\n const { address, network } = readAccountAddress(account);\n\n const hasLimitation = supportedBlockchains.length > 0;\n const isSupported = supportedBlockchains.includes(network);\n const isUnknown = network === Networks.Unknown;\n const notSupportedNetworkByWallet =\n hasLimitation && !isSupported && !isUnknown;\n\n /*\n * Here we check given `network` is not supported by wallet\n * And also the network is known.\n */\n if (notSupportedNetworkByWallet) {\n return;\n }\n\n /*\n * In some cases we can handle unknown network by checking its address\n * pattern and act on it.\n * Example: showing our evm compatible network when the unknown network is evm.\n * Otherwise, we stop executing this function.\n */\n const isUnknownAndEvmBased =\n network === Networks.Unknown && isEvmAddress(address);\n if (isUnknown && !isUnknownAndEvmBased) {\n return;\n }\n\n const isEvmBasedChain = evmBasedChains.includes(network);\n\n // If it's an evm network, we will add the address to all the evm chains.\n if (isEvmBasedChain || isUnknownAndEvmBased) {\n if (isContractWallet) {\n /*\n * for contract wallets like Safe wallet, we should add only account for the\n * current connected blockchain not all of the supported blockchains\n */\n addAccount(network, address.toLowerCase(), isContractWallet);\n } else {\n /*\n * all evm chains are not supported in wallets, so we are adding\n * only to those that are supported by wallet.\n */\n const evmChainsSupportedByWallet = supportedBlockchains.filter(\n (chain) => evmBasedChains.includes(chain)\n );\n\n evmChainsSupportedByWallet.forEach((network) => {\n /*\n * EVM addresses are not case sensitive.\n * Some wallets like Binance-chain return some letters in uppercase which produces bugs in our wallet state.\n */\n addAccount(network, address.toLowerCase());\n });\n }\n } else {\n addAccount(network, address);\n }\n });\n\n return result;\n}\n\nexport function getQuoteChains(params: {\n filter: 'all' | 'required';\n quote: SelectedQuote | null;\n}): string[] {\n const { filter, quote } = params;\n const wallets = new Set<string>();\n\n quote?.swaps.forEach((swap, swapIndex) => {\n const currentStepFromBlockchain = swap.from.blockchain;\n const currentStepToBlockchain = swap.to.blockchain;\n wallets.add(currentStepFromBlockchain);\n\n // Check if internalSwaps array exists\n if (swap.internalSwaps) {\n const { internalSwaps } = swap;\n internalSwaps.forEach((internalSwap, internalSwapIndex) => {\n const internalStepFromBlockchain = internalSwap.from.blockchain;\n const internalStepToBlockchain = internalSwap.to.blockchain;\n const isLastStep = swapIndex === quote.swaps.length - 1;\n const isLastInternalStep =\n internalSwapIndex === internalSwaps.length - 1;\n\n if (\n (!isLastStep && !isLastInternalStep) ||\n (isLastStep &&\n currentStepToBlockchain !== internalStepFromBlockchain) ||\n filter === 'all'\n ) {\n wallets.add(internalStepFromBlockchain);\n }\n if (filter === 'all') {\n wallets.add(internalStepToBlockchain);\n }\n });\n }\n\n if (filter === 'all') {\n wallets.add(currentStepToBlockchain);\n }\n });\n return Array.from(wallets);\n}\n\nexport function isAccountAndWalletMatched(\n account: Wallet,\n connectedWallet: ConnectedWallet\n) {\n return (\n account.address === connectedWallet.address &&\n account.chain === connectedWallet.chain &&\n account.walletType === connectedWallet.walletType\n );\n}\n\nexport function resetConnectedWalletState(\n connectedWallet: ConnectedWallet\n): ConnectedWallet {\n return { ...connectedWallet, loading: false, error: true };\n}\n\nexport const calculateWalletUsdValue = (balances: BalanceState) => {\n const total = Object.values(balances).reduce((prev, balance) => {\n const usdBalance = balance.usdValue\n ? representAmountInNumber(balance.usdValue, balance.decimals)\n : ZERO.toFixed();\n return prev.plus(usdBalance);\n }, new BigNumber(ZERO));\n\n return numberWithThousandSeparator(total.toString());\n};\n\nfunction numberWithThousandSeparator(number: string | number): string {\n const parts = number.toString().split('.');\n if (parts[0]) {\n parts[0] = formatThousandsWithCommas(parts[0]);\n }\n return parts.join('.');\n}\n\nexport const isExperimentalChain = (\n blockchains: BlockchainMeta[],\n wallet: string\n): boolean => {\n const cosmosExperimentalChainInfo = getCosmosExperimentalChainInfo(\n Object.entries(blockchains)\n .map(([, blockchainMeta]) => blockchainMeta)\n .filter(isCosmosBlockchain)\n );\n return (\n cosmosExperimentalChainInfo &&\n !!cosmosExperimentalChainInfo[wallet]?.experimental\n );\n};\n\nexport const getKeplrCompatibleConnectedWallets = (\n selectableWallets: Wallet[]\n): WalletType[] => {\n const connectedWalletTypes = new Set(\n selectableWallets.map((wallet) => {\n return wallet.walletType;\n })\n );\n\n return KEPLR_COMPATIBLE_WALLETS.filter((compatibleWallet) =>\n connectedWalletTypes.has(compatibleWallet)\n );\n};\n\nfunction representAmountInNumber(amount: string, decimals: number): string {\n return new BigNumber(amount).shiftedBy(-decimals).toFixed();\n}\n\nexport function formatBalance(balance: Balance | null): Balance | null {\n if (!balance) {\n return null;\n }\n\n const amount = representAmountInNumber(balance.amount, balance.decimals);\n const usdValue = balance.usdValue\n ? representAmountInNumber(balance.usdValue, balance.decimals)\n : null;\n const formattedAmount = numberToString(\n amount,\n BALANCE_MIN_DECIMALS,\n BALANCE_MAX_DECIMALS\n );\n // null is using for detecing uknown prices\n const formattedUsdValue = usdValue\n ? numberToString(usdValue, USD_VALUE_MIN_DECIMALS, USD_VALUE_MAX_DECIMALS)\n : null;\n\n const formattedBalance: Balance | null = balance\n ? {\n ...balance,\n amount: formattedAmount,\n usdValue: formattedUsdValue,\n }\n : null;\n\n return formattedBalance;\n}\n\nexport function compareTokenBalance(\n token1Balance: Balance | null,\n token2Balance: Balance | null\n): number {\n if (token1Balance?.usdValue || token2Balance?.usdValue) {\n const token1UsdValue =\n !!token1Balance && !!token1Balance.usdValue\n ? new BigNumber(token1Balance.usdValue).shiftedBy(\n -token1Balance.decimals\n )\n : ZERO;\n const token2UsdValue =\n !!token2Balance && !!token2Balance.usdValue\n ? new BigNumber(token2Balance.usdValue).shiftedBy(\n -token2Balance.decimals\n )\n : ZERO;\n\n if (token1UsdValue.isEqualTo(token2UsdValue)) {\n return 0;\n }\n return token1UsdValue.isGreaterThan(token2UsdValue) ? -1 : 1;\n }\n\n if (token1Balance?.amount || token2Balance?.amount) {\n const token1Amount =\n !!token1Balance && !!token1Balance.amount\n ? new BigNumber(token1Balance.amount).shiftedBy(-token1Balance.decimals)\n : ZERO;\n const token2Amount =\n !!token2Balance && !!token2Balance.amount\n ? new BigNumber(token2Balance.amount).shiftedBy(-token2Balance.decimals)\n : ZERO;\n\n if (token1Amount.isEqualTo(token2Amount)) {\n return 0;\n }\n return token1Amount.isGreaterThan(token2Amount) ? -1 : 1;\n }\n\n return 0;\n}\n\nexport function areTokensEqual(\n tokenA: Pick<Token, 'blockchain' | 'symbol' | 'address'> | null,\n tokenB: Pick<Token, 'blockchain' | 'symbol' | 'address'> | null\n) {\n return (\n tokenA?.blockchain === tokenB?.blockchain &&\n tokenA?.symbol.toLowerCase() === tokenB?.symbol.toLowerCase() &&\n tokenA?.address?.toLowerCase() === tokenB?.address?.toLowerCase()\n );\n}\n\nexport function sortWalletsBasedOnConnectionState(\n wallets: ExtendedModalWalletInfo[]\n): ExtendedModalWalletInfo[] {\n return wallets.sort(\n (a, b) =>\n Number(b.state === WalletStatus.CONNECTED) -\n Number(a.state === WalletStatus.CONNECTED) ||\n Number(b.state === WalletStatus.PARTIALLY_CONNECTED) -\n Number(a.state === WalletStatus.PARTIALLY_CONNECTED) ||\n Number(\n b.state === WalletStatus.DISCONNECTED ||\n b.state === WalletStatus.CONNECTING\n ) -\n Number(\n a.state === WalletStatus.DISCONNECTED ||\n a.state === WalletStatus.CONNECTING\n )\n );\n}\n\nexport function getConciseAddress(\n address: string,\n // eslint-disable-next-line @typescript-eslint/no-magic-numbers\n maxChars = 8,\n // eslint-disable-next-line @typescript-eslint/no-magic-numbers\n ellipsisLength = 3\n): string {\n if (address.length < 2 * maxChars + ellipsisLength) {\n return address;\n }\n const start = address.slice(0, maxChars);\n const end = address.slice(-maxChars);\n return `${start}${'.'.repeat(ellipsisLength)}${end}`;\n}\n\nexport function getAddress({\n chain,\n connectedWallets,\n walletType,\n}: {\n connectedWallets: ConnectedWallet[];\n walletType: string;\n chain: string;\n}): string | undefined {\n return connectedWallets.find(\n (connectedWallet) =>\n connectedWallet.walletType === walletType &&\n connectedWallet.chain === chain\n )?.address;\n}\n\nexport const isFetchingBalance = (\n connectedWallets: ConnectedWallet[],\n blockchain: string\n) =>\n !!connectedWallets.find(\n (wallet) => wallet.chain === blockchain && wallet.loading\n );\n\nexport function hashWalletsState(walletsInfo: WalletInfoWithExtra[]) {\n return walletsInfo.map((w) => w.state).join('-');\n}\n\nexport function filterBlockchainsByWalletTypes(\n wallets: WalletInfoWithExtra[],\n blockchains: BlockchainMeta[]\n) {\n const uniqueBlockchainTypes = new Set<TransactionType>();\n wallets.forEach((wallet) => {\n wallet.blockchainTypes.forEach((type) => {\n uniqueBlockchainTypes.add(type);\n });\n });\n const filteredBlockchains = blockchains.filter((blockchain) =>\n uniqueBlockchainTypes.has(blockchain.type)\n );\n\n return filteredBlockchains;\n}\n\nexport function filterWalletsByCategory(\n wallets: ExtendedModalWalletInfo[],\n category: string\n) {\n if (category === BlockchainCategories.ALL) {\n return wallets;\n }\n\n return wallets.filter((wallet) => {\n for (const type of wallet.blockchainTypes) {\n if (isBlockchainTypeInCategory(type, category)) {\n return true;\n }\n }\n return false;\n });\n}\n\nexport function checkIsWalletPartiallyConnected(\n wallet: ExtendedWalletInfo,\n walletState: ReturnType<ProviderContext['state']>\n) {\n if (!wallet.isHub || !wallet.needsNamespace || !walletState.connected) {\n return false;\n }\n const namespaces = wallet.needsNamespace.data;\n const supportedNamespaces = namespaces.filter(\n (namespace) => !namespace.unsupported\n );\n\n // If the wallet is connected to only a subset of namespaces, and the user has the option to connect to additional ones, we label the wallet as `Partially Connected`\n return (\n wallet.needsNamespace.selection === 'multiple' &&\n supportedNamespaces.some(\n (namespace) => !walletState.namespaces?.get(namespace.value)?.connected\n )\n );\n}\n", "import BigNumber from 'bignumber.js';\n\nexport const ZERO = new BigNumber(0);\n", "import { WalletTypes } from '@rango-dev/wallets-shared';\n\nexport const BALANCE_SEPARATOR = '~';\n\nexport const EXCLUDED_WALLETS = [WalletTypes.LEAP];\n", "import type { WalletInfoWithExtra } from '../types';\nimport type { BlockchainMeta, Token } from 'rango-sdk';\n\nimport { BlockchainCategories, WalletState } from '@rango-dev/ui';\nimport { TransactionType } from 'rango-sdk';\n\nimport { WIDGET_UI_ID } from '../constants';\nimport { SUPPORTED_FONTS } from '../constants/fonts';\nimport {\n MIN_LENGTH_SYMBOL_CONTAINS,\n MIN_LENGTH_SYMBOL_START_WITH,\n MIN_LENGTH_TOKEN_ADDRESS_CONTAINS,\n MIN_LENGTH_TOKEN_NAME_CONTAINS,\n MIN_LENGTH_TOKEN_NAME_EXACT_MATCH,\n} from '../constants/searchFor';\n\nexport function removeDuplicateFrom<T>(array: T[]): T[] {\n return Array.from(new Set(array));\n}\n\nexport function areEqual(\n array1: (number | string)[],\n array2: (number | string)[]\n) {\n return (\n array1.length === array2.length && array1.every((v, i) => v === array2[i])\n );\n}\n\n// eslint-disable-next-line @typescript-eslint/no-unsafe-function-type\nexport function debounce(fn: Function, time: number) {\n let timeoutId: ReturnType<typeof setTimeout> | null;\n return wrapper;\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n function wrapper(...args: any) {\n if (timeoutId) {\n clearTimeout(timeoutId);\n }\n timeoutId = setTimeout(() => {\n timeoutId = null;\n fn(...args);\n }, time);\n }\n}\n\nexport function containsText(text: string, searchText: string): boolean {\n return text.toLowerCase().indexOf(searchText.toLowerCase()) > -1;\n}\n\nexport function exactText(text: string, searchText: string): boolean {\n return text.toLowerCase() === searchText.toLowerCase();\n}\n\nexport function startWithText(text: string, searchText: string): boolean {\n return text.toLowerCase().startsWith(searchText.toLowerCase());\n}\n\nexport const getContainer = () =>\n document.getElementById(WIDGET_UI_ID.SWAP_BOX_ID) as HTMLElement;\n\nexport const getExpanded = () =>\n document.getElementById(WIDGET_UI_ID.EXPANDED_BOX_ID) as HTMLElement;\n\nfunction compareExactMatchText(\n searchFor: string,\n textA: string | null,\n textB: string | null\n) {\n const exactMatchA = !!textA && exactText(textA, searchFor);\n const exactMatchB = !!textB && exactText(textB, searchFor);\n if (exactMatchA !== exactMatchB) {\n return exactMatchA ? -1 : 1;\n }\n\n return 0;\n}\n\nfunction compareContainsText(\n searchFor: string,\n textA: string | null,\n textB: string | null\n) {\n const textContainsA = !!textA && containsText(textA, searchFor);\n const textContainsB = !!textB && containsText(textB, searchFor);\n if (textContainsA !== textContainsB) {\n return textContainsA ? -1 : 1;\n }\n\n // If both texts contains the searched term, The shorter one has priority\n if (textContainsA && textContainsB && textA?.length !== textB?.length) {\n return textA?.length - textB?.length;\n }\n\n return 0;\n}\n\nfunction compareStartWithText(\n searchFor: string,\n textA: string | null,\n textB: string | null\n) {\n const textStartWithA = !!textA && startWithText(textA, searchFor);\n const textStartWithB = !!textB && startWithText(textB, searchFor);\n if (textStartWithA !== textStartWithB) {\n return textStartWithA ? -1 : 1;\n }\n\n // If both texts start with the searched term, The shorter one has priority\n if (textStartWithA && textStartWithB && textA?.length !== textB?.length) {\n return textA?.length - textB?.length;\n }\n\n return 0;\n}\n\nexport function compareWithSearchFor(\n tokenA: Token,\n tokenB: Token,\n searchFor?: string\n): number {\n if (!searchFor) {\n return 0;\n }\n\n // 1: Check the order to exact match the symbol\n const symbolExactMatchCompare = compareExactMatchText(\n searchFor,\n tokenA.symbol,\n tokenB.symbol\n );\n if (symbolExactMatchCompare) {\n return symbolExactMatchCompare;\n }\n\n // 2: Check the order to exact match the token name\n if (searchFor.length >= MIN_LENGTH_TOKEN_NAME_EXACT_MATCH) {\n const tokenNameExactMatchCompare = compareExactMatchText(\n searchFor,\n tokenA.name,\n tokenB.name\n );\n if (tokenNameExactMatchCompare) {\n return tokenNameExactMatchCompare;\n }\n }\n\n // 3: Check symbol start with searchFor\n if (searchFor.length >= MIN_LENGTH_SYMBOL_START_WITH) {\n const symbolStartWithCompare = compareStartWithText(\n searchFor,\n tokenA.symbol,\n tokenB.symbol\n );\n\n if (symbolStartWithCompare) {\n return symbolStartWithCompare;\n }\n }\n\n // 4: Check symbol Contains searchFor\n if (searchFor.length >= MIN_LENGTH_SYMBOL_CONTAINS) {\n const symbolContainsCompare = compareContainsText(\n searchFor,\n tokenA.symbol,\n tokenB.symbol\n );\n\n if (symbolContainsCompare) {\n return symbolContainsCompare;\n }\n }\n\n // 5: Check token name start with searchFor\n if (searchFor.length >= MIN_LENGTH_TOKEN_NAME_CONTAINS) {\n const tokenNameStartWithCompare = compareStartWithText(\n searchFor,\n tokenA.name,\n tokenB.name\n );\n\n if (tokenNameStartWithCompare) {\n return tokenNameStartWithCompare;\n }\n }\n\n // 6: Check token name Contains searchFor\n if (searchFor.length >= MIN_LENGTH_TOKEN_NAME_CONTAINS) {\n const tokenNameContainsCompare = compareContainsText(\n searchFor,\n tokenA.name,\n tokenB.name\n );\n\n if (tokenNameContainsCompare !== 0) {\n return tokenNameContainsCompare;\n }\n }\n\n // 7: Check address start with searchFor\n if (searchFor.length >= MIN_LENGTH_TOKEN_ADDRESS_CONTAINS) {\n const addressStartWithCompare = compareStartWithText(\n searchFor,\n tokenA.address,\n tokenB.address\n );\n\n if (addressStartWithCompare) {\n return addressStartWithCompare;\n }\n }\n\n // 8: Check address Contains searchFor\n if (searchFor.length >= MIN_LENGTH_TOKEN_ADDRESS_CONTAINS) {\n const addressContainCompare = compareContainsText(\n searchFor,\n tokenA.address,\n tokenB.address\n );\n\n if (addressContainCompare !== 0) {\n return addressContainCompare;\n }\n }\n\n return 0;\n}\n\nexport const isBlockchainTypeInCategory = (\n blockchainType: TransactionType,\n category: string\n): boolean => {\n switch (category) {\n case BlockchainCategories.ALL:\n return true;\n case BlockchainCategories.UTXO:\n return blockchainType === TransactionType.TRANSFER;\n case BlockchainCategories.OTHER:\n return (\n blockchainType !== TransactionType.TRANSFER &&\n blockchainType !== TransactionType.COSMOS &&\n blockchainType !== TransactionType.EVM\n );\n default:\n return blockchainType === category;\n }\n};\n\nexport const getFontUrlByName = (fontName: string) => {\n const font = SUPPORTED_FONTS.find((font) => font.value === fontName);\n return font?.url;\n};\n\nexport function isSingleWalletActive(\n wallets: WalletInfoWithExtra[],\n multiWallets?: boolean\n) {\n const atLeastOneWalletIsConnected = !!wallets.find(\n (w) => w.state === WalletState.CONNECTED\n );\n return multiWallets === false && atLeastOneWalletIsConnected;\n}\n\n/**\n * A simple memo implementation\n * you can use it when you want to memoize a value in js space\n */\nexport function memoizedResult(): <R>(fn: () => R, key: number | string) => R {\n let currentKey: number | string;\n\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n let result: any;\n\n return (fn, key) => {\n if (!result || !currentKey || currentKey !== key) {\n currentKey = key;\n result = fn();\n return result;\n }\n\n return result;\n };\n}\n\nexport function filterBlockchainsWithAtLeastOneToken(\n blockchains: BlockchainMeta[],\n tokens: Token[]\n) {\n const blockchainsWithAtLeastOneToken = new Set<string>();\n\n tokens.forEach((token) => {\n blockchainsWithAtLeastOneToken.add(token.blockchain);\n });\n\n return blockchains.filter((blockchain) =>\n blockchainsWithAtLeastOneToken.has(blockchain.name)\n );\n}\n", "export const DEFAULT_FONT_FAMILY = 'Roboto';\n\nexport const SUPPORTED_FONTS = [\n {\n name: 'Roboto',\n value: 'Roboto',\n url: '',\n },\n {\n name: 'Times New Roman',\n value: 'Times New Roman',\n url: 'https://fonts.cdnfonts.com/css/times-new-roman',\n },\n {\n name: 'Arial',\n value: 'Arial',\n url: '',\n },\n {\n name: 'Open Sans',\n value: 'Open Sans',\n url: 'https://fonts.googleapis.com/css2?family=Open+Sans:ital,wght@0,300..800;1,300..800&display=swap',\n },\n {\n name: 'Noto Sans',\n value: 'Noto Sans',\n url: 'https://fonts.googleapis.com/css2?family=Noto+Sans:ital,wght@0,100..900;1,100..900&display=swap',\n },\n {\n name: 'Montserrat',\n value: 'Montserrat',\n url: 'https://fonts.googleapis.com/css2?family=Montserrat:ital,wght@0,100..900;1,100..900&display=swap',\n },\n {\n name: 'Poppins',\n value: 'Poppins',\n url: 'https://fonts.googleapis.com/css2?family=Poppins:ital,wght@0,100;0,200;0,300;0,400;0,500;0,600;0,700;0,800;0,900;1,100;1,200;1,300;1,400;1,500;1,600;1,700;1,800;1,900&display=swap',\n },\n {\n name: 'Roboto Condensed',\n value: 'Roboto Condensed',\n url: 'https://fonts.googleapis.com/css2?family=Roboto+Condensed:ital,wght@0,100..900;1,100..900&display=swap',\n },\n\n {\n name: 'Roboto Mono',\n value: 'Roboto Mono',\n url: 'https://fonts.googleapis.com/css2?family=Roboto+Mono:ital,wght@0,100..700;1,100..700&display=swap',\n },\n {\n name: 'Oswald',\n value: 'Oswald',\n url: 'https://fonts.googleapis.com/css2?family=Oswald:wght@200..700&display=swap',\n },\n {\n name: 'Raleway',\n value: 'Raleway',\n url: 'https://fonts.googleapis.com/css2?family=Raleway:ital,wght@0,100..900;1,100..900&display=swap',\n },\n {\n name: 'Sedan',\n value: 'Sedan',\n url: 'https://fonts.googleapis.com/css2?family=Sedan:ital@0;1&display=swap',\n },\n {\n name: 'Inter',\n value: 'Inter',\n url: 'https://fonts.googleapis.com/css2?family=Inter:wght@100..900&display=swap',\n },\n {\n name: 'Rubik',\n value: 'Rubik',\n url: 'https://fonts.googleapis.com/css2?family=Rubik:ital,wght@0,300..900;1,300..900&display=swap',\n },\n {\n name: 'Lora',\n value: 'Lora',\n url: 'https://fonts.googleapis.com/css2?family=Lora:ital,wght@0,400..700;1,400..700&display=swap',\n },\n {\n name: 'Barlow Condensed',\n value: 'Barlow Condensed',\n url: 'https://fonts.googleapis.com/css2?family=Barlow+Condensed:ital,wght@0,100;0,200;0,300;0,400;0,500;0,600;0,700;0,800;0,900;1,100;1,200;1,300;1,400;1,500;1,600;1,700;1,800;1,900&display=swap',\n },\n];\n", "/* eslint-disable @typescript-eslint/no-magic-numbers */\n\nimport type { BestRouteResponse } from 'rango-sdk';\n\nimport { BigNumber } from 'bignumber.js';\n\nimport { stripTrailingZeros } from './sanitizers';\nimport { isZeroValue } from './validation';\n\n/*\n * if time > 1h -> rounded with 5 minutes precision\n * if time < 1h -> rounded with 15 seconds precision\n */\nexport const roundedSecondsToString = (s: number): string => {\n const seconds = Math.floor((s % 60) / 15) * 15;\n const minutes = parseInt((s / 60).toString());\n if (minutes >= 60) {\n return `${Math.floor(minutes / 5) * 5}:00`;\n }\n return `${minutes.toString().padStart(2, '0')}:${seconds\n .toString()\n .padStart(2, '0')}`;\n};\n\nexport const numberToString = (\n number: BigNumber | string | number | null | undefined,\n minDecimals: number | null = null,\n maxDecimals: number | null = null\n): string => {\n if (number === null || number === undefined) {\n return '';\n }\n if (number === '') {\n return '';\n }\n const n = new BigNumber(number);\n const roundingMode = 1;\n let maxI = 1000;\n for (let i = 0; i < 60; i++) {\n if (new BigNumber(n.toFixed(i, roundingMode)).eq(n)) {\n maxI = i;\n break;\n }\n }\n\n if (n.gte(10000)) {\n return n.toFormat(0, roundingMode);\n }\n if (n.gte(1000)) {\n return n.toFormat(\n Math.min(\n maxI,\n Math.min(maxDecimals || 100, Math.max(minDecimals || 0, 1))\n ),\n roundingMode\n );\n }\n if (n.gte(100)) {\n return n.toFormat(\n Math.min(\n maxI,\n Math.min(maxDecimals || 100, Math.max(minDecimals || 0, 1))\n ),\n roundingMode\n );\n }\n if (n.gte(1)) {\n return n.toFormat(\n Math.min(\n maxI,\n Math.min(maxDecimals || 100, Math.max(minDecimals || 0, 2))\n ),\n roundingMode\n );\n }\n if (n.gte(0.01)) {\n return n.toFormat(\n Math.min(\n maxI,\n Math.min(maxDecimals || 100, Math.max(minDecimals || 0, 4))\n ),\n roundingMode\n );\n }\n for (let i = minDecimals || 4; i < 17; i++) {\n if (n.gte(Math.pow(10, -i))) {\n return n.toFormat(\n Math.min(\n maxI,\n Math.min(maxDecimals || 100, Math.max(minDecimals || 0, i))\n ),\n roundingMode\n );\n }\n }\n if (n.isEqualTo(0)) {\n return '0';\n }\n\n return n.toFormat(\n Math.min(maxI, Math.min(maxDecimals || 100, Math.max(minDecimals || 0, 8))),\n roundingMode\n );\n};\n\nexport const uint8ArrayToHex = (buffer: Uint8Array): string => {\n // buffer is an ArrayBuffer\n // eslint-disable-next-line @typescript-eslint/ban-ts-comment\n // @ts-ignore\n return [...buffer].map((x) => x.toString(16).padStart(2, '0')).join('');\n};\n\nexport const totalArrivalTime = (\n data: { estimatedTimeInSeconds: number | null }[] | undefined\n) => data?.reduce((a, b) => a + (b.estimatedTimeInSeconds ?? 0), 0) || 0;\n\nexport const rawFees = (data: BestRouteResponse): string =>\n (\n data?.result?.swaps?.flatMap((s) =>\n s.fee.map((f) => ({ swapperId: s.swapperId, fee: f }))\n ) || []\n )\n .reduce((partialSum, a) => partialSum + parseFloat(a.fee.amount), 0)\n .toFixed(3);\n\nexport const containsText = (text: string, searchText: string) =>\n text.toLowerCase().indexOf(searchText.toLowerCase()) > -1;\n\nexport const isPositiveNumber = (text?: string) =>\n !!text && parseFloat(text) > 0;\n\nexport function sanitizeInputAmount(amount: string): string {\n if (isZeroValue(amount)) {\n return '0';\n }\n\n return stripTrailingZeros(amount);\n}\n", "/**\n * Remove leading zeros when followed by another digit.\n * @example \"000123\" \u2192 \"123\"\n */\nexport function removeLeadingZeros(input: string): string {\n return input.replace(/^0+(?=\\d)/g, '');\n}\n\n/**\n * Ensure a leading zero before a decimal point.\n * @example \".45\" \u2192 \"0.45\"\n */\nexport function ensureLeadingZeroForDecimal(input: string): string {\n return input.replace(/^\\.(\\d+)/, '0.$1');\n}\n\n/**\n * Insert commas as thousand separators.\n * @example \"1234567\" \u2192 \"1,234,567\"\n */\nexport function formatThousandsWithCommas(input: string): string {\n return input.replace(/\\B(?=(\\d{3})+(?!\\d))/g, ',');\n}\n\n/**\n * Replace spaces (one or more) with a single dash.\n * @example \"a b c\" \u2192 \"a-b-c\"\n */\nexport function replaceSpacesWithDash(input: string): string {\n return input.replace(/\\s+/g, '-');\n}\n\n/**\n * Strip any trailing zeros in the fractional part, and remove a dangling decimal point.\n * @example \"0.0010000\" \u2192 \"0.001\"\n * @example \"10.000\" \u2192 \"10\"\n */\nexport function stripTrailingZeros(input: string): string {\n const s = input.replace(/(\\.\\d*?[1-9])0+$/, '$1');\n return s.replace(/\\.0+$/, '');\n}\n", "/**\n * Check if a string is composed only of zeros, optionally with decimal zeros.\n * @param input - string to test, e.g. \"0\", \"000.00\"\n * @returns true when input represents zero, otherwise false\n */\nexport function isZeroValue(input: string) {\n const zeroPattern = /^0+(?:\\.0+)?$/;\n return zeroPattern.test(input);\n}\n\n/**\n * Validate currency-style input: up to `maxDecimals` places after the decimal point.\n * @param input - string to test, e.g. \"0\", \"10.25\"\n * @param maxDecimals - maximum digits allowed after the decimal (default: 2)\n * @returns true for valid money formats, false otherwise\n */\nexport function isValidCurrencyFormat(\n input: string,\n maxDecimals: number = 2\n): boolean {\n // construct pattern like ^(?:0|[1-9]\\d*)(?:\\.\\d{1,2})?$\n const pattern = `^(?:0|[1-9]\\\\d*)(?:\\\\.\\\\d{1,${maxDecimals}})?$`;\n const regex = new RegExp(pattern);\n return regex.test(input);\n}\n\n/**\n * Test if a string is a numeric literal (integers or decimals), allows leading zeros.\n * @param input - string to test, e.g. \"00.5\", \"123\"\n * @returns true when string is numeric, false otherwise\n */\nexport function isNumeric(input: string): boolean {\n const numericPattern = /^\\d+(?:\\.\\d+)?$/;\n return numericPattern.test(input);\n}\n\n/**\n * Detect if a color key name ends with digits (overriding default shades).\n * @param key - color key, e.g. \"primary\", \"secondary100\"\n * @returns true when key has numeric suffix, false otherwise\n */\nexport function isColorKeyOverridden(key: string): boolean {\n const overridePattern = /\\d+$/;\n return overridePattern.test(key);\n}\n", "import type { Tokens, WidgetVariant } from '../types';\nimport type { Asset, BlockchainMeta, Token } from 'rango-sdk';\n\nimport { RANGO_PUBLIC_API_KEY } from '../constants';\n\nimport { areTokensEqual } from './wallets';\n\nexport interface Configs {\n API_KEY: string;\n BASE_URL?: string;\n}\n\ntype TokensConfig =\n | Asset[]\n | {\n [blockchain: string]: Tokens;\n };\n\nlet configs: Configs = {\n API_KEY: RANGO_PUBLIC_API_KEY,\n};\n\nexport function getConfig(name: keyof Configs) {\n return configs[name] || '';\n}\n\nexport function setConfig(name: keyof Configs, value: any) {\n configs[name] = value;\n\n return value;\n}\n\n/**\n * Getting new configs from params and reset the value of global `configs` with provided param.\n */\nexport function initConfig(nextConfigs: Configs) {\n let clonedConfigs;\n if (typeof structuredClone === 'function') {\n clonedConfigs = structuredClone(nextConfigs);\n } else {\n clonedConfigs = JSON.parse(JSON.stringify(nextConfigs));\n }\n configs = clonedConfigs;\n return configs;\n}\n\nexport const DEFAULT_PRIMARY_RADIUS = 20;\nexport const DEFAULT_SECONDARY_RADIUS = 25;\n\nexport const THEME_CLASS_NAME_PREFIX = `theme-widget`;\n\nexport const isTokenExcludedInConfig = (\n token: Token | null,\n tokensConfig?: TokensConfig\n) => {\n let result = false;\n\n if (tokensConfig && token) {\n if (Array.isArray(tokensConfig)) {\n result = !tokensConfig.some((asset) => areTokensEqual(asset, token));\n } else if (!Array.isArray(tokensConfig)) {\n const configForChain = tokensConfig[token.blockchain];\n if (configForChain) {\n result = !!configForChain.tokens.some((asset) =>\n areTokensEqual(asset, token)\n );\n const isExcluded = configForChain.isExcluded;\n return (!isExcluded && !result) || (isExcluded && result);\n }\n }\n }\n return result;\n};\n\nexport const isBlockchainExcludedInConfig = (\n blockchain: BlockchainMeta | null,\n blockchainsConfig?: string[]\n) => {\n return (\n blockchain &&\n blockchainsConfig &&\n !blockchainsConfig.includes(blockchain.name)\n );\n};\n\nexport const isVariantExpandable = (\n isLargeScreen: boolean,\n isExtraLargeScreen: boolean,\n variant?: WidgetVariant\n) => {\n return (\n (variant === 'expanded' && (isLargeScreen || isExtraLargeScreen)) ||\n (variant === 'full-expanded' && isExtraLargeScreen)\n );\n};\n", "import type { Features, HighSlippageWarning, Routing } from '../types';\nimport type { SwapperMeta, SwapperType, Token } from 'rango-sdk';\n\nimport { i18n } from '@lingui/core';\n\nimport {\n HIGH_SLIPPAGE,\n MAX_SLIPPAGE,\n MIN_SLIPPAGE,\n} from '../constants/swapSettings';\nimport { QuoteWarningType } from '../types';\n\nimport { removeDuplicateFrom } from './common';\n\nexport type UniqueSwappersGroupType = {\n id: string;\n groupTitle: string;\n logo: string;\n type: SwapperType;\n selected: boolean;\n};\n\nexport function getUniqueSwappersGroups(\n swappers: SwapperMeta[],\n disabledLiquiditySources: string[]\n): UniqueSwappersGroupType[] {\n const supportedSwappers = swappers.map((swapper) => swapper.swapperGroup);\n\n const uniqueSupportedSwappersGroups: Array<UniqueSwappersGroupType> = [];\n\n const uniqueGroup = removeDuplicateFrom(swappers.map((s) => s.swapperGroup));\n\n uniqueGroup.map((uniqueGroupItem) => {\n const swapperItem = swappers.find(\n (swapper) => swapper.swapperGroup === uniqueGroupItem\n );\n\n if (swapperItem) {\n let isSupportedSwapper = true;\n if (supportedSwappers) {\n isSupportedSwapper = supportedSwappers.some(\n (supportedItem) => supportedItem === swapperItem.swapperGroup\n );\n }\n\n if (isSupportedSwapper) {\n swapperItem.types.map((swapperTypeItem) => {\n uniqueSupportedSwappersGroups.push({\n id: swapperItem.swapperGroup,\n groupTitle: swapperItem.swapperGroup,\n logo: swapperItem.logo,\n type: swapperTypeItem,\n selected: !disabledLiquiditySources.includes(\n swapperItem.swapperGroup\n ),\n });\n });\n }\n }\n });\n\n return uniqueSupportedSwappersGroups;\n}\n\nexport function sortLiquiditySourcesByGroupTitle(\n a: SwapperMeta,\n b: SwapperMeta\n) {\n if (a.swapperGroup < b.swapperGroup) {\n return -1;\n }\n\n if (a.swapperGroup > b.swapperGroup) {\n return 1;\n }\n\n return 0;\n}\n\nexport function isFeatureHidden(feature: keyof Features, features?: Features) {\n return features?.[feature] === 'hidden';\n}\n\nexport function isRoutingEnabled(item: keyof Routing, routing?: Routing) {\n return routing?.[item] === 'enabled';\n}\n\nexport const addCustomTokensToSupportedTokens = (\n supportedTokens: Token[],\n customTokens: Token[],\n features?: Features\n) => {\n const isCustomTokensHidden = isFeatureHidden('customTokens', features);\n\n return isCustomTokensHidden\n ? supportedTokens\n : supportedTokens.concat(customTokens);\n};\n\nexport function getSlippageValidation(slippage: number): {\n type: 'error' | 'warning';\n message: string;\n quoteValidation?: HighSlippageWarning;\n} | null {\n if (slippage == MIN_SLIPPAGE) {\n return {\n type: 'error',\n message: i18n.t('Slippage must be greater than or equal to 0.01'),\n };\n } else if (slippage > HIGH_SLIPPAGE && slippage <= MAX_SLIPPAGE) {\n return {\n type: 'warning',\n message: i18n.t(\n 'Your transaction is at risk of being frontrun due to high slippage tolerance.'\n ),\n quoteValidation: {\n type: QuoteWarningType.HIGH_SLIPPAGE,\n slippage: slippage.toString(),\n },\n };\n }\n\n return null;\n}\n", "const LOW = 0.5;\nconst MEDIUM = 1;\nconst HIGH = 3;\n\nexport const SLIPPAGES = [LOW, MEDIUM, HIGH];\n\nexport const DEFAULT_SLIPPAGE = 1;\n\nexport const HIGH_SLIPPAGE = 5;\n\nexport const MAX_SLIPPAGE = 30;\n\nexport const MIN_SLIPPAGE = 0;\n", "/* eslint-disable @typescript-eslint/prefer-enum-initializers */\n\nimport type { PriceImpactWarningLevel } from '@rango-dev/ui';\nimport type BigNumber from 'bignumber.js';\nimport type {\n Asset,\n BlockchainValidationStatus,\n RouteTag,\n RoutingResultType,\n SwapResult,\n} from 'rango-sdk';\n\nexport enum QuoteErrorType {\n NO_RESULT,\n REQUEST_FAILED,\n REQUEST_CANCELED,\n BRIDGE_LIMIT,\n INSUFFICIENT_SLIPPAGE,\n}\n\nexport type NoResultError = {\n type: QuoteErrorType.NO_RESULT;\n diagnosisMessage?: string;\n};\n\nexport type BridgeLimitError = {\n type: QuoteErrorType.BRIDGE_LIMIT;\n swap: SwapResult;\n recommendation: string;\n fromAmountRangeError: string;\n};\n\nexport type InsufficientSlippageError = {\n type: QuoteErrorType.INSUFFICIENT_SLIPPAGE;\n recommendedSlippages: RecommendedSlippages | null;\n minRequiredSlippage: string | null;\n};\n\nexport type QuoteRequestFailed = {\n type: QuoteErrorType.REQUEST_FAILED;\n diagnosisMessage?: string;\n};\nexport type QuoteRequestCanceled = { type: QuoteErrorType.REQUEST_CANCELED };\n\nexport type QuoteError =\n | NoResultError\n | BridgeLimitError\n | InsufficientSlippageError\n | QuoteRequestFailed\n | QuoteRequestCanceled;\n\nexport enum QuoteWarningType {\n HIGH_VALUE_LOSS,\n UNKNOWN_PRICE,\n INSUFFICIENT_SLIPPAGE,\n HIGH_SLIPPAGE,\n EXCESSIVE_OUTPUT_AMOUNT_CHANGE,\n}\n\nexport type RecommendedSlippages = Record<number, string>;\n\nexport type InsufficientSlippageWarning = {\n type: QuoteWarningType.INSUFFICIENT_SLIPPAGE;\n recommendedSlippages: RecommendedSlippages | null;\n minRequiredSlippage: string | null;\n};\n\nexport type HighSlippageWarning = {\n type: QuoteWarningType.HIGH_SLIPPAGE;\n slippage: string | null;\n};\n\nexport type HighValueLossWarning = {\n type: QuoteWarningType.HIGH_VALUE_LOSS;\n warningLevel: PriceImpactWarningLevel;\n inputUsdValue: BigNumber;\n outputUsdValue: BigNumber;\n totalFee: BigNumber;\n priceImpact: number;\n};\n\nexport type UnknownPriceWarning = {\n type: QuoteWarningType.UNKNOWN_PRICE;\n};\n\nexport type ExcessiveOutputAmountChange = {\n type: QuoteWarningType.EXCESSIVE_OUTPUT_AMOUNT_CHANGE;\n usdValueChange: string;\n percentageChange: string;\n};\n\nexport type QuoteWarning =\n | HighValueLossWarning\n | ExcessiveOutputAmountChange\n | UnknownPriceWarning\n | InsufficientSlippageWarning\n | HighSlippageWarning;\n\nexport type ConfirmSwapWarnings = {\n quote: QuoteWarning | null;\n balance: { messages: string[] } | null;\n};\n\nexport type QuoteResponse = {\n requestId: string;\n swaps?: SwapResult[];\n diagnosisMessages: string[] | null;\n};\n\nexport type SelectedQuote = {\n swaps: SwapResult[];\n requestId: string;\n outputAmount?: string;\n resultType?: RoutingResultType;\n tags?: RouteTag[];\n validationStatus: BlockchainValidationStatus[] | null;\n requestAmount: string;\n};\n\nexport type QuoteErrorResponse = {\n message: string;\n options: QuoteError;\n};\n\nexport type QuoteInputs = {\n fromBlockchain: string | null;\n toBlockchain: string | null;\n fromToken: Asset | null;\n toToken: Asset | null;\n requestAmount: string;\n};\n\nexport type UpdateQuoteInputs = (params: Partial<QuoteInputs>) => void;\n", "import type { SelectedQuote } from './quote';\nimport type { Wallet } from './wallets';\nimport type {\n RouteEventData,\n StepEventData,\n} from '@rango-dev/queue-manager-rango-preset';\n\nimport { WidgetEvents as QueueManagerEvents } from '@rango-dev/queue-manager-rango-preset';\n\ntype EventData<\n T extends QuoteEventTypes | WalletEventTypes | UiEventTypes,\n U extends Record<string, unknown> | null\n> = { type: T; payload: U };\n\nexport type PreventableEventPayload<\n T extends Record<string, unknown> = Record<string, unknown>\n> = {\n preventDefault: () => void;\n} & T;\n\ntype Account = Wallet;\n\nexport enum QuoteEventTypes {\n QUOTE_INPUT_UPDATE = 'quoteInputUpdate',\n QUOTE_OUTPUT_UPDATE = 'quoteOutputUpdate',\n}\n\nexport enum WalletEventTypes {\n CONNECT = 'connect',\n DISCONNECT = 'disconnect',\n}\n\n/**\n * We use a prefix for interaction type and a name for defining the event name: INTERACTION_EVENT_NAME\n * e.g. CLICK_X_BUTTON or NAVIGATE_WALLET_PAGE\n */\nexport enum UiEventTypes {\n CLICK_CONNECT_WALLET = 'clickConnectWallet',\n}\n\nexport type QuoteInputUpdateEventPayload = {\n fromBlockchain?: string;\n toBlockchain?: string;\n fromToken?: { symbol: string; name: string | null; address: string | null };\n toToken?: { symbol: string; name: string | null; address: string | null };\n requestAmount?: string;\n};\n\nexport type QuoteUpdateEventPayload = Pick<\n SelectedQuote,\n 'requestAmount' | 'swaps' | 'outputAmount' | 'resultType' | 'tags'\n> | null;\n\nexport type ConnectWalletEventPayload = {\n walletType: string;\n accounts: Account[];\n};\n\nexport type DisconnectWalletEventPayload = {\n walletType: string;\n};\n\nexport type ClickConnectWalletPayload = PreventableEventPayload;\n\nexport type QuoteEventData =\n | EventData<QuoteEventTypes.QUOTE_INPUT_UPDATE, QuoteInputUpdateEventPayload>\n | EventData<QuoteEventTypes.QUOTE_OUTPUT_UPDATE, QuoteUpdateEventPayload>;\n\nexport type WalletEventData =\n | EventData<WalletEventTypes.CONNECT, ConnectWalletEventPayload>\n | EventData<WalletEventTypes.DISCONNECT, DisconnectWalletEventPayload>;\n\nexport type UiEventData = EventData<\n UiEventTypes.CLICK_CONNECT_WALLET,\n ClickConnectWalletPayload\n>;\n\nexport enum WidgetEvents {\n RouteEvent = QueueManagerEvents.RouteEvent,\n StepEvent = QueueManagerEvents.StepEvent,\n QuoteEvent = 'quoteEvent',\n WalletEvent = 'walletEvent',\n UiEvent = 'uiEvent',\n}\n\nexport type Events = {\n [WidgetEvents.RouteEvent]: RouteEventData;\n [WidgetEvents.StepEvent]: StepEventData;\n [WidgetEvents.QuoteEvent]: QuoteEventData;\n [WidgetEvents.WalletEvent]: WalletEventData;\n [WidgetEvents.UiEvent]: UiEventData;\n};\n\ndeclare type EventHandler<T = unknown> = (event: T) => void;\n\nexport type WidgetEventEmitter = {\n on<Key extends WidgetEvents>(\n type: Key,\n handler: EventHandler<Events[Key]>\n ): void;\n off<Key extends WidgetEvents>(\n type: Key,\n handler?: EventHandler<Events[Key]>\n ): void;\n};\n", "// We keep all the received data from server in this slice\n\nimport type { ConfigSlice } from './config';\nimport type { SettingsSlice } from './settings';\nimport type { CachedEntries } from '../../services/cacheService';\nimport type { Balance, Blockchain, TokenHash } from '../../types';\nimport type { StateCreator } from 'zustand';\n\nimport {\n type Asset,\n type BlockchainMeta,\n type SwapperMeta,\n type Token,\n} from 'rango-sdk';\n\nimport { ACTIVE_BLOCKCHAINS_FOR_CUSTOM_TOKENS } from '../../constants/customTokens';\nimport { cacheService } from '../../services/cacheService';\nimport { httpService as sdk } from '../../services/httpService';\nimport { compareWithSearchFor, containsText } from '../../utils/common';\nimport { createTokenHash, isTokenNative } from '../../utils/meta';\nimport {\n addCustomTokensToSupportedTokens,\n isRoutingEnabled,\n sortLiquiditySourcesByGroupTitle,\n} from '../../utils/settings';\nimport { areTokensEqual, compareTokenBalance } from '../../utils/wallets';\nimport {\n getSupportedBlockchainsFromConfig,\n matchTokensFromConfigWithMeta,\n} from '../utils';\n\ntype BlockchainOptions = {\n type?: 'source' | 'destination' | 'custom-token';\n};\n\ntype TokenOptions = {\n type: 'source' | 'destination';\n // filter by an specific blockchain\n blockchain?: string;\n searchFor?: string;\n getBalanceFor?: (token: Token) => Balance | null;\n};\n\nexport type FindToken = (asset: Asset) => Token | undefined;\n\nexport type FetchStatus = 'loading' | 'success' | 'failed';\nexport interface DataSlice {\n _blockchainsMapByName: Map<string, BlockchainMeta>;\n _tokensMapByTokenHash: Map<TokenHash, Token>;\n _tokensMapByBlockchainName: Record<Blockchain, TokenHash[]>;\n _popularTokens: Token[];\n _swappers: SwapperMeta[];\n fetchStatus: FetchStatus;\n blockchains: (options?: BlockchainOptions) => BlockchainMeta[];\n tokens: (options?: TokenOptions) => Token[];\n swappers: () => SwapperMeta[];\n isTokenPinned: (token: Token, type: 'source' | 'destination') => boolean;\n findToken: FindToken;\n findNativeToken: (blockchain: BlockchainMeta) => Token | undefined;\n fetch: () => Promise<void>;\n}\n\nexport const createDataSlice: StateCreator<\n DataSlice & ConfigSlice & SettingsSlice,\n [],\n [],\n DataSlice\n> = (set, get) => ({\n // State\n _blockchainsMapByName: new Map(),\n _tokensMapByTokenHash: new Map(),\n _tokensMapByBlockchainName: {},\n _popularTokens: [],\n _swappers: [],\n fetchStatus: 'loading',\n // Selectors\n blockchains: (options) => {\n const blockchainsMapByName = get()._blockchainsMapByName;\n const blockchainsFromState = Array.from(\n blockchainsMapByName?.values() || []\n );\n\n if (!options || !options?.type) {\n return blockchainsFromState;\n }\n const config = get().config;\n\n if (options.type === 'custom-token') {\n const supportedBlockchainsFromConfig = getSupportedBlockchainsFromConfig({\n config,\n });\n\n let supportedBlockchains: BlockchainMeta[] = blockchainsFromState;\n\n /*\n * Supported blockchains can be configured and be limited.\n * In this case, we only keep those active blockchains which exist in config.\n */\n if (supportedBlockchainsFromConfig.length > 0) {\n supportedBlockchains = supportedBlockchains.filter((blockchain) =>\n supportedBlockchainsFromConfig.includes(blockchain.name)\n );\n }\n\n return supportedBlockchains.filter((blockchain) =>\n ACTIVE_BLOCKCHAINS_FOR_CUSTOM_TOKENS.includes(blockchain.type)\n );\n }\n\n const supportedBlockchainsFromConfig =\n (options.type === 'source'\n ? config.from?.blockchains\n : config.to?.blockchains) ?? [];\n\n const list = blockchainsFromState.filter((blockchain) => {\n if (\n supportedBlockchainsFromConfig.length > 0 &&\n !supportedBlockchainsFromConfig.includes(blockchain.name)\n ) {\n return false;\n }\n\n return true;\n });\n\n return list;\n },\n tokens: (options) => {\n const {\n _tokensMapByTokenHash,\n _tokensMapByBlockchainName,\n config,\n _customTokens,\n } = get();\n const tokensFromState = Array.from(_tokensMapByTokenHash.values());\n const blockchainsMapByName = get()._blockchainsMapByName;\n if (!options || !options.type) {\n return tokensFromState;\n }\n\n const configType = options.type === 'source' ? 'from' : 'to';\n const cacheKey: keyof CachedEntries =\n options.type === 'source'\n ? 'supportedSourceTokens'\n : 'supportedDestinationTokens';\n\n let supportedTokens = cacheService.get(cacheKey);\n if (!supportedTokens?.length) {\n supportedTokens = matchTokensFromConfigWithMeta({\n type: options.type,\n config: {\n blockchains: config[configType]?.blockchains,\n tokens: config[configType]?.tokens,\n },\n meta: {\n tokensMapByTokenHash: _tokensMapByTokenHash,\n tokensMapByBlockchainName: _tokensMapByBlockchainName,\n },\n });\n cacheService.set(cacheKey, supportedTokens);\n }\n\n supportedTokens = addCustomTokensToSupportedTokens(\n supportedTokens,\n _customTokens,\n config.features\n );\n\n const blockchains = get().blockchains({\n type: options.type,\n });\n\n const list = supportedTokens\n .filter((token) => {\n // If a specific blockchain has passed, we only keep that blockchain's tokens.\n if (!!options.blockchain && token.blockchain !== options.blockchain) {\n return false;\n }\n\n // Check only available blockchains\n if (\n !blockchains.some((blockchain) => {\n return blockchain.name === token.blockchain;\n })\n ) {\n return false;\n }\n\n // Search functionality\n if (options.searchFor) {\n if (\n containsText(token.symbol, options.searchFor) ||\n containsText(token.address || '', options.searchFor) ||\n containsText(token.name || '', options.searchFor)\n ) {\n return true;\n }\n\n return false;\n }\n\n return true;\n })\n .sort((tokenA, tokenB) => {\n //1. sort by pinned tokens\n const isToken1Pinned = get().isTokenPinned(tokenA, options.type);\n const isToken2Pinned = get().isTokenPinned(tokenB, options.type);\n if (isToken1Pinned !== isToken2Pinned) {\n return isToken1Pinned ? -1 : 1;\n }\n\n //2. sort by balance\n if (options.getBalanceFor) {\n const token1Balance = options.getBalanceFor(tokenA);\n const token2Balance = options.getBalanceFor(tokenB);\n const balanceCompare = compareTokenBalance(\n token1Balance,\n token2Balance\n );\n if (balanceCompare !== 0) {\n return balanceCompare;\n }\n }\n\n const blockChainA = blockchainsMapByName.get(tokenA.blockchain);\n const blockChainB = blockchainsMapByName.get(tokenB.blockchain);\n\n //3. sort by native token\n const isNativeTokenA = isTokenNative(tokenA, blockChainA);\n const isNativeTokenB = isTokenNative(tokenB, blockChainB);\n if (isNativeTokenA !== isNativeTokenB) {\n return isNativeTokenA ? -1 : 1;\n }\n\n //4. sort by token popularity\n if (tokenA.isPopular !== tokenB.isPopular) {\n return tokenA.isPopular ? -1 : 1;\n }\n\n //5. sort by search phrase\n if (options.searchFor) {\n const symbolSearchForCompare = compareWithSearchFor(\n tokenA,\n tokenB,\n options.searchFor\n );\n if (symbolSearchForCompare) {\n return symbolSearchForCompare;\n }\n }\n\n //6. sort by token isSecondary\n if (tokenA.isSecondaryCoin !== tokenB.isSecondaryCoin) {\n return tokenA.isSecondaryCoin ? 1 : -1;\n }\n\n //7. sort by blockchain order\n if (!!blockChainA && !!blockChainB) {\n return blockChainA.sort - blockChainB.sort;\n }\n\n return 0;\n });\n\n return list;\n },\n findToken: (asset) => {\n const tokensMapByHashToken = get()._tokensMapByTokenHash;\n const customTokens = get().customTokens();\n const tokenHash = createTokenHash(asset);\n let token = tokensMapByHashToken.get(tokenHash);\n if (!token) {\n token = customTokens.find(\n (customToken) => createTokenHash(customToken) === tokenHash\n );\n }\n return token;\n },\n findNativeToken: (blockchain: BlockchainMeta) => {\n const feeAsset = blockchain.feeAssets[0];\n return get().findToken({\n blockchain: blockchain.name,\n address: feeAsset.address,\n symbol: feeAsset.symbol,\n });\n },\n isTokenPinned: (token, type) => {\n const pinnedTokens =\n type === 'source'\n ? get().config.from?.pinnedTokens\n : get().config.to?.pinnedTokens;\n const pinned = !!pinnedTokens?.some((pinnedToken) =>\n areTokensEqual(pinnedToken, token)\n );\n return pinned;\n },\n swappers: () => {\n const { config, campaignMode } = get();\n\n const campaignModeLiquiditySource = campaignMode.liquiditySources?.length\n ? campaignMode.liquiditySources\n : null;\n\n const liquiditySources =\n campaignModeLiquiditySource ?? config.liquiditySources;\n\n const excludeLiquiditySources = campaignModeLiquiditySource\n ? false\n : config.excludeLiquiditySources;\n\n /*\n * If the excludeLiquiditySources flag is set to true, we return all swappers that are not included in the config.\n * Otherwise, we return all swappers that are included in the config.\n */\n const swappers = get()._swappers.filter((swapper) => {\n const swapperGroupIncludedInLiquiditySources = liquiditySources?.includes(\n swapper.swapperGroup\n );\n\n const shouldExcludeLiquiditySources =\n excludeLiquiditySources ||\n !liquiditySources ||\n liquiditySources.length === 0;\n\n return shouldExcludeLiquiditySources\n ? !swapperGroupIncludedInLiquiditySources\n : swapperGroupIncludedInLiquiditySources;\n });\n\n const sortedSwappers = swappers.sort(sortLiquiditySourcesByGroupTitle);\n\n return sortedSwappers;\n },\n // Actions\n fetch: async () => {\n try {\n const { routing } = get().config;\n const enableCentralizedSwappers = isRoutingEnabled(\n 'enableCentralizedSwappers',\n routing\n );\n\n const response = await sdk().getAllMetadata({\n enableCentralizedSwappers,\n });\n set({ fetchStatus: 'success' });\n const blockchainsMapByName: Map<string, BlockchainMeta> = new Map<\n string,\n BlockchainMeta\n >();\n\n const tokensMapByTokenHash: Map<TokenHash, Token> = new Map<\n TokenHash,\n Token\n >();\n const tokensMapByBlockchainName: DataSlice['_tokensMapByBlockchainName'] =\n {};\n const popularTokens: Token[] = response.popularTokens;\n const swappers: SwapperMeta[] = response.swappers.filter(\n (swapper) => swapper.enabled\n );\n\n const sortedBlockchain = response.blockchains.sort(\n (a, b) => a.sort - b.sort\n );\n\n sortedBlockchain.forEach((blockchain) => {\n if (blockchain.enabled) {\n blockchainsMapByName.set(blockchain.name, blockchain);\n }\n });\n\n response.tokens.forEach((token) => {\n const tokenHash = createTokenHash(token);\n if (!tokensMapByBlockchainName[token.blockchain]) {\n tokensMapByBlockchainName[token.blockchain] = [];\n }\n tokensMapByTokenHash.set(tokenHash, token);\n tokensMapByBlockchainName[token.blockchain]?.push(tokenHash);\n });\n\n set({\n _blockchainsMapByName: blockchainsMapByName,\n _tokensMapByTokenHash: tokensMapByTokenHash,\n _tokensMapByBlockchainName: tokensMapByBlockchainName,\n _popularTokens: popularTokens,\n _swappers: swappers,\n });\n } catch (error) {\n set({ fetchStatus: 'failed' });\n throw error;\n }\n },\n});\n", "import type { FlagPropTypes, Language } from '@rango-dev/ui';\n\nimport {\n Bengali,\n Catalonia,\n Chinese,\n Denmark,\n English,\n Finland,\n French,\n German,\n Greece,\n Hungary,\n India,\n Indonesian,\n Italian,\n Japanese,\n Korea,\n Lithuania,\n Malay,\n Netherlands,\n Pakistan,\n Philippines,\n Poland,\n Portuguese,\n Russian,\n SaudiArabia,\n Serbia,\n Slovakia,\n SouthAfrica,\n Spanish,\n Swahili,\n Swedish,\n Thai,\n Turkish,\n Ukrainian,\n Vietnamese,\n} from '@rango-dev/ui';\n\nexport type LanguageItem = {\n title: string;\n label: string;\n local: Language;\n SVGFlag: React.ComponentType<FlagPropTypes>;\n};\n\nexport const LANGUAGES: LanguageItem[] = [\n { title: 'Afrikaans', label: 'Afrikaans', local: 'af', SVGFlag: SouthAfrica },\n { title: 'Arabic', label: '\u0639\u0631\u0628\u064A', local: 'ar', SVGFlag: SaudiArabia },\n { title: 'Bengali', label: '\u09AC\u09BE\u0982\u09B2\u09BE', local: 'bn', SVGFlag: Bengali },\n { title: 'Catalan', label: 'Catal\u00E0', local: 'ca', SVGFlag: Catalonia },\n {\n title: 'Chinese (Simplified)',\n label: '\u7B80\u4F53\u4E2D\u6587',\n local: 'zh-CN',\n SVGFlag: Chinese,\n },\n {\n title: 'Chinese (Traditional)',\n label: '\u4E2D\u6587\uFF08\u7E41\u9AD4)',\n local: 'zh-TW',\n SVGFlag: Chinese,\n },\n { title: 'Danish', label: 'Dansk', local: 'da', SVGFlag: Denmark },\n { title: 'Dutch', label: 'Nederlands', local: 'nl', SVGFlag: Netherlands },\n { title: 'English', label: 'English', local: 'en', SVGFlag: English },\n { title: 'Filipino', label: 'Filipino', local: 'fil', SVGFlag: Philippines },\n { title: 'Finnish', label: 'Suomalainen', local: 'fi', SVGFlag: Finland },\n { title: 'French', label: 'Fran\u00E7ais', local: 'fr', SVGFlag: French },\n { title: 'German', label: 'Deutsch', local: 'de', SVGFlag: German },\n { title: 'Greek', label: '\u03B5\u03BB\u03BB\u03B7\u03BD\u03B9\u03BA\u03AC', local: 'el', SVGFlag: Greece },\n { title: 'Hindi', label: '\u0939\u093F\u0902\u0926\u0940', local: 'hi', SVGFlag: India },\n { title: 'Hungarian', label: 'Magyar', local: 'hu', SVGFlag: Hungary },\n { title: 'Indonesian', label: 'Indonesia', local: 'id', SVGFlag: Indonesian },\n { title: 'Italian', label: 'Italiana', local: 'it', SVGFlag: Italian },\n { title: 'Japanese', label: '\u65E5\u672C\u8A9E', local: 'ja', SVGFlag: Japanese },\n { title: 'Korean', label: '\uD55C\uAD6D\uC778', local: 'ko', SVGFlag: Korea },\n { title: 'Lithuanian', label: 'Lietuvi\u0173', local: 'lt', SVGFlag: Lithuania },\n { title: 'Malay', label: 'Melayu', local: 'ms', SVGFlag: Malay },\n { title: 'Polish', label: 'Polski', local: 'pl', SVGFlag: Poland },\n { title: 'Portuguese', label: 'Portugu\u00EAs', local: 'pt', SVGFlag: Portuguese },\n { title: 'Russian', label: '\u0420\u0443\u0441\u0441\u043A\u0438\u0439', local: 'ru', SVGFlag: Russian },\n { title: 'Serbian', label: 'C\u0440\u043F\u0441\u043A\u0438', local: 'sr', SVGFlag: Serbia },\n { title: 'Slovak', label: 'Slovensk\u00FD', local: 'sk', SVGFlag: Slovakia },\n { title: 'Spanish', label: 'Espa\u00F1ol', local: 'es', SVGFlag: Spanish },\n { title: 'Swahili', label: 'Kiswahili', local: 'sw', SVGFlag: Swahili },\n { title: 'Swedish', label: 'Svenska', local: 'sv', SVGFlag: Swedish },\n { title: 'Thai', label: '\u0E41\u0E1A\u0E1A\u0E44\u0E17\u0E22', local: 'th', SVGFlag: Thai },\n { title: 'Turkish', label: 'T\u00FCrk\u00E7e', local: 'tr', SVGFlag: Turkish },\n { title: 'Ukrainian', label: 'Y\u043A\u0440\u0430\u0457\u043D\u0456', local: 'uk', SVGFlag: Ukrainian },\n { title: 'Urdu', label: '\u0627\u0631\u062F\u0648', local: 'ur', SVGFlag: Pakistan },\n {\n title: 'Vietnamese',\n label: 'Ti\u1EBFng Vi\u1EC7t',\n local: 'vi',\n SVGFlag: Vietnamese,\n },\n];\n\nexport const DEFAULT_LANGUAGE = 'en';\n", "import type { ConfigSlice } from './config';\nimport type { DataSlice } from './data';\nimport type { WalletsSlice } from './wallets';\nimport type { TokenData } from '../../components/TokenList/TokenList.types';\nimport type { WidgetConfig } from '../../types';\nimport type { SwapperMeta, Token } from 'rango-sdk';\nimport type { StateCreator } from 'zustand';\n\nimport { type Language } from '@rango-dev/ui';\n\nimport { BLOCKCHAIN_LIST_SIZE } from '../../constants/configs';\nimport { DEFAULT_LANGUAGE } from '../../constants/languages';\nimport { DEFAULT_SLIPPAGE } from '../../constants/swapSettings';\nimport { removeDuplicateFrom } from '../../utils/common';\nimport { isFeatureHidden } from '../../utils/settings';\nimport { getSupportedBlockchainsFromConfig } from '../utils';\n\nexport type ThemeMode = 'auto' | 'dark' | 'light';\nexport type QuoteTokensRate = 'default' | 'reversed';\n\nexport interface SettingsSlice {\n theme: ThemeMode;\n language: Language | null;\n disabledLiquiditySources: string[];\n /** Keeping a history of blockchains that user has selected (in Swap process) */\n preferredBlockchains: string[];\n slippage: number;\n customSlippage: number | null;\n infiniteApprove: boolean;\n affiliateRef: string | null;\n affiliatePercent: number | null;\n affiliateWallets: { [key: string]: string } | null;\n _customTokens: Token[];\n quoteTokensRate: QuoteTokensRate;\n\n setSlippage: (slippage: number) => void;\n setCustomSlippage: (customSlippage: number | null) => void;\n toggleInfiniteApprove: () => void;\n toggleLiquiditySource: (name: string) => void;\n setTheme: (theme: ThemeMode) => void;\n setLanguage: (language: Language | null) => void;\n toggleAllLiquiditySources: (\n swappers: SwapperMeta[],\n shouldReset?: boolean\n ) => void;\n setAffiliateRef: (affiliateRef: string | null) => void;\n setAffiliatePercent: (affiliatePercent: number | null) => void;\n setAffiliateWallets: (\n affiliateWallets: { [key: string]: string } | null\n ) => void;\n addPreferredBlockchain: (blockchain: string) => void;\n updateSettings: (config: WidgetConfig) => void;\n setCustomToken: (token: TokenData) => void;\n deleteCustomToken: (token: Token) => void;\n customTokens: () => Token[];\n changeQuoteTokensRate: () => void;\n}\n\nexport const createSettingsSlice: StateCreator<\n SettingsSlice & DataSlice & ConfigSlice & WalletsSlice,\n [],\n [],\n SettingsSlice\n> = (set, get) => ({\n disabledLiquiditySources: [],\n theme: 'auto',\n language: null,\n preferredBlockchains: [],\n slippage: DEFAULT_SLIPPAGE,\n customSlippage: null,\n infiniteApprove: false,\n affiliateRef: null,\n affiliatePercent: null,\n affiliateWallets: null,\n _customTokens: [],\n quoteTokensRate: 'default',\n\n changeQuoteTokensRate: () =>\n set((state) => ({\n quoteTokensRate:\n state.quoteTokensRate === 'default' ? 'reversed' : 'default',\n })),\n addPreferredBlockchain: (blockchain) => {\n const currentPreferredBlockchains = get().preferredBlockchains;\n\n const noNeedToDoAnything = currentPreferredBlockchains.find(\n (preferredBlockchain, index) => {\n const isSameBlockchain = preferredBlockchain === blockchain;\n const isInVisibleList = index <= BLOCKCHAIN_LIST_SIZE - 1;\n\n return isSameBlockchain && isInVisibleList;\n }\n );\n\n if (noNeedToDoAnything) {\n return;\n }\n\n const nextPreferredBlockchains: string[] =\n currentPreferredBlockchains.filter((preferredBlockchain) => {\n const isSameBlockchain = preferredBlockchain === blockchain;\n\n return !isSameBlockchain;\n });\n\n set(() => ({\n preferredBlockchains: [blockchain, ...nextPreferredBlockchains],\n }));\n },\n setSlippage: (slippage) =>\n set(() => ({\n slippage: slippage,\n })),\n\n setCustomSlippage: (customSlippage) =>\n set(() => ({\n customSlippage: customSlippage,\n })),\n setAffiliateRef: (affiliateRef) =>\n set(() => ({\n affiliateRef,\n })),\n setAffiliatePercent: (affiliatePercent) =>\n set(() => ({\n affiliatePercent,\n })),\n\n setAffiliateWallets: (affiliateWallets) =>\n set(() => ({\n affiliateWallets,\n })),\n toggleAllLiquiditySources: (swappers, shouldReset) =>\n set((state) => {\n if (shouldReset) {\n return { disabledLiquiditySources: [] };\n }\n const swappersGroup = removeDuplicateFrom(\n swappers.map((swapper) => swapper.swapperGroup)\n );\n\n if (swappersGroup.length === state.disabledLiquiditySources.length) {\n return { disabledLiquiditySources: [] };\n }\n\n return {\n disabledLiquiditySources: swappersGroup,\n };\n }),\n toggleInfiniteApprove: () =>\n set((state) => ({\n infiniteApprove: !state.infiniteApprove,\n })),\n\n toggleLiquiditySource: (name) =>\n set((state) => {\n if (state.disabledLiquiditySources.includes(name)) {\n return {\n disabledLiquiditySources: state.disabledLiquiditySources.filter(\n (liquiditySource) => liquiditySource != name\n ),\n };\n }\n return {\n disabledLiquiditySources: state.disabledLiquiditySources.concat(name),\n };\n }),\n setTheme: (theme) =>\n set(() => ({\n theme,\n })),\n setLanguage: (language) =>\n set(() => ({\n language,\n })),\n updateSettings: (nextConfig: WidgetConfig) => {\n const { features, theme } = nextConfig;\n\n const isThemeHidden = isFeatureHidden('theme', features);\n const isLanguageHidden = isFeatureHidden('language', features);\n const isLiquidityHidden = isFeatureHidden('liquiditySource', features);\n const singleTheme = theme?.singleTheme;\n const autoUpdateSettings =\n nextConfig?.__UNSTABLE_OR_INTERNAL__?.autoUpdateSettings;\n\n set({\n ...(isThemeHidden && { theme: nextConfig.theme?.mode || 'auto' }),\n ...(singleTheme && { theme: nextConfig.theme?.mode || 'light' }),\n ...(isLanguageHidden && {\n language: nextConfig.language || DEFAULT_LANGUAGE,\n }),\n ...(isLiquidityHidden && {\n disabledLiquiditySources: nextConfig.liquiditySources || [],\n }),\n ...(autoUpdateSettings && {\n // For the time being, we have added the language; if more are needed later, we can add other parameters.\n language: nextConfig.language || DEFAULT_LANGUAGE,\n }),\n });\n },\n setCustomToken: (token) => {\n void get().fetchCustomTokensBalances({\n tokens: [token],\n connectedWallets: get().connectedWallets,\n });\n set((state) => ({\n _customTokens: [token, ...state._customTokens],\n }));\n },\n deleteCustomToken: (token) =>\n set((state) => ({\n _customTokens: state._customTokens.filter(\n (customToken) => customToken.address !== token.address\n ),\n })),\n customTokens: () => {\n const config = get().config;\n\n const customTokens = get()._customTokens;\n const supportedBlockchainsFromConfig = getSupportedBlockchainsFromConfig({\n config,\n });\n\n return !supportedBlockchainsFromConfig.length\n ? customTokens\n : customTokens.filter((token) =>\n supportedBlockchainsFromConfig.includes(token.blockchain)\n );\n },\n});\n", "import type { AppStoreState } from './types';\nimport type { Namespace } from '@rango-dev/wallets-core/namespaces/common';\nimport type { Asset, Token, WalletDetail } from 'rango-sdk';\n\nimport BigNumber from 'bignumber.js';\n\nimport { ZERO } from '../../constants/numbers';\nimport { BALANCE_SEPARATOR } from '../../constants/wallets';\nimport { eventEmitter } from '../../services/eventEmitter';\nimport { httpService } from '../../services/httpService';\nimport {\n type Balance,\n type Wallet,\n WalletEventTypes,\n WidgetEvents,\n} from '../../types';\nimport { memoizedResult } from '../../utils/common';\nimport { isAccountAndWalletMatched } from '../../utils/wallets';\nimport { keepLastUpdated } from '../middlewares/keepLastUpdated';\nimport {\n computeNextBalancesWithNewPrices,\n computeNextStateAfterWalletBalanceRemoval,\n createAssetKey,\n createBalanceStateForNewAccount,\n extractAssetFromBalanceKey,\n updateAggregatedBalanceStateForNewAccount,\n} from '../utils/wallets';\n\ntype WalletAddress = string;\ntype TokenAddress = string;\ntype TokenSymbol = string;\ntype BlockchainId = string;\n/** format: `BlockchainId${BALANCE_SEPARATOR}TokenAddress${BALANCE_SEPARATOR}TokenSymbol` */\nexport type AssetKey =\n `${BlockchainId}${typeof BALANCE_SEPARATOR}${TokenAddress}${typeof BALANCE_SEPARATOR}${TokenSymbol}`;\n/** format: `BlockchainId${BALANCE_SEPARATOR}TokenAddress${BALANCE_SEPARATOR}TokenSymbol${BALANCE_SEPARATOR}WalletAddress` */\nexport type BalanceKey =\n `${BlockchainId}${typeof BALANCE_SEPARATOR}${TokenAddress}${typeof BALANCE_SEPARATOR}${TokenSymbol}${typeof BALANCE_SEPARATOR}${WalletAddress}`;\n\nexport type BalanceState = {\n [key: BalanceKey]: Balance;\n};\nexport type AggregatedBalanceState = {\n [key: AssetKey]: BalanceKey[];\n};\n\nexport interface ConnectedWallet extends Wallet {\n explorerUrl: string | null;\n selected: boolean;\n loading: boolean;\n error: boolean;\n namespace?: Namespace;\n}\n\ninterface DeprecatedTokenBalance {\n chain: string;\n symbol: string;\n ticker: string;\n address: string | null;\n rawAmount: string;\n decimal: number | null;\n amount: string;\n isSupported: boolean;\n logo: string | null;\n usdPrice: number | null;\n}\n\nexport interface DeprecatedWalletDetail extends ConnectedWallet {\n balances: DeprecatedTokenBalance[] | null;\n}\n\nfunction matchWalletDetailsWithConnectedWallet(\n connectedWallet: ConnectedWallet,\n walletsDetails: WalletDetail[]\n): WalletDetail | undefined {\n return walletsDetails.find(\n (walletDetails) =>\n connectedWallet.address === walletDetails.address &&\n connectedWallet.chain === walletDetails.blockChain\n );\n}\n\nexport interface WalletsSlice {\n _balances: BalanceState;\n _aggregatedBalances: AggregatedBalanceState;\n connectedWallets: ConnectedWallet[];\n fetchingWallets: boolean;\n lastUpdatedAt: number;\n\n setConnectedWalletAsRefetching: (accounts: Wallet[]) => void;\n setConnectedWalletHasError: (accounts: Wallet[]) => void;\n setConnectedWalletRetrievedData: (\n accounts: Wallet[],\n walletsDetails: WalletDetail[]\n ) => void;\n removeBalancesForWallet: (\n walletType: string,\n options?: {\n chains?: string[];\n namespaces?: Namespace[];\n }\n ) => void;\n addConnectedWallet: (\n accounts: Wallet[],\n namespace?: Namespace,\n derivationPath?: string\n ) => void;\n setWalletsAsSelected: (\n wallets: { walletType: string; chain: string }[]\n ) => void;\n /**\n * Add new accounts to store and fetch balances for them.\n */\n newWalletConnected: (\n accounts: Wallet[],\n namespace?: Namespace,\n derivationPath?: string\n ) => Promise<void>;\n disconnectNamespaces: (walletType: string, namespaces: Namespace[]) => void;\n /**\n * Disconnect a wallet and clean up balances after that.\n */\n disconnectWallet: (walletType: string) => void;\n _changeSelectedWalletIfNeededOnRemove: (\n walletType: string,\n options?: { namespaces?: Namespace[] }\n ) => void;\n clearConnectedWallet: () => void;\n fetchBalances: (\n accounts: Wallet[],\n options?: {\n shouldFetchCustomTokens?: boolean;\n selectedCustomTokens?: Asset[];\n }\n ) => Promise<void>;\n fetchMainTokensBalances: (\n accounts: Wallet[],\n options?: { retryOnFailedBalances?: boolean }\n ) => Promise<void>;\n fetchCustomTokensBalances: (params: {\n tokens: Asset[];\n connectedWallets: Wallet[];\n }) => Promise<void>;\n getBalanceFor: (token: Token) => Balance | null;\n getBalances: () => BalanceState;\n getBalancesForWalletAddress: (address: string) => BalanceState;\n\n /**\n * @deprecated\n * This is been added for backward compatibilty for WidgetInfo\n */\n getConnectedWalletsDetails: () => DeprecatedWalletDetail[];\n}\n\nconst memoizedConnectedWalletsWithNestedBalances = memoizedResult();\nexport const createWalletsSlice = keepLastUpdated<AppStoreState, WalletsSlice>(\n (set, get) => ({\n _balances: {},\n _aggregatedBalances: {},\n connectedWallets: [],\n fetchingWallets: false,\n lastUpdatedAt: +new Date(),\n\n // Actions\n setConnectedWalletAsRefetching: (accounts: Wallet[]) => {\n set((state) => {\n return {\n fetchingWallets: true,\n connectedWallets: state.connectedWallets.map((connectedWallet) => {\n if (\n accounts.find((account) =>\n isAccountAndWalletMatched(account, connectedWallet)\n )\n ) {\n return {\n ...connectedWallet,\n loading: true,\n error: false,\n };\n }\n\n return connectedWallet;\n }),\n };\n });\n },\n setConnectedWalletRetrievedData: (\n accounts: Wallet[],\n walletsDetails: WalletDetail[]\n ) => {\n set((state) => {\n return {\n fetchingWallets: false,\n connectedWallets: state.connectedWallets.map((connectedWallet) => {\n if (\n accounts.find((account) =>\n isAccountAndWalletMatched(account, connectedWallet)\n )\n ) {\n return {\n ...connectedWallet,\n loading: false,\n error: false,\n explorerUrl:\n matchWalletDetailsWithConnectedWallet(\n connectedWallet,\n walletsDetails\n )?.explorerUrl || connectedWallet.explorerUrl,\n };\n }\n\n return connectedWallet;\n }),\n };\n });\n },\n setConnectedWalletHasError: (accounts: Wallet[]) => {\n set((state) => {\n return {\n fetchingWallets: false,\n connectedWallets: state.connectedWallets.map((connectedWallet) => {\n if (\n accounts.find((account) =>\n isAccountAndWalletMatched(account, connectedWallet)\n )\n ) {\n return {\n ...connectedWallet,\n loading: false,\n error: true,\n };\n }\n\n return connectedWallet;\n }),\n };\n });\n },\n addConnectedWallet: (accounts, namespace, derivationPath) => {\n /*\n * When we are going to add a new account, there are two thing that can be happens:\n * 1. Wallet hasn't add yet.\n * 2. Wallet has added, and there are some more account that needs to added to connected wallet. consider we've added an ETH and Pol account, then we need to add Arb account later as well.\n *\n * For handling this, we need to only keep not-added-account, then only add those.\n *\n * Note:\n * The second option would be useful for hub particularly.\n */\n const connectedWallets = get().connectedWallets;\n const walletsNeedToBeAdded = accounts.filter(\n (account) =>\n !connectedWallets.some((connectedWallet) =>\n isAccountAndWalletMatched(account, connectedWallet)\n )\n );\n\n if (walletsNeedToBeAdded.length > 0) {\n const newConnectedWallets: ConnectedWallet[] = walletsNeedToBeAdded.map(\n (account) => {\n /*\n * When a wallet is connecting, we will check if there is any `selected` wallet before, if not, we will consider this new wallet as connected.\n * In this way, when user tries to swap, we selected a wallet by default and don't need to do an extra click in ConfirmWalletModal\n */\n const shouldMarkWalletAsSelected = !connectedWallets.some(\n (connectedWallet) =>\n connectedWallet.chain === account.chain &&\n connectedWallet.selected &&\n /**\n * Sometimes, the connect function can be called multiple times for a particular wallet type when using the auto-connect feature.\n * This check is there to make sure the chosen wallet doesn't end up unselected.\n */\n connectedWallet.walletType !== account.walletType\n );\n\n return {\n address: account.address,\n chain: account.chain,\n isContractWallet: account.isContractWallet,\n explorerUrl: null,\n walletType: account.walletType,\n selected: shouldMarkWalletAsSelected,\n namespace: namespace,\n derivationPath: derivationPath,\n loading: false,\n error: false,\n };\n }\n );\n\n set((state) => {\n /*\n * If wallet connected before and only need to update the address we should remove the old value and then add new conncted value.\n * This scenario happens when user wants to change account inside the wallet.\n * So the assumption here is the wallet has only one active address for a blockchain at the moment.\n */\n const connectedWalletsWithoutSameWalletAndBlockchain =\n state.connectedWallets.filter((currentConnectedWallet) => {\n return !newConnectedWallets.some(\n (newConnectedWallet) =>\n newConnectedWallet.walletType ===\n currentConnectedWallet.walletType &&\n newConnectedWallet.chain === currentConnectedWallet.chain\n );\n });\n\n return {\n connectedWallets: [\n ...connectedWalletsWithoutSameWalletAndBlockchain,\n ...newConnectedWallets,\n ],\n };\n });\n }\n },\n fetchCustomTokensBalances: async (params) => {\n const { tokens, connectedWallets } = params;\n\n const tokensByBlockchain = tokens.reduce<{ [key: string]: Asset[] }>(\n (acc, asset) => {\n (acc[asset.blockchain] ||= []).push(asset);\n return acc;\n },\n {}\n );\n\n const addedWallets = new Set<string>();\n\n const tokensByWalletAddress = connectedWallets.reduce<{\n [key: string]: Asset[];\n }>((acc, wallet) => {\n const key = `${wallet.address}-${wallet.chain}`;\n if (addedWallets.has(key)) {\n return acc;\n }\n\n addedWallets.add(key);\n if (tokensByBlockchain[wallet.chain]) {\n if (!acc[wallet.address]) {\n acc[wallet.address] = [];\n }\n acc[wallet.address]?.push(\n ...(tokensByBlockchain[wallet.chain] || [])\n );\n }\n return acc;\n }, {});\n\n Object.entries(tokensByWalletAddress).forEach(\n async ([walletAddress, tokens]) => {\n try {\n const { balances } = await httpService().getMultipleTokenBalance({\n assets: tokens.map(({ symbol, address, blockchain }) => ({\n symbol,\n address,\n blockchain,\n })),\n walletAddress,\n });\n\n if (balances) {\n let nextBalances: BalanceState = get()._balances;\n let nextAggregatedBalances: AggregatedBalanceState =\n get()._aggregatedBalances;\n\n balances.forEach((balance) => {\n if (parseFloat(balance.amount.amount) === 0) {\n return;\n }\n\n const walletDetail = {\n blockChain: balance.asset.blockchain,\n balances: [balance],\n address: walletAddress,\n };\n\n const partialCurrentState = {\n _aggregatedBalances: get()._aggregatedBalances,\n findToken: get().findToken,\n };\n computeNextBalancesWithNewPrices(\n partialCurrentState,\n walletDetail,\n nextBalances\n );\n\n const balancesForWallet = createBalanceStateForNewAccount(\n walletDetail,\n get\n );\n\n nextAggregatedBalances =\n updateAggregatedBalanceStateForNewAccount(\n nextAggregatedBalances,\n balancesForWallet\n );\n\n nextBalances = {\n ...nextBalances,\n ...balancesForWallet,\n };\n });\n\n set((state) => ({\n _balances: {\n ...state._balances,\n ...nextBalances,\n },\n _aggregatedBalances: nextAggregatedBalances,\n }));\n }\n } catch (error) {\n console.error(error);\n }\n }\n );\n },\n setWalletsAsSelected: (wallets) => {\n const nextConnectedWalletsWithUpdatedSelectedStatus =\n get().connectedWallets.map((connectedWallet) => {\n const walletSelected = !!wallets.find(\n (wallet) =>\n wallet.chain === connectedWallet.chain &&\n wallet.walletType !== connectedWallet.walletType &&\n connectedWallet.selected\n );\n const walletNotSelected = !!wallets.find(\n (wallet) =>\n wallet.chain === connectedWallet.chain &&\n wallet.walletType === connectedWallet.walletType &&\n !connectedWallet.selected\n );\n if (walletSelected) {\n return { ...connectedWallet, selected: false };\n } else if (walletNotSelected) {\n return { ...connectedWallet, selected: true };\n }\n\n return connectedWallet;\n });\n\n set({\n connectedWallets: nextConnectedWalletsWithUpdatedSelectedStatus,\n });\n },\n newWalletConnected: async (accounts, namespace, derivationPath) => {\n const newAccount = accounts[0];\n if (!newAccount) {\n return;\n }\n eventEmitter.emit(WidgetEvents.WalletEvent, {\n type: WalletEventTypes.CONNECT,\n payload: { walletType: newAccount.walletType, accounts },\n });\n\n get().addConnectedWallet(accounts, namespace, derivationPath);\n\n void get().fetchBalances(accounts);\n },\n removeBalancesForWallet: (walletType, options) => {\n const partialCurrentState = {\n _balances: get()._balances,\n _aggregatedBalances: get()._aggregatedBalances,\n connectedWallets: get().connectedWallets,\n };\n const { _balances, _aggregatedBalances } =\n computeNextStateAfterWalletBalanceRemoval(\n partialCurrentState,\n walletType,\n options\n );\n\n set({\n _balances,\n _aggregatedBalances,\n });\n },\n disconnectNamespaces: (walletType, requestedNamesapces) => {\n const isTargetWalletExistsInConnectedWallets =\n get().connectedWallets.find(\n (wallet) => wallet.walletType === walletType\n );\n\n if (isTargetWalletExistsInConnectedWallets) {\n // This should be called before updating connectedWallets since we need the old state to remove balances.\n get().removeBalancesForWallet(walletType, {\n namespaces: requestedNamesapces,\n });\n\n get()._changeSelectedWalletIfNeededOnRemove(walletType, {\n namespaces: requestedNamesapces,\n });\n\n const nextConnectedWallets = get().connectedWallets.filter(\n (connectedWallet) => {\n if (connectedWallet.namespace) {\n const targetWalletAndNamespace =\n connectedWallet.walletType === walletType &&\n requestedNamesapces.includes(connectedWallet.namespace);\n\n // If the wallet and namespace matched, we should filter it out.\n return !targetWalletAndNamespace;\n }\n /*\n * if a connected wallet hasn't `namesapce`, it means it legacy.\n * legacy will not reach this method, but for we check anyways\n */\n return true;\n }\n );\n\n set({\n connectedWallets: nextConnectedWallets,\n });\n }\n },\n disconnectWallet: (walletType) => {\n const isTargetWalletExistsInConnectedWallets =\n get().connectedWallets.find(\n (wallet) => wallet.walletType === walletType\n );\n /*\n * Previously DISCONNECT event was being emitted if target wallet existed in connected wallets.\n * Considering that connected wallets get clear on namespace disconnect in hub,\n * now emitting this event is done without checking for connected wallets to be compatible with hub.\n */\n eventEmitter.emit(WidgetEvents.WalletEvent, {\n type: WalletEventTypes.DISCONNECT,\n payload: { walletType },\n });\n if (isTargetWalletExistsInConnectedWallets) {\n // This should be called before updating connectedWallets since we need the old state to remove balances.\n get().removeBalancesForWallet(walletType);\n\n get()._changeSelectedWalletIfNeededOnRemove(walletType);\n\n // Remove target wallet from connectedWallets\n const nextConnectedWallets = get().connectedWallets.filter(\n (connectedWallet) => connectedWallet.walletType !== walletType\n );\n\n set({\n connectedWallets: nextConnectedWallets,\n });\n }\n },\n /*\n * If we are disconnecting a wallet that has `selected` for some blockchains,\n * For those blockchains we will fallback to first connected wallet\n * which means selected wallet will change.\n */\n _changeSelectedWalletIfNeededOnRemove: (walletType, options) => {\n let connectedWallets = get().connectedWallets;\n\n if (options?.namespaces && options.namespaces.length > 0) {\n connectedWallets = connectedWallets.filter(\n (connectedWallet) =>\n !!connectedWallet.namespace &&\n options.namespaces?.includes(connectedWallet.namespace)\n );\n }\n\n let targetWalletWasSelectedForBlockchains = connectedWallets\n .filter(\n (connectedWallet) =>\n connectedWallet.selected &&\n connectedWallet.walletType === walletType\n )\n .map((connectedWallet) => connectedWallet.chain);\n\n if (targetWalletWasSelectedForBlockchains.length > 0) {\n const nextConnectedWallets = get().connectedWallets.map(\n (connectedWallet) => {\n if (\n targetWalletWasSelectedForBlockchains.includes(\n connectedWallet.chain\n )\n ) {\n targetWalletWasSelectedForBlockchains =\n targetWalletWasSelectedForBlockchains.filter(\n (blockchain) => blockchain !== connectedWallet.chain\n );\n return {\n ...connectedWallet,\n selected: true,\n };\n }\n\n return connectedWallet;\n }\n );\n\n set({\n connectedWallets: nextConnectedWallets,\n });\n }\n },\n clearConnectedWallet: () => set({ connectedWallets: [] }),\n fetchBalances: async (accounts, options) => {\n const { shouldFetchCustomTokens = true, selectedCustomTokens } =\n options || {};\n await get().fetchMainTokensBalances(accounts);\n if (shouldFetchCustomTokens) {\n void get().fetchCustomTokensBalances({\n tokens: selectedCustomTokens ?? get().customTokens(),\n connectedWallets: accounts,\n });\n }\n },\n fetchMainTokensBalances: async (accounts, options) => {\n if (accounts.length === 0 || !accounts[0]) {\n return;\n }\n // All the `accounts` have same `walletType` so we can pick the first one.\n const walletType = accounts[0].walletType;\n\n get().setConnectedWalletAsRefetching(accounts);\n\n const addressesToFetch = accounts.map((account) => ({\n address: account.address,\n blockchain: account.chain,\n }));\n\n let response;\n try {\n response = await httpService().getWalletsDetails(addressesToFetch);\n } catch (e) {\n get().setConnectedWalletHasError(accounts);\n console.error(`Request for fetching balances failed. cause: ${e}`);\n return;\n }\n const walletsDetails = response.wallets;\n\n if (walletsDetails) {\n let nextBalances: BalanceState = get()._balances;\n let nextAggregatedBalances: AggregatedBalanceState =\n get()._aggregatedBalances;\n walletsDetails.forEach((wallet) => {\n if (wallet.failed) {\n return;\n }\n\n const partialCurrentState = {\n _balances: nextBalances,\n _aggregatedBalances: nextAggregatedBalances,\n connectedWallets: get().connectedWallets,\n findToken: get().findToken,\n };\n\n computeNextBalancesWithNewPrices(\n partialCurrentState,\n wallet,\n nextBalances\n );\n\n // Remove old balances for current wallet and blockchain\n const { _balances, _aggregatedBalances } =\n computeNextStateAfterWalletBalanceRemoval(\n partialCurrentState,\n walletType,\n {\n chains: [wallet.blockChain],\n }\n );\n nextAggregatedBalances = _aggregatedBalances;\n nextBalances = _balances;\n\n /*\n * Check if after fetching balance for an account, the account still exists.\n * (It might get disconnected while fetching balances is pending)\n */\n if (\n !get().connectedWallets.find(\n (connectedWallet) =>\n connectedWallet.walletType === walletType &&\n connectedWallet.address === wallet.address &&\n connectedWallet.chain === wallet.blockChain\n )\n ) {\n return;\n }\n\n const balancesForWallet = createBalanceStateForNewAccount(\n wallet,\n get\n );\n\n nextAggregatedBalances = updateAggregatedBalanceStateForNewAccount(\n nextAggregatedBalances,\n balancesForWallet\n );\n\n nextBalances = {\n ...nextBalances,\n ...balancesForWallet,\n };\n });\n\n set((state) => ({\n _balances: {\n ...state._balances,\n ...nextBalances,\n },\n _aggregatedBalances: nextAggregatedBalances,\n }));\n\n get().setConnectedWalletRetrievedData(accounts, walletsDetails);\n /*\n * We handle failed balance fetches after updating the state with successful ones.\n * This ensures that successful balance updates are immediately available to the UI,\n * while failed ones are retried in the background without blocking the main flow.\n * The retry is only attempted once to prevent infinite loops.\n */\n const { retryOnFailedBalances = true } = options || {};\n if (retryOnFailedBalances) {\n const failedWallets: Wallet[] = walletsDetails\n .filter((wallet) => wallet.failed)\n .map((wallet) => ({\n chain: wallet.blockChain,\n walletType: walletType,\n address: wallet.address,\n }));\n if (failedWallets.length > 0) {\n await get().fetchMainTokensBalances(failedWallets, {\n retryOnFailedBalances: false,\n });\n }\n }\n } else {\n get().setConnectedWalletHasError(accounts);\n console.error(\n \"We couldn't fetch your account balances. Seem there is no information on blockchain for them yet.\"\n );\n }\n },\n getBalances: () => {\n return get()._balances;\n },\n getBalanceFor: (token) => {\n const balances = get().getBalances();\n\n /*\n * The old implementation wasn't considering user's address.\n * it can be problematic when two separate address has same token, both of them will override on same key.\n *\n * For keeping the same behavior, here we pick the most amount and also will not consider user's address in key.\n */\n\n // Note: balance key is created using asset key + wallet address\n const assetKey = createAssetKey(token);\n const targetBalanceKeys = get()._aggregatedBalances[assetKey] || [];\n\n if (targetBalanceKeys.length === 0 || !targetBalanceKeys[0]) {\n return null;\n }\n const targetKey = targetBalanceKeys[0];\n if (targetBalanceKeys.length === 1 && balances[targetKey]) {\n return balances[targetKey];\n }\n\n // If there are multiple balances for an specific token, we pick the maximum.\n const firstTargetBalance = balances[targetBalanceKeys[0]];\n if (!firstTargetBalance) {\n return null;\n }\n let maxBalance: Balance = firstTargetBalance;\n targetBalanceKeys.forEach((targetBalanceKey) => {\n const currentBalance = balances[targetBalanceKey];\n if (!currentBalance) {\n return;\n }\n const currentBalanceAmount = new BigNumber(currentBalance.amount);\n const prevBalanceAmount = new BigNumber(maxBalance.amount);\n\n if (currentBalanceAmount.isGreaterThan(prevBalanceAmount)) {\n maxBalance = currentBalance;\n }\n });\n return maxBalance;\n },\n getBalancesForWalletAddress: (address: string) => {\n const balances = get().getBalances();\n const balanceKeys = Object.keys(balances) as BalanceKey[];\n\n const balancesForTargetWalletAddress = balanceKeys.reduce(\n (output, balanceKey) => {\n const balance = balances[balanceKey];\n\n const [, , , balanceWalletAddreess] =\n balanceKey.split(BALANCE_SEPARATOR);\n if (balance && balanceWalletAddreess === address) {\n output[balanceKey] = balance;\n }\n\n return output;\n },\n {} as BalanceState\n );\n\n return balancesForTargetWalletAddress;\n },\n getConnectedWalletsDetails: () => {\n return memoizedConnectedWalletsWithNestedBalances(() => {\n const connectedWallets = get().connectedWallets;\n return connectedWallets.map((wallet) => {\n const balances = get().getBalancesForWalletAddress(wallet.address);\n const balancesKeys = Object.keys(balances) as BalanceKey[];\n\n return {\n ...wallet,\n balances: balancesKeys.reduce((output, balanceKey) => {\n const balance = balances[balanceKey];\n const asset = extractAssetFromBalanceKey(balanceKey);\n\n if (asset && asset.blockchain === wallet.chain && balance) {\n const token = get().findToken(asset);\n\n const amount = balance?.amount\n ? new BigNumber(balance.amount).shiftedBy(-balance.decimals)\n : ZERO;\n\n output.push({\n chain: wallet.chain,\n symbol: asset.symbol,\n ticker: asset.symbol,\n address: asset.address,\n rawAmount: balance.amount,\n decimal: balance.decimals,\n amount: amount.toString(),\n isSupported: !!token,\n logo: token?.image || null,\n usdPrice: token?.usdPrice || null,\n });\n }\n\n return output;\n }, [] as DeprecatedTokenBalance[]),\n };\n });\n }, get().lastUpdatedAt);\n },\n })\n);\n", "import type { Events, WidgetEventEmitter } from '../types';\n\nimport mitt from 'mitt';\n\nexport const eventEmitter = mitt<Events>();\n\n// To be exported for Dapps\nexport const widgetEventEmitter: WidgetEventEmitter = {\n on: eventEmitter.on,\n off: eventEmitter.off,\n};\n", "import type { StateCreator } from 'zustand';\n\n/**\n * you can wrap your slice in this middleware, it will update `lastUpdatedAt` for that slice when a zustand's `set` is calling\n */\nexport const keepLastUpdated: <Store, Slice extends { lastUpdatedAt: number }>(\n config: StateCreator<Store, [], [], Slice>\n) => StateCreator<Store, [], [], Slice> = (slice) => (set, get, api) => {\n const modifedSet: typeof set = (...params) => {\n const [partial, ...restParams] = params;\n set((state) => {\n // @see https://github.com/pmndrs/zustand/blob/90f8d592d4cde9aa15f236e320f17ccbc86cf0fb/src/vanilla.ts#L69-L72\n type State = ReturnType<typeof get>;\n const nextState =\n typeof partial === 'function'\n ? (partial as (s: State) => State)(state)\n : partial;\n\n return {\n ...nextState,\n lastUpdatedAt: +new Date(),\n };\n }, ...restParams);\n };\n return slice(modifedSet, get, api);\n};\n", "import type { Balance } from '../../types';\nimport type { AppStoreState } from '../app';\nimport type { FindToken } from '../slices/data';\nimport type {\n AggregatedBalanceState,\n AssetKey,\n BalanceKey,\n BalanceState,\n ConnectedWallet,\n} from '../slices/wallets';\nimport type { Namespace } from '@rango-dev/wallets-core/namespaces/common';\nimport type { Asset, WalletDetail } from 'rango-types';\n\nimport BigNumber from 'bignumber.js';\n\nimport { ZERO } from '../../constants/numbers';\nimport { BALANCE_SEPARATOR } from '../../constants/wallets';\n\n/**\n * Note: We need to use `symbol` as well since native coins and cosmos blockchains don't have `address`\n * output format: BlockchainId${BALANCE_SEPARATOR}TokenAddress${BALANCE_SEPARATOR}TokenSymbol\n */\nexport function createAssetKey(asset: Asset): AssetKey {\n return `${asset.blockchain}${BALANCE_SEPARATOR}${asset.address}${BALANCE_SEPARATOR}${asset.symbol}`;\n}\n\n/**\n * output format: BlockchainId${BALANCE_SEPARATOR}TokenAddress${BALANCE_SEPARATOR}TokenSymbol${BALANCE_SEPARATOR}WalletAddress\n */\nexport function createBalanceKey(\n accountAddress: string,\n asset: Asset\n): BalanceKey {\n const assetKey = createAssetKey(asset);\n return `${assetKey}${BALANCE_SEPARATOR}${accountAddress}`;\n}\n\nexport function extractAssetFromBalanceKey(key: BalanceKey): Asset | null {\n const [assetChain, assetAddress, assetSymbol] = key.split(BALANCE_SEPARATOR);\n\n if (!assetChain || !assetAddress || !assetSymbol) {\n return null;\n }\n\n // null will be serialized to 'null', we need to make it back to a null type\n const address = assetAddress === 'null' ? null : assetAddress;\n return {\n address,\n blockchain: assetChain,\n symbol: assetSymbol,\n };\n}\n\nexport function computeNextBalancesWithNewPrices(\n paritalCurrentState: {\n findToken: FindToken;\n _aggregatedBalances: AggregatedBalanceState;\n },\n wallet: Omit<WalletDetail, 'failed' | 'explorerUrl'>,\n balanceState: BalanceState\n): BalanceState {\n wallet.balances?.forEach((balance) => {\n const usdPrice =\n balance.price ?? paritalCurrentState.findToken(balance.asset)?.usdPrice;\n const balancesToUpdate =\n paritalCurrentState._aggregatedBalances[createAssetKey(balance.asset)];\n\n balancesToUpdate?.forEach((balanceKey) => {\n if (balanceState[balanceKey]) {\n balanceState[balanceKey] = {\n ...balanceState[balanceKey],\n usdValue: usdPrice\n ? new BigNumber(usdPrice ?? ZERO)\n .multipliedBy(balanceState[balanceKey].amount)\n .toString()\n : '',\n };\n }\n });\n });\n\n return balanceState;\n}\n\nexport function createBalanceStateForNewAccount(\n account: Omit<WalletDetail, 'failed' | 'explorerUrl'>,\n store: () => AppStoreState\n): BalanceState {\n const state: BalanceState = {};\n\n account.balances?.forEach((accountBalance) => {\n const key = createBalanceKey(account.address, accountBalance.asset);\n const amount = accountBalance.amount.amount;\n const decimals = accountBalance.amount.decimals;\n\n const usdPrice =\n accountBalance.price ?? store().findToken(accountBalance.asset)?.usdPrice;\n const usdValue = usdPrice\n ? new BigNumber(usdPrice ?? ZERO).multipliedBy(amount).toString()\n : '';\n\n const balance: Balance = {\n amount,\n decimals,\n usdValue,\n };\n\n state[key] = balance;\n });\n\n return state;\n}\n\nexport function updateAggregatedBalanceStateForNewAccount(\n aggregatedBalances: AggregatedBalanceState,\n balanceState: BalanceState\n) {\n for (const balanceKey in balanceState) {\n const asset = extractAssetFromBalanceKey(balanceKey as BalanceKey);\n if (asset) {\n const assetKey = createAssetKey(asset);\n\n if (!aggregatedBalances[assetKey]) {\n aggregatedBalances[assetKey] = [];\n }\n\n if (!aggregatedBalances[assetKey].includes(balanceKey as BalanceKey)) {\n aggregatedBalances[assetKey] = [\n ...aggregatedBalances[assetKey],\n balanceKey as BalanceKey,\n ];\n }\n }\n }\n\n return aggregatedBalances;\n}\n\nexport function removeBalanceFromAggregatedBalance(\n aggregatedBalances: AggregatedBalanceState,\n balanceKey: BalanceKey\n) {\n const asset = extractAssetFromBalanceKey(balanceKey);\n if (!asset) {\n return aggregatedBalances;\n }\n const assetKey = createAssetKey(asset);\n\n if (aggregatedBalances[assetKey]) {\n aggregatedBalances[assetKey] = aggregatedBalances[assetKey].filter(\n (aggregatedBalance) => aggregatedBalance !== balanceKey\n );\n }\n\n return aggregatedBalances;\n}\n\n/**\n * We made a util to remvoe balances to be able batch with other state updates.\n */\nexport function computeNextStateAfterWalletBalanceRemoval(\n paritalCurrentState: {\n _balances: BalanceState;\n _aggregatedBalances: AggregatedBalanceState;\n connectedWallets: ConnectedWallet[];\n },\n walletType: string,\n options?: {\n chains?: string[];\n namespaces?: Namespace[];\n }\n) {\n let walletsNeedsToBeRemoved = paritalCurrentState.connectedWallets.filter(\n (connectedWallet) => connectedWallet.walletType === walletType\n );\n\n /*\n * We only need to delete balances where there is no connected wallets with same chain and address for that balance.\n * Consider both Metamask and Solana having support for `0xblahblahblahblah` for Ethereum.\n * If Phantom is disconnecting, we should keep the balance since Metamask has access to same address yet.\n * So we only delete balance when there is no connected wallet that has access to that specific chain and address.\n */\n paritalCurrentState.connectedWallets.forEach((connectedWallet) => {\n if (connectedWallet.walletType !== walletType) {\n walletsNeedsToBeRemoved = walletsNeedsToBeRemoved.filter((wallet) => {\n const isAnotherWalletHasSameAddressAndChain =\n wallet.chain === connectedWallet.chain &&\n wallet.address === connectedWallet.address;\n return !isAnotherWalletHasSameAddressAndChain;\n });\n }\n });\n\n if (!!options?.chains && options.chains.length > 0) {\n walletsNeedsToBeRemoved = walletsNeedsToBeRemoved.filter((wallet) => {\n return options.chains?.includes(wallet.chain);\n });\n }\n\n if (!!options?.namespaces && options.namespaces.length > 0) {\n walletsNeedsToBeRemoved = walletsNeedsToBeRemoved.filter((wallet) => {\n if (wallet.namespace) {\n return options.namespaces?.includes(wallet.namespace);\n }\n return false;\n });\n }\n\n const nextBalancesState: BalanceState = {};\n let nextAggregatedBalanceState: AggregatedBalanceState =\n paritalCurrentState._aggregatedBalances;\n const currentBalancesState = paritalCurrentState._balances;\n const balanceKeys = Object.keys(currentBalancesState) as BalanceKey[];\n\n balanceKeys.forEach((key) => {\n const asset = extractAssetFromBalanceKey(key);\n if (!asset) {\n return;\n }\n\n const shouldBalanceBeRemoved = !!walletsNeedsToBeRemoved.find(\n (wallet) =>\n createBalanceKey(wallet.address, {\n address: asset.address,\n blockchain: wallet.chain,\n symbol: asset.symbol,\n }) === key\n );\n\n // if a balance should be removed, we need to remove its caches in _aggregatedBalances as wel.\n if (shouldBalanceBeRemoved) {\n nextAggregatedBalanceState = removeBalanceFromAggregatedBalance(\n nextAggregatedBalanceState,\n key\n );\n } else if (currentBalancesState[key]) {\n nextBalancesState[key] = currentBalancesState[key];\n }\n });\n\n return {\n _balances: nextBalancesState,\n _aggregatedBalances: nextAggregatedBalanceState,\n };\n}\n", "import type { ModalPropTypes } from '@rango-dev/ui';\nimport type { PropsWithChildren } from 'react';\n\nimport { Modal } from '@rango-dev/ui';\nimport React from 'react';\n\nimport { useUiStore } from '../../../store/ui';\n\nexport function WatermarkedModal(props: PropsWithChildren<ModalPropTypes>) {\n const { watermark } = useUiStore();\n\n const hasWatermark = watermark === 'FULL';\n return (\n <Modal hasWatermark={hasWatermark} {...props}>\n {props.children}\n </Modal>\n );\n}\n", "import type { Watermark } from '../hooks/useFetchApiConfig';\nimport type { TabManagerInterface } from '../libs/tabManager';\n\nimport { create } from 'zustand';\n\nimport { TabManager } from '../libs/tabManager';\n\nimport createSelectors from './selectors';\n\ninterface UiState {\n isActiveTab: boolean;\n tabManagerInitiated: boolean;\n showActivateTabModal: boolean;\n watermark: Watermark;\n showProfileBanner: boolean;\n showCompactTokenSelector: boolean;\n activateCurrentTab: (\n setCurrentTabAsActive: () => void,\n hasRunningSwaps: boolean\n ) => void;\n setShowActivateTabModal: (flag: boolean) => void;\n setWatermark: (watermark: Watermark) => void;\n setShowProfileBanner: (showProfileBanner: boolean) => void;\n setShowCompactTokenSelector: (showCompactTokenSelector: boolean) => void;\n}\n\nexport const useUiStore = createSelectors(\n create<UiState>()((set, get) => ({\n isActiveTab: false,\n tabManagerInitiated: false,\n showActivateTabModal: false,\n watermark: 'NONE',\n showProfileBanner: false,\n fetchingApiConfig: false,\n showCompactTokenSelector: false,\n activateCurrentTab: (setCurrentTabAsActive, hasRunningSwaps) => {\n const { showActivateTabModal } = get();\n\n if (!showActivateTabModal && hasRunningSwaps) {\n set({ showActivateTabModal: true });\n } else if (showActivateTabModal || !hasRunningSwaps) {\n setCurrentTabAsActive();\n }\n },\n setShowActivateTabModal: (flag) => {\n set({ showActivateTabModal: flag });\n },\n setWatermark: (watermark) => {\n set({ watermark });\n },\n setShowProfileBanner: (showProfileBanner) => {\n set({ showProfileBanner });\n },\n setShowCompactTokenSelector: (showCompactTokenSelector) => {\n set({ showCompactTokenSelector });\n },\n }))\n);\n\nexport const tabManager: TabManagerInterface = new TabManager({\n onInit: () => useUiStore.setState({ tabManagerInitiated: true }),\n onClaim: () =>\n useUiStore.setState({ isActiveTab: true, showActivateTabModal: false }),\n onRelease: () => useUiStore.setState({ isActiveTab: false }),\n});\n", "export const TIMEOUT = 300;\nexport const MAXIMUM_TAB_ID = 100_000;\nexport const CHANNEL_NAME = 'rango-widget';\n", "import type {\n Events,\n ID,\n Message,\n TabManagerInterface,\n} from './tabManager.types';\n\nimport { CHANNEL_NAME, MAXIMUM_TAB_ID, TIMEOUT } from './tabManager.constants';\n\nexport class TabManager implements TabManagerInterface {\n private tabId: ID;\n private state: 'not-initiated' | 'not-claimed' | 'claimed' = 'not-initiated';\n private lastTryClaim: number | undefined;\n private events: Events = {};\n private channel: BroadcastChannel;\n\n constructor(events: Events) {\n this.channel = new BroadcastChannel(CHANNEL_NAME);\n this.tabId = Math.trunc(Math.random() * MAXIMUM_TAB_ID);\n this.events = events;\n }\n\n init = () => {\n this.initEvents();\n void this.tryClaim();\n };\n\n /**\n * This is applicable when a user in an inactive tab seeks to activate that tab.\n */\n forceClaim = () => {\n if (!this.isClaimed()) {\n const message: Message = { name: 'force-claim', candidateId: this.tabId };\n this.channel.postMessage(message);\n setTimeout(() => {\n if (!this.isClaimed()) {\n this.claim();\n }\n }, TIMEOUT);\n }\n };\n\n isClaimed = () => {\n return this.state === 'claimed';\n };\n\n /**\n * remove event listeners\n */\n destroy = () => {\n this.channel.removeEventListener('message', this.handleMessageEvent);\n document.removeEventListener(\n 'visibilitychange',\n this.handleVisibilityChange\n );\n document.removeEventListener('resume', this.handleResume);\n };\n\n /**\n * Reacting to messages and window events to claim.\n */\n private initEvents() {\n this.channel.addEventListener('message', this.handleMessageEvent);\n\n document.addEventListener('visibilitychange', this.handleVisibilityChange);\n\n /**\n * The \"resume\" event is currently supported only in certain browsers.\n * It is triggered when a previously frozen tab is unfrozen and resumes execution.\n * To avoid having multiple active tabs,\n * if the current tab is active after the \"resume\" event,\n * we send a signal to other tabs to verify if any of them currently claim to be active.\n * If this is the case, we deactivate the current tab.\n * https://developer.chrome.com/docs/web-platform/page-lifecycle-api\n */\n document.addEventListener('resume', this.handleResume);\n }\n\n /**\n * Runs after a `ping` message and checks if current tab is claimed the tabs,\n * if yes, it responds with `pong`, If not, it doesn't do anything.\n *\n * Note 1: If we receive a `ping` message,\n * it means a tab is trying to claim tabs directly, usually it's the active tab.\n *\n * Note 2: If multiple tabs are opening at once, all of them are broadcasting `ping`\n * and eventually all of them will `claim` the queue after the TIMEOUT.\n * For avoiding this, we will accepts the oldest broadcasted ping. (`isPingSentBefore`)\n */\n private claimedByCurrentTab(pingAt: number) {\n const isPingSentBefore = this.lastTryClaim && this.lastTryClaim < pingAt;\n\n if (this.isClaimed() || isPingSentBefore) {\n const message: Message = {\n name: 'pong',\n };\n this.channel.postMessage(message);\n return;\n }\n }\n\n private handleMessageEvent = (event: MessageEvent<Message>) => {\n const name = event.data.name;\n\n switch (name) {\n case 'ping':\n this.claimedByCurrentTab(event.data.pingAt);\n break;\n\n case 'pong':\n this.alreadyClaimedByAnotherTab();\n break;\n\n case 'force-claim':\n this.forceRelease(event.data.candidateId);\n break;\n\n case 'force-release':\n if (this.tabId === event.data.candidateId) {\n this.claim();\n }\n break;\n\n default:\n throw new Error(`${name} is not supported.`);\n }\n };\n\n private handleVisibilityChange = async () => {\n if (document.visibilityState === 'visible') {\n await this.tryClaim();\n }\n };\n\n private handleResume = async () => {\n if (this.isClaimed()) {\n await this.tryClaim();\n if (!this.isClaimed()) {\n this.events.onRelease?.();\n }\n }\n };\n /**\n * Runs after receiving `pong` message, which means one of tabs already claimed the tabs.\n */\n private alreadyClaimedByAnotherTab() {\n this.resetLastCheck();\n }\n\n /**\n * Try to send a `ping` message to know if the tabs `claimed` or not.\n * On constructing instance, or whenever page is active we will try.\n */\n private async tryClaim() {\n /**\n * Try to ask from possible other running tabs.\n */\n this.setLastCheck();\n return new Promise<void>((resolve) => {\n setTimeout(() => {\n this.check();\n resolve();\n }, TIMEOUT);\n });\n }\n\n /**\n * If `lastCheck` is exist, it means there is no other tabs which `claimed` the tabs.\n * And we mark the current tab as `claimed`\n */\n private check() {\n if (this.state === 'not-initiated') {\n this.events.onInit?.();\n }\n /**\n *it means we didn't get any response from other tabs, this tab can claim.\n */\n if (this.lastTryClaim) {\n this.claim();\n this.resetLastCheck();\n } else {\n this.state = 'not-claimed';\n }\n }\n\n private claim() {\n this.state = 'claimed';\n this.events.onClaim?.();\n }\n\n /**\n * Setting current time as `lastCheck` and broadcast a `ping` message event.\n */\n private setLastCheck() {\n this.lastTryClaim = Date.now();\n const message: Message = {\n name: 'ping',\n pingAt: this.lastTryClaim,\n };\n this.channel.postMessage(message);\n }\n\n private resetLastCheck() {\n this.lastTryClaim = undefined;\n }\n\n /**\n * Upon receipt of a \"force-claim\" message,\n * the presently active tab is expected to deactivate itself and initiate any attached callback associated with this event.\n */\n private forceRelease(nextActiveTab: ID) {\n if (this.isClaimed()) {\n this.state = 'not-claimed';\n\n this.events.onRelease?.();\n\n const message: Message = {\n name: 'force-release',\n candidateId: nextActiveTab,\n };\n\n this.channel.postMessage(message);\n }\n }\n}\n", "import type { StoreApi, UseBoundStore } from 'zustand';\n\ntype State = object;\n\ntype WithSelectors<S> = S extends { getState: () => infer T }\n ? S & { use: { [K in keyof T]: () => T[K] } }\n : never;\n\nconst createSelectors = <S extends UseBoundStore<StoreApi<State>>>(\n _store: S\n) => {\n const store = _store as WithSelectors<typeof _store>;\n store.use = {};\n for (const k of Object.keys(store.getState())) {\n (store.use as any)[k] = () => store((s) => s[k as keyof typeof s]);\n }\n\n return store;\n};\n\nexport default createSelectors;\n", "import type { PropTypes } from './Namespaces.types';\nimport type { Namespace } from '@rango-dev/wallets-core/namespaces/common';\n\nimport { i18n } from '@lingui/core';\nimport {\n Alert,\n Button,\n Divider,\n Image,\n MessageBox,\n RadioRoot,\n WalletImageContainer,\n} from '@rango-dev/ui';\nimport React, { useEffect, useMemo, useState } from 'react';\n\nimport { useAppStore } from '../../store/AppStore';\nimport { NamespaceUnsupportedItem } from '../NamespaceItem/NamespaceUnsupportedItem';\n\nimport { NamespaceListItem } from './NamespaceListItem';\nimport { NamespaceList, StyledButton } from './Namespaces.styles';\n\nexport function Namespaces(props: PropTypes) {\n const { targetWallet } = props.value;\n const namespacesProperty = targetWallet.properties?.find(\n (property) => property.name === 'namespaces'\n );\n const isHub = targetWallet.isHub;\n const singleNamespace = targetWallet.isHub\n ? namespacesProperty?.value.selection === 'single'\n : targetWallet.needsNamespace?.selection === 'single';\n const needsNamespace = isHub\n ? namespacesProperty?.value\n : targetWallet.needsNamespace;\n const providerImage = targetWallet.image;\n\n const blockchains = useAppStore().blockchains();\n const [selectedNamespaces, setSelectedNamespaces] = useState<Namespace[]>([]);\n const supportedNamespaces = useMemo(\n () => needsNamespace?.data.filter((namespace) => !namespace.unsupported),\n [targetWallet?.type]\n );\n\n const onSelect = (namespace: Namespace) => {\n if (singleNamespace) {\n setSelectedNamespaces([namespace]);\n } else {\n setSelectedNamespaces((selectedNamespaces) =>\n selectedNamespaces.includes(namespace)\n ? selectedNamespaces.filter((item) => item !== namespace)\n : selectedNamespaces.concat(namespace)\n );\n }\n };\n\n const allSupportedNamespacesSelected =\n supportedNamespaces?.length === selectedNamespaces.length;\n\n const onSelectAll = () => {\n if (singleNamespace) {\n throw new Error(\n 'onSelectAll should not be called on single selection mode.'\n );\n } else if (allSupportedNamespacesSelected) {\n setSelectedNamespaces([]);\n } else if (supportedNamespaces) {\n setSelectedNamespaces(\n supportedNamespaces.map((namespace) => namespace.value)\n );\n }\n };\n\n const wrapRadioRoot = (children: React.ReactNode) => {\n if (singleNamespace) {\n return <RadioRoot value={selectedNamespaces?.[0]}>{children}</RadioRoot>;\n }\n\n return <>{children}</>;\n };\n\n useEffect(() => {\n // Initially select supported and required namespaces\n if (!singleNamespace && supportedNamespaces) {\n if (!!props.value.defaultSelectedChains?.length) {\n const namespacesContainingDefaultSelectedChains =\n supportedNamespaces.filter((namespace) =>\n namespace\n .getSupportedChains(blockchains)\n .some((chain) =>\n props.value.defaultSelectedChains?.includes(chain.name)\n )\n );\n setSelectedNamespaces(\n namespacesContainingDefaultSelectedChains.map(\n (namespace) => namespace.value\n )\n );\n } else {\n setSelectedNamespaces(\n supportedNamespaces.map((namespace) => namespace.value)\n );\n }\n }\n }, []);\n\n return (\n <>\n <MessageBox\n type=\"info\"\n title={i18n.t(`Connect {wallet}`, {\n wallet: targetWallet.title,\n })}\n description={i18n.t(\n 'This wallet supports multiple chains. Choose which chains you\u2019d like to connect.'\n )}\n icon={\n <WalletImageContainer>\n <Image src={providerImage} size={45} />\n </WalletImageContainer>\n }\n />\n {singleNamespace ? (\n <>\n <Divider\n size={20}\n className=\"_initial_namespace_list_header_alert_top_divider\"\n />\n <Alert\n id=\"widget-wallet-stateful-connect-alert\"\n variant=\"alarm\"\n type=\"info\"\n title={i18n.t(\n 'This wallet can only connect to one chain at a time. '\n )}\n />\n <Divider\n size={30}\n className=\"_initial_namespace_list_header_alert_bottom_divider\"\n />\n </>\n ) : (\n <>\n <Divider\n size={30}\n className=\"_initial_namespace_list_header_button_top_divider\"\n />\n <Button\n style={{ marginLeft: 'auto' }}\n id=\"widget-name-space-select-all-btn\"\n size=\"xsmall\"\n variant=\"ghost\"\n type=\"primary\"\n onClick={onSelectAll}>\n {allSupportedNamespacesSelected\n ? i18n.t('Deselect all')\n : i18n.t('Select all')}\n </Button>\n <Divider\n size={10}\n className=\"_initial_namespace_list_header_button_bottom_divider\"\n />\n </>\n )}\n <NamespaceList>\n {wrapRadioRoot(\n <>\n {needsNamespace?.data.map((namespace, index, array) => (\n <React.Fragment key={namespace.id}>\n {namespace.unsupported ? (\n <NamespaceUnsupportedItem namespace={namespace} />\n ) : (\n <NamespaceListItem\n value={selectedNamespaces.includes(namespace.value)}\n namespace={namespace}\n type={singleNamespace ? 'radio' : 'checkbox'}\n onClick={() => onSelect(namespace.value)}\n />\n )}\n {index !== array.length - 1 && <Divider size={10} />}\n </React.Fragment>\n ))}\n </>\n )}\n </NamespaceList>\n <Divider size={20} />\n <StyledButton\n id=\"widget-name-space-confirm-btn\"\n type=\"primary\"\n disabled={!selectedNamespaces.length}\n onClick={() => props.onConfirm(selectedNamespaces)}>\n {i18n.t('Connect')}\n </StyledButton>\n </>\n );\n}\n", "import type { NamespaceUnsupportedItemPropTypes } from './NamespaceItem.types';\n\nimport { i18n } from '@lingui/core';\nimport { Typography } from '@rango-dev/ui';\nimport React from 'react';\n\nimport { useAppStore } from '../../store/AppStore';\n\nimport { getBlockchainLogo } from './NamespaceItem.helpers';\nimport {\n NamespaceItemContainer,\n NamespaceItemContent,\n NamespaceLogo,\n UnsupportedNamespaceItemInnerContent,\n} from './NamespaceItem.styles';\n\nexport function NamespaceUnsupportedItem(\n props: NamespaceUnsupportedItemPropTypes\n) {\n const { namespace } = props;\n const blockchains = useAppStore().blockchains();\n\n return (\n <NamespaceItemContainer unsupported>\n <NamespaceItemContent>\n <NamespaceLogo\n src={getBlockchainLogo(blockchains, namespace.id)}\n size={40}\n disabled\n />\n <UnsupportedNamespaceItemInnerContent>\n <Typography variant=\"label\" size=\"large\">\n {namespace.label}\n </Typography>\n <Typography variant=\"body\" size=\"xsmall\">\n {i18n.t('(Currently not supported)')}\n </Typography>\n </UnsupportedNamespaceItemInnerContent>\n </NamespaceItemContent>\n </NamespaceItemContainer>\n );\n}\n", "import type { BlockchainMeta } from 'rango-types';\n\nexport function getBlockchainLogo(\n blockchains: BlockchainMeta[],\n blockchainName: string\n): string | undefined {\n return blockchains.find((blockchain) => blockchain.name === blockchainName)\n ?.logo;\n}\n", "import { darkTheme, Image, styled, Typography } from '@rango-dev/ui';\n\nexport const NamespaceItemContainer = styled('li', {\n backgroundColor: '$neutral200',\n padding: '$16',\n borderRadius: '$sm',\n variants: {\n clickable: {\n true: {\n cursor: 'pointer',\n },\n },\n hasError: {\n true: {\n background: '$error100',\n [`.${darkTheme} &`]: {\n backgroundColor: '$error700',\n },\n },\n },\n unsupported: {\n true: {\n cursor: 'not-allowed',\n paddingTop: '$8',\n paddingBottom: '$8',\n },\n },\n },\n});\n\nexport const NamespaceItemContent = styled('div', {\n display: 'flex',\n gap: '$8',\n alignItems: 'center',\n});\n\nexport const NamespaceItemInnerContent = styled('div', {\n flex: '1',\n display: 'flex',\n flexDirection: 'column',\n justifyContent: 'space-between',\n height: '$40',\n variants: {\n showSupportedChains: {\n true: {\n justifyContent: 'space-between',\n },\n false: {\n justifyContent: 'center',\n },\n },\n },\n});\n\nexport const UnsupportedNamespaceItemInnerContent = styled('div', {\n flex: '1',\n display: 'flex',\n alignItems: 'center',\n gap: '$4',\n opacity: '0.5',\n});\n\nexport const NamespaceItemInfo = styled('div', {\n display: 'flex',\n gap: '$6',\n alignItems: 'center',\n});\n\nexport const NamespaceItemError = styled('div', {\n paddingLeft: '48px',\n});\n\nexport const NamespaceItemErrorDropdownToggle = styled('div', {\n display: 'flex',\n gap: '$2',\n cursor: 'pointer',\n alignItems: 'center',\n width: 'fit-content',\n});\n\nexport const NamespaceAccountAddress = styled(Typography, {\n maxWidth: '100px',\n});\n\nexport const NamespaceLogo = styled(Image, {\n variants: {\n disabled: {\n true: {\n opacity: '0.5',\n },\n },\n },\n});\n", "import type { NamespaceItemPropTypes } from './Namespaces.types';\n\nimport { Checkbox, Radio } from '@rango-dev/ui';\nimport React from 'react';\n\nimport { NamespaceItem } from '../NamespaceItem';\n\nexport function NamespaceListItem(props: NamespaceItemPropTypes) {\n const { onClick, type, namespace } = props;\n\n return (\n <NamespaceItem\n namespace={namespace}\n onClick={onClick}\n suffix={\n type === 'radio' ? (\n <Radio value={namespace.value} />\n ) : (\n <Checkbox checked={props.value} />\n )\n }\n />\n );\n}\n", "import type { PropTypes } from './NamespaceItem.types';\n\nimport { i18n } from '@lingui/core';\nimport {\n ChevronDownIcon,\n ChevronUpIcon,\n Divider,\n Typography,\n} from '@rango-dev/ui';\nimport React, { useEffect, useState } from 'react';\n\nimport { useAppStore } from '../../store/AppStore';\n\nimport { getBlockchainLogo } from './NamespaceItem.helpers';\nimport {\n NamespaceAccountAddress,\n NamespaceItemContainer,\n NamespaceItemContent,\n NamespaceItemError,\n NamespaceItemErrorDropdownToggle,\n NamespaceItemInfo,\n NamespaceItemInnerContent,\n NamespaceLogo,\n} from './NamespaceItem.styles';\nimport { SupportedChainsList } from './SupportedChainsList';\n\nexport function NamespaceItem(props: PropTypes) {\n const { namespace, error, suffix, connected, address, onClick } = props;\n\n const [errorIsExpanded, setErrorIsExpanded] = useState(false);\n const blockchains = useAppStore().blockchains();\n\n useEffect(() => setErrorIsExpanded(false), [error]);\n\n const supportedChains = namespace.getSupportedChains(blockchains);\n const isSupportedChainsDisplayed =\n !error && !connected && supportedChains.length > 1;\n\n return (\n <NamespaceItemContainer\n hasError={!!error}\n clickable={!!onClick}\n onClick={onClick}>\n <NamespaceItemContent>\n <NamespaceLogo\n src={getBlockchainLogo(blockchains, namespace.id)}\n size={40}\n />\n <NamespaceItemInnerContent\n showSupportedChains={\n isSupportedChainsDisplayed || connected || !!error\n }>\n <NamespaceItemInfo>\n <Typography variant=\"label\" size=\"large\">\n {namespace.label}\n </Typography>\n {connected && (\n <Typography variant=\"body\" size=\"small\" color=\"success500\">\n {i18n.t('Connected')}\n </Typography>\n )}\n {!!error && (\n <Typography variant=\"body\" size=\"small\" color=\"error500\">\n {i18n.t('Connection failed')}\n </Typography>\n )}\n </NamespaceItemInfo>\n {isSupportedChainsDisplayed && (\n <SupportedChainsList chains={supportedChains} />\n )}\n {connected && (\n <NamespaceAccountAddress\n variant=\"body\"\n size=\"small\"\n color=\"neutral700\">\n {address}\n </NamespaceAccountAddress>\n )}\n {error && (\n <NamespaceItemErrorDropdownToggle\n onClick={() =>\n setErrorIsExpanded((errorIsExpanded) => !errorIsExpanded)\n }>\n <Typography\n variant=\"body\"\n size=\"small\"\n color=\"neutral700\"\n style={{\n textDecoration: 'underline',\n userSelect: 'none',\n textDecorationSkipInk: 'none',\n }}>\n {i18n.t('See why')}\n </Typography>\n {errorIsExpanded ? (\n <ChevronUpIcon size={12} color=\"gray\" />\n ) : (\n <ChevronDownIcon size={12} color=\"gray\" />\n )}\n </NamespaceItemErrorDropdownToggle>\n )}\n </NamespaceItemInnerContent>\n {suffix}\n </NamespaceItemContent>\n {!!error && errorIsExpanded && (\n <>\n <Divider size={4} />\n <NamespaceItemError>\n <Typography variant=\"body\" size=\"small\" color=\"neutral700\">\n {error}\n </Typography>\n </NamespaceItemError>\n </>\n )}\n </NamespaceItemContainer>\n );\n}\n", "import type { PropTypes } from './SupportedChainsList.types';\n\nimport { Image, Tooltip, Typography } from '@rango-dev/ui';\nimport React from 'react';\n\nimport { getContainer } from '../../utils/common';\n\nimport {\n SupportedChainItem,\n SupportedChainsContainer,\n} from './SupportedChainsList.styles';\n\nconst SUPPORTED_CHAINS_MAX_DISPLAYED_NUMBER = 3;\n\nexport function SupportedChainsList(props: PropTypes) {\n const { chains } = props;\n return (\n <SupportedChainsContainer id=\"widget-supported-chains-container\">\n {chains\n .slice(0, SUPPORTED_CHAINS_MAX_DISPLAYED_NUMBER)\n .map((chain, index) => (\n <Tooltip\n key={chain.name}\n container={getContainer()}\n side=\"bottom\"\n align=\"start\"\n content={chain.name}\n sideOffset={4}>\n <SupportedChainItem firstItem={index === 0}>\n <Image src={chain.logo} size={15} />\n </SupportedChainItem>\n </Tooltip>\n ))}\n {chains.length > SUPPORTED_CHAINS_MAX_DISPLAYED_NUMBER && (\n <Tooltip\n container={getContainer()}\n side=\"bottom\"\n align=\"start\"\n sideOffset={4}\n content={\n <SupportedChainsContainer>\n {chains.map((chain, index) => (\n <SupportedChainItem key={chain.name} firstItem={index === 0}>\n <Image src={chain.logo} size={15} />\n </SupportedChainItem>\n ))}\n </SupportedChainsContainer>\n }>\n <SupportedChainItem>\n <Typography variant=\"body\" size=\"xsmall\">\n +{chains.length - SUPPORTED_CHAINS_MAX_DISPLAYED_NUMBER}\n </Typography>\n </SupportedChainItem>\n </Tooltip>\n )}\n </SupportedChainsContainer>\n );\n}\n", "import { styled } from '@rango-dev/ui';\n\nexport const SupportedChainsContainer = styled('div', {\n display: 'flex',\n alignItems: 'center',\n padding: 0,\n margin: 0,\n});\n\nexport const SupportedChainItem = styled('div', {\n marginLeft: '-5px',\n listStyleType: 'none',\n backgroundColor: '$background',\n borderRadius: '$lg',\n minWidth: '15px',\n height: '15px',\n variants: {\n firstItem: {\n true: { marginLeft: 0 },\n },\n },\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n});\n", "import { Button, styled } from '@rango-dev/ui';\n\nexport const NamespaceList = styled('ul', {\n padding: 0,\n paddingBottom: '$20',\n margin: 0,\n});\n\nexport const StyledButton = styled(Button, {\n minHeight: '$40',\n});\n", "import type { PropTypes } from './Detached.types';\nimport type { LegacyNamespaceMeta } from '@rango-dev/wallets-core/legacy';\nimport type { Namespace } from '@rango-dev/wallets-core/namespaces/common';\n\nimport { i18n } from '@lingui/core';\nimport {\n Alert,\n Button,\n Divider,\n Image,\n MessageBox,\n WalletImageContainer,\n} from '@rango-dev/ui';\nimport { useWallets } from '@rango-dev/wallets-react';\nimport React from 'react';\n\nimport { NamespaceUnsupportedItem } from '../NamespaceItem/NamespaceUnsupportedItem';\n\nimport { NamespacesHeader } from './Detached.styles';\nimport { NamespaceDetachedItem } from './NamespaceDetachedItem';\nimport { NamespaceList, StyledButton } from './Namespaces.styles';\n\nexport function Detached(props: PropTypes) {\n const {\n value,\n selectedNamespaces,\n onConfirm,\n confirmText = i18n.t('Done'),\n onDisconnectWallet,\n navigateToDerivationPath,\n } = props;\n const { targetWallet } = value;\n\n const { connect, disconnect, state } = useWallets();\n const walletType = targetWallet.type;\n const walletState = state(walletType);\n const namespacesProperty = targetWallet.properties?.find(\n (property) => property.name === 'namespaces'\n );\n const derivationPathProperty = targetWallet.properties?.find(\n (property) => property.name === 'derivationPath'\n );\n\n const singleSelection = namespacesProperty?.value.selection === 'single';\n\n const handleConnectNamespace = async (\n namespace: Namespace,\n options?: {\n derivationPath?: string;\n shouldAskForDerivationPath?: boolean;\n }\n ) => {\n if (singleSelection) {\n // For single-selection wallets, disconnect all namespaces before connecting a new namespace\n await disconnect(walletType);\n }\n if (derivationPathProperty && options?.shouldAskForDerivationPath) {\n navigateToDerivationPath(namespace);\n } else {\n await connect(walletType, [\n {\n namespace: namespace,\n network: '',\n derivationPath: options?.derivationPath ?? undefined,\n },\n ]);\n }\n };\n\n const handleDisconnectNamespace = async (namespace: Namespace) => {\n await disconnect(walletType, [namespace]);\n };\n\n const renderNamespaceListHeader = () => {\n if (!!singleSelection) {\n return (\n <>\n <Divider\n size={20}\n className=\"_detached_namespace_list_header_alert_top_divider\"\n />\n <Alert\n id=\"widget-wallet-stateful-connect-alert\"\n variant=\"alarm\"\n type=\"info\"\n title={i18n.t(\n 'This wallet can only connect to one chain at a time.'\n )}\n />\n <Divider\n size={30}\n className=\"_detached_namespace_list_header_alert_bottom_divider\"\n />\n </>\n );\n }\n return (\n <>\n <Divider\n size={30}\n className=\"_detached_namespace_list_header_button_top_divider\"\n />\n <NamespacesHeader>\n <Button\n id=\"widget-detached-disconnect-wallet-btn\"\n variant=\"ghost\"\n type=\"error\"\n size=\"xsmall\"\n disabled={walletState.connecting || !walletState.connected}\n onClick={onDisconnectWallet}>\n {i18n.t('Disconnect wallet')}\n </Button>\n </NamespacesHeader>\n <Divider\n size={16}\n className=\"_detached_namespace_list_header_button_bottom_divider\"\n />\n </>\n );\n };\n\n const renderNamespaceItem = (namespace: LegacyNamespaceMeta) => {\n if (namespace.unsupported) {\n return <NamespaceUnsupportedItem namespace={namespace} />;\n }\n\n const selectedNamespace = selectedNamespaces?.find(\n (selectedNamespaceItem) =>\n selectedNamespaceItem.namespace === namespace.value\n );\n\n const namespaceState = walletState.namespaces?.get(namespace.value);\n\n if (!namespaceState) {\n throw new Error(`State for ${namespace.value} was not found!`);\n }\n\n const disabled = singleSelection && walletState.connecting; // If wallet is configured as single selection, button should be disabled while a namespace is already in connecting state\n\n return (\n <NamespaceDetachedItem\n namespace={namespace}\n initialConnect={!!selectedNamespace}\n disabled={disabled}\n state={namespaceState}\n handleConnect={async (options) =>\n handleConnectNamespace(namespace.value, {\n derivationPath: selectedNamespace?.derivationPath,\n shouldAskForDerivationPath: options?.shouldAskForDerivationPath,\n })\n }\n handleDisconnect={async () =>\n handleDisconnectNamespace(namespace.value)\n }\n />\n );\n };\n\n return (\n <>\n <MessageBox\n type=\"info\"\n title={i18n.t(`Connect {wallet}`, {\n wallet: targetWallet.type,\n })}\n description={i18n.t(\n 'This wallet supports multiple chains. Choose which chains you\u2019d like to connect or disconnect.'\n )}\n icon={\n <WalletImageContainer>\n <Image src={targetWallet.image} size={45} />\n </WalletImageContainer>\n }\n />\n {renderNamespaceListHeader()}\n <NamespaceList id=\"widget-detached-namespace-list\">\n {targetWallet.needsNamespace?.data.map((namespace, index, array) => (\n <React.Fragment key={namespace.id}>\n {renderNamespaceItem(namespace)}\n {index !== array.length - 1 && <Divider size={10} />}\n </React.Fragment>\n ))}\n </NamespaceList>\n <Divider size={20} />\n <StyledButton\n id=\"widget-name-space-confirm-btn\"\n type=\"primary\"\n onClick={onConfirm}>\n {confirmText}\n </StyledButton>\n </>\n );\n}\n", "import { styled } from '@rango-dev/ui';\n\nexport const NamespacesHeader = styled('div', {\n display: 'flex',\n justifyContent: 'end',\n});\n", "import type { NamespaceDetachedItemPropTypes } from './Namespaces.types';\n\nimport { i18n } from '@lingui/core';\nimport { Button, Spinner } from '@rango-dev/ui';\nimport React, { useLayoutEffect, useRef, useState } from 'react';\n\nimport { getConciseAddress } from '../../utils/wallets';\nimport { NamespaceItem } from '../NamespaceItem';\n\nexport function NamespaceDetachedItem(props: NamespaceDetachedItemPropTypes) {\n const {\n namespace,\n initialConnect,\n disabled,\n state,\n handleConnect,\n handleDisconnect,\n } = props;\n\n const [error, setError] = useState<Error | null>(null);\n\n /*\n * Ref to track ongoing connection attempts.\n * In React Strict Mode, effects run twice for safety checks.\n * This prevents multiple connect requests by ensuring only one attempt is processed at a time.\n */\n const processingConnectAttempt = useRef(false);\n\n useLayoutEffect(() => {\n if (initialConnect && !processingConnectAttempt.current) {\n void handleConnectNamespace(); // If we attempt to connect the namespace as the initial connect, we should not ask for derivation path\n }\n }, []);\n\n const handleConnectNamespace = async (options?: {\n shouldAskForDerivationPath?: boolean;\n }) => {\n try {\n processingConnectAttempt.current = true;\n await handleConnect(options);\n } catch (error) {\n setError(error as Error);\n } finally {\n processingConnectAttempt.current = false;\n }\n };\n\n const handleButtonClick = async () => {\n setError(null);\n if (state.connected) {\n await handleDisconnect();\n } else {\n void handleConnectNamespace({ shouldAskForDerivationPath: true }); // If we attempt to connect the namespace in result of button click, we should ask for derivation path\n }\n };\n\n const getConnectedAddress = () => {\n const firstAccountArray = state.accounts?.[0]?.split(':');\n const address = firstAccountArray?.[firstAccountArray.length - 1]; // Considering that account = [namespace, chain, address], we only need to get the address\n if (!state.connected || !address) {\n return null;\n }\n\n return getConciseAddress(address);\n };\n\n const getButtonText = () => {\n if (state.connected) {\n return i18n.t('Disconnect');\n }\n if (!!error) {\n return i18n.t('Try again');\n }\n return i18n.t('Connect');\n };\n\n return (\n <NamespaceItem\n namespace={namespace}\n connected={state.connected}\n error={error?.message}\n address={getConnectedAddress()}\n suffix={\n state.connecting ? (\n <Spinner color=\"info\" />\n ) : (\n <Button\n id=\"widget-name-space-connect-btn\"\n variant=\"ghost\"\n type={state.connected ? 'error' : 'primary'}\n size=\"xsmall\"\n onClick={async () => handleButtonClick()}\n disabled={disabled}>\n {getButtonText()}\n </Button>\n )\n }\n />\n );\n}\n", "import type { PropTypes } from './DerivationPath.types';\nimport type { DerivationPath } from '@rango-dev/wallets-shared';\n\nimport { i18n } from '@lingui/core';\nimport { Divider, Image, MessageBox, Select, TextField } from '@rango-dev/ui';\nimport React, { useEffect, useState } from 'react';\n\nimport {\n CUSTOM_DERIVATION_PATH,\n getDerivationPaths,\n} from './DerivationPath.helpers';\nimport {\n derivationPathInputStyles,\n InputLabel,\n InputsContainer,\n} from './DerivationPath.styles';\nimport { StyledButton } from './Namespaces.styles';\n\nconst DEFAULT_DERIVATION_PATH_INDEX = '0';\n\nexport function DerivationPath(props: PropTypes) {\n const { onConfirm } = props;\n const {\n namespace: selectedNamespace,\n providerImage: image,\n providerType: type,\n } = props.value;\n\n const [selectedDerivationPathId, setSelectedDerivationPathId] = useState<\n string | null\n >(null);\n const [derivationPathIndex, setDerivationPathIndex] = useState(\n DEFAULT_DERIVATION_PATH_INDEX\n );\n\n const isCustomOptionSelected =\n selectedDerivationPathId === CUSTOM_DERIVATION_PATH.id;\n\n const derivationPaths = getDerivationPaths(selectedNamespace);\n\n const handleDerivationPathItemClick = ({ value }: { value: string }) => {\n const selectedDerivationPath = derivationPaths?.find(\n (derivationPath) => derivationPath.id === value\n );\n\n if (selectedDerivationPath) {\n /*\n * Custom mode accepts string, but other modes only accepts number,\n * Here we are checking if user is on custom mode and trying to switch to another mode\n * if it's an string we will keep it, if not we will reset the value to default\n */\n if (\n selectedDerivationPathId === CUSTOM_DERIVATION_PATH.id &&\n Number.isNaN(Number(derivationPathIndex))\n ) {\n setDerivationPathIndex(DEFAULT_DERIVATION_PATH_INDEX);\n }\n\n setSelectedDerivationPathId(selectedDerivationPath.id);\n }\n };\n\n const handleConfirm = () => {\n const selectedDerivationPath = derivationPaths.find(\n (derivationPath) => derivationPath.id === selectedDerivationPathId\n );\n if (selectedDerivationPath) {\n onConfirm(\n selectedDerivationPath.generateDerivationPath(derivationPathIndex)\n );\n } else {\n // Unreachable code\n throw new Error('selectedDerivationPath can not be undefined');\n }\n };\n\n useEffect(() => {\n setSelectedDerivationPathId(\n getDerivationPaths(selectedNamespace)[0]?.id || null\n );\n }, [selectedNamespace]);\n\n return (\n <>\n <MessageBox\n type=\"info\"\n title={i18n.t('Select Derivation Path')}\n description={i18n.t({\n id: 'In order to connect to {type}, you must first select a Derivation Path',\n values: {\n type,\n },\n })}\n icon={<Image src={image} size={45} />}\n />\n\n <InputsContainer className=\"_derivation_path_inputs_container\">\n <InputLabel\n variant=\"body\"\n size=\"xsmall\"\n color=\"$neutral600\"\n className=\"_derivation_path_input_label\">\n {i18n.t('Choose Derivation Path Template')}\n </InputLabel>\n <Select\n id=\"widget-derivation-path-template-select\"\n value={selectedDerivationPathId || ''}\n options={derivationPaths.map((derivationPath) => ({\n value: derivationPath.id,\n label: derivationPath.label,\n }))}\n variant=\"filled\"\n handleItemClick={handleDerivationPathItemClick}\n styles={{ trigger: derivationPathInputStyles }}\n />\n <Divider size={20} />\n <InputLabel\n variant=\"body\"\n size=\"xsmall\"\n color=\"$neutral600\"\n className=\"_derivation_path_input_label\">\n {isCustomOptionSelected\n ? i18n.t('Enter Path')\n : i18n.t('Enter Index')}\n </InputLabel>\n <TextField\n id=\"widget-derivation-path-template-input\"\n type={isCustomOptionSelected ? 'text' : 'number'}\n variant=\"contained\"\n value={derivationPathIndex}\n onChange={(event) => setDerivationPathIndex(event.target.value)}\n style={derivationPathInputStyles}\n />\n </InputsContainer>\n\n <StyledButton\n id=\"widget-derivation-path-confirm-btn\"\n type=\"primary\"\n onClick={handleConfirm}\n disabled={\n !derivationPaths || !selectedDerivationPathId || !derivationPathIndex\n }>\n {i18n.t('Confirm')}\n </StyledButton>\n </>\n );\n}\n", "import type { Namespace } from '@rango-dev/wallets-core/namespaces/common';\nimport type { DerivationPath } from '@rango-dev/wallets-shared';\n\nimport { namespaces } from '@rango-dev/wallets-shared';\n\nexport const CUSTOM_DERIVATION_PATH: DerivationPath = {\n id: 'custom',\n label: 'Custom',\n generateDerivationPath: (index: string) => index,\n};\n\nexport function getDerivationPaths(\n selectedNamespace?: Namespace\n): DerivationPath[] {\n const selectedNamespaceDerivationPaths = selectedNamespace\n ? namespaces[selectedNamespace]?.derivationPaths\n : null;\n\n const derivationPaths: DerivationPath[] = !!selectedNamespaceDerivationPaths\n ? [...selectedNamespaceDerivationPaths, CUSTOM_DERIVATION_PATH]\n : [];\n\n return derivationPaths;\n}\n", "import { Button, styled, Typography } from '@rango-dev/ui';\n\nexport const InputsContainer = styled('div', {\n paddingTop: '$30',\n paddingBottom: '$30',\n zIndex: 10, // This property is added to solve inconsistency between Select child of this component and subsequent button\n});\n\nexport const InputLabel = styled(Typography, {\n paddingLeft: '$10',\n});\n\nexport const derivationPathInputStyles = {\n height: '$40',\n backgroundColor: '$neutral200',\n borderRadius: '$sm',\n};\n\nexport const StyledButton = styled(Button, {\n minHeight: '$40',\n});\n", "import type { ConnectStatusProps } from './ConnectStatus.types';\n\nimport { i18n } from '@lingui/core';\nimport {\n Image,\n MessageBox,\n WalletImageContainer,\n WalletState,\n} from '@rango-dev/ui';\nimport { useWallets } from '@rango-dev/wallets-react';\nimport React from 'react';\n\nimport { getWalletConnectionStatus } from '../../utils/wallets';\n\nimport { LogoContainer, Spinner } from './ConnectStatus.styles';\n\nexport function ConnectStatus(props: ConnectStatusProps) {\n // See `wallet` notes on its type definition\n const { wallet, error } = props;\n const { type, image } = wallet;\n const { state, getWalletInfo } = useWallets();\n const walletState = getWalletConnectionStatus(\n getWalletInfo(type),\n state(type)\n );\n\n if (walletState === WalletState.CONNECTED) {\n return (\n <MessageBox\n type=\"success\"\n title={i18n.t('Wallet Connected')}\n description={i18n.t(\n 'Your wallet is connected, you can use it to swap.'\n )}\n />\n );\n }\n\n if (error) {\n return (\n <MessageBox\n type=\"error\"\n title={i18n.t('Failed to Connect')}\n description={\n error || i18n.t('Your wallet is not connected. Please try again.')\n }\n />\n );\n }\n\n return (\n <MessageBox\n type=\"loading\"\n title={i18n.t('Connecting to your wallet')}\n description={i18n.t('Click connect in your wallet popup.')}\n icon={\n <LogoContainer>\n <WalletImageContainer>\n <Image src={image} size={45} />\n </WalletImageContainer>\n <Spinner />\n </LogoContainer>\n }\n />\n );\n}\n", "import { keyframes, styled } from '@rango-dev/ui';\n\nexport const IconContainer = styled('div', {\n borderRadius: '$lg',\n width: '$45',\n height: '$45',\n backgroundColor: '$success300',\n display: 'flex',\n justifyContent: 'center',\n alignItems: 'center',\n});\n\nexport const LogoContainer = styled('div', {\n position: 'relative',\n});\n\nconst spin = keyframes({\n '0%': {\n transform: 'rotate(0deg)',\n },\n '100%': {\n transform: 'rotate(360deg)',\n },\n});\n\nexport const Spinner = styled('div', {\n position: 'absolute',\n border: '2px solid rgba(0, 0, 0, 0.1)',\n borderTop: '2px solid $info500',\n borderRadius: '$lg',\n width: '$45',\n height: '$45',\n animation: `${spin} 1s linear infinite`,\n top: 0,\n bottom: 0,\n right: 0,\n left: 0,\n});\n", "import { i18n } from '@lingui/core';\nimport { Button, Divider, MessageBox } from '@rango-dev/ui';\nimport React from 'react';\n\ninterface PropTypes {\n displayName?: string;\n onConfirm: () => void;\n id: string;\n}\n\nexport function ExperimentalChain(props: PropTypes) {\n const { displayName, onConfirm, id } = props;\n\n return (\n <MessageBox\n id={id}\n title={i18n.t({\n id: 'Add {blockchainDisplayName} Chain',\n values: { blockchainDisplayName: displayName },\n })}\n type=\"warning\"\n description={i18n.t({\n id: 'Would you like to add the {blockchainDisplayName} experimental chain to your wallet?',\n values: { blockchainDisplayName: displayName },\n })}>\n <Divider size={18} />\n <Divider size={32} />\n <Button\n id=\"widget-experimental-chain-confirm-btn\"\n onClick={onConfirm}\n variant=\"outlined\"\n type=\"primary\"\n fullWidth\n size=\"large\">\n {i18n.t('Confirm')}\n </Button>\n </MessageBox>\n );\n}\n", "import type { State } from '../../hooks/useStatefulConnect';\nimport type { WalletInfoWithExtra } from '../../types';\n\nexport function isOnStatus(\n getState: () => State,\n wallet?: WalletInfoWithExtra\n): wallet is WalletInfoWithExtra {\n return getState().status === 'init' && !!wallet;\n}\n\nexport function isOnNamespace(\n getState: () => State\n): getState is () => State & { namespace: NonNullable<State['namespace']> } {\n return getState().status === 'namespace';\n}\n\nexport function isOnDerivationPath(\n getState: () => State\n): getState is () => State & {\n derivationPath: NonNullable<State['derivationPath']>;\n} {\n return getState().status === 'derivationPath';\n}\n\nexport function isOnDetached(\n getState: () => State\n): getState is () => State & { namespace: NonNullable<State['namespace']> } {\n return getState().status === 'detached';\n}\n", "import type { RefuelProps } from './Refuel.types';\nimport type { PropsWithChildren } from 'react';\n\nimport React from 'react';\n\nimport { AppRouter } from '../../components/AppRouter';\nimport { DEFAULT_CONFIG } from '../../store/slices/config';\nimport { Main } from '../App';\nimport { WidgetProvider } from '../WidgetProvider';\n\nexport function Refuel(props: PropsWithChildren<RefuelProps>) {\n const isExternalWalletsEnabled = props.config?.externalWallets;\n\n return (\n <AppRouter>\n {isExternalWalletsEnabled ? (\n <Main />\n ) : (\n <WidgetProvider config={props.config ?? DEFAULT_CONFIG}>\n <Main />\n </WidgetProvider>\n )}\n </AppRouter>\n );\n}\n", "import type { PropsWithChildren } from 'react';\n\nimport React, { Fragment } from 'react';\nimport { MemoryRouter, useInRouterContext } from 'react-router';\n\nexport function AppRouter({ children }: PropsWithChildren) {\n const isRouterInContext = useInRouterContext();\n const Router = isRouterInContext ? Fragment : MemoryRouter;\n\n return <Router>{children}</Router>;\n}\n", "import { I18nManager } from '@rango-dev/ui';\nimport React from 'react';\n\nimport { AppRoutes } from '../../components/AppRoutes';\nimport { useBootstrap } from '../../hooks/useBootstrap';\nimport { useLanguage } from '../../hooks/useLanguage';\nimport { useTheme } from '../../hooks/useTheme';\nimport { useAppStore } from '../../store/AppStore';\n\nimport { MainContainer } from './App.styles';\n\nexport function Main() {\n useBootstrap();\n const { config } = useAppStore();\n const { activeTheme } = useTheme(config?.theme || {});\n const { activeLanguage } = useLanguage();\n\n return (\n <I18nManager language={activeLanguage}>\n <MainContainer id=\"swap-container\" className={activeTheme()}>\n <AppRoutes />\n </MainContainer>\n </I18nManager>\n );\n}\n", "import React from 'react';\nimport { useRoutes } from 'react-router-dom';\n\nimport { navigationRoutes } from '../constants/navigationRoutes';\nimport { useSyncStoresWithConfig } from '../hooks/useSyncStoresWithConfig';\nimport { useSyncUrlAndStore } from '../hooks/useSyncUrlAndStore';\nimport { AddCustomTokenPage } from '../pages/AddCustomTokenPage';\nimport { ConfirmSwapPage } from '../pages/ConfirmSwapPage';\nimport { CustomTokensPage } from '../pages/CustomTokensPage';\nimport { HistoryPage } from '../pages/HistoryPage';\nimport { Home } from '../pages/Home';\nimport { LanguagePage } from '../pages/LanguagePage';\nimport { LiquiditySourcePage } from '../pages/LiquiditySourcePage';\nimport { RoutesPage } from '../pages/Routes';\nimport { SelectBlockchainPage } from '../pages/SelectBlockchainPage';\nimport { SelectSwapItemsPage } from '../pages/SelectSwapItemPage/index';\nimport { SettingsPage } from '../pages/SettingsPage';\nimport { SwapDetailsPage } from '../pages/SwapDetailsPage';\nimport { WalletsPage } from '../pages/WalletsPage';\n\nexport function AppRoutes() {\n /**\n * The configuration of the widget should initially be applied to the widget state.\n * If search parameters exist in the URL,\n * they should be applied later and take precedence over the widget configuration.\n * To achieve this, it is crucial to execute these hooks in the correct sequence.\n */\n useSyncStoresWithConfig();\n useSyncUrlAndStore();\n\n return useRoutes([\n {\n path: navigationRoutes.home,\n element: <Home />,\n },\n {\n path: navigationRoutes.routes,\n element: <RoutesPage />,\n },\n {\n path: navigationRoutes.fromSwap,\n children: [\n {\n index: true,\n element: <SelectSwapItemsPage type=\"source\" />,\n },\n {\n path: navigationRoutes.blockchains,\n element: <SelectBlockchainPage type=\"source\" />,\n },\n ],\n },\n {\n path: navigationRoutes.toSwap,\n children: [\n {\n index: true,\n element: <SelectSwapItemsPage type=\"destination\" />,\n },\n {\n path: navigationRoutes.blockchains,\n element: <SelectBlockchainPage type=\"destination\" />,\n },\n ],\n },\n {\n path: navigationRoutes.settings,\n children: [\n {\n index: true,\n element: <SettingsPage />,\n },\n {\n path: navigationRoutes.languages,\n element: <LanguagePage />,\n },\n {\n path: navigationRoutes.exchanges,\n element: <LiquiditySourcePage sourceType=\"Exchanges\" />,\n },\n {\n path: navigationRoutes.bridges,\n element: <LiquiditySourcePage sourceType=\"Bridges\" />,\n },\n {\n path: navigationRoutes.customTokens,\n children: [\n {\n index: true,\n element: <CustomTokensPage />,\n },\n {\n path: navigationRoutes.addCustomTokens,\n children: [\n {\n index: true,\n element: <AddCustomTokenPage />,\n },\n {\n path: navigationRoutes.blockchains,\n element: (\n <SelectBlockchainPage\n hideCategory={true}\n type=\"custom-token\"\n />\n ),\n },\n ],\n },\n ],\n },\n ],\n },\n\n {\n path: navigationRoutes.swaps,\n children: [\n {\n index: true,\n element: <HistoryPage />,\n },\n {\n path: navigationRoutes.swapDetails,\n element: <SwapDetailsPage />,\n },\n ],\n },\n {\n path: navigationRoutes.wallets,\n element: <WalletsPage />,\n },\n {\n path: navigationRoutes.confirmSwap,\n element: <ConfirmSwapPage />,\n },\n ]);\n}\n", "export const navigationRoutes = {\n home: '/',\n fromSwap: 'from-swap',\n toSwap: 'to-swap',\n blockchains: 'blockchains',\n settings: 'settings',\n customTokens: 'custom-tokens',\n addCustomTokens: 'add-custom-tokens',\n liquiditySources: 'liquidity-sources',\n bridges: 'bridges',\n exchanges: 'exchanges',\n languages: 'languages',\n swaps: 'swaps',\n wallets: 'wallets',\n confirmSwap: 'confirm-swap',\n swapDetails: ':requestId',\n routes: 'routes',\n};\n", "import type { Asset } from 'rango-sdk';\n\nimport { useEffect, useRef } from 'react';\n\nimport { useAppStore } from '../store/AppStore';\nimport { useQuoteStore } from '../store/quote';\nimport {\n isBlockchainExcludedInConfig,\n isTokenExcludedInConfig,\n} from '../utils/configs';\n\nexport function useSyncStoresWithConfig() {\n const {\n setInputAmount,\n setToToken,\n setToBlockchain,\n setFromBlockchain,\n resetQuote,\n setFromToken,\n fromToken,\n toToken,\n fromBlockchain,\n toBlockchain,\n } = useQuoteStore()();\n\n const config = useAppStore().config;\n const fetchMetaStatus = useAppStore().fetchStatus;\n const blockchains = useAppStore().blockchains();\n const { findToken } = useAppStore();\n\n const { setAffiliateRef, setAffiliatePercent, setAffiliateWallets } =\n useAppStore();\n\n const fromTokensConfig = config?.from?.tokens;\n const fromBlockchainsConfig = config?.from?.blockchains;\n const toTokensConfig = config?.to?.tokens;\n const toBlockchainsConfig = config?.to?.blockchains;\n const prevConfigFromToken = useRef<Asset | undefined>(undefined);\n const prevConfigToToken = useRef<Asset | undefined>(undefined);\n const prevConfigFromBlockchain = useRef<string | undefined>(undefined);\n const prevConfigToBlockchain = useRef<string | undefined>(undefined);\n\n useEffect(() => {\n if (typeof config.amount !== 'undefined') {\n setInputAmount(config.amount.toString());\n }\n }, [config?.amount]);\n\n useEffect(() => {\n if (fetchMetaStatus === 'success') {\n resetQuote();\n const chain = blockchains.find(\n (chain) => chain.name === config?.from?.blockchain\n );\n const fromToken = config?.from?.token;\n const token = fromToken && findToken(fromToken);\n\n if (chain || (!chain && prevConfigFromBlockchain.current)) {\n setFromBlockchain(chain ?? null);\n }\n\n if (token) {\n setFromToken({ token, meta: { blockchains } });\n } else if (!token && prevConfigFromToken.current) {\n setFromToken({ token: null });\n }\n\n prevConfigFromBlockchain.current = config?.from?.blockchain;\n prevConfigFromToken.current = config?.from?.token;\n }\n }, [\n config?.from?.token?.symbol,\n config?.from?.token?.address,\n config?.from?.token?.blockchain,\n config?.from?.blockchain,\n fetchMetaStatus,\n ]);\n\n useEffect(() => {\n if (isTokenExcludedInConfig(fromToken, fromTokensConfig)) {\n setFromToken({ token: null });\n }\n\n if (isBlockchainExcludedInConfig(fromBlockchain, fromBlockchainsConfig)) {\n setFromBlockchain(null);\n }\n }, [fromTokensConfig, fromBlockchainsConfig]);\n\n useEffect(() => {\n if (isTokenExcludedInConfig(toToken, toTokensConfig)) {\n setFromToken({ token: null });\n }\n if (isBlockchainExcludedInConfig(toBlockchain, toBlockchainsConfig)) {\n setToBlockchain(null);\n }\n }, [toTokensConfig, toBlockchainsConfig]);\n\n useEffect(() => {\n if (fetchMetaStatus === 'success') {\n resetQuote();\n const chain = blockchains.find(\n (chain) => chain.name === config?.to?.blockchain\n );\n\n const toToken = config?.to?.token;\n const token = toToken && findToken(toToken);\n\n if (chain || (!chain && prevConfigToBlockchain.current)) {\n setToBlockchain(chain ?? null);\n }\n\n if (token) {\n setToToken({ token, meta: { blockchains } });\n } else if (!token && prevConfigToToken.current) {\n setToToken({ token: null });\n }\n\n prevConfigToBlockchain.current = config?.to?.blockchain;\n prevConfigToToken.current = config?.to?.token;\n }\n }, [\n config?.to?.token?.symbol,\n config?.to?.token?.address,\n config?.to?.token?.blockchain,\n config?.to?.blockchain,\n fetchMetaStatus,\n ]);\n\n useEffect(() => {\n setAffiliateRef(config?.affiliate?.ref ?? null);\n setAffiliatePercent(config?.affiliate?.percent ?? null);\n setAffiliateWallets(config?.affiliate?.wallets ?? null);\n }, [\n config?.affiliate?.ref,\n config?.affiliate?.percent,\n config?.affiliate?.wallets,\n ]);\n}\n", "import type { TokenData } from '../components/TokenList/TokenList.types';\nimport type {\n BlockchainMeta,\n MetaResponse,\n MultiRouteResponse,\n PreferenceType,\n Token,\n} from 'rango-sdk';\nimport type { StateCreator } from 'zustand';\n\nimport BigNumber from 'bignumber.js';\nimport { create } from 'zustand';\nimport { subscribeWithSelector } from 'zustand/middleware';\n\nimport { ZERO } from '../constants/numbers';\nimport { useSwapMode } from '../hooks/useSwapMode';\nimport { eventEmitter } from '../services/eventEmitter';\nimport {\n type QuoteError,\n QuoteEventTypes,\n type QuoteWarning,\n type SelectedQuote,\n type Wallet,\n WidgetEvents,\n} from '../types';\nimport { isPositiveNumber, sanitizeInputAmount } from '../utils/numbers';\nimport {\n ensureLeadingZeroForDecimal,\n removeLeadingZeros,\n} from '../utils/sanitizers';\nimport { getUsdInputFrom, getUsdOutputFrom } from '../utils/swap';\nimport { isZeroValue } from '../utils/validation';\n\nimport createSelectors from './selectors';\n\nexport const getUsdValue = (\n token: Token | null,\n amount: string\n): BigNumber | null =>\n token?.usdPrice\n ? new BigNumber(amount || ZERO).multipliedBy(token?.usdPrice || 0)\n : null;\n\nexport type Meta = Pick<MetaResponse, 'blockchains' | 'tokens'>;\n\nexport type SetTokenParams =\n | { token: TokenData; meta: { blockchains: BlockchainMeta[] } }\n | { token: null };\n\ntype SomeQuoteState = {\n quotes: MultiRouteResponse | null;\n sortStrategy: PreferenceType;\n refetchQuote: boolean;\n error: QuoteError | null;\n warning: QuoteWarning | null;\n};\nexport type RetryQuote = {\n fromBlockchain: BlockchainMeta | null;\n fromToken?: Token;\n toBlockchain: BlockchainMeta | null;\n toToken?: Token;\n inputAmount: string;\n};\nexport interface QuoteState {\n fromBlockchain: BlockchainMeta | null;\n toBlockchain: BlockchainMeta | null;\n inputAmount: string;\n inputUsdValue: BigNumber | null;\n outputAmount: BigNumber | null;\n outputUsdValue: BigNumber | null;\n fromToken: TokenData | null;\n sortStrategy: PreferenceType;\n toToken: TokenData | null;\n quoteWalletsConfirmed: boolean;\n selectedWallets: Wallet[];\n quoteWarningsConfirmed: boolean;\n refetchQuote: boolean;\n selectedQuote: SelectedQuote | null;\n quotes: MultiRouteResponse | null;\n customDestination: string | null;\n error: QuoteError | null;\n warning: QuoteWarning | null;\n resetQuote: () => void;\n resetAlerts: () => void;\n\n resetToBlockchain: () => void;\n resetFromBlockchain: () => void;\n setFromBlockchain: (chain: BlockchainMeta | null) => void;\n setToBlockchain: (chian: BlockchainMeta | null) => void;\n setFromToken: (params: SetTokenParams) => void;\n setToToken: (params: SetTokenParams) => void;\n updateQuotePartialState: <K extends keyof SomeQuoteState>(\n key: K,\n value: SomeQuoteState[K]\n ) => void;\n setInputAmount: (amount: string) => void;\n sanitizeInputAmount: (amount: string) => void;\n setSelectedQuote: (quote: SelectedQuote | null) => void;\n retry: (retryQuote: RetryQuote) => void;\n switchFromAndTo: (options?: { toToken?: Token }) => void;\n setQuoteWalletConfirmed: (flag: boolean) => void;\n setSelectedWallets: (wallets: Wallet[]) => void;\n setCustomDestination: (address: string | null) => void;\n resetQuoteWallets: () => void;\n setQuoteWarningsConfirmed: (flag: boolean) => void;\n}\n\nconst initializer: StateCreator<\n QuoteState,\n [['zustand/subscribeWithSelector', never]],\n []\n> = (\n set: (\n partial:\n | QuoteState\n | Partial<QuoteState>\n | ((state: QuoteState) => QuoteState | Partial<QuoteState>),\n replace?: boolean | undefined\n ) => void\n) => ({\n fromBlockchain: null,\n fromToken: null,\n inputAmount: '',\n outputAmount: null,\n inputUsdValue: new BigNumber(0),\n outputUsdValue: new BigNumber(0),\n toBlockchain: null,\n toToken: null,\n refetchQuote: true,\n sortStrategy: 'SMART',\n selectedQuote: null,\n quotes: null,\n error: null,\n warning: null,\n quoteWalletsConfirmed: false,\n selectedWallets: [],\n customDestination: null,\n quoteWarningsConfirmed: false,\n updateQuotePartialState: (key, value) =>\n set((state) => ({\n ...state,\n [key]: value,\n })),\n setSelectedQuote: (quote) =>\n set((state) => {\n let outputAmount: BigNumber | null = null;\n let outputUsdValue: BigNumber = ZERO;\n\n let inputUsdValue = state.inputUsdValue;\n if (!isPositiveNumber(state.inputAmount)) {\n return {};\n }\n if (!!quote) {\n outputAmount = !!quote?.outputAmount\n ? new BigNumber(quote?.outputAmount)\n : null;\n inputUsdValue = getUsdInputFrom(quote) ?? ZERO;\n outputUsdValue = getUsdOutputFrom(quote) ?? ZERO;\n }\n return {\n selectedQuote: quote,\n ...(!!quote && {\n outputAmount,\n outputUsdValue,\n inputUsdValue,\n }),\n };\n }),\n resetAlerts: () =>\n set(() => ({\n error: null,\n warning: null,\n })),\n resetQuote: () =>\n set(() => ({\n selectedQuote: null,\n outputAmount: null,\n outputUsdValue: new BigNumber(0),\n quotes: null,\n refetchQuote: true,\n error: null,\n warning: null,\n })),\n setFromBlockchain: (chain) => {\n set((state) => {\n if (state.fromBlockchain?.name === chain?.name) {\n return {};\n }\n\n return {\n fromBlockchain: chain,\n inputUsdValue: new BigNumber(0),\n ...(state.fromToken && {\n selectedQuote: null,\n fromToken: null,\n outputAmount: null,\n outputUsdValue: new BigNumber(0),\n }),\n };\n });\n },\n setFromToken: (params) => {\n return set((state) => ({\n fromToken: params.token,\n ...(params.token && {\n fromBlockchain:\n params.meta.blockchains.find(\n (blockchain) => blockchain.name === params.token.blockchain\n ) ?? null,\n }),\n ...(!!state.inputAmount && {\n inputUsdValue: getUsdValue(params.token, state.inputAmount),\n }),\n }));\n },\n setToBlockchain: (chain) => {\n set((state) => {\n if (state.toBlockchain?.name === chain?.name) {\n return {};\n }\n\n return {\n toBlockchain: chain,\n ...(state.toToken && {\n selectedQuote: null,\n toToken: null,\n outputAmount: null,\n outputUsdValue: new BigNumber(0),\n }),\n };\n });\n },\n setToToken: (params) => {\n return set(() => ({\n toToken: params.token,\n ...(params.token && {\n toBlockchain:\n params.meta.blockchains.find(\n (blockchain) => blockchain.name === params.token.blockchain\n ) ?? null,\n }),\n }));\n },\n sanitizeInputAmount: (amount) => {\n const sanitized = sanitizeInputAmount(amount);\n\n set(() => ({\n inputAmount: sanitized,\n }));\n },\n setInputAmount: (amount) => {\n let sanitized = amount;\n if (!isZeroValue(amount)) {\n // sanitize once a meaningful digit is entered (e.g. \"00001\" \u2192 \"1\")\n sanitized = removeLeadingZeros(sanitized);\n sanitized = ensureLeadingZeroForDecimal(sanitized);\n }\n set((state) => ({\n inputAmount: sanitized,\n ...(!sanitized && {\n outputAmount: null,\n outputUsdValue: new BigNumber(0),\n selectedQuote: null,\n }),\n ...(!!state.fromToken && {\n inputUsdValue: getUsdValue(state.fromToken, sanitized),\n }),\n }));\n },\n retry: (retryQuote) => {\n const { fromBlockchain, fromToken, toBlockchain, toToken, inputAmount } =\n retryQuote;\n\n set({\n fromBlockchain,\n fromToken,\n inputAmount,\n outputAmount: null,\n inputUsdValue: getUsdValue(fromToken ?? null, inputAmount),\n outputUsdValue: new BigNumber(0),\n toBlockchain,\n toToken,\n selectedQuote: null,\n });\n },\n switchFromAndTo: () =>\n set((state) => ({\n fromBlockchain: state.toBlockchain,\n fromToken: state.toToken,\n toBlockchain: state.fromBlockchain,\n toToken: state.fromToken,\n inputAmount: state.outputAmount?.toString() || '',\n inputUsdValue: state.toToken\n ? getUsdValue(state.toToken, state.outputAmount?.toString() || '')\n : new BigNumber(0),\n })),\n resetFromBlockchain: () =>\n set(() => ({\n fromToken: null,\n fromBlockchain: null,\n outputUsdValue: new BigNumber(0),\n inputUsdValue: new BigNumber(0),\n inputAmount: '',\n outputAmount: null,\n selectedQuote: null,\n })),\n resetToBlockchain: () =>\n set(() => ({\n toToken: null,\n toBlockchain: null,\n outputAmount: null,\n outputUsdValue: new BigNumber(0),\n selectedQuote: null,\n })),\n setQuoteWalletConfirmed: (flag) =>\n set({\n quoteWalletsConfirmed: flag,\n }),\n setSelectedWallets: (wallets) => set({ selectedWallets: wallets }),\n setCustomDestination: (address) => set({ customDestination: address }),\n resetQuoteWallets: () =>\n set({\n quoteWalletsConfirmed: false,\n selectedWallets: [],\n customDestination: null,\n }),\n setQuoteWarningsConfirmed: (flag) => set({ quoteWarningsConfirmed: flag }),\n});\n\nconst createSwapQuoteSelectors = create<QuoteState>()(\n subscribeWithSelector(initializer)\n);\nconst createRefuelQuoteSelectors = create<QuoteState>()(\n subscribeWithSelector(initializer)\n);\n\nexport const useSwapQuoteStore = createSelectors(createSwapQuoteSelectors);\nexport const useRefuelQuoteStore = createSelectors(createRefuelQuoteSelectors);\n\nexport function useQuoteStore() {\n const { swapMode } = useSwapMode();\n return createSelectors(\n swapMode === 'refuel'\n ? createRefuelQuoteSelectors\n : createSwapQuoteSelectors\n );\n}\n\nconst subscribeCallback = (\n selectedState: QuoteState,\n previousSelectedState: QuoteState\n) => {\n if (\n selectedState.fromBlockchain !== previousSelectedState.fromBlockchain ||\n selectedState.fromToken !== previousSelectedState.fromToken ||\n selectedState.toBlockchain !== previousSelectedState.toBlockchain ||\n selectedState.toToken !== previousSelectedState.toToken ||\n selectedState.inputAmount !== previousSelectedState.inputAmount\n ) {\n // useEffect hook can not be used in Zustand subscribe\n eventEmitter.emit(WidgetEvents.QuoteEvent, {\n type: QuoteEventTypes.QUOTE_INPUT_UPDATE,\n payload: {\n fromBlockchain: selectedState.fromBlockchain?.name,\n toBlockchain: selectedState.toBlockchain?.name,\n fromToken: selectedState.fromToken\n ? {\n symbol: selectedState.fromToken.symbol,\n name: selectedState.fromToken.name,\n address: selectedState.fromToken.address,\n }\n : undefined,\n toToken: selectedState.toToken\n ? {\n symbol: selectedState.toToken.symbol,\n name: selectedState.toToken.name,\n address: selectedState.toToken.address,\n }\n : undefined,\n requestAmount: selectedState.inputAmount,\n },\n });\n }\n\n if (\n selectedState.selectedQuote?.requestId !==\n previousSelectedState.selectedQuote?.requestId\n ) {\n eventEmitter.emit(WidgetEvents.QuoteEvent, {\n type: QuoteEventTypes.QUOTE_OUTPUT_UPDATE,\n payload: selectedState.selectedQuote\n ? {\n requestAmount: selectedState.selectedQuote.requestAmount,\n swaps: selectedState.selectedQuote.swaps,\n outputAmount: selectedState.selectedQuote.outputAmount,\n resultType: selectedState.selectedQuote.resultType,\n tags: selectedState.selectedQuote.tags,\n }\n : null,\n });\n }\n};\n\nexport const unsubscribeSwapQuoteStore =\n useSwapQuoteStore.subscribe(subscribeCallback);\nexport const unsubscribeRefuelQuoteStore =\n useRefuelQuoteStore.subscribe(subscribeCallback);\n", "import { createContext, useContext } from 'react';\n\ntype SwapModeContextType = {\n swapMode: 'swap' | 'refuel';\n isMultiMode: boolean;\n};\n\nexport const SwapModeContext = createContext<SwapModeContextType>({\n swapMode: 'swap',\n isMultiMode: false,\n});\n\nexport function useSwapMode(): {\n swapMode: 'swap' | 'refuel';\n isMultiMode: boolean;\n} {\n const { swapMode, isMultiMode } = useContext(SwapModeContext);\n\n return { swapMode: swapMode, isMultiMode: isMultiMode };\n}\n", "import type { FetchStatus, FindToken } from '../store/slices/data';\nimport type { ConnectedWallet } from '../store/slices/wallets';\nimport type {\n ConvertedToken,\n QuoteError,\n QuoteWarning,\n RecommendedSlippages,\n SelectedQuote,\n SwapButtonState,\n Wallet,\n} from '../types';\nimport type { ExtendedWalletInfo } from '@rango-dev/wallets-react';\nimport type { WalletType } from '@rango-dev/wallets-shared';\nimport type {\n BestRouteRequest,\n BlockchainMeta,\n RecommendedSlippage,\n SwapFee,\n SwapResult,\n Token,\n} from 'rango-sdk';\nimport type { PendingSwap, PendingSwapStep } from 'rango-types';\n\nimport { i18n } from '@lingui/core';\nimport {\n getRelatedWalletOrNull,\n type RouteEvent,\n RouteEventType,\n type StepEvent,\n} from '@rango-dev/queue-manager-rango-preset';\nimport BigNumber from 'bignumber.js';\nimport { PendingSwapNetworkStatus } from 'rango-types';\n\nimport { errorMessages } from '../constants/errors';\nimport { swapButtonTitles } from '../constants/messages';\nimport { ZERO } from '../constants/numbers';\nimport {\n type FeesGroup,\n HIGH_FEE_THRESHOLD_USD,\n HIGH_VALUE_LOSS_CRITERIA,\n type NameOfFees,\n OUTPUT_CHANGE_WARNING_CRITERIA,\n PERCENT_MULTIPLIER,\n} from '../constants/quote';\nimport {\n BALANCE_MAX_DECIMALS,\n BALANCE_MIN_DECIMALS,\n TOKEN_AMOUNT_MAX_DECIMALS,\n TOKEN_AMOUNT_MIN_DECIMALS,\n} from '../constants/routing';\n\nimport { getBlockchainShortNameFor, isValidTokenAddress } from './meta';\nimport { numberToString } from './numbers';\nimport { getRequiredBalanceOfWallet } from './quote';\nimport { getQuoteChains } from './wallets';\n\nexport function getOutputRatio(\n inputUsdValue: BigNumber | null,\n outputUsdValue: BigNumber | null\n) {\n if (\n !inputUsdValue ||\n !outputUsdValue ||\n inputUsdValue.lte(ZERO) ||\n outputUsdValue.lte(ZERO)\n ) {\n return 0;\n }\n return outputUsdValue\n .div(inputUsdValue)\n .minus(1)\n .multipliedBy(PERCENT_MULTIPLIER)\n .toNumber();\n}\n\nexport function hasHighValueLoss(\n inputUsdValue: BigNumber | null,\n priceImpact: number\n): boolean {\n if (!inputUsdValue) {\n return false;\n }\n\n const formattedPriceImpact = parseInt(priceImpact.toFixed(2) || '0');\n\n return HIGH_VALUE_LOSS_CRITERIA.some(\n ({ threshold, minInput }) =>\n formattedPriceImpact <= threshold &&\n inputUsdValue.gte(new BigNumber(minInput))\n );\n}\n\nexport function hasLimitError(swaps: SwapResult[]): boolean {\n return (\n (swaps || []).filter((swap) => {\n const minimum = !!swap.fromAmountMinValue\n ? new BigNumber(swap.fromAmountMinValue)\n : null;\n const maximum = !!swap.fromAmountMaxValue\n ? new BigNumber(swap.fromAmountMaxValue)\n : null;\n const isExclusive = swap.fromAmountRestrictionType === 'EXCLUSIVE';\n if (isExclusive) {\n return minimum?.gte(swap.fromAmount) || maximum?.lte(swap.fromAmount);\n }\n return minimum?.gt(swap.fromAmount) || maximum?.lt(swap.fromAmount);\n }).length > 0\n );\n}\n\nexport function getLimitErrorMessage(swaps: SwapResult[]): {\n swap?: SwapResult;\n fromAmountRangeError: string;\n recommendation: string;\n} {\n const swap = (swaps || []).filter((swap) => {\n const minimum = !!swap.fromAmountMinValue\n ? new BigNumber(swap.fromAmountMinValue)\n : null;\n const maximum = !!swap.fromAmountMaxValue\n ? new BigNumber(swap.fromAmountMaxValue)\n : null;\n const isExclusive = swap.fromAmountRestrictionType === 'EXCLUSIVE';\n if (isExclusive) {\n return minimum?.gte(swap.fromAmount) || maximum?.lte(swap.fromAmount);\n }\n return minimum?.gt(swap.fromAmount) || maximum?.lt(swap.fromAmount);\n })[0];\n\n if (!swap) {\n return {\n swap: undefined,\n fromAmountRangeError: '',\n recommendation: '',\n };\n }\n const minimum = !!swap.fromAmountMinValue\n ? new BigNumber(swap.fromAmountMinValue)\n : null;\n const maximum = !!swap.fromAmountMaxValue\n ? new BigNumber(swap.fromAmountMaxValue)\n : null;\n const isExclusive = swap.fromAmountRestrictionType === 'EXCLUSIVE';\n\n let fromAmountRangeError = '';\n let recommendation = '';\n if (!isExclusive && !!minimum && minimum.gt(swap.fromAmount)) {\n fromAmountRangeError = i18n.t({\n id: 'Required: >= {min} {symbol}',\n values: {\n min: numberToString(\n minimum,\n TOKEN_AMOUNT_MIN_DECIMALS,\n TOKEN_AMOUNT_MAX_DECIMALS\n ),\n symbol: swap.from.symbol,\n },\n });\n recommendation = errorMessages().bridgeLimitErrors.increaseAmount;\n } else if (isExclusive && !!minimum && minimum.gte(swap.fromAmount)) {\n fromAmountRangeError = i18n.t({\n id: 'Required: > {min} {symbol}',\n values: {\n min: numberToString(\n minimum,\n TOKEN_AMOUNT_MIN_DECIMALS,\n TOKEN_AMOUNT_MAX_DECIMALS\n ),\n symbol: swap.from.symbol,\n },\n });\n recommendation = errorMessages().bridgeLimitErrors.increaseAmount;\n }\n\n if (!isExclusive && !!maximum && maximum.lt(swap.fromAmount)) {\n fromAmountRangeError = i18n.t({\n id: 'Required: <= {max} {symbol}',\n values: {\n max: numberToString(\n maximum,\n TOKEN_AMOUNT_MIN_DECIMALS,\n TOKEN_AMOUNT_MAX_DECIMALS\n ),\n symbol: swap.from.symbol,\n },\n });\n recommendation = errorMessages().bridgeLimitErrors.decreaseAmount;\n } else if (isExclusive && !!maximum && maximum.lte(swap.fromAmount)) {\n fromAmountRangeError = i18n.t({\n id: 'Required: < {max} {symbol}',\n values: {\n max: numberToString(\n maximum,\n TOKEN_AMOUNT_MIN_DECIMALS,\n TOKEN_AMOUNT_MAX_DECIMALS\n ),\n symbol: swap.from.symbol,\n },\n });\n recommendation = errorMessages().bridgeLimitErrors.decreaseAmount;\n }\n\n return { swap, fromAmountRangeError, recommendation };\n}\n\nexport function getSwapButtonState(params: {\n fetchMetaStatus: FetchStatus;\n anyWalletConnected: boolean;\n fetchingQuote: boolean;\n inputAmount: string;\n quote: SelectedQuote | null;\n warning: QuoteWarning | null;\n error: QuoteError | null;\n needsToWarnEthOnPath: boolean;\n}): SwapButtonState {\n const {\n fetchMetaStatus,\n anyWalletConnected,\n fetchingQuote,\n inputAmount,\n quote,\n warning,\n error,\n needsToWarnEthOnPath,\n } = params;\n if (fetchMetaStatus !== 'success') {\n return {\n title: swapButtonTitles().connectWallet,\n action: 'connect-wallet',\n disabled: true,\n };\n }\n if (!anyWalletConnected) {\n return {\n title: swapButtonTitles().connectWallet,\n action: 'connect-wallet',\n disabled: false,\n };\n }\n if (fetchingQuote || !quote || error || !inputAmount || inputAmount === '0') {\n return {\n title: swapButtonTitles().swap,\n action: 'confirm-swap',\n disabled: true,\n };\n } else if (warning) {\n return {\n title: swapButtonTitles().swapAnyway,\n action: 'confirm-warning',\n disabled: false,\n };\n } else if (needsToWarnEthOnPath) {\n return {\n title: swapButtonTitles().ethWarning,\n action: 'confirm-warning',\n disabled: false,\n };\n }\n return {\n title: swapButtonTitles().swap,\n action: 'confirm-swap',\n disabled: false,\n };\n}\n\nexport function canComputePriceImpact(\n quote: SelectedQuote | null,\n inputAmount: string,\n usdValue: BigNumber | null\n) {\n const inputAmountNumber = parseFloat(inputAmount || '0');\n\n return !(\n quote &&\n (!usdValue || usdValue.lte(ZERO)) &&\n inputAmount &&\n inputAmount !== '0' &&\n inputAmountNumber !== 0\n );\n}\n\nexport function getUsdFeeOfStep(\n step: SwapResult,\n findToken: FindToken\n): BigNumber {\n let totalFeeInUsd = ZERO;\n for (let i = 0; i < step.fee.length; i++) {\n const fee = step.fee[i];\n if (!fee || fee.expenseType === 'DECREASE_FROM_OUTPUT') {\n continue;\n }\n\n const unitPrice = findToken(fee.asset)?.usdPrice || null;\n totalFeeInUsd = totalFeeInUsd.plus(\n new BigNumber(fee.amount).multipliedBy(unitPrice || 0)\n );\n }\n\n return totalFeeInUsd;\n}\n\nexport function getTotalFeeInUsd(\n swaps: SwapResult[],\n findToken: FindToken\n): BigNumber {\n return swaps.reduce(\n (totalFee: BigNumber, step) =>\n totalFee.plus(getUsdFeeOfStep(step, findToken)),\n ZERO\n );\n}\n\nexport function getUsdFee(fee: SwapFee): BigNumber {\n let totalFeeInUsd = ZERO;\n const price = new BigNumber(fee.price || 0);\n totalFeeInUsd = totalFeeInUsd.plus(\n new BigNumber(fee.amount).multipliedBy(price)\n );\n\n return totalFeeInUsd;\n}\n\nexport function getTotalFeesInUsd(fees: SwapFee[]): BigNumber {\n return fees.reduce(\n (totalFee: BigNumber, fee) => totalFee.plus(getUsdFee(fee)),\n ZERO\n );\n}\nexport function getFeesGroup(swaps: SwapResult[]): FeesGroup {\n return swaps.reduce(\n (result, swap) => {\n for (const fee of swap.fee) {\n const name = fee.name as NameOfFees;\n const feeGroup =\n fee.expenseType !== 'DECREASE_FROM_OUTPUT'\n ? result.payable\n : result.nonePayable;\n\n feeGroup[name] = [...(feeGroup[name] || []), fee];\n }\n return result;\n },\n { payable: {}, nonePayable: {} } as FeesGroup\n );\n}\n\nexport function hasHighFee(totalFeeInUsd: BigNumber | null) {\n if (!totalFeeInUsd) {\n return false;\n }\n return !totalFeeInUsd.lt(new BigNumber(HIGH_FEE_THRESHOLD_USD));\n}\n\nexport function hasSlippageError(\n slippages: (RecommendedSlippage | null)[] | undefined\n) {\n return (slippages?.filter((s) => !!s?.error)?.length || 0) > 0;\n}\n\nexport function checkSlippageErrors(\n swaps: SwapResult[]\n): RecommendedSlippages | null {\n const recommendedSlippages = new Map<number, string>();\n swaps.forEach((swap, index) => {\n if (swap.recommendedSlippage?.error) {\n recommendedSlippages.set(index, swap.recommendedSlippage.slippage);\n }\n });\n if (recommendedSlippages.size > 0) {\n return Object.fromEntries(recommendedSlippages);\n }\n return null;\n}\n\nexport function checkSlippageWarnings(\n quote: SelectedQuote,\n userSlippage: number\n): RecommendedSlippages | null {\n const recommendedSlippages = new Map<number, string>();\n quote?.swaps.forEach((swap, index) => {\n if (\n swap.recommendedSlippage?.slippage &&\n parseFloat(swap.recommendedSlippage.slippage) > userSlippage\n ) {\n recommendedSlippages.set(index, swap.recommendedSlippage.slippage);\n }\n });\n if (recommendedSlippages.size > 0) {\n return Object.fromEntries(recommendedSlippages);\n }\n return null;\n}\n\nexport function getMinRequiredSlippage(swaps: SwapResult[]): string | null {\n const slippages = swaps.map((slippage) => slippage.recommendedSlippage);\n return (\n slippages\n ?.map((s) => s?.slippage || '0')\n ?.filter((s) => parseFloat(s) > 0)\n ?.sort((a, b) => parseFloat(b) - parseFloat(a))\n ?.find(() => true) || null\n );\n}\n\nexport function hasProperSlippage(\n userSlippage: string,\n minRequiredSlippage: string | null\n) {\n if (!minRequiredSlippage) {\n return true;\n }\n return parseFloat(userSlippage) >= parseFloat(minRequiredSlippage);\n}\n\nexport function hasEnoughBalance(\n quote: SelectedQuote,\n selectedWallets: Wallet[]\n) {\n const fee = quote.validationStatus;\n\n if (fee === null || fee.length === 0) {\n return true;\n }\n\n for (const wallet of selectedWallets) {\n const requiredAssets = getRequiredBalanceOfWallet(wallet, fee);\n if (!requiredAssets) {\n continue;\n }\n\n const enoughBalanceInWallet = requiredAssets\n .map((asset) => asset.ok)\n .reduce((previous, current) => previous && current);\n if (!enoughBalanceInWallet) {\n return false;\n }\n }\n\n return true;\n}\n\nexport function hasEnoughBalanceAndProperSlippage(\n quote: SelectedQuote,\n selectedWallets: Wallet[],\n userSlippage: string,\n minRequiredSlippage: string | null\n): boolean {\n return (\n hasEnoughBalance(quote, selectedWallets) &&\n hasProperSlippage(userSlippage, minRequiredSlippage)\n );\n}\n\nexport function createQuoteRequestBody(params: {\n fromToken: Token;\n toToken: Token;\n inputAmount: string;\n wallets?: ConnectedWallet[];\n selectedWallets?: Wallet[];\n liquiditySources?: string[];\n excludeLiquiditySources?: boolean;\n disabledLiquiditySources: string[];\n slippage: number;\n affiliateRef: string | null;\n affiliatePercent: number | null;\n affiliateWallets: { [key: string]: string } | null;\n destination?: string;\n contractCall: boolean;\n}): BestRouteRequest {\n const {\n fromToken,\n toToken,\n inputAmount,\n wallets,\n selectedWallets,\n disabledLiquiditySources,\n liquiditySources,\n excludeLiquiditySources,\n slippage,\n affiliateRef,\n affiliatePercent,\n affiliateWallets,\n destination,\n contractCall,\n } = params;\n const selectedWalletsMap = selectedWallets?.reduce(\n (\n selectedWalletsMap: BestRouteRequest['selectedWallets'],\n selectedWallet\n ) => (\n (selectedWalletsMap[selectedWallet.chain] = selectedWallet.address),\n selectedWalletsMap\n ),\n {}\n );\n\n const connectedWallets: BestRouteRequest['connectedWallets'] = [];\n\n wallets?.forEach((wallet) => {\n connectedWallets.push({\n blockchain: wallet.chain,\n addresses: [wallet.address],\n });\n });\n\n const requestBody: BestRouteRequest = {\n amount: inputAmount.toString(),\n affiliateRef: affiliateRef ?? undefined,\n affiliatePercent: affiliatePercent ?? undefined,\n affiliateWallets: affiliateWallets ?? undefined,\n from: {\n address: fromToken.address,\n blockchain: fromToken.blockchain,\n symbol: fromToken.symbol,\n },\n to: {\n address: toToken.address,\n blockchain: toToken.blockchain,\n symbol: toToken.symbol,\n },\n connectedWallets,\n selectedWallets: selectedWalletsMap ?? {},\n slippage: slippage.toString(),\n contractCall,\n ...(destination && { destination: destination }),\n ...(excludeLiquiditySources && {\n swapperGroups: disabledLiquiditySources.concat(liquiditySources ?? []),\n swappersGroupsExclude: true,\n }),\n ...(!excludeLiquiditySources && {\n swapperGroups: liquiditySources?.filter(\n (liquiditySource) => !disabledLiquiditySources.includes(liquiditySource)\n ),\n swappersGroupsExclude: false,\n }),\n };\n return requestBody;\n}\n\nexport function getWalletsForNewSwap(selectedWallets: Wallet[]) {\n const wallets = selectedWallets.reduce(\n (\n selectedWalletsMap: {\n [p: string]: {\n address: string;\n walletType: WalletType;\n derivationPath?: string;\n };\n },\n selectedWallet\n ) => (\n (selectedWalletsMap[selectedWallet.chain] = {\n address: selectedWallet.address,\n walletType: selectedWallet.walletType,\n derivationPath: selectedWallet.derivationPath,\n }),\n selectedWalletsMap\n ),\n {}\n );\n\n return wallets;\n}\n\nexport function getUsdInputFrom(quote: SelectedQuote): BigNumber | undefined {\n const inputAmount = quote.requestAmount;\n const inputTokenUsdPrice = quote.swaps[0]?.from.usdPrice;\n if (!inputAmount || !inputTokenUsdPrice) {\n return;\n }\n return new BigNumber(inputAmount).multipliedBy(inputTokenUsdPrice);\n}\n\nexport function getUsdOutputFrom(quote: SelectedQuote): BigNumber | undefined {\n const outputAmount = quote?.outputAmount || null;\n const outputTokenUsdPrice = quote.swaps[quote.swaps.length - 1]?.to.usdPrice;\n if (!outputAmount || !outputTokenUsdPrice) {\n return;\n }\n return new BigNumber(outputAmount).multipliedBy(outputTokenUsdPrice);\n}\n\nexport function getPercentageChange(input: string, output: string) {\n return new BigNumber(output)\n .div(new BigNumber(input))\n .minus(1)\n .multipliedBy(PERCENT_MULTIPLIER)\n .toNumber();\n}\n\nexport function isOutputAmountChangedExcessively(\n previousQuote: SelectedQuote,\n currentQuote: SelectedQuote\n) {\n const usdInput = getUsdInputFrom(previousQuote);\n const previousUsdOutput = getUsdOutputFrom(previousQuote);\n const currentUsdOutput = getUsdOutputFrom(currentQuote);\n if (!usdInput || !previousUsdOutput || !currentUsdOutput) {\n return false;\n }\n\n const percentageChange = getPercentageChange(\n previousUsdOutput.toString(),\n currentUsdOutput.toString()\n );\n\n return OUTPUT_CHANGE_WARNING_CRITERIA.some(\n ({ threshold, minInput }) =>\n percentageChange <= threshold && usdInput.isGreaterThanOrEqualTo(minInput)\n );\n}\n\nexport function generateBalanceWarnings(\n quote: SelectedQuote,\n selectedWallets: Wallet[],\n blockchains: BlockchainMeta[]\n) {\n const fee = quote.validationStatus;\n const requiredWallets = getQuoteChains({ filter: 'required', quote });\n const walletsSortedByRequiredWallets = selectedWallets.sort(\n (selectedWallet1, selectedWallet2) =>\n requiredWallets.indexOf(selectedWallet1.chain) -\n requiredWallets.indexOf(selectedWallet2.chain)\n );\n\n return walletsSortedByRequiredWallets\n .flatMap((wallet) => getRequiredBalanceOfWallet(wallet, fee) || [])\n .filter((asset) => !asset.ok)\n .map((asset) => {\n const symbol = asset.asset.symbol;\n const currentAmount = numberToString(\n new BigNumber(asset.currentAmount.amount).shiftedBy(\n -asset.currentAmount.decimals\n ),\n BALANCE_MIN_DECIMALS,\n BALANCE_MAX_DECIMALS\n );\n const requiredAmount = numberToString(\n new BigNumber(asset.requiredAmount.amount).shiftedBy(\n -asset.requiredAmount.decimals\n ),\n BALANCE_MIN_DECIMALS,\n BALANCE_MAX_DECIMALS\n );\n let reason = '';\n if (asset.reason === 'FEE') {\n reason = i18n.t(' for network fee');\n }\n if (asset.reason === 'INPUT_ASSET') {\n reason = i18n.t(' for swap');\n }\n if (asset.reason === 'FEE_AND_INPUT_ASSET') {\n reason = i18n.t(' for input and network fee');\n }\n const warningMessage = i18n.t({\n id: `Needs \u2248 {requiredAmount} {symbol}{reason}, but you have {currentAmount} {symbol} in your {blockchain} wallet.`,\n values: {\n requiredAmount,\n symbol,\n reason,\n currentAmount,\n blockchain: getBlockchainShortNameFor(\n asset.asset.blockchain,\n blockchains\n ),\n },\n });\n return warningMessage;\n });\n}\n\nexport function isNetworkStatusInWarningState(\n pendingSwapStep: PendingSwapStep | null\n): boolean {\n return (\n !!pendingSwapStep &&\n pendingSwapStep.networkStatus !== null &&\n pendingSwapStep.networkStatus !== PendingSwapNetworkStatus.NetworkChanged\n );\n}\n\nexport function getSwapMessages(\n pendingSwap: PendingSwap,\n currentStep: PendingSwapStep | null,\n getWalletInfo?: (type: WalletType) => ExtendedWalletInfo\n): {\n shortMessage: string;\n detailedMessage: { content: string; long: boolean };\n} {\n const textForRemove = 'bellow button or';\n let message = pendingSwap.extraMessage;\n let detailedMessage = pendingSwap.extraMessageDetail;\n\n if (pendingSwap.networkStatusExtraMessageDetail?.includes(textForRemove)) {\n pendingSwap.networkStatusExtraMessageDetail =\n pendingSwap.networkStatusExtraMessageDetail.replace(textForRemove, '');\n }\n\n const networkWarningState = isNetworkStatusInWarningState(currentStep);\n\n if (networkWarningState) {\n message = pendingSwap.networkStatusExtraMessage || '';\n detailedMessage = pendingSwap.networkStatusExtraMessageDetail || '';\n\n const currentStepWallet = currentStep\n ? getRelatedWalletOrNull(pendingSwap, currentStep)\n : null;\n const walletType = currentStepWallet?.walletType;\n const walletName = walletType ? getWalletInfo?.(walletType)?.name : null;\n // eslint-disable-next-line @typescript-eslint/switch-exhaustiveness-check\n switch (currentStep?.networkStatus) {\n case PendingSwapNetworkStatus.WaitingForConnectingWallet:\n message = walletName\n ? i18n.t('Connect {wallet}', {\n wallet: walletName,\n })\n : message;\n break;\n case PendingSwapNetworkStatus.WaitingForQueue:\n message =\n message || i18n.t('Waiting for other running tasks to be finished');\n break;\n case PendingSwapNetworkStatus.WaitingForNetworkChange:\n message = message || i18n.t('Waiting for changing wallet network');\n break;\n case PendingSwapNetworkStatus.NetworkChangeFailed:\n message =\n message ||\n i18n.t(\n 'The network switch could not be completed. Please try again, or switch the network manually in your wallet.'\n );\n break;\n default:\n message = message || '';\n break;\n }\n }\n detailedMessage = detailedMessage || '';\n message = message || '';\n const isRpc =\n message?.indexOf('code') !== -1 && message?.indexOf('reason') !== -1;\n\n return {\n shortMessage: message,\n detailedMessage: { content: detailedMessage, long: isRpc },\n };\n}\n\nexport function getLastConvertedTokenInFailedSwap(\n pendingSwap: PendingSwap\n): ConvertedToken {\n let resultToken: ConvertedToken = null;\n if (pendingSwap.status === 'failed') {\n const lastSuccessStep = pendingSwap.steps\n .slice()\n .reverse()\n .filter((step) => step.status === 'success')[0];\n\n if (lastSuccessStep) {\n resultToken = {\n blockchain: lastSuccessStep.toBlockchain,\n symbol: lastSuccessStep.toSymbol,\n outputAmount: lastSuccessStep.outputAmount,\n address: lastSuccessStep.toSymbolAddress,\n };\n }\n }\n return resultToken;\n}\n\nexport function shouldRetrySwap(pendingSwap: PendingSwap) {\n return pendingSwap.status === 'failed';\n}\n\nexport function isConfirmSwapDisabled(\n fetching: boolean,\n isCustomDestinationOpen: boolean,\n customDestination: string | null,\n quote: SelectedQuote | null,\n selectedWallets: { walletType: string; chain: string }[],\n lastStepToBlockchain: BlockchainMeta | undefined\n): boolean {\n if (!quote || fetching) {\n return true;\n }\n\n const allChains = getQuoteChains({ filter: 'all', quote });\n\n const requiredChains = getQuoteChains({ filter: 'required', quote });\n\n const everyWalletSelected = allChains.every((chain) =>\n selectedWallets.some((selectedWallet) => selectedWallet.chain === chain)\n );\n\n const everyRequiredWalletSelected = requiredChains.every((chain) =>\n selectedWallets.some((selectedWallet) => selectedWallet.chain === chain)\n );\n\n const customDestinationIsValid =\n customDestination && lastStepToBlockchain\n ? isValidTokenAddress(lastStepToBlockchain, customDestination)\n : false;\n\n return (\n (!isCustomDestinationOpen && !everyWalletSelected) ||\n (isCustomDestinationOpen && !customDestination) ||\n (isCustomDestinationOpen &&\n !!customDestination &&\n (!customDestinationIsValid || !everyRequiredWalletSelected))\n );\n}\n\nexport function isTokensIdentical(tokenA: Token, tokenB: Token) {\n return (\n tokenA.blockchain === tokenB.blockchain &&\n tokenA.symbol === tokenB.symbol &&\n tokenA.address === tokenB.address\n );\n}\n\nexport function isSwapFinished(event: RouteEvent | StepEvent) {\n return (\n event.type === RouteEventType.FAILED ||\n event.type === RouteEventType.SUCCEEDED\n );\n}\n", "import type { QuoteError } from '../types';\n\nimport { i18n } from '@lingui/core';\n\nimport { QuoteErrorType } from '../types';\n\nexport const errorMessages = () => {\n return {\n genericServerError: i18n.t('Failed Network, Please retry your swap.'),\n liquiditySourcesError: {\n title: i18n.t('Please reset your liquidity sources.'),\n description: i18n.t(\n 'You have limited the liquidity sources and this might result in Rango finding no routes. Please consider resetting your liquidity sources.'\n ),\n },\n noResultError: {\n title: i18n.t('No Routes Found.'),\n description: i18n.t(\n \"Reasons why Rango couldn't find a route: low liquidity on token, very low input amount or no routes available for the selected input/output token combination.\"\n ),\n },\n bridgeLimitErrors: {\n increaseAmount: i18n.t(\n 'Bridge Limit Error: Please increase your amount.'\n ),\n decreaseAmount: i18n.t(\n 'Bridge Limit Error: Please decrease your amount.'\n ),\n },\n highValueLossError: {\n impactTitle: i18n.t('High Price Impact'),\n title: i18n.t('Price impact is too high!'),\n description: i18n.t(\n 'The price impact is significantly higher than the allowed amount.'\n ),\n confirmMessage: i18n.t('Confirm high price impact'),\n },\n quoteUpdatedWithHighValueLoss: {\n title: i18n.t(\n 'Route updated and price impact is too high, try again later!'\n ),\n },\n unknownPriceError: {\n impactTitle: i18n.t('USD Price Unknown'),\n title: i18n.t('USD Price Unknown, Cannot calculate Price Impact.'),\n description: i18n.t(\n 'USD Price Unknown, Cannot calculate Price Impact. The price impact may be higher than usual. Are you sure to continue the Swap?'\n ),\n confirmMessage: i18n.t('Confirm USD Price Unknown'),\n },\n };\n};\n\nexport function getQuoteErrorMessage(error: QuoteError) {\n if (error.type === QuoteErrorType.NO_RESULT) {\n return error.diagnosisMessage ?? errorMessages().noResultError.title;\n } else if (error.type === QuoteErrorType.REQUEST_FAILED) {\n return error.diagnosisMessage ?? errorMessages().genericServerError;\n }\n\n return '';\n}\n", "import { i18n } from '@lingui/core';\n\nexport const swapButtonTitles = () => {\n return {\n connectWallet: i18n.t('Connect Wallet'),\n swap: i18n.t('Swap'),\n swapAnyway: i18n.t('Swap anyway'),\n ethWarning: i18n.t('The route goes through Ethereum. Continue?'),\n };\n};\n", "import type { I18n } from '@lingui/core';\nimport type { SwapFee, TagValue } from 'rango-sdk';\n\nexport type NameOfFees =\n | 'Swapper Fee'\n | 'Affiliate Fee'\n | 'Outbound network fee'\n | 'Rango Fee'\n | 'Network Fee';\n\nexport function getFeeLabel(fee: NameOfFees, t: I18n['t']): string {\n const data: Record<NameOfFees, string> = {\n 'Network Fee': t('Network Fee'),\n 'Swapper Fee': t('Protocol Fee'),\n 'Affiliate Fee': t('Affiliate Fee'),\n 'Outbound network fee': t('Outbound Fee'),\n 'Rango Fee': t('Rango Fee'),\n };\n return data[fee];\n}\n\nexport type FeesGroup = {\n payable: { [key in NameOfFees]?: SwapFee[] };\n nonePayable: { [key in NameOfFees]?: SwapFee[] };\n};\n\nexport const HIGH_PRIORITY_TAGS: TagValue[] = [\n 'RECOMMENDED',\n 'CENTRALIZED',\n 'LOWEST_FEE',\n 'FASTEST',\n 'HIGH_IMPACT',\n];\n\nexport type Criteria = {\n threshold: number;\n minInput: number;\n};\n\nexport const PERCENT_MULTIPLIER = 100;\nexport const GAS_FEE_MAX = 30;\nexport const ROUTE_TIME_MAX = 15;\nexport const SECONDS_IN_MINUTE = 60;\nexport const HIGH_FEE_THRESHOLD_USD = 30;\n\nexport const HIGH_VALUE_LOSS_CRITERIA: Criteria[] = [\n { threshold: -10, minInput: 400 },\n { threshold: -5, minInput: 1000 },\n];\n\nexport const OUTPUT_CHANGE_WARNING_CRITERIA: Criteria[] = [\n {\n threshold: -1,\n minInput: 1000,\n },\n {\n threshold: -2,\n minInput: 500,\n },\n];\n", "/* eslint-disable @typescript-eslint/no-magic-numbers */\nimport type { RetryQuote } from '../store/quote';\nimport type { FindToken } from '../store/slices/data';\nimport type { QuoteWarning, SelectedQuote, Wallet } from '../types';\nimport type {\n PriceImpactWarningLevel,\n SimulationAssetAndAmount,\n SimulationValidationStatus,\n Step,\n} from '@rango-dev/ui';\nimport type {\n Asset,\n BlockchainMeta,\n MultiRouteResponse,\n MultiRouteSimulationResult,\n PreferenceType,\n RouteTag,\n} from 'rango-sdk';\nimport type { PendingSwap } from 'rango-types';\n\nimport { getLastSuccessfulStep } from '@rango-dev/queue-manager-rango-preset';\nimport BigNumber from 'bignumber.js';\n\nimport { HIGH_PRIORITY_TAGS } from '../constants/quote';\nimport { HIGHT_PRICE_IMPACT, LOW_PRICE_IMPACT } from '../constants/routing';\nimport { HIGH_SLIPPAGE } from '../constants/swapSettings';\nimport { QuoteWarningType } from '../types';\n\nimport { areEqual } from './common';\nimport { createTokenHash, findBlockchain } from './meta';\nimport { numberToString } from './numbers';\nimport {\n checkSlippageWarnings,\n getMinRequiredSlippage,\n getPercentageChange,\n getTotalFeeInUsd,\n getUsdInputFrom,\n getUsdOutputFrom,\n hasHighValueLoss,\n hasProperSlippage,\n isOutputAmountChangedExcessively,\n} from './swap';\n\nexport function isNumberOfSwapsChanged(\n quoteA: SelectedQuote,\n quoteB: SelectedQuote\n) {\n const quoteASwaps = quoteA?.swaps || [];\n const quoteBSwaps = quoteB?.swaps || [];\n return quoteASwaps.length !== quoteBSwaps.length;\n}\n\nexport function isQuoteSwappersUpdated(\n quoteA: SelectedQuote,\n quoteB: SelectedQuote\n) {\n const quoteASwappers = quoteA?.swaps.map((swap) => swap.swapperId) || [];\n const quoteBSwappers = quoteB?.swaps.map((swap) => swap.swapperId) || [];\n return !areEqual(quoteASwappers, quoteBSwappers);\n}\n\nexport function isQuoteInternalCoinsUpdated(\n quoteA: SelectedQuote,\n quoteB: SelectedQuote\n) {\n const quoteAInternalCoins = quoteA?.swaps.map((swap) => swap.to.symbol) || [];\n const quoteBInternalCoins = quoteB?.swaps.map((swap) => swap.to.symbol) || [];\n return !areEqual(quoteAInternalCoins, quoteBInternalCoins);\n}\n\nexport function isQuoteChanged(\n quoteA: SelectedQuote,\n quoteB: SelectedQuote\n): boolean {\n return (\n isNumberOfSwapsChanged(quoteA, quoteB) ||\n isQuoteSwappersUpdated(quoteA, quoteB) ||\n isQuoteInternalCoinsUpdated(quoteA, quoteB)\n );\n}\n\nexport function outToRatioHasWarning(\n fromUsdValue: BigNumber | null,\n outToInRatio: BigNumber | 0\n) {\n return (\n (parseInt(outToInRatio?.toFixed(2) || '0') <= -10 &&\n (fromUsdValue === null || fromUsdValue.gte(new BigNumber(200)))) ||\n (parseInt(outToInRatio?.toFixed(2) || '0') <= -5 &&\n (fromUsdValue === null || fromUsdValue.gte(new BigNumber(1000))))\n );\n}\n\nexport function getRequiredBalanceOfWallet(\n selectedWallet: Wallet,\n fee: SimulationValidationStatus[] | null\n): SimulationAssetAndAmount[] | null {\n if (fee === null) {\n return null;\n }\n const relatedFeeStatus = fee\n ?.find((item) => item.blockchain === selectedWallet.chain)\n ?.wallets.find(\n (wallet) =>\n wallet.address?.toLowerCase() === selectedWallet.address.toLowerCase()\n );\n if (!relatedFeeStatus) {\n return null;\n }\n return relatedFeeStatus.requiredAssets;\n}\n\nexport function getPriceImpactLevel(\n priceImpact: number\n): PriceImpactWarningLevel {\n let warningLevel: PriceImpactWarningLevel = undefined;\n if (priceImpact <= LOW_PRICE_IMPACT && priceImpact > HIGHT_PRICE_IMPACT) {\n warningLevel = 'low';\n } else if (priceImpact <= HIGHT_PRICE_IMPACT) {\n warningLevel = 'high';\n }\n\n return warningLevel;\n}\n\nexport function findCommonTokens<T extends Asset[], R extends Asset[]>(\n listA: T,\n listB: R\n) {\n const set = new Set();\n\n listA.forEach((token) => set.add(createTokenHash(token)));\n\n return listB.filter((token) => set.has(createTokenHash(token))) as R;\n}\n\nexport function createRetryQuote(\n pendingSwap: PendingSwap,\n blockchains: BlockchainMeta[],\n findToken: FindToken\n): RetryQuote {\n const firstStep = pendingSwap.steps[0];\n const lastStep = pendingSwap.steps[pendingSwap.steps.length - 1];\n const lastSuccessfulStep = getLastSuccessfulStep(pendingSwap.steps);\n\n if (!lastStep || !firstStep) {\n return {\n fromBlockchain: null,\n fromToken: undefined,\n toBlockchain: null,\n toToken: undefined,\n inputAmount: '',\n };\n }\n\n const toToken = {\n blockchain: lastStep.toBlockchain,\n symbol: lastStep.toSymbol,\n address: lastStep.toSymbolAddress,\n };\n\n const fromBlockchainMeta = findBlockchain(\n lastSuccessfulStep\n ? lastSuccessfulStep.toBlockchain\n : firstStep.fromBlockchain,\n blockchains\n );\n const toBlockchainMeta = findBlockchain(lastStep.toBlockchain, blockchains);\n const fromTokenMeta = findToken(\n lastSuccessfulStep\n ? {\n blockchain: fromBlockchainMeta?.name ?? '',\n symbol: lastSuccessfulStep.toSymbol,\n address: lastSuccessfulStep.toSymbolAddress,\n }\n : {\n blockchain: fromBlockchainMeta?.name ?? '',\n symbol: firstStep.fromSymbol,\n address: firstStep.fromSymbolAddress,\n }\n );\n const toTokenMeta = findToken(toToken);\n const inputAmount = lastSuccessfulStep\n ? lastSuccessfulStep.outputAmount ?? ''\n : pendingSwap.inputAmount;\n\n return {\n fromBlockchain: fromBlockchainMeta,\n fromToken: fromTokenMeta,\n toBlockchain: toBlockchainMeta,\n toToken: toTokenMeta,\n inputAmount,\n };\n}\n\nexport function generateQuoteWarnings(params: {\n previousQuote?: SelectedQuote;\n currentQuote: SelectedQuote;\n findToken: FindToken;\n userSlippage: number;\n}): QuoteWarning | null {\n const { previousQuote, currentQuote, findToken, userSlippage } = params;\n const usdInput = getUsdInputFrom(currentQuote);\n const usdOutput = getUsdOutputFrom(currentQuote);\n\n if (!!currentQuote && usdInput && usdOutput) {\n const priceImpact = getPriceImpact(\n usdInput.toString(),\n usdOutput.toString()\n );\n const highValueLoss =\n !!priceImpact && hasHighValueLoss(usdInput, priceImpact);\n\n if (highValueLoss) {\n const totalFee = getTotalFeeInUsd(currentQuote?.swaps, findToken);\n const warningLevel = getPriceImpactLevel(priceImpact);\n return {\n type: QuoteWarningType.HIGH_VALUE_LOSS,\n inputUsdValue: usdInput,\n outputUsdValue: usdOutput,\n priceImpact,\n totalFee,\n warningLevel,\n };\n }\n }\n\n if (\n previousQuote &&\n isOutputAmountChangedExcessively(previousQuote, currentQuote)\n ) {\n return {\n type: QuoteWarningType.EXCESSIVE_OUTPUT_AMOUNT_CHANGE,\n usdValueChange: numberToString(\n getUsdOutputFrom(currentQuote)\n ?.minus(getUsdOutputFrom(previousQuote) ?? 0)\n .toString() ?? '0',\n null,\n 2\n ),\n percentageChange: numberToString(\n getPriceImpact(\n getUsdOutputFrom(previousQuote) ?? '1',\n getUsdOutputFrom(currentQuote) ?? '1'\n ),\n null,\n 2\n ),\n };\n }\n\n if (currentQuote && (!usdInput || !usdOutput)) {\n return { type: QuoteWarningType.UNKNOWN_PRICE };\n }\n\n const minRequiredSlippage = getMinRequiredSlippage(currentQuote.swaps);\n const highSlippage = userSlippage > HIGH_SLIPPAGE;\n\n if (!hasProperSlippage(params.userSlippage.toString(), minRequiredSlippage)) {\n return {\n type: QuoteWarningType.INSUFFICIENT_SLIPPAGE,\n recommendedSlippages: checkSlippageWarnings(currentQuote, userSlippage),\n minRequiredSlippage: minRequiredSlippage,\n };\n } else if (\n highSlippage &&\n parseFloat(minRequiredSlippage ?? '0') < userSlippage\n ) {\n return {\n type: QuoteWarningType.HIGH_SLIPPAGE,\n slippage: userSlippage.toString(),\n };\n }\n\n return null;\n}\n\nexport function isQuoteWarningConfirmationRequired(warning: QuoteWarning) {\n const WARNINGS_NOT_REQUIRING_CONFIRMATION = [\n QuoteWarningType.EXCESSIVE_OUTPUT_AMOUNT_CHANGE,\n ];\n return !WARNINGS_NOT_REQUIRING_CONFIRMATION.includes(warning.type);\n}\n\nexport function getPriceImpact(\n inputUsdValue: BigNumber | string | null,\n outputUsdValue: BigNumber | string | null\n): number | null {\n const outputUsdValueIsInvalid =\n typeof outputUsdValue === 'string'\n ? parseFloat(outputUsdValue) <= 0\n : !outputUsdValue?.gt(0);\n const percentageChange =\n !inputUsdValue || !outputUsdValue || outputUsdValueIsInvalid\n ? null\n : getPercentageChange(\n inputUsdValue.toString(),\n outputUsdValue.toString()\n );\n\n return percentageChange && percentageChange < 0 ? percentageChange : null;\n}\n\nexport const getUniqueBlockchains = (steps: Step[]) => {\n const set = new Set();\n const result: { displayName: string; image?: string }[] = [];\n steps.forEach((step) => {\n if (!set.has(step.from.chain.displayName)) {\n set.add(step.from.chain.displayName);\n result.push(step.from.chain);\n }\n if (!set.has(step.to.chain.displayName)) {\n set.add(step.to.chain.displayName);\n result.push(step.to.chain);\n }\n });\n\n return result;\n};\n\nexport const sortQuotesBy = (\n strategy: PreferenceType,\n quotes: MultiRouteResponse['results']\n): MultiRouteResponse['results'] => {\n return quotes.sort((quote1, quote2) => {\n const getScore = (route: MultiRouteSimulationResult) =>\n route.scores?.find((score) => score.preferenceType === strategy)?.score ??\n 0;\n\n const quote1Score = getScore(quote1);\n const quote2Score = getScore(quote2);\n\n if (quote1Score !== quote2Score) {\n return quote2Score - quote1Score;\n }\n\n const lowerQuoteId1 = quote1.requestId.toLowerCase();\n const lowerQuoteId2 = quote2.requestId.toLowerCase();\n\n return lowerQuoteId1.localeCompare(lowerQuoteId2);\n });\n};\n\nexport const getDefaultQuote = (\n currentQuote: SelectedQuote | null,\n quotes: MultiRouteSimulationResult[],\n requestAmount: string\n): SelectedQuote | null => {\n const quote = quotes[0]; // Return the first quote from the quotes array\n if (!quotes.length || !quote) {\n return null;\n }\n if (!currentQuote) {\n // Handle the case where currentQuote is null\n return {\n requestAmount,\n validationStatus: null,\n ...quote,\n };\n }\n // Create a set of swapperIds from the currentQuote swaps\n const currentQuoteSwapperIds = new Set(\n currentQuote.swaps.map((swap) => swap.swapperId)\n );\n\n // Find a quote that matches the currentQuote's swapperIds\n const matchedQuote = quotes.find((quote) => {\n // Create a set of swapperIds from the quote swaps\n const quoteSwapperIds = new Set(quote.swaps.map((swap) => swap.swapperId));\n\n // Check if all swapperIds from the currentQuote are present in the quoteSwapperIds\n return Array.from(currentQuoteSwapperIds).every((swapperId) =>\n quoteSwapperIds.has(swapperId)\n );\n });\n\n // Return the matchedQuote if found, otherwise return the first quote from the quotes array\n return {\n requestAmount,\n validationStatus: null,\n ...(matchedQuote || quote),\n };\n};\n\nexport const sortTags = (tags: RouteTag[]): RouteTag[] => {\n const customSort = (a: RouteTag, b: RouteTag) => {\n const indexA = HIGH_PRIORITY_TAGS.indexOf(a.value);\n const indexB = HIGH_PRIORITY_TAGS.indexOf(b.value);\n\n if (indexA !== -1 && indexB !== -1) {\n return indexA - indexB;\n }\n\n if (indexA !== -1) {\n return -1;\n } else if (indexB !== -1) {\n return 1;\n }\n\n return 0;\n };\n\n return tags.sort(customSort);\n};\n", "import { useEffect, useRef } from 'react';\nimport {\n useInRouterContext,\n useLocation,\n useSearchParams,\n} from 'react-router-dom';\n\nimport { SearchParams } from '../../constants/searchParams';\nimport { useAppStore } from '../../store/AppStore';\nimport { useQuoteStore } from '../../store/quote';\n\nimport {\n convertTokenSearchParamToAsset,\n tokenToSearchParam,\n} from './useSyncUrlAndStore.helpers';\n\nexport function useSyncUrlAndStore() {\n const location = useLocation();\n const [searchParams, setSearchParams] = useSearchParams();\n const {\n fromBlockchain,\n toBlockchain,\n fromToken,\n toToken,\n inputAmount,\n setFromBlockchain,\n setToBlockchain,\n setFromToken,\n setToToken,\n setInputAmount,\n } = useQuoteStore()();\n const fetchMetaStatus = useAppStore().fetchStatus;\n const blockchains = useAppStore().blockchains();\n const isInRouterContext = useInRouterContext();\n const { updateIframe, updateCampaignMode } = useAppStore();\n const campaignMode = useAppStore().isInCampaignMode();\n const liquiditySourcesParamsRef = useRef<string>();\n const { findToken } = useAppStore();\n const getUrlSearchParams = () => {\n const utmQueryParams: Record<string, string> = {};\n\n for (const [key, value] of searchParams.entries()) {\n if (key.startsWith('utm_')) {\n utmQueryParams[key] = value;\n }\n }\n const fromAmount = searchParams.get(SearchParams.FROM_AMOUNT);\n const fromBlockchain = searchParams.get(SearchParams.FROM_BLOCKCHAIN);\n const fromToken = searchParams.get(SearchParams.FROM_TOKEN);\n const toBlockchain = searchParams.get(SearchParams.TO_BLOCKCHAIN);\n const toToken = searchParams.get(SearchParams.TO_TOKEN);\n const autoConnect = searchParams.get(SearchParams.AUTO_CONNECT);\n const clientUrl = searchParams.get(SearchParams.CLIENT_URL);\n const liquiditySources = searchParams.get(SearchParams.LIQUIDITY_SOURCES);\n\n const blockchain = searchParams.get(SearchParams.BLOCKCHAIN);\n\n return {\n fromAmount,\n fromBlockchain,\n fromToken,\n toBlockchain,\n toToken,\n autoConnect,\n clientUrl,\n liquiditySources,\n utmQueryParams,\n blockchain,\n };\n };\n\n const updateUrlSearchParams = (\n searchParams: Record<string, string | undefined>\n ) => {\n for (const property in searchParams) {\n if (!searchParams[property]) {\n delete searchParams[property];\n }\n }\n setSearchParams(searchParams as Record<string, string>, { replace: true });\n };\n\n useEffect(() => {\n const { autoConnect, clientUrl, utmQueryParams, blockchain } =\n getUrlSearchParams();\n\n if (isInRouterContext && fetchMetaStatus === 'success') {\n updateUrlSearchParams({\n [SearchParams.FROM_BLOCKCHAIN]: fromBlockchain?.name,\n [SearchParams.FROM_TOKEN]: tokenToSearchParam(fromToken),\n [SearchParams.TO_BLOCKCHAIN]: toBlockchain?.name,\n [SearchParams.TO_TOKEN]: tokenToSearchParam(toToken),\n [SearchParams.FROM_AMOUNT]: inputAmount,\n [SearchParams.AUTO_CONNECT]: autoConnect ?? undefined,\n [SearchParams.CLIENT_URL]: clientUrl ?? undefined,\n [SearchParams.BLOCKCHAIN]: blockchain ?? undefined,\n [SearchParams.LIQUIDITY_SOURCES]: campaignMode\n ? liquiditySourcesParamsRef.current\n : undefined,\n ...utmQueryParams,\n });\n }\n }, [\n location.pathname,\n inputAmount,\n fromBlockchain,\n fromToken,\n toBlockchain,\n toToken,\n campaignMode,\n fetchMetaStatus,\n ]);\n\n useEffect(() => {\n if (!isInRouterContext) {\n return;\n }\n\n const searchParams = getUrlSearchParams();\n\n if (!liquiditySourcesParamsRef.current && searchParams.liquiditySources) {\n liquiditySourcesParamsRef.current = searchParams.liquiditySources;\n }\n\n if (searchParams.fromAmount) {\n setInputAmount(searchParams.fromAmount);\n }\n\n if (fetchMetaStatus === 'success') {\n const fromBlockchain = blockchains.find(\n (blockchain) => blockchain.name === searchParams.fromBlockchain\n );\n\n const convertFromToken =\n searchParams.fromToken &&\n fromBlockchain &&\n convertTokenSearchParamToAsset(searchParams.fromToken, fromBlockchain);\n const fromToken = convertFromToken\n ? findToken(convertFromToken)\n : undefined;\n const toBlockchain = blockchains.find(\n (blockchain) => blockchain.name === searchParams.toBlockchain\n );\n const convertToToken =\n searchParams.toToken &&\n toBlockchain &&\n convertTokenSearchParamToAsset(searchParams.toToken, toBlockchain);\n\n const toToken = convertToToken ? findToken(convertToToken) : undefined;\n\n if (!!fromBlockchain) {\n setFromBlockchain(fromBlockchain);\n if (!!fromToken) {\n setFromToken({\n token: fromToken,\n meta: {\n blockchains: blockchains,\n },\n });\n }\n }\n\n if (!!toBlockchain) {\n setToBlockchain(toBlockchain);\n if (!!toToken) {\n setToToken({\n token: toToken,\n meta: { blockchains: blockchains },\n });\n }\n }\n }\n }, [fetchMetaStatus]);\n\n useEffect(() => {\n const { clientUrl, liquiditySources } = getUrlSearchParams();\n // We run this only once, because if the app is embedded into an iframe, the data in url for iframe will not change.\n updateIframe('clientUrl', clientUrl || undefined);\n\n updateCampaignMode(\n 'liquiditySources',\n liquiditySources?.split(',') ?? undefined\n );\n }, []);\n}\n", "import type { Asset, BlockchainMeta, Token } from 'rango-sdk';\n\nexport function convertTokenSearchParamToAsset(\n searchParam: string,\n chain: BlockchainMeta\n): Asset | null {\n const symbolAndAddress = searchParam.split('--');\n if (!symbolAndAddress[0]) {\n return null;\n }\n return {\n blockchain: chain.name,\n address: symbolAndAddress?.[1] || null,\n symbol: symbolAndAddress[0],\n };\n}\n\nexport function tokenToSearchParam(token: Token | null): string | undefined {\n if (token) {\n return `${token.symbol}${token.address ? `--${token.address}` : ''}`;\n }\n return undefined;\n}\n", "import { i18n } from '@lingui/core';\nimport {\n Alert,\n Button,\n darkTheme,\n Divider,\n DoneIcon,\n styled,\n TextField,\n Typography,\n} from '@rango-dev/ui';\nimport React, { useState } from 'react';\nimport { useNavigate, useSearchParams } from 'react-router-dom';\n\nimport { BlockchainSelectorButton } from '../components/BlockchainSelectorButton';\nimport { ImportCustomToken } from '../components/ImportCustomToken';\nimport { Layout, PageContainer } from '../components/Layout';\nimport { navigationRoutes } from '../constants/navigationRoutes';\nimport { SearchParams } from '../constants/searchParams';\nimport { useFetchCustomToken } from '../hooks/useFetchCustomToken';\nimport { useNavigateBack } from '../hooks/useNavigateBack';\nimport { useAppStore } from '../store/AppStore';\nimport { findBlockchain, isValidTokenAddress } from '../utils/meta';\n\nconst Content = styled('div', {\n display: 'flex',\n justifyContent: 'space-between',\n flexDirection: 'column',\n flex: 1,\n '& ._text-field': {\n padding: '$4 $12',\n backgroundColor: '$neutral300',\n '& input': {\n padding: '0',\n },\n [`.${darkTheme} &`]: {\n backgroundColor: '$neutral400',\n },\n borderRadius: '$sm',\n height: '$40',\n },\n});\n\nexport function AddCustomTokenPage() {\n const navigate = useNavigate();\n const [searchParams] = useSearchParams();\n const navigateBack = useNavigateBack();\n const blockchains = useAppStore().blockchains();\n\n const blockchainName = searchParams.get(SearchParams.BLOCKCHAIN) || '';\n const blockchain = findBlockchain(blockchainName, blockchains);\n const [address, setAddress] = useState('');\n const { fetchCustomToken, token, loading, error, resetState } =\n useFetchCustomToken();\n const isValidAddress =\n !!blockchain && isValidTokenAddress(blockchain, address);\n const isImportDisabled = !blockchain || !address || !isValidAddress;\n\n const getCustomToken = () => {\n if (blockchain) {\n void fetchCustomToken({\n blockchain: blockchainName,\n tokenAddress: address,\n });\n }\n };\n\n return (\n <Layout\n header={{\n title: i18n.t('Add Custom Token'),\n }}>\n <PageContainer>\n <Content>\n <div>\n <BlockchainSelectorButton\n onClick={() =>\n navigate(navigationRoutes.blockchains, { replace: true })\n }\n hasLogo={!!blockchain?.logo}\n value={\n !!blockchain\n ? {\n name: blockchain.displayName,\n logo: blockchain.logo,\n }\n : undefined\n }\n title={i18n.t('Select chain')}\n placeholder={i18n.t('Select chain')}\n />\n <Divider size={'24'} />\n <Typography size=\"large\" variant=\"label\">\n {i18n.t('Enter Address')}\n </Typography>\n <Divider size={10} />\n <TextField\n fullWidth\n id=\"widget-add-custom-token-token-address-input\"\n disabled={!blockchain}\n variant=\"contained\"\n placeholder={i18n.t('Enter token address')}\n size=\"large\"\n value={address}\n suffix={\n !!address &&\n isValidAddress && <DoneIcon color=\"success\" size={12} />\n }\n onChange={(e) => setAddress(e.target.value)}\n />\n {!isValidAddress && !!address && (\n <>\n <Divider size={4} />\n <Alert\n id=\"widget-add-custom-token-invalid-address-alert\"\n type=\"error\"\n variant=\"alarm\"\n title=\"Invalid Address\"\n />\n </>\n )}\n </div>\n\n <Button\n id=\"widget-add-custom-token-import-btn\"\n disabled={isImportDisabled}\n type=\"primary\"\n variant=\"contained\"\n loading={loading}\n size=\"large\"\n onClick={getCustomToken}>\n {i18n.t('Import')}\n </Button>\n </Content>\n <ImportCustomToken\n token={token}\n blockchain={blockchain ?? undefined}\n address={address}\n error={error ?? undefined}\n fetchCustomToken={fetchCustomToken}\n onCloseErrorModal={() => {\n if (error?.type !== 'network-error') {\n setAddress('');\n }\n }}\n onImport={navigateBack}\n onExitErrorModal={resetState}\n onExitImportModal={resetState}\n />\n </PageContainer>\n </Layout>\n );\n}\n", "import type { PropTypes } from './BlockchainSelectorButton.types';\n\nimport { ChevronRightIcon, Divider, Image, Typography } from '@rango-dev/ui';\nimport React from 'react';\n\nimport {\n Container,\n FlexContainer,\n InputContainer,\n} from './BlockchainSelectorButton.styles';\n\nexport function BlockchainSelectorButton(props: PropTypes) {\n const { onClick, value, title, hasLogo, placeholder, disabled } = props;\n\n return (\n <Container>\n <Typography size=\"large\" variant=\"label\">\n {title}\n </Typography>\n <Divider size={10} />\n <InputContainer\n onClick={disabled ? undefined : onClick}\n disabled={disabled}\n id=\"widget-blockchain-selector-container\">\n <FlexContainer>\n {hasLogo && (\n <>\n <Image\n src={value?.logo}\n size={16}\n useAsPlaceholder={!value?.logo}\n type=\"circular\"\n />\n <Divider size={4} direction=\"horizontal\" />\n </>\n )}\n <Typography\n className=\"title_typography\"\n size=\"medium\"\n variant=\"label\">\n {value?.name || placeholder}\n </Typography>\n </FlexContainer>\n <ChevronRightIcon size={12} color=\"black\" />\n </InputContainer>\n </Container>\n );\n}\n", "import { darkTheme, styled } from '@rango-dev/ui';\n\nexport const InputContainer = styled('div', {\n display: 'flex',\n justifyContent: 'space-between',\n width: '100%',\n height: '$40',\n padding: '$4 $10',\n borderRadius: '$sm',\n cursor: 'pointer',\n alignItems: 'center',\n backgroundColor: '$neutral300',\n [`.${darkTheme} &`]: {\n backgroundColor: '$neutral400',\n },\n\n '&:hover': {\n backgroundColor: '$secondary100',\n [`.${darkTheme} &`]: {\n backgroundColor: '$neutral500',\n },\n },\n variants: {\n disabled: {\n true: {\n cursor: 'default',\n '&:hover': {\n borderColor: '$neutral300',\n '& svg': {\n color: '$neutral700',\n },\n },\n },\n },\n },\n});\n\nexport const Container = styled('div', {\n display: 'flex',\n flexDirection: 'column',\n width: '100%',\n '.title_typography': {\n textTransform: 'capitalize',\n },\n});\n\nexport const FlexContainer = styled('div', {\n display: 'flex',\n});\n", "import type { PropTypes } from './ImportCustomToken.types';\n\nimport { i18n } from '@lingui/core';\nimport { Button, Divider, MessageBox } from '@rango-dev/ui';\nimport React, { useEffect, useState } from 'react';\n\nimport { useAppStore } from '../../store/AppStore';\nimport { getContainer } from '../../utils/common';\nimport { WatermarkedModal } from '../common/WatermarkedModal';\nimport { CustomTokenModal } from '../CustomTokenModal';\n\nexport function ImportCustomToken(props: PropTypes) {\n const {\n token,\n blockchain,\n error,\n address,\n fetchCustomToken,\n onCloseErrorModal,\n onImport,\n onExitErrorModal,\n onExitImportModal,\n } = props;\n const { setCustomToken } = useAppStore();\n const [showErrorModal, setShowErrorModal] = useState<boolean>(false);\n const [showImportModal, setShowImportModal] = useState<boolean>(false);\n const [retryClicked, setRetryClicked] = useState(false);\n\n const getCustomToken = () => {\n if (blockchain) {\n void fetchCustomToken?.({\n blockchain: blockchain.name,\n tokenAddress: address,\n });\n }\n };\n\n const closeErrorModal = () => {\n if (error?.type !== 'network-error') {\n onCloseErrorModal?.();\n }\n setShowErrorModal(false);\n };\n\n const handleErrorModalButtonClick = () => {\n setRetryClicked(true);\n closeErrorModal();\n };\n\n const handleExit = () => {\n if (retryClicked && error?.type === 'network-error') {\n setRetryClicked(false);\n void getCustomToken();\n }\n onExitErrorModal();\n };\n\n const handleSubmit = () => {\n if (token) {\n setCustomToken(token);\n onImport();\n }\n };\n\n useEffect(() => {\n if (!!error) {\n setShowErrorModal(true);\n }\n }, [error]);\n\n useEffect(() => {\n if (blockchain && token) {\n setShowImportModal(true);\n }\n }, [blockchain, token]);\n return (\n <>\n <WatermarkedModal\n open={showErrorModal}\n dismissible\n id=\"widget-add-custom-token-modal\"\n onClose={closeErrorModal}\n onExit={handleExit}\n container={getContainer()}>\n <MessageBox\n title={error?.title ?? ''}\n type=\"error\"\n description={\n error?.message || i18n.t('Failed Network, Please retry.')\n }>\n <Divider size={40} />\n <Divider size={10} />\n {/* eslint-disable-next-line jsx-id-attribute-enforcement/missing-ids */}\n <Button\n id={`widget-add-custom-token-${\n error?.type === 'network-error' ? 'retry' : 'add-another'\n }-btn`}\n variant=\"contained\"\n size=\"large\"\n type=\"primary\"\n fullWidth\n onClick={handleErrorModalButtonClick}>\n {error?.type === 'network-error'\n ? i18n.t('Retry')\n : i18n.t('Add another custom token')}\n </Button>\n </MessageBox>\n </WatermarkedModal>\n {blockchain && token && (\n <CustomTokenModal\n blockchain={blockchain}\n token={token}\n onSubmitClick={handleSubmit}\n onClose={() => setShowImportModal(false)}\n open={showImportModal}\n onExit={onExitImportModal}\n />\n )}\n </>\n );\n}\n", "import type { PropTypes } from './CustomTokenModal.types';\n\nimport { i18n } from '@lingui/core';\nimport {\n Divider,\n ExternalLinkIcon,\n Image,\n InfoIcon,\n Tooltip,\n Typography,\n} from '@rango-dev/ui';\nimport React from 'react';\n\nimport { DEFAULT_TOKEN_IMAGE_SRC } from '../../constants/customTokens';\nimport { getContainer } from '../../utils/common';\nimport { WatermarkedModal } from '../common/WatermarkedModal';\n\nimport { CUSTOM_TOKEN_LEARN_MORE_LINK } from './CustomTokenModal.constants';\nimport { generateExplorerLink } from './CustomTokenModal.helpers';\nimport {\n Container,\n FlexCenteredContainer,\n StyledButton,\n StyledLink,\n TokenSymbolText,\n} from './CustomTokenModal.styles';\n\nconst MAX_SYMBOL_LENGTH_THRESHOLD = 9;\nexport function CustomTokenModal(props: PropTypes) {\n const { open, onClose, token, onExit, onSubmitClick, blockchain } = props;\n\n const explorerLink = generateExplorerLink(token.address, blockchain);\n\n const onClickLearnMore = () =>\n window.open(CUSTOM_TOKEN_LEARN_MORE_LINK, '_blank');\n\n return (\n <WatermarkedModal\n open={open}\n id=\"widget-custom-token-watermarked-modal\"\n dismissible\n onClose={onClose}\n onExit={onExit}\n container={getContainer()}>\n <Container>\n <Image\n src={token.image === '' ? DEFAULT_TOKEN_IMAGE_SRC : token.image}\n size={45}\n type=\"circular\"\n />\n <Divider size={4} />\n <FlexCenteredContainer>\n <TokenSymbolText variant=\"title\" size=\"medium\">\n {token.symbol}\n </TokenSymbolText>\n {token.symbol.length > MAX_SYMBOL_LENGTH_THRESHOLD && (\n <Tooltip content={token.symbol} container={getContainer()}>\n <InfoIcon size={12} color=\"gray\" />\n </Tooltip>\n )}\n </FlexCenteredContainer>\n\n <Typography variant=\"body\" size=\"small\" className=\"_blockchain-name\">\n {blockchain.displayName}\n </Typography>\n <Divider size={4} />\n\n <Typography variant=\"body\" size=\"medium\">\n {!!explorerLink ? (\n <StyledLink\n hasHover\n href={explorerLink}\n target=\"_blank\"\n rel=\"nofollow noreferrer\">\n {token.address}\n <ExternalLinkIcon size={12} color=\"gray\" />\n </StyledLink>\n ) : (\n <StyledLink>{token.address}</StyledLink>\n )}\n </Typography>\n\n <Divider size={4} />\n\n {token.coinSource && (\n <Typography className=\"_coin-source\" variant=\"body\" size=\"xsmall\">\n {i18n.t('via')}{' '}\n <Typography\n className=\"_coin-source-name\"\n variant=\"body\"\n size=\"xsmall\">\n {token.coinSource}\n </Typography>\n </Typography>\n )}\n <Divider size={'32'} />\n\n <Typography\n size=\"medium\"\n variant=\"body\"\n className=\"_custom-token-description\">\n {i18n.t(\n `This token is not part of our verified token list. please verify its source and make sure to understand all associated risks before proceeding.`\n )}\n </Typography>\n </Container>\n <Divider size={40} />\n <Divider size={10} />\n\n <StyledButton\n id=\"widget-custom-token-modal-import-btn\"\n variant=\"contained\"\n size=\"large\"\n type=\"primary\"\n fullWidth\n onClick={onSubmitClick}>\n {i18n.t('Import Anyway')}\n </StyledButton>\n <Divider size={10} />\n <StyledButton\n id=\"widget-custom-token-modal-learn-more-btn\"\n variant=\"outlined\"\n size=\"large\"\n type=\"primary\"\n fullWidth\n onClick={onClickLearnMore}>\n {i18n.t('Learn More')}\n </StyledButton>\n </WatermarkedModal>\n );\n}\n", "export const CUSTOM_TOKEN_LEARN_MORE_LINK =\n 'https://blog.rango.exchange/understanding-the-risks-of-using-custom-token-contract-addresses-96022308eca4';\n", "import type { BlockchainMeta } from 'rango-types';\n\nexport function generateExplorerLink(\n address: string | null,\n blockchain: BlockchainMeta\n): string {\n // We don't have Cosmos explorer url in API.\n if (blockchain.type === 'COSMOS') {\n return '';\n }\n\n const explorerLinkPattern = blockchain.info?.addressUrl;\n\n if (!explorerLinkPattern || !address) {\n return '';\n }\n\n return explorerLinkPattern.replace('{wallet}', address);\n}\n", "import { Button, darkTheme, styled, Typography } from '@rango-dev/ui';\n\nexport const StyledLink = styled('a', {\n textDecoration: 'none',\n color: '$colors$neutral700',\n [`.${darkTheme} &`]: {\n color: '$colors$neutral900',\n },\n\n '& svg': {\n marginLeft: '$4',\n color: '$colors$neutral700',\n [`.${darkTheme} &`]: {\n color: '$colors$neutral900',\n },\n },\n\n variants: {\n hasHover: {\n true: {\n '&:hover': {\n color: '$colors$secondary550',\n [`.${darkTheme} &`]: {\n color: '$colors$secondary500',\n },\n '& svg': {\n color: '$colors$secondary550',\n [`.${darkTheme} &`]: {\n color: '$colors$secondary500',\n },\n },\n },\n },\n false: {},\n },\n },\n});\n\nexport const Container = styled('div', {\n display: 'flex',\n justifyContent: 'center',\n flexDirection: 'column',\n alignItems: 'center',\n textAlign: 'center',\n '& ._blockchain-name, & ._coin-source': {\n color: '$colors$neutral600',\n [`.${darkTheme} &`]: {\n color: '$colors$neutral800',\n },\n },\n '& ._coin-source-name, & ._custom-token-description': {\n color: '$colors$neutral700',\n [`.${darkTheme} &`]: {\n color: '$colors$neutral900',\n },\n },\n});\n\nexport const StyledButton = styled(Button, {\n minHeight: '$40',\n});\n\nexport const TokenSymbolText = styled(Typography, {\n overflow: 'hidden',\n textOverflow: 'ellipsis',\n whiteSpace: 'nowrap',\n maxWidth: '96px',\n});\n\nexport const FlexCenteredContainer = styled('div', {\n display: 'flex',\n justifyContent: 'center',\n alignItems: 'center',\n});\n", "import type { PropTypes } from './Layout.types';\nimport type { PendingSwap } from 'rango-types';\nimport type { PropsWithChildren } from 'react';\n\nimport { useManager } from '@rango-dev/queue-manager-react';\nimport { BottomLogo, Divider, Header } from '@rango-dev/ui';\nimport React, { useEffect, useLayoutEffect, useRef, useState } from 'react';\n\nimport { WIDGET_UI_ID } from '../../constants';\nimport { useIframe } from '../../hooks/useIframe';\nimport { isAppLoadedIntoIframe } from '../../hooks/useIframe/useIframe.helpers';\nimport { useNavigateBack } from '../../hooks/useNavigateBack';\nimport { useTheme } from '../../hooks/useTheme';\nimport { useAppStore } from '../../store/AppStore';\nimport { tabManager, useUiStore } from '../../store/ui';\nimport { getContainer } from '../../utils/common';\nimport { getPendingSwaps } from '../../utils/queue';\nimport { isFeatureHidden } from '../../utils/settings';\nimport { ActivateTabAlert } from '../common/ActivateTabAlert';\nimport { ActivateTabModal } from '../common/ActivateTabModal';\nimport { BackButton, CancelButton, WalletButton } from '../HeaderButtons';\nimport { RefreshModal } from '../RefreshModal';\n\nimport { COMPACT_TOKEN_SELECTOR_THRESHOLD } from './Layout.constants';\nimport { onScrollContentAttachStatusToContainer } from './Layout.helpers';\nimport {\n BannerContainer,\n Container,\n Content,\n Footer,\n LayoutContainer,\n} from './Layout.styles';\n\nfunction Layout(props: PropsWithChildren<PropTypes>) {\n const { connectHeightObserver, disconnectHeightObserver } = useIframe();\n const { children, header, footer, height = 'fixed' } = props;\n const {\n fetchStatus,\n connectedWallets,\n config: { __UNSTABLE_OR_INTERNAL__ },\n } = useAppStore();\n const [openRefreshModal, setOpenRefreshModal] = useState(false);\n const {\n config: { features, theme },\n } = useAppStore();\n const { watermark } = useUiStore();\n\n const hasWatermark = watermark === 'FULL';\n const { activeTheme } = useTheme(theme || {});\n const [showBanner, setShowBanner] = useState(false);\n\n const isConnectWalletHidden = isFeatureHidden(\n 'connectWalletButton',\n features\n );\n\n const {\n isActiveTab,\n tabManagerInitiated,\n showActivateTabModal,\n setShowActivateTabModal,\n activateCurrentTab,\n setShowCompactTokenSelector,\n } = useUiStore();\n const navigateBack = useNavigateBack();\n const { manager } = useManager();\n const pendingSwaps: PendingSwap[] = getPendingSwaps(manager).map(\n ({ swap }) => swap\n );\n const hasRunningSwap = pendingSwaps.some((swap) => swap.status === 'running');\n\n const onActivateTab = () =>\n activateCurrentTab(tabManager.forceClaim, hasRunningSwap);\n\n const onConnectWallet = () => {\n header.onWallet?.();\n };\n\n const showBackButton =\n typeof header.hasBackButton === 'undefined' || header.hasBackButton;\n\n const scrollViewRef = useRef<HTMLDivElement>(null);\n const containerRef = useRef<HTMLDivElement>(null);\n\n useEffect(() => {\n const noRoutesAvailable =\n (__UNSTABLE_OR_INTERNAL__?.swapBoxBanner?.routes?.length ?? 0) === 0;\n const routesMatched =\n !!__UNSTABLE_OR_INTERNAL__?.swapBoxBanner?.routes?.some((route) =>\n location.pathname.endsWith(route)\n );\n\n setShowBanner(\n !!__UNSTABLE_OR_INTERNAL__?.swapBoxBanner &&\n (noRoutesAvailable || routesMatched)\n );\n }, [\n __UNSTABLE_OR_INTERNAL__?.swapBoxBanner?.routes?.toString(),\n location.pathname,\n ]);\n\n useEffect(() => {\n const isIframe = isAppLoadedIntoIframe();\n\n // This feature only will be available in an iframe context.\n if (isIframe && containerRef.current) {\n connectHeightObserver(containerRef.current);\n }\n\n return () => {\n disconnectHeightObserver();\n };\n }, []);\n\n useEffect(() => {\n scrollViewRef.current?.addEventListener(\n 'scroll',\n onScrollContentAttachStatusToContainer\n );\n return () => {\n scrollViewRef.current?.removeEventListener(\n 'scroll',\n onScrollContentAttachStatusToContainer\n );\n };\n }, []);\n\n useEffect(() => {\n setOpenRefreshModal(fetchStatus === 'failed');\n }, [fetchStatus]);\n\n useLayoutEffect(() => {\n if (!containerRef.current) {\n return;\n }\n\n const observer = new ResizeObserver((entries) => {\n for (const entry of entries) {\n if (entry.contentRect) {\n setShowCompactTokenSelector(\n entry.contentRect.height <\n parseInt(COMPACT_TOKEN_SELECTOR_THRESHOLD)\n );\n }\n }\n });\n\n observer.observe(containerRef.current);\n\n return () => observer.disconnect();\n }, []);\n\n return (\n <Container\n height={height}\n id={WIDGET_UI_ID.SWAP_BOX_ID}\n className={`${activeTheme()} ${LayoutContainer()}`}\n ref={containerRef}\n showBanner={showBanner}>\n <Header\n prefix={\n showBackButton ? (\n <BackButton\n onClick={() => {\n navigateBack();\n // As an example, used in routes page to add a custom logic when navigating back to the home page.\n header.onBack?.();\n }}\n />\n ) : null\n }\n title={header.title}\n suffix={\n <>\n {header.suffix}\n {header.onWallet && !isConnectWalletHidden && (\n <WalletButton\n container={getContainer()}\n onClick={onConnectWallet}\n isConnected={!!connectedWallets?.length}\n />\n )}\n {header.onCancel && <CancelButton onClick={header.onCancel} />}\n </>\n }\n />\n <Content ref={scrollViewRef}>{children}</Content>\n <ActivateTabModal\n open={showActivateTabModal}\n onClose={() => setShowActivateTabModal(false)}\n onConfirm={onActivateTab}\n />\n\n <Footer>\n <div className=\"footer__content\">\n {tabManagerInitiated && !isActiveTab && (\n <div className=\"footer__alert\">\n <ActivateTabAlert onActivateTab={onActivateTab} />\n <Divider size={10} />\n </div>\n )}\n {footer}\n </div>\n\n <Divider size={12} />\n\n <div\n className={`footer__logo ${\n hasWatermark ? 'logo__show' : 'logo__hidden'\n }`}>\n <BottomLogo />\n </div>\n </Footer>\n {showBanner && (\n <BannerContainer>\n {__UNSTABLE_OR_INTERNAL__?.swapBoxBanner?.element}\n </BannerContainer>\n )}\n <RefreshModal\n open={openRefreshModal}\n onClose={() => setOpenRefreshModal(false)}\n />\n </Container>\n );\n}\nexport { Layout };\n", "import type { Messages } from './useIframe.types';\n\nimport { useRef } from 'react';\n\nimport { useAppStore } from '../../store/AppStore';\n\nimport { isAppLoadedIntoIframe } from './useIframe.helpers';\n\ninterface UseIframe {\n send: (message: Messages) => void;\n connectHeightObserver: (element: HTMLElement) => void;\n disconnectHeightObserver: () => void;\n}\n\nfunction useIframe(): UseIframe {\n const heightObserver = useRef<ResizeObserver | null>(null);\n const { iframe } = useAppStore();\n const isMessagePassingAvailable = isAppLoadedIntoIframe() && iframe.clientUrl;\n\n const send = (message: Messages) => {\n if (isMessagePassingAvailable) {\n window.top?.postMessage(message, iframe.clientUrl!);\n }\n };\n\n const connectHeightObserver = (element: HTMLElement) => {\n heightObserver.current = new ResizeObserver((entries) => {\n for (const entry of entries) {\n send({\n type: 'widget_height',\n data: {\n height: entry.contentRect.height,\n },\n });\n }\n });\n\n heightObserver.current.observe(element);\n };\n\n const disconnectHeightObserver = () => {\n if (heightObserver.current) {\n heightObserver.current.disconnect();\n heightObserver.current = null;\n }\n };\n\n return {\n send,\n connectHeightObserver,\n disconnectHeightObserver,\n };\n}\n\nexport { useIframe };\n", "export function isAppLoadedIntoIframe() {\n return window.self !== window.top;\n}\n", "import { useNavigate } from 'react-router-dom';\n\nexport function useNavigateBack(): () => void {\n const navigate = useNavigate();\n return () => navigate(-1);\n}\n", "/* eslint-disable @typescript-eslint/no-magic-numbers */\nimport {\n createTheme,\n darkTheme as defaultDarkTheme,\n lightTheme as defaultLightTheme,\n} from '@rango-dev/ui';\nimport { useEffect, useState } from 'react';\n\nimport { DEFAULT_FONT_FAMILY } from '../constants/fonts';\nimport { useAppStore } from '../store/AppStore';\nimport { type WidgetTheme } from '../types';\nimport {\n DEFAULT_PRIMARY_RADIUS,\n DEFAULT_SECONDARY_RADIUS,\n} from '../utils/configs';\nimport { customizedThemeTokens } from '../utils/ui';\n\nfunction doesWindowPreferDarkColorScheme() {\n return (\n window.matchMedia &&\n window.matchMedia('(prefers-color-scheme: dark)').matches\n );\n}\n\nexport function useTheme(props: WidgetTheme) {\n const {\n colors,\n fontFamily = DEFAULT_FONT_FAMILY,\n borderRadius = DEFAULT_PRIMARY_RADIUS,\n secondaryBorderRadius = DEFAULT_SECONDARY_RADIUS,\n } = props;\n\n const [OSTheme, setOSTheme] = useState(\n doesWindowPreferDarkColorScheme() ? 'dark' : 'light'\n );\n\n const { theme } = useAppStore();\n\n const { dark, light } = customizedThemeTokens(colors);\n\n const baseTheme = createTheme({\n shadows: props.shadows || {},\n radii: {\n primary: `${borderRadius}px`,\n secondary: `${secondaryBorderRadius}px`,\n },\n fonts: {\n widget: fontFamily,\n },\n });\n const lightThemeClasses = [baseTheme.className, defaultLightTheme.className];\n const darkThemeClasses = [baseTheme.className, defaultDarkTheme.className];\n\n /*\n * If theme has been customized, we will push the customized theme to override the default themes.\n * To be overridden, it should be last thing that has been pushed.\n */\n if (light) {\n const customizedLightTheme = createTheme(light.id, light.tokens);\n lightThemeClasses.push(customizedLightTheme.className);\n }\n if (dark) {\n const customizedDarkTheme = createTheme(dark.id, dark.tokens);\n darkThemeClasses.push(customizedDarkTheme.className);\n }\n\n useEffect(() => {\n const switchThemeListener = (event: MediaQueryListEvent) => {\n if (event.matches) {\n setOSTheme('dark');\n } else {\n setOSTheme('light');\n }\n };\n\n if (doesWindowPreferDarkColorScheme()) {\n setOSTheme('dark');\n }\n\n window\n .matchMedia('(prefers-color-scheme: dark)')\n .addEventListener('change', switchThemeListener);\n return () => {\n window\n .matchMedia('(prefers-color-scheme: dark)')\n .removeEventListener('change', switchThemeListener);\n };\n }, []);\n\n const getActiveTheme = () => {\n const lightClassNames = lightThemeClasses.join(' ');\n const darkClassNames = darkThemeClasses.join(' ');\n if (theme === 'auto') {\n return OSTheme === 'dark' ? darkClassNames : lightClassNames;\n }\n\n return theme === 'dark' ? darkClassNames : lightClassNames;\n };\n\n return {\n activeTheme: getActiveTheme,\n mode: theme === 'auto' ? OSTheme : theme,\n };\n}\n", "/* eslint-disable @typescript-eslint/no-magic-numbers */\nimport type { WidgetTheme } from '../types';\nimport type { createTheme } from '@rango-dev/ui';\n\nimport {\n theme as baseThemeTokens,\n darkColors as defaultDarkColors,\n} from '@rango-dev/ui';\nimport React from 'react';\n\nimport { expandToGenerateThemeColors } from '../utils/colors';\nimport { toHash } from '../utils/hash';\n\nimport { THEME_CLASS_NAME_PREFIX } from './configs';\n\ntype Tokens = Parameters<typeof createTheme>[0];\ninterface CustomizedThemeValues {\n id: string;\n tokens: Tokens;\n}\n\ninterface CustomizedTheme {\n light: undefined | CustomizedThemeValues;\n dark: undefined | CustomizedThemeValues;\n}\n\nexport function customizedThemeTokens(\n colors: WidgetTheme['colors']\n): CustomizedTheme {\n const baseColors = baseThemeTokens.colors;\n const baseDarkColors = {\n ...baseColors,\n ...defaultDarkColors,\n };\n let lightTheme: CustomizedTheme['light'] = undefined;\n let darkTheme: CustomizedTheme['dark'] = undefined;\n\n if (colors?.light) {\n const lightColors = expandToGenerateThemeColors(baseColors, colors.light);\n const tokens = { colors: lightColors };\n const id = `${THEME_CLASS_NAME_PREFIX}-light-${toHash(tokens)}`;\n lightTheme = {\n id,\n tokens: tokens as Tokens,\n };\n }\n\n if (colors?.dark) {\n const darkColors = expandToGenerateThemeColors(\n baseDarkColors,\n colors.dark,\n {\n reverseNeutralRange: true,\n }\n );\n const tokens = { colors: darkColors };\n const id = `${THEME_CLASS_NAME_PREFIX}-dark-${toHash(tokens)}`;\n darkTheme = {\n id,\n tokens: tokens as Tokens,\n };\n }\n\n return {\n light: lightTheme,\n dark: darkTheme,\n };\n}\n\nexport function joinList(\n list: { element: React.JSX.Element; key: string }[],\n divider: React.JSX.Element\n) {\n if (list.length <= 1) {\n return list.map(({ element, key }) => React.cloneElement(element, { key }));\n }\n\n const output: React.JSX.Element[] = [];\n list.forEach((item, index) => {\n const { element, key } = item;\n output.push(React.cloneElement(element, { key }));\n if (index < list.length - 1) {\n const key = `divider-${index}`;\n output.push(React.cloneElement(divider, { key }));\n }\n });\n\n return output;\n}\n", "/* eslint-disable @typescript-eslint/no-magic-numbers */\n// Types\nimport type { ThemeColors, WidgetColors, WidgetColorsKeys } from '../types';\n\nimport { isColorKeyOverridden } from './validation';\n\ntype RGB = {\n red: number;\n green: number;\n blue: number;\n};\n\ntype ShadeOrTintFunction = (rgb: RGB, step: number) => RGB;\n\nconst HEX_BASE = 16;\nconst MAX_COLOR_VALUE = 255;\nconst PERCENT = 0.11;\n\n// Utility Functions\n\nfunction expandShortHexColor(hexColor: string) {\n // Remove '#' if it exists\n if (hexColor.startsWith('#')) {\n hexColor = hexColor.slice(1);\n }\n\n // Check if the hexColor has a length of 3\n if (hexColor.length === 3) {\n // Convert the string to an array of characters\n const characters = hexColor.split('');\n\n // Duplicate each character and combine them into a single string\n const expandedHex = characters.reduce(function (acc, char) {\n return acc + char + char;\n }, '');\n\n // Return the resulting 6-character hex color\n return `#${expandedHex}`;\n }\n\n // Return the original hexColor if it's not 3 characters\n return `#${hexColor}`;\n}\n\n// pad a hexadecimal string with zeros if it needs it\nfunction pad(number: string, length: number) {\n return number.padStart(length, '0');\n}\n\n// Convert an integer to a 2-character hex string\nfunction intToHex(value: number) {\n const clampedValue = Math.min(\n Math.max(Math.round(value), 0),\n MAX_COLOR_VALUE\n );\n return pad(clampedValue.toString(HEX_BASE), 2);\n}\n\n// convert one of our rgb color objects to a full hex color string\nfunction rgbToHex(rgb: RGB) {\n return `#${intToHex(rgb.red)}${intToHex(rgb.green)}${intToHex(rgb.blue)}`;\n}\n\n// Convert a hex color string to an RGB object\nfunction hexToRGB(hex: string): RGB {\n const red = parseInt(hex.slice(1, 3), HEX_BASE);\n const green = parseInt(hex.slice(3, 5), HEX_BASE);\n const blue = parseInt(hex.slice(5, 7), HEX_BASE);\n\n return { red, green, blue };\n}\n\n// Generate a shade of a given RGB color\nfunction generateShade(rgb: RGB, step: number): RGB {\n const factor = 1 - PERCENT * step;\n return {\n red: rgb.red * factor,\n green: rgb.green * factor,\n blue: rgb.blue * factor,\n };\n}\n\n// Generate a tint of a given RGB color\nfunction generateTint(rgb: RGB, step: number): RGB {\n const factor = PERCENT * step;\n return {\n red: rgb.red + (MAX_COLOR_VALUE - rgb.red) * factor,\n green: rgb.green + (MAX_COLOR_VALUE - rgb.green) * factor,\n blue: rgb.blue + (MAX_COLOR_VALUE - rgb.blue) * factor,\n };\n}\n\n// Main Functions\n\n// Calculate an array of shades from a hex color string\nexport function calculateShades(hex: string): string[] {\n return calculateColors(hex, generateShade);\n}\n\n// Calculate an array of tints from a hex color string\nexport function calculateTints(hex: string): string[] {\n return calculateColors(hex, generateTint);\n}\n\n// General function to calculate shades or tints\nfunction calculateColors(\n hex: string,\n generateColor: ShadeOrTintFunction\n): string[] {\n const rgb = hexToRGB(hex);\n const colors: string[] = [];\n for (let i = 1; i < 9; i++) {\n colors.push(rgbToHex(generateColor(rgb, i)));\n }\n return colors;\n}\n\n// Create tints and shades for a given color\nexport function createTintsAndShades(\n hex: string,\n colorKey: string,\n isReversed?: boolean\n): { [key: string]: string } {\n const BASE_INDEX = 100;\n const STEP = 50;\n\n const tints = calculateTints(hex).reverse().concat(hex);\n const shades = calculateShades(hex);\n const combinedColors = tints.concat(shades);\n\n const colorMap: { [key: string]: string } = {};\n const length = combinedColors.length;\n\n for (let i = 0; i < length; i++) {\n const index = BASE_INDEX + (isReversed ? length - 1 - i : i) * STEP;\n const color = combinedColors[i];\n if (color) {\n colorMap[`${colorKey}${index}`] = color;\n }\n }\n\n return colorMap;\n}\n\n// Generate a color palette based on base colors and \"Expand Colors\"\nexport function expandToGenerateThemeColors(\n baseColors: ThemeColors,\n expandColors: WidgetColors,\n options?: { reverseNeutralRange?: boolean }\n): ThemeColors {\n const output = { ...baseColors };\n\n for (const colorKey in expandColors) {\n const expandColor = expandColors[colorKey as WidgetColorsKeys] as string;\n const isNeutralReversed =\n colorKey === 'neutral' && !!options?.reverseNeutralRange;\n /*\n *Most of the colors are range but there are some colors that should be a single value e.g.\n *{\n * // single value\n * background: \"#fff\",\n * // range\n * primary: '#1C3CF1',\n * primary500: '#1C3CF1',\n * primary550: '#0B27C4',\n *}\n */\n const isSingleColor = ['background', 'foreground'].includes(colorKey);\n\n if (!isSingleColor && !isColorKeyOverridden(colorKey)) {\n const expandedHexColor = expandShortHexColor(expandColor);\n Object.assign(\n output,\n createTintsAndShades(expandedHexColor, colorKey, isNeutralReversed)\n );\n }\n }\n\n return { ...output, ...expandColors };\n}\n", "/* eslint-disable @typescript-eslint/no-magic-numbers */\n// Original Code: https://github.com/stitchesjs/stitches/blob/canary/packages/core/src/convert/toHash.js\n\nconst toAlphabeticChar = (code: number) =>\n String.fromCharCode(code + (code > 25 ? 39 : 97));\n\nconst toAlphabeticName = (code: number) => {\n let name = '';\n let x;\n\n for (x = Math.abs(code); x > 52; x = (x / 52) | 0) {\n name = toAlphabeticChar(x % 52) + name;\n }\n\n return toAlphabeticChar(x % 52) + name;\n};\n\nconst toPhash = (h: number, x: string) => {\n let i = x.length;\n while (i) {\n h = (h * 33) ^ x.charCodeAt(--i);\n }\n return h;\n};\n\nexport const toHash = (value: object) =>\n toAlphabeticName(toPhash(5381, JSON.stringify(value)) >>> 0);\n", "import type { Manager } from '@rango-dev/queue-manager-core';\nimport type {\n PendingSwapWithQueueID,\n SwapStorage,\n} from '@rango-dev/queue-manager-rango-preset';\n\nexport const getPendingSwaps = (manager: Manager | undefined) => {\n const result: PendingSwapWithQueueID[] = [];\n\n manager?.getAll().forEach((q, id) => {\n const storage = q.list.getStorage() as SwapStorage;\n\n if (storage?.swapDetails) {\n result.push({\n id,\n swap: storage?.swapDetails,\n });\n }\n });\n\n return result.sort(\n (a, b) => Number(b.swap.creationTime) - Number(a.swap.creationTime)\n );\n};\n", "import type { PropTypes } from './ActivateTabAlert.types';\n\nimport { i18n } from '@lingui/core';\nimport { Alert, Button } from '@rango-dev/ui';\nimport React from 'react';\n\nexport function ActivateTabAlert(props: PropTypes) {\n return (\n <Alert\n action={\n <Button\n id=\"widget-active-tab-btn\"\n onClick={props.onActivateTab}\n variant=\"contained\"\n size=\"xxsmall\"\n type=\"warning\">\n {i18n.t('Activate this tab')}\n </Button>\n }\n type=\"warning\"\n variant=\"alarm\"\n title={i18n.t('Another tab is open and handles transactions.')}\n />\n );\n}\n", "import type { PropTypes } from './ActivateTabModal.types';\n\nimport { i18n } from '@lingui/core';\nimport { Button, Divider, MessageBox } from '@rango-dev/ui';\nimport React from 'react';\n\nimport { getContainer } from '../../../utils/common';\nimport { WatermarkedModal } from '../WatermarkedModal';\n\nexport function ActivateTabModal(props: PropTypes) {\n const { open, onClose, onConfirm } = props;\n\n return (\n <WatermarkedModal\n open={open}\n dismissible\n onClose={onClose}\n id=\"widget-active-tab-modal\"\n container={getContainer()}>\n <MessageBox\n title={i18n.t('Activate current tab')}\n type=\"warning\"\n description={i18n.t(\n 'Currently, some transactions are running and being handled by other browser tab. If you activate this tab, all transactions that are already in the transaction sign step will expire.'\n )}>\n <Divider size={20} />\n <Button\n id=\"widget-modal-confirm-activate-tab-btn\"\n variant=\"contained\"\n size=\"large\"\n type=\"primary\"\n fullWidth\n onClick={onConfirm}>\n {i18n.t('Confirm')}\n </Button>\n </MessageBox>\n </WatermarkedModal>\n );\n}\n", "import type { PropTypes } from './HeaderButtons.types';\n\nimport { ChevronLeftIcon } from '@rango-dev/ui';\nimport React from 'react';\n\nimport { HeaderButton } from './HeaderButtons.styles';\n\nfunction BackButton(props: PropTypes) {\n return (\n <HeaderButton\n id=\"widget-header-back-icon-btn\"\n variant=\"ghost\"\n size=\"small\"\n onClick={props.onClick}>\n <ChevronLeftIcon color=\"black\" size={16} />\n </HeaderButton>\n );\n}\n\nexport { BackButton };\n", "import { css, darkTheme, IconButton, styled } from '@rango-dev/ui';\n\nexport const HeaderButton = styled(IconButton, {\n width: '$24',\n position: 'relative',\n padding: '0',\n overflow: 'unset',\n '&:hover': {\n backgroundColor: '$secondary100',\n [`.${darkTheme} &`]: {\n backgroundColor: '$neutral',\n },\n },\n});\n\nexport const ConnectedIcon = styled('div', {\n position: 'absolute',\n background: '$secondary500',\n [`.${darkTheme} &`]: {\n $$color: '$colors$secondary250',\n },\n width: '$6',\n height: '$6',\n borderRadius: '$lg',\n right: '$4',\n border: '1px solid $surface100',\n});\n\nexport const SuffixContainer = styled('div', {\n display: 'flex',\n justifyContent: 'flex-end',\n minWidth: '$40',\n button: {\n padding: 0,\n },\n});\n\nexport const NotificationsBadgeContainer = styled('div', {\n position: 'absolute',\n width: '14px',\n height: '14px',\n display: 'flex',\n justifyContent: 'center',\n alignItems: 'center',\n borderRadius: '7px',\n top: '$0',\n right: '$0',\n variants: {\n isSever: {\n true: {\n backgroundColor: '$error500',\n },\n false: {\n backgroundColor: '$secondary500',\n },\n },\n },\n});\n\nexport const ProgressIcon = styled('div', {\n padding: '$2',\n variants: {\n isRefetched: {\n true: {\n transform: `rotate(360deg)`,\n transition: 'transform 1s ease-in-out',\n },\n },\n },\n});\n\nexport const InProgressTransactionBadgeContainer = styled('div', {\n position: 'absolute',\n right: '$4',\n top: '$4',\n backgroundColor: '$background',\n borderRadius: '100%',\n});\n\nexport const rowStyles = css({\n display: 'flex',\n flexDirection: 'row',\n justifyContent: 'center',\n alignItems: 'center',\n});\n\nexport const WalletImageContainer = styled('div', {\n borderRadius: '100%',\n border: '1.5px transparent solid',\n '&:not(:first-child)': {\n marginLeft: '-$6',\n },\n img: {\n borderRadius: '100%',\n },\n});\n", "import type { PropTypes } from './HeaderButtons.types';\n\nimport { i18n } from '@lingui/core';\nimport { Button, Typography } from '@rango-dev/ui';\nimport React from 'react';\n\nimport { SuffixContainer } from './HeaderButtons.styles';\n\nfunction CancelButton(props: PropTypes) {\n return (\n <SuffixContainer>\n <Button\n id=\"widget-header-cancel-btn\"\n variant=\"ghost\"\n onClick={props.onClick}\n size=\"xsmall\">\n <Typography variant=\"label\" size=\"medium\" color=\"error500\">\n {i18n.t('Cancel')}\n </Typography>\n </Button>\n </SuffixContainer>\n );\n}\n\nexport { CancelButton };\n", "import type { PropTypes } from './HeaderButtons.types';\n\nimport { i18n } from '@lingui/core';\nimport { Image, Tooltip, WalletIcon, WalletState } from '@rango-dev/ui';\nimport React from 'react';\n\nimport { useWalletList } from '../../hooks/useWalletList';\n\nimport {\n ConnectedIcon,\n HeaderButton,\n rowStyles,\n WalletImageContainer,\n} from './HeaderButtons.styles';\n\nfunction WalletButton(props: PropTypes) {\n const { list } = useWalletList();\n const connectedWallets = list.filter(\n (wallet) =>\n wallet.state === WalletState.CONNECTED ||\n wallet.state === WalletState.PARTIALLY_CONNECTED\n );\n const content = !connectedWallets.length ? (\n i18n.t('Connect Wallet')\n ) : (\n <div className={rowStyles()}>\n {connectedWallets.map((wallet) => (\n <WalletImageContainer key={wallet.title}>\n <Image src={wallet.image} size={14} />\n </WalletImageContainer>\n ))}\n </div>\n );\n\n return (\n <Tooltip container={props.container} side=\"bottom\" content={content}>\n <HeaderButton\n id=\"widget-header-wallet-icon-btn\"\n variant=\"ghost\"\n size=\"small\"\n onClick={props.onClick}>\n {props.isConnected && <ConnectedIcon />}\n <WalletIcon size={18} color=\"black\" />\n </HeaderButton>\n </Tooltip>\n );\n}\n\nexport { WalletButton };\n", "import type { HeaderButtonsPropTypes } from './HeaderButtons.types';\n\nimport { i18n } from '@lingui/core';\nimport {\n NotificationsIcon,\n Popover,\n SettingsIcon,\n Tooltip,\n TransactionIcon,\n} from '@rango-dev/ui';\nimport React from 'react';\n\nimport { useAppStore } from '../../store/AppStore';\nimport { getContainer } from '../../utils/common';\nimport { isFeatureHidden } from '../../utils/settings';\nimport { NotificationContent } from '../NotificationContent';\n\nimport { HeaderButton } from './HeaderButtons.styles';\nimport InProgressTransactionBadge from './InProgressTransactionBadge';\nimport { NotificationsBadge } from './NotificationsBadge';\nimport { RefreshButton } from './RefreshButton';\n\nexport function HeaderButtons(props: HeaderButtonsPropTypes) {\n const {\n onClickRefresh,\n onClickHistory,\n onClickSettings,\n hidden = [],\n container,\n } = props;\n\n const {\n config: { features },\n } = useAppStore();\n\n const isNotificationsHidden =\n isFeatureHidden('notification', features) ||\n hidden.includes('notifications');\n\n return (\n <>\n {!hidden.includes('refresh') && (\n <Tooltip\n container={container || getContainer()}\n side=\"top\"\n content={i18n.t('Refresh')}>\n <RefreshButton onClick={onClickRefresh} />\n </Tooltip>\n )}\n\n {!isNotificationsHidden && (\n <Popover\n align=\"end\"\n alignOffset={-88}\n sideOffset={15}\n collisionPadding={{ right: 20, left: 20 }}\n container={getContainer()}\n content={<NotificationContent />}>\n <div>\n <Tooltip\n container={getContainer()}\n side=\"top\"\n content={i18n.t('Notifications')}>\n <HeaderButton\n id=\"widget-header-notification-icon-btn\"\n size=\"small\"\n variant=\"ghost\">\n <NotificationsIcon size={18} color=\"black\" />\n <NotificationsBadge />\n </HeaderButton>\n </Tooltip>\n </div>\n </Popover>\n )}\n {!hidden.includes('settings') && (\n <Tooltip\n container={getContainer()}\n side=\"top\"\n content={i18n.t('Settings')}>\n <HeaderButton\n id=\"widget-header-setting-icon-btn\"\n size=\"small\"\n variant=\"ghost\"\n onClick={onClickSettings}>\n <SettingsIcon size={18} color=\"black\" />\n </HeaderButton>\n </Tooltip>\n )}\n {!hidden.includes('history') && (\n <Tooltip\n container={getContainer()}\n side=\"top\"\n content={i18n.t('History')}>\n <HeaderButton\n id=\"widget-header-history-icon-btn\"\n size=\"small\"\n variant=\"ghost\"\n onClick={onClickHistory}>\n <TransactionIcon size={18} color=\"black\" />\n <InProgressTransactionBadge />\n </HeaderButton>\n </Tooltip>\n )}\n </>\n );\n}\n", "import type { Notification } from '../../types/notification';\n\nimport { Notifications } from '@rango-dev/ui';\nimport React from 'react';\nimport { useNavigate } from 'react-router-dom';\n\nimport { navigationRoutes } from '../../constants/navigationRoutes';\nimport { useAppStore } from '../../store/AppStore';\nimport { useNotificationStore } from '../../store/notification';\nimport { getBlockchainImage } from '../../utils/meta';\n\nexport function NotificationContent() {\n const navigate = useNavigate();\n\n const { getNotifications, clearNotifications } = useNotificationStore();\n\n const notifications: Notification[] = getNotifications();\n const blockchains = useAppStore().blockchains();\n const { findToken } = useAppStore();\n\n const onClickItem = (requestId: Notification['requestId']) => {\n navigate(`${navigationRoutes.swaps}/${requestId}`);\n };\n\n return (\n <Notifications\n id=\"widget-notifications-container\"\n list={notifications}\n getBlockchainImage={(blockchain) =>\n getBlockchainImage(blockchain, blockchains)\n }\n getTokenImage={(token) => findToken(token)?.image}\n onClickItem={onClickItem}\n onClearAll={clearNotifications}\n />\n );\n}\n", "import type { Notification } from '../types/notification';\n\nimport {\n type PendingSwapWithQueueID,\n type Route,\n type RouteEvent,\n type StepEvent,\n} from '@rango-dev/queue-manager-rango-preset';\nimport { create } from 'zustand';\nimport { persist, subscribeWithSelector } from 'zustand/middleware';\n\nimport createSelectors from './selectors';\n\nexport interface NotificationState {\n isSynced: boolean;\n notifications: Notification[];\n setNotification: (event: RouteEvent | StepEvent, route: Route) => void;\n removeNotification: (requestId: Notification['requestId']) => void;\n getNotifications: () => Notification[];\n syncNotifications: (swaps: PendingSwapWithQueueID[]) => void;\n clearNotifications: () => void;\n}\n\nexport const useNotificationStore = createSelectors(\n create<NotificationState>()(\n persist(\n subscribeWithSelector((set, get) => ({\n isSynced: false,\n notifications: [],\n setNotification: (event, route) => {\n const fromStep = route.steps[0];\n const toStep = route.steps[route.steps.length - 1];\n if (!fromStep || !toStep) {\n return;\n }\n const notification: Notification = {\n event,\n creationTime: Date.now(),\n requestId: route.requestId,\n route: {\n creationTime: parseInt(route.creationTime),\n from: {\n blockchain: fromStep.fromBlockchain,\n address: fromStep.fromSymbolAddress,\n symbol: fromStep.fromSymbol,\n },\n to: {\n blockchain: toStep.toBlockchain,\n address: toStep.toSymbolAddress,\n symbol: toStep.toSymbol,\n },\n },\n };\n\n const excludedList = get().notifications.filter(\n (notificationItem) => notificationItem.requestId !== route.requestId\n );\n\n set(() => ({\n notifications: [...excludedList, notification],\n }));\n },\n removeNotification: (requestId) => {\n set((state) => ({\n notifications: state.notifications.filter(\n (notification) => notification.requestId !== requestId\n ),\n }));\n },\n getNotifications: () => {\n const { isSynced, notifications } = get();\n return isSynced\n ? notifications.sort((a, b) => {\n if (a.route.creationTime && !b.route.creationTime) {\n return -1;\n }\n if (!a.route.creationTime && b.route.creationTime) {\n return 1;\n }\n if (!a.route.creationTime && !b.route.creationTime) {\n return b.creationTime - a.creationTime;\n }\n return b.route.creationTime - a.route.creationTime;\n })\n : [];\n },\n syncNotifications: (swaps) => {\n const { isSynced, notifications } = get();\n\n if (!isSynced) {\n const nextNotifications: Notification[] = [];\n notifications.forEach((notification) => {\n const swapExist = swaps.some(\n (swap) => swap.swap.requestId === notification.requestId\n );\n if (swapExist) {\n nextNotifications.push(notification);\n }\n });\n\n set({ isSynced: true, notifications: nextNotifications });\n }\n },\n clearNotifications: () => set({ notifications: [] }),\n })),\n\n {\n name: 'notification',\n skipHydration: true,\n partialize: ({ isSynced, ...otherProps }) => otherProps,\n version: 1,\n migrate: (persistedState, version) => {\n if (version === 0) {\n /**\n * Eliminate the persistence of read notifications,\n * and remove the \"read\" flag from other notifications to align with the current modifications in the notification store structure.\n */\n const oldNotifications = (\n persistedState as {\n notifications: (Notification & { read: boolean })[];\n }\n ).notifications;\n\n (persistedState as NotificationState).notifications =\n oldNotifications\n .filter(\n (notification: Notification & { read: boolean }) =>\n !notification.read\n )\n .map(({ read, ...otherProps }) => otherProps);\n }\n\n return persistedState as NotificationState;\n },\n }\n )\n )\n);\n", "import type { PendingSwap } from 'rango-types';\n\nimport { useManager } from '@rango-dev/queue-manager-react';\nimport { InProgressIcon } from '@rango-dev/ui';\nimport React from 'react';\n\nimport { getPendingSwaps } from '../../utils/queue';\n\nimport { InProgressTransactionBadgeContainer } from './HeaderButtons.styles';\n\nconst InProgressTransactionBadge = () => {\n const { manager } = useManager();\n const list: PendingSwap[] = getPendingSwaps(manager).map(({ swap }) => swap);\n\n if (!list.find((swap) => swap.status === 'running')) {\n return null;\n }\n\n return (\n <InProgressTransactionBadgeContainer id=\"widget-header-history-badge-container\">\n <InProgressIcon color=\"info\" size={6} />\n </InProgressTransactionBadgeContainer>\n );\n};\n\nexport default InProgressTransactionBadge;\n", "import { EventSeverity } from '@rango-dev/queue-manager-rango-preset';\nimport { Typography } from '@rango-dev/ui';\nimport React from 'react';\n\nimport { useNotificationStore } from '../../store/notification';\n\nimport { NotificationsBadgeContainer } from './HeaderButtons.styles';\n\nexport function NotificationsBadge() {\n const { getNotifications } = useNotificationStore();\n\n const notificationsList = getNotifications();\n\n const notificationsCount = notificationsList.length;\n\n const hasSeverNotification = !!notificationsList.find(\n (notificationItem) =>\n notificationItem.event.messageSeverity === EventSeverity.WARNING\n );\n\n return notificationsCount ? (\n <NotificationsBadgeContainer isSever={hasSeverNotification}>\n <Typography\n variant=\"body\"\n size=\"xsmall\"\n color=\"$background\"\n id=\"widget-header-notifications-badge-container\">\n {notificationsCount}\n </Typography>\n </NotificationsBadgeContainer>\n ) : null;\n}\n", "import { RefreshProgressButton } from '@rango-dev/ui';\nimport React, { useEffect, useState } from 'react';\n\nimport { HeaderButton, ProgressIcon } from './HeaderButtons.styles';\n\nconst REFRESH_INTERVAL = 1000;\nconst MAX_ELAPSED_TIME = 60;\nconst MAX_PERCENTAGE = 100;\n\nfunction RefreshButton({ onClick }: { onClick: (() => void) | undefined }) {\n const [elapsedTime, setElapsedTime] = useState(0);\n const [isRefetched, setIsRefetched] = useState(false);\n\n const handleVisibilityChange = (interval?: number) => {\n if (document.hidden && interval) {\n // Tab is inactive, clear the interval\n clearTimeout(interval);\n }\n };\n\n useEffect(() => {\n let interval: number | undefined;\n if (onClick) {\n interval = window.setInterval(() => {\n setElapsedTime((prevTime) => prevTime + 1);\n\n if (elapsedTime === MAX_ELAPSED_TIME) {\n handleRefreshClick();\n }\n }, REFRESH_INTERVAL);\n } else {\n clearTimeout(interval);\n }\n\n document.addEventListener('visibilitychange', () =>\n handleVisibilityChange(interval)\n );\n\n return () => {\n document.removeEventListener('visibilitychange', () =>\n handleVisibilityChange(interval)\n );\n if (interval) {\n clearInterval(interval);\n }\n };\n }, [elapsedTime, onClick]);\n\n const clearTimeout = (interval?: number) => {\n if (interval) {\n clearInterval(interval);\n }\n setElapsedTime(0);\n };\n\n const handleRefreshClick = () => {\n onClick?.();\n setElapsedTime(0);\n setIsRefetched(true);\n };\n\n return (\n <HeaderButton\n id=\"widget-header-refresh-icon-btn\"\n variant=\"ghost\"\n size=\"small\"\n style={{ paddingTop: 0, paddingBottom: 0 }}\n onClick={handleRefreshClick}\n disabled={!onClick}>\n <ProgressIcon\n onTransitionEnd={() => setIsRefetched(false)}\n isRefetched={isRefetched}>\n <RefreshProgressButton\n size={22}\n color={!onClick ? 'gray' : 'black'}\n progress={(elapsedTime / MAX_ELAPSED_TIME) * MAX_PERCENTAGE}\n />\n </ProgressIcon>\n </HeaderButton>\n );\n}\n\nexport { RefreshButton };\n", "import type { PropTypes } from './RefreshModal.types';\n\nimport { i18n } from '@lingui/core';\nimport { Divider, MessageBox, RefreshIcon } from '@rango-dev/ui';\nimport React from 'react';\n\nimport { getContainer } from '../../utils/common';\nimport { WatermarkedModal } from '../common/WatermarkedModal';\n\nimport { RefreshButton } from './RefreshModal.styles';\n\nexport function RefreshModal(props: PropTypes) {\n const { open, onClose } = props;\n\n return (\n <WatermarkedModal\n open={open}\n dismissible\n onClose={onClose}\n id=\"widget-refresh-modal\"\n container={getContainer()}>\n <MessageBox\n title={i18n.t('Something went wrong')}\n type=\"error\"\n description={i18n.t('Something went wrong. Please refresh the app.')}>\n <Divider size={30} />\n <RefreshButton\n variant=\"outlined\"\n id=\"widget-refresh-modal-refresh-btn\"\n size=\"large\"\n type=\"primary\"\n fullWidth\n onClick={() => location.reload()}>\n <RefreshIcon size={20} color=\"primary\" />\n <Divider size={4} direction=\"horizontal\" />\n {i18n.t('Refresh')}\n </RefreshButton>\n </MessageBox>\n </WatermarkedModal>\n );\n}\n", "import { Button, styled } from '@rango-dev/ui';\n\nexport const RefreshButton = styled(Button, {\n '& span': {\n display: 'flex',\n justifyContent: 'center',\n alignItems: 'center',\n },\n});\n", "export const WIDGET_MAX_HEIGHT = '700px';\nexport const WIDGET_MIN_HEIGHT_FOR_SMALL_SCREENS = '425px';\nexport const WIDGET_MIN_HEIGHT_FOR_LARGE_SCREENS = '550px';\nexport const COMPACT_TOKEN_SELECTOR_THRESHOLD = '640px';\nexport const LARGE_SCREEN_MIN_HEIGHT = '800px';\n", "import { getContainer } from '../../utils/common';\n\nexport function onScrollContentAttachStatusToContainer(e: Event) {\n const contentElement = e.target as HTMLElement | null;\n\n if (contentElement) {\n const fromTop = contentElement.scrollTop;\n const container = getContainer();\n\n if (fromTop > 1) {\n container.classList.add('rng-scrolled');\n } else {\n container.classList.remove('rng-scrolled');\n }\n }\n}\n", "import { css, styled } from '@rango-dev/ui';\n\nimport {\n LARGE_SCREEN_MIN_HEIGHT,\n WIDGET_MAX_HEIGHT,\n WIDGET_MIN_HEIGHT_FOR_LARGE_SCREENS,\n WIDGET_MIN_HEIGHT_FOR_SMALL_SCREENS,\n} from './Layout.constants';\n\nexport const LayoutContainer = css({\n borderRadius: '$primary',\n display: 'flex',\n flexDirection: 'column',\n overflow: 'hidden',\n boxShadow: '$mainContainer',\n});\n\nexport const Container = styled('div', {\n position: 'relative',\n width: '100vw',\n minWidth: '300px',\n maxWidth: '390px',\n backgroundColor: '$background',\n maxHeight: WIDGET_MAX_HEIGHT,\n variants: {\n height: {\n auto: {\n height: 'auto',\n },\n fixed: {\n height: '100%',\n minHeight: WIDGET_MIN_HEIGHT_FOR_SMALL_SCREENS,\n [`@media screen and (min-height: ${LARGE_SCREEN_MIN_HEIGHT})`]: {\n minHeight: WIDGET_MIN_HEIGHT_FOR_LARGE_SCREENS,\n },\n },\n },\n showBanner: {\n true: {\n overflow: 'visible',\n },\n },\n },\n});\n\nexport const Content = styled('div', {\n position: 'relative',\n overflow: 'hidden',\n flexGrow: 1,\n display: 'flex',\n flexDirection: 'column',\n padding: 0,\n overflowY: 'auto',\n});\n\nexport const Footer = styled('div', {\n padding: '0 $20 $10',\n '& .footer__alert': {\n paddingTop: '$10',\n },\n '& .footer__logo': {\n opacity: 0,\n transition: 'opacity 1s ease-in-out',\n '&.logo__show': {\n opacity: 1,\n },\n '&.logo__hidden': {\n visibility: 'hidden',\n },\n },\n});\n\nexport const BannerContainer = styled('div', {\n width: '100%',\n position: 'absolute',\n bottom: '-$10',\n transform: 'translateY(100%)',\n overflow: 'hidden',\n});\n", "import { styled } from '@rango-dev/ui';\n\nconst CONTENT_PADDING = '$20 $20 $10 $20';\n\nconst ScrollableArea = styled('div', {\n padding: CONTENT_PADDING,\n overflowY: 'auto',\n flexGrow: 1,\n});\n\nexport { ScrollableArea, CONTENT_PADDING };\n", "import { styled } from '@rango-dev/ui';\n\nconst PageContainer = styled('div', {\n display: 'flex',\n flexDirection: 'column',\n padding: '20px 20px 10px',\n flexGrow: 1,\n\n variants: {\n view: {\n true: {\n flexGrow: 1,\n overflow: 'hidden',\n },\n },\n compact: {\n true: {\n padding: 0,\n },\n },\n },\n});\n\nexport { PageContainer };\n", "import type { TokenData } from '../components/TokenList/TokenList.types';\nimport type { Token } from 'rango-sdk';\n\nimport { i18n } from '@lingui/core';\nimport { useState } from 'react';\n\nimport { httpService } from '../services/httpService';\nimport { useAppStore } from '../store/AppStore';\n\ntype ErrorType = 'duplicated' | 'not-found' | 'token-exist' | 'network-error';\n\nexport type CustomTokenError = {\n type: ErrorType;\n title: string;\n message: string;\n};\n\nexport interface UseFetchCustomToken {\n fetchCustomToken: ({\n blockchain,\n tokenAddress,\n }: {\n blockchain: string;\n tokenAddress: string;\n }) => Promise<void>;\n token: Token | null;\n loading: boolean;\n error: CustomTokenError | null;\n resetState: () => void;\n}\n\nexport function useFetchCustomToken(): UseFetchCustomToken {\n const [loading, setLoading] = useState(false);\n const [error, setError] = useState<CustomTokenError | null>(null);\n const [token, setToken] = useState<TokenData | null>(null);\n const { findToken } = useAppStore();\n const customTokens = useAppStore().customTokens();\n\n const resetState = () => {\n setToken(null);\n setLoading(false);\n setError(null);\n };\n\n function produceErrorMessage(\n type: ErrorType,\n blockchain?: string\n ): CustomTokenError {\n switch (type) {\n case 'duplicated':\n return {\n type,\n title: i18n.t('Duplicate Token'),\n message: i18n.t(\n 'The address you entered is duplicate, please enter a new address.'\n ),\n };\n case 'token-exist':\n return {\n type,\n title: i18n.t('Token Already Exists'),\n message: i18n.t(\n `There's no need to add this token again because it already exists and is supported by us.`\n ),\n };\n case 'not-found':\n return {\n type,\n title: i18n.t('Token Not Found'),\n message: i18n.t({\n id: 'Sorry, no token was found on {blockchain} chain with the provided address. please make sure you have entered the right token address.',\n values: {\n blockchain,\n },\n }),\n };\n case 'network-error':\n return {\n type,\n title: i18n.t('Network error'),\n message: i18n.t('An error occurred while retrieving token data.'),\n };\n }\n }\n\n const fetchCustomToken: UseFetchCustomToken['fetchCustomToken'] = async ({\n blockchain,\n tokenAddress,\n }) => {\n setLoading(true);\n try {\n // Check for duplicate token in customTokens\n const isDuplicate = customTokens.some(\n (token) => token.address?.toLowerCase() === tokenAddress.toLowerCase()\n );\n if (isDuplicate) {\n const errorMessage = produceErrorMessage('duplicated');\n setError(errorMessage);\n return;\n }\n\n const response = await httpService().getCustomToken({\n blockchain,\n address: tokenAddress,\n });\n\n if (!response || !response.token || response.error) {\n const errorMessage = produceErrorMessage('not-found', blockchain);\n setError(errorMessage);\n return;\n }\n\n // Check if token is already in the system\n const token = response.token;\n const isTokenFound = findToken({\n blockchain: token.blockchain,\n address: token.address,\n symbol: token.symbol,\n });\n if (isTokenFound) {\n const errorMessage = produceErrorMessage('token-exist');\n setError(errorMessage);\n return;\n }\n\n return setToken({ ...token, warning: true });\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n } catch (error: any) {\n if (error.code === 'ERR_BAD_REQUEST') {\n const errorMessage = produceErrorMessage('not-found', blockchain);\n setError(errorMessage);\n return;\n }\n setError(produceErrorMessage('network-error'));\n return;\n } finally {\n setLoading(false);\n }\n };\n return { fetchCustomToken, token, loading, error, resetState };\n}\n", "import type {\n ConfirmSwap,\n ConfirmSwapFetchResult,\n} from '../hooks/useConfirmSwap/useConfirmSwap.types';\n\nimport { i18n } from '@lingui/core';\nimport { useManager } from '@rango-dev/queue-manager-react';\nimport {\n Alert,\n Button,\n css,\n Divider,\n IconButton,\n styled,\n Typography,\n WalletIcon,\n} from '@rango-dev/ui';\nimport React, { useEffect, useLayoutEffect, useRef, useState } from 'react';\nimport { useNavigate } from 'react-router-dom';\n\nimport { ConfirmWalletsModal } from '../components/ConfirmWalletsModal/ConfirmWalletsModal';\nimport { RefreshButton } from '../components/HeaderButtons/RefreshButton';\nimport { Layout, PageContainer } from '../components/Layout';\nimport { QuoteWarningsAndErrors } from '../components/QuoteWarningsAndErrors';\nimport { navigationRoutes } from '../constants/navigationRoutes';\nimport { QuoteInfo } from '../containers/QuoteInfo';\nimport { useConfirmSwap } from '../hooks/useConfirmSwap';\nimport { useAppStore } from '../store/AppStore';\nimport { useQuoteStore } from '../store/quote';\nimport { useUiStore } from '../store/ui';\nimport { QuoteErrorType, QuoteWarningType } from '../types';\nimport { isQuoteWarningConfirmationRequired } from '../utils/quote';\nimport { joinList } from '../utils/ui';\n\nconst Buttons = styled('div', {\n width: '100%',\n display: 'flex',\n justifyContent: 'space-between',\n [`& ${IconButton}`]: {\n width: '$48',\n height: '$48',\n },\n});\n\nconst confirmBtnStyles = css({\n flexGrow: 1,\n paddingRight: '$10',\n});\n\nconst iconStyles = css({\n width: '$24',\n height: '$24',\n display: 'flex',\n justifyContent: 'center',\n alignItems: 'center',\n});\n\nconst descriptionStyles = css({\n display: 'flex',\n justifyContent: 'space-between',\n alignItems: 'center',\n});\n\nexport function ConfirmSwapPage() {\n //TODO: move component's logics to a custom hook\n const {\n selectedQuote,\n setInputAmount,\n selectedWallets,\n quoteWalletsConfirmed,\n customDestination,\n quoteWarningsConfirmed,\n } = useQuoteStore()();\n const navigate = useNavigate();\n const [dbErrorMessage, setDbErrorMessage] = useState<string>('');\n\n const showWalletsOnInit = !quoteWalletsConfirmed;\n const [showWallets, setShowWallets] = useState(false);\n const [isConfirming, setIsConfirming] = useState(false);\n const { isActiveTab } = useUiStore();\n const disabledLiquiditySources = useAppStore().getDisabledLiquiditySources();\n const prevDisabledLiquiditySources = useRef(disabledLiquiditySources);\n const { manager } = useManager();\n const {\n fetch: confirmSwap,\n loading: fetchingConfirmationQuote,\n cancelFetch,\n } = useConfirmSwap();\n const [confirmSwapResult, setConfirmSwapResult] =\n useState<ConfirmSwapFetchResult>({\n swap: null,\n error: null,\n warnings: null,\n });\n const [showQuoteWarningModal, setShowQuoteWarningModal] = useState(false);\n\n const onConfirmSwap: ConfirmSwap['fetch'] = async ({\n selectedWallets,\n customDestination,\n }) => {\n const result = await confirmSwap?.({ selectedWallets, customDestination });\n\n setConfirmSwapResult(result);\n return result;\n };\n\n const addNewSwap = async () => {\n if (confirmSwapResult.swap && quoteWalletsConfirmed) {\n try {\n await manager?.create(\n 'swap',\n { swapDetails: confirmSwapResult.swap },\n { id: confirmSwapResult.swap.requestId }\n );\n\n const swap_url = `../${navigationRoutes.swaps}/${confirmSwapResult.swap.requestId}`;\n navigate(swap_url, {\n replace: true,\n });\n setTimeout(() => {\n setInputAmount('');\n }, 0);\n } catch (e) {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n setDbErrorMessage('Error: ' + (e as any)?.message);\n }\n }\n };\n\n const onConfirm = async () => {\n setIsConfirming(true);\n await addNewSwap();\n setIsConfirming(false);\n };\n\n const onStartConfirmSwap = async () => {\n const shouldShowWarningModal =\n confirmSwapResult.warnings?.quote &&\n isQuoteWarningConfirmationRequired(confirmSwapResult.warnings.quote) &&\n !quoteWarningsConfirmed;\n\n if (shouldShowWarningModal) {\n setShowQuoteWarningModal(true);\n } else {\n await onConfirm();\n }\n };\n\n const onRefresh = async () => {\n setConfirmSwapResult({\n error: null,\n swap: null,\n warnings: null,\n });\n confirmSwap({ selectedWallets, customDestination })\n .then((res) => {\n setConfirmSwapResult(res);\n })\n .catch((error) => console.error(error));\n };\n\n useEffect(() => {\n const disabledLiquiditySourceReset =\n !!prevDisabledLiquiditySources.current.length &&\n !disabledLiquiditySources.length;\n if (disabledLiquiditySourceReset) {\n void onRefresh();\n }\n prevDisabledLiquiditySources.current = disabledLiquiditySources;\n }, [disabledLiquiditySources.length]);\n\n useEffect(() => {\n if (showWalletsOnInit) {\n cancelFetch();\n }\n }, [showWalletsOnInit]);\n\n useEffect(() => {\n if (showWalletsOnInit) {\n setShowWallets(showWalletsOnInit);\n }\n }, [showWalletsOnInit]);\n\n useEffect(() => {\n if (!showWalletsOnInit) {\n confirmSwap({ selectedWallets, customDestination })\n .then((result) => setConfirmSwapResult(result))\n .catch((error) => console.error(error));\n }\n }, []);\n\n useLayoutEffect(() => {\n if (!selectedQuote?.requestId) {\n navigate(`../${location.search}`);\n }\n }, [selectedQuote?.requestId]);\n\n const quoteWarning = confirmSwapResult.warnings?.quote ?? null;\n const quoteError = confirmSwapResult.error;\n const alerts = [];\n if (dbErrorMessage) {\n alerts.push(\n <Alert\n id=\"widget-confirm-swap-db-error-alert\"\n type=\"error\"\n variant=\"alarm\"\n title={dbErrorMessage}\n />\n );\n }\n\n if (quoteWarning || quoteError) {\n const settings_url = `../${navigationRoutes.settings}`;\n alerts.push(\n <QuoteWarningsAndErrors\n warning={quoteWarning}\n error={quoteError}\n couldChangeSettings={false}\n refetchQuote={onRefresh}\n skipAlerts={\n quoteError?.type === QuoteErrorType.INSUFFICIENT_SLIPPAGE ||\n quoteWarning?.type === QuoteWarningType.INSUFFICIENT_SLIPPAGE\n }\n showWarningModal={showQuoteWarningModal}\n confirmationDisabled={!isActiveTab}\n onOpenWarningModal={() => setShowQuoteWarningModal(true)}\n onCloseWarningModal={() => setShowQuoteWarningModal(false)}\n onConfirmWarningModal={async () => {\n setShowQuoteWarningModal(false);\n await addNewSwap();\n }}\n onChangeSettings={() => navigate(settings_url)}\n />\n );\n }\n\n return (\n <Layout\n header={{\n title: i18n.t('Confirm Swap'),\n onWallet: () => {\n const wallets_url = `../${navigationRoutes.wallets}`;\n navigate(wallets_url);\n },\n }}\n footer={\n <Buttons>\n <div className={confirmBtnStyles()}>\n <Button\n id=\"widget-confirm-swap-start-btn\"\n variant=\"contained\"\n type=\"primary\"\n size=\"large\"\n fullWidth\n loading={fetchingConfirmationQuote || isConfirming}\n disabled={!!confirmSwapResult.error || !isActiveTab}\n onClick={onStartConfirmSwap}>\n {i18n.t('Start Swap')}\n </Button>\n </div>\n <IconButton\n id=\"widget-confirm-swap-wallet-icon-btn\"\n variant=\"contained\"\n type=\"primary\"\n size=\"large\"\n loading={fetchingConfirmationQuote || isConfirming}\n disabled={!isActiveTab}\n onClick={setShowWallets.bind(null, true)}>\n <WalletIcon size={24} />\n </IconButton>\n </Buttons>\n }>\n {showWallets && (\n <ConfirmWalletsModal\n open={showWallets}\n onClose={() => setShowWallets(false)}\n onCancel={cancelFetch}\n loading={fetchingConfirmationQuote}\n onCheckBalance={onConfirmSwap}\n />\n )}\n\n <PageContainer>\n <div className={descriptionStyles()}>\n <Typography variant=\"title\" size=\"small\">\n {i18n.t('You get')}\n </Typography>\n <div className={iconStyles()}>\n <RefreshButton\n onClick={\n !fetchingConfirmationQuote &&\n !showWallets &&\n !showQuoteWarningModal\n ? onRefresh\n : undefined\n }\n />\n </div>\n </div>\n <Divider size=\"12\" />\n\n {joinList(\n alerts.map((alert, index) => ({\n element: alert,\n key: `alert-${index}`,\n })),\n <Divider size={10} />\n )}\n {alerts.length > 0 ? <Divider size={10} /> : null}\n\n <QuoteInfo\n quote={selectedQuote}\n type=\"swap-preview\"\n id=\"widget-confirm-swap-quote-container\"\n expanded\n tagHidden\n error={confirmSwapResult.error}\n loading={fetchingConfirmationQuote}\n warning={confirmSwapResult.warnings?.quote ?? null}\n />\n </PageContainer>\n </Layout>\n );\n}\n", "import type { PropTypes } from './ConfirmWalletsModal.types';\nimport type { ConnectedWallet } from '../../store/slices/wallets';\nimport type { Wallet } from '../../types';\n\nimport { i18n } from '@lingui/core';\nimport {\n Alert,\n BalanceErrors,\n Button,\n ChevronLeftIcon,\n Divider,\n MessageBox,\n Typography,\n} from '@rango-dev/ui';\nimport React, { useCallback, useEffect, useMemo, useState } from 'react';\nimport { useNavigate } from 'react-router-dom';\n\nimport { WIDGET_UI_ID } from '../../constants';\nimport { getQuoteErrorMessage } from '../../constants/errors';\nimport { useAppStore } from '../../store/AppStore';\nimport { useQuoteStore } from '../../store/quote';\nimport { getBlockchainShortNameFor } from '../../utils/meta';\nimport { isConfirmSwapDisabled } from '../../utils/swap';\nimport { getQuoteChains } from '../../utils/wallets';\nimport { WatermarkedModal } from '../common/WatermarkedModal';\nimport { CustomDestination } from '../CustomDestination/CustomDestination';\n\nimport {\n ConfirmButton,\n ListContainer,\n NavigateBack,\n ShowMoreHeader,\n Title,\n Wallets,\n WalletsContainer,\n walletsListStyles,\n} from './ConfirmWallets.styles';\nimport { WalletList } from './WalletList';\n\nconst NUMBER_OF_WALLETS_TO_DISPLAY = 2;\n\nexport function ConfirmWalletsModal(props: PropTypes) {\n //TODO: move component's logics to a custom hook\n const { open, onClose, onCancel, onCheckBalance, loading } = props;\n const navigate = useNavigate();\n const blockchains = useAppStore().blockchains();\n const {\n selectedQuote,\n setSelectedWallets: selectQuoteWallets,\n quoteWalletsConfirmed: quoteWalletsConfirmed,\n setQuoteWalletConfirmed: setQuoteWalletConfirmed,\n customDestination,\n setCustomDestination,\n } = useQuoteStore()();\n const { config, connectedWallets, setWalletsAsSelected } = useAppStore();\n\n const [showMoreWalletFor, setShowMoreWalletFor] = useState('');\n const [balanceWarnings, setBalanceWarnings] = useState<string[]>([]);\n const [error, setError] = useState('');\n\n const [isCustomDestinationOpen, setCustomDestinationOpen] = useState(\n !!customDestination\n );\n\n const quoteChains = useMemo(\n () =>\n getQuoteChains({\n filter: 'all',\n quote: selectedQuote,\n }),\n [selectedQuote]\n );\n\n const requiredChains = getQuoteChains({\n filter: 'required',\n quote: selectedQuote,\n });\n\n const lastStepToBlockchain = blockchains.find(\n (blockchain) =>\n blockchain.name ===\n selectedQuote?.swaps[selectedQuote?.swaps.length - 1]?.to.blockchain\n );\n const isWalletRequiredFor = (blockchain: string) =>\n requiredChains.includes(blockchain);\n\n const getInitialSelectableWallets = useCallback(\n () =>\n connectedWallets.filter((connectedWallet) => {\n return (\n connectedWallet.selected &&\n quoteChains.includes(connectedWallet.chain)\n );\n }),\n [connectedWallets, quoteChains]\n );\n\n const [selectableWallets, setSelectableWallets] = useState<ConnectedWallet[]>(\n getInitialSelectableWallets()\n );\n const [nextSelectedWallets, setNextSelectedWallets] = useState<\n {\n blockchain: string;\n walletType: string;\n }[]\n >([]);\n\n const addNextSelectedWallets = (blockchain: string, walletType: string) =>\n setNextSelectedWallets((prevState) =>\n prevState.concat({\n blockchain,\n walletType,\n })\n );\n\n const isInsufficientBalanceModalOpen = balanceWarnings.length > 0;\n\n const isSelected = (walletType: string, chain: string) =>\n !!selectableWallets.find(\n (selectableWallet) =>\n selectableWallet.walletType === walletType &&\n selectableWallet.chain === chain &&\n selectableWallet.selected &&\n (isWalletRequiredFor(chain) ||\n (!isWalletRequiredFor(chain) && !customDestination))\n );\n\n const updateSelectableWallets = (\n wallets: ConnectedWallet[],\n chainName: string,\n shouldSelect: boolean\n ) => {\n let isAnyWalletSelected = false;\n return wallets.map((wallet) => {\n if (wallet.chain === chainName) {\n let selected = wallet.selected;\n if (!isAnyWalletSelected && shouldSelect) {\n isAnyWalletSelected = true;\n selected = true;\n } else if (!shouldSelect) {\n selected = false;\n }\n return {\n ...wallet,\n selected,\n };\n }\n return wallet;\n });\n };\n\n const handleCustomDestinationCollapsibleOpenChange = (open: boolean) => {\n setCustomDestinationOpen(open);\n if (!open) {\n setCustomDestination('');\n setSelectableWallets((selectableWallets) => {\n return updateSelectableWallets(\n selectableWallets,\n lastStepToBlockchain?.name || '',\n true\n );\n });\n } else {\n if (!isWalletRequiredFor(lastStepToBlockchain?.name ?? '')) {\n setSelectableWallets((selectableWallets) => {\n return updateSelectableWallets(\n selectableWallets,\n lastStepToBlockchain?.name || '',\n false\n );\n });\n }\n }\n };\n\n const onChange = (wallet: Wallet) => {\n if (showMoreWalletFor) {\n setShowMoreWalletFor('');\n }\n const selected = isSelected(wallet.walletType, wallet.chain);\n if (selected) {\n return;\n }\n const connectedWallet = connectedWallets.find(\n (connectedWallet) =>\n connectedWallet.walletType === wallet.walletType &&\n connectedWallet.chain === wallet.chain\n );\n\n if (!connectedWallet) {\n return;\n }\n\n onCancel();\n if (\n wallet.chain === lastStepToBlockchain?.name &&\n isCustomDestinationOpen &&\n !isWalletRequiredFor(lastStepToBlockchain.name)\n ) {\n setCustomDestinationOpen(false);\n setCustomDestination(null);\n }\n setSelectableWallets((selectableWallets) =>\n selectableWallets\n .filter((selectableWallet) => selectableWallet.chain !== wallet.chain)\n .concat({ ...connectedWallet, selected: true })\n );\n };\n\n const onConfirmBalance = () => {\n const lastSelectedWallets = selectableWallets.filter(\n (wallet) => wallet.selected\n );\n setWalletsAsSelected(lastSelectedWallets);\n selectQuoteWallets(lastSelectedWallets);\n setQuoteWalletConfirmed(true);\n onClose();\n };\n\n const onConfirmWallets = async () => {\n setBalanceWarnings([]);\n setError('');\n\n const result = await onCheckBalance?.({\n selectedWallets: selectableWallets.filter((wallet) => wallet.selected),\n customDestination,\n });\n const warnings = result.warnings;\n if (warnings?.balance?.messages) {\n setBalanceWarnings(warnings.balance.messages);\n }\n\n if (result.error) {\n setError(getQuoteErrorMessage(result.error));\n }\n\n if (!result.error && (!warnings?.balance?.messages.length || 0 > 0)) {\n onConfirmBalance();\n } else {\n setBalanceWarnings(warnings?.balance?.messages ?? []);\n }\n };\n\n useEffect(() => {\n setSelectableWallets((selectableWallets) => {\n let nextState: typeof selectableWallets = [];\n\n //if wallet disconnected we should unselect the wallet from the list\n selectableWallets.forEach((selectableWallet) => {\n const walletDisconnected = !connectedWallets.some(\n (connectedWallet) =>\n connectedWallet.chain === selectableWallet.chain &&\n connectedWallet.walletType === selectableWallet.walletType &&\n connectedWallet.address === selectableWallet.address\n );\n if (!walletDisconnected) {\n nextState.push(selectableWallet);\n }\n });\n\n /**\n * We confirm if a newly connected wallet for a blockchain is marked as selected in the store,\n * but there are no selected wallets for that blockchain in our list.\n * If this condition is met, we include the wallet in our list as selected.\n */\n nextState = nextState.concat(\n connectedWallets.filter((connectedWallet) => {\n const anyWalletSelected = !!nextState.find(\n (selectableWallet) =>\n selectableWallet.chain === connectedWallet.chain\n );\n\n return (\n !anyWalletSelected &&\n connectedWallet.selected &&\n quoteChains.includes(connectedWallet.chain)\n );\n })\n );\n return nextState;\n });\n }, [connectedWallets, quoteChains]);\n\n useEffect(() => {\n const nextState: typeof nextSelectedWallets = [];\n\n if (nextSelectedWallets.length > 0) {\n nextSelectedWallets.forEach((selectedWallet) => {\n const wallet = connectedWallets.find(\n (wallet) =>\n wallet.chain === selectedWallet.blockchain &&\n wallet.walletType === selectedWallet.walletType\n );\n if (wallet) {\n onChange(wallet);\n } else {\n nextState.push(selectedWallet);\n }\n });\n setNextSelectedWallets(nextState);\n }\n }, [connectedWallets, nextSelectedWallets]);\n\n const modalContainer = document.getElementById(\n WIDGET_UI_ID.SWAP_BOX_ID\n ) as HTMLDivElement;\n\n return (\n <WatermarkedModal\n id=\"widget-confirm-wallets-modal\"\n open={open}\n onClose={() => {\n if (!quoteWalletsConfirmed) {\n const home = '../';\n navigate(home, { replace: true });\n }\n onClose();\n }}\n dismissible={!showMoreWalletFor}\n container={modalContainer}\n {...(!showMoreWalletFor && {\n styles: { container: { height: '100%' } },\n footer: (\n <ConfirmButton>\n <Button\n id=\"widget-confirm-wallet-modal-confirm-btn\"\n loading={loading}\n disabled={isConfirmSwapDisabled(\n loading,\n isCustomDestinationOpen,\n customDestination,\n selectedQuote,\n selectableWallets,\n lastStepToBlockchain\n )}\n onClick={onConfirmWallets}\n variant=\"contained\"\n type=\"primary\"\n fullWidth\n size=\"large\">\n {i18n.t('Confirm')}\n </Button>\n </ConfirmButton>\n ),\n })}\n {...(showMoreWalletFor && {\n styles: { container: { height: '100%', padding: '$0' } },\n header: (\n <ShowMoreHeader>\n <NavigateBack\n id=\"widget-confirm-wallet-modal-navigate-back-icon-btn\"\n variant=\"ghost\"\n onClick={setShowMoreWalletFor.bind(null, '')}>\n <ChevronLeftIcon size={16} />\n </NavigateBack>\n <Typography variant=\"headline\" size=\"small\">\n {i18n.t({\n id: 'Your {blockchainName} wallets',\n values: {\n blockchainName: getBlockchainShortNameFor(\n showMoreWalletFor,\n blockchains\n ),\n },\n })}\n </Typography>\n </ShowMoreHeader>\n ),\n })}\n anchor=\"center\">\n <WatermarkedModal\n id='\"widget-confirm-wallets-insufficient-account-balance-modal'\n open={isInsufficientBalanceModalOpen}\n onClose={setBalanceWarnings.bind(null, [])}\n container={modalContainer}>\n <MessageBox\n title={i18n.t('Insufficient account balance')}\n type=\"error\"\n description={<BalanceErrors messages={balanceWarnings ?? []} />}>\n <Button\n id=\"widget-confirm-wallet-modal-proceed-anyway-btn\"\n variant=\"outlined\"\n size=\"large\"\n type=\"primary\"\n fullWidth\n onClick={onConfirmBalance}>\n {i18n.t('Proceed anyway')}\n </Button>\n </MessageBox>\n </WatermarkedModal>\n {showMoreWalletFor && (\n <WalletsContainer>\n <div className={walletsListStyles()}>\n <WalletList\n chain={showMoreWalletFor}\n quoteChains={quoteChains}\n isSelected={isSelected}\n selectWallet={onChange}\n onShowMore={() => setShowMoreWalletFor(showMoreWalletFor)}\n onConnect={(walletType) => {\n addNextSelectedWallets(showMoreWalletFor, walletType);\n }}\n />\n </div>\n </WalletsContainer>\n )}\n {!showMoreWalletFor && (\n <>\n {error && (\n <>\n <Alert\n id=\"widget-confirm-wallet-modal-error-alert\"\n variant=\"alarm\"\n type=\"error\"\n title={i18n.t(error)}\n />\n <Divider size={12} />\n </>\n )}\n <Wallets>\n {quoteChains.map((requiredWallet, index) => {\n const blockchain = blockchains.find(\n (blockchain) => blockchain.name === requiredWallet\n );\n\n const key = `wallet-${index}`;\n const isLastWallet = index === quoteChains.length - 1;\n const showCustomDestination =\n isLastWallet &&\n lastStepToBlockchain &&\n config?.customDestination !== false;\n return (\n <div key={key}>\n <Title>\n <Typography variant=\"title\" size=\"xmedium\">\n {i18n.t({\n id: 'Your {blockchainName} wallets',\n values: { blockchainName: blockchain?.shortName },\n })}\n </Typography>\n <Typography\n variant=\"label\"\n color=\"$neutral700\"\n size=\"medium\">\n {i18n.t({\n id: 'You need to connect a {blockchainName} wallet.',\n values: { blockchainName: blockchain?.shortName },\n })}\n </Typography>\n </Title>\n <Divider size={24} />\n <ListContainer>\n <WalletList\n chain={requiredWallet}\n quoteChains={quoteChains}\n isSelected={isSelected}\n selectWallet={onChange}\n limit={NUMBER_OF_WALLETS_TO_DISPLAY}\n onShowMore={() =>\n setShowMoreWalletFor(blockchain?.name ?? '')\n }\n onConnect={(walletType) => {\n addNextSelectedWallets(requiredWallet, walletType);\n }}\n />\n </ListContainer>\n {!isLastWallet && <Divider size={32} />}\n {showCustomDestination && (\n <CustomDestination\n blockchain={lastStepToBlockchain}\n open={isCustomDestinationOpen}\n handleOpenChange={\n handleCustomDestinationCollapsibleOpenChange\n }\n />\n )}\n </div>\n );\n })}\n </Wallets>\n </>\n )}\n </WatermarkedModal>\n );\n}\n", "import type { PropTypes } from './CustomDestination.types';\nimport type { MouseEvent } from 'react';\n\nimport { i18n } from '@lingui/core';\nimport {\n Alert,\n ChevronDownIcon,\n CloseIcon,\n Divider,\n IconButton,\n PasteIcon,\n Typography,\n WalletIcon,\n} from '@rango-dev/ui';\nimport React, { useEffect, useRef } from 'react';\n\nimport { useAppStore } from '../../store/AppStore';\nimport { useQuoteStore } from '../../store/quote';\nimport {\n getBlockchainDisplayNameFor,\n isValidTokenAddress,\n} from '../../utils/meta';\nimport { CustomCollapsible } from '../CustomCollapsible/CustomCollapsible';\nimport { ExpandedIcon } from '../CustomCollapsible/CustomCollapsible.styles';\n\nimport {\n Container,\n CustomDestinationButton,\n StyledTextField,\n} from './CustomDestination.styles';\n\nexport function CustomDestination(props: PropTypes) {\n const { blockchain, handleOpenChange, open } = props;\n\n const { customDestination, setCustomDestination } = useQuoteStore()();\n const { config } = useAppStore();\n const blockchains = useAppStore().blockchains();\n const blockchainName = getBlockchainDisplayNameFor(\n blockchain.name,\n blockchains\n );\n const inputRef = useRef<HTMLInputElement | null>(null);\n const configDestination =\n config?.defaultCustomDestinations?.[blockchain.name];\n\n const isFirefox = navigator?.userAgent.includes('Firefox');\n const isAddressChecked = open && !!customDestination && blockchain;\n const isAddressInvalid =\n isAddressChecked && !isValidTokenAddress(blockchain, customDestination);\n const handleClear = () => {\n setCustomDestination('');\n };\n\n const handlePaste = async (event: MouseEvent<HTMLButtonElement>) => {\n event.preventDefault();\n if (navigator.clipboard !== undefined) {\n const pastedText = await navigator.clipboard.readText();\n setCustomDestination(pastedText);\n inputRef?.current?.focus();\n }\n };\n\n const renderSuffix = () => {\n if (customDestination) {\n return (\n <IconButton\n id=\"widget-custom-destination-close-icon-btn\"\n onClick={handleClear}\n variant=\"ghost\">\n <CloseIcon size={12} color=\"gray\" />\n </IconButton>\n );\n } else if (!isFirefox) {\n return (\n <IconButton\n id=\"widget-custom-destination-paste-icon-btn\"\n onClick={handlePaste}\n variant=\"ghost\">\n <PasteIcon size={16} />\n </IconButton>\n );\n }\n\n return null;\n };\n\n useEffect(() => {\n const shouldUseConfigDestination =\n !!configDestination && customDestination === null;\n\n if (shouldUseConfigDestination) {\n setCustomDestination(configDestination);\n handleOpenChange(true);\n }\n }, [configDestination]);\n\n return (\n <Container>\n <CustomCollapsible\n onOpenChange={handleOpenChange}\n hasSelected\n open={open}\n triggerAnchor=\"top\"\n trigger={\n <CustomDestinationButton id=\"widget-custom-destination-collapsible-btn\">\n <div className=\"button__content\">\n <WalletIcon size={18} color=\"info\" />\n <Divider size={4} direction=\"horizontal\" />\n <Typography\n variant=\"label\"\n size=\"medium\"\n color={open ? '$neutral600' : undefined}>\n {i18n.t('Send to a different address')}\n </Typography>\n </div>\n <ExpandedIcon orientation={open ? 'up' : 'down'}>\n <ChevronDownIcon size={10} color=\"secondary\" />\n </ExpandedIcon>\n </CustomDestinationButton>\n }\n onClickTrigger={() => handleOpenChange(!open)}>\n <StyledTextField\n id=\"widget-custom-destination-blockchain-address-input\"\n ref={inputRef}\n style={{\n padding: 0,\n paddingRight: customDestination ? '8px' : '5px',\n }}\n autoFocus={!customDestination}\n placeholder={i18n.t('Enter {blockchainName} address', {\n blockchainName,\n })}\n value={customDestination || ''}\n suffix={renderSuffix()}\n onChange={(e) => {\n const customDestination = e.target.value;\n setCustomDestination(customDestination);\n }}\n />\n </CustomCollapsible>\n\n {isAddressInvalid && (\n <>\n <Divider size={4} />\n <Alert\n variant=\"alarm\"\n type=\"error\"\n title={i18n.t({\n values: { destination: customDestination },\n id: \"Address {destination} doesn't match the blockchain address pattern.\",\n })}\n />\n </>\n )}\n </Container>\n );\n}\n", "import type { PropTypes } from './CustomCollapsible.types';\nimport type { PropsWithChildren } from 'react';\n\nimport React, { useRef } from 'react';\n\nimport {\n CollapsibleContent,\n CollapsibleRoot,\n Trigger,\n} from './CustomCollapsible.styles';\n\nexport function CustomCollapsible(props: PropsWithChildren<PropTypes>) {\n const {\n open,\n hasSelected,\n onOpenChange,\n children,\n onClickTrigger,\n trigger,\n triggerAnchor,\n } = props;\n const ref = useRef<HTMLDivElement | null>(null);\n\n return (\n <CollapsibleRoot\n ref={ref}\n className=\"collapsible_root\"\n selected={hasSelected && open}\n open={open}\n onOpenChange={onOpenChange}>\n {triggerAnchor === 'top' && (\n <Trigger className=\"collapsible_trigger\" onClick={onClickTrigger}>\n {trigger}\n </Trigger>\n )}\n <CollapsibleContent className=\"collapsible_content\" open={open}>\n {children}\n </CollapsibleContent>\n {triggerAnchor === 'bottom' && (\n <Trigger className=\"collapsible_trigger\" onClick={onClickTrigger}>\n {trigger}\n </Trigger>\n )}\n </CollapsibleRoot>\n );\n}\n", "import * as Collapsible from '@radix-ui/react-collapsible';\nimport { keyframes, styled } from '@rango-dev/ui';\n\nexport const EXPANDABLE_TRANSITION_DURATION = 300;\n\nconst slideDown = keyframes({\n from: {\n height: 0,\n },\n to: {\n height: 'var(--radix-collapsible-content-height)',\n },\n});\n\nconst slideUp = keyframes({\n from: {\n height: 'var(--radix-collapsible-content-height)',\n },\n to: {\n height: 0,\n },\n});\n\nexport const CollapsibleRoot = styled(Collapsible.Root, {\n borderRadius: '$sm',\n overflow: 'hidden',\n variants: {\n selected: {\n true: {\n outlineWidth: 1,\n outlineColor: '$secondary500',\n outlineStyle: 'solid',\n },\n },\n },\n});\n\nexport const Trigger = styled(Collapsible.Trigger, {\n padding: '$0',\n border: 'none',\n outline: 'none',\n width: '100%',\n backgroundColor: 'transparent',\n fontFamily: 'inherit',\n cursor: 'pointer',\n});\n\nexport const CollapsibleContent = styled(Collapsible.Content, {\n overflow: 'hidden',\n variants: {\n open: {\n true: {\n animation: `${slideDown} ${EXPANDABLE_TRANSITION_DURATION}ms ease-out`,\n },\n false: {\n animation: `${slideUp} ${EXPANDABLE_TRANSITION_DURATION}ms ease-out`,\n },\n },\n },\n});\n\nexport const ExpandedIcon = styled('div', {\n transition: `all ${EXPANDABLE_TRANSITION_DURATION}ms ease`,\n display: 'flex',\n alignItems: 'center',\n variants: {\n orientation: {\n down: {\n transform: 'rotate(0)',\n },\n up: {\n transform: 'rotate(180deg)',\n },\n },\n },\n});\n", "import { darkTheme, styled, TextField } from '@rango-dev/ui';\n\nexport const Container = styled('div', {\n padding: '$10 $0',\n '& .button__content': {\n display: 'flex',\n alignItems: 'center',\n },\n '& .alarms': { paddingTop: '$5' },\n '& .collapsible_content': {\n backgroundColor: '$neutral100',\n },\n '& .collapsible_root': {\n backgroundColor: '$neutral100',\n },\n '& input': {\n padding: '$15',\n },\n});\n\nexport const StyledTextField = styled(TextField, {\n backgroundColor: '$neutral100',\n});\n\nexport const CustomDestinationButton = styled('div', {\n width: '100%',\n borderRadius: '$sm',\n display: 'flex',\n padding: '$15',\n justifyContent: 'space-between',\n alignItems: 'center',\n $$color: '$colors$neutral100',\n [`.${darkTheme} &`]: {\n $$color: '$colors$neutral300',\n },\n backgroundColor: '$$color',\n borderBottomRightRadius: '0',\n borderBottomLeftRadius: '0',\n '&:focus-visible': {\n $$background: '$colors$secondary100',\n [`.${darkTheme} &`]: {\n $$background: '$colors$info700',\n },\n backgroundColor: '$$background',\n outline: 0,\n },\n});\n", "import { css, IconButton, SelectableWalletButton, styled } from '@rango-dev/ui';\n\nexport const Title = styled('div', {\n display: 'flex',\n flexDirection: 'column',\n justifyContent: 'center',\n alignItems: 'center',\n});\n\nexport const ListContainer = styled('div', {\n display: 'flex',\n justifyContent: 'space-evenly',\n alignItems: 'center',\n columnGap: '$5',\n rowGap: '$10',\n flexWrap: 'wrap',\n paddingTop: '$5',\n height: '100%',\n});\n\nexport const ShowMoreWallets = styled(SelectableWalletButton, {\n justifyContent: 'center',\n});\nexport const ShowMoreHeader = styled('div', {\n padding: '$20 $20 $15 $20',\n display: 'flex',\n justifyContent: 'center',\n alignItems: 'center',\n backgroundColor: '$neutral200',\n position: 'relative',\n width: '100%',\n});\n\nexport const NavigateBack = styled(IconButton, {\n position: 'absolute',\n left: '$20',\n});\n\nexport const WalletsContainer = styled('div', {\n paddingTop: '$20',\n});\n\nexport const walletsListStyles = css({\n display: 'flex',\n justifyContent: 'space-evenly',\n alignItems: 'center',\n gap: '$10',\n flexWrap: 'wrap',\n paddingTop: '$5',\n height: '100%',\n});\n\nexport const ConfirmButton = styled('div', {\n display: 'flex',\n});\n\nexport const Wallets = styled('div', { overflow: 'visible', width: '100%' });\n", "import type { PropTypes } from './WalletList.type';\nimport type { Wallet } from '../../types';\nimport type { ExtendedModalWalletInfo } from '../../utils/wallets';\n\nimport { i18n } from '@lingui/core';\nimport { warn } from '@rango-dev/logging-core';\nimport {\n Divider,\n makeInfo,\n SelectableWallet,\n Typography,\n WalletState,\n} from '@rango-dev/ui';\nimport React, { useEffect, useState } from 'react';\n\nimport { useWallets } from '../..';\nimport { WIDGET_UI_ID } from '../../constants';\nimport { useWalletList } from '../../hooks/useWalletList';\nimport { useAppStore } from '../../store/AppStore';\nimport { useUiStore } from '../../store/ui';\nimport { getBlockchainDisplayNameFor } from '../../utils/meta';\nimport {\n getAddress,\n getConciseAddress,\n isExperimentalChain,\n} from '../../utils/wallets';\nimport { WatermarkedModal } from '../common/WatermarkedModal';\nimport { StatefulConnectModal } from '../StatefulConnectModal';\nimport { ExperimentalChain } from '../WalletStatefulConnect';\nimport { ExperimentalChainStatus } from '../WalletStatefulConnect/ExperimentalChainStatus';\n\nimport { ShowMoreWallets } from './ConfirmWallets.styles';\n\nconst ACCOUNT_ADDRESS_MAX_CHARACTERS = 7;\nconst TIME_TO_CLOSE_MODAL = 3_000;\n\nexport function WalletList(props: PropTypes) {\n const { chain, quoteChains, isSelected, selectWallet, limit, onShowMore } =\n props;\n const isActiveTab = useUiStore.use.isActiveTab();\n\n const { blockchains, connectedWallets } = useAppStore();\n const [selectedWalletToConnect, setSelectedWalletToConnect] =\n useState<ExtendedModalWalletInfo>();\n const [experimentalChainWallet, setExperimentalChainWallet] =\n useState<Wallet | null>(null);\n const [showExperimentalChainModal, setShowExperimentalChainModal] =\n useState(false);\n const [addingExperimentalChainStatus, setAddingExperimentalChainStatus] =\n useState<'in-progress' | 'completed' | 'rejected' | null>(null);\n const { suggestAndConnect } = useWallets();\n const { list } = useWalletList({\n chain,\n });\n\n const [sortedList, setSortedList] = useState<ExtendedModalWalletInfo[]>(list);\n const numberOfSupportedWallets = list.length;\n const shouldShowMoreWallets = limit && numberOfSupportedWallets - limit > 0;\n\n const addExperimentalChain = async (wallet: Wallet) => {\n setShowExperimentalChainModal(false);\n setAddingExperimentalChainStatus('in-progress');\n try {\n await suggestAndConnect(wallet.walletType, wallet.chain);\n setAddingExperimentalChainStatus('completed');\n } catch {\n setAddingExperimentalChainStatus('rejected');\n }\n };\n\n useEffect(() => {\n setSortedList((sortedList) => {\n const selectedWalletIndex = list.findIndex((wallet) =>\n isSelected(wallet.type, chain)\n );\n\n if (shouldShowMoreWallets && selectedWalletIndex > 1) {\n return [list[selectedWalletIndex]].concat(\n list.filter((_, index) => index !== selectedWalletIndex)\n );\n }\n return sortedList.map(\n (sortedItem) =>\n list.find((listItem) => listItem.type === sortedItem.type) ??\n sortedItem\n );\n });\n }, [JSON.stringify(list)]);\n\n const modalContainer = document.getElementById(\n WIDGET_UI_ID.SWAP_BOX_ID\n ) as HTMLDivElement;\n\n useEffect(() => {\n let timeout: ReturnType<typeof setTimeout> | null = null;\n if (\n addingExperimentalChainStatus === 'completed' ||\n addingExperimentalChainStatus === 'rejected'\n ) {\n timeout = setTimeout(\n () => setAddingExperimentalChainStatus(null),\n TIME_TO_CLOSE_MODAL\n );\n }\n\n return () => {\n if (timeout) {\n clearTimeout(timeout);\n }\n };\n }, [addingExperimentalChainStatus]);\n\n return (\n <>\n {sortedList.slice(0, limit).map((wallet) => {\n const address = getAddress({\n connectedWallets,\n walletType: wallet.type,\n chain,\n });\n const isConnected =\n wallet.state === WalletState.CONNECTED ||\n wallet.state === WalletState.PARTIALLY_CONNECTED;\n const conciseAddress = address\n ? getConciseAddress(address, ACCOUNT_ADDRESS_MAX_CHARACTERS)\n : '';\n const isConnectedButDifferentThanTargetNamespace =\n isConnected && !!wallet.needsNamespace && !conciseAddress;\n\n const experimentalChain = isExperimentalChain(blockchains(), chain);\n\n const experimentalChainNotAdded = !connectedWallets.find(\n (connectedWallet) =>\n connectedWallet.walletType === wallet.type &&\n connectedWallet.chain === chain\n );\n\n const couldAddExperimentalChain =\n experimentalChain &&\n experimentalChainNotAdded &&\n wallet.state === WalletState.CONNECTED;\n\n const onSelectableWalletClick = async () => {\n const isDisconnected = wallet.state === WalletState.DISCONNECTED;\n\n if (isDisconnected || isConnectedButDifferentThanTargetNamespace) {\n setSelectedWalletToConnect(wallet);\n } else if (couldAddExperimentalChain) {\n setExperimentalChainWallet({\n walletType: wallet.type,\n chain,\n address: address ?? '',\n });\n setShowExperimentalChainModal(true);\n } else {\n selectWallet({\n walletType: wallet.type,\n chain,\n address: address ?? '',\n });\n }\n };\n\n const info = makeInfo(wallet.state);\n\n const getWalletDescription = () => {\n if (couldAddExperimentalChain) {\n return i18n.t({\n id: 'Add {chain} chain',\n values: { chain },\n });\n } else if (isConnectedButDifferentThanTargetNamespace) {\n return i18n.t('Chain not connected');\n } else if (conciseAddress) {\n return conciseAddress;\n }\n return info.description;\n };\n\n const getWalletDescriptionColor = () => {\n if (\n wallet.state === WalletState.CONNECTED ||\n wallet.state === WalletState.PARTIALLY_CONNECTED\n ) {\n if (isConnectedButDifferentThanTargetNamespace) {\n return 'neutral600';\n }\n return 'neutral700';\n }\n\n return info.color;\n };\n\n const blockchainDisplayName: string | undefined =\n experimentalChainWallet?.chain\n ? getBlockchainDisplayNameFor(\n experimentalChainWallet.chain,\n blockchains()\n )\n : undefined;\n return (\n <React.Fragment key={`${wallet.title}_${blockchainDisplayName}`}>\n {!!experimentalChainWallet && (\n <WatermarkedModal\n id=\"widget-wallets-list-watermarked-modal\"\n open={!!experimentalChainWallet && showExperimentalChainModal}\n container={modalContainer}\n onClose={() => {\n setExperimentalChainWallet(null);\n }}>\n <ExperimentalChain\n id=\"widget-wallets-list-experimental-chain-container\"\n displayName={blockchainDisplayName}\n onConfirm={() => {\n void addExperimentalChain(experimentalChainWallet);\n }}\n />\n </WatermarkedModal>\n )}\n {addingExperimentalChainStatus && (\n <WatermarkedModal\n id=\"widget-wallets-list-experimental-chain-watermarked-modal\"\n open={!!addingExperimentalChainStatus}\n onClose={setAddingExperimentalChainStatus.bind(null, null)}\n container={modalContainer}>\n <ExperimentalChainStatus\n status={addingExperimentalChainStatus}\n displayName={blockchainDisplayName}\n image={wallet.image}\n />\n <Divider direction=\"vertical\" size={32} />\n </WatermarkedModal>\n )}\n <SelectableWallet\n key={wallet.type}\n id=\"widget-wallets-list-selectable-wallet-btn\"\n description={getWalletDescription()}\n descriptionColor={getWalletDescriptionColor()}\n onClick={onSelectableWalletClick}\n selected={isSelected(wallet.type, chain)}\n disabled={!isActiveTab}\n {...wallet}\n />\n </React.Fragment>\n );\n })}\n <StatefulConnectModal\n id=\"widget-wallets-list-stateful-connect-modal\"\n wallet={selectedWalletToConnect}\n options={{ defaultSelectedChains: quoteChains || [chain] }}\n onClose={() => {\n setSelectedWalletToConnect(undefined);\n }}\n onConnect={() => {\n if (props.onConnect) {\n if (selectedWalletToConnect?.type) {\n props.onConnect(selectedWalletToConnect.type);\n } else {\n warn(\n new Error(\n \"The selected wallet hasn't been detected after the connection process finished. It usually shouldn't happen.\"\n )\n );\n }\n }\n }}\n />\n {shouldShowMoreWallets && (\n <ShowMoreWallets\n selected={false}\n onClick={onShowMore}\n id=\"widget-wallets-list-show-more-wallets-btn\">\n <Typography variant=\"label\" size=\"medium\">\n {i18n.t('Show more wallets')}\n <Typography variant=\"label\" size=\"medium\" color=\"$primary\">\n +{numberOfSupportedWallets - (limit ?? 0)}\n </Typography>\n </Typography>\n </ShowMoreWallets>\n )}\n </>\n );\n}\n", "import type { PropTypes } from './ExperimentalChainStatus.types';\n\nimport { Image, MessageBox } from '@rango-dev/ui';\nimport React from 'react';\n\nimport {\n LogoContainer,\n Spinner,\n WalletImageContainer,\n} from '../ConfirmWalletsModal/WalletList.styles';\n\nimport { generateMessageByStatus } from './ExperimentalChainStatus.helpers';\n\nexport function ExperimentalChainStatus(props: PropTypes) {\n const { status, displayName, image } = props;\n const data = generateMessageByStatus(status, displayName);\n const hasImage = status == 'in-progress';\n\n return (\n <MessageBox\n type={data.type}\n title={data.title}\n description={data.description}\n icon={\n hasImage ? (\n <LogoContainer>\n <WalletImageContainer>\n <Image src={image} size={45} />\n </WalletImageContainer>\n <Spinner />\n </LogoContainer>\n ) : undefined\n }\n />\n );\n}\n", "import { keyframes, styled } from '@rango-dev/ui';\n\nexport const LogoContainer = styled('div', {\n position: 'relative',\n});\n\nconst SpinAnimation = keyframes({\n '0%': {\n transform: 'rotate(0deg)',\n },\n '100%': {\n transform: 'rotate(360deg)',\n },\n});\n\nexport const Spinner = styled('div', {\n position: 'absolute',\n border: '2px solid rgba(0, 0, 0, 0.1)',\n borderTop: '2px solid $info500',\n borderRadius: '$lg',\n width: '$45',\n height: '$45',\n animation: `${SpinAnimation} 1s linear infinite`,\n top: 0,\n bottom: 0,\n right: 0,\n left: 0,\n});\n\nexport const WalletImageContainer = styled('div', {\n '& img': {\n borderRadius: '50%',\n },\n});\n", "import type { PropTypes } from './ExperimentalChainStatus.types';\nimport type { MessageType } from '@rango-dev/ui';\n\nimport { i18n } from '@lingui/core';\n\nexport function generateMessageByStatus(\n status: PropTypes['status'],\n blockchainDisplayName: string | undefined\n): {\n type: MessageType;\n title: string;\n description: string;\n} {\n switch (status) {\n case 'in-progress':\n return {\n type: 'loading',\n title: i18n.t({\n id: 'Add {blockchainDisplayName} Chain',\n values: { blockchainDisplayName },\n }),\n description: i18n.t({\n id: 'Please approve the experimental chain pop-up in your wallet.',\n values: { blockchainDisplayName },\n }),\n };\n case 'completed':\n return {\n type: 'success',\n title: i18n.t({\n id: '{blockchainDisplayName} Chain Added',\n values: { blockchainDisplayName },\n }),\n description: i18n.t({\n id: 'The {blockchainDisplayName} chain has been successfully added to your wallet.',\n values: { blockchainDisplayName },\n }),\n };\n case 'rejected':\n return {\n type: 'error',\n title: i18n.t('Request Rejected'),\n description: i18n.t({\n id: \"You've rejected adding {blockchainDisplayName} chain to your wallet.\",\n values: { blockchainDisplayName },\n }),\n };\n default:\n throw new Error(\n `Showing information about an experimentation chain status needs to be defined first. status: ${status}`\n );\n }\n}\n", "import type { ActionType } from './QuoteWarningsAndErrors.helpers';\nimport type { PropTypes } from './QuoteWarningsAndErrors.types';\n\nimport { i18n } from '@lingui/core';\nimport { Alert, Button, Divider, InfoIcon } from '@rango-dev/ui';\nimport React from 'react';\n\nimport { QuoteErrorType, QuoteWarningType } from '../../types';\nimport { NoResult } from '../NoResult';\n\nimport { HighValueLossWarningModal } from './HighValueLossWarningModal';\nimport {\n getRequiredSlippage,\n makeAlerts,\n} from './QuoteWarningsAndErrors.helpers';\nimport { Action, Alerts } from './QuoteWarningsAndErrors.styles';\nimport { SlippageWarningModal } from './SlippageWariningModal';\nimport { UnknownPriceWarningModal } from './UnknownPriceWarningModal';\n\nexport function QuoteWarningsAndErrors(props: PropTypes) {\n const {\n warning,\n error,\n couldChangeSettings,\n showWarningModal,\n confirmationDisabled,\n skipAlerts,\n refetchQuote,\n onOpenWarningModal,\n onCloseWarningModal,\n onConfirmWarningModal,\n onChangeSettings,\n onChangeSlippage,\n } = props;\n\n const warningModalHandlers = {\n confirmationDisabled,\n open: showWarningModal,\n onClose: onCloseWarningModal,\n onConfirm: onConfirmWarningModal,\n };\n\n const showNoResultMessage =\n error?.type === QuoteErrorType.NO_RESULT ||\n error?.type === QuoteErrorType.REQUEST_FAILED;\n\n const alertInfo = makeAlerts(\n warning,\n error?.type === QuoteErrorType.BRIDGE_LIMIT ||\n error?.type === QuoteErrorType.INSUFFICIENT_SLIPPAGE\n ? error\n : null\n );\n if (alertInfo && !couldChangeSettings) {\n alertInfo.action = null;\n }\n\n const showAlerts = !!alertInfo && !skipAlerts;\n\n const onclickActionButton = (action: ActionType) => {\n if (action === 'change-slippage') {\n const quoteError =\n error?.type === QuoteErrorType.BRIDGE_LIMIT ||\n error?.type === QuoteErrorType.INSUFFICIENT_SLIPPAGE\n ? error\n : null;\n const requestedSlippage = getRequiredSlippage(warning, quoteError);\n onChangeSlippage?.(requestedSlippage);\n } else if (action === 'change-settings') {\n onChangeSettings();\n }\n };\n\n return (\n <>\n {showNoResultMessage && (\n <>\n <Divider size={10} />\n <NoResult\n skipAlerts={skipAlerts}\n error={error}\n fetch={refetchQuote}\n />\n </>\n )}\n\n {showAlerts && (\n <Alerts>\n <Divider size={10} />\n <Alert\n id=\"widget-quote-warning-and-errors-alert\"\n title={alertInfo.title}\n type={alertInfo.alertType}\n variant=\"alarm\"\n {...(alertInfo.action === 'show-info' && {\n action: (\n <Action onClick={onOpenWarningModal}>\n <InfoIcon size={12} color=\"gray\" />\n </Action>\n ),\n })}\n {...((alertInfo.action === 'change-settings' ||\n alertInfo.action === 'change-slippage') && {\n action: (\n <Button\n id=\"widget-quote-warning-error-change-settings-btn\"\n size=\"xxsmall\"\n type={alertInfo.alertType}\n onClick={() => onclickActionButton(alertInfo.action)}>\n {alertInfo.actionButtonTitle || i18n.t('Change')}\n </Button>\n ),\n })}\n />\n </Alerts>\n )}\n\n {warning && (\n <>\n {warning.type === QuoteWarningType.HIGH_VALUE_LOSS && (\n <HighValueLossWarningModal\n {...warningModalHandlers}\n warning={warning}\n />\n )}\n\n {(warning.type === QuoteWarningType.HIGH_SLIPPAGE ||\n warning.type === QuoteWarningType.INSUFFICIENT_SLIPPAGE) && (\n <SlippageWarningModal {...warningModalHandlers} warning={warning} />\n )}\n\n {warning.type === QuoteWarningType.UNKNOWN_PRICE && (\n <UnknownPriceWarningModal\n {...warningModalHandlers}\n warning={warning}\n />\n )}\n </>\n )}\n </>\n );\n}\n", "import type { PropTypes } from './NoResult.types';\n\nimport {\n Alert,\n Button,\n Divider,\n NoRouteIcon,\n RefreshIcon,\n Typography,\n} from '@rango-dev/ui';\nimport React from 'react';\n\nimport { errorMessages } from '../../constants/errors';\nimport { useAppStore } from '../../store/AppStore';\n\nimport {\n makeInfo,\n NoRouteIconSize,\n NoRouteTitleSize,\n} from './NoResult.helpers';\nimport {\n Container,\n ErrorDescription,\n Footer,\n PrefixIcon,\n} from './NoResult.styles';\n\nexport function NoResult(props: PropTypes) {\n const { fetch, error, size = 'small', skipAlerts } = props;\n const disabledLiquiditySources = useAppStore().getDisabledLiquiditySources();\n const toggleAllLiquiditySources = useAppStore().toggleAllLiquiditySources;\n\n const swappers = useAppStore().swappers();\n const info = makeInfo(\n error,\n disabledLiquiditySources,\n () => toggleAllLiquiditySources(swappers, true),\n fetch\n );\n if (skipAlerts) {\n info.alert = null;\n }\n\n return (\n <Container id=\"widget-no-result-container\">\n <NoRouteIcon size={NoRouteIconSize[size]} color=\"gray\" />\n <Divider size={4} />\n <Typography variant=\"title\" size={NoRouteTitleSize[size]}>\n {errorMessages().noResultError.title}\n </Typography>\n {size === 'large' && <Divider size={4} />}\n {!!info.description && (\n <ErrorDescription size={size}>\n <Typography\n variant=\"body\"\n size=\"small\"\n align=\"center\"\n color=\"neutral700\">\n {info.description}\n </Typography>\n </ErrorDescription>\n )}\n <Divider size={size === 'large' ? '24' : '4'} />\n {!!info.alert && (\n <Footer size={size}>\n <Alert\n id=\"widget-no-result-alert\"\n type={info.alert.type}\n title={info.alert.text}\n titleAlign={'left'}\n action={\n info.alert.action && (\n <Button\n size=\"xsmall\"\n id=\"widget-no-result-alert-btn\"\n type={info.alert.type}\n prefix={\n <PrefixIcon>\n <RefreshIcon size={8} />\n </PrefixIcon>\n }\n onClick={info.alert.action.onClick}>\n {info.alert.action.title}\n </Button>\n )\n }\n variant=\"alarm\"\n />\n </Footer>\n )}\n </Container>\n );\n}\n", "import type { Info } from './NoResult.types';\nimport type { NoResultError, QuoteRequestFailed } from '../../types';\n\nimport { i18n } from '@lingui/core';\n\nimport { errorMessages } from '../../constants/errors';\nimport { QuoteErrorType } from '../../types';\n\nconst SMALL_NO_ROUTE__ICON_SIZE = 24;\nconst LARGE_NO_ROUTE_ICON_SIZE = 60;\n\nexport function makeInfo(\n error: NoResultError | QuoteRequestFailed | null,\n disabledLiquiditySources: string[],\n toggleAllLiquiditySources: (shouldReset: boolean) => void,\n refetchQuote: () => void\n): Info {\n if (error?.type === QuoteErrorType.REQUEST_FAILED) {\n return {\n alert: {\n type: 'warning',\n text: errorMessages().genericServerError,\n action: {\n onClick: refetchQuote,\n title: i18n.t('Retry'),\n },\n },\n description: '',\n };\n } else if (disabledLiquiditySources.length) {\n return {\n alert: {\n type: 'warning',\n text: errorMessages().liquiditySourcesError.title,\n action: {\n onClick: () => toggleAllLiquiditySources(true),\n title: i18n.t('Reset'),\n },\n },\n description: errorMessages().liquiditySourcesError.description,\n };\n } else if (\n error?.type === QuoteErrorType.NO_RESULT &&\n error.diagnosisMessage\n ) {\n return {\n alert: {\n type: 'error',\n text: error.diagnosisMessage,\n action: null,\n },\n description: '',\n };\n }\n return {\n alert: null,\n description: errorMessages().noResultError.description,\n };\n}\n\nexport enum NoRouteIconSize {\n small = SMALL_NO_ROUTE__ICON_SIZE,\n large = LARGE_NO_ROUTE_ICON_SIZE,\n}\n\nexport enum NoRouteTitleSize {\n small = 'small',\n large = 'medium',\n}\n", "import { styled } from '@rango-dev/ui';\n\nexport const Container = styled('div', {\n display: 'flex',\n flexDirection: 'column',\n alignItems: 'center',\n});\n\nexport const ErrorDescription = styled('div', {\n variants: {\n size: {\n small: {},\n large: {\n maxWidth: '316px',\n },\n },\n },\n});\n\nexport const Footer = styled('div', {\n variants: {\n size: {\n small: {\n width: '100%',\n },\n large: {},\n },\n },\n});\n\nexport const PrefixIcon = styled('div', {\n padding: '$6 $0',\n});\n", "import type { HighValueLossWarning } from '../../types';\n\nimport { i18n } from '@lingui/core';\nimport {\n Button,\n Divider,\n MessageBox,\n Typography,\n WarningIcon,\n} from '@rango-dev/ui';\nimport React from 'react';\n\nimport { errorMessages } from '../../constants/errors';\nimport {\n GAS_FEE_MAX_DECIMALS,\n GAS_FEE_MIN_DECIMALS,\n PERCENTAGE_CHANGE_MAX_DECIMALS,\n PERCENTAGE_CHANGE_MIN_DECIMALS,\n} from '../../constants/routing';\nimport { getContainer } from '../../utils/common';\nimport { numberToString } from '../../utils/numbers';\nimport { WatermarkedModal } from '../common/WatermarkedModal';\n\nimport { QuoteErrorsModalItem } from './QuoteErrorsModalItem';\nimport { Flex } from './QuoteWarningsAndErrors.styles';\n\ntype Props = {\n open: boolean;\n confirmationDisabled: boolean;\n onClose: () => void;\n onConfirm: () => void;\n warning: HighValueLossWarning;\n};\n\nexport function HighValueLossWarningModal(props: Props) {\n const { open, onClose, onConfirm, warning, confirmationDisabled } = props;\n const type = warning.warningLevel === 'high' ? 'error' : 'warning';\n\n const highValueLossData = [\n {\n title: i18n.t('Swapping'),\n value: numberToString(warning.inputUsdValue),\n },\n {\n title: i18n.t('Gas cost'),\n value: numberToString(\n warning.totalFee,\n GAS_FEE_MIN_DECIMALS,\n GAS_FEE_MAX_DECIMALS\n ),\n },\n {\n title: i18n.t('Receiving'),\n value: numberToString(warning.outputUsdValue),\n },\n {\n title: i18n.t('Price impact'),\n value: numberToString(\n warning.priceImpact,\n PERCENTAGE_CHANGE_MIN_DECIMALS,\n PERCENTAGE_CHANGE_MAX_DECIMALS\n ),\n valueColor: `${type}500`,\n },\n ];\n\n return (\n <WatermarkedModal\n id=\"widget-high-value-loss-warning-modal\"\n footer={\n <Button\n id=\"widget-high-value-loss-warning-modal-confirm-btn\"\n type=\"primary\"\n size=\"large\"\n prefix={<WarningIcon />}\n fullWidth\n disabled={confirmationDisabled}\n onClick={onConfirm}>\n {errorMessages().highValueLossError.confirmMessage}\n </Button>\n }\n open={open}\n onClose={onClose}\n container={getContainer()}>\n <MessageBox\n type={type}\n title={errorMessages().highValueLossError.impactTitle}\n description={errorMessages().highValueLossError.description}\n />\n\n <Flex>\n <Divider size=\"4\" />\n <Typography size=\"small\" variant=\"title\">\n {i18n.t('Details')}\n </Typography>\n <Flex>\n {highValueLossData.map((item, index) => {\n const key = index;\n return <QuoteErrorsModalItem key={key} {...item} />;\n })}\n </Flex>\n </Flex>\n </WatermarkedModal>\n );\n}\n", "import type { ModalContentData } from './QuoteWarningsAndErrors.types';\n\nimport { InfoIcon, Tooltip, Typography } from '@rango-dev/ui';\nimport React from 'react';\n\nimport { getContainer } from '../../utils/common';\n\nimport {\n Item,\n ValueContent,\n ValueTypography,\n} from './QuoteWarningsAndErrors.styles';\n\nconst VALUE_LENGTH_THRESHOLD = 35;\n\nexport function QuoteErrorsModalItem(props: ModalContentData) {\n const { title, value, valueColor } = props;\n const container = getContainer();\n\n return (\n <Item>\n <Typography size=\"medium\" variant=\"label\" className=\"_title\">\n {title}\n </Typography>\n <ValueContent>\n <ValueTypography\n size=\"large\"\n variant=\"label\"\n color={valueColor || 'foreground'}>\n {`${valueColor ? '%' : '$'}${value}`}\n </ValueTypography>\n {value.length > VALUE_LENGTH_THRESHOLD && (\n <Tooltip content={value} container={container}>\n <InfoIcon size={12} color=\"gray\" />\n </Tooltip>\n )}\n </ValueContent>\n </Item>\n );\n}\n", "import { Button, darkTheme, styled, Typography } from '@rango-dev/ui';\n\nexport const Alerts = styled('div', {\n width: '100%',\n});\n\nexport const Flex = styled('div', {\n display: 'flex',\n flexDirection: 'column',\n alignItems: 'flex-start',\n gap: '$5',\n width: '100%',\n});\n\nexport const Item = styled('div', {\n display: 'flex',\n padding: '$5 0',\n justifyContent: 'space-between',\n alignItems: 'center',\n width: '100%',\n '._title': {\n $$color: '$colors$neutral600',\n [`.${darkTheme} &`]: {\n $$color: '$colors$neutral700',\n },\n color: '$$color',\n },\n});\n\nexport const ValueContent = styled('div', {\n display: 'flex',\n justifyContent: 'center',\n alignItems: 'center',\n gap: '$2',\n});\n\nexport const ValueTypography = styled(Typography, {\n overflow: 'hidden',\n textOverflow: 'ellipsis',\n whiteSpace: 'nowrap',\n maxWidth: '250px',\n});\n\nexport const Action = styled('div', {\n padding: '$2',\n alignSelf: 'flex-start',\n cursor: 'pointer',\n});\n\nexport const SwapButton = styled(Button, {\n '& ._text': {\n gap: '$5',\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n },\n});\n", "import type {\n BridgeLimitError,\n InsufficientSlippageError,\n QuoteWarning,\n} from '../../types';\n\nimport { i18n } from '@lingui/core';\n\nimport { errorMessages } from '../../constants/errors';\nimport { QuoteErrorType, QuoteWarningType } from '../../types';\nimport { getPriceImpactLevel } from '../../utils/quote';\n\nexport type ActionType =\n | 'show-info'\n | 'change-settings'\n | 'change-slippage'\n | null;\n\nexport type AlertInfo = {\n alertType: 'error' | 'warning';\n title: string;\n action: ActionType;\n actionButtonTitle: string | null;\n};\n\nexport function makeAlerts(\n warning: QuoteWarning | null,\n error: BridgeLimitError | InsufficientSlippageError | null\n): AlertInfo | null {\n const alertInfo: AlertInfo = {\n alertType: 'warning',\n title: '',\n action: null,\n actionButtonTitle: null,\n };\n\n if (error) {\n alertInfo.alertType = 'error';\n if (error.type === QuoteErrorType.BRIDGE_LIMIT) {\n alertInfo.title = error.recommendation;\n }\n\n if (error.type === QuoteErrorType.INSUFFICIENT_SLIPPAGE) {\n alertInfo.title = i18n.t({\n id: 'You need to increase slippage to at least {minRequiredSlippage} for this route.',\n values: {\n minRequiredSlippage: error.minRequiredSlippage,\n },\n });\n alertInfo.action = 'change-slippage';\n alertInfo.actionButtonTitle = i18n.t('Increase');\n }\n\n return alertInfo;\n }\n if (warning) {\n switch (warning.type) {\n case QuoteWarningType.HIGH_VALUE_LOSS: {\n const warningLevel = getPriceImpactLevel(warning.priceImpact);\n if (warningLevel === 'high') {\n alertInfo.alertType = 'error';\n }\n alertInfo.action = 'show-info';\n alertInfo.title = errorMessages().highValueLossError.title;\n break;\n }\n case QuoteWarningType.EXCESSIVE_OUTPUT_AMOUNT_CHANGE: {\n alertInfo.title = i18n.t({\n id: 'Output amount changed by {percentageChange}% (${usdValueChange}).',\n values: {\n percentageChange: warning.percentageChange,\n usdValueChange: warning.usdValueChange,\n },\n });\n break;\n }\n case QuoteWarningType.UNKNOWN_PRICE: {\n alertInfo.title = errorMessages().unknownPriceError.title;\n break;\n }\n case QuoteWarningType.INSUFFICIENT_SLIPPAGE: {\n alertInfo.title = i18n.t({\n id: 'We recommend you to increase slippage to at least {minRequiredSlippage} for this route.',\n values: {\n minRequiredSlippage: warning.minRequiredSlippage,\n },\n });\n alertInfo.action = 'change-slippage';\n alertInfo.actionButtonTitle = i18n.t('Increase');\n\n break;\n }\n case QuoteWarningType.HIGH_SLIPPAGE: {\n alertInfo.title = i18n.t('Caution, your slippage is high.');\n alertInfo.action = 'change-settings';\n break;\n }\n\n default:\n break;\n }\n\n return alertInfo;\n }\n return null;\n}\n\nexport function getRequiredSlippage(\n warning: QuoteWarning | null,\n error: BridgeLimitError | InsufficientSlippageError | null\n) {\n if (error?.type === QuoteErrorType.INSUFFICIENT_SLIPPAGE) {\n return Number(error.minRequiredSlippage);\n }\n if (warning?.type === QuoteWarningType.INSUFFICIENT_SLIPPAGE) {\n return Number(warning.minRequiredSlippage);\n }\n return null;\n}\n", "import type {\n HighSlippageWarning,\n InsufficientSlippageWarning,\n} from '../../types';\n\nimport { i18n } from '@lingui/core';\nimport { Button, Divider, MessageBox, WarningIcon } from '@rango-dev/ui';\nimport React from 'react';\nimport { useNavigate } from 'react-router-dom';\n\nimport { navigationRoutes } from '../../constants/navigationRoutes';\nimport { QuoteWarningType } from '../../types';\nimport { getContainer } from '../../utils/common';\nimport { WatermarkedModal } from '../common/WatermarkedModal';\n\nimport { SwapButton } from './QuoteWarningsAndErrors.styles';\n\ntype PropsTypes = {\n open: boolean;\n confirmationDisabled: boolean;\n onClose: () => void;\n onConfirm: () => void;\n warning: InsufficientSlippageWarning | HighSlippageWarning;\n};\n\nexport function SlippageWarningModal(props: PropsTypes) {\n const { open, onClose, onConfirm, warning, confirmationDisabled } = props;\n const navigate = useNavigate();\n\n return (\n <WatermarkedModal\n id=\"widget-slippage-warning-modal\"\n anchor=\"bottom\"\n open={open}\n container={getContainer()}\n onClose={onClose}>\n <MessageBox\n type=\"warning\"\n title={\n warning.type === QuoteWarningType.HIGH_SLIPPAGE\n ? i18n.t('High slippage')\n : i18n.t('Low slippage')\n }\n description={\n warning.type === QuoteWarningType.HIGH_SLIPPAGE\n ? i18n.t(\n 'Caution, your slippage is high. Your trade may be front run.'\n )\n : i18n.t({\n id: 'We recommend you to increase slippage to at least {minRequiredSlippage} for this route.',\n values: {\n minRequiredSlippage: warning.minRequiredSlippage,\n },\n })\n }>\n <Divider size={18} />\n <Divider size={32} />\n <SwapButton\n id=\"widget-slippage-warning-modal-confirm-anyway-btn\"\n size=\"large\"\n type=\"primary\"\n variant=\"contained\"\n fullWidth\n disabled={confirmationDisabled}\n onClick={onConfirm}>\n <WarningIcon color=\"white\" size={16} />\n {i18n.t('Swap anyway')}\n </SwapButton>\n <Divider size={10} />\n <Button\n id=\"widget-slippage-warning-modal-change-slippage-btn\"\n size=\"large\"\n type=\"primary\"\n variant=\"outlined\"\n fullWidth\n disabled={confirmationDisabled}\n onClick={() => navigate('../' + navigationRoutes.settings)}>\n {i18n.t('Change Slippage')}\n </Button>\n </MessageBox>\n </WatermarkedModal>\n );\n}\n", "import type { UnknownPriceWarning } from '../../types';\n\nimport { Button, MessageBox, WarningIcon } from '@rango-dev/ui';\nimport React from 'react';\n\nimport { errorMessages } from '../../constants/errors';\nimport { getContainer } from '../../utils/common';\nimport { WatermarkedModal } from '../common/WatermarkedModal';\n\ntype Props = {\n open: boolean;\n confirmationDisabled: boolean;\n onClose: () => void;\n onConfirm: () => void;\n warning: UnknownPriceWarning;\n};\n\nexport function UnknownPriceWarningModal(props: Props) {\n const { open, onClose, onConfirm, confirmationDisabled } = props;\n return (\n <WatermarkedModal\n id=\"widget-unknown-price-warning-modal\"\n footer={\n <Button\n id=\"widget-unknown-price-warning-modal-confirm-btn\"\n type=\"primary\"\n size=\"large\"\n prefix={<WarningIcon />}\n fullWidth\n disabled={confirmationDisabled}\n onClick={onConfirm}>\n {errorMessages().unknownPriceError.confirmMessage}\n </Button>\n }\n open={open}\n onClose={onClose}\n container={getContainer()}>\n <MessageBox\n type=\"warning\"\n title={errorMessages().unknownPriceError.impactTitle}\n description={errorMessages().unknownPriceError.description}\n />\n </WatermarkedModal>\n );\n}\n", "import type { PropTypes } from './QuoteInfo.types';\n\nimport BigNumber from 'bignumber.js';\nimport React from 'react';\n\nimport { Quote } from '../../components/Quote';\nimport { QuoteSkeleton } from '../../components/QuoteSkeleton';\nimport { useQuoteStore } from '../../store/quote';\nimport { QuoteErrorType } from '../../types';\nimport { getUsdOutputFrom } from '../../utils/swap';\n\nimport { QuoteContainer } from './QuoteInfo.styles';\n\nexport function QuoteInfo(props: PropTypes) {\n const {\n quote,\n type,\n loading,\n error,\n warning,\n expanded = false,\n tagHidden,\n onClick,\n showModalFee,\n selected,\n id,\n onClickAllRoutes,\n fullExpandedMode = false,\n container,\n } = props;\n const { inputAmount, inputUsdValue } = useQuoteStore()();\n\n const outputAmount = !!quote?.outputAmount\n ? new BigNumber(quote?.outputAmount)\n : null;\n const outputUsdValue = quote ? getUsdOutputFrom(quote) : null;\n\n const noResult =\n error &&\n (error.type === QuoteErrorType.NO_RESULT ||\n error.type === QuoteErrorType.REQUEST_FAILED);\n\n const showQuote = !noResult && quote && !loading;\n\n if (loading) {\n return (\n <QuoteContainer>\n <QuoteSkeleton tagHidden={tagHidden} type={type} expanded={expanded} />\n </QuoteContainer>\n );\n }\n\n return showQuote ? (\n <QuoteContainer onClick={() => onClick?.(quote)} id={id}>\n <Quote\n quote={quote}\n error={error}\n container={container}\n showModalFee={showModalFee}\n warning={warning}\n tagHidden={tagHidden}\n selected={selected}\n type={type}\n expanded={expanded}\n onClickAllRoutes={onClickAllRoutes}\n fullExpandedMode={fullExpandedMode}\n input={{\n value: inputAmount,\n usdValue: inputUsdValue?.toString() ?? '',\n }}\n output={{\n value: outputAmount?.toString() ?? '',\n usdValue: outputUsdValue?.toString() ?? '',\n }}\n />\n </QuoteContainer>\n ) : null;\n}\n", "import type { QuoteProps } from './Quote.types';\nimport type { Step } from '@rango-dev/ui';\nimport type { SwapResult } from 'rango-sdk';\n\nimport { i18n } from '@lingui/core';\nimport {\n Alert,\n Divider,\n FullExpandedQuote,\n InfoIcon,\n NumericTooltip,\n QuoteTag,\n StepDetails,\n TokenAmount,\n Typography,\n useIsTruncated,\n} from '@rango-dev/ui';\nimport BigNumber from 'bignumber.js';\nimport React, { useRef, useState } from 'react';\n\nimport {\n GAS_FEE_MAX,\n ROUTE_TIME_MAX,\n SECONDS_IN_MINUTE,\n} from '../../constants/quote';\nimport {\n GAS_FEE_MAX_DECIMALS,\n GAS_FEE_MIN_DECIMALS,\n PERCENTAGE_CHANGE_MAX_DECIMALS,\n PERCENTAGE_CHANGE_MIN_DECIMALS,\n TOKEN_AMOUNT_MAX_DECIMALS,\n TOKEN_AMOUNT_MIN_DECIMALS,\n USD_VALUE_MAX_DECIMALS,\n USD_VALUE_MIN_DECIMALS,\n} from '../../constants/routing';\nimport {\n FooterAlert,\n FooterStepAlarm,\n} from '../../containers/QuoteInfo/QuoteInfo.styles';\nimport { useAppStore } from '../../store/AppStore';\nimport { QuoteErrorType, QuoteWarningType } from '../../types';\nimport { getContainer, getExpanded } from '../../utils/common';\nimport {\n getBlockchainShortNameFor,\n getSwapperDisplayName,\n} from '../../utils/meta';\nimport {\n numberToString,\n roundedSecondsToString,\n totalArrivalTime,\n} from '../../utils/numbers';\nimport {\n getPriceImpact,\n getPriceImpactLevel,\n sortTags,\n} from '../../utils/quote';\nimport { getTotalFeeInUsd, getUsdFeeOfStep } from '../../utils/swap';\n\nimport {\n AllRoutesButton,\n AmountText,\n BasicInfoOutput,\n Content,\n HorizontalSeparator,\n Line,\n QuoteContainer,\n stepsDetailsStyles,\n SummaryContainer,\n summaryHeaderStyles,\n summaryStyles,\n TagContainer,\n TokenNameText,\n UsdValueText,\n} from './Quote.styles';\nimport { QuoteCostDetails } from './QuoteCostDetails';\nimport { QuoteSummary } from './QuoteSummary';\nimport { QuoteTrigger } from './QuoteTrigger';\n\nexport function Quote(props: QuoteProps) {\n const {\n quote,\n input,\n output,\n error,\n warning,\n type,\n selected = false,\n tagHidden = true,\n showModalFee = true,\n onClickAllRoutes,\n fullExpandedMode = false,\n container: propContainer,\n } = props;\n const blockchains = useAppStore().blockchains();\n const { findToken } = useAppStore();\n const swappers = useAppStore().swappers();\n const { customSlippage, slippage } = useAppStore();\n const userSlippage = customSlippage || slippage;\n const [expanded, setExpanded] = useState(props.expanded);\n const quoteRef = useRef<HTMLButtonElement | null>(null);\n const roundedOutput = numberToString(\n output.value,\n TOKEN_AMOUNT_MIN_DECIMALS,\n TOKEN_AMOUNT_MAX_DECIMALS\n );\n const roundedOutputUsdValue = output.usdValue\n ? numberToString(\n output.usdValue,\n USD_VALUE_MIN_DECIMALS,\n USD_VALUE_MAX_DECIMALS\n )\n : '';\n const priceImpact = getPriceImpact(input.usdValue, output.usdValue ?? null);\n const percentageChange = numberToString(\n priceImpact,\n PERCENTAGE_CHANGE_MIN_DECIMALS,\n PERCENTAGE_CHANGE_MAX_DECIMALS\n );\n const priceImpactWarningLevel = getPriceImpactLevel(priceImpact ?? 0);\n\n const getQuoteSteps = (\n swaps: SwapResult[],\n internalSwap?: boolean\n ): Step[] => {\n return swaps.map((swap, index) => {\n let stepState: 'error' | 'warning' | undefined = undefined;\n const hasBridgeLimitError =\n error?.type === QuoteErrorType.BRIDGE_LIMIT &&\n error.swap.swapperId === swap.swapperId;\n\n const hasSlippageError =\n error?.type === QuoteErrorType.INSUFFICIENT_SLIPPAGE &&\n !!error.recommendedSlippages?.[index];\n\n const hasSlippageWarning =\n warning?.type === QuoteWarningType.INSUFFICIENT_SLIPPAGE &&\n !!warning.recommendedSlippages?.[index];\n\n const stepHasError = hasBridgeLimitError || hasSlippageError;\n const stepHasWarning = hasSlippageWarning;\n\n if (stepHasError) {\n stepState = 'error';\n } else if (stepHasWarning) {\n stepState = 'warning';\n }\n\n let alertTitle = stepHasError\n ? i18n.t('Slippage Error')\n : i18n.t('Slippage Warning');\n\n if (hasBridgeLimitError) {\n alertTitle = i18n.t('Bridge Limit Error');\n }\n\n return {\n swapper: {\n displayName: getSwapperDisplayName(swap.swapperId, swappers) ?? '',\n image: swap.swapperLogo,\n },\n from: {\n token: { displayName: swap.from.symbol, image: swap.from.logo },\n chain: {\n displayName:\n getBlockchainShortNameFor(swap.from.blockchain, blockchains) ??\n '',\n image: swap.from.blockchainLogo,\n },\n price: {\n value:\n index === 0 && !internalSwap\n ? numberToString(\n input.value,\n TOKEN_AMOUNT_MIN_DECIMALS,\n TOKEN_AMOUNT_MAX_DECIMALS\n )\n : numberToString(\n swap.fromAmount,\n TOKEN_AMOUNT_MIN_DECIMALS,\n TOKEN_AMOUNT_MAX_DECIMALS\n ),\n usdValue: numberToString(\n (swap.from.usdPrice ?? 0) * parseFloat(swap.fromAmount),\n USD_VALUE_MIN_DECIMALS,\n USD_VALUE_MAX_DECIMALS\n ),\n realValue: index === 0 ? input.value : swap.fromAmount,\n realUsdValue: new BigNumber(swap.from.usdPrice ?? 0)\n .multipliedBy(swap.fromAmount)\n .toString(),\n },\n },\n to: {\n token: { displayName: swap.to.symbol, image: swap.to.logo },\n chain: {\n displayName:\n getBlockchainShortNameFor(swap.to.blockchain, blockchains) || '',\n image: swap.to.blockchainLogo,\n },\n price: {\n value: numberToString(\n swap.toAmount,\n TOKEN_AMOUNT_MIN_DECIMALS,\n TOKEN_AMOUNT_MAX_DECIMALS\n ),\n usdValue: numberToString(\n (swap.to.usdPrice ?? 0) * parseFloat(swap.toAmount),\n USD_VALUE_MIN_DECIMALS,\n USD_VALUE_MAX_DECIMALS\n ),\n realValue: swap.toAmount,\n realUsdValue: new BigNumber(swap.to.usdPrice ?? 0)\n .multipliedBy(swap.toAmount)\n .toString(),\n },\n },\n state: stepState,\n alerts:\n stepHasError || stepHasWarning ? (\n <FooterStepAlarm dense={fullExpandedMode}>\n <Alert\n variant=\"alarm\"\n type={stepHasError ? 'error' : 'warning'}\n title={alertTitle}\n id=\"widget-quote-footer-step-alarm-alert\"\n footer={\n <FooterAlert>\n {hasBridgeLimitError && (\n <div>\n <Typography\n size=\"xsmall\"\n variant=\"body\"\n color=\"neutral900\">\n {error.fromAmountRangeError}\n </Typography>\n <Divider direction=\"vertical\" size={2} />\n <Typography\n size=\"xsmall\"\n variant=\"body\"\n className=\"from-amount-text\"\n color=\"neutral900\">\n {i18n.t({\n id: 'Yours: {amount} {symbol}',\n values: {\n amount: numberToString(\n swap.fromAmount,\n TOKEN_AMOUNT_MIN_DECIMALS,\n TOKEN_AMOUNT_MAX_DECIMALS\n ),\n symbol: swap?.from.symbol,\n },\n })}\n </Typography>\n </div>\n )}\n {(hasSlippageError || hasSlippageWarning) &&\n !hasBridgeLimitError && (\n <div>\n <Typography\n size=\"xsmall\"\n variant=\"body\"\n color=\"neutral900\">\n {i18n.t({\n id: 'Minimum suggested slippage: {minRequiredSlippage}',\n values: {\n ...(error?.type ===\n QuoteErrorType.INSUFFICIENT_SLIPPAGE && {\n minRequiredSlippage:\n error.recommendedSlippages?.[index],\n }),\n ...(warning?.type ===\n QuoteWarningType.INSUFFICIENT_SLIPPAGE && {\n minRequiredSlippage:\n warning.recommendedSlippages?.[index],\n }),\n },\n })}\n </Typography>\n <Divider direction=\"vertical\" size={2} />\n <Typography\n size=\"xsmall\"\n variant=\"body\"\n color=\"neutral900\">\n {i18n.t({\n id: 'Yours: {userSlippage}',\n values: {\n userSlippage,\n },\n })}\n </Typography>\n </div>\n )}\n </FooterAlert>\n }\n />\n </FooterStepAlarm>\n ) : undefined,\n time: roundedSecondsToString(swap.estimatedTimeInSeconds),\n fee: numberToString(\n getUsdFeeOfStep(swap, findToken),\n GAS_FEE_MIN_DECIMALS,\n GAS_FEE_MAX_DECIMALS\n ),\n internalSwaps: swap.internalSwaps\n ? getQuoteSteps(swap.internalSwaps)\n : undefined,\n };\n });\n };\n const steps = getQuoteSteps(quote?.swaps ?? []);\n\n const numberOfSteps = steps.length;\n const container = propContainer || getContainer();\n const sortedQuoteTags = sortTags(props.quote.tags || []);\n const showAllRoutesButton = !!onClickAllRoutes;\n const totalDurationSeconds = totalArrivalTime(quote?.swaps);\n const totalTime = roundedSecondsToString(totalDurationSeconds);\n const totalFee = getTotalFeeInUsd(quote?.swaps ?? [], findToken);\n const fee = numberToString(\n totalFee,\n GAS_FEE_MIN_DECIMALS,\n GAS_FEE_MAX_DECIMALS\n );\n\n const feeWarning = totalFee.gte(new BigNumber(GAS_FEE_MAX));\n const timeWarning =\n totalDurationSeconds / SECONDS_IN_MINUTE >= ROUTE_TIME_MAX;\n const inputValueRef = useRef<HTMLSpanElement | null>(null);\n const isInputValueTruncated = useIsTruncated(input.value, inputValueRef);\n const outputValueRef = useRef<HTMLSpanElement | null>(null);\n const isOutputValueTruncated = useIsTruncated(output.value, outputValueRef);\n const usdValueRef = useRef<HTMLSpanElement | null>(null);\n const isUsdValueTruncated = useIsTruncated(\n roundedOutputUsdValue,\n usdValueRef\n );\n\n const lastStep = steps[numberOfSteps - 1];\n const firstStep = steps[0];\n\n if (!firstStep || !lastStep) {\n return null;\n }\n\n return fullExpandedMode ? (\n <FullExpandedQuote\n selected={selected}\n fee={fee}\n time={totalTime}\n tooltipContainer={getExpanded()}\n steps={steps}\n tags={sortedQuoteTags}\n id=\"widget-quote-full-expanded-quote-container\"\n quoteCost={\n <QuoteCostDetails\n quote={quote}\n fullExpandedMode\n time={totalTime}\n fee={totalFee}\n feeWarning={feeWarning}\n timeWarning={timeWarning}\n showModalFee={showModalFee}\n steps={numberOfSteps}\n />\n }\n percentageChange={percentageChange}\n warningLevel={priceImpactWarningLevel}\n outputPrice={{\n value: roundedOutput,\n usdValue: roundedOutputUsdValue,\n realValue: output.value,\n realUsdValue: output.usdValue,\n }}\n />\n ) : (\n <SummaryContainer\n id=\"widget-quote-summary-container\"\n selected={selected}\n listItem={type === 'list-item'}\n basic={type === 'basic'}>\n <div className={summaryStyles()}>\n {!tagHidden && sortedQuoteTags.length ? (\n <>\n <TagContainer>\n {sortedQuoteTags.map((tag, index) => {\n const key = `${tag.value}_${index}`;\n return (\n <React.Fragment key={key}>\n <QuoteTag label={tag.label} value={tag.value} />\n <Divider size={4} direction=\"horizontal\" />\n </React.Fragment>\n );\n })}\n </TagContainer>\n <Line />\n {!showAllRoutesButton && <Divider size={4} />}\n </>\n ) : null}\n <div id=\"portal-root\" className={summaryHeaderStyles()}>\n <QuoteCostDetails\n quote={quote}\n time={totalTime}\n fee={totalFee}\n feeWarning={feeWarning}\n timeWarning={timeWarning}\n showModalFee={showModalFee}\n steps={numberOfSteps}\n />\n\n {showAllRoutesButton && (\n <AllRoutesButton\n onClick={(e) => {\n e.stopPropagation();\n onClickAllRoutes();\n }}\n id=\"widget-quote-all-routes-btn\"\n size=\"xxsmall\"\n type=\"secondary\"\n variant=\"default\"\n css={{\n paddingLeft: '$10',\n paddingRight: '$10',\n paddingTop: '$5',\n paddingBottom: '$5',\n }}>\n <Typography\n color=\"secondary\"\n variant=\"body\"\n size=\"xsmall\"\n className=\"allRoutesLabel\">\n {i18n.t('See All Routes')}\n </Typography>\n </AllRoutesButton>\n )}\n </div>\n {type === 'basic' && (\n <BasicInfoOutput>\n <AmountText ref={inputValueRef} size=\"small\" variant=\"body\">\n {input.value}\n </AmountText>\n {isInputValueTruncated && (\n <NumericTooltip\n content={input.value}\n container={container}\n open={!input.value ? false : undefined}>\n <InfoIcon size={12} color=\"gray\" />\n </NumericTooltip>\n )}\n <TokenNameText size=\"small\" variant=\"body\">\n {steps[0]?.from.token.displayName}\n </TokenNameText>\n <Typography size=\"small\" variant=\"body\">\n =\n </Typography>\n <AmountText ref={outputValueRef} size=\"small\" variant=\"body\">\n {output.value}\n </AmountText>\n {isOutputValueTruncated && (\n <NumericTooltip\n content={output.value}\n container={container}\n open={!output.value ? false : undefined}>\n <InfoIcon size={12} color=\"gray\" />\n </NumericTooltip>\n )}\n <TokenNameText size=\"small\" variant=\"body\">\n {lastStep?.to.token.displayName}\n </TokenNameText>\n <Divider size={2} direction=\"horizontal\" />\n <UsdValueText\n ref={usdValueRef}\n color=\"$neutral600\"\n size=\"xsmall\"\n variant=\"body\">\n {`($${roundedOutputUsdValue})`}\n </UsdValueText>\n {isUsdValueTruncated && (\n <NumericTooltip content={output.usdValue} container={container}>\n <InfoIcon size={12} color=\"gray\" />\n </NumericTooltip>\n )}\n </BasicInfoOutput>\n )}\n {type === 'list-item' && (\n <TokenAmount\n id=\"widget-quote-token-amount-container\"\n tooltipContainer={container}\n type=\"output\"\n direction=\"vertical\"\n price={{\n value: roundedOutput,\n usdValue: roundedOutputUsdValue,\n realValue: output.value,\n realUsdValue: output.usdValue,\n }}\n token={{\n displayName: lastStep.to.token.displayName,\n image: lastStep.to.token.image,\n }}\n chain={{ image: lastStep.to.chain.image }}\n percentageChange={percentageChange}\n warningLevel={priceImpactWarningLevel}\n />\n )}\n {type === 'swap-preview' && (\n <>\n <QuoteSummary\n from={firstStep.from}\n to={lastStep.to}\n percentageChange={percentageChange}\n warningLevel={priceImpactWarningLevel}\n />\n <Divider size={4} />\n </>\n )}\n </div>\n <QuoteContainer\n selected={selected}\n listItem={type === 'list-item'}\n open={expanded}\n className=\"quote_container\"\n onOpenChange={setExpanded}>\n <QuoteTrigger\n type={type}\n quoteRef={quoteRef}\n selected={selected}\n setExpanded={setExpanded}\n container={container}\n expanded={expanded}\n steps={steps}\n />\n <Content open={expanded}>\n <HorizontalSeparator />\n <div className={stepsDetailsStyles()}>\n {steps.map((step, index) => {\n const key = `item-${index}`;\n return (\n <StepDetails\n type=\"quote-details\"\n className=\"widget-quote-step-details-container\"\n key={key}\n tooltipContainer={container}\n step={step}\n hasSeparator={index !== steps.length - 1}\n state={step.state}\n />\n );\n })}\n </div>\n </Content>\n </QuoteContainer>\n </SummaryContainer>\n );\n}\n", "import { styled } from '@rango-dev/ui';\n\nexport const QuoteContainer = styled('div', {\n width: '100%',\n '& .position-top__skeleton': {\n paddingTop: '$10',\n },\n});\nexport const FooterStepAlarm = styled('div', {\n paddingBottom: '$15',\n '& .from-amount-text': {\n wordBreak: 'break-word',\n },\n variants: {\n dense: {\n true: {\n paddingBottom: 0,\n },\n },\n },\n});\n\nexport const FooterAlert = styled('div', {\n width: '100%',\n display: 'flex',\n});\n", "import * as Collapsible from '@radix-ui/react-collapsible';\nimport {\n Button,\n css,\n darkTheme,\n Image,\n styled,\n Typography,\n} from '@rango-dev/ui';\n\nimport { CollapsibleContent } from '../CustomCollapsible/CustomCollapsible.styles';\n\nexport const EXPANDABLE_QUOTE_TRANSITION_DURATION = 300;\n\nexport const QuoteContainer = styled(Collapsible.Root, {\n display: 'flex',\n flexDirection: 'column',\n alignItems: 'start',\n overflowX: 'auto',\n overflowY: 'hidden',\n width: '100%',\n borderRadius: '$xm',\n variants: {\n selected: {\n true: {},\n false: {\n $$color: '$colors$neutral400',\n [`.${darkTheme} &`]: {\n $$color: '$colors$neutral200',\n },\n backgroundColor: '$$color',\n },\n },\n listItem: {\n true: {\n $$color: '$colors$neutral400',\n [`.${darkTheme} &`]: {\n $$color: '$colors$neutral200',\n },\n backgroundColor: '$$color',\n },\n false: {},\n },\n },\n\n compoundVariants: [\n {\n listItem: false,\n selected: true,\n css: {\n $$color: '$colors$secondary200',\n [`.${darkTheme} &`]: {\n $$color: '$colors$secondary800',\n },\n backgroundColor: '$$color',\n },\n },\n ],\n});\n\nexport const stepsDetailsStyles = css({\n padding: '$10 $15',\n});\nexport const AllRoutesButton = styled(Button, {\n backgroundColor: 'transparent',\n border: '1px solid $secondary550',\n [`.${darkTheme} &`]: {\n border: '1px solid $secondary',\n },\n transition: 'background-color 0.3s ease',\n '&:hover': {\n backgroundColor: '$secondary550',\n [`.${darkTheme} &`]: {\n backgroundColor: '$secondary',\n },\n '.allRoutesLabel': {\n $$color: '$colors$background',\n [`.${darkTheme} &`]: {\n $$color: '$colors$foreground',\n },\n color: '$$color',\n transition: 'color 0.3s ease',\n },\n },\n});\nexport const SummaryContainer = styled('div', {\n borderRadius: '$xm',\n display: 'flex',\n flexDirection: 'column',\n alignItems: 'start',\n justifyContent: 'space-between',\n color: '$foreground',\n boxSizing: 'border-box',\n position: 'relative',\n variants: {\n selected: {\n true: {},\n false: {\n $$color: '$colors$neutral200',\n [`.${darkTheme} &`]: {\n $$color: '$colors$neutral500',\n },\n backgroundColor: '$$color',\n },\n },\n basic: { true: { borderTopRightRadius: '0', borderTopLeftRadius: '0' } },\n listItem: {\n true: {\n $$color: '$colors$neutral200',\n [`.${darkTheme} &`]: {\n $$color: '$colors$neutral500',\n },\n backgroundColor: '$$color',\n '&:hover': {\n '& .quote_container': {\n '& button': {\n backgroundColor: '$neutral500',\n [`.${darkTheme} &`]: {\n backgroundColor: '$neutral200',\n },\n },\n backgroundColor: '$neutral500',\n [`.${darkTheme} &`]: {\n backgroundColor: '$neutral200',\n },\n },\n backgroundColor: '$neutral300',\n [`.${darkTheme} &`]: {\n backgroundColor: '$neutral400',\n },\n },\n cursor: 'pointer',\n },\n false: {},\n },\n },\n\n compoundVariants: [\n {\n listItem: true,\n selected: true,\n css: {\n outline: '1px solid $secondary',\n },\n },\n {\n listItem: false,\n selected: true,\n css: {\n $$color: '$colors$secondary100',\n [`.${darkTheme} &`]: {\n $$color: '$colors$secondary550',\n },\n backgroundColor: '$$color',\n '&:hover': {\n backgroundColor: '$$color',\n },\n },\n },\n {\n listItem: true,\n selected: false,\n css: {\n cursor: 'pointer',\n '&:hover': {\n backgroundColor: '$neutral300',\n [`.${darkTheme} &`]: {\n backgroundColor: '$neutral400',\n },\n },\n },\n },\n ],\n});\n\nexport const summaryStyles = css({\n width: '100%',\n padding: '$15 $15 $10 $15',\n});\n\nexport const summaryHeaderStyles = css({\n display: 'flex',\n flexDirection: 'row',\n justifyContent: 'space-between',\n alignItems: 'center',\n paddingBottom: '$10',\n position: 'relative',\n});\n\nexport const rowStyles = css({\n display: 'flex',\n flexDirection: 'row',\n justifyContent: 'center',\n alignItems: 'center',\n '.blockchainImage': {\n marginLeft: '-$8',\n },\n});\n\nexport const Trigger = styled(Collapsible.Trigger, {\n display: 'flex',\n width: '100%',\n justifyContent: 'space-between',\n alignItems: 'center',\n height: '$36',\n padding: '$10 $15',\n boxSizing: 'border-box',\n cursor: 'pointer',\n border: 'none',\n outline: 'none',\n backgroundColor: 'transparent',\n variants: {\n error: {\n true: {\n [`& ${Image}`]: {\n border: '1px $warning500 solid',\n borderRadius: '100%',\n },\n },\n false: {\n [`& ${Image}`]: {\n border: '1px transparent solid',\n borderRadius: '100%',\n },\n },\n },\n selected: {\n true: {},\n false: {\n $$color: '$colors$neutral400',\n [`.${darkTheme} &`]: {\n $$color: '$colors$neutral200',\n },\n backgroundColor: '$$color',\n },\n },\n listItem: {\n true: {\n $$color: '$colors$neutral400',\n [`.${darkTheme} &`]: {\n $$color: '$colors$neutral200',\n },\n backgroundColor: '$$color',\n },\n false: {},\n },\n },\n\n compoundVariants: [\n {\n listItem: false,\n selected: true,\n css: {\n $$color: '$colors$secondary200',\n [`.${darkTheme} &`]: {\n $$color: '$colors$secondary800',\n },\n backgroundColor: '$$color',\n },\n },\n ],\n '.blockchains_section': {\n display: 'none',\n },\n '@xs': {\n '.blockchains_section': {\n display: 'block',\n },\n },\n});\n\nexport const ImageContainer = styled('div', {\n width: '18px',\n height: '18px',\n borderRadius: '100%',\n display: 'flex',\n justifyContent: 'center',\n alignItems: 'center',\n border: '1.5px transparent solid',\n img: {\n borderRadius: '100%',\n },\n variants: {\n state: {\n error: {\n borderColor: '$error500',\n },\n warning: { borderColor: '$warning500' },\n },\n },\n});\n\nexport const Content = styled(CollapsibleContent, {\n width: '100%',\n background: 'inherit',\n});\n\nexport const IconContainer = styled('div', {\n display: 'flex',\n justifyContent: 'center',\n alignItems: 'center',\n padding: '$2',\n transition: `all ${EXPANDABLE_QUOTE_TRANSITION_DURATION}ms ease`,\n variants: {\n orientation: {\n down: {\n transform: 'rotate(0)',\n },\n up: {\n transform: 'rotate(180deg)',\n },\n },\n },\n});\n\nexport const Separator = styled('div', {\n height: '$12',\n marginLeft: '$10',\n marginRight: '$10',\n borderLeft: '1px solid $foreground',\n});\n\nexport const HorizontalSeparator = styled('div', {\n display: 'flex',\n justifyContent: 'center',\n margin: '0 $15',\n borderTop: '1px solid',\n $$color: '$colors$neutral300',\n [`.${darkTheme} &`]: {\n $$color: '$colors$neutral400',\n },\n borderColor: '$$color',\n});\n\nexport const BasicInfoOutput = styled('div', {\n display: 'flex',\n flexDirection: 'row',\n alignItems: 'center',\n gap: '$2',\n flex: '1 1 auto',\n minWidth: 0,\n});\n\nexport const TokenNameText = styled(Typography, {\n overflow: 'hidden',\n textOverflow: 'ellipsis',\n whiteSpace: 'nowrap',\n maxWidth: '$30',\n});\n\nexport const AmountText = styled(Typography, {\n overflow: 'hidden',\n textOverflow: 'ellipsis',\n whiteSpace: 'nowrap',\n minWidth: 0,\n flex: '0 1 auto',\n});\n\nexport const MoreStep = styled('div', {\n width: '18px',\n height: '18px',\n borderRadius: '100%',\n backgroundColor: '$background',\n cursor: 'default',\n display: 'flex',\n justifyContent: 'center',\n alignItems: 'center',\n border: '1.5px transparent solid',\n variants: {\n state: {\n error: {\n borderColor: '$error500',\n },\n warning: { borderColor: '$warning500' },\n },\n },\n});\n\nexport const TagContainer = styled('div', {\n display: 'flex',\n});\n\nexport const Line = styled('div', {\n width: '100%',\n borderTopWidth: '1px',\n borderTopStyle: 'solid',\n borderTopColor: '$neutral',\n margin: '$5 0',\n [`.${darkTheme} &`]: {\n borderTopColor: '$neutral800',\n },\n});\n\nexport const UsdValueText = styled(Typography, {\n overflow: 'hidden',\n textOverflow: 'ellipsis',\n whiteSpace: 'nowrap',\n flex: '0 1 auto',\n minWidth: 0,\n flexShrink: 3,\n});\n", "import type { QuoteCostDetailsProps } from './Quote.types';\nimport type { NameOfFees } from '../../constants/quote';\nimport type BigNumber from 'bignumber.js';\n\nimport { i18n } from '@lingui/core';\nimport {\n ChevronDownIcon,\n CloseIcon,\n Divider,\n IconButton,\n NumericTooltip,\n QuoteCost,\n Typography,\n} from '@rango-dev/ui';\nimport React, { useState } from 'react';\n\nimport { getFeeLabel } from '../../constants/quote';\nimport {\n GAS_FEE_MAX_DECIMALS,\n GAS_FEE_MIN_DECIMALS,\n USD_VALUE_MAX_DECIMALS,\n USD_VALUE_MIN_DECIMALS,\n} from '../../constants/routing';\nimport { getContainer, getExpanded } from '../../utils/common';\nimport { numberToString } from '../../utils/numbers';\nimport { getFeesGroup, getTotalFeesInUsd, getUsdFee } from '../../utils/swap';\nimport { WatermarkedModal } from '../common/WatermarkedModal';\nimport { CustomCollapsible } from '../CustomCollapsible/CustomCollapsible';\nimport { ExpandedIcon } from '../CustomCollapsible/CustomCollapsible.styles';\n\nimport {\n FeeSection,\n Line,\n ModalContainer,\n ModalHeader,\n trigger,\n} from './QuoteCostDetails.styles';\n\nconst NonPayableFee = (props: { fee: BigNumber; label: string }) => {\n return !props.fee.isZero() ? (\n <FeeSection>\n <Typography variant=\"label\" size=\"medium\" color=\"neutral600\">\n {props.label}\n </Typography>\n <Typography variant=\"label\" size=\"medium\">\n $\n {numberToString(\n props.fee,\n USD_VALUE_MIN_DECIMALS,\n USD_VALUE_MAX_DECIMALS\n )}\n </Typography>\n </FeeSection>\n ) : null;\n};\n\nexport function QuoteCostDetails(props: QuoteCostDetailsProps) {\n const [open, setOpen] = useState<boolean>(false);\n const [openCollapse, setOpenCollapse] = useState<boolean>(false);\n const {\n steps,\n quote,\n fee,\n time,\n feeWarning,\n timeWarning,\n showModalFee,\n fullExpandedMode = false,\n } = props;\n const swaps = quote?.swaps ?? [];\n const container = fullExpandedMode ? getExpanded() : getContainer();\n\n const feesGroup = getFeesGroup(swaps);\n const roundedFee = numberToString(\n fee,\n GAS_FEE_MIN_DECIMALS,\n GAS_FEE_MAX_DECIMALS\n );\n\n return (\n <>\n <QuoteCost\n onClickFee={\n showModalFee\n ? (e) => {\n e.stopPropagation();\n setOpen(!open);\n }\n : undefined\n }\n fee={roundedFee}\n feeWarning={feeWarning}\n timeWarning={timeWarning}\n time={time}\n steps={steps}\n tooltipGas={showModalFee ? i18n.t('View more info') : undefined}\n tooltipContainer={container}\n />\n\n <WatermarkedModal\n id=\"widget-quote-cost-explanation-modal\"\n container={container}\n open={open}\n anchor={fullExpandedMode ? 'center' : 'bottom'}\n styles={{\n container: {\n maxWidth: fullExpandedMode ? '484px' : 'unset',\n },\n }}\n header={\n <ModalHeader\n style={{\n textAlign: fullExpandedMode ? 'left' : 'center',\n }}>\n <Typography variant=\"title\" size=\"medium\">\n {i18n.t('Gas & Fee Explanation')}\n </Typography>\n\n <IconButton\n id=\"widget-quote-cost-details-modal-close-icon-btn\"\n onClick={() => setOpen(false)}\n variant=\"ghost\">\n <CloseIcon color=\"gray\" size={14} />\n </IconButton>\n </ModalHeader>\n }\n onClose={() => {\n setOpen(false);\n }}>\n <ModalContainer>\n <Typography variant=\"title\" size=\"small\">\n {i18n.t('Details')}\n </Typography>\n <Divider size={10} />\n {Object.entries(feesGroup.payable).flatMap(\n ([payableFeesKey, feeArray]) =>\n feeArray.map((fee, index) => {\n const key = `payable-fee-${index}`;\n const usdValue = getUsdFee(fee);\n return (\n <FeeSection key={key}>\n <Typography\n variant=\"label\"\n size=\"medium\"\n color=\"neutral600\">\n {getFeeLabel(payableFeesKey as NameOfFees, i18n.t)}\n </Typography>\n <NumericTooltip content={fee.amount} container={container}>\n <Typography variant=\"label\" size=\"medium\">\n {numberToString(\n fee.amount,\n GAS_FEE_MIN_DECIMALS,\n GAS_FEE_MAX_DECIMALS\n )}\n {fee.asset.symbol} ($\n {numberToString(\n usdValue,\n USD_VALUE_MIN_DECIMALS,\n USD_VALUE_MAX_DECIMALS\n )}\n )\n </Typography>\n </NumericTooltip>\n </FeeSection>\n );\n })\n )}\n\n <FeeSection className=\"total_payable_fee\">\n <Typography variant=\"label\" size=\"medium\">\n {i18n.t('Total Payable Fee')}\n </Typography>\n <Typography variant=\"label\" size=\"medium\">\n $\n {numberToString(\n fee,\n USD_VALUE_MIN_DECIMALS,\n USD_VALUE_MAX_DECIMALS\n )}\n </Typography>\n </FeeSection>\n <Line />\n {!!Object.keys(feesGroup.nonePayable).length && (\n <CustomCollapsible\n triggerAnchor=\"bottom\"\n onClickTrigger={() => setOpenCollapse((prev) => !prev)}\n trigger={\n <div className={trigger()}>\n <Typography size=\"small\" variant=\"body\" color=\"neutral700\">\n {openCollapse\n ? i18n.t('Hide non-payable fees')\n : i18n.t('Show non-payable fees')}\n </Typography>\n <Divider size={4} direction=\"horizontal\" />\n <ExpandedIcon orientation={openCollapse ? 'up' : 'down'}>\n <ChevronDownIcon size={12} color=\"gray\" />\n </ExpandedIcon>\n </div>\n }\n open={openCollapse}>\n <Typography size=\"small\" variant=\"title\">\n {i18n.t('Description')}\n </Typography>\n <Divider size={4} />\n <Typography size=\"small\" variant=\"body\" color=\"neutral700\">\n {i18n.t(`The following fees are considered in the transaction output and\n you won\u2019t need to pay extra gas for them.`)}\n </Typography>\n <Divider size={10} />\n {Object.entries(feesGroup.nonePayable).map(\n ([nonPayableFeesKey, fees], index) => {\n const totalFeeInUsd = getTotalFeesInUsd(fees);\n const label = getFeeLabel(\n nonPayableFeesKey as NameOfFees,\n i18n.t\n );\n const key = `non-payable-fee-${index}`;\n return (\n <NonPayableFee\n key={key}\n fee={totalFeeInUsd}\n label={label}\n />\n );\n }\n )}\n\n <Line />\n </CustomCollapsible>\n )}\n </ModalContainer>\n </WatermarkedModal>\n </>\n );\n}\n", "import { css, styled } from '@rango-dev/ui';\n\nexport const FeeSection = styled('div', {\n display: 'flex',\n justifyContent: 'space-between',\n alignItems: 'center',\n padding: '$5 0',\n '&.total_payable_fee': {\n padding: '$12 0',\n },\n});\n\nexport const Line = styled('div', {\n width: '100%',\n borderTop: '1px solid $neutral300',\n margin: '$10 0',\n});\n\nexport const ModalContainer = styled('div', {\n padding: '$20 0',\n display: 'flex',\n flexDirection: 'column',\n '& .collapsible_trigger': {\n display: 'flex',\n alignItems: 'center',\n },\n});\n\nexport const ModalHeader = styled('div', {\n padding: '$20 $20 $10',\n position: 'relative',\n '._icon-button': {\n position: 'absolute',\n zIndex: 10,\n top: '$16',\n right: '$16',\n },\n});\nexport const trigger = css({\n display: 'flex',\n flexDirection: 'row',\n alignItems: 'center',\n padding: '$5',\n '&:hover': {\n '& ._typography, & svg': {\n color: '$secondary',\n },\n },\n});\n", "import type { PriceImpactWarningLevel, Step } from '@rango-dev/ui';\n\nimport { i18n } from '@lingui/core';\nimport { TokenAmount } from '@rango-dev/ui';\nimport React from 'react';\n\nimport { getContainer } from '../../utils/common';\n\nimport { Container, separatorStyles } from './QuoteSummary.styles';\n\ntype PropTypes = {\n from: Step['from'];\n to: Step['to'];\n percentageChange?: string | null;\n warningLevel: PriceImpactWarningLevel;\n};\n\nexport function QuoteSummary(props: PropTypes) {\n const { from, to, percentageChange, warningLevel } = props;\n\n return (\n <Container>\n <TokenAmount\n direction=\"horizontal\"\n label={i18n.t('Swap input')}\n id=\"widget-quote-summary-swap-input\"\n type=\"input\"\n tooltipContainer={getContainer()}\n price={{\n value: from.price.value,\n usdValue: from.price.usdValue,\n realValue: from.price.realValue,\n realUsdValue: from.price.realUsdValue,\n }}\n token={{\n displayName: from.token.displayName,\n image: from.token.image,\n }}\n chain={{ image: from.chain.image }}\n />\n <div className={separatorStyles()} />\n <TokenAmount\n id=\"widget-quote-summary-estimated-input\"\n direction=\"horizontal\"\n tooltipContainer={getContainer()}\n label={i18n.t('Estimated output')}\n type=\"output\"\n price={{\n value: to.price.value,\n usdValue: to.price.usdValue,\n realValue: to.price.realValue,\n realUsdValue: to.price.realUsdValue,\n }}\n token={{\n displayName: to.token.displayName,\n image: to.token.image,\n }}\n chain={{ image: to.chain.image }}\n percentageChange={percentageChange}\n warningLevel={warningLevel}\n />\n </Container>\n );\n}\n", "import { css, styled } from '@rango-dev/ui';\n\nexport const Container = styled('div', {\n position: 'relative',\n display: 'flex',\n flexDirection: 'column',\n width: '100%',\n});\n\nexport const separatorStyles = css({\n height: '14px',\n marginLeft: '14px',\n position: 'absolute',\n borderLeft: '1px solid $foreground',\n top: '42%',\n});\n", "import type { QuoteTriggerImagesProps, QuoteTriggerProps } from './Quote.types';\n\nimport { i18n } from '@lingui/core';\nimport {\n ChevronDownIcon,\n ChevronRightIcon,\n Divider,\n Image,\n Tooltip,\n Typography,\n} from '@rango-dev/ui';\nimport React from 'react';\n\nimport useScreenDetect from '../../hooks/useScreenDetect';\nimport { getContainer } from '../../utils/common';\nimport { getUniqueBlockchains } from '../../utils/quote';\n\nimport {\n IconContainer,\n ImageContainer,\n MoreStep,\n rowStyles,\n Trigger,\n} from './Quote.styles';\n\nconst MAX_STEPS = 4;\nconst MAX_BLOCKCHAINS = 6;\n\nconst ImageComponent = (props: QuoteTriggerImagesProps) => {\n const { content, src, className, open, state, container } = props;\n const tooltipContainer = container || getContainer();\n return (\n <Tooltip\n container={tooltipContainer}\n side=\"bottom\"\n sideOffset={4}\n open={open}\n content={content}>\n <ImageContainer className={className} state={state}>\n <Image src={src} size={16} />\n </ImageContainer>\n </Tooltip>\n );\n};\n\nexport function QuoteTrigger(props: QuoteTriggerProps) {\n const { quoteRef, selected, setExpanded, steps, expanded, type, container } =\n props;\n const tooltipContainer = container || getContainer();\n const numberOfSteps = steps.length;\n const blockchains = getUniqueBlockchains(steps);\n const { isTablet, isMobile } = useScreenDetect();\n\n return (\n <Trigger\n className=\"widget-quote-trigger-btn\"\n listItem={type === 'list-item'}\n ref={(ref) => (quoteRef.current = ref)}\n selected={selected}\n onClick={(e) => {\n e.stopPropagation();\n setExpanded((prevState) => !prevState);\n }}>\n <div className={rowStyles()}>\n <Typography variant=\"body\" size=\"xsmall\">\n {i18n.t('Via:')}\n </Typography>\n <Divider direction=\"horizontal\" size={4} />\n {steps.map((step, index) => {\n const key = `item-${index}`;\n const arrow = (\n <IconContainer>\n <ChevronRightIcon size={12} color=\"black\" />\n </IconContainer>\n );\n\n return isMobile || isTablet ? (\n <React.Fragment key={key}>\n <ImageComponent\n content={step.swapper.displayName}\n src={step.swapper.image ?? ''}\n state={step.state}\n container={container}\n />\n {index !== numberOfSteps - 1 && <>{arrow}</>}\n </React.Fragment>\n ) : (\n <React.Fragment key={key}>\n {numberOfSteps <= MAX_STEPS ||\n (numberOfSteps > MAX_STEPS && index < MAX_STEPS - 1) ? (\n <>\n <ImageComponent\n content={step.swapper.displayName}\n src={step.swapper.image ?? ''}\n state={step.state}\n container={container}\n />\n {index !== numberOfSteps - 1 && <>{arrow}</>}\n </>\n ) : (\n index === MAX_STEPS - 1 && (\n <Tooltip\n container={tooltipContainer}\n side=\"bottom\"\n align=\"end\"\n sideOffset={4}\n content={\n <div className={rowStyles()}>\n {arrow}\n {steps.map((step, i) => {\n const key = `image-${i}`;\n return (\n i >= index && (\n <React.Fragment key={key}>\n <ImageComponent\n content={step.swapper.displayName}\n src={step.swapper.image ?? ''}\n state={step.state}\n open={false}\n />\n {i !== numberOfSteps - 1 && <>{arrow}</>}\n </React.Fragment>\n )\n );\n })}\n </div>\n }>\n <MoreStep\n state={\n steps.find(\n (step, i) =>\n i >= index &&\n (step.state === 'error' || step.state === 'warning')\n )?.state\n }>\n <Typography size=\"xsmall\" variant=\"body\">\n +{numberOfSteps - index}\n </Typography>\n </MoreStep>\n </Tooltip>\n )\n )}\n </React.Fragment>\n );\n })}\n </div>\n <div className={rowStyles()}>\n <div className=\"blockchains_section\">\n <div className={rowStyles()}>\n <Typography variant=\"body\" size=\"xsmall\">\n {i18n.t('Chains:')}\n </Typography>\n <Divider direction=\"horizontal\" size={4} />\n {blockchains.map((blockchain, index) => (\n <React.Fragment key={blockchain.displayName}>\n {blockchains.length <= MAX_BLOCKCHAINS ||\n (blockchains.length > MAX_BLOCKCHAINS &&\n index < MAX_BLOCKCHAINS - 1) ? (\n <Tooltip\n container={tooltipContainer}\n side=\"bottom\"\n content={blockchain.displayName}\n sideOffset={4}>\n <ImageComponent\n content={''}\n src={blockchain.image ?? ''}\n open={false}\n className={index !== 0 ? 'blockchainImage' : ''}\n />\n </Tooltip>\n ) : (\n index === MAX_BLOCKCHAINS - 1 && (\n <Tooltip\n container={tooltipContainer}\n side=\"bottom\"\n align=\"end\"\n sideOffset={4}\n content={\n <div className={rowStyles()}>\n {blockchains.map(\n (chain, i) =>\n i >= index && (\n <ImageComponent\n key={chain.displayName}\n content={''}\n src={chain.image ?? ''}\n open={false}\n className={i > index ? 'blockchainImage' : ''}\n container={container}\n />\n )\n )}\n </div>\n }>\n <MoreStep className={'blockchainImage'}>\n <Typography size=\"xsmall\" variant=\"body\">\n +{blockchains.length - index}\n </Typography>\n </MoreStep>\n </Tooltip>\n )\n )}\n </React.Fragment>\n ))}\n\n <Divider direction=\"horizontal\" size={32} />\n </div>\n </div>\n\n <IconContainer orientation={expanded ? 'up' : 'down'}>\n <ChevronDownIcon size={12} color=\"black\" />\n </IconContainer>\n </div>\n </Trigger>\n );\n}\n", "import { useLayoutEffect, useState } from 'react';\n\n/*\n * mobile: screen <= 480\n * tablet: screen > 480 and screen <= 768\n * notebook: screen > 768 & screen <= 1024\n * large: screen > 1024 & screen <= 1200\n * extra large: screen > 1200\n */\n\nconst MIN_TABLET_WIDTH = 480;\nconst MIN_NOTEBOOK_WIDTH = 768;\nconst MIN_LARGE_SCREEN_WIDTH = 1024;\nconst MIN_EXTRA_LARGE_SCREEN_WIDTH = 1200;\n\nconst useScreenDetect = () => {\n const [isMobile, setIsMobile] = useState(false);\n const [isTablet, setIsTablet] = useState(false);\n const [isNotebook, setIsNotebook] = useState(false);\n const [isLargeScreen, setIsLargeScreen] = useState(false);\n const [isExtraLargeScreen, setIsExtraLargeScreen] = useState(false);\n\n const handleResize = () => {\n setIsMobile(window.innerWidth <= MIN_TABLET_WIDTH);\n setIsTablet(\n window.innerWidth > MIN_TABLET_WIDTH &&\n window.innerWidth <= MIN_NOTEBOOK_WIDTH\n );\n setIsNotebook(\n window.innerWidth > MIN_NOTEBOOK_WIDTH &&\n window.innerWidth <= MIN_LARGE_SCREEN_WIDTH\n );\n setIsLargeScreen(\n window.innerWidth > MIN_LARGE_SCREEN_WIDTH &&\n window.innerWidth <= MIN_EXTRA_LARGE_SCREEN_WIDTH\n );\n setIsExtraLargeScreen(window.innerWidth > MIN_EXTRA_LARGE_SCREEN_WIDTH);\n };\n\n useLayoutEffect(() => {\n handleResize(); // Initial check\n window.addEventListener('resize', handleResize);\n return () => window.removeEventListener('resize', handleResize);\n }, []);\n\n return {\n isMobile,\n isTablet,\n isNotebook,\n isLargeScreen,\n isExtraLargeScreen,\n };\n};\n\nexport default useScreenDetect;\n", "import type { PropTypes } from './QuoteSkeleton.types';\n\nimport { Divider, Skeleton } from '@rango-dev/ui';\nimport React from 'react';\n\nimport { Chains, Container, Steps } from './QuoteSkeleton.styles';\nimport { QuoteSummarySkeleton } from './QuoteSummarySkeleton';\nimport { StepSkeleton } from './StepSkeleton';\n\nexport function QuoteSkeleton(props: PropTypes) {\n const { type, expanded, tagHidden = false } = props;\n\n return (\n <Container expanded={expanded} rounded={type !== 'basic'}>\n <QuoteSummarySkeleton type={type} tagHidden={tagHidden} />\n <Chains>\n <Skeleton height={15} variant=\"rounded\" />\n </Chains>\n\n {expanded && (\n <Steps>\n <Divider size={24} />\n <StepSkeleton />\n <StepSkeleton />\n <StepSkeleton separator={false} />\n </Steps>\n )}\n </Container>\n );\n}\n", "import { darkTheme, styled } from '@rango-dev/ui';\n\nexport const Container = styled('div', {\n $$color: '$colors$neutral100',\n [`.${darkTheme} &`]: {\n $$color: '$colors$neutral300',\n },\n backgroundColor: '$$color',\n borderBottomLeftRadius: '$xm',\n borderBottomRightRadius: '$xm',\n padding: '$15',\n variants: {\n rounded: {\n true: {\n borderRadius: '$xm',\n },\n },\n expanded: {\n true: {\n paddingBottom: '3px',\n },\n false: {\n paddingBottom: '$12',\n },\n },\n },\n});\n\nexport const Chains = styled('div', {\n paddingTop: '$2',\n});\n\nexport const Steps = styled('div', {\n paddingLeft: '$8',\n});\n\nexport const StepSeparator = styled('div', {\n borderLeft: '1px dashed $foreground',\n minHeight: ' 0',\n margin: '0px 11.5px',\n alignSelf: 'stretch',\n variants: {\n hideSeparator: {\n true: {\n minHeight: 'unset',\n height: '0',\n },\n },\n },\n});\n", "import type { PropTypes } from './QuoteSummarySkeleton.types';\n\nimport { ChainToken, Divider, Skeleton } from '@rango-dev/ui';\nimport React from 'react';\n\nimport { Line } from '../Quote/Quote.styles';\n\nimport {\n BasicSummary,\n FlexContent,\n Output,\n OutputTokenInfo,\n QuoteSummary,\n QuoteSummarySeparator,\n RowStyle,\n SwapPreview,\n TokenAmount,\n TokenAmountLabel,\n} from './QuoteSummarySkeleton.styles';\n\nexport function QuoteSummarySkeleton(props: PropTypes) {\n const { type, tagHidden = true } = props;\n const quotePreview = (\n <QuoteSummary>\n <TokenAmount>\n <ChainToken loading size=\"medium\" />\n <Divider size={8} direction=\"horizontal\" />\n <TokenAmountLabel>\n <Skeleton height={10} width={60} variant=\"rounded\" />\n <Divider size={4} />\n <Skeleton height={15} variant=\"rounded\" />\n </TokenAmountLabel>\n </TokenAmount>\n <Skeleton height={12} width={64} variant=\"rounded\" />\n </QuoteSummary>\n );\n const showAllRoutesSkeleton = type === 'basic' && !tagHidden;\n\n return (\n <div>\n {!tagHidden && (\n <>\n <FlexContent>\n <Skeleton width={65} height={20} variant=\"rounded\" />\n <Divider size={4} direction=\"horizontal\" />\n <Skeleton width={65} height={20} variant=\"rounded\" />\n <Divider size={4} direction=\"horizontal\" />\n <Skeleton width={65} height={20} variant=\"rounded\" />\n </FlexContent>\n <Line />\n {!showAllRoutesSkeleton && <Divider size={4} />}\n </>\n )}\n <div className={RowStyle()}>\n <FlexContent>\n <Skeleton width={60} height={10} variant=\"rounded\" />\n <Divider size={4} direction=\"horizontal\" />\n <Skeleton width={60} height={10} variant=\"rounded\" />\n <Divider size={4} direction=\"horizontal\" />\n <Skeleton width={60} height={10} variant=\"rounded\" />\n </FlexContent>\n {showAllRoutesSkeleton && (\n <Skeleton width={85} height={24} variant=\"rounded\" />\n )}\n </div>\n\n {type === 'basic' && (\n <BasicSummary>\n <Skeleton height={15} width={148} variant=\"rounded\" />\n </BasicSummary>\n )}\n {type === 'list-item' && (\n <Output>\n <OutputTokenInfo>\n <ChainToken loading size=\"medium\" />\n <Divider direction=\"horizontal\" size={4} />\n <Skeleton height={15} width={150} variant=\"rounded\" />\n </OutputTokenInfo>\n <Divider size={10} />\n <Skeleton height={10} width={184} variant=\"rounded\" />\n </Output>\n )}\n {type === 'swap-preview' && (\n <>\n <Divider size={4} />\n <SwapPreview>\n {quotePreview}\n <QuoteSummarySeparator />\n {quotePreview}\n </SwapPreview>\n <Divider size={12} />\n </>\n )}\n </div>\n );\n}\n", "import { css, styled } from '@rango-dev/ui';\n\nexport const FlexContent = styled('div', {\n display: 'flex',\n});\n\nexport const BasicSummary = styled('div', {\n padding: '$10 $0 $20',\n});\n\nexport const Output = styled('div', {\n padding: '14px $0 $20 $0',\n display: 'flex',\n flexDirection: 'column',\n});\n\nexport const OutputTokenInfo = styled('div', {\n display: 'flex',\n justifyContent: 'start',\n alignItems: 'center',\n});\n\nexport const QuoteSummary = styled('div', {\n display: 'flex',\n justifyContent: 'space-between',\n alignItems: 'end',\n});\n\nexport const QuoteSummarySeparator = styled('div', {\n height: '$24',\n marginLeft: '13px',\n borderLeft: '1px solid $neutral700',\n});\n\nexport const TokenAmount = styled('div', {\n width: '65%',\n display: 'flex',\n justifyContent: 'start',\n});\n\nexport const TokenAmountLabel = styled('div', {\n display: 'flex',\n flexDirection: 'column',\n alignItems: 'start',\n flexGrow: 1,\n maxWidth: '148px',\n});\n\nexport const SwapPreview = styled('div', { padding: '$15 $0 $15 $0' });\n\nexport const RowStyle = css({\n display: 'flex',\n justifyContent: 'space-between',\n alignItems: 'center',\n});\n", "import type { PropTypes } from './StepSkeleton.types';\n\nimport { ChainToken, Divider, NextIcon, Skeleton } from '@rango-dev/ui';\nimport React from 'react';\n\nimport { StepSeparator } from './QuoteSkeleton.styles';\nimport {\n StepContent,\n StepIconContainer,\n StepTitle,\n StepTokenInfo,\n StepTokens,\n} from './StepSkeleton.styles';\n\nexport function StepSkeleton(props: PropTypes) {\n const { separator = true } = props;\n return (\n <>\n <StepTitle>\n <Skeleton height={22} width={22} variant=\"circular\" />\n <Divider direction=\"horizontal\" size={8} />\n <Skeleton height={15} width={148} variant=\"rounded\" />\n </StepTitle>\n <StepContent>\n <StepSeparator hideSeparator={!separator} />\n <StepTokens extraSpace={separator}>\n <StepTokenInfo>\n <ChainToken size=\"small\" loading />\n <Divider direction=\"horizontal\" size={8} />\n <Skeleton height={12} variant=\"rounded\" />\n </StepTokenInfo>\n <StepIconContainer>\n <NextIcon color=\"gray\" size={16} />\n </StepIconContainer>\n <StepTokenInfo>\n <ChainToken size=\"small\" loading />\n <Divider direction=\"horizontal\" size={8} />\n <Skeleton height={12} variant=\"rounded\" />\n </StepTokenInfo>\n </StepTokens>\n </StepContent>\n </>\n );\n}\n", "import { styled } from '@rango-dev/ui';\n\nexport const StepContent = styled('div', {\n display: 'flex',\n alignItems: 'start',\n});\n\nexport const StepTokens = styled('div', {\n flexGrow: 1,\n paddingTop: '$5',\n paddingBottom: '$10',\n display: 'flex',\n alignItems: 'center',\n variants: {\n extraSpace: {\n true: {\n paddingBottom: '$40',\n },\n },\n },\n});\n\nexport const StepTokenInfo = styled('div', {\n display: 'flex',\n alignItems: 'center',\n flexGrow: 1,\n});\n\nexport const StepIconContainer = styled('div', {\n margin: '$0 $2',\n padding: '$4',\n display: 'flex',\n justifyContent: 'center',\n alignItems: 'center',\n});\n\nexport const StepTitle = styled('div', {\n display: 'flex',\n alignItems: 'center',\n});\n", "import type { ConfirmSwap } from './useConfirmSwap.types';\nimport type { ConfirmRouteRequest } from 'rango-sdk';\n\nimport { warn } from '@rango-dev/logging-core';\nimport { calculatePendingSwap } from '@rango-dev/queue-manager-rango-preset';\nimport { useEffect } from 'react';\n\nimport { useAppStore } from '../../store/AppStore';\nimport { useQuoteStore } from '../../store/quote';\nimport {\n type PendingSwapSettings,\n QuoteErrorType,\n type SelectedQuote,\n} from '../../types';\nimport { getWalletsForNewSwap } from '../../utils/swap';\nimport { useFetchConfirmQuote } from '../useFetchConfirmQuote';\nimport { useSwapMode } from '../useSwapMode';\n\nimport {\n generateWarnings,\n handleQuoteErrors,\n throwErrorIfResponseIsNotValid,\n} from './useConfirmSwap.helpers';\n\nexport function useConfirmSwap(): ConfirmSwap {\n const {\n fromToken,\n toToken,\n inputAmount,\n inputUsdValue,\n setSelectedQuote,\n selectedQuote: initialQuote,\n customDestination: customDestinationFromStore,\n resetAlerts,\n } = useQuoteStore()();\n\n const { slippage, customSlippage } = useAppStore();\n const disabledLiquiditySources = useAppStore().getDisabledLiquiditySources();\n const blockchains = useAppStore().blockchains();\n const tokens = useAppStore().tokens();\n const { findToken } = useAppStore();\n const { swapMode } = useSwapMode();\n\n const userSlippage = customSlippage || slippage;\n\n const { fetch: fetchQuote, cancelFetch, loading } = useFetchConfirmQuote();\n\n useEffect(() => cancelFetch, []);\n\n const fetch: ConfirmSwap['fetch'] = async (params) => {\n const selectedWallets = params.selectedWallets;\n const customDestination =\n params?.customDestination ?? customDestinationFromStore;\n\n if (!fromToken || !toToken || !inputAmount) {\n return {\n quote: null,\n swap: null,\n error: null,\n warnings: null,\n };\n }\n\n const wallets = selectedWallets.reduce(\n (acc: Record<string, string>, item) => {\n acc[item.chain] = item.address;\n return acc;\n },\n {}\n );\n const requestBody: ConfirmRouteRequest = {\n requestId: initialQuote?.requestId || '',\n selectedWallets: wallets,\n destination: customDestination || undefined,\n };\n\n try {\n return await fetchQuote(requestBody, true).then((response) => {\n const { result } = response;\n\n if (!result) {\n throw new Error(response.error ?? 'Error fetching updated quote');\n }\n\n throwErrorIfResponseIsNotValid({\n diagnosisMessages: result.diagnosisMessages,\n requestId: result.requestId,\n swaps: result.result?.swaps,\n });\n\n const currentQuote: SelectedQuote = {\n outputAmount: result.result?.outputAmount,\n requestId: result.requestId,\n resultType: result.result?.resultType,\n swaps: result.result?.swaps || [],\n validationStatus: result.validationStatus,\n requestAmount: result.requestAmount,\n };\n setSelectedQuote(currentQuote);\n const swapSettings: PendingSwapSettings = {\n slippage: userSlippage.toString(),\n disabledSwappersGroups: disabledLiquiditySources,\n };\n\n const confirmSwapWarnings = generateWarnings({\n previousQuote: initialQuote ?? undefined,\n currentQuote,\n meta: { blockchains },\n selectedWallets,\n userSlippage,\n inputUsdValue,\n findToken,\n });\n\n resetAlerts();\n\n const proceedAnyway = !!confirmSwapWarnings.balance;\n\n const swap = calculatePendingSwap({\n inputAmount: inputAmount.toString(),\n bestRoute: result,\n wallets: getWalletsForNewSwap(selectedWallets),\n settings: swapSettings,\n validateBalanceOrFee: proceedAnyway ? false : true,\n meta: { blockchains, tokens },\n swapMode,\n });\n\n return {\n quote: currentQuote,\n swap,\n error: null,\n warnings: confirmSwapWarnings,\n };\n });\n } catch (error: unknown) {\n const quoteError = handleQuoteErrors(error);\n if (quoteError.type !== QuoteErrorType.REQUEST_CANCELED) {\n warn(new Error('confirm swap error'), {\n tags: {\n ...quoteError,\n type: QuoteErrorType[quoteError.type],\n initialQuote,\n requestBody,\n },\n });\n }\n return { swap: null, error: quoteError, warnings: null };\n }\n };\n\n return {\n loading,\n fetch,\n cancelFetch,\n };\n}\n", "import type { RequestOptions } from 'rango-sdk';\n\nimport { useRef, useState } from 'react';\n\ntype UseFetchOptions<TRequest, TResponse> = {\n request: (\n requestBody: TRequest,\n options?: RequestOptions\n ) => Promise<TResponse>;\n};\nexport type UseFetchResult<TRequest, TResponse> = {\n fetch: (requestBody: TRequest, retryOnFail?: boolean) => Promise<TResponse>;\n cancelFetch: () => void;\n loading: boolean;\n};\n\nconst RETRY_DELAY = 2_000;\n\nexport function useFetch<TRequest, TResponse>({\n request,\n}: UseFetchOptions<TRequest, TResponse>): UseFetchResult<TRequest, TResponse> {\n const [loading, setLoading] = useState(false);\n const abortController = useRef<AbortController | null>(null);\n\n const cancelFetch = () => abortController.current?.abort();\n\n const retryFetch = async (requestBody: TRequest) => {\n await new Promise((resolve) => setTimeout(resolve, RETRY_DELAY));\n return await fetch(requestBody, false);\n };\n\n const fetch: UseFetchResult<TRequest, TResponse>['fetch'] = async (\n requestBody,\n retryOnFail = false\n ) => {\n cancelFetch();\n abortController.current = new AbortController();\n\n setLoading(true);\n try {\n const res = await request(requestBody, {\n signal: abortController.current.signal,\n });\n\n abortController.current = null;\n return res;\n // eslint-disable-next-line no-useless-catch\n } catch (error) {\n if (retryOnFail) {\n return await retryFetch(requestBody);\n }\n throw error;\n } finally {\n setLoading(false);\n }\n };\n\n return { fetch, loading, cancelFetch };\n}\n", "import type { UseFetchResult } from './useFetch';\nimport type { ConfirmRouteRequest, ConfirmRouteResponse } from 'rango-sdk';\n\nimport { httpService } from '../services/httpService';\n\nimport { useFetch } from './useFetch';\n\nexport function useFetchConfirmQuote(): UseFetchResult<\n ConfirmRouteRequest,\n ConfirmRouteResponse\n> {\n const { fetch, loading, cancelFetch } = useFetch<\n ConfirmRouteRequest,\n ConfirmRouteResponse\n >({\n request: async (requestBody, options) =>\n await httpService().confirmRoute(requestBody, options),\n });\n\n return { fetch, loading, cancelFetch };\n}\n", "import type { ConfirmSwapFetchResult } from './useConfirmSwap.types';\nimport type { FindToken } from '../../store/slices/data';\nimport type {\n ConfirmSwapWarnings,\n QuoteErrorResponse,\n QuoteResponse,\n SelectedQuote,\n Wallet,\n} from '../../types';\nimport type BigNumber from 'bignumber.js';\nimport type { BlockchainMeta, SwapResult } from 'rango-sdk';\n\nimport { errorMessages } from '../../constants/errors';\nimport { QuoteErrorType } from '../../types';\nimport { generateQuoteWarnings } from '../../utils/quote';\nimport {\n checkSlippageErrors,\n generateBalanceWarnings,\n getLimitErrorMessage,\n getMinRequiredSlippage,\n hasLimitError,\n} from '../../utils/swap';\n\n/**\n * A request can be successful but in body of the response, it can be some case which is considered as failed.\n */\nexport function throwErrorIfResponseIsNotValid(response: QuoteResponse) {\n if (!response.swaps) {\n throw new Error(errorMessages().noResultError.title, {\n cause: {\n type: QuoteErrorType.NO_RESULT,\n diagnosisMessage: response.diagnosisMessages?.[0],\n },\n });\n }\n const quoteError = getQuoteError(response.swaps);\n if (quoteError) {\n throw new Error(quoteError.message, {\n cause: quoteError.options,\n });\n }\n}\n\nexport function getQuoteError(swaps: SwapResult[]): QuoteErrorResponse | null {\n const limitError = hasLimitError(swaps);\n if (limitError) {\n const { swap, fromAmountRangeError, recommendation } =\n getLimitErrorMessage(swaps);\n if (!swap) {\n return null;\n }\n return {\n message: 'bridge limit error',\n options: {\n type: QuoteErrorType.BRIDGE_LIMIT,\n swap,\n recommendation,\n fromAmountRangeError,\n },\n };\n }\n\n const recommendedSlippages = checkSlippageErrors(swaps);\n\n if (recommendedSlippages) {\n const minRequiredSlippage = getMinRequiredSlippage(swaps);\n return {\n message: '',\n options: {\n type: QuoteErrorType.INSUFFICIENT_SLIPPAGE,\n recommendedSlippages,\n minRequiredSlippage,\n },\n };\n }\n return null;\n}\n\nexport function generateWarnings(params: {\n currentQuote: SelectedQuote;\n previousQuote?: SelectedQuote;\n meta: { blockchains: BlockchainMeta[] };\n selectedWallets: Wallet[];\n userSlippage: number;\n inputUsdValue: BigNumber | null;\n findToken: FindToken;\n}): ConfirmSwapWarnings {\n const {\n currentQuote,\n previousQuote,\n meta,\n selectedWallets,\n userSlippage,\n findToken,\n } = params;\n\n const output: ConfirmSwapWarnings = {\n quote: null,\n balance: null,\n };\n\n const quoteWarning = generateQuoteWarnings({\n previousQuote,\n currentQuote,\n findToken,\n userSlippage,\n });\n\n if (quoteWarning) {\n output.quote = quoteWarning;\n }\n\n const balanceWarnings = generateBalanceWarnings(\n currentQuote,\n selectedWallets,\n meta.blockchains\n );\n\n const enoughBalance = balanceWarnings.length === 0;\n\n if (!enoughBalance) {\n output.balance = {\n messages: balanceWarnings,\n };\n }\n\n return output;\n}\n\nexport function handleQuoteErrors(\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n error: any\n): NonNullable<ConfirmSwapFetchResult['error']> {\n if (error?.code === 'ERR_CANCELED') {\n return {\n type: QuoteErrorType.REQUEST_CANCELED,\n };\n }\n\n if (error.cause) {\n return error.cause;\n }\n\n if (error?.code === 'ERR_BAD_REQUEST') {\n return {\n type: QuoteErrorType.NO_RESULT,\n diagnosisMessage: error.response.data.error,\n };\n }\n\n return {\n type: QuoteErrorType.REQUEST_FAILED,\n diagnosisMessage: error.message,\n };\n}\n", "import type { Token } from 'rango-sdk';\n\nimport { i18n } from '@lingui/core';\nimport {\n Button,\n CustomTokensZeroStateDarkIcon,\n CustomTokensZeroStateIcon,\n DeleteIcon,\n Divider,\n IconButton,\n MessageBox,\n NotFound,\n styled,\n} from '@rango-dev/ui';\nimport React, { useState } from 'react';\nimport { useNavigate } from 'react-router-dom';\n\nimport { WatermarkedModal } from '../components/common/WatermarkedModal';\nimport { Layout, PageContainer } from '../components/Layout';\nimport { SearchInput } from '../components/SearchInput';\nimport { TokenList } from '../components/TokenList';\nimport { navigationRoutes } from '../constants/navigationRoutes';\nimport { useTheme } from '../hooks/useTheme';\nimport { useAppStore } from '../store/AppStore';\nimport { useQuoteStore } from '../store/quote';\nimport { containsText, getContainer } from '../utils/common';\nimport { createTokenHash } from '../utils/meta';\n\nconst Content = styled('div', {\n display: 'flex',\n justifyContent: 'space-between',\n flexDirection: 'column',\n flex: 1,\n});\nconst NotFoundContent = styled('div', {\n display: 'flex',\n flexDirection: 'column',\n alignItems: 'center',\n justifyContent: 'center',\n flex: '0.75',\n});\nconst DeleteIconButton = styled(IconButton, {\n '&:hover': {\n '& svg': {\n color: '$secondary550',\n },\n },\n});\nexport function CustomTokensPage() {\n const [searchedFor, setSearchedFor] = useState<string>('');\n const { deleteCustomToken } = useAppStore();\n const customTokens = useAppStore().customTokens();\n const { fromToken, toToken, setFromToken, setToToken } = useQuoteStore()();\n const { mode } = useTheme({});\n const navigate = useNavigate();\n const [isDeleteModalOpen, setIsDeleteModalOpen] = useState<boolean>(false);\n const [selectedToken, setSelectedToken] = useState<Token>();\n const handleSearch = (event: React.ChangeEvent<HTMLInputElement>) => {\n const value = event.target.value;\n setSearchedFor(value);\n };\n const isDarkTheme = mode === 'dark';\n\n const customTokensResults = customTokens.filter(\n (token) =>\n containsText(token.symbol, searchedFor) ||\n containsText(token.address || '', searchedFor) ||\n containsText(token.name || '', searchedFor)\n );\n\n const handleDeleteCustomToken = () => {\n if (selectedToken) {\n const toTokenHash = toToken ? createTokenHash(toToken) : null;\n const fromTokenHash = fromToken ? createTokenHash(fromToken) : null;\n const selectedTokenHash = createTokenHash(selectedToken);\n\n if (toTokenHash === selectedTokenHash) {\n setToToken({ token: null });\n } else if (fromTokenHash === selectedTokenHash) {\n setFromToken({ token: null });\n }\n deleteCustomToken(selectedToken);\n }\n setIsDeleteModalOpen(false);\n };\n\n return (\n <Layout\n header={{\n title: i18n.t('Custom Tokens'),\n }}>\n <PageContainer>\n <Content>\n {!!customTokens.length ? (\n <>\n <SearchInput\n id=\"widget-custom-tokens-search-token-input\"\n value={searchedFor}\n setValue={setSearchedFor}\n fullWidth\n color=\"light\"\n variant=\"contained\"\n placeholder={i18n.t('Search Token')}\n onChange={handleSearch}\n />\n <Divider size={16} />\n <TokenList\n list={customTokensResults}\n type=\"custom-token\"\n searchedFor={searchedFor}\n showTitle={false}\n showWarning={false}\n action={(token) => (\n <DeleteIconButton\n id=\"widget-custom-token-delete-icon-btn\"\n variant=\"ghost\"\n onClick={() => {\n setIsDeleteModalOpen(true);\n setSelectedToken(token);\n }}>\n <DeleteIcon size={12} color=\"gray\" />\n </DeleteIconButton>\n )}\n />\n </>\n ) : (\n <NotFoundContent>\n <NotFound\n icon={\n isDarkTheme ? (\n <CustomTokensZeroStateDarkIcon size={200} />\n ) : (\n <CustomTokensZeroStateIcon size={200} />\n )\n }\n title={i18n.t('No custom tokens')}\n description={i18n.t(\n 'press the button to add your custom token'\n )}\n />\n </NotFoundContent>\n )}\n <Divider size={20} />\n\n <Button\n id=\"widget-custom-token-add-btn\"\n type=\"primary\"\n variant=\"contained\"\n size=\"large\"\n onClick={() => navigate(navigationRoutes.addCustomTokens)}>\n {i18n.t('Add Custom Token')}\n </Button>\n </Content>\n <WatermarkedModal\n open={isDeleteModalOpen}\n id=\"widget-custom-tokens-delete-modal\"\n dismissible\n onClose={() => setIsDeleteModalOpen(false)}\n container={getContainer()}>\n <MessageBox\n title={i18n.t('Delete Custom Token')}\n type=\"error\"\n description={i18n.t('Are you sure you want to Delete this Token?')}>\n <Divider size={40} />\n <Divider size={10} />\n\n <Button\n fullWidth\n id=\"widget-custom-token-delete-modal-yes-btn\"\n variant=\"contained\"\n type=\"primary\"\n size=\"large\"\n onClick={handleDeleteCustomToken}>\n {i18n.t('Yes, Delete it')}\n </Button>\n <Divider size={12} />\n <Button\n id=\"widget-custom-token-delete-modal-no-btn\"\n fullWidth\n variant=\"outlined\"\n type=\"primary\"\n size=\"large\"\n onClick={() => setIsDeleteModalOpen(false)}>\n {i18n.t('No, Continue')}\n </Button>\n </MessageBox>\n </WatermarkedModal>\n </PageContainer>\n </Layout>\n );\n}\n", "import type { PropTypes } from './SearchInput.types';\n\nimport { CloseIcon, IconButton, SearchIcon, TextField } from '@rango-dev/ui';\nimport React from 'react';\n\nimport { IconWrapper, SearchInputContainer } from './SearchInput.styles';\n\nexport function SearchInput(props: PropTypes) {\n const {\n variant,\n fullWidth,\n color,\n size,\n onChange,\n value,\n style,\n setValue,\n suffix,\n id,\n ...inputAttributes\n } = props;\n\n let inputSuffix = !!value.length ? (\n <IconButton\n id={`${id}\u06F0icon-btn`}\n variant=\"ghost\"\n onClick={() => setValue?.('')}\n size=\"small\">\n <CloseIcon color=\"gray\" size={10} />\n </IconButton>\n ) : null;\n\n if (suffix) {\n inputSuffix = suffix;\n }\n\n return (\n <SearchInputContainer>\n <TextField\n prefix={\n <IconWrapper>\n <SearchIcon color=\"black\" />\n </IconWrapper>\n }\n id={id}\n suffix={inputSuffix}\n fullWidth={fullWidth}\n color={color}\n variant={variant}\n style={{\n borderRadius: 25,\n alignItems: 'center',\n ...style,\n }}\n size={size}\n value={value}\n onChange={onChange}\n {...inputAttributes}\n />\n </SearchInputContainer>\n );\n}\n", "import { styled } from '@rango-dev/ui';\n\nexport const IconWrapper = styled('div', {\n width: '$24',\n height: '$24',\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n});\n\nexport const SearchInputContainer = styled('div', {\n width: '100%',\n '& ._text-field': {\n paddingLeft: '$10',\n '& input': {\n paddingLeft: '$2',\n paddingTop: '$12',\n paddingBottom: '$12',\n },\n },\n});\n", "/* eslint-disable @typescript-eslint/no-magic-numbers */\nimport type { PropTypes, RenderDescProps, TokenData } from './TokenList.types';\n\nimport { i18n } from '@lingui/core';\nimport {\n Button,\n CustomTokenWarning,\n darkTheme,\n Divider,\n ExternalLinkIcon,\n Image,\n ListItem,\n NotFound,\n PinIcon,\n Skeleton,\n Typography,\n VirtualizedList,\n} from '@rango-dev/ui';\nimport React, { useState } from 'react';\nimport { useTranslation } from 'react-i18next';\n\nimport { DEFAULT_TOKEN_IMAGE_SRC } from '../../constants/customTokens';\nimport { useNavigateBack } from '../../hooks/useNavigateBack';\nimport { useAppStore } from '../../store/AppStore';\nimport { useQuoteStore } from '../../store/quote';\nimport { createTintsAndShades } from '../../utils/colors';\nimport { getContainer } from '../../utils/common';\nimport { findBlockchain } from '../../utils/meta';\nimport { formatBalance } from '../../utils/wallets';\nimport { ImportCustomToken } from '../ImportCustomToken';\n\nimport { LoadingTokenList } from './LoadingTokenList';\nimport {\n BalanceContainer,\n Container,\n descriptionStyles,\n End,\n ImageSection,\n List,\n ListItemContainer,\n Pin,\n StyledLink,\n StyledListItemButton,\n Tag,\n TagTitle,\n Title,\n tokenAddressStyles,\n TokenBalance,\n tokenNameStyles,\n tokenTitleStyles,\n tokenWithoutNameStyles,\n usdValueStyles,\n} from './TokenList.styles';\n\nconst PAGE_SIZE = 20;\n\nconst renderDesc = (props: RenderDescProps) => {\n const { address, name, url, token, customCssForTag, customCssForTagTitle } =\n props;\n const length = address.length;\n\n return (\n <div className={descriptionStyles()}>\n {name ? (\n <div className={tokenNameStyles()}>{name}</div>\n ) : (\n <Title className={tokenTitleStyles()}>\n <Typography variant=\"title\" size=\"xmedium\">\n {token.symbol}\n </Typography>\n <Divider direction=\"horizontal\" size={4} />\n <Tag css={customCssForTag}>\n <TagTitle variant=\"body\" size=\"xsmall\" css={customCssForTagTitle}>\n {token.blockchain}\n </TagTitle>\n </Tag>\n </Title>\n )}\n\n {!!address && (\n <div\n className={`${tokenAddressStyles()} ${\n !name && tokenWithoutNameStyles()\n }`}>\n {length > 10\n ? `${address.slice(0, 5)}...${address.slice(length - 6, length)}`\n : address}{' '}\n <Divider size={4} direction=\"horizontal\" />\n <StyledLink\n href={url}\n target=\"_blank\"\n rel=\"nofollow noreferrer\"\n onClick={(e) => e.stopPropagation()}>\n <ExternalLinkIcon size={12} />\n </StyledLink>\n </div>\n )}\n </div>\n );\n};\n\nexport function TokenList(props: PropTypes) {\n const {\n list: tokens,\n searchedFor = '',\n onChange,\n selectedBlockchain,\n showTitle = true,\n action,\n type,\n showWarning = true,\n } = props;\n\n const fetchStatus = useAppStore().fetchStatus;\n const blockchains = useAppStore().blockchains();\n const { getBalanceFor, fetchingWallets: loadingWallet } = useAppStore();\n const { isTokenPinned } = useAppStore();\n const { setFromToken, setToToken } = useQuoteStore()();\n const { t } = useTranslation();\n const navigateBack = useNavigateBack();\n\n const [customToken, setCustomToken] = useState<TokenData | null>(null);\n\n const updateToken = () => {\n if (type === 'source') {\n setFromToken({ token: customToken, meta: { blockchains } });\n } else {\n setToToken({ token: customToken, meta: { blockchains } });\n }\n };\n\n const handleImportToken = () => {\n updateToken();\n navigateBack();\n };\n\n const endRenderer = (token: TokenData) => {\n if (token.customToken) {\n const { customToken, ...otherProps } = token;\n const handleClick: React.MouseEventHandler<HTMLButtonElement> = (\n event\n ) => {\n event.stopPropagation();\n setCustomToken({ ...otherProps, warning: true });\n };\n\n return (\n // eslint-disable-next-line jsx-id-attribute-enforcement/missing-ids\n <Button\n variant=\"contained\"\n type=\"primary\"\n size=\"small\"\n className=\"widget-token-list-item-import-btn\"\n onClick={handleClick}>\n <Typography variant=\"body\" size=\"xsmall\" color=\"background\">\n {t('import')}\n </Typography>\n </Button>\n );\n }\n const tokenBalance = formatBalance(getBalanceFor(token));\n\n if (action) {\n return action(token);\n }\n if (loadingWallet) {\n return (\n <End>\n <Skeleton variant=\"text\" size=\"large\" width={70} />\n <Divider size={4} />\n <Skeleton variant=\"text\" size=\"medium\" width={50} />\n </End>\n );\n }\n\n return (\n tokenBalance && (\n <BalanceContainer>\n <TokenBalance variant=\"title\" size=\"small\">\n {tokenBalance.amount}\n </TokenBalance>\n <div />\n {tokenBalance.usdValue && (\n <Typography\n variant=\"body\"\n className={usdValueStyles()}\n size=\"xsmall\">\n {`$${tokenBalance.usdValue}`}\n </Typography>\n )}\n </BalanceContainer>\n )\n );\n };\n const renderList = () => {\n return (\n <VirtualizedList\n style={{\n // See note on https://github.com/rango-exchange/rango-client/pull/1284\n flexGrow: 1,\n minHeight: 0,\n }}\n itemContent={(index) => {\n const token = tokens[index];\n if (token === 'skeleton') {\n return (\n <ListItem\n hasDivider\n start={<Skeleton variant=\"circular\" width={35} height={35} />}\n end={\n <End>\n <Skeleton variant=\"text\" size=\"large\" width={70} />\n <Divider size={4} />\n <Skeleton variant=\"text\" size=\"medium\" width={50} />\n </End>\n }\n title={\n <div>\n <Skeleton variant=\"text\" size=\"large\" width={90} />\n <Divider size={4} />\n <Skeleton variant=\"text\" size=\"medium\" width={90} />\n </div>\n }\n />\n );\n }\n const blockchain = blockchains.find(\n (blockchain) => blockchain.name === token?.blockchain\n );\n\n /**\n * This block is added to satisfy TypeScript without using assertions and to prevent any errors that could break the app.\n * Be cautious, as Virtuoso warns us if we return empty elements.\n * If you need to exclude any items, do so before passing them to the virtual list.\n */\n if (!blockchain || !token) {\n return null;\n }\n\n const address = token.address;\n\n const colors = createTintsAndShades(blockchain.color, 'main');\n const customCssForTag = {\n $$color: colors.main150,\n [`.${darkTheme} &`]: {\n $$color: colors.main750,\n },\n backgroundColor: '$$color',\n };\n\n const customCssForTagTitle = {\n $$color: colors.main750,\n [`.${darkTheme} &`]: {\n $$color: colors.main150,\n },\n color: '$$color',\n };\n\n const handleClick = () => {\n if (typeof token !== 'string' && !token.customToken) {\n onChange?.(token);\n }\n };\n\n return (\n <ListItemContainer>\n <StyledListItemButton\n tab-index={index}\n key={`${token.symbol}${address}`}\n id={`${token.symbol}${address}`}\n className=\"widget-token-list-item-btn\"\n hasDivider\n customToken={token?.customToken}\n onClick={handleClick}\n start={\n <ImageSection>\n <Image\n src={\n token.image === ''\n ? DEFAULT_TOKEN_IMAGE_SRC\n : token.image\n }\n size={30}\n />\n {props.type !== 'custom-token' &&\n token &&\n isTokenPinned(token, props.type) && (\n <Pin>\n <PinIcon size={12} color=\"gray\" />\n </Pin>\n )}\n </ImageSection>\n }\n title={\n blockchain.type === 'COSMOS' ||\n !!token.name ||\n (!token.name && !address) ? (\n <Title>\n <Typography variant=\"title\" size=\"xmedium\">\n {token.symbol}\n </Typography>\n <Divider direction=\"horizontal\" size={4} />\n <Tag css={customCssForTag}>\n <TagTitle\n variant=\"body\"\n size=\"xsmall\"\n css={customCssForTagTitle}>\n {token.blockchain}\n </TagTitle>\n </Tag>\n {showWarning && token.warning && (\n <>\n <Divider direction=\"horizontal\" size={4} />\n <CustomTokenWarning container={getContainer()} />\n </>\n )}\n </Title>\n ) : undefined\n }\n description={\n typeof token !== 'string' &&\n !!blockchain.info &&\n !!address &&\n blockchain.type !== 'COSMOS'\n ? renderDesc({\n address,\n token,\n customCssForTag,\n customCssForTagTitle,\n name: token.name,\n url: blockchain.info.addressUrl\n .split('{wallet}')\n .join(address),\n })\n : token.name || undefined\n }\n end={endRenderer(token)}\n />\n </ListItemContainer>\n );\n }}\n totalCount={tokens.length}\n key={`${selectedBlockchain}-${searchedFor}`}\n />\n );\n };\n\n const customTokenBlockchain = customToken\n ? findBlockchain(customToken?.blockchain, blockchains)\n : null;\n\n return (\n <>\n {showTitle && (\n <>\n <Typography variant=\"label\" size=\"large\">\n {i18n.t('Select Token')}\n </Typography>\n <Divider size={4} />\n </>\n )}\n\n <Container>\n <Divider size={4} />\n {fetchStatus === 'loading' && <LoadingTokenList size={PAGE_SIZE} />}\n {fetchStatus === 'success' &&\n (tokens.length ? (\n <>\n <ImportCustomToken\n token={customToken}\n address={customToken?.address ?? ''}\n blockchain={customTokenBlockchain ?? undefined}\n onImport={handleImportToken}\n onExitErrorModal={() => setCustomToken(null)}\n onExitImportModal={() => setCustomToken(null)}\n />\n <List as=\"ul\">{renderList()}</List>\n </>\n ) : (\n !!searchedFor && (\n <NotFound\n title={i18n.t('No results found')}\n description={i18n.t('Try using different keywords')}\n />\n )\n ))}\n </Container>\n </>\n );\n}\n", "import type { LoadingTokenListProps } from './TokenList.types';\n\nimport { Divider, ListItem, Skeleton } from '@rango-dev/ui';\nimport React from 'react';\n\nimport { End, List } from './TokenList.styles';\n\nexport function LoadingTokenList(props: LoadingTokenListProps) {\n return (\n <List>\n {Array.from(Array(props.size), (e) => (\n <ListItem\n key={e}\n hasDivider\n start={<Skeleton variant=\"circular\" width={35} height={35} />}\n end={\n <End>\n <Skeleton variant=\"text\" size=\"large\" width={70} />\n <Divider size={4} />\n <Skeleton variant=\"text\" size=\"medium\" width={50} />\n </End>\n }\n title={\n <div>\n <Skeleton variant=\"text\" size=\"large\" width={90} />\n <Divider size={4} />\n <Skeleton variant=\"text\" size=\"medium\" width={90} />\n </div>\n }\n />\n ))}\n </List>\n );\n}\n", "import {\n css,\n darkTheme,\n ImageContainer,\n ListItemButton,\n styled,\n Typography,\n} from '@rango-dev/ui';\n\nexport const tokenNameStyles = css({\n position: 'absolute',\n transform: 'none',\n transition: 'transform 225ms cubic-bezier(0, 0, 0.2, 1) 0ms',\n textOverflow: 'ellipsis',\n whiteSpace: 'nowrap',\n maxWidth: 100,\n overflow: 'hidden',\n});\nexport const descriptionStyles = css({\n position: 'relative',\n height: 12,\n width: '30%',\n maxWidth: '150px',\n});\nexport const tokenTitleStyles = css({\n position: 'absolute',\n transform: 'none',\n transition: 'transform 225ms cubic-bezier(0, 0, 0.2, 1) 0ms',\n bottom: '-8px',\n});\nexport const tokenAddressStyles = css({\n transform: 'translateY(12px)',\n visibility: 'hidden',\n display: 'flex',\n '& a': {\n display: 'flex',\n justifyContent: 'center',\n alignItems: 'center',\n fontSize: '$12',\n lineHeight: '$16',\n $$color: '$colors$neutral600',\n [`.${darkTheme} &`]: {\n $$color: '$colors$neutral700',\n },\n color: '$$color',\n textDecoration: 'none',\n },\n});\nexport const tokenWithoutNameStyles = css({});\nexport const usdValueStyles = css();\n\nexport const Container = styled('div', {\n display: 'flex',\n flexDirection: 'column',\n flexGrow: 1,\n overflow: 'hidden',\n justifyContent: 'center',\n});\n\nexport const Title = styled('div', {\n display: 'flex',\n alignItems: 'center',\n '._typography': {\n textOverflow: 'ellipsis',\n whiteSpace: 'nowrap',\n maxWidth: 100,\n overflow: 'hidden',\n },\n});\nexport const List = styled('ul', {\n flexGrow: 1,\n height: '100%',\n padding: 0,\n margin: 0,\n // See note on https://github.com/rango-exchange/rango-client/pull/1284\n display: 'flex',\n flexDirection: 'column',\n listStyle: 'none',\n\n '& li': {\n alignItems: 'none',\n\n '&:hover': {\n [`& .${descriptionStyles}`]: {\n [`& .${tokenAddressStyles}`]: {\n position: 'absolute',\n transform: 'none',\n transition: 'transform 225ms cubic-bezier(0, 0, 0.2, 1) 0ms',\n visibility: 'visible',\n },\n\n [`& .${tokenWithoutNameStyles}`]: {\n bottom: '-15px',\n },\n [`& .${tokenNameStyles}`]: {\n position: 'absolute',\n transform: 'translateY(-12px)',\n visibility: 'hidden',\n },\n [`& .${tokenTitleStyles}`]: {\n position: 'absolute',\n transform: 'translateY(-12px)',\n bottom: '-10px',\n },\n },\n },\n },\n});\n\nexport const StyledListItemButton = styled(ListItemButton, {\n variants: {\n customToken: {\n true: {\n '&:hover': {\n cursor: 'unset',\n },\n },\n },\n },\n});\n\nexport const Tag = styled('div', {\n paddingLeft: '$5',\n paddingRight: '$5',\n borderRadius: '$md',\n display: 'flex',\n alignItems: 'center',\n});\n\nexport const TagTitle = styled(Typography, {});\n\nexport const BalanceContainer = styled('div', {\n textAlign: 'right',\n width: '100%',\n overflow: 'hidden',\n textOverflow: 'ellipsis',\n whiteSpace: 'nowrap',\n [`& .${usdValueStyles}`]: {\n $$color: '$colors$neutral600',\n [`.${darkTheme} &`]: {\n $$color: '$colors$neutral700',\n },\n color: '$$color',\n },\n});\n\nexport const End = styled('div', {\n display: 'flex',\n alignItems: 'end',\n flexDirection: 'column',\n});\n\nexport const Description = styled('div', {\n display: 'flex',\n alignItems: 'center',\n});\nexport const ImageSection = styled('div', {\n position: 'relative',\n [`& ${ImageContainer}`]: {\n borderRadius: '$xm',\n overflow: 'hidden',\n },\n});\nexport const Pin = styled('div', {\n position: 'absolute',\n backgroundColor: '$neutral100',\n padding: '$4',\n borderRadius: '50%',\n bottom: -6,\n right: -6,\n});\n\nexport const TokenBalance = styled(Typography, {\n width: '100%',\n overflow: 'hidden',\n textOverflow: 'ellipsis',\n whiteSpace: 'nowrap',\n});\n\nexport const StyledLink = styled('a', {\n '& svg:hover': {\n color: '$colors$info',\n },\n});\n\nexport const ListItemContainer = styled('div', {\n paddingRight: '$5',\n\n '& .widget-token-list-item-btn': {\n width: '100%',\n overflow: 'hidden',\n height: '60px',\n },\n\n '& .widget-token-list-item-import-btn': {\n height: '$20',\n padding: '0 $10',\n\n '& ._text': {\n display: 'flex',\n justifyContent: 'center',\n alignItems: 'center',\n },\n\n '& ._typography': {\n [`.${darkTheme} &`]: {\n color: '$foreground',\n },\n },\n },\n});\n", "import { i18n } from '@lingui/core';\nimport { useManager } from '@rango-dev/queue-manager-react';\nimport {\n Button,\n darkTheme,\n Divider,\n MessageBox,\n NotFound,\n styled,\n Tabs,\n Typography,\n} from '@rango-dev/ui';\nimport {\n type PendingSwap,\n type PendingSwapStep,\n TransactionStatus,\n} from 'rango-types';\nimport React, { useMemo, useState } from 'react';\nimport { useNavigate } from 'react-router-dom';\n\nimport { WatermarkedModal } from '../components/common/WatermarkedModal';\nimport { FilterSelector } from '../components/FilterSelector';\nimport { SuffixContainer } from '../components/HeaderButtons/HeaderButtons.styles';\nimport { HistoryGroupedList } from '../components/HistoryGroupedList';\nimport { NotFoundContainer } from '../components/HistoryGroupedList/HistoryGroupedList.styles';\nimport { Layout, PageContainer } from '../components/Layout';\nimport { SearchInput } from '../components/SearchInput';\nimport { useSwapMode } from '../hooks/useSwapMode';\nimport { getContainer } from '../utils/common';\nimport { groupSwapsByDate } from '../utils/date';\nimport { containsText } from '../utils/numbers';\nimport { getPendingSwaps } from '../utils/queue';\n\ntype SwapModeTab = 'all' | 'swap' | 'refuel';\n\nconst HistoryGroupedListContainer = styled('div', {\n overflowY: 'visible',\n width: '100%',\n display: 'flex',\n flexDirection: 'column',\n gap: 15,\n height: '100%',\n // See note on https://github.com/rango-exchange/rango-client/pull/1284\n minHeight: 0,\n flexGrow: 1,\n});\n\nconst SearchAndFilterBar = styled('div', {\n display: 'flex',\n justifyContent: 'center',\n alignItems: 'center',\n});\n\nconst Description = styled('div', {\n '._typography': {\n color: '$neutral700',\n [`.${darkTheme}&`]: {\n color: '$neutral900',\n },\n },\n});\n\nconst isStepContainsText = (steps: PendingSwapStep[], value: string) => {\n if (!steps?.length) {\n return false;\n }\n return steps.filter(\n (step) =>\n containsText(step.fromBlockchain, value) ||\n containsText(step.toBlockchain, value) ||\n containsText(step.toSymbol, value) ||\n containsText(step.fromSymbol, value)\n ).length;\n};\n\nexport function HistoryPage() {\n const navigate = useNavigate();\n const { manager, state } = useManager();\n const list: PendingSwap[] = getPendingSwaps(manager).map(({ swap }) => swap);\n const [searchedFor, setSearchedFor] = useState<string>('');\n const [openFilterSelector, setOpenFilterSelector] = useState(false);\n const loading = !state.loadedFromPersistor;\n const [filterBy, setFilterBy] = useState('');\n const [openClearModal, setOpenClearModal] = useState(false);\n const [swapModeActiveTab, setSwapModeActiveTab] =\n useState<SwapModeTab>('all');\n const handleSearch = (event: React.ChangeEvent<HTMLInputElement>) => {\n const value = event.target.value;\n setSearchedFor(value);\n };\n const { isMultiMode } = useSwapMode();\n\n const transactionStatusFilters = [\n {\n id: TransactionStatus.SUCCESS,\n title: i18n.t('Complete'),\n },\n {\n id: TransactionStatus.RUNNING,\n title: i18n.t('Running'),\n },\n { id: TransactionStatus.FAILED, title: i18n.t('Failed') },\n ];\n\n const swapModeTabItems = [\n {\n id: 'all',\n title: i18n.t('All'),\n },\n {\n id: 'swap',\n title: i18n.t('Swap'),\n },\n {\n id: 'refuel',\n title: i18n.t('Refuel'),\n },\n ];\n\n const filteredList = useMemo(() => {\n if (!searchedFor && !filterBy && swapModeActiveTab === 'all') {\n return list;\n }\n\n return list.filter((swap) => {\n const { inputAmount, status, steps, requestId, mode } = swap;\n\n const matchesSearch =\n !searchedFor ||\n containsText(inputAmount, searchedFor) ||\n containsText(status, searchedFor) ||\n isStepContainsText(steps, searchedFor) ||\n containsText(requestId, searchedFor);\n\n const matchesFilter = !filterBy || filterBy === status;\n\n const matchesSwapMode = (() => {\n if (swapModeActiveTab === 'all') {\n return true;\n }\n if (swapModeActiveTab === 'swap') {\n return !mode || mode === 'swap';\n }\n if (swapModeActiveTab === 'refuel') {\n return mode === 'refuel';\n }\n return false;\n })();\n\n return matchesSearch && matchesFilter && matchesSwapMode;\n });\n }, [list, searchedFor, filterBy, swapModeActiveTab]);\n\n const isEmpty = !filteredList?.length && !loading;\n\n const onCloseModal = () => setOpenClearModal(false);\n const onClear = async () => {\n try {\n await manager?.clearQueue();\n\n setOpenClearModal(false);\n } catch (e) {\n console.log(e);\n }\n };\n const isClearButtonDisabled = useMemo(() => {\n return !list.some(\n (swap) =>\n swap.status === TransactionStatus.SUCCESS ||\n swap.status === TransactionStatus.FAILED\n );\n }, [list]);\n\n return (\n <Layout\n header={{\n title: i18n.t('History'),\n suffix: (\n <SuffixContainer>\n <Button\n id=\"widget-history-clear-btn\"\n disabled={isClearButtonDisabled}\n variant=\"ghost\"\n size=\"xsmall\"\n onClick={() => setOpenClearModal(true)}>\n <Typography size=\"medium\" variant=\"label\" color=\"error\">\n {i18n.t('Clear')}\n </Typography>\n </Button>\n </SuffixContainer>\n ),\n }}>\n <PageContainer>\n <SearchAndFilterBar>\n <SearchInput\n setValue={setSearchedFor}\n fullWidth\n variant=\"contained\"\n placeholder={i18n.t('Search Transaction')}\n id=\"widget-history-search-transaction-input\"\n autoFocus\n onChange={handleSearch}\n style={{ height: 36 }}\n value={searchedFor}\n />\n <Divider size={10} direction=\"horizontal\" />\n\n <FilterSelector\n filterBy={filterBy}\n open={openFilterSelector}\n onOpenChange={(open) => setOpenFilterSelector(open)}\n onClickItem={(id) => setFilterBy(id)}\n list={transactionStatusFilters}\n />\n </SearchAndFilterBar>\n\n <Divider size=\"16\" />\n\n {isMultiMode && !loading && (\n <>\n <Tabs\n items={swapModeTabItems}\n onChange={(item) => setSwapModeActiveTab(item.id as SwapModeTab)}\n value={swapModeActiveTab}\n type=\"secondary\"\n />\n <Divider size=\"12\" />\n </>\n )}\n <HistoryGroupedListContainer>\n {isEmpty && (\n <NotFoundContainer>\n <Divider size={32} />\n <NotFound\n title={\n searchedFor\n ? i18n.t('No results found')\n : i18n.t('No transactions')\n }\n titleColor={!searchedFor ? '$info' : undefined}\n hasIcon={!!searchedFor}\n description={\n searchedFor\n ? i18n.t('Try using different keywords')\n : i18n.t(\n 'Your transaction history is stored locally and will appear here after you start a swap'\n )\n }\n />\n </NotFoundContainer>\n )}\n {!isEmpty && (\n <HistoryGroupedList\n list={filteredList}\n onSwapClick={navigate}\n groupBy={groupSwapsByDate}\n isLoading={loading}\n />\n )}\n </HistoryGroupedListContainer>\n </PageContainer>\n <WatermarkedModal\n open={openClearModal}\n onClose={onCloseModal}\n id=\"widget-history-clear-modal\"\n container={getContainer()}>\n <Divider size={20} />\n <MessageBox\n type=\"warning\"\n title={i18n.t('Clear Transaction History')}\n description={\n <Description>\n <Typography variant=\"body\" size=\"medium\">\n {i18n.t(\n 'Proceeding will remove all successful and failed transactions from the widget. Do you want to continue?'\n )}\n </Typography>\n <Divider size={'24'} />\n\n <Typography variant=\"body\" size=\"small\">\n {i18n.t(\n 'Note: This does not erase your transaction history on the chain; it only removes them here.'\n )}\n </Typography>\n </Description>\n }\n />\n <Divider size={30} />\n <Button\n id=\"widget-history-clear-modal-yes-btn\"\n variant=\"contained\"\n type=\"primary\"\n size=\"large\"\n onClick={onClear}>\n {i18n.t('Yes, Clear the history')}\n </Button>\n <Divider size={10} />\n <Button\n id=\"widget-history-clear-modal-no-btn\"\n variant=\"outlined\"\n type=\"primary\"\n size=\"large\"\n onClick={onCloseModal}>\n <Typography variant=\"title\" size=\"medium\" color=\"primary\">\n {i18n.t('No, Cancel')}\n </Typography>\n </Button>\n </WatermarkedModal>\n </Layout>\n );\n}\n", "import type { FilterSelectorPropTypes } from './FilterSelector.type';\n\nimport { FilterIcon, Popover } from '@rango-dev/ui';\nimport React from 'react';\n\nimport { getContainer } from '../../utils/common';\n\nimport { Badge, FilterButton, IconContainer } from './FilterSelector.style';\nimport { FilterSelectorContent } from './FilterSelectorContent';\n\nexport function FilterSelector(props: FilterSelectorPropTypes) {\n const { onClickItem, onOpenChange, filterBy, list, open } = props;\n return (\n <div>\n <Popover\n open={open}\n align=\"end\"\n onOpenChange={onOpenChange}\n container={getContainer()}\n content={\n <FilterSelectorContent\n list={list}\n filterBy={filterBy}\n onClickItem={(id) => {\n onClickItem(id);\n onOpenChange(false);\n }}\n />\n }>\n <FilterButton\n id=\"widget-filter-selector-filter-icon-btn\"\n variant=\"default\"\n isSelect={!!filterBy}\n onClick={() => onOpenChange(!props.open)}>\n <IconContainer isSelect={!!filterBy}>\n <FilterIcon size={16} color=\"black\" />\n {!!filterBy && <Badge />}\n </IconContainer>\n </FilterButton>\n </Popover>\n </div>\n );\n}\n", "import { css, darkTheme, IconButton, styled } from '@rango-dev/ui';\n\nexport const IconContainer = styled('div', {\n position: 'relative',\n '&::before': {\n position: 'absolute',\n right: '1px',\n top: '-1px',\n width: '$8',\n height: '$8',\n borderRadius: '100%',\n backgroundColor: '$neutral300',\n [`.${darkTheme} &`]: {\n backgroundColor: '$neutral400',\n },\n padding: '$2',\n },\n variants: {\n isSelect: {\n true: {\n '&::before': {\n content: '',\n },\n },\n },\n },\n});\n\nexport const FilterButton = styled(IconButton, {\n width: '$36',\n height: '$36',\n position: 'relative',\n padding: '0',\n overflow: 'unset',\n backgroundColor: '$neutral300',\n [`.${darkTheme} &`]: {\n backgroundColor: '$neutral400',\n },\n '&:hover': {\n backgroundColor: '$secondary100',\n [`.${darkTheme} &`]: {\n backgroundColor: '$neutral',\n },\n [`& ${IconContainer}::before`]: {\n backgroundColor: '$secondary100',\n [`.${darkTheme} &`]: {\n backgroundColor: '$neutral',\n },\n },\n },\n variants: {\n isSelect: {\n true: {\n border: '1px solid $secondary',\n },\n },\n },\n});\n\nexport const Badge = styled('div', {\n position: 'absolute',\n width: '$6',\n height: '$6',\n display: 'flex',\n justifyContent: 'center',\n alignItems: 'center',\n borderRadius: '3px',\n top: '$0',\n right: '1px',\n backgroundColor: '$secondary500',\n});\n\nexport const FilterContainer = styled('div', {\n padding: '$15',\n borderRadius: '$sm',\n width: '248px',\n backgroundColor: '$background',\n zIndex: 10,\n});\n\nexport const centeredFlexContainer = css({\n display: 'flex',\n justifyContent: 'space-between',\n alignItems: 'center',\n});\n\nexport const FilterList = styled('ul', {\n margin: 0,\n listStyle: 'none',\n height: '100%',\n padding: 0,\n '.item-start-container': {\n paddingRight: '0 !important',\n },\n});\n", "import type { PropTypes } from './FilterSelector.type';\n\nimport { i18n } from '@lingui/core';\nimport {\n Button,\n Divider,\n ListItemButton,\n Radio,\n RadioRoot,\n Typography,\n} from '@rango-dev/ui';\nimport React from 'react';\n\nimport {\n centeredFlexContainer,\n FilterContainer,\n FilterList,\n} from './FilterSelector.style';\n\nexport function FilterSelectorContent(props: PropTypes) {\n const { filterBy: value, onClickItem } = props;\n return (\n <FilterContainer>\n <div className={centeredFlexContainer()}>\n <Typography size=\"small\" variant=\"body\">\n {i18n.t('Status')}\n </Typography>\n <Button\n id=\"widget-filter-selector-reset-btn\"\n variant=\"ghost\"\n size=\"xxsmall\"\n onClick={() => onClickItem('')}>\n {i18n.t('Reset')}\n </Button>\n </div>\n <Divider size={10} />\n <RadioRoot value={value}>\n <FilterList>\n {props.list.map((item, index) => {\n return (\n <ListItemButton\n key={item.id}\n className=\"widget-filter-selector-list-item-btn\"\n style={{ height: '40px', width: '100%' }}\n selected={false}\n hasDivider={props.list.length - 1 != index}\n id={item.id}\n title={\n <>\n <Divider direction=\"horizontal\" size={4} />\n <Typography size=\"medium\" variant=\"body\">\n {item.title}\n </Typography>\n </>\n }\n start={<Radio value={item.id} />}\n onClick={onClickItem}\n />\n );\n })}\n </FilterList>\n </RadioRoot>\n </FilterContainer>\n );\n}\n", "import type { PropTypes } from './HistoryGroupedList.types';\n\nimport { i18n } from '@lingui/core';\nimport { getCurrentStep } from '@rango-dev/queue-manager-rango-preset';\nimport {\n Divider,\n GroupedVirtualizedList,\n Skeleton,\n SwapListItem,\n Typography,\n} from '@rango-dev/ui';\nimport React, { useCallback, useEffect, useRef, useState } from 'react';\n\nimport {\n TOKEN_AMOUNT_MAX_DECIMALS,\n TOKEN_AMOUNT_MIN_DECIMALS,\n} from '../../constants/routing';\nimport { getContainer } from '../../utils/common';\nimport { numberToString } from '../../utils/numbers';\n\nimport { calculateGroupsSoFar } from './HistoryGroupedList.helpers';\nimport {\n Group,\n groupStyles,\n SwapItemContainer,\n SwapList,\n Time,\n} from './HistoryGroupedList.styles';\n\nconst ITEMS_PER_PAGE = 10;\n\nexport function HistoryGroupedList(props: PropTypes) {\n const { list, onSwapClick, groupBy, isLoading } = props;\n const [currentGroupCounts, setCurrentGroupCounts] = useState<number[]>([]);\n const loadedItems = useRef(0);\n const { swaps, groupCounts, groups } = groupBy(list);\n\n const calculateGroups = useCallback(calculateGroupsSoFar, []);\n\n const loadMore = useCallback(() => {\n const remainedItems = list.length - loadedItems.current;\n if (remainedItems) {\n loadedItems.current += Math.min(remainedItems, ITEMS_PER_PAGE);\n setCurrentGroupCounts(calculateGroups(groupCounts, loadedItems.current));\n }\n }, [list.length]);\n\n useEffect(() => {\n if (!isLoading) {\n loadMore();\n }\n }, [isLoading, loadMore]);\n\n if (isLoading) {\n // The number of items presented in each group.\n const swaps = [1, 2];\n const loadingGroups = [swaps, swaps];\n return (\n <>\n {loadingGroups.map((group, index) => {\n const key = index;\n return (\n <Group key={key}>\n <Time>\n <Skeleton variant=\"text\" width={60} size=\"small\" />\n <Divider size={16} />\n </Time>\n <Divider size={4} />\n <SwapList>\n {group.map((_, index) => {\n const key = index;\n return <SwapListItem isLoading={true} key={key} />;\n })}\n </SwapList>\n </Group>\n );\n })}\n </>\n );\n }\n\n return (\n <GroupedVirtualizedList\n style={{\n // See note on https://github.com/rango-exchange/rango-client/pull/1284\n flexGrow: 1,\n minHeight: 0,\n }}\n endReached={() => {\n if (loadedItems.current < list.length) {\n loadMore();\n }\n }}\n groupCounts={currentGroupCounts}\n groupContent={(index) => {\n return (\n <Group>\n <Time>\n <Typography\n variant=\"label\"\n size=\"medium\"\n className={groupStyles()}>\n {groups[index]}\n </Typography>\n </Time>\n </Group>\n );\n }}\n itemContent={(index, groupIndex) => {\n const swap = swaps[index];\n if (!swap) {\n return null;\n }\n const currentStep = getCurrentStep(swap);\n const firstStep = swap.steps[0];\n const lastStep = swap.steps[swap.steps.length - 1];\n if (!firstStep || !lastStep) {\n return null;\n }\n return (\n <SwapItemContainer key={swap.requestId}>\n <SwapListItem\n className=\"widget-history-group-list-swap-item-btn\"\n requestId={swap.requestId}\n creationTime={swap.creationTime}\n status={swap.status}\n onClick={onSwapClick}\n currentStep={currentStep}\n tooltipContainer={getContainer()}\n onlyShowTime={groups[groupIndex] === i18n.t('Today')}\n swapTokenData={{\n from: {\n token: {\n image: firstStep.fromLogo,\n displayName: firstStep.fromSymbol,\n },\n blockchain: {\n image: firstStep.fromBlockchainLogo || '',\n },\n amount: numberToString(\n swap.inputAmount,\n TOKEN_AMOUNT_MIN_DECIMALS,\n TOKEN_AMOUNT_MAX_DECIMALS\n ),\n realAmount: swap.inputAmount,\n },\n to: {\n token: {\n image: lastStep.toLogo,\n displayName: lastStep.toSymbol,\n },\n blockchain: {\n image: lastStep.toBlockchainLogo || '',\n },\n amount: numberToString(\n lastStep.outputAmount ||\n lastStep.expectedOutputAmountHumanReadable ||\n '',\n TOKEN_AMOUNT_MIN_DECIMALS,\n TOKEN_AMOUNT_MAX_DECIMALS\n ),\n realAmount:\n lastStep.outputAmount ||\n lastStep.expectedOutputAmountHumanReadable ||\n '',\n },\n }}\n />\n </SwapItemContainer>\n );\n }}\n />\n );\n}\n", "/*\n * The calculateGroupsSoFar Slices the total groups into the groups which contain the items so far.\n * For example, if you have [10, 10, 10, 10] groups in total,\n * slicing them to 23 will result in [10, 10, 3] :\n * https://virtuoso.dev/grouped-with-load-on-demand/\n */\nexport function calculateGroupsSoFar(totalGroups: number[], count: number) {\n const groups: number[] = [];\n let index = 0;\n do {\n const group = totalGroups[index];\n if (group) {\n groups.push(Math.min(group, count));\n count -= group;\n }\n index++;\n } while (count > 0 && index <= totalGroups.length);\n return groups;\n}\n", "import { css, darkTheme, styled } from '@rango-dev/ui';\n\nexport const groupStyles = css();\n\nexport const SwapItemContainer = styled('div', {\n display: 'flex',\n justifyContent: 'center',\n alignItems: 'center',\n padding: '$5',\n});\n\nexport const Group = styled('div', {\n width: '100%',\n display: 'flex',\n flexDirection: 'column',\n backgroundColor: '$background',\n padding: '$10 $5 0 $5',\n [`& .${groupStyles}`]: {\n $$color: '$colors$neutral600',\n [`.${darkTheme} &`]: {\n $$color: '$colors$neutral700',\n },\n color: '$$color',\n },\n});\n\nexport const Time = styled('div', {\n display: 'flex',\n justifyContent: 'flex-start',\n padding: '$2',\n});\n\nexport const SwapList = styled('div', {\n gap: '$10',\n display: 'flex',\n flexDirection: 'column',\n});\n\nexport const NotFoundContainer = styled('div', {\n height: '100%',\n display: 'flex',\n justifyContent: 'center',\n alignItems: 'center',\n});\n", "import type { GroupBy } from '../components/HistoryGroupedList/HistoryGroupedList.types';\nimport type { PendingSwap } from 'rango-types';\n\nimport { i18n } from '@lingui/core';\nimport dayjs from 'dayjs';\n\nexport const groupSwapsByDate: GroupBy = (swaps) => {\n const output: Map<\n string,\n {\n title: string;\n swaps: PendingSwap[];\n }\n > = new Map([\n [\n 'today',\n {\n title: i18n.t('Today'),\n swaps: [],\n },\n ],\n [\n 'week',\n {\n title: i18n.t('This week'),\n swaps: [],\n },\n ],\n [\n 'month',\n {\n title: i18n.t('This month'),\n swaps: [],\n },\n ],\n [\n 'year',\n {\n title: i18n.t('This year'),\n swaps: [],\n },\n ],\n ]);\n\n function addYearsToOutput(key: string, swap: PendingSwap) {\n if (!output.has(key)) {\n output.set(key, {\n title: key,\n swaps: [],\n });\n }\n output.get(key)?.swaps.push(swap);\n }\n\n const now = dayjs();\n swaps.forEach((swap) => {\n const time = Number(swap.creationTime);\n const swapDate = dayjs(time);\n if (now.isSame(swapDate, 'day')) {\n output.get('today')?.swaps.push(swap);\n } else if (now.isSame(swapDate, 'week')) {\n output.get('week')?.swaps.push(swap);\n } else if (now.isSame(swapDate, 'month')) {\n output.get('month')?.swaps.push(swap);\n } else if (now.isSame(swapDate, 'year')) {\n output.get('year')?.swaps.push(swap);\n } else {\n const year = new Date(time).getFullYear().toString();\n addYearsToOutput(year, swap);\n }\n });\n\n const groupedSwaps = Array.from(output.values()).filter(\n (item) => item.swaps.length > 0\n );\n const items = groupedSwaps.flatMap((group) => group.swaps);\n const groupCounts = groupedSwaps.map((group) => group.swaps.length);\n const groups = groupedSwaps.map((group) => group.title);\n\n return { swaps: items, groupCounts, groups };\n};\n", "import type { SelectedQuote } from '../types';\n\nimport { i18n } from '@lingui/core';\nimport { Button, Divider, styled, WarningIcon } from '@rango-dev/ui';\nimport BigNumber from 'bignumber.js';\nimport React, { useEffect, useState } from 'react';\nimport { useNavigate } from 'react-router-dom';\n\nimport { HeaderButtons } from '../components/HeaderButtons';\nimport { Layout, PageContainer } from '../components/Layout';\nimport { QuoteWarningsAndErrors } from '../components/QuoteWarningsAndErrors';\nimport { SameTokensWarning } from '../components/SameTokensWarning';\nimport { SlippageWarningsAndErrors } from '../components/SlippageWarningsAndErrors/SlippageWarningsAndErrors';\nimport { SwapMetrics } from '../components/SwapMetrics';\nimport { navigationRoutes } from '../constants/navigationRoutes';\nimport { SLIPPAGES } from '../constants/swapSettings';\nimport { ExpandedQuotes } from '../containers/ExpandedQuotes';\nimport { Inputs } from '../containers/Inputs';\nimport { QuoteInfo } from '../containers/QuoteInfo';\nimport useScreenDetect from '../hooks/useScreenDetect';\nimport { useSwapInput } from '../hooks/useSwapInput';\nimport { useSwapMode } from '../hooks/useSwapMode';\nimport { useAppStore } from '../store/AppStore';\nimport { useQuoteStore } from '../store/quote';\nimport { useUiStore } from '../store/ui';\nimport { UiEventTypes } from '../types';\nimport { isVariantExpandable } from '../utils/configs';\nimport { emitPreventableEvent } from '../utils/events';\nimport { getSlippageValidation } from '../utils/settings';\nimport { getSwapButtonState, isTokensIdentical } from '../utils/swap';\n\nconst MainContainer = styled('div', {\n display: 'flex',\n alignItems: 'flex-start',\n maxHeight: 700,\n '& .footer__alert': {\n paddingTop: '0 !important',\n },\n});\nexport const TIME_TO_NAVIGATE_ANOTHER_PAGE = 300;\n\nexport function Home() {\n const navigate = useNavigate();\n const {\n fromToken,\n toToken,\n inputAmount,\n selectedQuote,\n refetchQuote,\n error: quoteError,\n warning: quoteWarning,\n quotes,\n setSelectedQuote,\n resetQuoteWallets,\n setQuoteWarningsConfirmed,\n updateQuotePartialState,\n } = useQuoteStore()();\n\n const [isVisibleExpanded, setIsVisibleExpanded] = useState<boolean>(false);\n const { isLargeScreen, isExtraLargeScreen } = useScreenDetect();\n\n const { fetch: fetchQuote, loading } = useSwapInput({ refetchQuote });\n const {\n config,\n fetchStatus: fetchMetaStatus,\n connectedWallets,\n customSlippage,\n slippage,\n setSlippage,\n setCustomSlippage,\n } = useAppStore();\n\n const { isActiveTab } = useUiStore();\n const [showQuoteWarningModal, setShowQuoteWarningModal] = useState(false);\n const currentSlippage = customSlippage !== null ? customSlippage : slippage;\n const { swapMode } = useSwapMode();\n\n const slippageValidation = getSlippageValidation(currentSlippage);\n\n const needsToWarnEthOnPath = false;\n\n const swapButtonState = getSwapButtonState({\n fetchMetaStatus,\n fetchingQuote: loading,\n inputAmount,\n quote: selectedQuote,\n anyWalletConnected: connectedWallets.length > 0,\n error: quoteError,\n warning: quoteWarning,\n needsToWarnEthOnPath,\n });\n\n const isExpandable = isVariantExpandable(\n isLargeScreen,\n isExtraLargeScreen,\n config?.variant\n );\n\n const hasInputs =\n !!inputAmount &&\n !!fromToken &&\n !!toToken &&\n new BigNumber(inputAmount).gt(0) &&\n !isTokensIdentical(fromToken, toToken);\n\n const fetchingQuote = hasInputs && fetchMetaStatus === 'success' && loading;\n\n const currentQuoteWarning =\n slippageValidation?.quoteValidation || quoteWarning;\n\n const hasValidQuotes =\n !isExpandable || (isExpandable && quotes?.results.length);\n const hasWarningOrError = currentQuoteWarning || quoteError;\n const showMessages = hasValidQuotes && hasWarningOrError;\n\n const showSwapMetrics = !!fromToken && !!toToken;\n const showSlippageAlerts = showSwapMetrics && !!slippageValidation;\n\n const onClickRefresh =\n (!!selectedQuote || quoteError) && !showQuoteWarningModal\n ? fetchQuote\n : undefined;\n\n const onHandleNavigation = (route: string) => {\n if (isExpandable && isVisibleExpanded) {\n setIsVisibleExpanded(false);\n setTimeout(() => {\n navigate(route);\n }, TIME_TO_NAVIGATE_ANOTHER_PAGE);\n } else {\n navigate(route);\n }\n };\n const onClickOnQuote = (quote: SelectedQuote) => {\n if (selectedQuote?.requestId !== quote.requestId) {\n setShowQuoteWarningModal(false);\n setSelectedQuote(quote);\n }\n };\n\n const onChangeSlippage = (slippage: number | null) => {\n if (!slippage) {\n return;\n }\n if (SLIPPAGES.includes(slippage)) {\n setSlippage(slippage);\n setCustomSlippage(null);\n return;\n }\n setCustomSlippage(slippage);\n };\n\n const handleInputTokenClick = (mode: 'from' | 'to') => {\n if (mode === 'from') {\n onHandleNavigation(navigationRoutes.fromSwap);\n } else {\n onHandleNavigation(\n swapMode === 'swap'\n ? navigationRoutes.toSwap\n : navigationRoutes.toSwap + '/' + navigationRoutes.blockchains\n );\n }\n };\n\n useEffect(() => {\n resetQuoteWallets();\n updateQuotePartialState('refetchQuote', true);\n }, []);\n\n useEffect(() => {\n setIsVisibleExpanded(hasInputs);\n }, [hasInputs]);\n\n return (\n <MainContainer>\n <Layout\n height=\"auto\"\n footer={\n // eslint-disable-next-line jsx-id-attribute-enforcement/missing-ids\n <Button\n id={`widget-swap-${swapButtonState.action}-btn`}\n type=\"primary\"\n size=\"large\"\n disabled={swapButtonState.disabled || !isActiveTab}\n prefix={\n swapButtonState.action === 'confirm-warning' && <WarningIcon />\n }\n fullWidth\n onClick={() => {\n if (swapButtonState.action === 'connect-wallet') {\n emitPreventableEvent(\n { type: UiEventTypes.CLICK_CONNECT_WALLET },\n () => onHandleNavigation(navigationRoutes.wallets)\n );\n } else if (swapButtonState.action === 'confirm-warning') {\n setShowQuoteWarningModal(true);\n } else {\n onHandleNavigation(navigationRoutes.confirmSwap);\n }\n }}>\n {swapButtonState.title}\n </Button>\n }\n header={{\n onWallet: () => {\n onHandleNavigation(navigationRoutes.wallets);\n },\n hasBackButton: false,\n title:\n config.title ||\n (swapMode === 'swap' ? i18n.t('Swap') : i18n.t('Refuel')),\n suffix: (\n <HeaderButtons\n hidden={isExpandable ? ['refresh'] : undefined}\n onClickRefresh={onClickRefresh}\n onClickHistory={() => onHandleNavigation(navigationRoutes.swaps)}\n onClickSettings={() => {\n onHandleNavigation(navigationRoutes.settings);\n }}\n />\n ),\n }}>\n <PageContainer>\n <Inputs\n fetchingQuote={fetchingQuote}\n fetchMetaStatus={fetchMetaStatus}\n isExpandable={isExpandable}\n onClickToken={handleInputTokenClick}\n />\n <Divider size=\"2\" />\n {!isExpandable ? (\n <QuoteInfo\n quote={selectedQuote}\n loading={fetchingQuote}\n error={quoteError}\n id=\"widget-home-expandable-quote-container\"\n tagHidden={false}\n warning={currentQuoteWarning}\n type=\"basic\"\n onClickAllRoutes={\n !!quotes && quotes.results.length > 1\n ? () => {\n updateQuotePartialState('refetchQuote', false);\n onHandleNavigation(navigationRoutes.routes);\n }\n : undefined\n }\n />\n ) : null}\n {showSwapMetrics && (\n <>\n <Divider size={8} />\n <SwapMetrics\n quoteError={quoteError}\n quoteWarning={currentQuoteWarning}\n fromToken={fromToken}\n toToken={toToken}\n quote={selectedQuote}\n loading={fetchingQuote}\n />\n </>\n )}\n\n {showMessages ? (\n <>\n <QuoteWarningsAndErrors\n warning={currentQuoteWarning}\n error={quoteError}\n skipAlerts={!!slippageValidation}\n couldChangeSettings={true}\n refetchQuote={fetchQuote}\n showWarningModal={showQuoteWarningModal}\n confirmationDisabled={!isActiveTab}\n onOpenWarningModal={() => setShowQuoteWarningModal(true)}\n onCloseWarningModal={() => setShowQuoteWarningModal(false)}\n onChangeSlippage={onChangeSlippage}\n onConfirmWarningModal={() => {\n setShowQuoteWarningModal(false);\n setQuoteWarningsConfirmed(true);\n onHandleNavigation(navigationRoutes.confirmSwap);\n }}\n onChangeSettings={() =>\n onHandleNavigation(navigationRoutes.settings)\n }\n />\n </>\n ) : null}\n\n {showSlippageAlerts && (\n <>\n <Divider size=\"10\" />\n <SlippageWarningsAndErrors\n onChangeSettings={() =>\n onHandleNavigation(navigationRoutes.settings)\n }\n />\n </>\n )}\n <SameTokensWarning />\n </PageContainer>\n </Layout>\n {isExpandable ? (\n <ExpandedQuotes\n loading={fetchingQuote}\n onClickOnQuote={onClickOnQuote}\n fetch={fetchQuote}\n onClickRefresh={onClickRefresh}\n isVisible={isVisibleExpanded}\n />\n ) : null}\n </MainContainer>\n );\n}\n", "import { i18n } from '@lingui/core';\nimport { Alert, Divider, NoRouteIcon, Typography } from '@rango-dev/ui';\nimport React from 'react';\n\nimport { useQuoteStore } from '../../store/quote';\nimport { areTokensEqual } from '../../utils/wallets';\n\nimport { Container } from './SameTokensWarning.styles';\n\nexport function SameTokensWarning() {\n const { fromToken, toToken } = useQuoteStore()();\n const showWarningMessage =\n !!fromToken && !!toToken && areTokensEqual(fromToken, toToken);\n\n return showWarningMessage ? (\n <Container>\n <Divider size={10} />\n <NoRouteIcon size={24} color=\"gray\" />\n <Divider size={4} />\n <Typography variant=\"title\" size={'small'}>\n {i18n.t('No Routes Found')}\n </Typography>\n <Divider size={4} />\n <Alert\n title={i18n.t('You cannot use the same token for From and To.')}\n type={'warning'}\n variant=\"alarm\"\n />\n </Container>\n ) : null;\n}\n", "import { styled } from '@rango-dev/ui';\n\nexport const Container = styled('div', {\n display: 'flex',\n flexDirection: 'column',\n alignItems: 'center',\n});\n", "import type { ActionType } from './SlippageWarningsAndErrors.helpers';\nimport type { PropTypes } from './SlippageWarningsAndErrors.types';\n\nimport { Alert, Button } from '@rango-dev/ui';\nimport React from 'react';\n\nimport { DEFAULT_SLIPPAGE } from '../../constants/swapSettings';\nimport { useAppStore } from '../../store/AppStore';\n\nimport { makeAlerts } from './SlippageWarningsAndErrors.helpers';\n\nexport function SlippageWarningsAndErrors(props: PropTypes) {\n const { slippage, customSlippage, setSlippage, setCustomSlippage } =\n useAppStore();\n const { onChangeSettings } = props;\n const currentSlippage = customSlippage !== null ? customSlippage : slippage;\n\n const alertInfo = makeAlerts(currentSlippage);\n\n const onClickActionButton = (action: ActionType) => {\n if (action === 'reset-slippage') {\n setSlippage(DEFAULT_SLIPPAGE);\n setCustomSlippage(null);\n } else if (action === 'change-settings') {\n onChangeSettings();\n }\n };\n\n if (!alertInfo) {\n return null;\n }\n return (\n <Alert\n title={alertInfo.title}\n type={alertInfo.alertType}\n variant=\"alarm\"\n action={\n <Button\n id=\"widget-slippage-warning-error-change-settings-or-reset-slippage-btn\"\n size=\"xxsmall\"\n type={alertInfo.alertType}\n onClick={() => onClickActionButton(alertInfo.action)}>\n {alertInfo.actionButtonTitle}\n </Button>\n }\n />\n );\n}\n", "import type { AlertInfo } from '../QuoteWarningsAndErrors/QuoteWarningsAndErrors.helpers';\n\nimport { i18n } from '@lingui/core';\n\nimport { HIGH_SLIPPAGE, MIN_SLIPPAGE } from '../../constants/swapSettings';\n\nexport type ActionType = AlertInfo['action'] | 'reset-slippage';\n\ntype Alert = Omit<AlertInfo, 'action'> & {\n action: ActionType;\n};\n\nexport function makeAlerts(slippage: number): Alert | null {\n let alertInfo: Alert | null = null;\n if (slippage === MIN_SLIPPAGE) {\n alertInfo = {\n alertType: 'error',\n action: 'reset-slippage',\n actionButtonTitle: i18n.t('Reset'),\n title: i18n.t('Slippage cannot be set lower than 0.01%.'),\n };\n return alertInfo;\n } else if (slippage > HIGH_SLIPPAGE) {\n alertInfo = {\n alertType: 'warning',\n action: 'change-settings',\n actionButtonTitle: i18n.t('Change'),\n title: i18n.t('Caution, your slippage is high!'),\n };\n return alertInfo;\n }\n return null;\n}\n", "import type { PropTypes } from './SwapMetrics.types';\n\nimport { i18n } from '@lingui/core';\nimport {\n IconButton,\n ReverseIcon,\n Skeleton,\n Tooltip,\n Typography,\n} from '@rango-dev/ui';\nimport React from 'react';\n\nimport { useTheme } from '../../hooks/useTheme';\nimport { useAppStore } from '../../store/AppStore';\nimport { getContainer } from '../../utils/common';\nimport { getSlippageValidation } from '../../utils/settings';\n\nimport {\n formatTokenValueInUsd,\n getSlippageColor,\n getUsdExchangeRate,\n} from './SwapMetrics.helpers';\nimport { Container, Rate, TokenName } from './SwapMetrics.styles';\n\nexport function SwapMetrics(props: PropTypes) {\n const { slippage, customSlippage, quoteTokensRate, changeQuoteTokensRate } =\n useAppStore();\n const {\n quoteError,\n quoteWarning,\n fromToken: initialFromToken,\n toToken: initialToToken,\n quote,\n loading,\n } = props;\n const currentSlippage = customSlippage !== null ? customSlippage : slippage;\n const { mode } = useTheme({});\n const slippageValidation = getSlippageValidation(currentSlippage);\n const isDarkTheme = mode === 'dark';\n const isDefaultRate = quoteTokensRate === 'default';\n\n const error = {\n quoteError,\n slippageError:\n slippageValidation?.type === 'error' ? slippageValidation.message : null,\n };\n const warning = {\n quoteWarning,\n slippageWarning:\n slippageValidation?.type === 'warning'\n ? slippageValidation.message\n : null,\n };\n\n const sourceToken = quote?.swaps[0]?.from || initialFromToken;\n const destinationToken =\n quote?.swaps[quote?.swaps.length - 1]?.to || initialToToken;\n\n const fromToken = isDefaultRate ? sourceToken : destinationToken;\n const toToken = isDefaultRate ? destinationToken : sourceToken;\n\n const fromAmount = Number(\n isDefaultRate ? quote?.outputAmount : quote?.requestAmount\n );\n const toAmount = Number(\n isDefaultRate ? quote?.requestAmount : quote?.outputAmount\n );\n\n const fromTokenUsdPrice = fromAmount || fromToken.usdPrice;\n const toTokenUsdPrice = toAmount || toToken.usdPrice;\n\n const { rawValue: rawExchangeRate, displayValue: displayExchangeRate } =\n getUsdExchangeRate({\n toTokenUsdPrice,\n fromTokenUsdPrice,\n });\n\n return (\n <Container>\n <Typography\n variant={!!error || !!warning ? 'label' : 'body'}\n size={!!error || !!warning ? 'medium' : 'small'}\n color={getSlippageColor({ error, warning, isDarkTheme })}>\n {i18n.t('Slippage:')} {currentSlippage}%\n </Typography>\n {loading ? (\n <Skeleton height={16} width={104} variant=\"rounded\" />\n ) : (\n fromTokenUsdPrice &&\n toTokenUsdPrice && (\n <Rate>\n <Typography className=\"rate-text\" variant=\"body\" size=\"small\">\n 1\n </Typography>\n <TokenName className=\"rate-text\" variant=\"body\" size=\"small\">\n {toToken.symbol}\n </TokenName>\n <IconButton\n id=\"widget-home-page-change-rate-button\"\n onClick={changeQuoteTokensRate}>\n <ReverseIcon size={14} color=\"secondary\" />\n </IconButton>\n <Tooltip\n container={getContainer()}\n side=\"top\"\n sideOffset={4}\n content={\n <Typography className=\"rate-text\" variant=\"body\" size=\"small\">\n {rawExchangeRate}\n </Typography>\n }>\n <Typography className=\"rate-text\" variant=\"body\" size=\"small\">\n {displayExchangeRate}\n </Typography>\n </Tooltip>\n\n <TokenName className=\"rate-text\" variant=\"body\" size=\"small\">\n {fromToken.symbol}\n </TokenName>\n {fromToken.usdPrice && (\n <Typography color=\"neutral600\" variant=\"body\" size=\"small\">\n ~\n {formatTokenValueInUsd(\n Number(rawExchangeRate),\n fromToken.usdPrice\n )}\n </Typography>\n )}\n </Rate>\n )\n )}\n </Container>\n );\n}\n", "import type { SlippageColorParams } from './SwapMetrics.types';\n\nimport BigNumber from 'bignumber.js';\n\nimport { QuoteErrorType, QuoteWarningType } from '../../types';\n\nimport {\n LARGE_VALUE_MAX_DIGITS,\n SMALL_VALUE_DECIMALS,\n USD_EXCHANGE_MINIMUM,\n USD_FORMAT_DECIMALS,\n} from './SwapMetrics.constants';\n\nexport function getSlippageColor(params: SlippageColorParams) {\n const { error, isDarkTheme, warning } = params;\n const { quoteError, slippageError } = error;\n const { quoteWarning, slippageWarning } = warning;\n const hasSlippageError =\n !!slippageError ||\n quoteError?.type === QuoteErrorType.INSUFFICIENT_SLIPPAGE;\n const hasSlippageWarning =\n !!slippageWarning ||\n quoteWarning?.type === QuoteWarningType.INSUFFICIENT_SLIPPAGE;\n\n if (hasSlippageError) {\n return '$error500';\n } else if (hasSlippageWarning) {\n return '$warning500';\n }\n if (isDarkTheme) {\n return '$neutral600';\n }\n return '$neutral700';\n}\n\nexport function getUsdExchangeRate(params: {\n toTokenUsdPrice: number | null;\n fromTokenUsdPrice: number | null;\n}) {\n const { toTokenUsdPrice, fromTokenUsdPrice } = params;\n if (!toTokenUsdPrice || !fromTokenUsdPrice) {\n return { rawValue: '0', displayValue: '0' };\n }\n const toPrice = new BigNumber(toTokenUsdPrice);\n const fromPrice = new BigNumber(fromTokenUsdPrice);\n const rawValue = toPrice.dividedBy(fromPrice);\n let displayValue: string;\n\n if (rawValue.isLessThan(1)) {\n /*\n * Format the number with up to SMALL_VALUE_DECIMALS digits after the decimal point,\n * then remove any trailing zeros.\n * Example: \"0.120000\" \u2192 \"0.12\", \"0.00000000000010\" \u2192 \"0.0000000000001\"\n */\n displayValue = rawValue.toFixed(SMALL_VALUE_DECIMALS).replace(/\\.?0+$/, '');\n } else if (rawValue.toFixed(0).length > LARGE_VALUE_MAX_DIGITS) {\n displayValue = rawValue.toFixed(0).slice(0, LARGE_VALUE_MAX_DIGITS);\n } else {\n displayValue = rawValue.toFixed(USD_FORMAT_DECIMALS);\n }\n return {\n displayValue,\n rawValue: rawValue.toFixed(),\n };\n}\n\nexport function formatTokenValueInUsd(\n usdExchangeRate: number,\n tokenUsdPrice: number\n): string {\n const value = new BigNumber(usdExchangeRate).multipliedBy(tokenUsdPrice);\n if (value.isLessThan(USD_EXCHANGE_MINIMUM)) {\n return '$0';\n }\n const result = value\n .decimalPlaces(USD_FORMAT_DECIMALS, BigNumber.ROUND_DOWN)\n .toFormat(USD_FORMAT_DECIMALS);\n\n return `$${result}`;\n}\n", "import { darkTheme, styled, Typography } from '@rango-dev/ui';\n\nexport const Container = styled('div', {\n display: 'flex',\n padding: '$4',\n justifyContent: 'space-between',\n alignItems: 'center',\n});\n\nexport const Rate = styled('div', {\n display: 'flex',\n alignItems: 'center',\n gap: '$2',\n '& .rate-text': {\n color: '$neutral700',\n [`.${darkTheme} &`]: {\n color: '$neutral700',\n },\n },\n '& ._icon-button': {\n transform: 'rotate(90deg)',\n width: '$16',\n height: '$16',\n },\n});\n\nexport const TokenName = styled(Typography, {\n maxWidth: '$32',\n overflow: 'hidden',\n textOverflow: 'ellipsis',\n whiteSpace: 'nowrap',\n});\n", "import type { PropTypes } from './ExpandedQuotes.types';\n\nimport { i18n } from '@lingui/core';\nimport { Header } from '@rango-dev/ui';\nimport React, { useEffect, useState } from 'react';\n\nimport { HeaderButtons } from '../../components/HeaderButtons';\nimport { LayoutContainer } from '../../components/Layout/Layout.styles';\nimport { Quotes } from '../../components/Quotes';\nimport { SelectStrategy } from '../../components/Quotes/SelectStrategy';\nimport { WIDGET_UI_ID } from '../../constants';\nimport { useAppStore } from '../../store/AppStore';\nimport { getExpanded } from '../../utils/common';\n\nimport { Container, Content } from './ExpandedQuotes.styles';\n\nexport const TIME_TO_CLOSE_OPEN_EXPANDED = 100;\n\nexport function ExpandedQuotes(props: PropTypes) {\n const { fetch, loading, onClickOnQuote, onClickRefresh, isVisible } = props;\n const [isDelayedVisible, setIsDelayedVisible] = useState(false);\n const containerClass = isDelayedVisible ? '' : 'is-hidden';\n const { config } = useAppStore();\n const fullExpandedMode = config?.variant === 'full-expanded';\n const container = getExpanded();\n useEffect(() => {\n let timeout: ReturnType<typeof setTimeout> | null = null;\n\n if (isVisible) {\n timeout = setTimeout(() => {\n setIsDelayedVisible(true);\n }, TIME_TO_CLOSE_OPEN_EXPANDED);\n } else {\n setIsDelayedVisible(false);\n if (timeout) {\n clearTimeout(timeout);\n }\n }\n\n return () => {\n if (timeout) {\n clearTimeout(timeout);\n }\n };\n }, [isVisible]);\n\n return (\n <Container\n expandMode={config?.variant === 'full-expanded' ? 'full' : 'default'}\n className={`${containerClass} ${LayoutContainer()} widget-expanded-quotes-container`}\n id={WIDGET_UI_ID.EXPANDED_BOX_ID}>\n <Header\n title={i18n.t('Routes')}\n suffix={\n <>\n <SelectStrategy container={container} />\n <HeaderButtons\n container={container}\n onClickRefresh={onClickRefresh}\n hidden={['history', 'notifications', 'settings']}\n />\n </>\n }\n />\n <Content>\n <Quotes\n showModalFee={true}\n fetch={fetch}\n hasSort={false}\n loading={loading}\n container={getExpanded()}\n onClickOnQuote={onClickOnQuote}\n fullExpandedMode={fullExpandedMode}\n />\n </Content>\n </Container>\n );\n}\n", "import type { PropTypes } from './Quotes.types';\nimport type { MultiRouteSimulationResult } from 'rango-sdk';\n\nimport { i18n } from '@lingui/core';\nimport { Divider, FullExpandedQuote, Typography } from '@rango-dev/ui';\nimport React from 'react';\n\nimport { QuoteInfo } from '../../containers/QuoteInfo';\nimport { getQuoteError } from '../../hooks/useConfirmSwap/useConfirmSwap.helpers';\nimport { useAppStore } from '../../store/AppStore';\nimport { useQuoteStore } from '../../store/quote';\nimport { QuoteErrorType, type SelectedQuote } from '../../types';\nimport { getContainer } from '../../utils/common';\nimport { generateQuoteWarnings, sortQuotesBy } from '../../utils/quote';\nimport { NoResult } from '../NoResult';\nimport { QuoteSkeleton } from '../QuoteSkeleton';\n\nimport { ErrorsContainer, StrategyContent } from './Quotes.styles';\nimport { SelectStrategy } from './SelectStrategy';\n\nconst ITEM_SKELETON_COUNT = 3;\nexport function Quotes(props: PropTypes) {\n const {\n loading,\n onClickOnQuote,\n fetch,\n showModalFee,\n hasSort = true,\n fullExpandedMode = false,\n container: propContainer,\n } = props;\n const {\n selectedQuote,\n quotes,\n updateQuotePartialState,\n fromToken,\n toToken,\n sortStrategy,\n error,\n } = useQuoteStore()();\n const { slippage, customSlippage } = useAppStore();\n const { findToken } = useAppStore();\n const container = propContainer || getContainer();\n const hasQuotes = !!quotes && quotes.results.length;\n const userSlippage = customSlippage ?? slippage;\n const getQuoteWarning = (quote: MultiRouteSimulationResult) => {\n if (!fromToken || !toToken || !quotes) {\n return null;\n }\n const mergedQuote: SelectedQuote = {\n requestAmount: quotes.requestAmount, // Assuming quotes is an array\n validationStatus: null,\n ...quote,\n };\n\n return generateQuoteWarnings({\n currentQuote: mergedQuote,\n userSlippage,\n findToken,\n });\n };\n const showNoResultMessage =\n error?.type === QuoteErrorType.NO_RESULT ||\n error?.type === QuoteErrorType.REQUEST_FAILED;\n\n const sortQuotes = quotes?.results\n ? sortQuotesBy(sortStrategy, quotes?.results)\n : [];\n\n return (\n <>\n {hasSort && (\n <>\n <StrategyContent>\n <Typography size=\"xmedium\" variant=\"title\">\n {i18n.t('Sort by')}\n </Typography>\n <SelectStrategy container={container} />\n </StrategyContent>\n <Divider size=\"10\" />\n </>\n )}\n\n {loading &&\n Array.from({ length: ITEM_SKELETON_COUNT }, (_, index) => (\n <React.Fragment key={index}>\n {fullExpandedMode ? (\n <FullExpandedQuote loading />\n ) : (\n <QuoteSkeleton\n tagHidden={false}\n type=\"list-item\"\n expanded={false}\n />\n )}\n {index !== ITEM_SKELETON_COUNT - 1 && <Divider size={16} />}\n </React.Fragment>\n ))}\n\n {!loading && (\n <>\n {hasQuotes\n ? sortQuotes.map((quote, index) => {\n const quoteWarning = getQuoteWarning(quote);\n const quoteError = getQuoteError(quote.swaps);\n const lastIndex = sortQuotes.length - 1 === index;\n\n return (\n <React.Fragment key={quote.requestId}>\n <QuoteInfo\n id=\"widget-quotes-quote-info-container\"\n showModalFee={showModalFee}\n container={container}\n selected={selectedQuote?.requestId === quote.requestId}\n tagHidden={false}\n quote={{\n ...quote,\n requestAmount: quotes.requestAmount,\n validationStatus: null,\n }}\n loading={loading}\n error={quoteError?.options || null}\n warning={quoteWarning}\n fullExpandedMode={fullExpandedMode}\n onClick={(quote) => {\n if (!quoteError) {\n updateQuotePartialState('warning', quoteWarning);\n }\n updateQuotePartialState(\n 'error',\n quoteError?.options || null\n );\n onClickOnQuote(quote);\n }}\n type=\"list-item\"\n />\n {!lastIndex && <Divider size={16} />}\n </React.Fragment>\n );\n })\n : showNoResultMessage && (\n <ErrorsContainer>\n <NoResult\n size={fullExpandedMode ? 'large' : 'small'}\n error={error}\n fetch={fetch}\n />\n </ErrorsContainer>\n )}\n </>\n )}\n </>\n );\n}\n", "import { styled } from '@rango-dev/ui';\n\nexport const ErrorsContainer = styled('div', {\n display: 'flex',\n justifyContent: 'center',\n flexDirection: 'column',\n height: '100%',\n});\n\nexport const StrategyContent = styled('div', {\n display: 'flex',\n justifyContent: 'space-between',\n alignItems: 'center',\n});\n\nexport const SelectContainer = styled('div', {\n width: '146px',\n});\n", "import type { PreferenceType } from 'rango-sdk';\n\nimport { i18n } from '@lingui/core';\nimport { Select } from '@rango-dev/ui';\nimport React from 'react';\n\nimport { useQuoteStore } from '../../store/quote';\n\nimport { SelectContainer } from './Quotes.styles';\n\nexport function SelectStrategy(props: { container: HTMLElement }) {\n const { updateQuotePartialState, sortStrategy } = useQuoteStore()();\n\n const ROUTE_STRATEGY: { value: PreferenceType; label: string }[] = [\n {\n value: 'SMART',\n label: i18n.t('Smart Routing'),\n },\n {\n value: 'FEE',\n label: i18n.t('Lowest Fee'),\n },\n {\n value: 'SPEED',\n label: i18n.t('Fastest Transfer'),\n },\n {\n value: 'NET_OUTPUT',\n label: i18n.t('Maximum Return'),\n },\n {\n value: 'PRICE',\n label: i18n.t('Maximum Output'),\n },\n ];\n\n return (\n <SelectContainer>\n <Select\n id={'widget-quotes-strategy-select'}\n container={props.container}\n options={ROUTE_STRATEGY}\n value={sortStrategy}\n handleItemClick={(item) => {\n updateQuotePartialState('sortStrategy', item.value);\n }}\n variant=\"filled\"\n />\n </SelectContainer>\n );\n}\n", "import { darkTheme, styled } from '@rango-dev/ui';\n\nexport const Container = styled('div', {\n transition: 'width 0.2s, opacity 0.2s, margin-left 0.2s',\n height: '700px',\n width: '390px',\n position: 'relative',\n opacity: 1,\n marginLeft: '$16',\n backgroundColor: '$neutral100',\n [`.${darkTheme} &`]: {\n backgroundColor: '$neutral300',\n },\n\n variants: {\n expandMode: {\n default: {\n width: '390px',\n },\n full: {\n width: '719px',\n },\n },\n },\n\n '&.is-hidden': {\n width: 0,\n height: 0,\n opacity: 0,\n marginLeft: 0,\n },\n});\n\nexport const Content = styled('div', {\n position: 'relative',\n overflow: 'hidden',\n padding: '$20',\n flexGrow: 1,\n display: 'flex',\n flexDirection: 'column',\n overflowY: 'auto',\n borderRadius: '$primary',\n backgroundColor: '$background',\n});\n", "import type { PropTypes } from './Inputs.types';\n\nimport { i18n } from '@lingui/core';\nimport { SwapInput } from '@rango-dev/ui';\nimport BigNumber from 'bignumber.js';\nimport React from 'react';\n\nimport { SwitchFromAndToButton } from '../../components/SwitchFromAndTo';\nimport { errorMessages } from '../../constants/errors';\nimport { ZERO } from '../../constants/numbers';\nimport {\n PERCENTAGE_CHANGE_MAX_DECIMALS,\n PERCENTAGE_CHANGE_MIN_DECIMALS,\n TOKEN_AMOUNT_MAX_DECIMALS,\n TOKEN_AMOUNT_MIN_DECIMALS,\n USD_VALUE_MAX_DECIMALS,\n USD_VALUE_MIN_DECIMALS,\n} from '../../constants/routing';\nimport { useSwapMode } from '../../hooks/useSwapMode';\nimport { useAppStore } from '../../store/AppStore';\nimport { useQuoteStore } from '../../store/quote';\nimport { getContainer } from '../../utils/common';\nimport { numberToString } from '../../utils/numbers';\nimport { getPriceImpact, getPriceImpactLevel } from '../../utils/quote';\nimport { canComputePriceImpact } from '../../utils/swap';\nimport { formatBalance, isFetchingBalance } from '../../utils/wallets';\n\nimport { Container, FromContainer } from './Inputs.styles';\n\nexport function Inputs(props: PropTypes) {\n const { fetchingQuote, fetchMetaStatus, onClickToken, isExpandable } = props;\n const {\n fromToken,\n fromBlockchain,\n toToken,\n toBlockchain,\n setInputAmount,\n sanitizeInputAmount,\n inputAmount,\n inputUsdValue,\n outputAmount,\n outputUsdValue,\n selectedQuote,\n } = useQuoteStore()();\n const { swapMode } = useSwapMode();\n const { connectedWallets, getBalanceFor } = useAppStore();\n const fromTokenBalance = fromToken ? getBalanceFor(fromToken) : null;\n const fromTokenFormattedBalance =\n formatBalance(fromTokenBalance)?.amount ?? '0';\n\n const fromBalanceAmount = fromTokenBalance\n ? new BigNumber(fromTokenBalance.amount).shiftedBy(\n -fromTokenBalance.decimals\n )\n : ZERO;\n\n const fetchingBalance =\n !!fromBlockchain &&\n isFetchingBalance(connectedWallets, fromBlockchain.name);\n\n const priceImpactInputCanNotBeComputed = !canComputePriceImpact(\n selectedQuote,\n inputAmount,\n inputUsdValue\n );\n\n const priceImpactOutputCanNotBeComputed = !canComputePriceImpact(\n selectedQuote,\n inputAmount,\n outputUsdValue\n );\n\n const percentageChange =\n !inputUsdValue || !outputUsdValue || !outputUsdValue.gt(0)\n ? null\n : getPriceImpact(inputUsdValue.toString(), outputUsdValue.toString());\n\n return (\n <Container>\n <FromContainer>\n <SwapInput\n label={i18n.t('From')}\n id=\"widget-swap-from\"\n mode=\"From\"\n onInputChange={setInputAmount}\n onInputBlur={sanitizeInputAmount}\n balance={fromTokenFormattedBalance}\n chain={{\n displayName: fromBlockchain?.displayName || '',\n image: fromBlockchain?.logo,\n }}\n token={{\n displayName: fromToken?.symbol || '',\n image: fromToken?.image,\n securityWarning: !!fromToken?.warning,\n }}\n onClickToken={() => onClickToken('from')}\n price={{\n value: inputAmount,\n usdValue: priceImpactInputCanNotBeComputed\n ? undefined\n : numberToString(\n inputUsdValue,\n USD_VALUE_MIN_DECIMALS,\n USD_VALUE_MAX_DECIMALS\n ),\n realUsdValue: priceImpactInputCanNotBeComputed\n ? undefined\n : inputUsdValue?.toString(),\n error: priceImpactInputCanNotBeComputed\n ? errorMessages().unknownPriceError.impactTitle\n : undefined,\n }}\n disabled={fetchMetaStatus === 'failed'}\n loading={fetchMetaStatus === 'loading'}\n loadingBalance={fetchingBalance}\n tooltipContainer={getContainer()}\n onSelectMaxBalance={() => {\n const tokenBalanceReal = numberToString(\n fromBalanceAmount,\n fromTokenBalance?.decimals\n );\n\n // if a token hasn't any value, we will reset the input by setting an empty string.\n const nextInputAmount = !!fromTokenBalance?.amount\n ? tokenBalanceReal.split(',').join('')\n : '';\n\n setInputAmount(nextInputAmount);\n }}\n anyWalletConnected={connectedWallets.length > 0}\n />\n {swapMode === 'swap' && <SwitchFromAndToButton />}\n </FromContainer>\n <SwapInput\n selectionType={swapMode === 'swap' ? 'token' : 'chain'}\n sharpBottomStyle={!isExpandable && (!!selectedQuote || fetchingQuote)}\n label={i18n.t('To')}\n mode=\"To\"\n id=\"widget-swap-to-input\"\n fetchingQuote={fetchingQuote}\n chain={{\n displayName: toBlockchain?.displayName || '',\n image: toBlockchain?.logo,\n }}\n token={{\n displayName: toToken?.symbol || '',\n image: toToken?.image,\n securityWarning: !!toToken?.warning,\n }}\n percentageChange={numberToString(\n getPriceImpact(inputUsdValue, outputUsdValue),\n PERCENTAGE_CHANGE_MIN_DECIMALS,\n PERCENTAGE_CHANGE_MAX_DECIMALS\n )}\n warningLevel={getPriceImpactLevel(percentageChange ?? 0)}\n price={{\n value: numberToString(\n outputAmount,\n TOKEN_AMOUNT_MIN_DECIMALS,\n TOKEN_AMOUNT_MAX_DECIMALS\n ),\n usdValue: priceImpactOutputCanNotBeComputed\n ? undefined\n : numberToString(\n outputUsdValue,\n USD_VALUE_MIN_DECIMALS,\n USD_VALUE_MAX_DECIMALS\n ),\n realValue: outputAmount?.toString(),\n realUsdValue: priceImpactOutputCanNotBeComputed\n ? undefined\n : outputUsdValue?.toString(),\n error: priceImpactOutputCanNotBeComputed\n ? errorMessages().unknownPriceError.impactTitle\n : undefined,\n }}\n onClickToken={() => onClickToken('to')}\n disabled={fetchMetaStatus === 'failed'}\n loading={fetchMetaStatus === 'loading'}\n tooltipContainer={getContainer()}\n />\n </Container>\n );\n}\n", "import { ReverseIcon } from '@rango-dev/ui';\nimport React from 'react';\n\nimport { useQuoteStore } from '../../store/quote';\n\nimport {\n ROTATE_ANIMATION_DURATION,\n StyledButton,\n SwitchButtonContainer,\n} from './SwitchFromAndTo.styles';\n\nexport function SwitchFromAndToButton() {\n const switchFromAndTo = useQuoteStore().use.switchFromAndTo();\n\n return (\n <SwitchButtonContainer>\n <StyledButton\n id=\"widget-switch-from-and-to-btn\"\n onClick={(event) => {\n const button = event.currentTarget;\n\n button.classList.add('rotate');\n\n setTimeout(() => {\n button.classList.remove('rotate');\n }, ROTATE_ANIMATION_DURATION);\n switchFromAndTo();\n }}>\n <ReverseIcon size={12} />\n </StyledButton>\n </SwitchButtonContainer>\n );\n}\n", "import { keyframes, styled } from '@rango-dev/ui';\n\nexport const ROTATE_ANIMATION_DURATION = 450;\n\nconst rotateAnimation = keyframes({\n '0%': {\n transform: 'rotateX(0deg) rotateY(0deg) rotateZ(0deg)',\n },\n '33%': {\n transform: 'rotateX(0deg) rotateZ(78deg) rotateY(66deg)',\n },\n '66%': {\n transform: 'rotateX(0deg) rotateZ(163deg) rotateY(66deg)',\n },\n '100%': {\n transform: 'rotateX(0deg) rotateZ(180deg) rotateY(0deg)',\n },\n});\n\nexport const SwitchButtonContainer = styled('div', {\n position: 'absolute',\n bottom: '-12px',\n left: '50%',\n transform: 'translate(-50%, 10%)',\n cursor: 'pointer',\n});\n\nexport const StyledButton = styled('div', {\n borderRadius: '$md',\n border: '3px solid $background',\n background: '$neutral100',\n width: '$24',\n height: '$24',\n display: 'flex',\n justifyContent: 'center',\n alignItems: 'center',\n color: '$foreground',\n '&.rotate': {\n '& svg': {\n animation: `${rotateAnimation} ${ROTATE_ANIMATION_DURATION}ms ease-in-out forwards`,\n },\n },\n '&:hover': {\n color: '$secondary500',\n transform: 'translateY(1px) scale(1.04)',\n boxShadow: '1px 1px 1px 1px rgba(0, 0, 0, 0.05)',\n },\n});\n", "import { styled } from '@rango-dev/ui';\n\nexport const Container = styled('div', {\n display: 'flex',\n flexDirection: 'column',\n gap: '$5',\n alignSelf: 'stretch',\n});\n\nexport const FromContainer = styled('div', {\n position: 'relative',\n});\n", "import type { Token } from 'rango-sdk';\n\nimport { warn } from '@rango-dev/logging-core';\nimport { useCallback, useEffect, useRef, useState } from 'react';\n\nimport { useAppStore } from '../store/AppStore';\nimport { useQuoteStore } from '../store/quote';\nimport { QuoteErrorType } from '../types';\nimport { debounce } from '../utils/common';\nimport { isPositiveNumber } from '../utils/numbers';\nimport {\n generateQuoteWarnings,\n getDefaultQuote,\n sortQuotesBy,\n} from '../utils/quote';\nimport { isRoutingEnabled } from '../utils/settings';\nimport { createQuoteRequestBody } from '../utils/swap';\nimport { areTokensEqual } from '../utils/wallets';\n\nimport {\n handleQuoteErrors,\n throwErrorIfResponseIsNotValid,\n} from './useConfirmSwap/useConfirmSwap.helpers';\nimport { useFetchAllQuotes } from './useFetchAllQuotes';\nimport { useSwapMode } from './useSwapMode';\n\nconst DEBOUNCE_DELAY = 600;\n\ntype FetchQuoteParams = Omit<\n Parameters<typeof createQuoteRequestBody>[0],\n 'fromToken' | 'toToken'\n> & { fromToken: Token | null; toToken: Token | null };\n\ntype UseSwapInput = {\n fetch: (shouldChangeSelectedQuote?: boolean) => void;\n loading: boolean;\n};\ntype UseSwapInputProps = {\n refetchQuote: boolean;\n};\n/**\n * a hook for fetching quote based on from and to input values\n * we use this hook in home page\n */\nexport function useSwapInput({\n refetchQuote,\n}: UseSwapInputProps): UseSwapInput {\n const { fetch: fetchQuote, cancelFetch } = useFetchAllQuotes();\n const { excludeLiquiditySources: configExcludeLiquiditySources, routing } =\n useAppStore().config;\n const { connectedWallets } = useAppStore();\n const anyContractWalletConnected = connectedWallets.some(\n (wallet) => wallet.isContractWallet\n );\n const contractCall = anyContractWalletConnected;\n\n const {\n fromToken,\n toToken,\n inputAmount,\n inputUsdValue,\n selectedQuote,\n sortStrategy,\n resetQuote,\n error,\n warning,\n setSelectedQuote,\n updateQuotePartialState,\n } = useQuoteStore()();\n const {\n slippage,\n customSlippage,\n affiliatePercent,\n affiliateRef,\n affiliateWallets,\n fetchStatus,\n } = useAppStore();\n const liquiditySources = useAppStore().getLiquiditySources();\n const disabledLiquiditySources = useAppStore().getDisabledLiquiditySources();\n const excludeLiquiditySources = useAppStore().excludeLiquiditySources();\n const { findToken } = useAppStore();\n const { swapMode } = useSwapMode();\n\n const [loading, setLoading] = useState(true);\n const prevInputAmount = useRef(inputAmount);\n const userSlippage = customSlippage ?? slippage;\n const tokensValueInvalid = !fromToken || !toToken;\n const shouldSkipRequest =\n tokensValueInvalid ||\n areTokensEqual(fromToken, toToken) ||\n !isPositiveNumber(inputAmount);\n\n const resetState = (loading: boolean) => {\n setLoading(loading);\n };\n\n const fetch = (params: FetchQuoteParams) => {\n const {\n fromToken,\n toToken,\n inputAmount,\n liquiditySources,\n excludeLiquiditySources,\n disabledLiquiditySources,\n slippage,\n affiliateRef,\n affiliatePercent,\n affiliateWallets,\n } = params;\n\n if (!loading) {\n resetState(true);\n }\n if (!shouldSkipRequest && fromToken && toToken) {\n resetQuote();\n const requestBody = createQuoteRequestBody({\n fromToken,\n toToken,\n inputAmount,\n liquiditySources: liquiditySources,\n excludeLiquiditySources,\n disabledLiquiditySources,\n wallets: connectedWallets,\n slippage,\n affiliateRef,\n affiliatePercent,\n affiliateWallets,\n contractCall,\n });\n if (isRoutingEnabled('experimental', routing)) {\n requestBody.experimental = true;\n }\n\n if (isRoutingEnabled('avoidNativeFee', routing)) {\n requestBody.avoidNativeFee = true;\n }\n\n if (isRoutingEnabled('enableCentralizedSwappers', routing)) {\n requestBody.enableCentralizedSwappers = true;\n }\n\n if (routing?.maxLength) {\n requestBody.maxLength = routing.maxLength;\n }\n\n if (swapMode === 'refuel') {\n requestBody.maxLength = 1;\n }\n\n fetchQuote(requestBody)\n .then((res) => {\n const sortQuotes = sortQuotesBy(sortStrategy, res.results);\n const quote = getDefaultQuote(\n selectedQuote,\n sortQuotes,\n res.requestAmount\n );\n\n setLoading(false);\n updateQuotePartialState('quotes', res);\n setSelectedQuote(quote);\n\n throwErrorIfResponseIsNotValid({\n diagnosisMessages: res.diagnosisMessages,\n requestId: quote?.requestId || '',\n swaps: quote?.swaps,\n });\n const quoteWarning =\n quote &&\n generateQuoteWarnings({\n currentQuote: quote,\n userSlippage,\n findToken,\n });\n updateQuotePartialState('warning', quoteWarning);\n })\n .catch((error) => {\n const quoteError = handleQuoteErrors(error);\n if (\n quoteError.type === QuoteErrorType.NO_RESULT ||\n quoteError.type === QuoteErrorType.REQUEST_FAILED\n ) {\n resetQuote();\n }\n\n if (quoteError.type !== QuoteErrorType.REQUEST_CANCELED) {\n updateQuotePartialState('error', quoteError);\n setLoading(false);\n warn(new Error('quote error'), {\n tags: {\n ...quoteError,\n type: QuoteErrorType[quoteError.type],\n requestBody,\n },\n });\n }\n });\n }\n };\n\n const debouncedFetch = useCallback(\n debounce((params: FetchQuoteParams) => {\n fetch(params);\n }, DEBOUNCE_DELAY),\n [shouldSkipRequest]\n );\n\n useEffect(() => {\n if (!refetchQuote) {\n setLoading(false);\n return;\n }\n if (fetchStatus !== 'success') {\n return;\n }\n if (shouldSkipRequest) {\n setLoading(false);\n if (selectedQuote || error || warning) {\n resetQuote();\n }\n return;\n }\n if (!isPositiveNumber(inputAmount) && inputUsdValue?.eq(0)) {\n resetState(false);\n cancelFetch();\n return;\n }\n\n resetQuote();\n resetState(true);\n\n let fetchQuotes = fetch;\n if (prevInputAmount.current && prevInputAmount.current != inputAmount) {\n fetchQuotes = debouncedFetch;\n }\n prevInputAmount.current = inputAmount;\n\n fetchQuotes({\n inputAmount,\n fromToken,\n toToken,\n liquiditySources,\n excludeLiquiditySources,\n disabledLiquiditySources,\n slippage: userSlippage,\n affiliateRef,\n affiliatePercent,\n affiliateWallets,\n contractCall,\n });\n return cancelFetch;\n }, [\n fetchStatus,\n inputAmount,\n fromToken?.symbol,\n fromToken?.address,\n fromToken?.blockchain,\n toToken?.symbol,\n toToken?.address,\n toToken?.blockchain,\n shouldSkipRequest,\n liquiditySources?.length,\n configExcludeLiquiditySources,\n disabledLiquiditySources.length,\n userSlippage,\n affiliateRef,\n affiliatePercent,\n contractCall,\n JSON.stringify(affiliateWallets),\n ]);\n\n return {\n fetch: () =>\n fetch({\n inputAmount,\n fromToken,\n toToken,\n liquiditySources,\n excludeLiquiditySources,\n disabledLiquiditySources,\n slippage: userSlippage,\n affiliateRef,\n affiliatePercent,\n affiliateWallets,\n contractCall,\n }),\n loading,\n };\n}\n", "import type { UseFetchResult } from './useFetch';\nimport type { BestRouteRequest, MultiRouteResponse } from 'rango-sdk';\n\nimport { httpService } from '../services/httpService';\n\nimport { useFetch } from './useFetch';\n\nexport function useFetchAllQuotes(): UseFetchResult<\n BestRouteRequest,\n MultiRouteResponse\n> {\n const { fetch, loading, cancelFetch } = useFetch<\n BestRouteRequest,\n MultiRouteResponse\n >({\n request: async (requestBody, options) =>\n await httpService().getAllRoutes(requestBody, options),\n });\n\n return { fetch, loading, cancelFetch };\n}\n", "import { eventEmitter } from '../services/eventEmitter';\nimport { type UiEventData, WidgetEvents } from '../types';\n\ntype UiEvent = {\n type: UiEventData['type'];\n payload?: Omit<UiEventData['payload'], 'preventDefault'>;\n};\n\nexport function emitPreventableEvent(event: UiEvent, action: () => void): void {\n let defaultPrevented = false;\n\n const extendedPayload = {\n preventDefault() {\n defaultPrevented = true;\n },\n ...(event.payload === undefined && { payload: event.payload }),\n };\n\n eventEmitter.emit(WidgetEvents.UiEvent, {\n type: event.type,\n payload: extendedPayload,\n });\n\n if (!defaultPrevented) {\n action();\n }\n}\n", "import { i18n } from '@lingui/core';\nimport {\n Alert,\n Divider,\n List,\n ListItemButton,\n Radio,\n RadioRoot,\n Typography,\n} from '@rango-dev/ui';\nimport React from 'react';\n\nimport { Layout, PageContainer } from '../components/Layout';\nimport { useLanguage } from '../hooks/useLanguage';\nimport { useNavigateBack } from '../hooks/useNavigateBack';\n\nexport function LanguagePage() {\n const { activeLanguage, changeLanguage, languages } = useLanguage();\n const navigateBack = useNavigateBack();\n\n const languageList = languages.map((languageItem) => {\n const { local, label, SVGFlag } = languageItem;\n return {\n id: `widget-setting-languages-${local}-item-btn`,\n value: local,\n title: (\n <Typography variant=\"title\" size=\"xmedium\">\n {label}\n </Typography>\n ),\n onClick: () => {\n changeLanguage(languageItem.local);\n navigateBack();\n },\n end: <Radio value={local} />,\n start: <SVGFlag />,\n };\n });\n\n return (\n <Layout\n header={{\n title: i18n.t('Language'),\n }}>\n <PageContainer>\n <Alert\n type=\"warning\"\n id=\"widget-language-machine-translation-alarm-alert\"\n variant=\"alarm\"\n title=\"Warning: We are using machine translation, so the translations may be inaccurate.\"\n />\n <Divider size={'8'} />\n <RadioRoot value={activeLanguage}>\n <List\n type={\n <ListItemButton\n title={i18n.t('language')}\n className=\"widget-language-list-item-btn\"\n id=\"_\"\n onClick={() => console.log()}\n />\n }\n items={languageList}\n />\n </RadioRoot>\n </PageContainer>\n </Layout>\n );\n}\n", "import type { LanguageItem } from '../constants/languages';\n\nimport { type Language } from '@rango-dev/ui';\n\nimport { DEFAULT_LANGUAGE, LANGUAGES } from '../constants/languages';\nimport { useAppStore } from '../store/AppStore';\n\ninterface UseLanguage {\n languages: LanguageItem[];\n defaultLanguage: Language;\n activeLanguage: Language;\n changeLanguage: (language?: Language | null) => void;\n resetLanguage: () => void;\n}\n\nexport function useLanguage(): UseLanguage {\n const { setLanguage, language, config } = useAppStore();\n const languages = LANGUAGES;\n const defaultLanguage = config?.language || DEFAULT_LANGUAGE;\n\n return {\n activeLanguage: language || defaultLanguage,\n languages,\n defaultLanguage,\n changeLanguage: (language) => setLanguage(language || DEFAULT_LANGUAGE),\n resetLanguage: () => setLanguage(null),\n };\n}\n", "import type { UniqueSwappersGroupType } from '../utils/settings';\nimport type { SwapperType } from 'rango-sdk';\n\nimport { i18n } from '@lingui/core';\nimport {\n Button,\n Checkbox,\n Image,\n ListItemButton,\n NotFound,\n Typography,\n} from '@rango-dev/ui';\nimport React, { useState } from 'react';\n\nimport { Layout, PageContainer } from '../components/Layout';\nimport { LoadingLiquiditySourceList } from '../components/LoadingLiquiditySourceList';\nimport { SearchInput } from '../components/SearchInput';\nimport {\n LiquiditySourceList,\n LiquiditySourceSuffix,\n NotFoundContainer,\n} from '../components/SettingsContainer';\nimport { useAppStore } from '../store/AppStore';\nimport { containsText } from '../utils/numbers';\nimport { replaceSpacesWithDash } from '../utils/sanitizers';\nimport { getUniqueSwappersGroups } from '../utils/settings';\n\ninterface PropTypes {\n sourceType: 'Exchanges' | 'Bridges';\n}\n\nexport function LiquiditySourcePage({ sourceType }: PropTypes) {\n const fetchStatus = useAppStore().fetchStatus;\n const swappers = useAppStore().swappers();\n const disabledLiquiditySources = useAppStore().getDisabledLiquiditySources();\n const [searchedFor, setSearchedFor] = useState<string>('');\n const toggleLiquiditySource = useAppStore().toggleLiquiditySource;\n const campaignMode = useAppStore().isInCampaignMode();\n const supportedUniqueSwappersGroups: Array<UniqueSwappersGroupType> =\n getUniqueSwappersGroups(swappers, disabledLiquiditySources);\n\n const types = { Exchanges: i18n.t('Exchanges'), Bridges: i18n.t('Bridges') };\n const validTypes: Array<SwapperType> = [];\n if (sourceType === 'Exchanges') {\n validTypes.push('DEX');\n }\n if (sourceType === 'Bridges') {\n validTypes.push('BRIDGE', 'AGGREGATOR', 'OFF_CHAIN');\n }\n\n const liquiditySources = supportedUniqueSwappersGroups.filter((uniqueItem) =>\n validTypes.includes(uniqueItem.type)\n );\n\n const hasSelectAll =\n liquiditySources.length ===\n liquiditySources.filter((sourceItem) => sourceItem.selected).length;\n\n const toggleAllSources = () => {\n liquiditySources.forEach((sourceItem) => {\n if (hasSelectAll) {\n toggleLiquiditySource(sourceItem.groupTitle);\n } else {\n if (!sourceItem.selected) {\n toggleLiquiditySource(sourceItem.groupTitle);\n }\n }\n });\n };\n\n const list = liquiditySources.map((sourceItem) => {\n const { selected, groupTitle, logo, id, ...restSourceItem } = sourceItem;\n\n return {\n id: `widget-setting-liquidity-source-${replaceSpacesWithDash(\n id.toLowerCase()\n )}-item-btn`,\n\n start: <Image src={logo} size={22} type=\"circular\" />,\n onClick: () => {\n if (!campaignMode) {\n toggleLiquiditySource(groupTitle);\n }\n },\n end: <Checkbox checked={selected} disabled={campaignMode} />,\n title: (\n <Typography variant=\"title\" size=\"xmedium\">\n {i18n.t(groupTitle)}\n </Typography>\n ),\n selected,\n groupTitle,\n logo,\n ...restSourceItem,\n };\n });\n\n const handleSearch = (event: React.ChangeEvent<HTMLInputElement>) => {\n const value = event.target.value;\n setSearchedFor(value);\n };\n\n let filteredList = list;\n if (searchedFor) {\n filteredList = list.filter((sourceItem) =>\n containsText(sourceItem.groupTitle, searchedFor)\n );\n }\n\n return (\n <Layout\n header={{\n title: i18n.t(sourceType),\n suffix: (\n <LiquiditySourceSuffix>\n {/* eslint-disable-next-line jsx-id-attribute-enforcement/missing-ids */}\n <Button\n id={`widget-liquidity-source-${\n hasSelectAll ? 'deselect-all' : 'select-all'\n }-btn`}\n variant=\"ghost\"\n size=\"xsmall\"\n onClick={toggleAllSources}>\n {hasSelectAll ? i18n.t('Deselect all') : i18n.t('Select all')}\n </Button>\n </LiquiditySourceSuffix>\n ),\n }}>\n <PageContainer view>\n <SearchInput\n value={searchedFor}\n setValue={setSearchedFor}\n id=\"widget-liquidity-source-search-input\"\n fullWidth\n color=\"light\"\n variant=\"contained\"\n placeholder={i18n.t('Search {sourceType}', {\n sourceType: types[sourceType],\n })}\n onChange={handleSearch}\n />\n {fetchStatus === 'loading' && <LoadingLiquiditySourceList />}\n\n {!filteredList.length && !!searchedFor ? (\n <NotFoundContainer>\n <NotFound\n title={i18n.t('No results found')}\n description={i18n.t('Try using different keywords')}\n />\n </NotFoundContainer>\n ) : (\n fetchStatus === 'success' && (\n <LiquiditySourceList\n disabled={campaignMode}\n className=\"widget-liquidity-source-list\">\n {filteredList.map((sourceItem) => {\n const { groupTitle, ...otherProps } = sourceItem;\n\n return (\n <React.Fragment key={sourceItem.id}>\n <ListItemButton\n style={{ height: '61px' }}\n {...otherProps}\n selected={false}\n className=\"widget-liquidity-source-list-item-btn\"\n hasDivider\n />\n </React.Fragment>\n );\n })}\n </LiquiditySourceList>\n )\n )}\n </PageContainer>\n </Layout>\n );\n}\n", "import { Checkbox, Skeleton } from '@rango-dev/ui';\nimport React from 'react';\n\nimport { LiquiditySourceList } from '../SettingsContainer';\n\nimport { CustomListItem } from './LoadingLiquiditySourceList.styles';\n\nconst ITEM_SKELETON_COUNT = 30;\nexport function LoadingLiquiditySourceList() {\n return (\n <LiquiditySourceList>\n {Array.from(Array(ITEM_SKELETON_COUNT), (_, index) => (\n <CustomListItem\n hasDivider\n key={index}\n start={<Skeleton variant=\"circular\" width={35} height={35} />}\n title={<Skeleton variant=\"text\" size=\"large\" width={90} />}\n end={<Checkbox checked={false} />}\n />\n ))}\n </LiquiditySourceList>\n );\n}\n", "import { styled } from '@rango-dev/ui';\n\nexport const LiquiditySourceList = styled('ul', {\n padding: '$15 $5 0',\n margin: 0,\n listStyle: 'none',\n height: '100%',\n overflowY: 'auto',\n variants: {\n disabled: {\n true: {\n pointerEvents: 'none',\n },\n },\n },\n});\n\nexport const LiquiditySourceSuffix = styled('div', {\n width: 80,\n display: 'flex',\n justifyContent: 'flex-end',\n});\n\nexport const NotFoundContainer = styled('div', {\n display: 'flex',\n flexDirection: 'column',\n alignItems: 'center',\n justifyContent: 'center',\n height: '100%',\n});\n", "import { ListItem, styled } from '@rango-dev/ui';\n\nexport const CustomListItem = styled(ListItem, {\n height: 61,\n});\n", "import type { SelectedQuote } from '../types';\n\nimport { i18n } from '@lingui/core';\nimport React from 'react';\nimport { useNavigate } from 'react-router-dom';\n\nimport { HeaderButtons } from '../components/HeaderButtons';\nimport { Layout, PageContainer } from '../components/Layout';\nimport { Quotes } from '../components/Quotes';\nimport { navigationRoutes } from '../constants/navigationRoutes';\nimport { useNavigateBack } from '../hooks/useNavigateBack';\nimport { useSwapInput } from '../hooks/useSwapInput';\nimport { useQuoteStore } from '../store/quote';\n\nexport function RoutesPage() {\n const navigate = useNavigate();\n const navigateBack = useNavigateBack();\n const {\n selectedQuote,\n refetchQuote,\n setSelectedQuote,\n updateQuotePartialState,\n error: quoteError,\n } = useQuoteStore()();\n\n const { fetch: fetchQuote, loading: fetchingQuote } = useSwapInput({\n refetchQuote,\n });\n\n const onClickOnQuote = (quote: SelectedQuote) => {\n setSelectedQuote(quote);\n updateQuotePartialState('refetchQuote', false);\n navigateBack();\n };\n\n const settings_url = `../${navigationRoutes.settings}`;\n const wallets_url = `../${navigationRoutes.wallets}`;\n return (\n <Layout\n header={{\n onWallet: () => {\n navigate(wallets_url);\n updateQuotePartialState('refetchQuote', true);\n },\n onBack: () => {\n updateQuotePartialState('refetchQuote', false);\n },\n title: i18n.t('Routes'),\n suffix: (\n <HeaderButtons\n onClickRefresh={\n !!selectedQuote || quoteError ? fetchQuote : undefined\n }\n hidden={['notifications', 'history']}\n onClickSettings={() => {\n navigate(settings_url);\n updateQuotePartialState('refetchQuote', true);\n }}\n />\n ),\n }}>\n <PageContainer>\n <Quotes\n fetch={fetchQuote}\n loading={fetchingQuote}\n onClickOnQuote={onClickOnQuote}\n />\n </PageContainer>\n </Layout>\n );\n}\n", "import type { BlockchainMeta } from 'rango-types';\n\nimport { i18n } from '@lingui/core';\nimport {\n Divider,\n getCategoriesCount,\n SelectableCategoryList,\n} from '@rango-dev/ui';\nimport React, { useMemo, useState } from 'react';\nimport { useNavigate } from 'react-router-dom';\n\nimport { BlockchainList } from '../components/BlockchainList';\nimport { Layout, PageContainer } from '../components/Layout';\nimport { SearchInput } from '../components/SearchInput';\nimport { useNavigateBack } from '../hooks/useNavigateBack';\nimport { useSwapMode } from '../hooks/useSwapMode';\nimport { useAppStore } from '../store/AppStore';\nimport { useQuoteStore } from '../store/quote';\nimport { filterBlockchainsWithAtLeastOneToken } from '../utils/common';\n\ninterface PropTypes {\n type: 'source' | 'destination' | 'custom-token';\n hideCategory?: boolean;\n}\n\nexport function SelectBlockchainPage(props: PropTypes) {\n const { type } = props;\n const navigateBack = useNavigateBack();\n const [searchedFor, setSearchedFor] = useState<string>('');\n const [blockchainCategory, setBlockchainCategory] = useState<string>('ALL');\n const setToBlockchain = useQuoteStore().use.setToBlockchain();\n const setFromBlockchain = useQuoteStore().use.setFromBlockchain();\n const setToToken = useQuoteStore().use.setToToken();\n const { fetchStatus, findNativeToken } = useAppStore();\n const navigate = useNavigate();\n const { swapMode } = useSwapMode();\n\n const blockchains = useAppStore().blockchains({\n type,\n });\n const tokens = useAppStore().tokens();\n const filteredBlockchains = useMemo(\n () => filterBlockchainsWithAtLeastOneToken(blockchains, tokens),\n [blockchains.length, tokens.length]\n );\n const activeCategoriesCount = getCategoriesCount(filteredBlockchains);\n\n const showCategory = !props.hideCategory && activeCategoriesCount !== 1;\n\n const handleBlockchainChange = (blockchain: BlockchainMeta) => {\n if (type === 'custom-token') {\n navigate(`..?blockchain=${blockchain.name}`, { replace: true });\n } else {\n if (type === 'source') {\n setFromBlockchain(blockchain);\n } else {\n if (swapMode === 'swap') {\n setToBlockchain(blockchain);\n } else {\n const blockchainNativeToken = findNativeToken(blockchain);\n if (blockchainNativeToken) {\n setToToken({\n token: blockchainNativeToken,\n meta: { blockchains },\n });\n }\n }\n }\n navigateBack();\n }\n };\n\n return (\n <Layout\n header={{\n title: i18n.t(`Select Chain`),\n }}>\n <PageContainer view>\n {showCategory && (\n <>\n <SelectableCategoryList\n setCategory={setBlockchainCategory}\n category={blockchainCategory}\n blockchains={filteredBlockchains}\n isLoading={fetchStatus === 'loading'}\n />\n <Divider size={24} />\n </>\n )}\n\n <SearchInput\n value={searchedFor}\n autoFocus\n placeholder={i18n.t('Search Chain')}\n id=\"widget-select-blockchain-search-input\"\n color=\"light\"\n variant=\"contained\"\n size=\"large\"\n setValue={() => setSearchedFor('')}\n onChange={(event) => setSearchedFor(event.target.value)}\n />\n <Divider size={16} />\n\n <BlockchainList\n list={filteredBlockchains}\n showTitle={type !== 'custom-token'}\n searchedFor={searchedFor}\n blockchainCategory={blockchainCategory}\n onChange={handleBlockchainChange}\n />\n </PageContainer>\n </Layout>\n );\n}\n", "import type { PropTypes } from './BlockchainList.types';\nimport type { BlockchainMeta } from 'rango-sdk';\n\nimport { i18n } from '@lingui/core';\nimport {\n Divider,\n Image,\n ListItemButton,\n NotFound,\n Typography,\n} from '@rango-dev/ui';\nimport React, { useEffect, useState } from 'react';\n\nimport { useAppStore } from '../../store/AppStore';\n\nimport { filterBlockchains } from './BlockchainList.helpers';\nimport { BlockchainListContainer, List } from './BlockchainList.styles';\nimport { LoadingBlockchainList } from './LoadingBlockchainList';\n\nexport function BlockchainList(props: PropTypes) {\n const {\n list,\n searchedFor,\n onChange,\n blockchainCategory,\n showTitle = true,\n } = props;\n const [blockchains, setBlockchains] = useState<BlockchainMeta[]>(list);\n const { fetchStatus } = useAppStore();\n\n useEffect(() => {\n setBlockchains([\n ...filterBlockchains(list, searchedFor, blockchainCategory),\n ]);\n }, [list, searchedFor, blockchainCategory]);\n\n const renderList = () => {\n if (!blockchains.length && !!searchedFor) {\n return (\n <NotFound\n title={i18n.t('No results found')}\n description={i18n.t('Try using different keywords')}\n />\n );\n }\n return (\n <List\n as=\"ul\"\n key={`${blockchainCategory}-${searchedFor}`}\n id=\"widget-blockchain-list\">\n {blockchains.map((item) => (\n <ListItemButton\n key={`${item.name}-${item.chainId}`}\n className={`widget-blockchain-list-item-btn`}\n hasDivider\n onClick={() => onChange(item)}\n start={<Image src={item.logo} size={30} />}\n title={\n <Typography variant=\"title\" size=\"medium\">\n {item.displayName}\n </Typography>\n }\n id={item.name}\n />\n ))}\n </List>\n );\n };\n\n return (\n <>\n {showTitle && (\n <>\n <Typography variant=\"label\" size=\"large\">\n {i18n.t('Select Chain')}\n </Typography>\n <Divider size={4} />\n </>\n )}\n <BlockchainListContainer>\n {fetchStatus === 'loading' && <LoadingBlockchainList />}\n {fetchStatus === 'success' && renderList()}\n </BlockchainListContainer>\n </>\n );\n}\n", "import { type BlockchainMeta } from 'rango-sdk';\n\nimport { containsText, isBlockchainTypeInCategory } from '../../utils/common';\n\nexport const filterBlockchains = (\n list: BlockchainMeta[],\n searchedFor: string,\n blockchainCategory: string\n) =>\n list\n .filter((blockchain) =>\n isBlockchainTypeInCategory(blockchain.type, blockchainCategory)\n )\n .filter(\n (blockchain) =>\n containsText(blockchain.name, searchedFor) ||\n containsText(blockchain.displayName, searchedFor)\n );\n", "import { ImageContainer, styled } from '@rango-dev/ui';\n\nimport { ScrollableArea } from '../Layout';\n\nexport const BlockchainListContainer = styled('div', {\n display: 'flex',\n flexDirection: 'column',\n overflow: 'hidden',\n height: '100%',\n justifyContent: 'center',\n});\n\nexport const List = styled(ScrollableArea, {\n padding: 0,\n margin: 0,\n listStyle: 'none',\n\n [`& ${ImageContainer}`]: {\n borderRadius: '$xm',\n overflow: 'hidden',\n },\n});\n", "import { ListItem, Skeleton } from '@rango-dev/ui';\nimport React from 'react';\n\nimport { List } from './BlockchainList.styles';\n\nconst ITEM_SKELETON_COUNT = 20;\nexport function LoadingBlockchainList() {\n return (\n <List id=\"widget-blockchain-loading-list\" as=\"ul\">\n {Array.from(Array(ITEM_SKELETON_COUNT), (e) => (\n <ListItem\n key={e}\n hasDivider\n start={<Skeleton variant=\"circular\" width={35} height={35} />}\n title={<Skeleton variant=\"text\" size=\"large\" width={90} />}\n />\n ))}\n </List>\n );\n}\n", "import type { BlockchainMeta, Token } from 'rango-sdk';\n\nimport { i18n } from '@lingui/core';\nimport { Divider, Spinner } from '@rango-dev/ui';\nimport React, { useEffect, useState } from 'react';\nimport { useNavigate } from 'react-router-dom';\n\nimport { BlockchainsSection } from '../../components/BlockchainsSection';\nimport { Layout, PageContainer } from '../../components/Layout';\nimport { SearchInput } from '../../components/SearchInput';\nimport { TokenList } from '../../components/TokenList';\nimport { navigationRoutes } from '../../constants/navigationRoutes';\nimport { useNavigateBack } from '../../hooks/useNavigateBack';\nimport { useSearchCustomTokens } from '../../hooks/useSearchCustomTokens';\nimport { useAppStore } from '../../store/AppStore';\nimport { useQuoteStore } from '../../store/quote';\n\nimport {\n prepareTokensList,\n shouldSearchForCustomTokens,\n} from './SelectSwapItemPage.helpers';\n\ninterface PropTypes {\n type: 'source' | 'destination';\n}\n\nexport function SelectSwapItemsPage(props: PropTypes) {\n const { type } = props;\n const navigate = useNavigate();\n const navigateBack = useNavigateBack();\n const {\n fromBlockchain,\n toBlockchain,\n setFromToken,\n setToToken,\n setFromBlockchain,\n setToBlockchain,\n } = useQuoteStore()();\n const { getBalanceFor } = useAppStore();\n const {\n fetch,\n loading,\n tokens: customTokens,\n cancel,\n } = useSearchCustomTokens();\n const [searchedFor, setSearchedFor] = useState<string>('');\n\n const selectedBlockchain = type === 'source' ? fromBlockchain : toBlockchain;\n const selectedBlockchainName = selectedBlockchain?.name ?? '';\n\n // Tokens & Blockchains list\n const blockchains = useAppStore().blockchains({\n type,\n });\n const tokens = useAppStore().tokens({\n type,\n blockchain: selectedBlockchainName,\n searchFor: searchedFor,\n getBalanceFor: getBalanceFor,\n });\n\n const modifiedTokens = prepareTokensList(\n tokens,\n customTokens,\n searchedFor,\n loading,\n selectedBlockchain?.name\n );\n\n const updateBlockchain = (blockchain: BlockchainMeta) => {\n if (type === 'source') {\n setFromBlockchain(blockchain);\n } else {\n setToBlockchain(blockchain);\n }\n };\n\n const updateToken = (token: Token) => {\n if (type === 'source') {\n setFromToken({ token, meta: { blockchains } });\n } else {\n setToToken({ token, meta: { blockchains } });\n }\n };\n const types = {\n source: i18n.t('Source'),\n destination: i18n.t('Destination'),\n };\n\n useEffect(() => {\n if (\n shouldSearchForCustomTokens(tokens, searchedFor, selectedBlockchain?.name)\n ) {\n fetch(searchedFor, selectedBlockchain?.name ?? undefined);\n }\n\n return () => {\n cancel();\n };\n }, [tokens.length, searchedFor, selectedBlockchain?.name]);\n\n return (\n <Layout\n header={{\n title: i18n.t('Swap {type}', { type: types[type] }),\n }}>\n <PageContainer>\n <BlockchainsSection\n blockchains={blockchains}\n type={type == 'source' ? 'from' : 'to'}\n blockchain={type === 'source' ? fromBlockchain : toBlockchain}\n onMoreClick={() => navigate(navigationRoutes.blockchains)}\n onChange={(blockchain) => {\n updateBlockchain(blockchain);\n }}\n />\n <Divider size={24} />\n <SearchInput\n value={searchedFor}\n id=\"widget-select-swap-item-search-input\"\n autoFocus\n placeholder={i18n.t('Search Token')}\n color=\"light\"\n variant=\"contained\"\n size=\"large\"\n setValue={() => setSearchedFor('')}\n onChange={(event) => setSearchedFor(event.target.value)}\n suffix={\n shouldSearchForCustomTokens(\n tokens,\n searchedFor,\n selectedBlockchain?.name\n ) && loading ? (\n <Spinner size={12} color=\"secondary\" />\n ) : undefined\n }\n />\n <Divider size={16} />\n <TokenList\n list={modifiedTokens}\n selectedBlockchain={selectedBlockchainName}\n searchedFor={searchedFor}\n type={type}\n onChange={(token) => {\n updateToken(token);\n\n const tokenBlockchain = blockchains.find(\n (chain) => token.blockchain === chain.name\n );\n if (tokenBlockchain) {\n updateBlockchain(tokenBlockchain);\n }\n\n navigateBack();\n }}\n />\n </PageContainer>\n </Layout>\n );\n}\n", "import type { PropTypes } from './BlockchainsSection.types';\n\nimport { i18n } from '@lingui/core';\nimport {\n BlockchainsChip,\n Divider,\n Image,\n Skeleton,\n Tooltip,\n Typography,\n} from '@rango-dev/ui';\nimport React from 'react';\n\nimport {\n BLOCKCHAIN_LIST_SIZE,\n BLOCKCHAIN_LIST_SIZE_COMPACT_MODE,\n} from '../../constants/configs';\nimport { usePrepareBlockchainList } from '../../hooks/usePrepareBlockchainList';\nimport { useAppStore } from '../../store/AppStore';\nimport { useQuoteStore } from '../../store/quote';\nimport { useUiStore } from '../../store/ui';\nimport { getContainer } from '../../utils/common';\n\nimport { Blockchains } from './BlockchainsSection.styles';\n\nconst NUMBER_OF_LOADING_COMPACT_MODE = 6;\nconst NUMBER_OF_LOADING = 12;\n\nexport function BlockchainsSection(props: PropTypes) {\n const { blockchains, type, blockchain, onChange, onMoreClick } = props;\n const { showCompactTokenSelector } = useUiStore();\n const blockchainsList = usePrepareBlockchainList(blockchains, {\n limit: showCompactTokenSelector\n ? BLOCKCHAIN_LIST_SIZE_COMPACT_MODE\n : BLOCKCHAIN_LIST_SIZE,\n selected: blockchain?.name,\n });\n\n const { fetchStatus } = useAppStore();\n const resetToBlockchain = useQuoteStore().use.resetToBlockchain();\n const resetFromBlockchain = useQuoteStore().use.resetFromBlockchain();\n const hasMoreItemsInList = blockchainsList.more.length > 0;\n /**\n * When only one item is left on list, we will not show the `More` button and will show the item itself instead.\n */\n const firstItemOfList = blockchainsList.more[0];\n const onlyOneItemInList =\n blockchainsList.more.length === 1 && firstItemOfList;\n const showMoreButton = !onlyOneItemInList && hasMoreItemsInList;\n\n return (\n <>\n {!showCompactTokenSelector && (\n <>\n <Divider size={12} />\n <Typography variant=\"label\" size=\"large\">\n {i18n.t('Select Chain')}\n </Typography>\n </>\n )}\n <Divider size={12} />\n <Blockchains id=\"widget-blockchains-section-container\">\n {fetchStatus === 'loading' &&\n Array.from(\n Array(\n showCompactTokenSelector\n ? NUMBER_OF_LOADING_COMPACT_MODE\n : NUMBER_OF_LOADING\n ),\n (_, index) => <Skeleton key={index} variant=\"rounded\" height={50} />\n )}\n {fetchStatus === 'success' && (\n <>\n <BlockchainsChip\n className=\"widget-blockchains-section-all-btn\"\n selected={!blockchain}\n onClick={() => {\n if (type === 'from') {\n resetFromBlockchain();\n } else {\n resetToBlockchain();\n }\n }}>\n <Typography variant=\"body\" size=\"xsmall\" color=\"secondary500\">\n {i18n.t('All')}\n </Typography>\n </BlockchainsChip>\n {blockchainsList.list.map((item) => (\n <Tooltip\n key={item.name}\n content={item.shortName}\n side=\"bottom\"\n sideOffset={2}\n container={getContainer()}>\n <BlockchainsChip\n className=\"widget-blockchains-section-item-btn\"\n key={item.name}\n selected={!!blockchain && blockchain.name === item.name}\n onClick={() => onChange(item)}>\n <Image src={item.logo} size={30} />\n </BlockchainsChip>\n </Tooltip>\n ))}\n\n {onlyOneItemInList ? (\n <BlockchainsChip\n className=\"widget-blockchains-section-only-item-btn\"\n key={firstItemOfList.name}\n selected={\n !!blockchain && blockchain.name === firstItemOfList.name\n }\n onClick={() => onChange(firstItemOfList)}>\n <Image src={firstItemOfList.logo} size={30} />\n </BlockchainsChip>\n ) : null}\n\n {showMoreButton ? (\n <BlockchainsChip\n onClick={onMoreClick}\n key=\"more-blockchains\"\n className=\"widget-blockchains-section-more-items-btn\">\n <Typography variant=\"body\" size=\"xsmall\" color=\"secondary500\">\n {i18n._('More +{count}', {\n count: blockchainsList.more.length,\n })}\n </Typography>\n </BlockchainsChip>\n ) : null}\n </>\n )}\n </Blockchains>\n </>\n );\n}\n", "import type {\n PrepareListOptions,\n UsePrepareList,\n} from './usePrepareBlockchainList.types';\nimport type { BlockchainMeta } from 'rango-sdk';\n\nimport { useEffect } from 'react';\n\nimport { useAppStore } from '../../store/AppStore';\n\nimport { isInVisibleList, prepare } from './usePrepareBlockchainList.helpers';\n\n/**\n *\n * UI needs some specific logics like limiting the list and sorting,\n * this function is getting the raw blockchains list and return a list for showing in UI.\n *\n */\nexport function usePrepareBlockchainList(\n blockchains: BlockchainMeta[],\n options?: PrepareListOptions\n): UsePrepareList {\n const { preferredBlockchains, addPreferredBlockchain } = useAppStore();\n\n useEffect(() => {\n if (options?.selected) {\n const output = prepare(blockchains, preferredBlockchains, options);\n\n /**\n * We only add a new blockchain to preferred when it's not in the main list\n * In this way we can guarantee we will be able to regenerate the same list always.\n * And also it helps us to avoid jumping for the last item of the main list (e.g. tenth item of our list).\n */\n if (!isInVisibleList(options.selected, output)) {\n addPreferredBlockchain(options?.selected);\n }\n }\n }, [options?.selected]);\n\n const output = prepare(blockchains, preferredBlockchains, options);\n\n return {\n list: output.list,\n more: output.more,\n history: [],\n };\n}\n", "export const MOST_USED_BLOCKCHAINS = ['ETH', 'COSMOS', 'OSMOSIS'];\n", "import type {\n PrepareListOptions,\n PrepareOutput,\n} from './usePrepareBlockchainList.types';\nimport type { BlockchainMeta } from 'rango-sdk';\n\nimport { MOST_USED_BLOCKCHAINS } from './usePrepareBlockchainList.constants';\n\nexport function prepare(\n blockchains: BlockchainMeta[],\n preferredBlockchains: string[],\n options?: PrepareListOptions\n): PrepareOutput {\n /*\n * TODO:\n * We copying the `blockchains` which can causes performance penalties but we should because we are mutating the original object.\n * A better way to solve the problem maybe is using new JS features like Use toSpliced() but\n * we can not use it right now because we need to upgrade our toolings first.\n */\n const list: BlockchainMeta[] = JSON.parse(JSON.stringify(blockchains));\n let more: BlockchainMeta[] = [];\n\n list.sort(sortByMostUsedBlockchains);\n\n // Checking `limit` has set and it should be more than of the list items.\n if (!!options?.limit && blockchains.length > options.limit) {\n const start = options.limit;\n let preferredBlockchainsWithoutMainList = preferredBlockchains;\n\n if (preferredBlockchains.length <= options.limit) {\n /**\n *\n * if we want to show 10 items (aka `options.limit`)\n * and have these items as our preferred list: [x,y,z]\n * and these as our main list: [A, B, C, D, E, F, G, H, I, J]\n * the final list will be like this: [...preferred, ...mainList].\n *\n * Since we have a limit (e.g. 10) on our list (preferred + mainList),\n * we only should check those items from main list that will be in final list.\n *\n * finalListWithoutLimit = [x,y,z, A, B, C, D, E, F, G, H, I, J]\n * finalListWithLimit = [x,y,z, A, B, C, D, E, F, G]\n *\n * As you can see, [H, I, J] will not be in our list.\n *\n * The following code only check preffred blockchain\n * shouldn't be in first 7 of 10 items in main list. (Since, the last 3 items will not be in the final list and we should check those.)\n */\n const howManyItemsShouldBeCheckedFromMainList =\n options.limit - preferredBlockchains.length;\n\n for (let i = 0; i <= howManyItemsShouldBeCheckedFromMainList; i++) {\n const blockchain = list[i];\n\n preferredBlockchainsWithoutMainList =\n preferredBlockchainsWithoutMainList.filter((preferredBlockchain) => {\n return blockchain?.name !== preferredBlockchain;\n });\n }\n }\n\n list.sort(\n generateSortByPreferredBlockchainsFor(preferredBlockchainsWithoutMainList)\n );\n\n /*\n * Splice will modify the original list and returns the deleted items\n * We use the deleted items as `more`\n */\n more = list.splice(start);\n }\n return {\n list,\n more,\n };\n}\n\n/** There is a hardcoded list of blockchains that we want to show them first in the list. */\nexport function sortByMostUsedBlockchains(\n a: BlockchainMeta,\n b: BlockchainMeta\n) {\n const mostUsed = MOST_USED_BLOCKCHAINS;\n const aIndexInMostUsed = mostUsed.findIndex((token) => token === a.name);\n const bIndexInMostUsed = mostUsed.findIndex((token) => token === b.name);\n const aIsMostUsed = aIndexInMostUsed > -1;\n const bIsMostUsed = bIndexInMostUsed > -1;\n\n if (aIsMostUsed && bIsMostUsed) {\n return aIndexInMostUsed > bIndexInMostUsed ? 1 : -1;\n }\n\n if (aIsMostUsed) {\n return -1;\n }\n\n if (bIsMostUsed) {\n return 1;\n }\n\n return 0;\n}\n\nexport function generateSortByPreferredBlockchainsFor(\n preferredBlockchains: string[]\n) {\n return function sortByPreferred(a: BlockchainMeta, b: BlockchainMeta) {\n const aIndexInPreferred = preferredBlockchains.findIndex(\n (blockchain) => blockchain === a.name\n );\n const bIndexInPreferred = preferredBlockchains.findIndex(\n (blockchain) => blockchain === b.name\n );\n\n const aIsPreferred = aIndexInPreferred > -1;\n const bIsPreferred = bIndexInPreferred > -1;\n\n if (aIsPreferred && bIsPreferred) {\n return aIndexInPreferred > bIndexInPreferred ? 1 : -1;\n }\n\n if (preferredBlockchains.includes(a.name)) {\n return -1;\n }\n if (preferredBlockchains.includes(b.name)) {\n return 1;\n }\n\n return 0;\n };\n}\n\nexport function isInVisibleList(\n blockchain: string,\n prepareOutput: PrepareOutput\n): boolean {\n return !!prepareOutput.list.find((item) => item.name === blockchain);\n}\n", "import { styled } from '@rango-dev/ui';\n\nexport const Blockchains = styled('div', {\n display: 'grid',\n gap: '$10',\n gridTemplateColumns: 'repeat(6, minmax(0, 1fr))',\n});\n", "import type { UseSearchCustomTokens } from './types';\nimport type { Token } from 'rango-sdk';\n\nimport { useCallback, useRef, useState } from 'react';\n\nimport { httpService } from '../../services/httpService';\nimport { useAppStore } from '../../store/AppStore';\nimport { createAssetKey } from '../../store/utils/wallets';\nimport { debounce } from '../../utils/common';\n\nimport { DEBOUNCE_DELAY } from './useSearchCustomTokens.constants';\n\nexport function useSearchCustomTokens(): UseSearchCustomTokens {\n const blockchains = useAppStore().blockchains();\n const abortControllerRef = useRef<AbortController | null>(null);\n const { customTokens } = useAppStore();\n const [loading, setLoading] = useState(false);\n const [tokens, setTokens] = useState<Token[]>([]);\n const [error, setError] = useState<string | null>(null);\n\n const fetch = async (query: string, blockchain?: string) => {\n setError(null);\n setLoading(true);\n setTokens([]);\n\n try {\n const response = await httpService().searchCustomTokens(\n { query, blockchain },\n { signal: abortControllerRef.current?.signal }\n );\n\n const customTokensSet = new Set(\n customTokens().map((token) => createAssetKey(token))\n );\n const blockchainsSet = new Set(\n blockchains.map((blockchain) => blockchain.name)\n );\n const filteredTokens = response.tokens.filter(\n (token) =>\n blockchainsSet.has(token.blockchain) &&\n !customTokensSet.has(createAssetKey(token))\n );\n\n setTokens(filteredTokens);\n setLoading(false);\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n } catch (error: any) {\n setError(error instanceof Error ? error.message : 'something went wrong');\n setTokens([]);\n if (error?.name !== 'CanceledError') {\n setLoading(false);\n }\n }\n };\n\n const debouncedFetch = useCallback(\n debounce((query: string, blockchain?: string) => {\n if (abortControllerRef.current?.signal.aborted) {\n return;\n }\n void fetch(query, blockchain);\n }, DEBOUNCE_DELAY),\n [blockchains.length]\n );\n\n const cancel = () => {\n abortControllerRef.current?.abort();\n };\n return {\n fetch: (query: string, blockchain?: string) => {\n abortControllerRef.current = new AbortController();\n setTokens([]);\n setLoading(true);\n debouncedFetch(query, blockchain);\n },\n cancel,\n loading,\n tokens,\n error,\n };\n}\n", "import type { TokenList } from '../../components/TokenList';\nimport type { Token } from 'rango-sdk';\nimport type { ComponentProps } from 'react';\n\nimport {\n MAX_TOKENS_BEFORE_FETCH,\n MIN_SEARCH_LENGTH,\n} from './SelectSwapItemPage.constants';\n\nexport function shouldSearchForCustomTokens(\n metaSearchResultTokens: Token[],\n query: string,\n blockchain?: string\n) {\n if (\n blockchain &&\n metaSearchResultTokens.length === 1 &&\n metaSearchResultTokens[0]?.address === query\n ) {\n return false;\n }\n return (\n metaSearchResultTokens.length < MAX_TOKENS_BEFORE_FETCH &&\n query.trim().length >= MIN_SEARCH_LENGTH\n );\n}\n\nexport function prepareTokensList(\n tokens: Token[],\n customTokens: Token[],\n query: string,\n loading: boolean,\n blockchain?: string\n) {\n let modifiedList: ComponentProps<typeof TokenList>['list'] = [...tokens];\n\n if (shouldSearchForCustomTokens(tokens, query, blockchain)) {\n modifiedList = loading\n ? [...modifiedList, 'skeleton', 'skeleton', 'skeleton']\n : [\n ...modifiedList,\n ...customTokens.map((customToken) => ({\n ...customToken,\n customToken: true,\n warning: true,\n })),\n ];\n }\n\n return modifiedList;\n}\n", "import { i18n } from '@lingui/core';\nimport { Alert, Button, styled } from '@rango-dev/ui';\nimport React from 'react';\nimport { useInRouterContext, useSearchParams } from 'react-router-dom';\n\nimport { Layout, PageContainer } from '../components/Layout';\nimport { Slippage } from '../components/Slippage';\nimport { SearchParams } from '../constants/searchParams';\nimport { SettingsLists } from '../containers/Settings/Lists';\nimport { useAppStore } from '../store/AppStore';\n\nconst ResetAction = styled('div', {\n paddingLeft: '$8',\n});\n\nexport function SettingsPage() {\n const { isInCampaignMode, updateCampaignMode } = useAppStore();\n const campaignMode = isInCampaignMode();\n\n const [, setSearchParams] = useSearchParams();\n const isRouterInContext = useInRouterContext();\n\n const onClick = () => {\n if (isRouterInContext && campaignMode) {\n setSearchParams(\n (prev) => {\n prev.delete(SearchParams.LIQUIDITY_SOURCES);\n return prev;\n },\n { replace: true }\n );\n updateCampaignMode('liquiditySources', undefined);\n }\n };\n return (\n <Layout\n header={{\n title: i18n.t('Settings'),\n }}>\n <PageContainer>\n {campaignMode && (\n <Alert\n type=\"info\"\n variant=\"alarm\"\n id=\"widget-settings-campaign-mode-alert\"\n title={i18n.t(\n \"Currently, you're in campaign mode with restrictions on liquidity sources. Would you like to switch out of this mode and make use of all available liquidity sources?\"\n )}\n action={\n <ResetAction>\n <Button\n id=\"widget-setting-exit-campaign-mode-btn\"\n type=\"secondary\"\n size=\"small\"\n onClick={onClick}>\n {i18n.t('Reset')}\n </Button>\n </ResetAction>\n }\n />\n )}\n <Slippage />\n <SettingsLists />\n </PageContainer>\n </Layout>\n );\n}\n", "import { i18n } from '@lingui/core';\nimport {\n Alert,\n Divider,\n InfoIcon,\n SlippageIcon,\n TextField,\n Tooltip,\n Typography,\n} from '@rango-dev/ui';\nimport React from 'react';\n\nimport { MAX_SLIPPAGE, SLIPPAGES } from '../../constants/swapSettings';\nimport { useAppStore } from '../../store/AppStore';\nimport { getContainer } from '../../utils/common';\nimport { getSlippageValidation } from '../../utils/settings';\nimport { isValidCurrencyFormat } from '../../utils/validation';\n\nimport {\n BaseContainer,\n Head,\n SlippageChip,\n SlippageChipsContainer,\n} from './Slippage.styles';\nimport { SlippageTooltipContent } from './SlippageTooltipContent';\n\nexport function Slippage() {\n const { slippage, setSlippage, customSlippage, setCustomSlippage } =\n useAppStore();\n\n const slippageValidation =\n customSlippage !== null ? getSlippageValidation(customSlippage) : null;\n\n const onSlippageValueChange = (\n event: React.ChangeEvent<HTMLInputElement>\n ) => {\n const value = event.target.value;\n const parsedValue = parseFloat(value);\n if (isNaN(parsedValue)) {\n return setCustomSlippage(null);\n }\n let slippage = parsedValue;\n if (parsedValue > MAX_SLIPPAGE) {\n slippage = MAX_SLIPPAGE;\n }\n setCustomSlippage(slippage);\n };\n\n const onClickSlippageChip = (slippageItem: number) => {\n if (customSlippage !== null) {\n setCustomSlippage(null);\n }\n setSlippage(slippageItem);\n };\n\n const onInput = (event: React.FormEvent<HTMLInputElement>) => {\n const input = event.target as HTMLInputElement;\n const value = input.value;\n if (!isValidCurrencyFormat(value)) {\n input.value = value.slice(0, -1);\n }\n };\n\n return (\n <BaseContainer>\n <Head>\n <SlippageIcon size={16} color=\"gray\" />\n <Divider direction=\"horizontal\" size={4} />\n <Typography variant=\"title\" size=\"xmedium\">\n {i18n.t('Slippage tolerance per swap')}\n </Typography>\n <Divider direction=\"horizontal\" size={4} />\n <Tooltip\n container={getContainer()}\n side=\"top\"\n sideOffset={4}\n content={<SlippageTooltipContent />}>\n <InfoIcon color=\"gray\" />\n </Tooltip>\n </Head>\n <SlippageChipsContainer>\n {SLIPPAGES.map((slippageItem, index) => {\n const key = `slippage-${index}`;\n return (\n <SlippageChip\n id={`widget-slippage-chip-${slippageItem.toString()}%-btn`}\n key={key}\n onClick={() => onClickSlippageChip(slippageItem)}\n selected={customSlippage === null && slippageItem === slippage}\n label={`${slippageItem.toString()}%`}\n />\n );\n })}\n\n <TextField\n type=\"number\"\n min=\"0.01\"\n max=\"30\"\n step=\"0.01\"\n status={\n slippageValidation?.type || (customSlippage ? 'success' : 'default')\n }\n id=\"widget-slippage-chip-text-input\"\n onInput={onInput}\n fullWidth\n variant=\"contained\"\n value={customSlippage === null ? '' : customSlippage}\n color=\"dark\"\n onChange={onSlippageValueChange}\n suffix={\n customSlippage && (\n <Typography variant=\"body\" size=\"small\">\n %\n </Typography>\n )\n }\n placeholder={i18n.t('Custom')}\n />\n </SlippageChipsContainer>\n\n {slippageValidation && (\n <>\n <Divider size={10} />\n <Alert\n id=\"widget-slippage-alert\"\n variant=\"alarm\"\n type={slippageValidation.type}\n title={slippageValidation.message}\n />\n </>\n )}\n </BaseContainer>\n );\n}\n", "import { Chip, styled, TextField } from '@rango-dev/ui';\n\nexport const BaseContainer = styled('div', {\n paddingTop: '$5',\n padding: '$10 $5',\n});\n\nexport const SlippageChipsContainer = styled('div', {\n display: 'flex',\n flexWrap: 'wrap',\n gap: '$10',\n [`& ${TextField}`]: {\n flex: '1 1 0',\n maxWidth: '127px',\n minWidth: '85px',\n paddingLeft: '$2',\n },\n});\n\nexport const Head = styled('div', {\n display: 'flex',\n justifyContent: 'start',\n alignItems: 'center',\n paddingBottom: '$10',\n});\n\nexport const SlippageTooltipContainer = styled('div', {\n maxWidth: '280px',\n padding: '$10',\n});\n\nexport const SlippageChip = styled(Chip, {\n width: '61px',\n flexShrink: 0,\n});\n", "import { i18n } from '@lingui/core';\nimport { Typography } from '@rango-dev/ui';\nimport React from 'react';\n\nimport { SlippageTooltipContainer } from './Slippage.styles';\n\nexport function SlippageTooltipContent() {\n return (\n <SlippageTooltipContainer>\n <Typography variant=\"label\" size=\"medium\" color=\"neutral700\">\n {i18n.t(\n 'Your transaction will be reverted if the price changes unfavorably by more than this percentage.'\n )}\n <br />\n <br />\n <b>{i18n.t('Warning')}</b>: \n {i18n.t(\n 'This setting is applied to each step (e.g. 1Inch, Thorchain, etc.), meaning only that specific step will be reverted, not the entire route.'\n )}\n </Typography>\n </SlippageTooltipContainer>\n );\n}\n", "import type { ThemeMode } from '../../store/slices/settings';\nimport type { ListPropTypes, SvgIconProps } from '@rango-dev/ui';\n\nimport { i18n } from '@lingui/core';\nimport {\n AutoThemeIcon,\n BridgesIcon,\n ChevronRightIcon,\n DarkModeIcon,\n Divider,\n ExchangeIcon,\n InfinityIcon,\n InfoIcon,\n LanguageIcon,\n LightModeIcon,\n List,\n ListItem,\n ListItemButton,\n Skeleton,\n styled,\n Switch,\n Tabs,\n TargetIcon,\n Tooltip,\n Typography,\n} from '@rango-dev/ui';\nimport React from 'react';\nimport { useNavigate } from 'react-router-dom';\n\nimport { SlippageTooltipContainer as TooltipContainer } from '../../components/Slippage/Slippage.styles';\nimport { navigationRoutes } from '../../constants/navigationRoutes';\nimport { ThemeModeEnum } from '../../constants/settings';\nimport { useLanguage } from '../../hooks/useLanguage';\nimport { useAppStore } from '../../store/AppStore';\nimport { getContainer } from '../../utils/common';\nimport { getUniqueSwappersGroups, isFeatureHidden } from '../../utils/settings';\n\nconst ThemeSection = styled('div', {\n width: '202px',\n height: '$40',\n});\n\nconst themesList = [\n {\n id: ThemeModeEnum.LIGHT,\n icon: <LightModeIcon color=\"black\" size={24} />,\n tooltip: (\n <Typography size=\"xsmall\" variant=\"body\">\n {i18n.t('Light')}\n </Typography>\n ),\n },\n {\n id: ThemeModeEnum.DARK,\n icon: <DarkModeIcon color=\"black\" size={24} />,\n tooltip: (\n <Typography size=\"xsmall\" variant=\"body\">\n {i18n.t('Dark')}\n </Typography>\n ),\n },\n {\n id: ThemeModeEnum.AUTO,\n icon: <AutoThemeIcon color=\"black\" size={24} />,\n tooltip: (\n <Typography size=\"xsmall\" variant=\"body\">\n {i18n.t('Auto')}\n </Typography>\n ),\n },\n];\n\nconst getThemeIcon = (theme: ThemeMode) => {\n const iconProps: SvgIconProps = { color: 'gray', size: 16 };\n\n // eslint-disable-next-line @typescript-eslint/switch-exhaustiveness-check\n switch (theme) {\n case 'auto':\n return <AutoThemeIcon {...iconProps} />;\n case 'dark':\n return <DarkModeIcon {...iconProps} />;\n default:\n return <LightModeIcon {...iconProps} />;\n }\n};\n\nexport function SettingsLists() {\n const navigate = useNavigate();\n const { theme: themeConfig } = useAppStore().config;\n const { setTheme, theme } = useAppStore();\n const { activeLanguage, languages } = useLanguage();\n const currentLanguage = languages.find(\n (language) => language.local === activeLanguage\n )?.label;\n\n const fetchStatus = useAppStore().fetchStatus;\n const swappers = useAppStore().swappers();\n const disabledLiquiditySources = useAppStore().getDisabledLiquiditySources();\n const {\n config: { features },\n } = useAppStore();\n const customTokens = useAppStore().customTokens();\n const isThemeHidden = isFeatureHidden('theme', features);\n const isLiquidityHidden = isFeatureHidden('liquiditySource', features);\n const isLanguageHidden = isFeatureHidden('language', features);\n const isCustomTokensHidden = isFeatureHidden('customTokens', features);\n\n const infiniteApprove = useAppStore().infiniteApprove;\n const toggleInfiniteApprove = useAppStore().toggleInfiniteApprove;\n\n const supportedUniqueSwappersGroups = getUniqueSwappersGroups(\n swappers,\n disabledLiquiditySources\n );\n\n const bridgeSources = supportedUniqueSwappersGroups.filter((uniqueItem) =>\n ['BRIDGE', 'AGGREGATOR', 'OFF_CHAIN'].includes(uniqueItem.type)\n );\n\n const totalBridgeSources = bridgeSources.length;\n const totalSelectedBridgeSources = bridgeSources.filter(\n (uniqueItem) => uniqueItem.selected\n ).length;\n\n const exchangeSources = supportedUniqueSwappersGroups.filter(\n (uniqueItem) => uniqueItem.type === 'DEX'\n );\n\n const totalExchangeSources = exchangeSources.length;\n const totalSelectedExchangeSources = exchangeSources.filter(\n (uniqueItem) => uniqueItem.selected\n ).length;\n\n const handleSwapperEndItem = (totalSelected: number, total: number) => {\n // eslint-disable-next-line @typescript-eslint/switch-exhaustiveness-check\n switch (fetchStatus) {\n case 'loading':\n return <Skeleton variant=\"text\" size=\"medium\" width={50} />;\n case 'failed':\n return (\n <Typography variant=\"body\" size=\"medium\" color=\"$error500\">\n {i18n.t('Loading failed')}\n </Typography>\n );\n default:\n return (\n <Typography variant=\"body\" size=\"medium\">\n {`${totalSelected} / ${total}`}\n </Typography>\n );\n }\n };\n\n const bridgeItem = {\n id: 'widget-setting-bridge-item-btn',\n title: (\n <Typography variant=\"title\" size=\"xmedium\">\n {i18n.t('Bridges')}\n </Typography>\n ),\n end: (\n <>\n {handleSwapperEndItem(totalSelectedBridgeSources, totalBridgeSources)}\n <Divider direction=\"horizontal\" size={8} />\n <ChevronRightIcon color=\"black\" />\n </>\n ),\n onClick: () => navigate(navigationRoutes.bridges),\n start: <BridgesIcon color=\"gray\" size={16} />,\n };\n\n const exchangeItem = {\n id: 'widget-setting-exchange-item-btn',\n title: (\n <Typography variant=\"title\" size=\"xmedium\">\n {i18n.t('Exchanges')}\n </Typography>\n ),\n end: (\n <>\n {handleSwapperEndItem(\n totalSelectedExchangeSources,\n totalExchangeSources\n )}\n <Divider direction=\"horizontal\" size={8} />\n <ChevronRightIcon color=\"black\" />\n </>\n ),\n start: <ExchangeIcon color=\"gray\" size={16} />,\n onClick: () => navigate(navigationRoutes.exchanges),\n };\n\n const customTokensItem = {\n id: 'widget-setting-custom-tokens-item-btn',\n title: (\n <Typography variant=\"title\" size=\"xmedium\">\n {i18n.t('Custom Tokens')}\n </Typography>\n ),\n end: (\n <>\n <Typography variant=\"body\" size=\"medium\">\n {`${customTokens.length}`}\n </Typography>\n <Divider direction=\"horizontal\" size={8} />\n <ChevronRightIcon color=\"black\" />\n </>\n ),\n start: <TargetIcon color=\"gray\" size={16} />,\n onClick: () => navigate(navigationRoutes.customTokens),\n };\n const languageItem = {\n id: 'widget-setting-language-item-btn',\n title: (\n <Typography variant=\"title\" size=\"xmedium\">\n {i18n.t('Language')}\n </Typography>\n ),\n start: <LanguageIcon color=\"gray\" size={16} />,\n end: (\n <>\n <Typography variant=\"body\" size=\"medium\">\n {currentLanguage}\n </Typography>\n <Divider direction=\"horizontal\" size={8} />\n <ChevronRightIcon color=\"black\" />\n </>\n ),\n onClick: () => navigate(navigationRoutes.languages),\n };\n\n const infiniteApprovalItem = {\n id: 'widget-setting-infinite-approval-item-btn',\n title: (\n <React.Fragment>\n <Typography variant=\"title\" size=\"xmedium\">\n {i18n.t('Infinite approval')}\n </Typography>\n <Divider direction=\"horizontal\" size={4} />\n <Tooltip\n side=\"top\"\n sideOffset={4}\n container={getContainer()}\n content={\n <TooltipContainer>\n <Typography variant=\"label\" size=\"medium\" color=\"neutral700\">\n <b>{i18n.t('Warning')}</b>: \n {i18n.t(\n \"Enabling the 'Infinite approval' mode grants unrestricted access to underlying smart contracts, allowing them to utilize the approved token amount without limitations.\"\n )}\n </Typography>\n </TooltipContainer>\n }>\n <InfoIcon color=\"gray\" />\n </Tooltip>\n </React.Fragment>\n ),\n start: <InfinityIcon color=\"gray\" size={16} />,\n end: <Switch checked={infiniteApprove} />,\n onClick: toggleInfiniteApprove,\n };\n\n const themeItem = {\n id: 'widget-setting-theme-item-btn',\n type: <ListItem />,\n title: (\n <Typography variant=\"title\" size=\"xmedium\">\n {i18n.t('Theme')}\n </Typography>\n ),\n end: (\n <ThemeSection>\n <Tabs\n container={getContainer()}\n items={themesList}\n value={theme}\n className=\"widget-setting-theme-item-tabs-container\"\n onChange={(item) => setTheme(item.id as ThemeMode)}\n type=\"primary\"\n borderRadius=\"small\"\n />\n </ThemeSection>\n ),\n start: getThemeIcon(theme),\n };\n\n const settingItems: ListPropTypes['items'] = isLiquidityHidden\n ? []\n : [bridgeItem, exchangeItem];\n if (!isCustomTokensHidden) {\n settingItems.push(customTokensItem);\n }\n if (!isLanguageHidden) {\n settingItems.push(languageItem);\n }\n settingItems.push(infiniteApprovalItem);\n\n if (!themeConfig?.singleTheme && !isThemeHidden) {\n settingItems.push(themeItem);\n }\n\n return (\n <List\n type={\n <ListItemButton\n className=\"widget-settings-list-item-btn\"\n hasDivider\n id=\"_\"\n onClick={() => console.log()}\n />\n }\n items={settingItems}\n />\n );\n}\n", "import { i18n } from '@lingui/core';\nimport { cancelSwap } from '@rango-dev/queue-manager-rango-preset';\nimport { useManager } from '@rango-dev/queue-manager-react';\nimport { Alert } from '@rango-dev/ui';\nimport React from 'react';\nimport { useParams } from 'react-router-dom';\n\nimport { SwapDetails } from '../components/SwapDetails';\nimport { SwapDetailsPlaceholder } from '../components/SwapDetails/SwapDetails.Placeholder';\nimport { useNavigateBack } from '../hooks/useNavigateBack';\nimport { useAppStore } from '../store/AppStore';\nimport { getPendingSwaps } from '../utils/queue';\n\nexport function SwapDetailsPage() {\n const { manager, state } = useManager();\n const loading = !state.loadedFromPersistor;\n const pendingSwaps = getPendingSwaps(manager);\n const { requestId } = useParams<{ requestId: string }>();\n const navigateBack = useNavigateBack();\n const { fetchStatus: fetchMetaStatus } = useAppStore();\n\n if (!requestId) {\n return (\n <Alert\n containerStyles={{ margin: '20px' }}\n type=\"error\"\n title={i18n.t(\n 'The request ID is necessary to display the swap details.'\n )}\n />\n );\n }\n\n const showSkeleton = loading || fetchMetaStatus === 'loading';\n\n const selectedSwap = requestId\n ? pendingSwaps.find(({ swap }) => swap.requestId === requestId)\n : undefined;\n\n const onCancel = () => {\n if (selectedSwap?.id) {\n const swap = manager?.get(selectedSwap.id);\n if (swap) {\n cancelSwap(swap);\n }\n }\n };\n\n const onDelete = async () => {\n if (selectedSwap?.id) {\n try {\n manager?.deleteQueue(selectedSwap.id);\n navigateBack();\n } catch (e) {\n console.log(e);\n }\n }\n };\n const swap = selectedSwap?.swap;\n\n if (!swap || showSkeleton) {\n return (\n <SwapDetailsPlaceholder\n requestId={requestId}\n showSkeleton={showSkeleton}\n />\n );\n }\n\n return (\n <SwapDetails\n swap={swap}\n requestId={requestId}\n onCancel={onCancel}\n onDelete={onDelete}\n />\n );\n}\n", "import type { SwapDetailsProps } from './SwapDetails.types';\nimport type { ModalState } from '../SwapDetailsModal';\nimport type { SwitchNetworkModalState } from '../SwapDetailsModal/SwapDetailsModal.types';\n\nimport { i18n } from '@lingui/core';\nimport {\n getCurrentNamespaceOfOrNull,\n getCurrentStep,\n getRelatedWalletOrNull,\n} from '@rango-dev/queue-manager-rango-preset';\nimport {\n Button,\n Divider,\n QuoteCost,\n StepDetails,\n Typography,\n} from '@rango-dev/ui';\nimport { useWallets } from '@rango-dev/wallets-react';\nimport BigNumber from 'bignumber.js';\nimport { PendingSwapNetworkStatus } from 'rango-types';\nimport React, { useEffect, useRef, useState } from 'react';\nimport { useNavigate } from 'react-router-dom';\n\nimport {\n GAS_FEE_MAX_DECIMALS,\n GAS_FEE_MIN_DECIMALS,\n PERCENTAGE_CHANGE_MAX_DECIMALS,\n PERCENTAGE_CHANGE_MIN_DECIMALS,\n TOKEN_AMOUNT_MAX_DECIMALS,\n TOKEN_AMOUNT_MIN_DECIMALS,\n USD_VALUE_MAX_DECIMALS,\n USD_VALUE_MIN_DECIMALS,\n} from '../../constants/routing';\nimport { useAppStore } from '../../store/AppStore';\nimport { useNotificationStore } from '../../store/notification';\nimport { useQuoteStore } from '../../store/quote';\nimport { getContainer } from '../../utils/common';\nimport {\n numberToString,\n roundedSecondsToString,\n totalArrivalTime,\n} from '../../utils/numbers';\nimport {\n createRetryQuote,\n getPriceImpact,\n getPriceImpactLevel,\n} from '../../utils/quote';\nimport {\n getLastConvertedTokenInFailedSwap,\n getSwapMessages,\n shouldRetrySwap,\n} from '../../utils/swap';\nimport { getSwapDate } from '../../utils/time';\nimport { getConciseAddress } from '../../utils/wallets';\nimport { SuffixContainer } from '../HeaderButtons/HeaderButtons.styles';\nimport { Layout } from '../Layout';\nimport { QuoteSummary } from '../Quote';\nimport {\n SwapDetailsCompleteModal,\n SwapDetailsModal,\n} from '../SwapDetailsModal';\n\nimport { RequestIdRow } from './RequestIdRow';\nimport { SwapDateRow } from './SwapDateRow';\nimport { getSteps, getStepState } from './SwapDetails.helpers';\nimport {\n Container,\n ErrorMessages,\n MessageText,\n outputStyles,\n StepsList,\n titleStepsStyles,\n} from './SwapDetails.styles';\n\nconst SUCCESS_SWITCH_NETWORK_MODAL_CLOSE_DELAY = 3000;\n\nexport function SwapDetails(props: SwapDetailsProps) {\n const { swap, requestId, onDelete, onCancel } = props;\n const { canSwitchNetworkTo, connect, getWalletInfo } = useWallets();\n const blockchains = useAppStore().blockchains();\n const swappers = useAppStore().swappers();\n const { findToken } = useAppStore();\n const retry = useQuoteStore().use.retry();\n const navigate = useNavigate();\n const containerRef = useRef<HTMLDivElement | null>(null);\n const [isModalOpen, setIsModalOpen] = useState(false);\n const [modalState, setModalState] = useState<ModalState>(null);\n const [switchNetworkModalState, setSwitchNetworkModalState] =\n useState<SwitchNetworkModalState | null>(null);\n const [showCompletedModal, setShowCompletedModal] = useState<\n 'success' | 'failed' | null\n >(null);\n\n const modalStateRef = useRef(modalState);\n const switchNetworkModalStateRef = useRef(switchNetworkModalState);\n\n const getNotifications = useNotificationStore.use.getNotifications();\n const removeNotification = useNotificationStore.use.removeNotification();\n const notifications = getNotifications();\n const currentStep = getCurrentStep(swap);\n const currentStepNetworkStatus = currentStep?.networkStatus;\n\n const handleChangeModalState = (state: ModalState) => {\n setIsModalOpen(true);\n setModalState(state);\n };\n\n const handleCloseModal = () => {\n setIsModalOpen(false);\n };\n\n const handleShowSwitchNetworkLoading = () => {\n setSwitchNetworkModalState({\n type: 'loading',\n title: i18n.t('Change Network'),\n description: `We\u2019re switching the connected network to ${currentStepNamespace?.network}. Please check your wallet.`,\n });\n };\n const handleShowSwitchNetworkSucceeded = () => {\n setSwitchNetworkModalState({\n type: 'success',\n title: i18n.t('Network Changed'),\n description: 'The network has been successfully changed.',\n });\n };\n const handleShowSwitchNetworkFailed = (error?: Error) => {\n setSwitchNetworkModalState({\n type: 'error',\n title: i18n.t('Network Switch Failed'),\n description: error?.message || stepMessage.detailedMessage.content,\n });\n };\n\n const lastConvertedTokenInFailedSwap =\n getLastConvertedTokenInFailedSwap(swap);\n\n const currentStepNamespace = currentStep\n ? getCurrentNamespaceOfOrNull(swap, currentStep)\n : null;\n const currentStepWallet = currentStep\n ? getRelatedWalletOrNull(swap, currentStep)\n : null;\n\n const swapDate = getSwapDate(swap);\n const shouldRetry = shouldRetrySwap(swap);\n\n const checkIsMobileWallet = (walletType: string): boolean =>\n !!getWalletInfo(walletType)?.mobileWallet;\n\n const stepIsBlockedForSwitchNetwork =\n !!currentStepNetworkStatus &&\n [\n PendingSwapNetworkStatus.WaitingForNetworkChange,\n PendingSwapNetworkStatus.NetworkChangeFailed,\n ].includes(currentStepNetworkStatus);\n const isMobileWallet =\n !!currentStepWallet?.walletType &&\n checkIsMobileWallet(currentStepWallet.walletType);\n const canSwitchNetworkToRequiredNetwork =\n !!currentStepWallet &&\n !!currentStepNamespace &&\n canSwitchNetworkTo(\n currentStepWallet.walletType,\n currentStepNamespace.network,\n currentStepNamespace\n );\n\n const switchNetworkIsAvailable =\n !!currentStepNamespace &&\n stepIsBlockedForSwitchNetwork &&\n (isMobileWallet || canSwitchNetworkToRequiredNetwork);\n\n const handleSwitchNetwork = () => {\n if (switchNetworkIsAvailable) {\n handleShowSwitchNetworkLoading();\n connect(currentStepWallet.walletType, [\n {\n namespace: currentStepNamespace.namespace,\n network: currentStepNamespace.network,\n },\n ])\n .then(() => {\n handleShowSwitchNetworkSucceeded();\n })\n .catch((error: unknown) => {\n handleShowSwitchNetworkFailed(error as Error);\n });\n }\n };\n\n const handleSwitchNetworkClick = () => {\n handleChangeModalState('switchNetwork');\n handleSwitchNetwork();\n };\n\n const stepMessage = getSwapMessages(swap, currentStep, getWalletInfo);\n const steps = getSteps({\n swap,\n switchNetworkIsAvailable,\n handleSwitchNetworkClick,\n showNetworkModal: currentStepNetworkStatus,\n setNetworkModal: handleChangeModalState,\n message: stepMessage,\n blockchains: blockchains,\n swappers,\n });\n const numberOfSteps = steps.length;\n const [firstStep, lastStep] = [swap.steps[0], swap.steps[numberOfSteps - 1]];\n const outputAmount =\n lastStep?.outputAmount || lastStep?.expectedOutputAmountHumanReadable;\n\n const totalFee = swap.steps.reduce(\n (totalFee, steps) => totalFee + parseFloat(steps.feeInUsd || ''),\n 0\n );\n\n const diagnosisUrl = swap.steps.find(\n (step) => step.diagnosisUrl\n )?.diagnosisUrl;\n\n const outputUsdValue = numberToString(\n parseFloat(outputAmount || '0') * (lastStep?.toUsdPrice || 0),\n USD_VALUE_MIN_DECIMALS,\n USD_VALUE_MAX_DECIMALS\n );\n\n const inputUsdValue = numberToString(\n parseFloat(swap.inputAmount) * (firstStep?.fromUsdPrice || 0),\n USD_VALUE_MIN_DECIMALS,\n USD_VALUE_MAX_DECIMALS\n );\n\n const realOutputUsdValue = outputAmount\n ? new BigNumber(outputAmount)\n .multipliedBy(lastStep.toUsdPrice || 0)\n .toString()\n : '';\n\n const realInputUsdValue = new BigNumber(swap.inputAmount)\n .multipliedBy(firstStep?.fromUsdPrice || 0)\n .toString();\n\n const percentageChange = getPriceImpact(inputUsdValue, outputUsdValue);\n\n const stepDetailMessage =\n stepMessage.detailedMessage.content || stepMessage.shortMessage;\n\n const completeModalDesc =\n swap.status === 'success' ? (\n i18n.t({\n id: 'You have received {amount} {token} in {conciseAddress} wallet on {chain} chain.',\n values: {\n amount: numberToString(\n outputAmount,\n TOKEN_AMOUNT_MIN_DECIMALS,\n TOKEN_AMOUNT_MAX_DECIMALS\n ),\n token: steps[numberOfSteps - 1]?.to.token.displayName,\n conciseAddress: getConciseAddress(\n swap.wallets[steps[numberOfSteps - 1]?.to.chain.displayName || '']\n ?.address || ''\n ),\n chain: steps[numberOfSteps - 1]?.to.chain.displayName,\n },\n })\n ) : (\n <ErrorMessages>\n <Typography\n variant=\"body\"\n size=\"medium\"\n color=\"neutral700\"\n align=\"center\">\n {!stepDetailMessage ? i18n.t('Transaction was not sent.') : ''}\n {lastConvertedTokenInFailedSwap\n ? `${i18n.t({\n id: '{amount} {symbol} on {blockchain} remains in your wallet.',\n values: {\n amount: lastConvertedTokenInFailedSwap.outputAmount,\n symbol: lastConvertedTokenInFailedSwap.symbol,\n blockchain: lastConvertedTokenInFailedSwap.blockchain,\n },\n })}`\n : ''}\n </Typography>\n {stepDetailMessage && (\n <MessageText\n align=\"center\"\n variant=\"body\"\n size=\"medium\"\n color=\"neutral700\">\n <b>Reason:</b> {stepDetailMessage}\n </MessageText>\n )}\n </ErrorMessages>\n );\n\n useEffect(() => {\n const existNotification = notifications.find(\n (n) => n.requestId === swap.requestId\n );\n if (existNotification) {\n if (swap.status === 'success' || swap.status === 'failed') {\n setShowCompletedModal(swap.status);\n removeNotification(swap.requestId);\n handleCloseModal();\n } else if (showCompletedModal) {\n setShowCompletedModal(null);\n }\n }\n }, [swap.status, swap.requestId]);\n\n useEffect(() => {\n if (switchNetworkIsAvailable) {\n handleChangeModalState('switchNetwork');\n if (\n currentStepNetworkStatus ===\n PendingSwapNetworkStatus.WaitingForNetworkChange\n ) {\n handleShowSwitchNetworkLoading();\n return;\n }\n if (\n currentStepNetworkStatus ===\n PendingSwapNetworkStatus.NetworkChangeFailed\n ) {\n handleShowSwitchNetworkFailed();\n return;\n }\n return;\n }\n\n if (\n currentStepNetworkStatus ===\n PendingSwapNetworkStatus.WaitingForConnectingWallet\n ) {\n handleChangeModalState('connectWallet');\n return;\n }\n\n if (currentStepNetworkStatus === PendingSwapNetworkStatus.NetworkChanged) {\n handleChangeModalState('switchNetwork');\n handleShowSwitchNetworkSucceeded();\n return;\n }\n\n if (modalState && ['connectWallet', 'switchNetwork'].includes(modalState)) {\n handleCloseModal();\n }\n }, [currentStepNetworkStatus]);\n\n useEffect(() => {\n modalStateRef.current = modalState;\n switchNetworkModalStateRef.current = switchNetworkModalState;\n\n // Close switch network success modal with a delay\n if (\n modalState === 'switchNetwork' &&\n switchNetworkModalState?.type === 'success'\n ) {\n const timeout = setTimeout(() => {\n if (\n modalStateRef.current === 'switchNetwork' &&\n switchNetworkModalStateRef.current?.type === 'success'\n ) {\n handleCloseModal();\n }\n }, SUCCESS_SWITCH_NETWORK_MODAL_CLOSE_DELAY);\n\n return () => clearTimeout(timeout);\n }\n return;\n }, [modalState, switchNetworkModalState]);\n\n return (\n <Layout\n header={{\n title: i18n.t('Swap Details'),\n onCancel:\n swap.status === 'running'\n ? () => handleChangeModalState('cancel')\n : undefined,\n suffix: swap.status !== 'running' && (\n <SuffixContainer>\n <Button\n id=\"widget-swap-details-delete-btn\"\n variant=\"ghost\"\n type=\"error\"\n size=\"xsmall\"\n onClick={() => handleChangeModalState('delete')}>\n <Typography size=\"medium\" variant=\"label\" color=\"error\">\n {i18n.t('Delete')}\n </Typography>\n </Button>\n </SuffixContainer>\n ),\n }}\n footer={\n shouldRetry &&\n !showCompletedModal && (\n <Button\n fullWidth\n id=\"widget-swap-details-try-again-btn\"\n variant=\"contained\"\n type=\"primary\"\n size=\"large\"\n onClick={() => {\n const swapInput = createRetryQuote(swap, blockchains, findToken);\n retry(swapInput);\n setTimeout(() => {\n const home = '../../';\n navigate(home);\n }, 0);\n }}>\n {i18n.t('Try again')}\n </Button>\n )\n }>\n <Container compact ref={containerRef}>\n <RequestIdRow requestId={requestId} />\n <SwapDateRow date={swapDate} isFinished={!!swap.finishTime} />\n\n <div className={outputStyles()}>\n <QuoteCost\n fee={numberToString(\n String(totalFee),\n GAS_FEE_MIN_DECIMALS,\n GAS_FEE_MAX_DECIMALS\n )}\n time={roundedSecondsToString(totalArrivalTime(swap.steps))}\n steps={numberOfSteps}\n />\n <QuoteSummary\n from={{\n price: {\n value: numberToString(\n swap.inputAmount,\n TOKEN_AMOUNT_MIN_DECIMALS,\n TOKEN_AMOUNT_MAX_DECIMALS\n ),\n usdValue: inputUsdValue,\n realUsdValue: realInputUsdValue,\n realValue: swap.inputAmount,\n },\n token: {\n displayName: steps[0]?.from.token.displayName || '',\n image: steps[0]?.from.token.image,\n },\n chain: {\n image: steps[0]?.from.chain.image,\n displayName: steps[0]?.from.chain.displayName || '',\n },\n }}\n to={{\n price: {\n value: numberToString(\n outputAmount,\n TOKEN_AMOUNT_MIN_DECIMALS,\n TOKEN_AMOUNT_MAX_DECIMALS\n ),\n usdValue: outputUsdValue,\n realUsdValue: realOutputUsdValue,\n realValue: outputAmount || '',\n },\n token: {\n displayName:\n steps[numberOfSteps - 1]?.to.token.displayName || '',\n image: steps[numberOfSteps - 1]?.to.token.image,\n },\n chain: {\n image: steps[numberOfSteps - 1]?.to.chain.image,\n displayName:\n steps[numberOfSteps - 1]?.to.chain.displayName || '',\n },\n }}\n percentageChange={numberToString(\n percentageChange,\n PERCENTAGE_CHANGE_MIN_DECIMALS,\n PERCENTAGE_CHANGE_MAX_DECIMALS\n )}\n warningLevel={getPriceImpactLevel(percentageChange ?? 0)}\n />\n </div>\n <div className={titleStepsStyles()}>\n <Typography variant=\"title\" size=\"small\">\n {i18n.t('Swaps steps')}\n </Typography>\n </div>\n <Divider size={8} />\n <StepsList>\n {steps.map((step, index) => {\n const key = index;\n const state = swap.steps[index] && getStepState(swap.steps[index]);\n const isFocused =\n state === 'error' ||\n state === 'in-progress' ||\n state === 'warning' ||\n (state === 'completed' && index === steps.length - 1);\n return (\n <StepDetails\n className={'widget-swap-details-step-item-container'}\n key={key}\n step={step}\n type=\"swap-progress\"\n ref={containerRef}\n state={state}\n hasSeparator={index !== 0}\n tabIndex={key}\n isFocused={isFocused}\n tooltipContainer={getContainer()}\n />\n );\n })}\n </StepsList>\n </Container>\n\n <SwapDetailsModal\n isOpen={isModalOpen}\n state={modalState}\n switchNetworkModalState={switchNetworkModalState}\n onClose={handleCloseModal}\n onCancel={onCancel}\n onDelete={onDelete}\n message={stepMessage.detailedMessage.content}\n swap={swap}\n handleSwitchNetwork={handleSwitchNetworkClick}\n />\n <SwapDetailsCompleteModal\n open={!!showCompletedModal}\n diagnosisUrl={diagnosisUrl}\n onClose={() => setShowCompletedModal(null)}\n status={swap.status === 'success' ? 'success' : 'failed'}\n priceValue={numberToString(\n outputAmount,\n TOKEN_AMOUNT_MIN_DECIMALS,\n TOKEN_AMOUNT_MAX_DECIMALS\n )}\n usdValue={outputUsdValue}\n realUsdValue={realOutputUsdValue}\n realValue={outputAmount || ''}\n percentageChange={numberToString(\n percentageChange,\n PERCENTAGE_CHANGE_MIN_DECIMALS,\n PERCENTAGE_CHANGE_MAX_DECIMALS\n )}\n token={{\n displayName: steps[numberOfSteps - 1]?.to.token.displayName || '',\n image: steps[numberOfSteps - 1]?.to.token.image,\n }}\n chain={{ image: steps[numberOfSteps - 1]?.to.chain.image }}\n description={completeModalDesc}\n />\n </Layout>\n );\n}\n", "import type { PendingSwap } from 'rango-types';\n\nimport { i18n } from '@lingui/core';\n\nconst daysOfWeek = [\n i18n.t('Sunday'),\n i18n.t('Monday'),\n i18n.t('Tuesday'),\n i18n.t('Wednesday'),\n i18n.t('Thursday'),\n i18n.t('Friday'),\n i18n.t('Saturday'),\n];\n\nexport function timeSince(millisecond: number) {\n const date = new Date(millisecond);\n const day = date.getDate();\n const month = date.toLocaleString('default', { month: 'long' });\n const year = date.getFullYear();\n const isToday = date.getDay() === new Date().getDay();\n const formattedDate = isToday\n ? i18n.t('Today')\n : `${daysOfWeek[date.getDay()]} ${day} ${month} ${year}`;\n\n return `${formattedDate}, ${new Date(millisecond).toLocaleTimeString()}`;\n}\n\nexport function getSwapDate(pendingSwap: PendingSwap) {\n const time = pendingSwap.finishTime\n ? timeSince(parseInt(pendingSwap.finishTime))\n : timeSince(parseInt(pendingSwap.creationTime));\n return time;\n}\n", "import type { ModalPropTypes } from './SwapDetailsModal.types';\n\nimport React from 'react';\n\nimport { getContainer } from '../../utils/common';\nimport { WatermarkedModal } from '../common/WatermarkedModal';\n\nimport { CancelContent } from './SwapDetailsModal.Cancel';\nimport { DeleteContent } from './SwapDetailsModal.Delete';\nimport { NetworkStateContent } from './SwapDetailsModal.NetworkState';\nimport { WalletStateContent } from './SwapDetailsModal.WalletState';\n\nexport function SwapDetailsModal(props: ModalPropTypes) {\n const {\n isOpen,\n state,\n switchNetworkModalState,\n onClose,\n onDelete,\n onCancel,\n swap,\n message,\n handleSwitchNetwork,\n } = props;\n\n return (\n <WatermarkedModal\n open={isOpen}\n onClose={onClose}\n container={getContainer()}>\n {state === 'connectWallet' && (\n <WalletStateContent swap={swap} message={message} onClose={onClose} />\n )}\n {state === 'switchNetwork' && switchNetworkModalState && (\n <NetworkStateContent\n message={message}\n switchNetworkModalState={switchNetworkModalState}\n handleSwitchNetwork={handleSwitchNetwork}\n />\n )}\n {state === 'delete' && (\n <DeleteContent\n onClose={onClose}\n onDelete={() => {\n onClose();\n onDelete();\n }}\n />\n )}\n {state === 'cancel' && (\n <CancelContent\n onClose={onClose}\n onCancel={() => {\n onClose();\n onCancel();\n }}\n />\n )}\n </WatermarkedModal>\n );\n}\n", "import type { CancelContentProps } from './SwapDetailsModal.types';\n\nimport { i18n } from '@lingui/core';\nimport { Button, Divider, MessageBox } from '@rango-dev/ui';\nimport React from 'react';\n\nexport const CancelContent = ({ onCancel, onClose }: CancelContentProps) => {\n return (\n <>\n <Divider size={20} />\n <MessageBox\n type=\"error\"\n title={i18n.t('Cancel Swap')}\n description={i18n.t('Are you sure you want to cancel this swap?')}\n />\n <Divider size={32} />\n <Button\n variant=\"contained\"\n id=\"widget-swap-details-modal-cancel-swap-yes-btn\"\n type=\"primary\"\n size=\"large\"\n onClick={onCancel}>\n {i18n.t('Yes, Cancel it')}\n </Button>\n <Divider size={12} />\n <Button\n id=\"widget-swap-details-modal-cancel-swap-no-btn\"\n variant=\"outlined\"\n type=\"primary\"\n size=\"large\"\n onClick={onClose}>\n {i18n.t('No, Continue')}\n </Button>\n </>\n );\n};\n", "import type { DeleteContentProps } from './SwapDetailsModal.types';\n\nimport { i18n } from '@lingui/core';\nimport { Button, Divider, MessageBox, Typography } from '@rango-dev/ui';\nimport React from 'react';\n\nexport const DeleteContent = ({ onDelete, onClose }: DeleteContentProps) => {\n return (\n <>\n <Divider size={20} />\n <MessageBox\n type=\"error\"\n title={i18n.t('Delete Transaction')}\n description={i18n.t('Are you sure you want to delete this swap?')}\n />\n <Divider size={32} />\n <Button\n id=\"widget-swap-details-modal-delete-swap-yes-btn\"\n variant=\"contained\"\n type=\"primary\"\n size=\"large\"\n onClick={onDelete}>\n {i18n.t('Yes, Delete it')}\n </Button>\n <Divider size={12} />\n <Button\n id=\"widget-swap-details-modal-delete-swap-no-btn\"\n variant=\"outlined\"\n type=\"primary\"\n size=\"large\"\n onClick={onClose}>\n <Typography variant=\"title\" size=\"medium\" color=\"primary\">\n {i18n.t('No, Cancel')}\n </Typography>\n </Button>\n </>\n );\n};\n", "import type { NetworkStateContentProps } from './SwapDetailsModal.types';\n\nimport { i18n } from '@lingui/core';\nimport { Button, Divider, MessageBox } from '@rango-dev/ui';\nimport React from 'react';\n\nexport const NetworkStateContent = (props: NetworkStateContentProps) => {\n const { switchNetworkModalState, handleSwitchNetwork } = props;\n\n return (\n <>\n <MessageBox\n type={switchNetworkModalState.type}\n title={switchNetworkModalState.title}\n description={switchNetworkModalState.description}\n />\n {switchNetworkModalState.type === 'error' && (\n <>\n <Divider size=\"30\" />\n <Button\n id=\"widget-switch-network-try-again\"\n type=\"primary\"\n size=\"large\"\n onClick={handleSwitchNetwork}>\n {i18n.t('Try Again')}\n </Button>\n </>\n )}\n </>\n );\n};\n", "import type { WalletStateContentProps } from './SwapDetailsModal.types';\n\nimport {\n getCurrentNamespaceOfOrNull,\n getCurrentStep,\n getRelatedWalletOrNull,\n} from '@rango-dev/queue-manager-rango-preset';\nimport { WalletState } from '@rango-dev/ui';\nimport { useWallets } from '@rango-dev/wallets-react';\nimport React from 'react';\n\nimport { getWalletConnectionStatus } from '../../utils/wallets';\n\nimport { ConnectWalletContent } from './SwapDetailsModal.ConnectWallet';\nimport { InstallWalletContent } from './SwapDetailsModal.InstallWallet';\n\nexport const WalletStateContent = (props: WalletStateContentProps) => {\n const { swap, onClose } = props;\n const { state, getWalletInfo } = useWallets();\n\n const currentStep = getCurrentStep(swap);\n const currentStepWallet = currentStep\n ? getRelatedWalletOrNull(swap, currentStep)\n : null;\n\n const walletType = currentStepWallet?.walletType;\n const walletState = walletType\n ? getWalletConnectionStatus(getWalletInfo(walletType), state(walletType))\n : null;\n const currentNamespace = currentStep\n ? getCurrentNamespaceOfOrNull(swap, currentStep)\n : null;\n\n if (!walletType) {\n return null;\n }\n\n if (walletState === WalletState.NOT_INSTALLED) {\n return <InstallWalletContent walletType={walletType} />;\n }\n\n return (\n <ConnectWalletContent\n wallet={currentStepWallet}\n namespace={currentNamespace}\n onClose={onClose}\n />\n );\n};\n", "import type { ConnectWalletContentProps } from './SwapDetailsModal.types';\n\nimport { i18n } from '@lingui/core';\nimport {\n Alert,\n Button,\n Checkbox,\n Divider,\n Image,\n MessageBox,\n Spinner,\n WarningIcon,\n} from '@rango-dev/ui';\nimport { useWallets } from '@rango-dev/wallets-react';\nimport React, { useState } from 'react';\n\nimport { useWalletList } from '../../hooks/useWalletList';\nimport { useUiStore } from '../../store/ui';\nimport { getConciseAddress } from '../../utils/wallets';\nimport { NamespaceItem } from '../NamespaceItem';\n\nimport {\n WalletIcon,\n WalletIconBadgeContainer,\n} from './SwapDetailsModal.styles';\n\nexport const ConnectWalletContent = (props: ConnectWalletContentProps) => {\n const { wallet: currentStepWallet, namespace, onClose } = props;\n\n const [error, setError] = useState<Error | null>(null);\n const { list } = useWalletList();\n const isActiveTab = useUiStore.use.isActiveTab();\n const { state, connect } = useWallets();\n\n const wallet = list.find(\n (wallet) => wallet.type === currentStepWallet.walletType\n );\n const namespaceData = wallet?.needsNamespace?.data.find(\n (namespaceData) => namespaceData.value === namespace?.namespace\n );\n\n if (!wallet) {\n return null;\n }\n\n const walletState = state(currentStepWallet.walletType);\n const namespaceState =\n wallet.isHub && namespace?.namespace\n ? walletState.namespaces?.get(namespace.namespace)\n : null;\n\n const connecting = walletState.connecting || namespaceState?.connecting;\n const connected = wallet.isHub\n ? namespaceState?.connected\n : walletState.connected;\n\n const getButtonTitle = () => {\n if (connected) {\n return i18n.t('Done');\n }\n if (error) {\n return i18n.t('Try again');\n }\n return i18n.t('Connect');\n };\n\n const getNamespaceSuffix = () => {\n if (connecting) {\n return <Spinner color=\"info\" />;\n } else if (error || connected) {\n return null;\n }\n return <Checkbox checked disabled />;\n };\n\n const handleConnect = async () => {\n try {\n setError(null);\n await connect(\n wallet.type,\n namespace?.namespace\n ? [\n {\n namespace: namespace?.namespace,\n network: undefined,\n derivationPath: currentStepWallet.derivationPath,\n },\n ]\n : undefined\n );\n } catch (error) {\n setError(error as Error);\n }\n };\n\n const handleClickButton = async () => {\n if (connected) {\n onClose();\n return;\n }\n\n void handleConnect();\n };\n\n const getAddress = () => {\n if (!connected) {\n return null;\n }\n const firstAccountArray = wallet?.isHub\n ? namespaceState?.accounts?.[0]?.split(':')\n : walletState?.accounts?.[0]?.split(':');\n const address = firstAccountArray?.[firstAccountArray?.length - 1];\n\n if (!address) {\n return null;\n }\n\n return getConciseAddress(address);\n };\n\n return (\n <>\n <MessageBox\n type=\"warning\"\n title={i18n.t('Connect {wallet}', { wallet: wallet.title })}\n description={i18n.t(\n 'The connection of your wallet or some networks has been disconnected. Connect to continue the swap'\n )}\n icon={\n <WalletIcon>\n <Image src={wallet.image} size={45} />\n <WalletIconBadgeContainer>\n <WarningIcon color=\"warning\" size={10} />\n </WalletIconBadgeContainer>\n </WalletIcon>\n }\n />\n {connected && !namespaceData && (\n <>\n <Divider size={10} />\n <Alert\n type=\"success\"\n variant=\"alarm\"\n title={i18n.t('Wallet connected successfully.')}\n />\n </>\n )}\n {error && !namespaceData && (\n <>\n <Divider size={10} />\n <Alert type=\"error\" title={error?.message} variant=\"alarm\" />\n </>\n )}\n {namespaceData && (\n <>\n <Divider size={30} />\n <NamespaceItem\n namespace={namespaceData}\n suffix={getNamespaceSuffix()}\n error={error?.message}\n connected={connected}\n address={getAddress()}\n />\n </>\n )}\n <Divider size=\"40\" />\n <Button\n loading={connecting}\n type=\"primary\"\n id=\"widget-connect-wallet-btn\"\n onClick={handleClickButton}\n disabled={!isActiveTab}>\n {getButtonTitle()}\n </Button>\n </>\n );\n};\n", "import { css, darkTheme, styled } from '@rango-dev/ui';\n\nexport const wordWrap = css({\n wordWrap: 'break-word',\n display: 'block',\n});\n\nexport const ProfileBanner = styled('img', {\n width: '100%',\n});\n\nexport const WalletIcon = styled('div', {\n position: 'relative',\n});\n\nexport const WalletIconBadgeContainer = styled('span', {\n position: 'absolute',\n top: 0,\n right: 0,\n borderRadius: '50%',\n width: '14px',\n height: '14px',\n display: 'flex',\n padding: '$2',\n backgroundColor: '$warning300',\n [`.${darkTheme} &`]: {\n $$color: '$warning600',\n },\n});\n", "import type { InstallWalletContentProps } from './SwapDetailsModal.types';\n\nimport { i18n } from '@lingui/core';\nimport { Button, Divider, Image, MessageBox, WarningIcon } from '@rango-dev/ui';\nimport { useWallets } from '@rango-dev/wallets-react';\nimport { detectInstallLink } from '@rango-dev/wallets-shared';\nimport React from 'react';\n\nimport {\n WalletIcon,\n WalletIconBadgeContainer,\n} from './SwapDetailsModal.styles';\n\nexport const InstallWalletContent = (props: InstallWalletContentProps) => {\n const { walletType } = props;\n\n const { getWalletInfo } = useWallets();\n\n const walletInfo = walletType ? getWalletInfo(walletType) : null;\n\n if (!walletInfo) {\n return null;\n }\n\n const handleButtonClick = () =>\n window.open(detectInstallLink(walletInfo.installLink), '_blank');\n\n return (\n <>\n <MessageBox\n type=\"warning\"\n title={i18n.t('Install {wallet}', { wallet: walletInfo.name })}\n description=\"Your wallet is not installed. Please install it to continue the swap. \"\n icon={\n <WalletIcon>\n <Image src={walletInfo.img} size={45} />\n <WalletIconBadgeContainer>\n <WarningIcon color=\"warning\" size={10} />\n </WalletIconBadgeContainer>\n </WalletIcon>\n }\n />\n <Divider size=\"40\" />\n <Button\n type=\"primary\"\n id=\"widget-install-wallet-btn\"\n onClick={handleButtonClick}>\n {i18n.t('Install')}\n </Button>\n </>\n );\n};\n", "import type { CompleteModalPropTypes } from './SwapDetailsModal.types';\n\nimport { i18n } from '@lingui/core';\nimport {\n Button,\n Divider,\n MessageBox,\n TokenAmount,\n Typography,\n} from '@rango-dev/ui';\nimport React from 'react';\nimport { Link, useNavigate } from 'react-router-dom';\n\nimport { WIDGET_UI_ID } from '../../constants';\nimport {\n PROFILE_BANNER_IMAGE_SOURCE,\n PROFILE_BANNER_NAVIGATION_LINK,\n} from '../../constants/profileBanner';\nimport { useUiStore } from '../../store/ui';\nimport { getContainer } from '../../utils/common';\nimport { WatermarkedModal } from '../common/WatermarkedModal';\n\nimport { ProfileBanner, wordWrap } from './SwapDetailsModal.styles';\n\nexport function SwapDetailsCompleteModal(props: CompleteModalPropTypes) {\n const {\n open,\n onClose,\n status,\n priceValue,\n usdValue,\n realUsdValue,\n realValue,\n token,\n chain,\n percentageChange,\n description,\n diagnosisUrl,\n } = props;\n const navigate = useNavigate();\n const { showProfileBanner } = useUiStore();\n\n return (\n <WatermarkedModal\n open={open}\n onClose={onClose}\n id=\"widget-swap-details-complete-modal\"\n container={\n document.getElementById(WIDGET_UI_ID.SWAP_BOX_ID) || document.body\n }>\n {status === 'success' ? (\n <MessageBox type=\"success\" title={i18n.t('Swap Successful')}>\n <TokenAmount\n direction=\"vertical\"\n tooltipContainer={getContainer()}\n id=\"widget-swap-details-complete-modal-success-token-amount-container\"\n type=\"output\"\n centerAlign={true}\n price={{\n value: priceValue,\n usdValue,\n realUsdValue,\n realValue,\n }}\n token={token}\n chain={chain}\n percentageChange={percentageChange}\n />\n <Divider size={12} />\n <Typography\n className={wordWrap()}\n variant=\"body\"\n size=\"medium\"\n color=\"neutral700\"\n align=\"center\">\n {description}\n </Typography>\n </MessageBox>\n ) : (\n <MessageBox\n type=\"error\"\n title={i18n.t('Transaction Failed')}\n description={description}\n />\n )}\n <Divider size={30} />\n {status === 'success' && (\n <>\n {showProfileBanner && (\n <>\n <Link to={PROFILE_BANNER_NAVIGATION_LINK}>\n <ProfileBanner\n src={PROFILE_BANNER_IMAGE_SOURCE}\n alt=\"Profile Banner\"\n />\n </Link>\n\n <Divider size={30} />\n </>\n )}\n <Button\n id=\"widget-swap-details-modal-done-btn\"\n variant=\"contained\"\n type=\"primary\"\n size=\"large\"\n onClick={() => {\n const home = '../../';\n navigate(home);\n }}>\n {i18n.t('Done')}\n </Button>\n </>\n )}\n <Divider size={12} />\n {diagnosisUrl && (\n <>\n <Button\n variant=\"contained\"\n id=\"widget-swap-detail-modal-diagnosis-btn\"\n type=\"primary\"\n size=\"large\"\n onClick={() => window.open(diagnosisUrl, '_blank')}>\n {i18n.t('Diagnosis')}\n </Button>\n <Divider size={12} />\n </>\n )}\n <Button\n id=\"widget-swap-details-modal-see-details-btn\"\n variant=\"outlined\"\n type=\"primary\"\n size=\"large\"\n onClick={onClose}>\n <Typography variant=\"title\" size=\"medium\" color=\"primary\">\n {i18n.t('See Details')}\n </Typography>\n </Button>\n </WatermarkedModal>\n );\n}\n", "export const PROFILE_BANNER_IMAGE_SOURCE =\n 'https://raw.githubusercontent.com/rango-exchange/assets/main/banners/widget/profile.jpg';\nexport const PROFILE_BANNER_NAVIGATION_LINK = '/profile';\n", "import type { RequestIdProps } from './SwapDetails.types';\n\nimport { i18n } from '@lingui/core';\nimport {\n CopyIcon,\n DoneIcon,\n IconButton,\n RangoExplorerIcon,\n Tooltip,\n Typography,\n useCopyToClipboard,\n} from '@rango-dev/ui';\nimport React from 'react';\n\nimport { SCANNER_BASE_URL } from '../../constants';\nimport { getContainer } from '../../utils/common';\n\nimport { RESET_INTERVAL } from './SwapDetails.helpers';\nimport {\n RequestIdContainer,\n requestIdStyles,\n rowStyles,\n StyledLink,\n} from './SwapDetails.styles';\n\nexport function RequestIdRow(props: RequestIdProps) {\n const { requestId } = props;\n const [isCopied, handleCopy] = useCopyToClipboard(RESET_INTERVAL);\n\n return (\n <RequestIdContainer className={rowStyles()}>\n <Typography variant=\"label\" size=\"large\" color=\"neutral700\">\n {i18n.t('Request ID')}\n </Typography>\n <div className={requestIdStyles()}>\n <Typography variant=\"label\" size=\"small\" color=\"neutral700\">\n {requestId}\n </Typography>\n <Tooltip\n container={getContainer()}\n content={\n isCopied ? i18n.t('Copied To Clipboard') : i18n.t('Copy Request ID')\n }\n open={isCopied || undefined}\n side=\"bottom\"\n alignOffset={-16}\n align=\"end\">\n <IconButton\n id=\"widget-swap-details-done-copy-icon-btn\"\n variant=\"ghost\"\n onClick={handleCopy.bind(null, requestId || '')}>\n {isCopied ? (\n <DoneIcon size={16} color=\"secondary\" />\n ) : (\n <CopyIcon size={16} color=\"gray\" />\n )}\n </IconButton>\n </Tooltip>\n\n <StyledLink\n target=\"_blank\"\n href={`${SCANNER_BASE_URL}/swap/${requestId}`}>\n <Tooltip\n container={getContainer()}\n content={i18n.t('View on Rango Explorer')}\n side=\"bottom\">\n <RangoExplorerIcon size={20} />\n </Tooltip>\n </StyledLink>\n </div>\n </RequestIdContainer>\n );\n}\n", "import type { GetStep } from '../SwapDetailsAlerts';\nimport type { Step, StepDetailsProps } from '@rango-dev/ui';\nimport type { PendingSwapStep, SwapperType } from 'rango-types';\n\nimport React from 'react';\n\nimport {\n TOKEN_AMOUNT_MAX_DECIMALS,\n TOKEN_AMOUNT_MIN_DECIMALS,\n} from '../../constants/routing';\nimport {\n getBlockchainShortNameFor,\n getSwapperDisplayName,\n} from '../../utils/meta';\nimport { numberToString } from '../../utils/numbers';\nimport { isNetworkStatusInWarningState } from '../../utils/swap';\nimport { SwapDetailsAlerts } from '../SwapDetailsAlerts';\n\nexport const RESET_INTERVAL = 2_000;\nexport const SECONDS = 60;\n\nexport const getSteps = ({\n swap,\n blockchains,\n swappers,\n ...args\n}: GetStep): Step[] => {\n const hasAlreadyProceededToSign = swap.hasAlreadyProceededToSign !== false;\n return swap.steps.map((step, index) => {\n const amountToConvert =\n index === 0\n ? swap.inputAmount\n : swap.steps[index - 1]?.outputAmount ||\n swap.steps[index - 1]?.expectedOutputAmountHumanReadable;\n return {\n from: {\n token: { displayName: step.fromSymbol, image: step.fromLogo ?? '' },\n chain: {\n displayName:\n getBlockchainShortNameFor(step.fromBlockchain, blockchains) ?? '',\n image: step.fromBlockchainLogo ?? '',\n },\n price: {\n value: numberToString(\n amountToConvert,\n TOKEN_AMOUNT_MIN_DECIMALS,\n TOKEN_AMOUNT_MAX_DECIMALS\n ),\n realValue: amountToConvert ?? '',\n },\n },\n to: {\n token: { displayName: step.toSymbol, image: step.toLogo },\n chain: {\n displayName:\n getBlockchainShortNameFor(step.toBlockchain, blockchains) ?? '',\n image: step.toBlockchainLogo ?? '',\n },\n price: {\n value: numberToString(\n step.outputAmount || step.expectedOutputAmountHumanReadable,\n TOKEN_AMOUNT_MIN_DECIMALS,\n TOKEN_AMOUNT_MAX_DECIMALS\n ),\n realValue:\n step.outputAmount || step.expectedOutputAmountHumanReadable || '',\n },\n },\n swapper: {\n displayName: getSwapperDisplayName(step.swapperId, swappers) ?? '',\n image: step.swapperLogo ?? '',\n type: step.swapperType as SwapperType,\n },\n internalSwaps: step.internalSwaps\n ? step.internalSwaps.map((internalSwap) => {\n return {\n from: {\n chain: {\n displayName:\n getBlockchainShortNameFor(\n internalSwap.fromBlockchain,\n blockchains\n ) ?? '',\n image: internalSwap.fromBlockchainLogo ?? '',\n },\n },\n to: {\n chain: {\n displayName:\n getBlockchainShortNameFor(\n internalSwap.toBlockchain,\n blockchains\n ) ?? '',\n image: internalSwap.toBlockchainLogo ?? '',\n },\n },\n swapper: {\n displayName:\n getSwapperDisplayName(internalSwap.swapperId, swappers) ?? '',\n image: internalSwap.swapperLogo ?? '',\n type: internalSwap.swapperType as SwapperType,\n },\n };\n })\n : [],\n alerts: (\n <SwapDetailsAlerts\n step={step}\n hasAlreadyProceededToSign={hasAlreadyProceededToSign}\n {...args}\n />\n ),\n };\n });\n};\n\nexport function getStepState(step: PendingSwapStep): StepDetailsProps['state'] {\n if (\n isNetworkStatusInWarningState(step) &&\n step.status !== 'failed' &&\n step.status !== 'success'\n ) {\n return 'warning';\n }\n\n switch (step.status) {\n case 'created':\n return 'default';\n case 'approved':\n case 'waitingForApproval':\n case 'running':\n return 'in-progress';\n case 'failed':\n return 'error';\n case 'success':\n return 'completed';\n }\n}\n", "import type { SwapAlertsProps } from './SwapDetailsAlerts.types';\n\nimport { i18n } from '@lingui/core';\nimport { Alert, IconButton, LinkIcon } from '@rango-dev/ui';\nimport React, { Fragment } from 'react';\n\nimport { isNetworkStatusInWarningState } from '../../utils/swap';\n\nimport { FailedAlert } from './SwapDetailsAlerts.Failed';\nimport { Alerts } from './SwapDetailsAlerts.styles';\nimport { WarningAlert } from './SwapDetailsAlerts.Warning';\n\nexport function SwapDetailsAlerts(props: SwapAlertsProps) {\n const {\n switchNetworkIsAvailable,\n handleSwitchNetworkClick,\n showNetworkModal,\n setNetworkModal,\n message,\n step,\n hasAlreadyProceededToSign,\n } = props;\n\n const hasWarning = isNetworkStatusInWarningState(step);\n const waitingForApproval =\n step.status === 'waitingForApproval' && !hasWarning;\n const inProgress = step.status === 'running' && !hasWarning;\n const waitingProgress =\n (inProgress && !hasAlreadyProceededToSign) ||\n (waitingForApproval && !step.explorerUrl?.length);\n\n return (\n <Alerts>\n {step.explorerUrl?.map((explorerUrl, index, urls) => {\n const key = index + explorerUrl.url;\n const lastUrl = index === urls.length - 1;\n const loading =\n ((lastUrl && inProgress) || waitingForApproval) && !waitingProgress;\n const error = lastUrl && step.status === 'failed';\n\n return (\n <Fragment key={key}>\n <Alert\n id=\"widget-swap-details-tx-alert\"\n type={\n lastUrl\n ? (loading && 'loading') || (error && 'error') || 'success'\n : 'success'\n }\n title={\n !explorerUrl.description\n ? i18n.t('View transaction')\n : `${explorerUrl.description} Tx`\n }\n action={\n explorerUrl.url && (\n <IconButton\n id=\"widget-swap-details-tx-link-icon-btn\"\n variant=\"ghost\"\n size=\"xsmall\"\n onClick={() => window.open(explorerUrl.url, '_blank')}>\n <LinkIcon size={12} />\n </IconButton>\n )\n }\n />\n </Fragment>\n );\n })}\n {waitingProgress && (\n <Alert\n id=\"widget-swap-details-loading-alert\"\n type=\"loading\"\n title={message.shortMessage}\n />\n )}\n {step.status !== 'failed' && hasWarning && (\n <WarningAlert\n switchNetworkIsAvailable={switchNetworkIsAvailable}\n handleSwitchNetworkClick={handleSwitchNetworkClick}\n showNetworkModal={showNetworkModal}\n setNetworkModal={setNetworkModal}\n message={message}\n />\n )}\n\n {step.status === 'failed' && <FailedAlert message={message} />}\n </Alerts>\n );\n}\n", "import type { FailedAlertsProps } from './SwapDetailsAlerts.types';\n\nimport { Alert, ChevronDownIcon, IconButton } from '@rango-dev/ui';\nimport React, { useState } from 'react';\n\nimport { MessageText } from '../SwapDetails/SwapDetails.styles';\n\nimport { ActionIcon, AlertFooter } from './SwapDetailsAlerts.styles';\n\nexport function FailedAlert(props: FailedAlertsProps) {\n const { message } = props;\n const [showContentError, setShowContentError] = useState(false);\n\n return (\n <Alert\n id=\"widget-failed-swap-details-alert\"\n type=\"error\"\n title={message.shortMessage}\n containerStyles={{\n '& .footer': {\n paddingTop: '$0',\n },\n }}\n action={\n message.detailedMessage.content && (\n <IconButton\n id=\"widget-swap-details-failed-btn\"\n onClick={() => setShowContentError((prev) => !prev)}\n variant=\"ghost\"\n size=\"xsmall\">\n <ActionIcon rotated={showContentError}>\n <ChevronDownIcon size={12} color=\"gray\" />\n </ActionIcon>\n </IconButton>\n )\n }\n footer={\n <AlertFooter open={showContentError}>\n <MessageText variant=\"body\" size=\"xsmall\" color=\"neutral700\">\n {message.detailedMessage.content}\n </MessageText>\n </AlertFooter>\n }\n />\n );\n}\n", "import { css, darkTheme, styled, Typography } from '@rango-dev/ui';\n\nimport { PageContainer } from '../Layout';\n\nexport const Container = styled(PageContainer, {\n overflowY: 'auto',\n\n '& ._icon-button': {\n '&:hover': {\n '& svg': {\n color: '$secondary550',\n [`.${darkTheme} &`]: {\n color: '$secondary500',\n },\n },\n },\n },\n});\n\nexport const SkeletonContainer = styled('div', {\n display: 'flex',\n flexDirection: 'column',\n flexGrow: 1,\n overflow: 'hidden',\n});\n\nexport const RequestIdContainer = styled('div', {\n position: 'sticky',\n top: 0,\n zIndex: 10,\n backgroundColor: '$background',\n});\n\nexport const StepsList = styled('div', {\n padding: '$0 $20 $20 $20',\n});\n\nexport const Alerts = styled('div', {\n display: 'flex',\n flexDirection: 'column',\n gap: '$10',\n});\n\nexport const PlaceholderContainer = styled('div', {\n height: '450px',\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n});\n\nexport const LoaderContainer = styled('div', {\n display: 'flex',\n justifyContent: 'center',\n width: '100%',\n paddingTop: '33%',\n flex: 1,\n});\n\nexport const rowStyles = css({\n display: 'flex',\n width: '100%',\n justifyContent: 'space-between',\n alignItems: 'center',\n padding: '$10 $20',\n borderBottom: '1px solid',\n $$color: '$colors$neutral300',\n [`.${darkTheme} &`]: {\n $$color: '$colors$neutral400',\n },\n borderColor: '$$color',\n color: '$neutral500',\n});\n\nexport const datePlaceholderStyles = css({\n padding: '$5 0',\n});\n\nexport const requestIdStyles = css({\n display: 'flex',\n justifyContent: 'center',\n alignItems: 'center',\n height: '$24',\n});\n\nexport const outputStyles = css({\n display: 'flex',\n width: '100%',\n padding: '$15 $20 $20',\n flexDirection: 'column',\n alignItems: 'start',\n});\n\nexport const titleStepsStyles = css({\n width: '100%',\n padding: '0 $20 $10',\n});\n\nexport const StyledLink = styled('a', {\n fontSize: '$16',\n fontWeight: '$400',\n color: '$neutral700',\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n});\n\nexport const ErrorMessages = styled('div', {\n display: 'flex',\n flexDirection: 'column',\n gap: '$5',\n});\n\nexport const MessageText = styled(Typography, {\n wordBreak: 'break-word',\n});\n", "import { styled } from '@rango-dev/ui';\n\nexport const Alerts = styled('div', {\n display: 'flex',\n flexDirection: 'column',\n gap: '$10',\n});\n\nexport const ActionIcon = styled('div', {\n transition: 'transform 0.3s ease-in-out',\n variants: {\n rotated: {\n true: {\n transform: 'rotate(180deg)',\n },\n },\n },\n});\n\nexport const AlertFooter = styled('div', {\n transition: 'max-height 0.3s ease-in-out',\n maxHeight: '0px',\n overflow: 'hidden',\n variants: {\n open: {\n true: {\n maxHeight: '200px',\n },\n },\n },\n});\n", "import type { WaningAlertsProps } from './SwapDetailsAlerts.types';\n\nimport { i18n } from '@lingui/core';\nimport { Alert, Button } from '@rango-dev/ui';\nimport { PendingSwapNetworkStatus } from 'rango-types';\nimport React from 'react';\n\nexport function WarningAlert(props: WaningAlertsProps) {\n const {\n switchNetworkIsAvailable,\n handleSwitchNetworkClick,\n setNetworkModal,\n message,\n showNetworkModal,\n } = props;\n if (!!switchNetworkIsAvailable) {\n return (\n <Alert\n type=\"warning\"\n id=\"widget-swap-details-change-network-alert\"\n title={message.shortMessage}\n action={\n <Button\n id=\"widget-swap-details-warning-alert-change-network-btn\"\n size=\"xxsmall\"\n type=\"warning\"\n onClick={() => {\n setNetworkModal('switchNetwork');\n handleSwitchNetworkClick();\n }}>\n {i18n.t('Change')}\n </Button>\n }\n />\n );\n }\n if (\n showNetworkModal === PendingSwapNetworkStatus.WaitingForConnectingWallet\n ) {\n return (\n <Alert\n type=\"warning\"\n title={message.shortMessage}\n id=\"widget-swap-details-warning-alert-connect-wallet-alert\"\n action={\n <Button\n id=\"widget-swap-details-warning-alert-connect-wallet-btn\"\n size=\"xxsmall\"\n type=\"warning\"\n onClick={() => {\n setNetworkModal('connectWallet');\n }}>\n {i18n.t('Connect')}\n </Button>\n }\n />\n );\n }\n\n return (\n <Alert\n id=\"widget-swap-details-short-alert\"\n type=\"warning\"\n title={message.shortMessage}\n />\n );\n}\n", "import type { SwapDateRowProps } from './SwapDetails.types';\n\nimport { i18n } from '@lingui/core';\nimport { Typography } from '@rango-dev/ui';\nimport React from 'react';\n\nimport { rowStyles } from './SwapDetails.styles';\n\nexport function SwapDateRow(props: SwapDateRowProps) {\n const { date, isFinished } = props;\n return (\n <div className={rowStyles()}>\n <Typography variant=\"label\" size=\"large\" color=\"neutral700\">\n {isFinished ? i18n.t('Finished at') : i18n.t('Created at')}\n </Typography>\n <Typography variant=\"label\" size=\"small\" color=\"neutral700\">\n {date}\n </Typography>\n </div>\n );\n}\n", "import type { SwapDetailsPlaceholderPropTypes } from './SwapDetails.types';\n\nimport { i18n } from '@lingui/core';\nimport { Divider, NotFound, Skeleton, Typography } from '@rango-dev/ui';\nimport React from 'react';\n\nimport { SuffixContainer } from '../HeaderButtons/HeaderButtons.styles';\nimport { Layout } from '../Layout';\nimport { LoadingSwapDetails } from '../LoadingSwapDetails';\n\nimport {\n datePlaceholderStyles,\n PlaceholderContainer,\n requestIdStyles,\n rowStyles,\n SkeletonContainer,\n} from './SwapDetails.styles';\n\nexport function SwapDetailsPlaceholder(props: SwapDetailsPlaceholderPropTypes) {\n const { requestId, showSkeleton } = props;\n return (\n <Layout\n header={{\n title: i18n.t('Swap Details'),\n suffix: <SuffixContainer />,\n }}>\n {showSkeleton && (\n <SkeletonContainer>\n <div className={rowStyles()}>\n <Typography variant=\"label\" size=\"large\" color=\"neutral700\">\n {`${i18n.t('Request ID')}`}\n </Typography>\n <div className={requestIdStyles()}>\n <Typography variant=\"label\" size=\"small\" color=\"neutral700\">\n <Skeleton width={60} height={10} variant=\"rounded\" />\n </Typography>\n <Divider direction=\"horizontal\" size={4} />\n <Skeleton width={16} height={16} variant=\"rectangular\" />\n <Divider direction=\"horizontal\" size={4} />\n <Skeleton width={16} height={16} variant=\"rectangular\" />\n </div>\n </div>\n <div className={rowStyles()}>\n <Typography\n className={datePlaceholderStyles()}\n variant=\"label\"\n size=\"large\"\n color=\"neutral700\">\n <Skeleton width={60} height={10} variant=\"rounded\" />\n </Typography>\n <Typography variant=\"label\" size=\"small\" color=\"neutral700\">\n <Skeleton width={60} height={10} variant=\"rounded\" />\n </Typography>\n </div>\n <LoadingSwapDetails />\n </SkeletonContainer>\n )}\n {!showSkeleton && (\n <PlaceholderContainer>\n <NotFound\n title={i18n.t('Not found')}\n description={i18n.t({\n id: 'Swap with request ID = {requestId} not found.',\n values: { requestId },\n })}\n />\n </PlaceholderContainer>\n )}\n </Layout>\n );\n}\n", "import { i18n } from '@lingui/core';\nimport { Divider, Skeleton, Typography } from '@rango-dev/ui';\nimport React from 'react';\n\nimport { QuoteSummarySkeleton, StepSkeleton } from '../QuoteSkeleton';\n\nimport {\n Container,\n extraInfoStyles,\n StepContainer,\n StepSeparator,\n} from './LoadingSwapDetails.styles';\n\nexport function LoadingSwapDetails() {\n return (\n <Container>\n <QuoteSummarySkeleton type=\"swap-preview\" />\n <div className=\"swaps-steps\">\n <Typography variant=\"title\" size=\"small\">\n {i18n.t('Swaps steps')}\n </Typography>\n </div>\n\n <>\n <StepContainer>\n <StepSkeleton separator={false} />\n <div className={extraInfoStyles()}>\n <Divider direction=\"horizontal\" size={20} />\n <Skeleton height={22} variant=\"rectangular\" />\n </div>\n </StepContainer>\n <StepSeparator />\n <StepContainer>\n <StepSkeleton separator={false} />\n </StepContainer>\n <StepSeparator />\n <StepContainer>\n <StepSkeleton separator={false} />\n </StepContainer>\n <StepSeparator />\n <StepContainer>\n <StepSkeleton separator={false} />\n </StepContainer>\n </>\n </Container>\n );\n}\n", "import { css, styled } from '@rango-dev/ui';\n\nexport const Container = styled('div', {\n width: '100%',\n height: '100%',\n padding: '$10 $20',\n});\n\nexport const StepContainer = styled('div', {\n backgroundColor: '$neutral100',\n borderRadius: '$xm',\n padding: '$10 $15',\n});\n\nexport const StepSeparator = styled('div', {\n width: '0px',\n height: '$20',\n borderLeft: '1px dashed $neutral700',\n marginLeft: '25px',\n});\n\nexport const quoteSummaryItemStyles = css({\n display: 'flex',\n justifyContent: 'space-between',\n alignItems: 'center',\n});\n\nexport const costStyles = css({\n paddingTop: '$15',\n display: 'flex',\n});\n\nexport const quoteSummaryStyles = css({\n padding: '$15 $0',\n});\n\nexport const quoteSummarySeparatorStyles = css({\n width: '0px',\n height: '$16',\n borderLeft: '1px solid $neutral400',\n marginLeft: '13px',\n});\n\nexport const swapsStepsStyles = css({\n paddingBottom: '$10',\n});\n\nexport const stepTitleStyles = css({\n display: 'flex',\n justifyContent: 'start',\n alignItems: 'center',\n});\n\nexport const stepTokensStyles = css({\n paddingTop: '$5',\n display: 'flex',\n alignItems: 'center',\n});\n\nexport const stepInfoStyles = css({\n display: 'flex',\n alignItems: 'center',\n});\n\nexport const stepIconStyles = css({\n padding: '$4 $6',\n display: 'flex',\n justifyContent: 'center',\n alignItems: 'center',\n});\n\nexport const extraInfoStyles = css({\n display: 'flex',\n paddingTop: '$10',\n paddingBottom: '$5',\n});\n", "import type { WalletInfoWithExtra } from '../types';\n\nimport { i18n } from '@lingui/core';\nimport {\n Divider,\n getCategoriesCount,\n SelectableCategoryList,\n styled,\n Typography,\n Wallet,\n} from '@rango-dev/ui';\nimport React, { useState } from 'react';\n\nimport { Layout, PageContainer } from '../components/Layout';\nimport { StatefulConnectModal } from '../components/StatefulConnectModal';\nimport { useWalletList } from '../hooks/useWalletList';\nimport { useAppStore } from '../store/AppStore';\nimport { useUiStore } from '../store/ui';\nimport { getContainer, isSingleWalletActive } from '../utils/common';\nimport {\n filterBlockchainsByWalletTypes,\n filterWalletsByCategory,\n} from '../utils/wallets';\n\nconst ListContainer = styled('div', {\n display: 'flex',\n justifyContent: 'center',\n alignItems: 'center',\n columnGap: '$5',\n rowGap: '$10',\n flexWrap: 'wrap',\n paddingTop: '$5',\n});\n\nconst Container = styled(PageContainer, {\n textAlign: 'center',\n});\n\nexport function WalletsPage() {\n const { fetchStatus: fetchMetaStatus } = useAppStore();\n const [blockchainCategory, setBlockchainCategory] = useState<string>('ALL');\n const blockchains = useAppStore().blockchains();\n const { config } = useAppStore();\n const [selectedWalletToConnect, setSelectedWalletToConnect] =\n useState<WalletInfoWithExtra>();\n const isActiveTab = useUiStore.use.isActiveTab();\n\n const { list } = useWalletList();\n\n const filteredBlockchains = filterBlockchainsByWalletTypes(list, blockchains);\n const activeCategoriesCount = getCategoriesCount(filteredBlockchains);\n const showCategory = activeCategoriesCount !== 1;\n\n const filteredWallets = filterWalletsByCategory(list, blockchainCategory);\n\n const handleWalletItemClick = (wallet: WalletInfoWithExtra) => {\n if (isSingleWalletActive(list, config.multiWallets)) {\n return;\n }\n\n setSelectedWalletToConnect(wallet);\n };\n\n return (\n <Layout\n header={{\n title: i18n.t('Connect Wallets'),\n }}>\n <Container>\n {showCategory && (\n <>\n <SelectableCategoryList\n setCategory={setBlockchainCategory}\n category={blockchainCategory}\n blockchains={filteredBlockchains}\n isLoading={fetchMetaStatus === 'loading'}\n />\n <Divider size={24} />\n </>\n )}\n <Typography variant=\"title\" size=\"xmedium\" align=\"center\">\n {i18n.t('Choose a wallet to connect.')}\n </Typography>\n <ListContainer>\n {filteredWallets.map((wallet, index) => {\n const key = `wallet-${index}-${wallet.type}`;\n return (\n <Wallet\n key={key}\n {...wallet}\n state={wallet.state}\n container={getContainer()}\n onClick={() => handleWalletItemClick(wallet)}\n isLoading={fetchMetaStatus === 'loading'}\n disabled={!isActiveTab}\n />\n );\n })}\n <StatefulConnectModal\n id=\"widget-state-full-connect-modal\"\n wallet={selectedWalletToConnect}\n onClose={() => {\n setSelectedWalletToConnect(undefined);\n }}\n />\n </ListContainer>\n </Container>\n </Layout>\n );\n}\n", "import type { WalletType } from '../..';\nimport type { LastConnectedWallet } from '@rango-dev/queue-manager-rango-preset';\n\nimport { useQueueManager } from '@rango-dev/queue-manager-rango-preset';\nimport { isEvmBlockchain } from 'rango-sdk';\nimport { useContext, useEffect, useState } from 'react';\n\nimport { useWallets } from '../..';\nimport { WidgetContext } from '../../containers/Wallets';\nimport { globalFont } from '../../globalStyles';\nimport { useAppStore } from '../../store/AppStore';\nimport { useNotificationStore } from '../../store/notification';\nimport {\n unsubscribeRefuelQuoteStore,\n unsubscribeSwapQuoteStore,\n} from '../../store/quote';\nimport { tabManager } from '../../store/ui';\nimport { useForceAutoConnect } from '../useForceAutoConnect';\nimport { useSubscribeToWidgetEvents } from '../useSubscribeToWidgetEvents';\nimport { useSyncNotifications } from '../useSyncNotifications';\n\nexport function useBootstrap() {\n useForceAutoConnect();\n globalFont();\n useSubscribeToWidgetEvents();\n useSyncNotifications();\n const blockchains = useAppStore().blockchains();\n const { canSwitchNetworkTo } = useWallets();\n const [lastConnectedWallet, setLastConnectedWallet] =\n useState<LastConnectedWallet | null>(null);\n const [disconnectedWallet, setDisconnectedWallet] = useState<WalletType>();\n const widgetContext = useContext(WidgetContext);\n\n const evmChains = blockchains.filter(isEvmBlockchain);\n\n // Unsubscribe QuoteStore listeners\n useEffect(() => () => unsubscribeSwapQuoteStore(), []);\n useEffect(() => () => unsubscribeRefuelQuoteStore(), []);\n\n // At the moment, we only detect the disconnection of EVM wallets.\n useQueueManager({\n lastConnectedWallet,\n clearDisconnectedWallet: () => {\n setDisconnectedWallet(undefined);\n },\n disconnectedWallet: disconnectedWallet,\n evmChains,\n canSwitchNetworkTo,\n });\n\n useEffect(() => {\n tabManager.init();\n\n if (!useNotificationStore.persist.hasHydrated()) {\n void useNotificationStore.persist.rehydrate();\n }\n\n /**\n * Add handlers to the widget context for connecting and disconnecting wallets.\n * We pass these handlers to the wallet provider to keep track of the last connected and last disconnected wallets.\n * The 'queue-manager' uses these details to spot any changes in the connection status of the required wallet during the swap process.\n *\n * with this approch anyone who use the widget context can override these handlers and causes some bugs happens.\n * it the future we should add a safer soloution like considering array of handlers .\n * https://github.com/rango-exchange/rango-client/pull/630/files#r1518846728\n */\n widgetContext.onConnectWallet((walletFromEvent) => {\n /*\n * If no wallet was previously connected or the wallet type has changed,\n * replace the last connected wallet with the new one from the event.\n * Otherwise, merge updated `network` and `accounts` information from the new wallet\n * into the existing last connected wallet without replacing the entire object.\n */\n setLastConnectedWallet((lastConnectedWallet) => {\n if (\n !lastConnectedWallet ||\n lastConnectedWallet.walletType !== walletFromEvent.walletType\n ) {\n return walletFromEvent;\n }\n const lastConnectedWalletClone = { ...lastConnectedWallet };\n if (walletFromEvent.network) {\n lastConnectedWalletClone.network = walletFromEvent.network;\n }\n if (walletFromEvent.accounts) {\n lastConnectedWalletClone.accounts = walletFromEvent.accounts;\n }\n return lastConnectedWalletClone;\n });\n });\n widgetContext.onDisconnectWallet((walletType) => {\n setDisconnectedWallet(walletType);\n setLastConnectedWallet((lastConnectedWallet) =>\n walletType === lastConnectedWallet?.walletType\n ? null\n : lastConnectedWallet\n );\n });\n\n return tabManager.destroy;\n }, []);\n}\n", "import type {\n OnWalletConnectHandler,\n OnWalletDisconnectHandler,\n PropTypes,\n WidgetContextInterface,\n} from './Wallets.types';\nimport type { ProvidersOptions } from '../../utils/providers';\nimport type { LegacyEventHandler } from '@rango-dev/wallets-core/legacy';\nimport type { PropsWithChildren } from 'react';\n\nimport { Provider } from '@rango-dev/wallets-react';\nimport React, { createContext, useEffect, useMemo, useRef } from 'react';\n\nimport { useWalletProviders } from '../../hooks/useWalletProviders';\nimport { AppStoreProvider, useAppStore } from '../../store/AppStore';\nimport { useUiStore } from '../../store/ui';\n\nimport { useUpdates } from './useUpdates';\nimport { propagateEvents } from './Wallets.helpers';\n\nexport const WidgetContext = createContext<WidgetContextInterface>({\n onConnectWallet: () => {\n return;\n },\n onDisconnectWallet: () => {\n return;\n },\n});\n\nfunction Main(props: PropsWithChildren<PropTypes>) {\n const {\n updateConfig,\n updateSettings,\n fetch: fetchMeta,\n fetchStatus,\n } = useAppStore();\n const blockchains = useAppStore().blockchains();\n const config = useAppStore().config;\n\n const walletOptions: ProvidersOptions = {\n walletConnectProjectId: config?.walletConnectProjectId,\n trezorManifest: config?.trezorManifest,\n tonConnect: config.tonConnect,\n walletConnectListedDesktopWalletLink:\n props.config.__UNSTABLE_OR_INTERNAL__\n ?.walletConnectListedDesktopWalletLink,\n };\n const { providers } = useWalletProviders(config.wallets, walletOptions);\n const onConnectWalletHandler = useRef<OnWalletConnectHandler>();\n const onDisconnectWalletHandler = useRef<OnWalletDisconnectHandler>();\n const { handler: handleEvent } = useUpdates({\n onConnectWalletHandler,\n onDisconnectWalletHandler,\n });\n\n useEffect(() => {\n void fetchMeta().catch(console.log);\n }, []);\n\n useEffect(() => {\n if (props.config) {\n updateConfig(props.config);\n updateSettings(props.config);\n window['__rango'] = {\n config,\n dappConfig: props.config,\n };\n }\n }, [props.config, fetchStatus]);\n\n const isActiveTab = useUiStore.use.isActiveTab();\n\n const handlers = useMemo(\n () => ({\n onConnectWallet: (handler: OnWalletConnectHandler) => {\n onConnectWalletHandler.current = handler;\n },\n onDisconnectWallet: (handler: OnWalletDisconnectHandler) => {\n onDisconnectWalletHandler.current = handler;\n },\n }),\n []\n );\n\n return (\n <WidgetContext.Provider value={handlers}>\n <Provider\n allBlockChains={blockchains}\n providers={providers}\n onUpdateState={(type, event, value, state, info) => {\n const eventParams: Parameters<LegacyEventHandler> = [\n type,\n event,\n value,\n state,\n info,\n ];\n handleEvent(...eventParams);\n\n if (props.onUpdateState) {\n propagateEvents(props.onUpdateState, eventParams);\n }\n }}\n autoConnect={!!isActiveTab}\n configs={{\n wallets: config.wallets,\n }}>\n {props.children}\n </Provider>\n </WidgetContext.Provider>\n );\n}\n\nexport function WidgetWallets(props: PropsWithChildren<PropTypes>) {\n const { config, ...otherProps } = props;\n return (\n <AppStoreProvider config={config}>\n <Main {...otherProps} config={config} />\n </AppStoreProvider>\n );\n}\n", "import type { WidgetConfig } from '../../types';\nimport type { ProvidersOptions } from '../../utils/providers';\n\nimport { useEffect } from 'react';\n\nimport { useAppStore } from '../../store/AppStore';\n\nimport { hashProviders } from './useWalletProviders.helpers';\n\nexport function useWalletProviders(\n configWallets: WidgetConfig['wallets'],\n options?: ProvidersOptions\n) {\n const { clearConnectedWallet, getAvailableProviders, buildAndSetProviders } =\n useAppStore();\n const providers = getAvailableProviders();\n\n useEffect(() => {\n clearConnectedWallet();\n buildAndSetProviders();\n }, [\n hashProviders(configWallets ?? []),\n options?.walletConnectProjectId,\n options?.walletConnectListedDesktopWalletLink,\n ]);\n\n return {\n providers,\n };\n}\n", "import type { ProviderInterface } from '@rango-dev/wallets-react';\n\nimport { Provider } from '@rango-dev/wallets-core';\n\nexport function hashProviders(\n providers: (string | ProviderInterface | Provider)[]\n): string {\n return providers\n .map((provider) => {\n if (typeof provider === 'string') {\n return provider;\n }\n if (provider instanceof Provider) {\n return provider.id;\n }\n return provider.config.type;\n })\n .join('-');\n}\n", "import type {\n OnWalletConnectHandler,\n OnWalletDisconnectHandler,\n} from './Wallets.types';\nimport type { LastConnectedWallet } from '@rango-dev/queue-manager-rango-preset';\nimport type {\n LegacyEventHandler as EventHandler,\n LegacyEventHandler,\n} from '@rango-dev/wallets-core/legacy';\n\nimport {\n legacyFormatAddressWithNetwork as formatAddressWithNetwork,\n legacyReadAccountAddress as readAccountAddress,\n} from '@rango-dev/wallets-core/legacy';\nimport { Events } from '@rango-dev/wallets-react';\nimport { type Network } from '@rango-dev/wallets-shared';\nimport { isEvmBlockchain } from 'rango-sdk';\n\nimport { useAppStore } from '../../store/AppStore';\nimport {\n prepareAccountsForWalletStore,\n walletAndSupportedChainsNames,\n} from '../../utils/wallets';\n\ninterface UseUpdatesParams {\n onConnectWalletHandler: React.MutableRefObject<\n OnWalletConnectHandler | undefined\n >;\n onDisconnectWalletHandler: React.MutableRefObject<\n OnWalletDisconnectHandler | undefined\n >;\n}\ninterface UseUpdates {\n handler: EventHandler;\n}\n\nexport function useUpdates(params: UseUpdatesParams): UseUpdates {\n const {\n newWalletConnected,\n disconnectWallet,\n disconnectNamespaces,\n connectedWallets,\n removeBalancesForWallet,\n blockchains,\n } = useAppStore();\n\n const { onConnectWalletHandler, onDisconnectWalletHandler } = params;\n const evmBasedChainNames = blockchains()\n .filter(isEvmBlockchain)\n .map((chain) => chain.name);\n\n const onAccountsEvent = (\n event: Parameters<LegacyEventHandler>,\n params: {\n supportedChainNames: Network[] | null;\n }\n ) => {\n const [type, , value, state, info] = event;\n\n const walletFromEvent: LastConnectedWallet = {\n walletType: type,\n network: state.network ?? undefined,\n accounts: value,\n };\n if (!!onConnectWalletHandler.current) {\n onConnectWalletHandler.current(walletFromEvent);\n } else {\n console.warn(`onConnectWallet handler hasn't been set. Are you sure?`);\n }\n\n const data = prepareAccountsForWalletStore(\n type,\n value,\n evmBasedChainNames,\n params.supportedChainNames,\n info.isContractWallet\n );\n\n if (data.length) {\n void newWalletConnected(data, info.namespace, state.derivationPath);\n }\n };\n\n const handleUpdatesForHub: EventHandler = (\n type,\n event,\n value,\n state,\n info\n ) => {\n if (event === Events.ACCOUNTS) {\n const supportedChainNames: Network[] | null =\n walletAndSupportedChainsNames(info.supportedBlockchains);\n\n // After cleaning up balances, it's time to add new accounts.\n if (value) {\n onAccountsEvent([type, event, value, state, info], {\n supportedChainNames,\n });\n }\n }\n\n if (event === Events.PROVIDER_DISCONNECTED) {\n disconnectWallet(type);\n if (!!onDisconnectWalletHandler.current) {\n onDisconnectWalletHandler.current(type);\n } else {\n console.warn(\n `onDisconnectWallet handler hasn't been set. Are you sure?`\n );\n }\n }\n\n if (event === Events.NAMESPACE_DISCONNECTED) {\n disconnectNamespaces(type, value);\n }\n };\n\n const handleUpdatesForLegacy: EventHandler = (\n type,\n event,\n value,\n state,\n info\n ) => {\n if (event === Events.ACCOUNTS) {\n const supportedChainNames: Network[] | null =\n walletAndSupportedChainsNames(info.supportedBlockchains);\n\n /*\n * When a wallet is connecting to an evm account, we will consider it as the account exists on other evm-compatible blockchains\n * To get their balances.\n *\n * The logic here is for handling switching account functionality in wallets. when a wallet is switching to another account\n * we need to clean the balances for old accounts.\n *\n * Note: hub will do the cleanup on namespace diconnected event.\n */\n const evmAccounts: string[] = [];\n const nonEvmAccounts: string[] = [];\n\n value?.forEach((account: string) => {\n const { network } = readAccountAddress(account);\n if (evmBasedChainNames.includes(network)) {\n evmAccounts.push(account);\n } else {\n nonEvmAccounts.push(account);\n }\n });\n\n const previousAccounts = connectedWallets\n .filter((wallet) => wallet.walletType === type)\n .map((wallet) =>\n formatAddressWithNetwork(wallet.address, wallet.chain)\n );\n\n if (previousAccounts.length > 0) {\n if (evmAccounts.length > 0) {\n // We use same logic for removing as we use for adding.\n const data = prepareAccountsForWalletStore(\n type,\n evmAccounts,\n evmBasedChainNames,\n supportedChainNames,\n info.isContractWallet\n );\n\n removeBalancesForWallet(type, {\n chains: data.map((account) => account.chain),\n });\n }\n\n if (nonEvmAccounts.length > 0) {\n removeBalancesForWallet(type, {\n chains: nonEvmAccounts.map((account) => {\n const { network } = readAccountAddress(account);\n return network;\n }),\n });\n }\n }\n\n // After cleaning up balances, it's time to add new accounts.\n if (value) {\n onAccountsEvent([type, event, value, state, info], {\n supportedChainNames,\n });\n } else {\n disconnectWallet(type);\n if (!!onDisconnectWalletHandler.current) {\n onDisconnectWalletHandler.current(type);\n } else {\n console.warn(\n `onDisconnectWallet handler hasn't been set. Are you sure?`\n );\n }\n }\n }\n };\n\n const handleUpdatesForBoth: EventHandler = (\n type,\n event,\n value,\n state,\n _info\n ) => {\n if (event === Events.CONNECTED && value) {\n const walletFromEvent: LastConnectedWallet = {\n walletType: type,\n network: state.network ?? undefined,\n accounts: state.accounts ?? undefined,\n };\n if (!!onConnectWalletHandler.current) {\n onConnectWalletHandler.current(walletFromEvent);\n } else {\n console.warn(`onConnectWallet handler hasn't been set. Are you sure?`);\n }\n }\n\n if (event === Events.NETWORK && value) {\n const walletFromEvent: LastConnectedWallet = {\n walletType: type,\n network: value,\n accounts: state.accounts ?? undefined,\n };\n if (!!onConnectWalletHandler.current) {\n onConnectWalletHandler.current(walletFromEvent);\n } else {\n console.warn(`onConnectWallet handler hasn't been set. Are you sure?`);\n }\n }\n };\n\n const handler: EventHandler = (type, event, value, state, info) => {\n if (info.isHub) {\n handleUpdatesForHub(type, event, value, state, info);\n } else {\n handleUpdatesForLegacy(type, event, value, state, info);\n }\n\n handleUpdatesForBoth(type, event, value, state, info);\n };\n\n return {\n handler,\n };\n}\n", "import type { OnUpdateState } from './Wallets.types';\nimport type { LegacyEventHandler } from '@rango-dev/wallets-core/legacy';\n\nimport { LegacyEvents } from '@rango-dev/wallets-core/legacy';\n\n/*\n * propagate updates for Dapps using external wallets\n *\n * Note: to take more control over the public interface and wallets-core interface (which may be changed) we use this layer\n */\nexport function propagateEvents(\n cb: OnUpdateState,\n eventParams: Parameters<LegacyEventHandler>\n): void {\n const [walletType, event, value, coreState, info] = eventParams;\n\n /*\n * PROVIDER_DISCONNECTED has conflict with WalletEventTypes.DISCONNECT since they are doing samething, the first one is using only for Hub, the second one is what we exposed to the lib users.\n * so for backward-compat we need to keep the behavior of WalletEventTypes.DISCONNECT\n */\n if (event === LegacyEvents.PROVIDER_DISCONNECTED) {\n return;\n }\n\n cb(walletType, event, value, coreState, info);\n}\n", "import { globalCss } from '@rango-dev/ui';\n\nexport const globalFont = () =>\n globalCss({\n '@import':\n \"url('https://fonts.googleapis.com/css2?family=Roboto:ital,wght@0,100;0,300;0,400;0,500;0,700;0,900;1,100;1,300;1,400;1,500;1,700;1,900&display=swap')\",\n })();\n", "import { useWallets } from '@rango-dev/wallets-react';\nimport { useEffect, useRef } from 'react';\n\nimport { SearchParams } from '../constants/searchParams';\nimport { useAppStore } from '../store/AppStore';\n\nexport function useForceAutoConnect(): void {\n const { connect, state } = useWallets();\n const initiated = useRef<{ [key: string]: boolean }>({});\n const { fetchStatus } = useAppStore();\n const walletType =\n new URLSearchParams(location.search).get(SearchParams.AUTO_CONNECT) || '';\n const walletState = state(walletType);\n\n useEffect(() => {\n const shouldTryConnect =\n fetchStatus === 'success' &&\n walletType &&\n walletState.installed &&\n !walletState.connecting &&\n !walletState.connected;\n if (shouldTryConnect && !initiated.current[walletType]) {\n initiated.current[walletType] = true;\n void connect(walletType);\n }\n }, [walletState, fetchStatus]);\n}\n", "import type { ConnectedWallet, RouteEventData, StepEventData } from '../..';\nimport type { Asset } from 'rango-types';\n\nimport {\n isApprovalTX,\n RouteEventType,\n StepEventType,\n StepExecutionEventStatus,\n WidgetEvents,\n} from '@rango-dev/queue-manager-rango-preset';\nimport { useEffect } from 'react';\n\nimport { eventEmitter } from '../../services/eventEmitter';\nimport { useAppStore } from '../../store/AppStore';\nimport { useNotificationStore } from '../../store/notification';\n\nexport function useSubscribeToWidgetEvents() {\n const setNotification = useNotificationStore.use.setNotification();\n const {\n connectedWallets,\n fetchBalances,\n customTokens: getCustomTokens,\n } = useAppStore();\n\n useEffect(() => {\n const handleStepEvent = (widgetEvent: StepEventData) => {\n const { event, step, route } = widgetEvent;\n\n /**\n * Determine if we should refetch balances:\n * - When a transaction is sent (TX_SENT) and it's not an approval transaction.\n * - When a step succeeds.\n */\n const shouldRefetchBalance =\n (event.type === StepEventType.TX_EXECUTION &&\n event.status === StepExecutionEventStatus.TX_SENT &&\n !isApprovalTX(step)) ||\n event.type === StepEventType.SUCCEEDED;\n\n if (shouldRefetchBalance) {\n const fetchBalanceAccounts: ConnectedWallet[] = [];\n\n /**\n * Identify the wallet corresponding to the `from` blockchain and match it with a connected wallet.\n * If found, add it to the balance fetch list.\n */\n const fromWallet = route.wallets[step?.fromBlockchain];\n if (fromWallet) {\n const fromAccount = connectedWallets.find(\n (connectedWallet) =>\n connectedWallet.address?.toLocaleLowerCase() ===\n fromWallet.address?.toLocaleLowerCase() &&\n connectedWallet.walletType === fromWallet.walletType &&\n connectedWallet.chain === step?.fromBlockchain\n );\n if (fromAccount) {\n fetchBalanceAccounts.push(fromAccount);\n }\n }\n\n /**\n * If the transaction is cross-chain (`fromBlockchain !== toBlockchain`),\n * find and add the `to` blockchain wallet to the balance fetch list.\n */\n if (step?.fromBlockchain !== step?.toBlockchain) {\n const toWallet = route.wallets[step?.toBlockchain];\n if (toWallet) {\n const toAccount = connectedWallets.find(\n (connectedWallet) =>\n connectedWallet.address?.toLocaleLowerCase() ===\n toWallet.address?.toLocaleLowerCase() &&\n connectedWallet.walletType === toWallet.walletType &&\n connectedWallet.chain === step?.toBlockchain\n );\n if (toAccount) {\n fetchBalanceAccounts.push(toAccount);\n }\n }\n }\n\n if (fetchBalanceAccounts.length > 0) {\n const customTokens = getCustomTokens();\n const stepAssets: Asset[] = [\n {\n blockchain: step.fromBlockchain,\n address: step.fromSymbolAddress,\n symbol: step.fromSymbol,\n },\n {\n blockchain: step.toBlockchain,\n address: step.toSymbolAddress,\n symbol: step.toSymbol,\n },\n ];\n const selectedCustomTokens = stepAssets.filter((asset) =>\n customTokens.some(\n (token) =>\n token.blockchain === asset.blockchain &&\n token.address?.toLocaleLowerCase() ===\n asset.address?.toLocaleLowerCase() &&\n token.symbol?.toLocaleLowerCase() ===\n asset.symbol?.toLocaleLowerCase()\n )\n );\n\n void fetchBalances(fetchBalanceAccounts, {\n selectedCustomTokens,\n shouldFetchCustomTokens: selectedCustomTokens.length > 0,\n });\n }\n }\n\n setNotification(event, route);\n };\n eventEmitter.on(WidgetEvents.StepEvent, handleStepEvent);\n return () => eventEmitter.off(WidgetEvents.StepEvent, handleStepEvent);\n }, [eventEmitter, connectedWallets]);\n\n useEffect(() => {\n const handleRouteEvent = (widgetEvent: RouteEventData) => {\n const { event, route } = widgetEvent;\n\n if (\n event.type === RouteEventType.FAILED ||\n event.type === RouteEventType.SUCCEEDED\n ) {\n setNotification(event, route);\n }\n };\n eventEmitter.on(WidgetEvents.RouteEvent, handleRouteEvent);\n\n return () => eventEmitter.off(WidgetEvents.RouteEvent, handleRouteEvent);\n }, [eventEmitter]);\n}\n", "import { useManager } from '@rango-dev/queue-manager-react';\nimport { useEffect } from 'react';\n\nimport { useNotificationStore } from '../../store/notification';\nimport { getPendingSwaps } from '../../utils/queue';\n\nexport function useSyncNotifications() {\n const { isSynced, syncNotifications } = useNotificationStore();\n const { manager, state } = useManager();\n\n useEffect(() => {\n const shouldSyncNotifications =\n useNotificationStore.persist.hasHydrated() &&\n state.loadedFromPersistor &&\n !isSynced;\n\n if (shouldSyncNotifications) {\n syncNotifications(getPendingSwaps(manager));\n }\n }, [\n useNotificationStore.persist.hasHydrated(),\n state.loadedFromPersistor,\n isSynced,\n ]);\n}\n", "import { styled } from '@rango-dev/ui';\n\nexport const MainContainer = styled('div', {\n fontFamily: '$widget',\n boxSizing: 'border-box',\n textAlign: 'left',\n height: '100%',\n '& *, *::before, *::after': {\n boxSizing: 'inherit',\n },\n '& *:focus-visible': {\n outlineColor: '$info500',\n transition: 'none',\n },\n '& ul, ol, li': { listStyleType: 'none' },\n});\n", "import type { PropTypes } from './WidgetProvider.types';\nimport type { PropsWithChildren } from 'react';\n\nimport { setSolanaSignerConfig } from '@rango-dev/signer-solana';\nimport React, { useEffect, useMemo } from 'react';\n\nimport { DEFAULT_BASE_URL, RANGO_PUBLIC_API_KEY } from '../../constants';\nimport { useFetchApiConfig } from '../../hooks/useFetchApiConfig';\nimport useFontLoader from '../../hooks/useFontLoader';\nimport QueueManager from '../../QueueManager';\nimport { initConfig } from '../../utils/configs';\nimport { WidgetWallets } from '../Wallets';\nimport { WidgetInfo } from '../WidgetInfo';\n\nexport function WidgetProvider(props: PropsWithChildren<PropTypes>) {\n const { onUpdateState, config } = props;\n\n const fontFamily = props.config?.theme?.fontFamily;\n\n const { fetchApiConfig } = useFetchApiConfig();\n const { handleLoadCustomFont } = useFontLoader();\n\n useEffect(() => {\n void fetchApiConfig().catch(console.log);\n }, []);\n\n useEffect(() => {\n if (fontFamily) {\n handleLoadCustomFont(fontFamily);\n }\n }, [fontFamily]);\n\n useMemo(() => {\n initConfig({\n API_KEY: config?.apiKey || RANGO_PUBLIC_API_KEY,\n BASE_URL: config?.apiUrl || DEFAULT_BASE_URL,\n });\n }, [config.apiKey, config.apiUrl]);\n\n useEffect(() => {\n if (props.config?.signers?.customSolanaRPC) {\n setSolanaSignerConfig('customRPC', props.config.signers.customSolanaRPC);\n }\n }, [props.config?.signers?.customSolanaRPC]);\n\n return (\n <WidgetWallets config={config} onUpdateState={onUpdateState}>\n <QueueManager apiKey={config.apiKey}>\n <WidgetInfo>{props.children}</WidgetInfo>\n </QueueManager>\n </WidgetWallets>\n );\n}\n", "import { useUiStore } from '../store/ui';\nimport { getConfig } from '../utils/configs';\n\nexport type Watermark = 'NONE' | 'FULL';\n\ntype ConfigResponse = {\n config: {\n watermark: Watermark;\n banners: {\n profile: boolean;\n };\n };\n};\n\ninterface UseFetchApiConfig {\n fetchApiConfig: () => Promise<void>;\n}\n\nexport function useFetchApiConfig(): UseFetchApiConfig {\n const { setWatermark, setShowProfileBanner } = useUiStore();\n\n const fetchApiConfig: UseFetchApiConfig['fetchApiConfig'] = async () => {\n const response = await fetch(\n `${getConfig('BASE_URL')}/meta/dapp/config?apiKey=${getConfig('API_KEY')}`\n );\n\n if (!response.ok) {\n throw new Error(`Request failed with status: ${response.status} `);\n }\n\n const data: ConfigResponse = await response.json();\n\n setWatermark(data.config.watermark);\n setShowProfileBanner(data.config.banners.profile);\n };\n return { fetchApiConfig };\n}\n", "import { useState } from 'react';\n\nimport { getFontUrlByName } from '../utils/common';\n/*\n *TODO:\n * Loading fonts from JS has a downside and it is the bundle needs to be downloaded and executed first which means after sometime font will be added to <head /> and it causes a layoutshift each time.\n * We've added Roboto into <head /> since it's the default font. the downside here is it will load roboto anyway even dApp has set fontFamily other than Roboto which causes an unneccerary downloand (Roboto).\n * We decided to go with the second one and it can be solved in future by split these types of configs into a separate js file and let it to be loaded with a more priority than the main bundle. it should be also cached which imrpove user experience after first load.\n */\nconst useFontLoader = () => {\n const [fontLink, setFontLink] = useState<HTMLLinkElement | null>(null);\n\n const loadFont = (fontUrl: string) => {\n const link = document.createElement('link');\n link.href = fontUrl;\n link.rel = 'stylesheet';\n document.head.appendChild(link);\n return link;\n };\n\n const unloadFont = () => {\n if (fontLink) {\n document.head.removeChild(fontLink);\n setFontLink(null);\n }\n };\n\n const handleLoadCustomFont = (fontName: string) => {\n unloadFont(); // Remove previous font\n const fontUrl = getFontUrlByName(fontName);\n if (fontUrl) {\n const newFontLink = loadFont(fontUrl);\n setFontLink(newFontLink);\n }\n };\n\n return { handleLoadCustomFont };\n};\n\nexport default useFontLoader;\n", "import type {\n SwapQueueContext,\n TargetNamespace,\n} from '@rango-dev/queue-manager-rango-preset';\nimport type { WalletType } from '@rango-dev/wallets-shared';\nimport type { PropsWithChildren } from 'react';\n\nimport {\n checkWaitingForNetworkChange,\n makeQueueDefinition,\n} from '@rango-dev/queue-manager-rango-preset';\nimport { Provider as ManagerProvider } from '@rango-dev/queue-manager-react';\nimport { useWallets } from '@rango-dev/wallets-react';\nimport { convertEvmBlockchainMetaToEvmChainInfo } from '@rango-dev/wallets-shared';\nimport { isEvmBlockchain } from 'rango-types';\nimport React, { useMemo } from 'react';\n\nimport { eventEmitter } from './services/eventEmitter';\nimport { useAppStore } from './store/AppStore';\nimport { useUiStore } from './store/ui';\nimport { getConfig } from './utils/configs';\nimport { walletAndSupportedChainsNames } from './utils/wallets';\n\nfunction QueueManager(props: PropsWithChildren<{ apiKey?: string }>) {\n const {\n providers,\n getSigners,\n state,\n connect,\n canSwitchNetworkTo,\n getWalletInfo,\n hubProvider,\n } = useWallets();\n\n const swapQueueDef = useMemo(() => {\n return makeQueueDefinition({\n API_KEY: props.apiKey || getConfig('API_KEY'),\n BASE_URL: getConfig('BASE_URL'),\n emitter: {\n emit: eventEmitter.emit,\n },\n });\n }, [props.apiKey]);\n\n const { blockchains, connectedWallets } = useAppStore();\n const blockchainsList = blockchains();\n\n const wallets = {\n blockchains: connectedWallets.map((wallet) => ({\n accounts: [wallet],\n name: wallet.chain,\n })),\n };\n\n const switchNetwork = async (\n wallet: WalletType,\n namespace: TargetNamespace\n ) => {\n if (!canSwitchNetworkTo(wallet, namespace.network, namespace)) {\n return undefined;\n }\n const result = await connect(wallet, [namespace]);\n\n return result;\n };\n\n const isMobileWallet = (walletType: WalletType): boolean =>\n !!getWalletInfo(walletType).mobileWallet;\n\n // TODO: this code copy & pasted from rango, should be refactored.\n const allBlockchains = blockchainsList\n .filter((blockchain) => blockchain.enabled)\n .reduce(\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n (blockchainsObj: any, blockchain) => (\n (blockchainsObj[blockchain.name] = blockchain), blockchainsObj\n ),\n {}\n );\n const evmBasedChains = blockchainsList.filter(isEvmBlockchain);\n const getSupportedChainNames = (type: WalletType) => {\n const { supportedChains } = getWalletInfo(type);\n return walletAndSupportedChainsNames(supportedChains);\n };\n const allProviders = providers();\n\n const context: SwapQueueContext = {\n meta: {\n blockchains: allBlockchains,\n evmBasedChains: evmBasedChains,\n evmNetworkChainInfo:\n convertEvmBlockchainMetaToEvmChainInfo(evmBasedChains),\n getSupportedChainNames,\n },\n getSigners,\n wallets,\n providers: allProviders,\n switchNetwork,\n canSwitchNetworkTo,\n state,\n isMobileWallet,\n hubProvider,\n };\n\n const isActiveTab = useUiStore.use.isActiveTab();\n\n return (\n <ManagerProvider\n queuesDefs={[swapQueueDef]}\n context={context}\n onPersistedDataLoaded={(manager) => {\n checkWaitingForNetworkChange(manager);\n }}\n isPaused={!isActiveTab}>\n {props.children}\n </ManagerProvider>\n );\n}\n\nexport default QueueManager;\n", "import type { WidgetInfoContextInterface } from './WidgetInfo.types';\n\nimport { useManager } from '@rango-dev/queue-manager-react';\nimport React, { createContext, useContext } from 'react';\n\nimport { useLanguage } from '../../hooks/useLanguage';\nimport { useUpdateQuoteInputs } from '../../hooks/useUpdateQuoteInputs/useUpdateQuoteInputs';\nimport { useAppStore } from '../../store/AppStore';\nimport { useNotificationStore } from '../../store/notification';\nimport { useQuoteStore } from '../../store/quote';\nimport { tabManager, useUiStore } from '../../store/ui';\nimport { calculateWalletUsdValue } from '../../utils/wallets';\n\nimport { WidgetHistory } from './WidgetInfo.helpers';\n\nexport const WidgetInfoContext = createContext<\n WidgetInfoContextInterface | undefined\n>(undefined);\n\nexport function WidgetInfo(props: React.PropsWithChildren) {\n const { manager } = useManager();\n const isActiveTab = useUiStore.use.isActiveTab();\n const retrySwap = useQuoteStore().use.retry();\n const {\n findToken,\n getBalances,\n getConnectedWalletsDetails,\n fetchBalances: refetch,\n } = useAppStore();\n\n const history = new WidgetHistory(manager, { retrySwap, findToken });\n const { fetchingWallets: isLoading } = useAppStore();\n const totalBalance = calculateWalletUsdValue(getBalances());\n const blockchains = useAppStore().blockchains();\n const tokens = useAppStore().tokens();\n const swappers = useAppStore().swappers();\n const loadingStatus = useAppStore().fetchStatus;\n const resetLanguage = useLanguage().resetLanguage;\n const notifications = useNotificationStore().getNotifications();\n const clearNotifications = useNotificationStore().clearNotifications;\n const updateQuoteInputs = useUpdateQuoteInputs();\n const { fromBlockchain, toBlockchain, fromToken, toToken, inputAmount } =\n useQuoteStore()();\n\n // eslint-disable-next-line react/jsx-no-constructed-context-values\n const value: WidgetInfoContextInterface = {\n isActiveTab,\n setCurrentTabAsActive: tabManager.forceClaim,\n history,\n wallets: {\n isLoading,\n details: getConnectedWalletsDetails(),\n totalBalance,\n refetch: async (accounts) => refetch(accounts),\n },\n meta: {\n blockchains,\n tokens,\n swappers,\n loadingStatus,\n findToken,\n },\n resetLanguage,\n notifications: {\n list: notifications,\n clearAll: clearNotifications,\n },\n quote: {\n quoteInputs: {\n fromBlockchain: fromBlockchain?.name ?? null,\n fromToken: fromToken\n ? {\n symbol: fromToken.symbol,\n blockchain: fromToken.blockchain,\n address: fromToken.address,\n }\n : null,\n toBlockchain: toBlockchain?.name ?? null,\n toToken: toToken\n ? {\n symbol: toToken.symbol,\n blockchain: toToken.blockchain,\n address: toToken.address,\n }\n : null,\n requestAmount: inputAmount,\n },\n updateQuoteInputs,\n },\n };\n\n return (\n <WidgetInfoContext.Provider value={value}>\n {props.children}\n </WidgetInfoContext.Provider>\n );\n}\n\nexport function useWidget(): WidgetInfoContextInterface {\n const context = useContext(WidgetInfoContext);\n if (!context) {\n throw new Error(\n 'useWidget can only be used within the WidgetProvider component'\n );\n }\n return context;\n}\n", "import type { UpdateQuoteInputs } from '../../types';\n\nimport { useAppStore } from '../../store/AppStore';\nimport { useQuoteStore } from '../../store/quote';\n\n// This hook provides a function to update quote inputs using fewer and simpler parameters.\nexport function useUpdateQuoteInputs() {\n const { findToken } = useAppStore();\n const blockchains = useAppStore().blockchains();\n const tokens = useAppStore().tokens();\n const {\n setFromBlockchain,\n setFromToken,\n setToBlockchain,\n setToToken,\n setInputAmount,\n } = useQuoteStore()();\n\n const updateQuoteInputs: UpdateQuoteInputs = (params) => {\n const { fromBlockchain, fromToken, toBlockchain, toToken, requestAmount } =\n params;\n const meta = { blockchains, tokens };\n\n if (fromBlockchain !== undefined) {\n const blockchainMeta =\n blockchains.find((blockchain) => blockchain.name === fromBlockchain) ??\n null;\n setFromBlockchain(blockchainMeta);\n }\n if (fromToken !== undefined) {\n const token = fromToken ? findToken(fromToken) ?? null : null;\n setFromToken({ meta, token });\n }\n if (toBlockchain !== undefined) {\n const blockchainMeta =\n blockchains.find((blockchain) => blockchain.name === toBlockchain) ??\n null;\n setToBlockchain(blockchainMeta);\n }\n if (toToken !== undefined) {\n const token = toToken ? findToken(toToken) ?? null : null;\n setToToken({ meta, token });\n }\n if (requestAmount !== undefined) {\n setInputAmount(requestAmount);\n }\n };\n\n return updateQuoteInputs;\n}\n", "import type { Meta, RetryQuote } from '../../store/quote';\nimport type { FindToken } from '../../store/slices/data';\nimport type { Manager } from '@rango-dev/queue-manager-core';\nimport type { PendingSwap } from 'rango-types/lib';\n\nimport {\n cancelSwap,\n getCurrentNamespaceOfOrNull,\n getCurrentStep,\n getRelatedWalletOrNull,\n} from '@rango-dev/queue-manager-rango-preset';\n\nimport { getPendingSwaps } from '../../utils/queue';\nimport { createRetryQuote } from '../../utils/quote';\n\ninterface WidgetHistoryActions {\n retrySwap: (retryQuote: RetryQuote) => void;\n findToken: FindToken;\n}\n\nexport class WidgetHistory {\n private manager: Manager | undefined;\n private actions: WidgetHistoryActions;\n\n constructor(manager: Manager | undefined, actions: WidgetHistoryActions) {\n this.manager = manager;\n this.actions = actions;\n }\n\n public getAllSwaps() {\n return getPendingSwaps(this.manager);\n }\n\n public getCurrentStep(swap: PendingSwap) {\n return this.getCurrentStepInfo(swap).step;\n }\n\n public getCurrentStepWallet(swap: PendingSwap) {\n return this.getCurrentStepInfo(swap).wallet;\n }\n\n public getCurrentStepNetwork(swap: PendingSwap) {\n return this.getCurrentStepInfo(swap).network;\n }\n\n public retry(swap: PendingSwap, meta: Meta) {\n const retryQuote = createRetryQuote(\n swap,\n meta.blockchains,\n this.actions.findToken\n );\n\n return this.actions.retrySwap(retryQuote);\n }\n\n public cancel(id: string) {\n const queue = this.manager?.get(id);\n if (queue) {\n cancelSwap(queue);\n }\n }\n\n private getCurrentStepInfo(swap: PendingSwap) {\n const currentStep = getCurrentStep(swap);\n return {\n step: currentStep,\n wallet: currentStep ? getRelatedWalletOrNull(swap, currentStep) : null,\n network: currentStep\n ? getCurrentNamespaceOfOrNull(swap, currentStep)?.network\n : null,\n };\n }\n}\n", "import type { WidgetProps } from './Widget.types';\nimport type { PropsWithChildren } from 'react';\n\nimport React from 'react';\n\nimport { AppRouter } from '../../components/AppRouter';\nimport { DEFAULT_CONFIG } from '../../store/slices/config';\nimport { Main } from '../App';\nimport { WidgetProvider } from '../WidgetProvider';\n\nexport function Widget(props: PropsWithChildren<WidgetProps>) {\n const isExternalWalletsEnabled = props.config?.externalWallets;\n\n return (\n <AppRouter>\n {isExternalWalletsEnabled ? (\n <Main />\n ) : (\n <WidgetProvider config={props.config ?? DEFAULT_CONFIG}>\n <Main />\n </WidgetProvider>\n )}\n </AppRouter>\n );\n}\n", "import type { WidgetEventEmitter } from '../../types';\n\nimport { eventEmitter } from '../../services/eventEmitter';\n\nexport function useWidgetEvents(): WidgetEventEmitter {\n // To be exported for Dapps\n const { on, off } = eventEmitter;\n return { on, off };\n}\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": ["EventSeverity", "RouteEventType", "StepEventType", "StepExecutionBlockedEventStatus", "StepExecutionEventStatus", "readAccountAddress", "useWallets", "WalletEvents", "Networks", "WalletTypes", "PendingSwapNetworkStatus", "Divider", "React", "useEffect", "useRef", "useState", "WalletState", "useWallets", "useReducer", "isStateOnDerivationPathStep", "state", "__name", "isStateOnNamespace", "initState", "reducer", "state", "action", "__name", "useStatefulConnect", "state", "disconnect", "connect", "useWallets", "connectState", "dispatch", "useReducer", "reducer", "initState", "runConnect", "__name", "wallet", "namespaces", "options", "legacyNamespacesInput", "namespaceInput", "e", "message", "handleDisconnect", "handleConnect", "isDisconnected", "WalletState", "forceConnectToNamespaces", "isHub", "needsNamespace", "item", "needsDerivationPath", "notAvailableForcedNamespace", "namespace", "handleNamespace", "selectedNamespaces", "isSingleNamespace", "firstSelectedNamespace", "isStateOnNamespace", "handleDerivationPath", "derivationPath", "isStateOnDerivationPathStep", "namespaceIsAvailable", "forceConnectToNamespacesEnabled", "getState", "walletState", "isOnDetached", "section", "WalletState", "useWallets", "detectMobileScreens", "KEPLR_COMPATIBLE_WALLETS", "WalletTypes", "useCallback", "useEffect", "React", "createContext", "useContext", "useEffect", "useRef", "create", "persist", "getAllProviders", "CacheService", "__name", "#cache", "key", "value", "cacheService", "defineVersions", "pickVersion", "Provider", "matchAndGenerateProviders", "allProviders", "configWallets", "selectedProviders", "requestedWallet", "result", "provider", "versionedProvider", "pickProviderVersionWithFallbackToLegacy", "Provider", "defineVersions", "__name", "pickVersion", "configWalletsToWalletName", "providers", "getBlockchainDisplayNameFor", "blockchainName", "blockchains", "blockchain", "__name", "getBlockchainShortNameFor", "getBlockchainImage", "getSwapperDisplayName", "swapperId", "swappers", "swapper", "findBlockchain", "name", "isTokenNative", "token", "feeAsset", "createTokenHash", "asset", "isValidTokenAddress", "chain", "address", "matchTokensFromConfigWithMeta", "params", "config", "meta", "result", "configTokens", "addTokens", "__name", "tokens", "item", "createTokenHash", "tokenFromMeta", "configBlockchains", "configBlockchainsSet", "blockchain", "metaTokensForSelectedBlockchain", "targetTokensForBlockchain", "token", "tokenHash", "getSupportedBlockchainsFromConfig", "configFromBlockchains", "configToBlockchains", "blockchains", "supportedBlockchains", "makeProvidersOptionsFromConfig", "config", "__name", "DEFAULT_CONFIG", "DEFAULT_IFRAME_CONFIGS", "DEFAULT_CAMPAIGN_MODE", "generateProviders", "options", "envs", "getAllProviders", "build", "createConfigSlice", "initialData", "set", "get", "allBuiltProviders", "campaignMode", "disabledLiquiditySources", "nextConfig", "currentConfig", "tokensMapByTokenHash", "tokensMapByBlockchainName", "supportedSourceTokens", "matchTokensFromConfigWithMeta", "supportedDestinationTokens", "cacheService", "name", "value", "currentCampaignMode", "currentIframeConfig", "allProviders", "matchAndGenerateProviders", "TransactionType", "ACTIVE_BLOCKCHAINS_FOR_CUSTOM_TOKENS", "DEFAULT_TOKEN_IMAGE_SRC", "RangoClient", "UI_ID", "RANGO_PUBLIC_API_KEY", "DEFAULT_BASE_URL", "SCANNER_BASE_URL", "WIDGET_UI_ID", "BlockchainCategories", "WalletStatus", "readAccountAddress", "detectInstallLink", "getCosmosExperimentalChainInfo", "isEvmAddress", "KEPLR_COMPATIBLE_WALLETS", "Networks", "BigNumber", "isCosmosBlockchain", "BigNumber", "ZERO", "WalletTypes", "BALANCE_SEPARATOR", "EXCLUDED_WALLETS", "BlockchainCategories", "WalletState", "TransactionType", "DEFAULT_FONT_FAMILY", "SUPPORTED_FONTS", "removeDuplicateFrom", "array", "__name", "debounce", "fn", "time", "timeoutId", "wrapper", "args", "__name", "containsText", "text", "searchText", "exactText", "startWithText", "getContainer", "WIDGET_UI_ID", "getExpanded", "compareExactMatchText", "searchFor", "textA", "textB", "exactMatchA", "exactMatchB", "compareContainsText", "textContainsA", "textContainsB", "compareStartWithText", "textStartWithA", "textStartWithB", "compareWithSearchFor", "tokenA", "tokenB", "symbolExactMatchCompare", "tokenNameExactMatchCompare", "symbolStartWithCompare", "symbolContainsCompare", "tokenNameStartWithCompare", "tokenNameContainsCompare", "addressStartWithCompare", "addressContainCompare", "isBlockchainTypeInCategory", "blockchainType", "category", "BlockchainCategories", "TransactionType", "getFontUrlByName", "fontName", "SUPPORTED_FONTS", "font", "isSingleWalletActive", "wallets", "multiWallets", "atLeastOneWalletIsConnected", "w", "WalletState", "memoizedResult", "currentKey", "result", "key", "filterBlockchainsWithAtLeastOneToken", "blockchains", "tokens", "blockchainsWithAtLeastOneToken", "token", "blockchain", "BigNumber", "removeLeadingZeros", "input", "__name", "ensureLeadingZeroForDecimal", "formatThousandsWithCommas", "replaceSpacesWithDash", "stripTrailingZeros", "isZeroValue", "input", "__name", "isValidCurrencyFormat", "maxDecimals", "pattern", "isColorKeyOverridden", "key", "__name", "roundedSecondsToString", "__name", "s", "seconds", "minutes", "numberToString", "number", "minDecimals", "maxDecimals", "BigNumber", "roundingMode", "maxI", "i", "totalArrivalTime", "__name", "data", "a", "b", "containsText", "__name", "text", "searchText", "isPositiveNumber", "sanitizeInputAmount", "amount", "isZeroValue", "stripTrailingZeros", "getWalletConnectionStatus", "wallet", "walletState", "checkIsWalletPartiallyConnected", "WalletStatus", "__name", "mapWalletTypesToWalletInfo", "getState", "getWalletInfo", "list", "chain", "EXCLUDED_WALLETS", "supportedChains", "isContractWallet", "installed", "network", "supportedChain", "type", "name", "image", "installLink", "showOnMobile", "needsNamespace", "needsDerivationPath", "properties", "isHub", "blockchainTypes", "removeDuplicateFrom", "item", "state", "detectInstallLink", "walletAndSupportedChainsNames", "supportedBlockchains", "blockchainMeta", "prepareAccountsForWalletStore", "accounts", "evmBasedChains", "supportedChainNames", "result", "addAccount", "address", "account", "newAccount", "readAccountAddress", "hasLimitation", "isSupported", "isUnknown", "Networks", "isUnknownAndEvmBased", "isEvmAddress", "getQuoteChains", "params", "filter", "quote", "wallets", "swap", "swapIndex", "currentStepFromBlockchain", "currentStepToBlockchain", "internalSwaps", "internalSwap", "internalSwapIndex", "internalStepFromBlockchain", "internalStepToBlockchain", "isLastStep", "isLastInternalStep", "isAccountAndWalletMatched", "connectedWallet", "calculateWalletUsdValue", "__name", "balances", "total", "prev", "balance", "usdBalance", "representAmountInNumber", "ZERO", "BigNumber", "numberWithThousandSeparator", "number", "parts", "formatThousandsWithCommas", "isExperimentalChain", "blockchains", "wallet", "cosmosExperimentalChainInfo", "getCosmosExperimentalChainInfo", "blockchainMeta", "isCosmosBlockchain", "representAmountInNumber", "amount", "decimals", "BigNumber", "__name", "formatBalance", "balance", "usdValue", "formattedAmount", "numberToString", "formattedUsdValue", "compareTokenBalance", "token1Balance", "token2Balance", "token1UsdValue", "ZERO", "token2UsdValue", "token1Amount", "token2Amount", "areTokensEqual", "tokenA", "tokenB", "sortWalletsBasedOnConnectionState", "wallets", "a", "b", "WalletStatus", "getConciseAddress", "address", "maxChars", "ellipsisLength", "start", "end", "getAddress", "chain", "connectedWallets", "walletType", "connectedWallet", "isFetchingBalance", "blockchain", "wallet", "hashWalletsState", "walletsInfo", "w", "filterBlockchainsByWalletTypes", "blockchains", "uniqueBlockchainTypes", "type", "filterWalletsByCategory", "category", "BlockchainCategories", "isBlockchainTypeInCategory", "checkIsWalletPartiallyConnected", "walletState", "supportedNamespaces", "namespace", "configs", "RANGO_PUBLIC_API_KEY", "getConfig", "name", "__name", "initConfig", "nextConfigs", "clonedConfigs", "configs", "__name", "DEFAULT_PRIMARY_RADIUS", "DEFAULT_SECONDARY_RADIUS", "THEME_CLASS_NAME_PREFIX", "isTokenExcludedInConfig", "token", "tokensConfig", "result", "asset", "areTokensEqual", "configForChain", "isExcluded", "isBlockchainExcludedInConfig", "blockchain", "blockchainsConfig", "isVariantExpandable", "isLargeScreen", "isExtraLargeScreen", "variant", "rango", "httpService", "__name", "RangoClient", "getConfig", "i18n", "SLIPPAGES", "DEFAULT_SLIPPAGE", "HIGH_SLIPPAGE", "MAX_SLIPPAGE", "MIN_SLIPPAGE", "QuoteErrorType", "QueueManagerEvents", "QuoteEventTypes", "WalletEventTypes", "UiEventTypes", "WidgetEvents", "getUniqueSwappersGroups", "swappers", "disabledLiquiditySources", "supportedSwappers", "swapper", "uniqueSupportedSwappersGroups", "removeDuplicateFrom", "s", "uniqueGroupItem", "swapperItem", "isSupportedSwapper", "supportedItem", "swapperTypeItem", "__name", "sortLiquiditySourcesByGroupTitle", "a", "b", "isFeatureHidden", "feature", "features", "isRoutingEnabled", "item", "routing", "addCustomTokensToSupportedTokens", "supportedTokens", "customTokens", "getSlippageValidation", "slippage", "MIN_SLIPPAGE", "i18n", "HIGH_SLIPPAGE", "MAX_SLIPPAGE", "createDataSlice", "__name", "set", "get", "options", "blockchainsMapByName", "blockchainsFromState", "config", "supportedBlockchainsFromConfig", "getSupportedBlockchainsFromConfig", "supportedBlockchains", "blockchain", "ACTIVE_BLOCKCHAINS_FOR_CUSTOM_TOKENS", "_tokensMapByTokenHash", "_tokensMapByBlockchainName", "_customTokens", "tokensFromState", "configType", "cacheKey", "supportedTokens", "cacheService", "matchTokensFromConfigWithMeta", "addCustomTokensToSupportedTokens", "blockchains", "token", "containsText", "tokenA", "tokenB", "isToken1Pinned", "isToken2Pinned", "token1Balance", "token2Balance", "balanceCompare", "compareTokenBalance", "blockChainA", "blockChainB", "isNativeTokenA", "isTokenNative", "isNativeTokenB", "symbolSearchForCompare", "compareWithSearchFor", "asset", "tokensMapByHashToken", "customTokens", "tokenHash", "createTokenHash", "customToken", "feeAsset", "type", "pinnedToken", "areTokensEqual", "campaignMode", "campaignModeLiquiditySource", "liquiditySources", "excludeLiquiditySources", "swapper", "swapperGroupIncludedInLiquiditySources", "sortLiquiditySourcesByGroupTitle", "routing", "enableCentralizedSwappers", "isRoutingEnabled", "response", "httpService", "tokensMapByTokenHash", "tokensMapByBlockchainName", "popularTokens", "swappers", "a", "b", "error", "Bengali", "Catalonia", "Chinese", "Denmark", "English", "Finland", "French", "German", "Greece", "Hungary", "India", "Indonesian", "Italian", "Japanese", "Korea", "Lithuania", "Malay", "Netherlands", "Pakistan", "Philippines", "Poland", "Portuguese", "Russian", "SaudiArabia", "Serbia", "Slovakia", "SouthAfrica", "Spanish", "Swahili", "Swedish", "Thai", "Turkish", "Ukrainian", "Vietnamese", "LANGUAGES", "DEFAULT_LANGUAGE", "createSettingsSlice", "__name", "set", "get", "DEFAULT_SLIPPAGE", "state", "blockchain", "currentPreferredBlockchains", "preferredBlockchain", "index", "isSameBlockchain", "isInVisibleList", "nextPreferredBlockchains", "slippage", "customSlippage", "affiliateRef", "affiliatePercent", "affiliateWallets", "swappers", "shouldReset", "swappersGroup", "removeDuplicateFrom", "swapper", "name", "liquiditySource", "theme", "language", "nextConfig", "features", "isThemeHidden", "isFeatureHidden", "isLanguageHidden", "isLiquidityHidden", "singleTheme", "autoUpdateSettings", "DEFAULT_LANGUAGE", "token", "customToken", "config", "customTokens", "supportedBlockchainsFromConfig", "getSupportedBlockchainsFromConfig", "BigNumber", "mitt", "eventEmitter", "widgetEventEmitter", "keepLastUpdated", "__name", "slice", "set", "get", "api", "params", "partial", "restParams", "state", "BigNumber", "createAssetKey", "asset", "BALANCE_SEPARATOR", "__name", "createBalanceKey", "accountAddress", "extractAssetFromBalanceKey", "key", "assetChain", "assetAddress", "assetSymbol", "computeNextBalancesWithNewPrices", "paritalCurrentState", "wallet", "balanceState", "balance", "usdPrice", "balanceKey", "BigNumber", "ZERO", "createBalanceStateForNewAccount", "account", "store", "state", "accountBalance", "amount", "decimals", "usdValue", "updateAggregatedBalanceStateForNewAccount", "aggregatedBalances", "assetKey", "removeBalanceFromAggregatedBalance", "aggregatedBalance", "computeNextStateAfterWalletBalanceRemoval", "walletType", "options", "walletsNeedsToBeRemoved", "connectedWallet", "nextBalancesState", "nextAggregatedBalanceState", "currentBalancesState", "matchWalletDetailsWithConnectedWallet", "connectedWallet", "walletsDetails", "walletDetails", "__name", "memoizedConnectedWalletsWithNestedBalances", "memoizedResult", "createWalletsSlice", "keepLastUpdated", "set", "get", "accounts", "state", "account", "isAccountAndWalletMatched", "namespace", "derivationPath", "connectedWallets", "walletsNeedToBeAdded", "newConnectedWallets", "shouldMarkWalletAsSelected", "currentConnectedWallet", "newConnectedWallet", "params", "tokens", "tokensByBlockchain", "acc", "asset", "addedWallets", "tokensByWalletAddress", "wallet", "key", "walletAddress", "balances", "httpService", "symbol", "address", "blockchain", "nextBalances", "nextAggregatedBalances", "balance", "walletDetail", "partialCurrentState", "computeNextBalancesWithNewPrices", "balancesForWallet", "createBalanceStateForNewAccount", "updateAggregatedBalanceStateForNewAccount", "error", "wallets", "nextConnectedWalletsWithUpdatedSelectedStatus", "walletSelected", "walletNotSelected", "newAccount", "eventEmitter", "walletType", "options", "_balances", "_aggregatedBalances", "computeNextStateAfterWalletBalanceRemoval", "requestedNamesapces", "nextConnectedWallets", "isTargetWalletExistsInConnectedWallets", "targetWalletWasSelectedForBlockchains", "shouldFetchCustomTokens", "selectedCustomTokens", "addressesToFetch", "response", "e", "retryOnFailedBalances", "failedWallets", "token", "assetKey", "createAssetKey", "targetBalanceKeys", "targetKey", "firstTargetBalance", "maxBalance", "targetBalanceKey", "currentBalance", "currentBalanceAmount", "BigNumber", "prevBalanceAmount", "output", "balanceKey", "balanceWalletAddreess", "BALANCE_SEPARATOR", "balancesKeys", "extractAssetFromBalanceKey", "amount", "ZERO", "createAppStore", "initialData", "create", "persist", "a", "createWalletsSlice", "createDataSlice", "createSettingsSlice", "createConfigSlice", "state", "persistedState", "version", "token", "__name", "AppStoreContext", "createContext", "useAppStore", "store", "useContext", "useEffect", "__name", "AppStoreProvider", "props", "appStoreRef", "useRef", "createAppStore", "React", "useWalletList", "params", "chain", "connectedWallets", "getAvailableProviders", "useAppStore", "state", "getWalletInfo", "useWallets", "blockchains", "handleDisconnect", "useStatefulConnect", "listAvailableWalletTypes", "configWalletsToWalletName", "wallets", "mapWalletTypesToWalletInfo", "detectMobileScreens", "wallet", "sortedWallets", "sortWalletsBasedOnConnectionState", "isExperimentalChainNotAdded", "__name", "walletType", "connectedWallet", "terminateConnectingWallets", "useCallback", "connectingWallets", "WalletState", "hashWalletsState", "useEffect", "shouldShowDefaultInjectedWallet", "defaultWallet", "WalletTypes", "blockchain", "shouldExcludeWallet", "isExperimentalChain", "KEPLR_COMPATIBLE_WALLETS", "Modal", "React", "create", "CHANNEL_NAME", "TabManager", "events", "message", "event", "name", "CHANNEL_NAME", "__name", "pingAt", "isPingSentBefore", "resolve", "nextActiveTab", "createSelectors", "__name", "_store", "store", "k", "s", "selectors_default", "useUiStore", "selectors_default", "create", "set", "get", "setCurrentTabAsActive", "hasRunningSwaps", "showActivateTabModal", "flag", "watermark", "showProfileBanner", "showCompactTokenSelector", "tabManager", "TabManager", "WatermarkedModal", "props", "watermark", "useUiStore", "React", "Modal", "__name", "i18n", "Alert", "Button", "Divider", "Image", "MessageBox", "RadioRoot", "WalletImageContainer", "React", "useEffect", "useMemo", "useState", "i18n", "Typography", "React", "getBlockchainLogo", "blockchains", "blockchainName", "blockchain", "__name", "darkTheme", "Image", "styled", "Typography", "NamespaceItemContainer", "NamespaceItemContent", "NamespaceItemInnerContent", "UnsupportedNamespaceItemInnerContent", "NamespaceItemInfo", "NamespaceItemError", "NamespaceItemErrorDropdownToggle", "NamespaceAccountAddress", "NamespaceLogo", "NamespaceUnsupportedItem", "props", "namespace", "blockchains", "useAppStore", "React", "NamespaceItemContainer", "NamespaceItemContent", "NamespaceLogo", "getBlockchainLogo", "UnsupportedNamespaceItemInnerContent", "Typography", "i18n", "__name", "Checkbox", "Radio", "React", "i18n", "ChevronDownIcon", "ChevronUpIcon", "Divider", "Typography", "React", "useEffect", "useState", "Image", "Tooltip", "Typography", "React", "styled", "SupportedChainsContainer", "SupportedChainItem", "SUPPORTED_CHAINS_MAX_DISPLAYED_NUMBER", "SupportedChainsList", "props", "chains", "React", "SupportedChainsContainer", "chain", "index", "Tooltip", "getContainer", "SupportedChainItem", "Image", "Typography", "__name", "NamespaceItem", "props", "namespace", "error", "suffix", "connected", "address", "onClick", "errorIsExpanded", "setErrorIsExpanded", "useState", "blockchains", "useAppStore", "useEffect", "supportedChains", "isSupportedChainsDisplayed", "React", "NamespaceItemContainer", "NamespaceItemContent", "NamespaceLogo", "getBlockchainLogo", "NamespaceItemInnerContent", "NamespaceItemInfo", "Typography", "i18n", "SupportedChainsList", "NamespaceAccountAddress", "NamespaceItemErrorDropdownToggle", "ChevronUpIcon", "ChevronDownIcon", "Divider", "NamespaceItemError", "__name", "NamespaceListItem", "props", "onClick", "type", "namespace", "React", "NamespaceItem", "Radio", "Checkbox", "__name", "Button", "styled", "NamespaceList", "StyledButton", "Namespaces", "props", "targetWallet", "namespacesProperty", "property", "isHub", "singleNamespace", "needsNamespace", "providerImage", "blockchains", "useAppStore", "selectedNamespaces", "setSelectedNamespaces", "useState", "supportedNamespaces", "useMemo", "namespace", "onSelect", "__name", "item", "allSupportedNamespacesSelected", "onSelectAll", "wrapRadioRoot", "children", "React", "RadioRoot", "useEffect", "namespacesContainingDefaultSelectedChains", "chain", "MessageBox", "i18n", "WalletImageContainer", "Image", "Divider", "Alert", "Button", "NamespaceList", "index", "array", "NamespaceUnsupportedItem", "NamespaceListItem", "StyledButton", "i18n", "Alert", "Button", "Divider", "Image", "MessageBox", "WalletImageContainer", "useWallets", "React", "styled", "NamespacesHeader", "i18n", "Button", "Spinner", "React", "useLayoutEffect", "useRef", "useState", "NamespaceDetachedItem", "props", "namespace", "initialConnect", "disabled", "state", "handleConnect", "handleDisconnect", "error", "setError", "useState", "processingConnectAttempt", "useRef", "useLayoutEffect", "handleConnectNamespace", "__name", "options", "handleButtonClick", "getConnectedAddress", "firstAccountArray", "address", "getConciseAddress", "getButtonText", "i18n", "React", "NamespaceItem", "Spinner", "Button", "Detached", "props", "value", "selectedNamespaces", "onConfirm", "confirmText", "i18n", "onDisconnectWallet", "navigateToDerivationPath", "targetWallet", "connect", "disconnect", "state", "useWallets", "walletType", "walletState", "namespacesProperty", "property", "derivationPathProperty", "singleSelection", "handleConnectNamespace", "__name", "namespace", "options", "handleDisconnectNamespace", "renderNamespaceListHeader", "React", "Divider", "Alert", "NamespacesHeader", "Button", "renderNamespaceItem", "NamespaceUnsupportedItem", "selectedNamespace", "selectedNamespaceItem", "namespaceState", "disabled", "NamespaceDetachedItem", "MessageBox", "WalletImageContainer", "Image", "NamespaceList", "index", "array", "StyledButton", "i18n", "Divider", "Image", "MessageBox", "Select", "TextField", "React", "useEffect", "useState", "namespaces", "CUSTOM_DERIVATION_PATH", "index", "getDerivationPaths", "selectedNamespace", "selectedNamespaceDerivationPaths", "namespaces", "__name", "Button", "styled", "Typography", "InputsContainer", "InputLabel", "derivationPathInputStyles", "StyledButton", "DEFAULT_DERIVATION_PATH_INDEX", "DerivationPath", "props", "onConfirm", "selectedNamespace", "image", "type", "selectedDerivationPathId", "setSelectedDerivationPathId", "useState", "derivationPathIndex", "setDerivationPathIndex", "isCustomOptionSelected", "CUSTOM_DERIVATION_PATH", "derivationPaths", "getDerivationPaths", "handleDerivationPathItemClick", "__name", "value", "selectedDerivationPath", "derivationPath", "handleConfirm", "useEffect", "React", "MessageBox", "i18n", "Image", "InputsContainer", "InputLabel", "Select", "derivationPathInputStyles", "Divider", "TextField", "event", "StyledButton", "i18n", "Image", "MessageBox", "WalletImageContainer", "WalletState", "useWallets", "React", "keyframes", "styled", "IconContainer", "LogoContainer", "spin", "Spinner", "ConnectStatus", "props", "wallet", "error", "type", "image", "state", "getWalletInfo", "useWallets", "getWalletConnectionStatus", "WalletState", "React", "MessageBox", "i18n", "LogoContainer", "WalletImageContainer", "Image", "Spinner", "__name", "i18n", "Button", "Divider", "MessageBox", "React", "ExperimentalChain", "props", "displayName", "onConfirm", "id", "React", "MessageBox", "i18n", "Divider", "Button", "__name", "isOnStatus", "getState", "wallet", "__name", "isOnNamespace", "isOnDerivationPath", "isOnDetached", "KEEP_SUCCESS_MODAL_FOR", "DELAY_SHOWING_MODAL_FOR", "StatefulConnectModal", "props", "successModalTimerId", "useRef", "isConnecting", "setIsConnecting", "useState", "error", "setError", "catchErrorOnHandle", "__name", "terminateConnectingWallets", "useWalletList", "handleConnect", "handleDerivationPath", "handleNamespace", "getState", "resetState", "handleDisconnect", "useStatefulConnect", "handleConfirmNamespaces", "selectedNamespaces", "afterConnected", "handleDetachedConfirm", "handleClosingModal", "handleDerivationPathConfirm", "derivationPath", "resetModalState", "result", "isImmediatelyConnected", "resultIsConnected", "resultIsDisconnected", "handleNavigateToDerivationPath", "selectedNamespace", "useEffect", "isConnected", "React", "WatermarkedModal", "getContainer", "isOnStatus", "ConnectStatus", "Divider", "isOnNamespace", "Namespaces", "isOnDerivationPath", "DerivationPath", "isOnDetached", "Detached", "React", "React", "Fragment", "MemoryRouter", "useInRouterContext", "AppRouter", "children", "Router", "useInRouterContext", "Fragment", "MemoryRouter", "React", "__name", "I18nManager", "React", "React", "useRoutes", "navigationRoutes", "useEffect", "useRef", "BigNumber", "create", "subscribeWithSelector", "createContext", "useContext", "SwapModeContext", "createContext", "useSwapMode", "swapMode", "isMultiMode", "useContext", "__name", "i18n", "getRelatedWalletOrNull", "RouteEventType", "BigNumber", "PendingSwapNetworkStatus", "i18n", "errorMessages", "__name", "i18n", "getQuoteErrorMessage", "error", "i18n", "swapButtonTitles", "__name", "i18n", "getFeeLabel", "fee", "t", "__name", "HIGH_PRIORITY_TAGS", "PERCENT_MULTIPLIER", "GAS_FEE_MAX", "ROUTE_TIME_MAX", "SECONDS_IN_MINUTE", "HIGH_VALUE_LOSS_CRITERIA", "OUTPUT_CHANGE_WARNING_CRITERIA", "getLastSuccessfulStep", "BigNumber", "getRequiredBalanceOfWallet", "selectedWallet", "fee", "relatedFeeStatus", "item", "wallet", "__name", "getPriceImpactLevel", "priceImpact", "warningLevel", "createRetryQuote", "pendingSwap", "blockchains", "findToken", "firstStep", "lastStep", "lastSuccessfulStep", "getLastSuccessfulStep", "toToken", "fromBlockchainMeta", "findBlockchain", "toBlockchainMeta", "fromTokenMeta", "toTokenMeta", "inputAmount", "__name", "generateQuoteWarnings", "params", "previousQuote", "currentQuote", "userSlippage", "usdInput", "getUsdInputFrom", "usdOutput", "getUsdOutputFrom", "priceImpact", "getPriceImpact", "hasHighValueLoss", "totalFee", "getTotalFeeInUsd", "warningLevel", "getPriceImpactLevel", "isOutputAmountChangedExcessively", "numberToString", "minRequiredSlippage", "getMinRequiredSlippage", "highSlippage", "HIGH_SLIPPAGE", "hasProperSlippage", "checkSlippageWarnings", "isQuoteWarningConfirmationRequired", "warning", "inputUsdValue", "outputUsdValue", "outputUsdValueIsInvalid", "percentageChange", "getPercentageChange", "getUniqueBlockchains", "steps", "set", "result", "step", "sortQuotesBy", "strategy", "quotes", "quote1", "quote2", "getScore", "route", "score", "quote1Score", "quote2Score", "lowerQuoteId1", "lowerQuoteId2", "getDefaultQuote", "requestAmount", "quote", "currentQuoteSwapperIds", "swap", "matchedQuote", "quoteSwapperIds", "swapperId", "sortTags", "tags", "customSort", "a", "b", "indexA", "HIGH_PRIORITY_TAGS", "indexB", "hasHighValueLoss", "inputUsdValue", "priceImpact", "formattedPriceImpact", "HIGH_VALUE_LOSS_CRITERIA", "threshold", "minInput", "BigNumber", "__name", "hasLimitError", "swaps", "swap", "minimum", "maximum", "getLimitErrorMessage", "isExclusive", "fromAmountRangeError", "recommendation", "i18n", "numberToString", "errorMessages", "getSwapButtonState", "params", "fetchMetaStatus", "anyWalletConnected", "fetchingQuote", "inputAmount", "quote", "warning", "error", "needsToWarnEthOnPath", "swapButtonTitles", "canComputePriceImpact", "usdValue", "inputAmountNumber", "ZERO", "getUsdFeeOfStep", "step", "findToken", "totalFeeInUsd", "i", "fee", "unitPrice", "getTotalFeeInUsd", "totalFee", "getUsdFee", "price", "getTotalFeesInUsd", "fees", "getFeesGroup", "result", "name", "feeGroup", "checkSlippageErrors", "swaps", "recommendedSlippages", "swap", "index", "__name", "checkSlippageWarnings", "quote", "userSlippage", "getMinRequiredSlippage", "slippage", "s", "a", "b", "hasProperSlippage", "minRequiredSlippage", "createQuoteRequestBody", "params", "fromToken", "toToken", "inputAmount", "wallets", "selectedWallets", "disabledLiquiditySources", "liquiditySources", "excludeLiquiditySources", "slippage", "affiliateRef", "affiliatePercent", "affiliateWallets", "destination", "contractCall", "selectedWalletsMap", "selectedWallet", "connectedWallets", "wallet", "liquiditySource", "__name", "getWalletsForNewSwap", "getUsdInputFrom", "quote", "inputTokenUsdPrice", "BigNumber", "getUsdOutputFrom", "outputAmount", "outputTokenUsdPrice", "getPercentageChange", "input", "output", "PERCENT_MULTIPLIER", "isOutputAmountChangedExcessively", "previousQuote", "currentQuote", "usdInput", "previousUsdOutput", "currentUsdOutput", "percentageChange", "OUTPUT_CHANGE_WARNING_CRITERIA", "threshold", "minInput", "generateBalanceWarnings", "blockchains", "fee", "requiredWallets", "getQuoteChains", "selectedWallet1", "selectedWallet2", "getRequiredBalanceOfWallet", "asset", "symbol", "currentAmount", "numberToString", "requiredAmount", "reason", "i18n", "getBlockchainShortNameFor", "isNetworkStatusInWarningState", "pendingSwapStep", "PendingSwapNetworkStatus", "getSwapMessages", "pendingSwap", "currentStep", "getWalletInfo", "textForRemove", "message", "detailedMessage", "walletType", "getRelatedWalletOrNull", "walletName", "isRpc", "getLastConvertedTokenInFailedSwap", "resultToken", "lastSuccessStep", "step", "shouldRetrySwap", "isConfirmSwapDisabled", "fetching", "isCustomDestinationOpen", "customDestination", "lastStepToBlockchain", "allChains", "requiredChains", "everyWalletSelected", "chain", "everyRequiredWalletSelected", "customDestinationIsValid", "isValidTokenAddress", "isTokensIdentical", "tokenA", "tokenB", "getUsdValue", "__name", "token", "amount", "BigNumber", "ZERO", "initializer", "set", "key", "value", "state", "quote", "outputAmount", "outputUsdValue", "inputUsdValue", "isPositiveNumber", "getUsdInputFrom", "getUsdOutputFrom", "chain", "params", "blockchain", "sanitized", "sanitizeInputAmount", "isZeroValue", "removeLeadingZeros", "ensureLeadingZeroForDecimal", "retryQuote", "fromBlockchain", "fromToken", "toBlockchain", "toToken", "inputAmount", "flag", "wallets", "address", "createSwapQuoteSelectors", "create", "subscribeWithSelector", "createRefuelQuoteSelectors", "useSwapQuoteStore", "selectors_default", "useRefuelQuoteStore", "useQuoteStore", "swapMode", "useSwapMode", "subscribeCallback", "selectedState", "previousSelectedState", "eventEmitter", "unsubscribeSwapQuoteStore", "unsubscribeRefuelQuoteStore", "useSyncStoresWithConfig", "setInputAmount", "setToToken", "setToBlockchain", "setFromBlockchain", "resetQuote", "setFromToken", "fromToken", "toToken", "fromBlockchain", "toBlockchain", "useQuoteStore", "config", "useAppStore", "fetchMetaStatus", "blockchains", "findToken", "setAffiliateRef", "setAffiliatePercent", "setAffiliateWallets", "fromTokensConfig", "fromBlockchainsConfig", "toTokensConfig", "toBlockchainsConfig", "prevConfigFromToken", "useRef", "prevConfigToToken", "prevConfigFromBlockchain", "prevConfigToBlockchain", "useEffect", "chain", "token", "isTokenExcludedInConfig", "isBlockchainExcludedInConfig", "__name", "useEffect", "useRef", "useInRouterContext", "useLocation", "useSearchParams", "convertTokenSearchParamToAsset", "searchParam", "chain", "symbolAndAddress", "__name", "tokenToSearchParam", "token", "useSyncUrlAndStore", "location", "useLocation", "searchParams", "setSearchParams", "useSearchParams", "fromBlockchain", "toBlockchain", "fromToken", "toToken", "inputAmount", "setFromBlockchain", "setToBlockchain", "setFromToken", "setToToken", "setInputAmount", "useQuoteStore", "fetchMetaStatus", "useAppStore", "blockchains", "isInRouterContext", "useInRouterContext", "updateIframe", "updateCampaignMode", "campaignMode", "liquiditySourcesParamsRef", "useRef", "findToken", "getUrlSearchParams", "__name", "utmQueryParams", "key", "value", "fromAmount", "autoConnect", "clientUrl", "liquiditySources", "blockchain", "updateUrlSearchParams", "property", "useEffect", "tokenToSearchParam", "convertFromToken", "convertTokenSearchParamToAsset", "convertToToken", "i18n", "Alert", "Button", "darkTheme", "Divider", "DoneIcon", "styled", "TextField", "Typography", "React", "useState", "useNavigate", "useSearchParams", "ChevronRightIcon", "Divider", "Image", "Typography", "React", "darkTheme", "styled", "InputContainer", "Container", "FlexContainer", "BlockchainSelectorButton", "props", "onClick", "value", "title", "hasLogo", "placeholder", "disabled", "React", "Container", "Typography", "Divider", "InputContainer", "FlexContainer", "Image", "ChevronRightIcon", "__name", "i18n", "Button", "Divider", "MessageBox", "React", "useEffect", "useState", "i18n", "Divider", "ExternalLinkIcon", "Image", "InfoIcon", "Tooltip", "Typography", "React", "CUSTOM_TOKEN_LEARN_MORE_LINK", "generateExplorerLink", "address", "blockchain", "explorerLinkPattern", "__name", "Button", "darkTheme", "styled", "Typography", "StyledLink", "Container", "StyledButton", "TokenSymbolText", "FlexCenteredContainer", "MAX_SYMBOL_LENGTH_THRESHOLD", "CustomTokenModal", "props", "open", "onClose", "token", "onExit", "onSubmitClick", "blockchain", "explorerLink", "generateExplorerLink", "onClickLearnMore", "__name", "CUSTOM_TOKEN_LEARN_MORE_LINK", "React", "WatermarkedModal", "getContainer", "Container", "Image", "DEFAULT_TOKEN_IMAGE_SRC", "Divider", "FlexCenteredContainer", "TokenSymbolText", "Tooltip", "InfoIcon", "Typography", "StyledLink", "ExternalLinkIcon", "i18n", "StyledButton", "ImportCustomToken", "props", "token", "blockchain", "error", "address", "fetchCustomToken", "onCloseErrorModal", "onImport", "onExitErrorModal", "onExitImportModal", "setCustomToken", "useAppStore", "showErrorModal", "setShowErrorModal", "useState", "showImportModal", "setShowImportModal", "retryClicked", "setRetryClicked", "getCustomToken", "__name", "closeErrorModal", "handleErrorModalButtonClick", "handleExit", "handleSubmit", "useEffect", "React", "WatermarkedModal", "getContainer", "MessageBox", "i18n", "Divider", "Button", "CustomTokenModal", "useManager", "BottomLogo", "Divider", "Header", "React", "useEffect", "useLayoutEffect", "useRef", "useState", "useRef", "isAppLoadedIntoIframe", "__name", "useIframe", "heightObserver", "useRef", "iframe", "useAppStore", "isMessagePassingAvailable", "isAppLoadedIntoIframe", "send", "__name", "message", "element", "entries", "entry", "useNavigate", "useNavigateBack", "navigate", "useNavigate", "__name", "createTheme", "defaultDarkTheme", "defaultLightTheme", "useEffect", "useState", "baseThemeTokens", "defaultDarkColors", "React", "HEX_BASE", "MAX_COLOR_VALUE", "PERCENT", "expandShortHexColor", "hexColor", "acc", "char", "__name", "pad", "number", "length", "intToHex", "value", "clampedValue", "rgbToHex", "rgb", "hexToRGB", "hex", "red", "green", "blue", "generateShade", "step", "factor", "generateTint", "calculateShades", "calculateColors", "calculateTints", "generateColor", "colors", "i", "createTintsAndShades", "colorKey", "isReversed", "tints", "shades", "combinedColors", "colorMap", "index", "color", "expandToGenerateThemeColors", "baseColors", "expandColors", "options", "output", "expandColor", "isNeutralReversed", "isColorKeyOverridden", "expandedHexColor", "toAlphabeticChar", "__name", "code", "toAlphabeticName", "name", "x", "toPhash", "h", "i", "toHash", "value", "customizedThemeTokens", "colors", "baseColors", "baseThemeTokens", "baseDarkColors", "defaultDarkColors", "lightTheme", "darkTheme", "tokens", "expandToGenerateThemeColors", "THEME_CLASS_NAME_PREFIX", "toHash", "__name", "joinList", "list", "divider", "element", "key", "React", "output", "item", "index", "doesWindowPreferDarkColorScheme", "__name", "useTheme", "props", "colors", "fontFamily", "DEFAULT_FONT_FAMILY", "borderRadius", "DEFAULT_PRIMARY_RADIUS", "secondaryBorderRadius", "DEFAULT_SECONDARY_RADIUS", "OSTheme", "setOSTheme", "useState", "theme", "useAppStore", "dark", "light", "customizedThemeTokens", "baseTheme", "createTheme", "lightThemeClasses", "defaultLightTheme", "darkThemeClasses", "defaultDarkTheme", "customizedLightTheme", "customizedDarkTheme", "useEffect", "switchThemeListener", "event", "lightClassNames", "darkClassNames", "getPendingSwaps", "__name", "manager", "result", "q", "id", "storage", "a", "b", "i18n", "Alert", "Button", "React", "ActivateTabAlert", "props", "React", "Alert", "Button", "i18n", "__name", "i18n", "Button", "Divider", "MessageBox", "React", "ActivateTabModal", "props", "open", "onClose", "onConfirm", "React", "WatermarkedModal", "getContainer", "MessageBox", "i18n", "Divider", "Button", "__name", "ChevronLeftIcon", "React", "css", "darkTheme", "IconButton", "styled", "HeaderButton", "ConnectedIcon", "SuffixContainer", "NotificationsBadgeContainer", "ProgressIcon", "InProgressTransactionBadgeContainer", "rowStyles", "WalletImageContainer", "BackButton", "props", "React", "HeaderButton", "ChevronLeftIcon", "__name", "i18n", "Button", "Typography", "React", "CancelButton", "props", "React", "SuffixContainer", "Button", "Typography", "i18n", "__name", "i18n", "Image", "Tooltip", "WalletIcon", "WalletState", "React", "WalletButton", "props", "list", "useWalletList", "connectedWallets", "wallet", "WalletState", "content", "React", "rowStyles", "WalletImageContainer", "Image", "i18n", "Tooltip", "HeaderButton", "ConnectedIcon", "WalletIcon", "__name", "i18n", "NotificationsIcon", "Popover", "SettingsIcon", "Tooltip", "TransactionIcon", "React", "Notifications", "React", "useNavigate", "create", "persist", "subscribeWithSelector", "useNotificationStore", "selectors_default", "create", "persist", "subscribeWithSelector", "set", "get", "event", "route", "fromStep", "toStep", "notification", "excludedList", "notificationItem", "requestId", "state", "isSynced", "notifications", "a", "b", "swaps", "nextNotifications", "swap", "otherProps", "persistedState", "version", "oldNotifications", "read", "NotificationContent", "navigate", "useNavigate", "getNotifications", "clearNotifications", "useNotificationStore", "notifications", "blockchains", "useAppStore", "findToken", "React", "Notifications", "blockchain", "getBlockchainImage", "token", "__name", "requestId", "navigationRoutes", "useManager", "InProgressIcon", "React", "InProgressTransactionBadge", "__name", "manager", "useManager", "getPendingSwaps", "swap", "React", "InProgressTransactionBadgeContainer", "InProgressIcon", "InProgressTransactionBadge_default", "EventSeverity", "Typography", "React", "NotificationsBadge", "getNotifications", "useNotificationStore", "notificationsList", "notificationsCount", "hasSeverNotification", "notificationItem", "EventSeverity", "React", "NotificationsBadgeContainer", "Typography", "__name", "RefreshProgressButton", "React", "useEffect", "useState", "REFRESH_INTERVAL", "MAX_ELAPSED_TIME", "MAX_PERCENTAGE", "RefreshButton", "onClick", "elapsedTime", "setElapsedTime", "useState", "isRefetched", "setIsRefetched", "handleVisibilityChange", "__name", "interval", "clearTimeout", "useEffect", "prevTime", "handleRefreshClick", "React", "HeaderButton", "ProgressIcon", "RefreshProgressButton", "HeaderButtons", "props", "onClickRefresh", "onClickHistory", "onClickSettings", "hidden", "container", "features", "useAppStore", "isNotificationsHidden", "isFeatureHidden", "React", "Tooltip", "getContainer", "i18n", "RefreshButton", "Popover", "NotificationContent", "HeaderButton", "NotificationsIcon", "NotificationsBadge", "SettingsIcon", "TransactionIcon", "InProgressTransactionBadge_default", "__name", "i18n", "Divider", "MessageBox", "RefreshIcon", "React", "Button", "styled", "RefreshButton", "RefreshModal", "props", "open", "onClose", "React", "WatermarkedModal", "getContainer", "MessageBox", "i18n", "Divider", "RefreshButton", "RefreshIcon", "__name", "WIDGET_MAX_HEIGHT", "WIDGET_MIN_HEIGHT_FOR_SMALL_SCREENS", "WIDGET_MIN_HEIGHT_FOR_LARGE_SCREENS", "COMPACT_TOKEN_SELECTOR_THRESHOLD", "LARGE_SCREEN_MIN_HEIGHT", "onScrollContentAttachStatusToContainer", "e", "contentElement", "fromTop", "container", "getContainer", "__name", "css", "styled", "LayoutContainer", "css", "Container", "styled", "WIDGET_MAX_HEIGHT", "WIDGET_MIN_HEIGHT_FOR_SMALL_SCREENS", "LARGE_SCREEN_MIN_HEIGHT", "WIDGET_MIN_HEIGHT_FOR_LARGE_SCREENS", "Content", "Footer", "BannerContainer", "Layout", "props", "connectHeightObserver", "disconnectHeightObserver", "useIframe", "children", "header", "footer", "height", "fetchStatus", "connectedWallets", "__UNSTABLE_OR_INTERNAL__", "useAppStore", "openRefreshModal", "setOpenRefreshModal", "useState", "features", "theme", "watermark", "useUiStore", "hasWatermark", "activeTheme", "useTheme", "showBanner", "setShowBanner", "isConnectWalletHidden", "isFeatureHidden", "isActiveTab", "tabManagerInitiated", "showActivateTabModal", "setShowActivateTabModal", "activateCurrentTab", "setShowCompactTokenSelector", "navigateBack", "useNavigateBack", "manager", "useManager", "hasRunningSwap", "getPendingSwaps", "swap", "onActivateTab", "__name", "tabManager", "onConnectWallet", "showBackButton", "scrollViewRef", "useRef", "containerRef", "useEffect", "noRoutesAvailable", "routesMatched", "route", "isAppLoadedIntoIframe", "onScrollContentAttachStatusToContainer", "useLayoutEffect", "observer", "entries", "entry", "COMPACT_TOKEN_SELECTOR_THRESHOLD", "React", "Container", "WIDGET_UI_ID", "LayoutContainer", "Header", "BackButton", "WalletButton", "getContainer", "CancelButton", "Content", "ActivateTabModal", "Footer", "ActivateTabAlert", "Divider", "BottomLogo", "BannerContainer", "RefreshModal", "styled", "CONTENT_PADDING", "ScrollableArea", "styled", "PageContainer", "i18n", "useState", "useFetchCustomToken", "loading", "setLoading", "useState", "error", "setError", "token", "setToken", "findToken", "useAppStore", "customTokens", "resetState", "__name", "produceErrorMessage", "type", "blockchain", "i18n", "tokenAddress", "errorMessage", "response", "httpService", "Content", "styled", "darkTheme", "AddCustomTokenPage", "navigate", "useNavigate", "searchParams", "useSearchParams", "navigateBack", "useNavigateBack", "blockchains", "useAppStore", "blockchainName", "blockchain", "findBlockchain", "address", "setAddress", "useState", "fetchCustomToken", "token", "loading", "error", "resetState", "useFetchCustomToken", "isValidAddress", "isValidTokenAddress", "isImportDisabled", "getCustomToken", "__name", "React", "Layout", "i18n", "PageContainer", "BlockchainSelectorButton", "navigationRoutes", "Divider", "Typography", "TextField", "DoneIcon", "e", "Alert", "Button", "ImportCustomToken", "i18n", "useManager", "Alert", "Button", "css", "Divider", "IconButton", "styled", "Typography", "WalletIcon", "React", "useEffect", "useLayoutEffect", "useRef", "useState", "useNavigate", "i18n", "Alert", "BalanceErrors", "Button", "ChevronLeftIcon", "Divider", "MessageBox", "Typography", "React", "useCallback", "useEffect", "useMemo", "useState", "useNavigate", "i18n", "Alert", "ChevronDownIcon", "CloseIcon", "Divider", "IconButton", "PasteIcon", "Typography", "WalletIcon", "React", "useEffect", "useRef", "React", "useRef", "Collapsible", "keyframes", "styled", "EXPANDABLE_TRANSITION_DURATION", "slideDown", "slideUp", "CollapsibleRoot", "Trigger", "CollapsibleContent", "ExpandedIcon", "CustomCollapsible", "props", "open", "hasSelected", "onOpenChange", "children", "onClickTrigger", "trigger", "triggerAnchor", "ref", "useRef", "React", "CollapsibleRoot", "Trigger", "CollapsibleContent", "__name", "darkTheme", "styled", "TextField", "Container", "StyledTextField", "CustomDestinationButton", "CustomDestination", "props", "blockchain", "handleOpenChange", "open", "customDestination", "setCustomDestination", "useQuoteStore", "config", "useAppStore", "blockchains", "blockchainName", "getBlockchainDisplayNameFor", "inputRef", "useRef", "configDestination", "isFirefox", "isAddressInvalid", "isValidTokenAddress", "handleClear", "__name", "handlePaste", "event", "pastedText", "renderSuffix", "React", "IconButton", "CloseIcon", "PasteIcon", "useEffect", "Container", "CustomCollapsible", "CustomDestinationButton", "WalletIcon", "Divider", "Typography", "i18n", "ExpandedIcon", "ChevronDownIcon", "StyledTextField", "e", "Alert", "css", "IconButton", "SelectableWalletButton", "styled", "Title", "ListContainer", "ShowMoreWallets", "ShowMoreHeader", "NavigateBack", "WalletsContainer", "walletsListStyles", "ConfirmButton", "Wallets", "i18n", "warn", "Divider", "makeInfo", "SelectableWallet", "Typography", "WalletState", "React", "useEffect", "useState", "Image", "MessageBox", "React", "keyframes", "styled", "LogoContainer", "SpinAnimation", "Spinner", "WalletImageContainer", "i18n", "generateMessageByStatus", "status", "blockchainDisplayName", "i18n", "__name", "ExperimentalChainStatus", "props", "status", "displayName", "image", "data", "generateMessageByStatus", "hasImage", "React", "MessageBox", "LogoContainer", "WalletImageContainer", "Image", "Spinner", "__name", "ACCOUNT_ADDRESS_MAX_CHARACTERS", "TIME_TO_CLOSE_MODAL", "WalletList", "props", "chain", "quoteChains", "isSelected", "selectWallet", "limit", "onShowMore", "isActiveTab", "useUiStore", "blockchains", "connectedWallets", "useAppStore", "selectedWalletToConnect", "setSelectedWalletToConnect", "useState", "experimentalChainWallet", "setExperimentalChainWallet", "showExperimentalChainModal", "setShowExperimentalChainModal", "addingExperimentalChainStatus", "setAddingExperimentalChainStatus", "suggestAndConnect", "useWallets", "list", "useWalletList", "sortedList", "setSortedList", "numberOfSupportedWallets", "shouldShowMoreWallets", "addExperimentalChain", "__name", "wallet", "useEffect", "selectedWalletIndex", "_", "index", "sortedItem", "listItem", "modalContainer", "WIDGET_UI_ID", "timeout", "React", "address", "getAddress", "isConnected", "WalletState", "conciseAddress", "getConciseAddress", "isConnectedButDifferentThanTargetNamespace", "experimentalChain", "isExperimentalChain", "experimentalChainNotAdded", "connectedWallet", "couldAddExperimentalChain", "onSelectableWalletClick", "info", "makeInfo", "getWalletDescription", "i18n", "getWalletDescriptionColor", "blockchainDisplayName", "getBlockchainDisplayNameFor", "WatermarkedModal", "ExperimentalChain", "ExperimentalChainStatus", "Divider", "SelectableWallet", "StatefulConnectModal", "warn", "ShowMoreWallets", "Typography", "NUMBER_OF_WALLETS_TO_DISPLAY", "ConfirmWalletsModal", "props", "open", "onClose", "onCancel", "onCheckBalance", "loading", "navigate", "useNavigate", "blockchains", "useAppStore", "selectedQuote", "selectQuoteWallets", "quoteWalletsConfirmed", "setQuoteWalletConfirmed", "customDestination", "setCustomDestination", "useQuoteStore", "config", "connectedWallets", "setWalletsAsSelected", "showMoreWalletFor", "setShowMoreWalletFor", "useState", "balanceWarnings", "setBalanceWarnings", "error", "setError", "isCustomDestinationOpen", "setCustomDestinationOpen", "quoteChains", "useMemo", "getQuoteChains", "requiredChains", "lastStepToBlockchain", "blockchain", "isWalletRequiredFor", "__name", "getInitialSelectableWallets", "useCallback", "connectedWallet", "selectableWallets", "setSelectableWallets", "nextSelectedWallets", "setNextSelectedWallets", "addNextSelectedWallets", "walletType", "prevState", "isInsufficientBalanceModalOpen", "isSelected", "chain", "selectableWallet", "updateSelectableWallets", "wallets", "chainName", "shouldSelect", "isAnyWalletSelected", "wallet", "selected", "handleCustomDestinationCollapsibleOpenChange", "onChange", "onConfirmBalance", "lastSelectedWallets", "onConfirmWallets", "result", "warnings", "getQuoteErrorMessage", "useEffect", "nextState", "selectedWallet", "modalContainer", "WIDGET_UI_ID", "React", "WatermarkedModal", "ConfirmButton", "Button", "isConfirmSwapDisabled", "i18n", "ShowMoreHeader", "NavigateBack", "ChevronLeftIcon", "Typography", "getBlockchainShortNameFor", "MessageBox", "BalanceErrors", "WalletsContainer", "walletsListStyles", "WalletList", "Alert", "Divider", "Wallets", "requiredWallet", "index", "key", "isLastWallet", "showCustomDestination", "Title", "ListContainer", "CustomDestination", "i18n", "Alert", "Button", "Divider", "InfoIcon", "React", "Alert", "Button", "Divider", "NoRouteIcon", "RefreshIcon", "Typography", "React", "i18n", "SMALL_NO_ROUTE__ICON_SIZE", "LARGE_NO_ROUTE_ICON_SIZE", "makeInfo", "error", "disabledLiquiditySources", "toggleAllLiquiditySources", "refetchQuote", "errorMessages", "i18n", "__name", "NoRouteIconSize", "NoRouteTitleSize", "styled", "Container", "ErrorDescription", "Footer", "PrefixIcon", "NoResult", "props", "fetch", "error", "size", "skipAlerts", "disabledLiquiditySources", "useAppStore", "toggleAllLiquiditySources", "swappers", "info", "makeInfo", "React", "Container", "NoRouteIcon", "NoRouteIconSize", "Divider", "Typography", "NoRouteTitleSize", "errorMessages", "ErrorDescription", "Footer", "Alert", "Button", "PrefixIcon", "RefreshIcon", "__name", "i18n", "Button", "Divider", "MessageBox", "Typography", "WarningIcon", "React", "InfoIcon", "Tooltip", "Typography", "React", "Button", "darkTheme", "styled", "Typography", "Alerts", "Flex", "Item", "ValueContent", "ValueTypography", "Action", "SwapButton", "VALUE_LENGTH_THRESHOLD", "QuoteErrorsModalItem", "props", "title", "value", "valueColor", "container", "getContainer", "React", "Item", "Typography", "ValueContent", "ValueTypography", "Tooltip", "InfoIcon", "__name", "HighValueLossWarningModal", "props", "open", "onClose", "onConfirm", "warning", "confirmationDisabled", "type", "highValueLossData", "i18n", "numberToString", "React", "WatermarkedModal", "Button", "WarningIcon", "errorMessages", "getContainer", "MessageBox", "Flex", "Divider", "Typography", "item", "index", "QuoteErrorsModalItem", "__name", "i18n", "makeAlerts", "warning", "error", "alertInfo", "i18n", "getPriceImpactLevel", "errorMessages", "__name", "getRequiredSlippage", "i18n", "Button", "Divider", "MessageBox", "WarningIcon", "React", "useNavigate", "SlippageWarningModal", "props", "open", "onClose", "onConfirm", "warning", "confirmationDisabled", "navigate", "useNavigate", "React", "WatermarkedModal", "getContainer", "MessageBox", "i18n", "Divider", "SwapButton", "WarningIcon", "Button", "navigationRoutes", "__name", "Button", "MessageBox", "WarningIcon", "React", "UnknownPriceWarningModal", "props", "open", "onClose", "onConfirm", "confirmationDisabled", "React", "WatermarkedModal", "Button", "WarningIcon", "errorMessages", "getContainer", "MessageBox", "__name", "QuoteWarningsAndErrors", "props", "warning", "error", "couldChangeSettings", "showWarningModal", "confirmationDisabled", "skipAlerts", "refetchQuote", "onOpenWarningModal", "onCloseWarningModal", "onConfirmWarningModal", "onChangeSettings", "onChangeSlippage", "warningModalHandlers", "showNoResultMessage", "alertInfo", "makeAlerts", "showAlerts", "onclickActionButton", "__name", "action", "quoteError", "requestedSlippage", "getRequiredSlippage", "React", "Divider", "NoResult", "Alerts", "Alert", "Action", "InfoIcon", "Button", "i18n", "HighValueLossWarningModal", "SlippageWarningModal", "UnknownPriceWarningModal", "BigNumber", "React", "i18n", "Alert", "Divider", "FullExpandedQuote", "InfoIcon", "NumericTooltip", "QuoteTag", "StepDetails", "TokenAmount", "Typography", "useIsTruncated", "BigNumber", "React", "useRef", "useState", "styled", "QuoteContainer", "FooterStepAlarm", "FooterAlert", "Collapsible", "Button", "css", "darkTheme", "Image", "styled", "Typography", "EXPANDABLE_QUOTE_TRANSITION_DURATION", "QuoteContainer", "styled", "darkTheme", "stepsDetailsStyles", "css", "AllRoutesButton", "Button", "SummaryContainer", "summaryStyles", "summaryHeaderStyles", "rowStyles", "Trigger", "Image", "ImageContainer", "Content", "CollapsibleContent", "IconContainer", "Separator", "HorizontalSeparator", "BasicInfoOutput", "TokenNameText", "Typography", "AmountText", "MoreStep", "TagContainer", "Line", "UsdValueText", "i18n", "ChevronDownIcon", "CloseIcon", "Divider", "IconButton", "NumericTooltip", "QuoteCost", "Typography", "React", "useState", "css", "styled", "FeeSection", "Line", "ModalContainer", "ModalHeader", "trigger", "NonPayableFee", "__name", "props", "React", "FeeSection", "Typography", "numberToString", "QuoteCostDetails", "open", "setOpen", "useState", "openCollapse", "setOpenCollapse", "steps", "quote", "fee", "time", "feeWarning", "timeWarning", "showModalFee", "fullExpandedMode", "swaps", "container", "getExpanded", "getContainer", "feesGroup", "getFeesGroup", "roundedFee", "QuoteCost", "e", "i18n", "WatermarkedModal", "ModalHeader", "IconButton", "CloseIcon", "ModalContainer", "Divider", "payableFeesKey", "feeArray", "index", "key", "usdValue", "getUsdFee", "getFeeLabel", "NumericTooltip", "Line", "CustomCollapsible", "prev", "trigger", "ExpandedIcon", "ChevronDownIcon", "nonPayableFeesKey", "fees", "totalFeeInUsd", "getTotalFeesInUsd", "label", "i18n", "TokenAmount", "React", "css", "styled", "Container", "separatorStyles", "QuoteSummary", "props", "from", "to", "percentageChange", "warningLevel", "React", "Container", "TokenAmount", "i18n", "getContainer", "separatorStyles", "__name", "i18n", "ChevronDownIcon", "ChevronRightIcon", "Divider", "Image", "Tooltip", "Typography", "React", "useLayoutEffect", "useState", "MIN_TABLET_WIDTH", "MIN_NOTEBOOK_WIDTH", "MIN_LARGE_SCREEN_WIDTH", "MIN_EXTRA_LARGE_SCREEN_WIDTH", "useScreenDetect", "__name", "isMobile", "setIsMobile", "useState", "isTablet", "setIsTablet", "isNotebook", "setIsNotebook", "isLargeScreen", "setIsLargeScreen", "isExtraLargeScreen", "setIsExtraLargeScreen", "handleResize", "useLayoutEffect", "useScreenDetect_default", "MAX_STEPS", "MAX_BLOCKCHAINS", "ImageComponent", "__name", "props", "content", "src", "className", "open", "state", "container", "tooltipContainer", "getContainer", "React", "Tooltip", "ImageContainer", "Image", "QuoteTrigger", "quoteRef", "selected", "setExpanded", "steps", "expanded", "type", "numberOfSteps", "blockchains", "getUniqueBlockchains", "isTablet", "isMobile", "useScreenDetect_default", "Trigger", "ref", "e", "prevState", "rowStyles", "Typography", "i18n", "Divider", "step", "index", "key", "arrow", "IconContainer", "ChevronRightIcon", "i", "MoreStep", "blockchain", "chain", "ChevronDownIcon", "Quote", "props", "quote", "input", "output", "error", "warning", "type", "selected", "tagHidden", "showModalFee", "onClickAllRoutes", "fullExpandedMode", "propContainer", "blockchains", "useAppStore", "findToken", "swappers", "customSlippage", "slippage", "userSlippage", "expanded", "setExpanded", "useState", "quoteRef", "useRef", "roundedOutput", "numberToString", "roundedOutputUsdValue", "priceImpact", "getPriceImpact", "percentageChange", "priceImpactWarningLevel", "getPriceImpactLevel", "getQuoteSteps", "__name", "swaps", "internalSwap", "swap", "index", "stepState", "hasBridgeLimitError", "hasSlippageError", "hasSlippageWarning", "stepHasError", "stepHasWarning", "alertTitle", "i18n", "getSwapperDisplayName", "getBlockchainShortNameFor", "BigNumber", "React", "FooterStepAlarm", "Alert", "FooterAlert", "Typography", "Divider", "roundedSecondsToString", "getUsdFeeOfStep", "steps", "numberOfSteps", "container", "getContainer", "sortedQuoteTags", "sortTags", "showAllRoutesButton", "totalDurationSeconds", "totalArrivalTime", "totalTime", "totalFee", "getTotalFeeInUsd", "fee", "feeWarning", "GAS_FEE_MAX", "timeWarning", "SECONDS_IN_MINUTE", "ROUTE_TIME_MAX", "inputValueRef", "isInputValueTruncated", "useIsTruncated", "outputValueRef", "isOutputValueTruncated", "usdValueRef", "isUsdValueTruncated", "lastStep", "firstStep", "FullExpandedQuote", "getExpanded", "QuoteCostDetails", "SummaryContainer", "summaryStyles", "TagContainer", "tag", "key", "QuoteTag", "Line", "summaryHeaderStyles", "AllRoutesButton", "e", "BasicInfoOutput", "AmountText", "NumericTooltip", "InfoIcon", "TokenNameText", "UsdValueText", "TokenAmount", "QuoteSummary", "QuoteContainer", "QuoteTrigger", "Content", "HorizontalSeparator", "stepsDetailsStyles", "step", "StepDetails", "Divider", "Skeleton", "React", "darkTheme", "styled", "Container", "Chains", "Steps", "StepSeparator", "ChainToken", "Divider", "Skeleton", "React", "css", "styled", "FlexContent", "BasicSummary", "Output", "OutputTokenInfo", "QuoteSummary", "QuoteSummarySeparator", "TokenAmount", "TokenAmountLabel", "SwapPreview", "RowStyle", "QuoteSummarySkeleton", "props", "type", "tagHidden", "quotePreview", "React", "QuoteSummary", "TokenAmount", "ChainToken", "Divider", "TokenAmountLabel", "Skeleton", "showAllRoutesSkeleton", "FlexContent", "Line", "RowStyle", "BasicSummary", "Output", "OutputTokenInfo", "SwapPreview", "QuoteSummarySeparator", "__name", "ChainToken", "Divider", "NextIcon", "Skeleton", "React", "styled", "StepContent", "StepTokens", "StepTokenInfo", "StepIconContainer", "StepTitle", "StepSkeleton", "props", "separator", "React", "StepTitle", "Skeleton", "Divider", "StepContent", "StepSeparator", "StepTokens", "StepTokenInfo", "ChainToken", "StepIconContainer", "NextIcon", "__name", "QuoteSkeleton", "props", "type", "expanded", "tagHidden", "React", "Container", "QuoteSummarySkeleton", "Chains", "Skeleton", "Steps", "Divider", "StepSkeleton", "__name", "QuoteInfo", "props", "quote", "type", "loading", "error", "warning", "expanded", "tagHidden", "onClick", "showModalFee", "selected", "id", "onClickAllRoutes", "fullExpandedMode", "container", "inputAmount", "inputUsdValue", "useQuoteStore", "outputAmount", "BigNumber", "outputUsdValue", "getUsdOutputFrom", "showQuote", "React", "QuoteContainer", "QuoteSkeleton", "Quote", "__name", "warn", "calculatePendingSwap", "useEffect", "useRef", "useState", "RETRY_DELAY", "useFetch", "request", "loading", "setLoading", "useState", "abortController", "useRef", "cancelFetch", "__name", "retryFetch", "requestBody", "resolve", "fetch", "retryOnFail", "res", "error", "useFetchConfirmQuote", "fetch", "loading", "cancelFetch", "useFetch", "requestBody", "options", "httpService", "__name", "throwErrorIfResponseIsNotValid", "response", "errorMessages", "quoteError", "getQuoteError", "__name", "swaps", "hasLimitError", "swap", "fromAmountRangeError", "recommendation", "getLimitErrorMessage", "recommendedSlippages", "checkSlippageErrors", "minRequiredSlippage", "getMinRequiredSlippage", "generateWarnings", "params", "currentQuote", "previousQuote", "meta", "selectedWallets", "userSlippage", "findToken", "output", "quoteWarning", "generateQuoteWarnings", "balanceWarnings", "generateBalanceWarnings", "handleQuoteErrors", "error", "useConfirmSwap", "fromToken", "toToken", "inputAmount", "inputUsdValue", "setSelectedQuote", "initialQuote", "customDestinationFromStore", "resetAlerts", "useQuoteStore", "slippage", "customSlippage", "useAppStore", "disabledLiquiditySources", "blockchains", "tokens", "findToken", "swapMode", "useSwapMode", "userSlippage", "fetchQuote", "cancelFetch", "loading", "useFetchConfirmQuote", "useEffect", "__name", "params", "selectedWallets", "customDestination", "wallets", "acc", "item", "requestBody", "response", "result", "throwErrorIfResponseIsNotValid", "currentQuote", "swapSettings", "confirmSwapWarnings", "generateWarnings", "proceedAnyway", "swap", "calculatePendingSwap", "getWalletsForNewSwap", "error", "quoteError", "handleQuoteErrors", "warn", "QuoteErrorType", "Buttons", "styled", "IconButton", "confirmBtnStyles", "css", "iconStyles", "descriptionStyles", "ConfirmSwapPage", "selectedQuote", "setInputAmount", "selectedWallets", "quoteWalletsConfirmed", "customDestination", "quoteWarningsConfirmed", "useQuoteStore", "navigate", "useNavigate", "dbErrorMessage", "setDbErrorMessage", "useState", "showWalletsOnInit", "showWallets", "setShowWallets", "isConfirming", "setIsConfirming", "isActiveTab", "useUiStore", "disabledLiquiditySources", "useAppStore", "prevDisabledLiquiditySources", "useRef", "manager", "useManager", "confirmSwap", "fetchingConfirmationQuote", "cancelFetch", "useConfirmSwap", "confirmSwapResult", "setConfirmSwapResult", "showQuoteWarningModal", "setShowQuoteWarningModal", "onConfirmSwap", "__name", "result", "addNewSwap", "swap_url", "navigationRoutes", "e", "onConfirm", "onStartConfirmSwap", "isQuoteWarningConfirmationRequired", "onRefresh", "res", "error", "useEffect", "useLayoutEffect", "quoteWarning", "quoteError", "alerts", "React", "Alert", "settings_url", "QuoteWarningsAndErrors", "Layout", "i18n", "wallets_url", "Button", "WalletIcon", "ConfirmWalletsModal", "PageContainer", "Typography", "RefreshButton", "Divider", "joinList", "alert", "index", "QuoteInfo", "i18n", "Button", "CustomTokensZeroStateDarkIcon", "CustomTokensZeroStateIcon", "DeleteIcon", "Divider", "IconButton", "MessageBox", "NotFound", "styled", "React", "useState", "useNavigate", "CloseIcon", "IconButton", "SearchIcon", "TextField", "React", "styled", "IconWrapper", "SearchInputContainer", "SearchInput", "props", "variant", "fullWidth", "color", "size", "onChange", "value", "style", "setValue", "suffix", "id", "inputAttributes", "inputSuffix", "React", "IconButton", "CloseIcon", "SearchInputContainer", "TextField", "IconWrapper", "SearchIcon", "__name", "i18n", "Button", "CustomTokenWarning", "darkTheme", "Divider", "ExternalLinkIcon", "Image", "ListItem", "NotFound", "PinIcon", "Skeleton", "Typography", "VirtualizedList", "React", "useState", "useTranslation", "Divider", "ListItem", "Skeleton", "React", "css", "darkTheme", "ImageContainer", "ListItemButton", "styled", "Typography", "tokenNameStyles", "descriptionStyles", "tokenTitleStyles", "tokenAddressStyles", "tokenWithoutNameStyles", "usdValueStyles", "Container", "Title", "List", "StyledListItemButton", "Tag", "TagTitle", "BalanceContainer", "End", "Description", "ImageSection", "Pin", "TokenBalance", "StyledLink", "ListItemContainer", "LoadingTokenList", "props", "React", "List", "ListItem", "Skeleton", "End", "Divider", "__name", "PAGE_SIZE", "renderDesc", "__name", "props", "address", "name", "url", "token", "customCssForTag", "customCssForTagTitle", "length", "React", "descriptionStyles", "tokenNameStyles", "Title", "tokenTitleStyles", "Typography", "Divider", "Tag", "TagTitle", "tokenAddressStyles", "tokenWithoutNameStyles", "StyledLink", "e", "ExternalLinkIcon", "TokenList", "tokens", "searchedFor", "onChange", "selectedBlockchain", "showTitle", "action", "type", "showWarning", "fetchStatus", "useAppStore", "blockchains", "getBalanceFor", "loadingWallet", "isTokenPinned", "setFromToken", "setToToken", "useQuoteStore", "t", "useTranslation", "navigateBack", "useNavigateBack", "customToken", "setCustomToken", "useState", "updateToken", "handleImportToken", "endRenderer", "otherProps", "Button", "event", "tokenBalance", "formatBalance", "End", "Skeleton", "BalanceContainer", "TokenBalance", "usdValueStyles", "renderList", "VirtualizedList", "index", "ListItem", "blockchain", "colors", "createTintsAndShades", "darkTheme", "handleClick", "ListItemContainer", "StyledListItemButton", "ImageSection", "Image", "DEFAULT_TOKEN_IMAGE_SRC", "Pin", "PinIcon", "CustomTokenWarning", "getContainer", "customTokenBlockchain", "findBlockchain", "i18n", "Container", "LoadingTokenList", "ImportCustomToken", "List", "NotFound", "Content", "styled", "NotFoundContent", "DeleteIconButton", "IconButton", "CustomTokensPage", "searchedFor", "setSearchedFor", "useState", "deleteCustomToken", "useAppStore", "customTokens", "fromToken", "toToken", "setFromToken", "setToToken", "useQuoteStore", "mode", "useTheme", "navigate", "useNavigate", "isDeleteModalOpen", "setIsDeleteModalOpen", "selectedToken", "setSelectedToken", "handleSearch", "__name", "event", "value", "isDarkTheme", "customTokensResults", "token", "containsText", "handleDeleteCustomToken", "toTokenHash", "createTokenHash", "fromTokenHash", "selectedTokenHash", "React", "Layout", "i18n", "PageContainer", "SearchInput", "Divider", "TokenList", "DeleteIcon", "NotFound", "CustomTokensZeroStateDarkIcon", "CustomTokensZeroStateIcon", "Button", "navigationRoutes", "WatermarkedModal", "getContainer", "MessageBox", "i18n", "useManager", "Button", "darkTheme", "Divider", "MessageBox", "NotFound", "styled", "Tabs", "Typography", "TransactionStatus", "React", "useMemo", "useState", "useNavigate", "FilterIcon", "Popover", "React", "css", "darkTheme", "IconButton", "styled", "IconContainer", "FilterButton", "Badge", "FilterContainer", "centeredFlexContainer", "FilterList", "i18n", "Button", "Divider", "ListItemButton", "Radio", "RadioRoot", "Typography", "React", "FilterSelectorContent", "props", "value", "onClickItem", "React", "FilterContainer", "centeredFlexContainer", "Typography", "i18n", "Button", "Divider", "RadioRoot", "FilterList", "item", "index", "ListItemButton", "Radio", "__name", "FilterSelector", "props", "onClickItem", "onOpenChange", "filterBy", "list", "open", "React", "Popover", "getContainer", "FilterSelectorContent", "id", "FilterButton", "IconContainer", "FilterIcon", "Badge", "__name", "i18n", "getCurrentStep", "Divider", "GroupedVirtualizedList", "Skeleton", "SwapListItem", "Typography", "React", "useCallback", "useEffect", "useRef", "useState", "calculateGroupsSoFar", "totalGroups", "count", "groups", "index", "group", "__name", "css", "darkTheme", "styled", "groupStyles", "SwapItemContainer", "Group", "Time", "SwapList", "NotFoundContainer", "ITEMS_PER_PAGE", "HistoryGroupedList", "props", "list", "onSwapClick", "groupBy", "isLoading", "currentGroupCounts", "setCurrentGroupCounts", "useState", "loadedItems", "useRef", "swaps", "groupCounts", "groups", "calculateGroups", "useCallback", "calculateGroupsSoFar", "loadMore", "remainedItems", "useEffect", "React", "group", "index", "Group", "Time", "Skeleton", "Divider", "SwapList", "_", "SwapListItem", "GroupedVirtualizedList", "Typography", "groupStyles", "groupIndex", "swap", "currentStep", "getCurrentStep", "firstStep", "lastStep", "SwapItemContainer", "getContainer", "i18n", "numberToString", "__name", "i18n", "dayjs", "groupSwapsByDate", "__name", "swaps", "output", "i18n", "addYearsToOutput", "key", "swap", "now", "dayjs", "time", "swapDate", "year", "groupedSwaps", "item", "items", "group", "groupCounts", "groups", "HistoryGroupedListContainer", "styled", "SearchAndFilterBar", "Description", "darkTheme", "isStepContainsText", "__name", "steps", "value", "step", "containsText", "HistoryPage", "navigate", "useNavigate", "manager", "state", "useManager", "list", "getPendingSwaps", "swap", "searchedFor", "setSearchedFor", "useState", "openFilterSelector", "setOpenFilterSelector", "loading", "filterBy", "setFilterBy", "openClearModal", "setOpenClearModal", "swapModeActiveTab", "setSwapModeActiveTab", "handleSearch", "event", "isMultiMode", "useSwapMode", "transactionStatusFilters", "TransactionStatus", "i18n", "swapModeTabItems", "filteredList", "useMemo", "inputAmount", "status", "requestId", "mode", "isEmpty", "onCloseModal", "onClear", "e", "isClearButtonDisabled", "React", "Layout", "SuffixContainer", "Button", "Typography", "PageContainer", "SearchInput", "Divider", "FilterSelector", "open", "id", "Tabs", "item", "NotFoundContainer", "NotFound", "HistoryGroupedList", "groupSwapsByDate", "WatermarkedModal", "getContainer", "MessageBox", "i18n", "Button", "Divider", "styled", "WarningIcon", "BigNumber", "React", "useEffect", "useState", "useNavigate", "i18n", "Alert", "Divider", "NoRouteIcon", "Typography", "React", "styled", "Container", "SameTokensWarning", "fromToken", "toToken", "useQuoteStore", "areTokensEqual", "React", "Container", "Divider", "NoRouteIcon", "Typography", "i18n", "Alert", "__name", "Alert", "Button", "React", "i18n", "makeAlerts", "slippage", "alertInfo", "MIN_SLIPPAGE", "i18n", "HIGH_SLIPPAGE", "__name", "SlippageWarningsAndErrors", "props", "slippage", "customSlippage", "setSlippage", "setCustomSlippage", "useAppStore", "onChangeSettings", "alertInfo", "makeAlerts", "onClickActionButton", "__name", "action", "DEFAULT_SLIPPAGE", "React", "Alert", "Button", "i18n", "IconButton", "ReverseIcon", "Skeleton", "Tooltip", "Typography", "React", "BigNumber", "getSlippageColor", "params", "error", "isDarkTheme", "warning", "quoteError", "slippageError", "quoteWarning", "slippageWarning", "hasSlippageError", "hasSlippageWarning", "__name", "getUsdExchangeRate", "toTokenUsdPrice", "fromTokenUsdPrice", "toPrice", "BigNumber", "fromPrice", "rawValue", "displayValue", "formatTokenValueInUsd", "usdExchangeRate", "tokenUsdPrice", "value", "darkTheme", "styled", "Typography", "Container", "Rate", "TokenName", "SwapMetrics", "props", "slippage", "customSlippage", "quoteTokensRate", "changeQuoteTokensRate", "useAppStore", "quoteError", "quoteWarning", "initialFromToken", "initialToToken", "quote", "loading", "currentSlippage", "mode", "useTheme", "slippageValidation", "getSlippageValidation", "isDarkTheme", "isDefaultRate", "error", "warning", "sourceToken", "destinationToken", "fromToken", "toToken", "fromAmount", "toAmount", "fromTokenUsdPrice", "toTokenUsdPrice", "rawExchangeRate", "displayExchangeRate", "getUsdExchangeRate", "React", "Container", "Typography", "getSlippageColor", "i18n", "Skeleton", "Rate", "TokenName", "IconButton", "ReverseIcon", "Tooltip", "getContainer", "formatTokenValueInUsd", "__name", "i18n", "Header", "React", "useEffect", "useState", "i18n", "Divider", "FullExpandedQuote", "Typography", "React", "styled", "ErrorsContainer", "StrategyContent", "SelectContainer", "i18n", "Select", "React", "SelectStrategy", "props", "updateQuotePartialState", "sortStrategy", "useQuoteStore", "ROUTE_STRATEGY", "i18n", "React", "SelectContainer", "Select", "item", "__name", "ITEM_SKELETON_COUNT", "Quotes", "props", "loading", "onClickOnQuote", "fetch", "showModalFee", "hasSort", "fullExpandedMode", "propContainer", "selectedQuote", "quotes", "updateQuotePartialState", "fromToken", "toToken", "sortStrategy", "error", "useQuoteStore", "slippage", "customSlippage", "useAppStore", "findToken", "container", "getContainer", "hasQuotes", "userSlippage", "getQuoteWarning", "__name", "quote", "mergedQuote", "generateQuoteWarnings", "showNoResultMessage", "sortQuotes", "sortQuotesBy", "React", "StrategyContent", "Typography", "i18n", "SelectStrategy", "Divider", "_", "index", "FullExpandedQuote", "QuoteSkeleton", "quoteWarning", "quoteError", "getQuoteError", "lastIndex", "QuoteInfo", "ErrorsContainer", "NoResult", "darkTheme", "styled", "Container", "Content", "TIME_TO_CLOSE_OPEN_EXPANDED", "ExpandedQuotes", "props", "fetch", "loading", "onClickOnQuote", "onClickRefresh", "isVisible", "isDelayedVisible", "setIsDelayedVisible", "useState", "containerClass", "config", "useAppStore", "fullExpandedMode", "container", "getExpanded", "useEffect", "timeout", "React", "Container", "LayoutContainer", "WIDGET_UI_ID", "Header", "i18n", "SelectStrategy", "HeaderButtons", "Content", "Quotes", "__name", "i18n", "SwapInput", "BigNumber", "React", "ReverseIcon", "React", "keyframes", "styled", "ROTATE_ANIMATION_DURATION", "rotateAnimation", "SwitchButtonContainer", "StyledButton", "SwitchFromAndToButton", "switchFromAndTo", "useQuoteStore", "React", "SwitchButtonContainer", "StyledButton", "event", "button", "ROTATE_ANIMATION_DURATION", "ReverseIcon", "__name", "styled", "Container", "FromContainer", "Inputs", "props", "fetchingQuote", "fetchMetaStatus", "onClickToken", "isExpandable", "fromToken", "fromBlockchain", "toToken", "toBlockchain", "setInputAmount", "sanitizeInputAmount", "inputAmount", "inputUsdValue", "outputAmount", "outputUsdValue", "selectedQuote", "useQuoteStore", "swapMode", "useSwapMode", "connectedWallets", "getBalanceFor", "useAppStore", "fromTokenBalance", "fromTokenFormattedBalance", "formatBalance", "fromBalanceAmount", "BigNumber", "ZERO", "fetchingBalance", "isFetchingBalance", "priceImpactInputCanNotBeComputed", "canComputePriceImpact", "priceImpactOutputCanNotBeComputed", "percentageChange", "getPriceImpact", "React", "Container", "FromContainer", "SwapInput", "i18n", "numberToString", "errorMessages", "getContainer", "tokenBalanceReal", "nextInputAmount", "SwitchFromAndToButton", "getPriceImpactLevel", "__name", "warn", "useCallback", "useEffect", "useRef", "useState", "useFetchAllQuotes", "fetch", "loading", "cancelFetch", "useFetch", "requestBody", "options", "httpService", "__name", "DEBOUNCE_DELAY", "useSwapInput", "refetchQuote", "fetchQuote", "cancelFetch", "useFetchAllQuotes", "configExcludeLiquiditySources", "routing", "useAppStore", "connectedWallets", "contractCall", "wallet", "fromToken", "toToken", "inputAmount", "inputUsdValue", "selectedQuote", "sortStrategy", "resetQuote", "error", "warning", "setSelectedQuote", "updateQuotePartialState", "useQuoteStore", "slippage", "customSlippage", "affiliatePercent", "affiliateRef", "affiliateWallets", "fetchStatus", "liquiditySources", "disabledLiquiditySources", "excludeLiquiditySources", "findToken", "swapMode", "useSwapMode", "loading", "setLoading", "useState", "prevInputAmount", "useRef", "userSlippage", "shouldSkipRequest", "areTokensEqual", "isPositiveNumber", "resetState", "__name", "fetch", "params", "requestBody", "createQuoteRequestBody", "isRoutingEnabled", "res", "sortQuotes", "sortQuotesBy", "quote", "getDefaultQuote", "throwErrorIfResponseIsNotValid", "quoteWarning", "generateQuoteWarnings", "quoteError", "handleQuoteErrors", "warn", "QuoteErrorType", "debouncedFetch", "useCallback", "debounce", "useEffect", "fetchQuotes", "emitPreventableEvent", "event", "action", "defaultPrevented", "extendedPayload", "eventEmitter", "__name", "MainContainer", "styled", "TIME_TO_NAVIGATE_ANOTHER_PAGE", "Home", "navigate", "useNavigate", "fromToken", "toToken", "inputAmount", "selectedQuote", "refetchQuote", "quoteError", "quoteWarning", "quotes", "setSelectedQuote", "resetQuoteWallets", "setQuoteWarningsConfirmed", "updateQuotePartialState", "useQuoteStore", "isVisibleExpanded", "setIsVisibleExpanded", "useState", "isLargeScreen", "isExtraLargeScreen", "useScreenDetect_default", "fetchQuote", "loading", "useSwapInput", "config", "fetchMetaStatus", "connectedWallets", "customSlippage", "slippage", "setSlippage", "setCustomSlippage", "useAppStore", "isActiveTab", "useUiStore", "showQuoteWarningModal", "setShowQuoteWarningModal", "currentSlippage", "swapMode", "useSwapMode", "slippageValidation", "getSlippageValidation", "swapButtonState", "getSwapButtonState", "isExpandable", "isVariantExpandable", "hasInputs", "BigNumber", "isTokensIdentical", "fetchingQuote", "currentQuoteWarning", "showMessages", "showSwapMetrics", "showSlippageAlerts", "onClickRefresh", "onHandleNavigation", "__name", "route", "onClickOnQuote", "quote", "onChangeSlippage", "SLIPPAGES", "handleInputTokenClick", "mode", "navigationRoutes", "useEffect", "React", "Layout", "Button", "WarningIcon", "emitPreventableEvent", "i18n", "HeaderButtons", "PageContainer", "Inputs", "Divider", "QuoteInfo", "SwapMetrics", "QuoteWarningsAndErrors", "SlippageWarningsAndErrors", "SameTokensWarning", "ExpandedQuotes", "i18n", "Alert", "Divider", "List", "ListItemButton", "Radio", "RadioRoot", "Typography", "React", "useLanguage", "setLanguage", "language", "config", "useAppStore", "languages", "LANGUAGES", "defaultLanguage", "DEFAULT_LANGUAGE", "__name", "LanguagePage", "activeLanguage", "changeLanguage", "languages", "useLanguage", "navigateBack", "useNavigateBack", "languageList", "languageItem", "local", "label", "SVGFlag", "React", "Typography", "Radio", "Layout", "i18n", "PageContainer", "Alert", "Divider", "RadioRoot", "List", "ListItemButton", "__name", "i18n", "Button", "Checkbox", "Image", "ListItemButton", "NotFound", "Typography", "React", "useState", "Checkbox", "Skeleton", "React", "styled", "LiquiditySourceList", "LiquiditySourceSuffix", "NotFoundContainer", "ListItem", "styled", "CustomListItem", "ITEM_SKELETON_COUNT", "LoadingLiquiditySourceList", "React", "LiquiditySourceList", "_", "index", "CustomListItem", "Skeleton", "Checkbox", "__name", "LiquiditySourcePage", "sourceType", "fetchStatus", "useAppStore", "swappers", "disabledLiquiditySources", "searchedFor", "setSearchedFor", "useState", "toggleLiquiditySource", "campaignMode", "supportedUniqueSwappersGroups", "getUniqueSwappersGroups", "types", "i18n", "validTypes", "liquiditySources", "uniqueItem", "hasSelectAll", "sourceItem", "toggleAllSources", "__name", "list", "selected", "groupTitle", "logo", "id", "restSourceItem", "replaceSpacesWithDash", "React", "Image", "Checkbox", "Typography", "handleSearch", "event", "value", "filteredList", "containsText", "Layout", "LiquiditySourceSuffix", "Button", "PageContainer", "SearchInput", "LoadingLiquiditySourceList", "NotFoundContainer", "NotFound", "LiquiditySourceList", "otherProps", "ListItemButton", "i18n", "React", "useNavigate", "RoutesPage", "navigate", "useNavigate", "navigateBack", "useNavigateBack", "selectedQuote", "refetchQuote", "setSelectedQuote", "updateQuotePartialState", "quoteError", "useQuoteStore", "fetchQuote", "fetchingQuote", "useSwapInput", "onClickOnQuote", "__name", "quote", "settings_url", "navigationRoutes", "wallets_url", "React", "Layout", "i18n", "HeaderButtons", "PageContainer", "Quotes", "i18n", "Divider", "getCategoriesCount", "SelectableCategoryList", "React", "useMemo", "useState", "useNavigate", "i18n", "Divider", "Image", "ListItemButton", "NotFound", "Typography", "React", "useEffect", "useState", "filterBlockchains", "__name", "list", "searchedFor", "blockchainCategory", "blockchain", "isBlockchainTypeInCategory", "containsText", "ImageContainer", "styled", "BlockchainListContainer", "styled", "List", "ScrollableArea", "ImageContainer", "ListItem", "Skeleton", "React", "ITEM_SKELETON_COUNT", "LoadingBlockchainList", "React", "List", "e", "ListItem", "Skeleton", "__name", "BlockchainList", "props", "list", "searchedFor", "onChange", "blockchainCategory", "showTitle", "blockchains", "setBlockchains", "useState", "fetchStatus", "useAppStore", "useEffect", "filterBlockchains", "renderList", "__name", "React", "NotFound", "i18n", "List", "item", "ListItemButton", "Image", "Typography", "Divider", "BlockchainListContainer", "LoadingBlockchainList", "SelectBlockchainPage", "props", "type", "navigateBack", "useNavigateBack", "searchedFor", "setSearchedFor", "useState", "blockchainCategory", "setBlockchainCategory", "setToBlockchain", "useQuoteStore", "setFromBlockchain", "setToToken", "fetchStatus", "findNativeToken", "useAppStore", "navigate", "useNavigate", "swapMode", "useSwapMode", "blockchains", "tokens", "filteredBlockchains", "useMemo", "filterBlockchainsWithAtLeastOneToken", "activeCategoriesCount", "getCategoriesCount", "showCategory", "handleBlockchainChange", "__name", "blockchain", "blockchainNativeToken", "React", "Layout", "i18n", "PageContainer", "SelectableCategoryList", "Divider", "SearchInput", "event", "BlockchainList", "i18n", "Divider", "Spinner", "React", "useEffect", "useState", "useNavigate", "i18n", "BlockchainsChip", "Divider", "Image", "Skeleton", "Tooltip", "Typography", "React", "useEffect", "MOST_USED_BLOCKCHAINS", "prepare", "blockchains", "preferredBlockchains", "options", "list", "more", "sortByMostUsedBlockchains", "start", "preferredBlockchainsWithoutMainList", "howManyItemsShouldBeCheckedFromMainList", "i", "blockchain", "preferredBlockchain", "generateSortByPreferredBlockchainsFor", "__name", "a", "b", "mostUsed", "MOST_USED_BLOCKCHAINS", "aIndexInMostUsed", "token", "bIndexInMostUsed", "aIsMostUsed", "bIsMostUsed", "aIndexInPreferred", "bIndexInPreferred", "aIsPreferred", "bIsPreferred", "isInVisibleList", "prepareOutput", "item", "usePrepareBlockchainList", "blockchains", "options", "preferredBlockchains", "addPreferredBlockchain", "useAppStore", "useEffect", "output", "prepare", "isInVisibleList", "__name", "styled", "Blockchains", "NUMBER_OF_LOADING_COMPACT_MODE", "NUMBER_OF_LOADING", "BlockchainsSection", "props", "blockchains", "type", "blockchain", "onChange", "onMoreClick", "showCompactTokenSelector", "useUiStore", "blockchainsList", "usePrepareBlockchainList", "fetchStatus", "useAppStore", "resetToBlockchain", "useQuoteStore", "resetFromBlockchain", "hasMoreItemsInList", "firstItemOfList", "onlyOneItemInList", "showMoreButton", "React", "Divider", "Typography", "i18n", "Blockchains", "_", "index", "Skeleton", "BlockchainsChip", "item", "Tooltip", "getContainer", "Image", "__name", "useCallback", "useRef", "useState", "useSearchCustomTokens", "blockchains", "useAppStore", "abortControllerRef", "useRef", "customTokens", "loading", "setLoading", "useState", "tokens", "setTokens", "error", "setError", "fetch", "__name", "query", "blockchain", "response", "httpService", "customTokensSet", "token", "createAssetKey", "blockchainsSet", "filteredTokens", "debouncedFetch", "useCallback", "debounce", "shouldSearchForCustomTokens", "metaSearchResultTokens", "query", "blockchain", "__name", "prepareTokensList", "tokens", "customTokens", "loading", "modifiedList", "customToken", "SelectSwapItemsPage", "props", "type", "navigate", "useNavigate", "navigateBack", "useNavigateBack", "fromBlockchain", "toBlockchain", "setFromToken", "setToToken", "setFromBlockchain", "setToBlockchain", "useQuoteStore", "getBalanceFor", "useAppStore", "fetch", "loading", "customTokens", "cancel", "useSearchCustomTokens", "searchedFor", "setSearchedFor", "useState", "selectedBlockchain", "selectedBlockchainName", "blockchains", "tokens", "modifiedTokens", "prepareTokensList", "updateBlockchain", "__name", "blockchain", "updateToken", "token", "types", "i18n", "useEffect", "shouldSearchForCustomTokens", "React", "Layout", "PageContainer", "BlockchainsSection", "navigationRoutes", "Divider", "SearchInput", "event", "Spinner", "TokenList", "tokenBlockchain", "chain", "i18n", "Alert", "Button", "styled", "React", "useInRouterContext", "useSearchParams", "i18n", "Alert", "Divider", "InfoIcon", "SlippageIcon", "TextField", "Tooltip", "Typography", "React", "Chip", "styled", "TextField", "BaseContainer", "SlippageChipsContainer", "Head", "SlippageTooltipContainer", "SlippageChip", "i18n", "Typography", "React", "SlippageTooltipContent", "React", "SlippageTooltipContainer", "Typography", "i18n", "__name", "Slippage", "slippage", "setSlippage", "customSlippage", "setCustomSlippage", "useAppStore", "slippageValidation", "getSlippageValidation", "onSlippageValueChange", "__name", "event", "value", "parsedValue", "MAX_SLIPPAGE", "onClickSlippageChip", "slippageItem", "onInput", "input", "isValidCurrencyFormat", "React", "BaseContainer", "Head", "SlippageIcon", "Divider", "Typography", "i18n", "Tooltip", "getContainer", "SlippageTooltipContent", "InfoIcon", "SlippageChipsContainer", "SLIPPAGES", "index", "key", "SlippageChip", "TextField", "Alert", "i18n", "AutoThemeIcon", "BridgesIcon", "ChevronRightIcon", "DarkModeIcon", "Divider", "ExchangeIcon", "InfinityIcon", "InfoIcon", "LanguageIcon", "LightModeIcon", "List", "ListItem", "ListItemButton", "Skeleton", "styled", "Switch", "Tabs", "TargetIcon", "Tooltip", "Typography", "React", "useNavigate", "ThemeSection", "styled", "themesList", "React", "LightModeIcon", "Typography", "i18n", "DarkModeIcon", "AutoThemeIcon", "getThemeIcon", "__name", "theme", "iconProps", "SettingsLists", "navigate", "useNavigate", "themeConfig", "useAppStore", "setTheme", "activeLanguage", "languages", "useLanguage", "currentLanguage", "language", "fetchStatus", "swappers", "disabledLiquiditySources", "features", "customTokens", "isThemeHidden", "isFeatureHidden", "isLiquidityHidden", "isLanguageHidden", "isCustomTokensHidden", "infiniteApprove", "toggleInfiniteApprove", "supportedUniqueSwappersGroups", "getUniqueSwappersGroups", "bridgeSources", "uniqueItem", "totalBridgeSources", "totalSelectedBridgeSources", "exchangeSources", "totalExchangeSources", "totalSelectedExchangeSources", "handleSwapperEndItem", "totalSelected", "total", "Skeleton", "bridgeItem", "Divider", "ChevronRightIcon", "navigationRoutes", "BridgesIcon", "exchangeItem", "ExchangeIcon", "customTokensItem", "TargetIcon", "languageItem", "LanguageIcon", "infiniteApprovalItem", "Tooltip", "getContainer", "SlippageTooltipContainer", "InfoIcon", "InfinityIcon", "Switch", "themeItem", "ListItem", "Tabs", "item", "settingItems", "List", "ListItemButton", "ResetAction", "styled", "SettingsPage", "isInCampaignMode", "updateCampaignMode", "useAppStore", "campaignMode", "setSearchParams", "useSearchParams", "isRouterInContext", "useInRouterContext", "onClick", "__name", "prev", "React", "Layout", "i18n", "PageContainer", "Alert", "Button", "Slippage", "SettingsLists", "i18n", "cancelSwap", "useManager", "Alert", "React", "useParams", "i18n", "getCurrentNamespaceOfOrNull", "getCurrentStep", "getRelatedWalletOrNull", "Button", "Divider", "QuoteCost", "StepDetails", "Typography", "useWallets", "BigNumber", "PendingSwapNetworkStatus", "React", "useEffect", "useRef", "useState", "useNavigate", "i18n", "daysOfWeek", "i18n", "timeSince", "millisecond", "date", "day", "month", "year", "__name", "getSwapDate", "pendingSwap", "React", "i18n", "Button", "Divider", "MessageBox", "React", "CancelContent", "__name", "onCancel", "onClose", "React", "Divider", "MessageBox", "i18n", "Button", "i18n", "Button", "Divider", "MessageBox", "Typography", "React", "DeleteContent", "__name", "onDelete", "onClose", "React", "Divider", "MessageBox", "i18n", "Button", "Typography", "i18n", "Button", "Divider", "MessageBox", "React", "NetworkStateContent", "__name", "props", "switchNetworkModalState", "handleSwitchNetwork", "React", "MessageBox", "Divider", "Button", "i18n", "getCurrentNamespaceOfOrNull", "getCurrentStep", "getRelatedWalletOrNull", "WalletState", "useWallets", "React", "i18n", "Alert", "Button", "Checkbox", "Divider", "Image", "MessageBox", "Spinner", "WarningIcon", "useWallets", "React", "useState", "css", "darkTheme", "styled", "wordWrap", "ProfileBanner", "WalletIcon", "WalletIconBadgeContainer", "ConnectWalletContent", "__name", "props", "currentStepWallet", "namespace", "onClose", "error", "setError", "useState", "list", "useWalletList", "isActiveTab", "useUiStore", "state", "connect", "useWallets", "wallet", "namespaceData", "walletState", "namespaceState", "connecting", "connected", "getButtonTitle", "i18n", "getNamespaceSuffix", "React", "Spinner", "Checkbox", "handleConnect", "handleClickButton", "getAddress", "firstAccountArray", "address", "getConciseAddress", "MessageBox", "WalletIcon", "Image", "WalletIconBadgeContainer", "WarningIcon", "Divider", "Alert", "NamespaceItem", "Button", "i18n", "Button", "Divider", "Image", "MessageBox", "WarningIcon", "useWallets", "detectInstallLink", "React", "InstallWalletContent", "__name", "props", "walletType", "getWalletInfo", "useWallets", "walletInfo", "handleButtonClick", "detectInstallLink", "React", "MessageBox", "i18n", "WalletIcon", "Image", "WalletIconBadgeContainer", "WarningIcon", "Divider", "Button", "WalletStateContent", "__name", "props", "swap", "onClose", "state", "getWalletInfo", "useWallets", "currentStep", "getCurrentStep", "currentStepWallet", "getRelatedWalletOrNull", "walletType", "walletState", "getWalletConnectionStatus", "currentNamespace", "getCurrentNamespaceOfOrNull", "WalletState", "React", "InstallWalletContent", "ConnectWalletContent", "SwapDetailsModal", "props", "isOpen", "state", "switchNetworkModalState", "onClose", "onDelete", "onCancel", "swap", "message", "handleSwitchNetwork", "React", "WatermarkedModal", "getContainer", "WalletStateContent", "NetworkStateContent", "DeleteContent", "CancelContent", "__name", "i18n", "Button", "Divider", "MessageBox", "TokenAmount", "Typography", "React", "Link", "useNavigate", "PROFILE_BANNER_IMAGE_SOURCE", "PROFILE_BANNER_NAVIGATION_LINK", "SwapDetailsCompleteModal", "props", "open", "onClose", "status", "priceValue", "usdValue", "realUsdValue", "realValue", "token", "chain", "percentageChange", "description", "diagnosisUrl", "navigate", "useNavigate", "showProfileBanner", "useUiStore", "React", "WatermarkedModal", "WIDGET_UI_ID", "MessageBox", "i18n", "TokenAmount", "getContainer", "Divider", "Typography", "wordWrap", "Link", "PROFILE_BANNER_NAVIGATION_LINK", "ProfileBanner", "PROFILE_BANNER_IMAGE_SOURCE", "Button", "__name", "i18n", "CopyIcon", "DoneIcon", "IconButton", "RangoExplorerIcon", "Tooltip", "Typography", "useCopyToClipboard", "React", "React", "i18n", "Alert", "IconButton", "LinkIcon", "React", "Fragment", "Alert", "ChevronDownIcon", "IconButton", "React", "useState", "css", "darkTheme", "styled", "Typography", "Container", "styled", "PageContainer", "darkTheme", "SkeletonContainer", "RequestIdContainer", "StepsList", "Alerts", "PlaceholderContainer", "LoaderContainer", "rowStyles", "css", "datePlaceholderStyles", "requestIdStyles", "outputStyles", "titleStepsStyles", "StyledLink", "ErrorMessages", "MessageText", "Typography", "styled", "Alerts", "ActionIcon", "AlertFooter", "FailedAlert", "props", "message", "showContentError", "setShowContentError", "useState", "React", "Alert", "IconButton", "prev", "ActionIcon", "ChevronDownIcon", "AlertFooter", "MessageText", "__name", "i18n", "Alert", "Button", "PendingSwapNetworkStatus", "React", "WarningAlert", "props", "switchNetworkIsAvailable", "handleSwitchNetworkClick", "setNetworkModal", "message", "showNetworkModal", "React", "Alert", "Button", "i18n", "PendingSwapNetworkStatus", "__name", "SwapDetailsAlerts", "props", "switchNetworkIsAvailable", "handleSwitchNetworkClick", "showNetworkModal", "setNetworkModal", "message", "step", "hasAlreadyProceededToSign", "hasWarning", "isNetworkStatusInWarningState", "waitingForApproval", "inProgress", "waitingProgress", "React", "Alerts", "explorerUrl", "index", "urls", "key", "lastUrl", "loading", "error", "Fragment", "Alert", "i18n", "IconButton", "LinkIcon", "WarningAlert", "FailedAlert", "__name", "RESET_INTERVAL", "getSteps", "__name", "swap", "blockchains", "swappers", "args", "hasAlreadyProceededToSign", "step", "index", "amountToConvert", "getBlockchainShortNameFor", "numberToString", "getSwapperDisplayName", "internalSwap", "React", "SwapDetailsAlerts", "getStepState", "isNetworkStatusInWarningState", "RequestIdRow", "props", "requestId", "isCopied", "handleCopy", "useCopyToClipboard", "RESET_INTERVAL", "React", "RequestIdContainer", "rowStyles", "Typography", "i18n", "requestIdStyles", "Tooltip", "getContainer", "IconButton", "DoneIcon", "CopyIcon", "StyledLink", "SCANNER_BASE_URL", "RangoExplorerIcon", "__name", "i18n", "Typography", "React", "SwapDateRow", "props", "date", "isFinished", "React", "rowStyles", "Typography", "i18n", "__name", "SUCCESS_SWITCH_NETWORK_MODAL_CLOSE_DELAY", "SwapDetails", "props", "swap", "requestId", "onDelete", "onCancel", "canSwitchNetworkTo", "connect", "getWalletInfo", "useWallets", "blockchains", "useAppStore", "swappers", "findToken", "retry", "useQuoteStore", "navigate", "useNavigate", "containerRef", "useRef", "isModalOpen", "setIsModalOpen", "useState", "modalState", "setModalState", "switchNetworkModalState", "setSwitchNetworkModalState", "showCompletedModal", "setShowCompletedModal", "modalStateRef", "switchNetworkModalStateRef", "getNotifications", "useNotificationStore", "removeNotification", "notifications", "currentStep", "getCurrentStep", "currentStepNetworkStatus", "handleChangeModalState", "__name", "state", "handleCloseModal", "handleShowSwitchNetworkLoading", "i18n", "currentStepNamespace", "handleShowSwitchNetworkSucceeded", "handleShowSwitchNetworkFailed", "error", "stepMessage", "lastConvertedTokenInFailedSwap", "getLastConvertedTokenInFailedSwap", "getCurrentNamespaceOfOrNull", "currentStepWallet", "getRelatedWalletOrNull", "swapDate", "getSwapDate", "shouldRetry", "shouldRetrySwap", "checkIsMobileWallet", "walletType", "stepIsBlockedForSwitchNetwork", "PendingSwapNetworkStatus", "isMobileWallet", "canSwitchNetworkToRequiredNetwork", "switchNetworkIsAvailable", "handleSwitchNetwork", "handleSwitchNetworkClick", "getSwapMessages", "steps", "getSteps", "numberOfSteps", "firstStep", "lastStep", "outputAmount", "totalFee", "diagnosisUrl", "step", "outputUsdValue", "numberToString", "inputUsdValue", "realOutputUsdValue", "BigNumber", "realInputUsdValue", "percentageChange", "getPriceImpact", "stepDetailMessage", "completeModalDesc", "getConciseAddress", "React", "ErrorMessages", "Typography", "MessageText", "useEffect", "n", "timeout", "Layout", "SuffixContainer", "Button", "swapInput", "createRetryQuote", "Container", "RequestIdRow", "SwapDateRow", "outputStyles", "QuoteCost", "roundedSecondsToString", "totalArrivalTime", "QuoteSummary", "getPriceImpactLevel", "titleStepsStyles", "Divider", "StepsList", "index", "key", "getStepState", "isFocused", "StepDetails", "getContainer", "SwapDetailsModal", "SwapDetailsCompleteModal", "i18n", "Divider", "NotFound", "Skeleton", "Typography", "React", "i18n", "Divider", "Skeleton", "Typography", "React", "css", "styled", "Container", "StepContainer", "StepSeparator", "quoteSummaryItemStyles", "costStyles", "quoteSummaryStyles", "quoteSummarySeparatorStyles", "swapsStepsStyles", "stepTitleStyles", "stepTokensStyles", "stepInfoStyles", "stepIconStyles", "extraInfoStyles", "LoadingSwapDetails", "React", "Container", "QuoteSummarySkeleton", "Typography", "i18n", "StepContainer", "StepSkeleton", "extraInfoStyles", "Divider", "Skeleton", "StepSeparator", "__name", "SwapDetailsPlaceholder", "props", "requestId", "showSkeleton", "React", "Layout", "i18n", "SuffixContainer", "SkeletonContainer", "rowStyles", "Typography", "requestIdStyles", "Skeleton", "Divider", "datePlaceholderStyles", "LoadingSwapDetails", "PlaceholderContainer", "NotFound", "__name", "SwapDetailsPage", "manager", "state", "useManager", "loading", "pendingSwaps", "getPendingSwaps", "requestId", "useParams", "navigateBack", "useNavigateBack", "fetchMetaStatus", "useAppStore", "React", "Alert", "i18n", "showSkeleton", "selectedSwap", "swap", "onCancel", "__name", "cancelSwap", "onDelete", "e", "SwapDetailsPlaceholder", "SwapDetails", "i18n", "Divider", "getCategoriesCount", "SelectableCategoryList", "styled", "Typography", "Wallet", "React", "useState", "ListContainer", "styled", "Container", "PageContainer", "WalletsPage", "fetchMetaStatus", "useAppStore", "blockchainCategory", "setBlockchainCategory", "useState", "blockchains", "config", "selectedWalletToConnect", "setSelectedWalletToConnect", "isActiveTab", "useUiStore", "list", "useWalletList", "filteredBlockchains", "filterBlockchainsByWalletTypes", "showCategory", "getCategoriesCount", "filteredWallets", "filterWalletsByCategory", "handleWalletItemClick", "__name", "wallet", "isSingleWalletActive", "React", "Layout", "i18n", "SelectableCategoryList", "Divider", "Typography", "index", "key", "Wallet", "getContainer", "StatefulConnectModal", "AppRoutes", "useSyncStoresWithConfig", "useSyncUrlAndStore", "useRoutes", "navigationRoutes", "React", "Home", "RoutesPage", "SelectSwapItemsPage", "SelectBlockchainPage", "SettingsPage", "LanguagePage", "LiquiditySourcePage", "CustomTokensPage", "AddCustomTokenPage", "HistoryPage", "SwapDetailsPage", "WalletsPage", "ConfirmSwapPage", "__name", "useQueueManager", "isEvmBlockchain", "useContext", "useEffect", "useState", "Provider", "React", "createContext", "useEffect", "useMemo", "useRef", "useEffect", "Provider", "hashProviders", "providers", "provider", "Provider", "__name", "useWalletProviders", "configWallets", "options", "clearConnectedWallet", "getAvailableProviders", "buildAndSetProviders", "useAppStore", "providers", "useEffect", "hashProviders", "__name", "formatAddressWithNetwork", "readAccountAddress", "Events", "isEvmBlockchain", "useUpdates", "params", "newWalletConnected", "disconnectWallet", "disconnectNamespaces", "connectedWallets", "removeBalancesForWallet", "blockchains", "useAppStore", "onConnectWalletHandler", "onDisconnectWalletHandler", "evmBasedChainNames", "isEvmBlockchain", "chain", "onAccountsEvent", "__name", "event", "type", "value", "state", "info", "walletFromEvent", "data", "prepareAccountsForWalletStore", "handleUpdatesForHub", "Events", "supportedChainNames", "walletAndSupportedChainsNames", "handleUpdatesForLegacy", "evmAccounts", "nonEvmAccounts", "account", "network", "readAccountAddress", "wallet", "formatAddressWithNetwork", "handleUpdatesForBoth", "_info", "LegacyEvents", "propagateEvents", "cb", "eventParams", "walletType", "event", "value", "coreState", "info", "LegacyEvents", "__name", "WidgetContext", "createContext", "Main", "props", "updateConfig", "updateSettings", "fetchMeta", "fetchStatus", "useAppStore", "blockchains", "config", "walletOptions", "providers", "useWalletProviders", "onConnectWalletHandler", "useRef", "onDisconnectWalletHandler", "handleEvent", "useUpdates", "useEffect", "isActiveTab", "useUiStore", "handlers", "useMemo", "handler", "React", "Provider", "type", "event", "value", "state", "info", "eventParams", "propagateEvents", "__name", "WidgetWallets", "otherProps", "AppStoreProvider", "globalCss", "globalFont", "__name", "globalCss", "useWallets", "useEffect", "useRef", "useForceAutoConnect", "connect", "state", "useWallets", "initiated", "useRef", "fetchStatus", "useAppStore", "walletType", "walletState", "useEffect", "__name", "isApprovalTX", "RouteEventType", "StepEventType", "StepExecutionEventStatus", "WidgetEvents", "useEffect", "useSubscribeToWidgetEvents", "setNotification", "useNotificationStore", "connectedWallets", "fetchBalances", "getCustomTokens", "useAppStore", "useEffect", "handleStepEvent", "__name", "widgetEvent", "event", "step", "route", "StepEventType", "StepExecutionEventStatus", "isApprovalTX", "fetchBalanceAccounts", "fromWallet", "fromAccount", "connectedWallet", "toWallet", "toAccount", "customTokens", "selectedCustomTokens", "asset", "token", "eventEmitter", "WidgetEvents", "handleRouteEvent", "RouteEventType", "useManager", "useEffect", "useSyncNotifications", "isSynced", "syncNotifications", "useNotificationStore", "manager", "state", "useManager", "useEffect", "getPendingSwaps", "__name", "useBootstrap", "useForceAutoConnect", "globalFont", "useSubscribeToWidgetEvents", "useSyncNotifications", "blockchains", "useAppStore", "canSwitchNetworkTo", "useWallets", "lastConnectedWallet", "setLastConnectedWallet", "useState", "disconnectedWallet", "setDisconnectedWallet", "widgetContext", "useContext", "WidgetContext", "evmChains", "isEvmBlockchain", "useEffect", "unsubscribeSwapQuoteStore", "unsubscribeRefuelQuoteStore", "useQueueManager", "tabManager", "useNotificationStore", "walletFromEvent", "lastConnectedWalletClone", "walletType", "__name", "styled", "MainContainer", "Main", "useBootstrap", "config", "useAppStore", "activeTheme", "useTheme", "activeLanguage", "useLanguage", "React", "I18nManager", "MainContainer", "AppRoutes", "__name", "setSolanaSignerConfig", "React", "useEffect", "useMemo", "useFetchApiConfig", "setWatermark", "setShowProfileBanner", "useUiStore", "__name", "response", "getConfig", "data", "useState", "useFontLoader", "__name", "fontLink", "setFontLink", "useState", "loadFont", "fontUrl", "link", "unloadFont", "fontName", "getFontUrlByName", "newFontLink", "useFontLoader_default", "checkWaitingForNetworkChange", "makeQueueDefinition", "ManagerProvider", "useWallets", "convertEvmBlockchainMetaToEvmChainInfo", "isEvmBlockchain", "React", "useMemo", "QueueManager", "props", "providers", "getSigners", "state", "connect", "canSwitchNetworkTo", "getWalletInfo", "hubProvider", "useWallets", "swapQueueDef", "useMemo", "makeQueueDefinition", "getConfig", "eventEmitter", "blockchains", "connectedWallets", "useAppStore", "blockchainsList", "wallets", "wallet", "switchNetwork", "__name", "namespace", "isMobileWallet", "walletType", "allBlockchains", "blockchain", "blockchainsObj", "evmBasedChains", "isEvmBlockchain", "getSupportedChainNames", "type", "supportedChains", "walletAndSupportedChainsNames", "allProviders", "context", "convertEvmBlockchainMetaToEvmChainInfo", "isActiveTab", "useUiStore", "React", "ManagerProvider", "manager", "checkWaitingForNetworkChange", "QueueManager_default", "useManager", "React", "createContext", "useContext", "useUpdateQuoteInputs", "findToken", "useAppStore", "blockchains", "tokens", "setFromBlockchain", "setFromToken", "setToBlockchain", "setToToken", "setInputAmount", "useQuoteStore", "__name", "params", "fromBlockchain", "fromToken", "toBlockchain", "toToken", "requestAmount", "meta", "blockchainMeta", "blockchain", "token", "cancelSwap", "getCurrentNamespaceOfOrNull", "getCurrentStep", "getRelatedWalletOrNull", "WidgetHistory", "__name", "manager", "actions", "getPendingSwaps", "swap", "meta", "retryQuote", "createRetryQuote", "id", "queue", "cancelSwap", "currentStep", "getCurrentStep", "getRelatedWalletOrNull", "getCurrentNamespaceOfOrNull", "WidgetInfoContext", "createContext", "WidgetInfo", "props", "manager", "useManager", "isActiveTab", "useUiStore", "retrySwap", "useQuoteStore", "findToken", "getBalances", "getConnectedWalletsDetails", "refetch", "useAppStore", "history", "WidgetHistory", "isLoading", "totalBalance", "calculateWalletUsdValue", "blockchains", "tokens", "swappers", "loadingStatus", "resetLanguage", "useLanguage", "notifications", "useNotificationStore", "clearNotifications", "updateQuoteInputs", "useUpdateQuoteInputs", "fromBlockchain", "toBlockchain", "fromToken", "toToken", "inputAmount", "value", "tabManager", "accounts", "React", "__name", "useWidget", "context", "useContext", "WidgetProvider", "props", "onUpdateState", "config", "fontFamily", "fetchApiConfig", "useFetchApiConfig", "handleLoadCustomFont", "useFontLoader_default", "useEffect", "useMemo", "initConfig", "RANGO_PUBLIC_API_KEY", "DEFAULT_BASE_URL", "setSolanaSignerConfig", "React", "WidgetWallets", "QueueManager_default", "WidgetInfo", "__name", "Refuel", "props", "isExternalWalletsEnabled", "React", "AppRouter", "Main", "WidgetProvider", "DEFAULT_CONFIG", "__name", "React", "Widget", "props", "isExternalWalletsEnabled", "React", "AppRouter", "Main", "WidgetProvider", "DEFAULT_CONFIG", "__name", "useWidgetEvents", "on", "off", "eventEmitter", "__name", "StatefulConnect", "DerivationPath", "Namespaces", "Detached", "isOnDerivationPath", "isOnNamespace", "isOnDetached"]
|
|
7
|
+
}
|