@rango-dev/widget-embedded 0.12.1-next.21 → 0.12.1-next.22

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (42) hide show
  1. package/dist/components/BlockchainsChip/BlockchainsChip.styles.d.ts.map +1 -1
  2. package/dist/components/ConfirmWalletsModal/ConfirmWallets.styles.d.ts.map +1 -1
  3. package/dist/components/ConfirmWalletsModal/ConfirmWalletsModal.d.ts.map +1 -1
  4. package/dist/components/HeaderButtons/HeaderButtons.styles.d.ts +2 -283
  5. package/dist/components/HeaderButtons/HeaderButtons.styles.d.ts.map +1 -1
  6. package/dist/components/HeaderButtons/HeaderButtons.types.d.ts +1 -0
  7. package/dist/components/HeaderButtons/HeaderButtons.types.d.ts.map +1 -1
  8. package/dist/components/HeaderButtons/HomeButtons.d.ts.map +1 -1
  9. package/dist/components/HeaderButtons/WalletButton.d.ts.map +1 -1
  10. package/dist/components/Layout/Layout.d.ts.map +1 -1
  11. package/dist/components/SettingsContainer/SettingsContainer.style.d.ts +0 -153
  12. package/dist/components/SettingsContainer/SettingsContainer.style.d.ts.map +1 -1
  13. package/dist/components/SettingsContainer/index.d.ts +1 -1
  14. package/dist/components/SettingsContainer/index.d.ts.map +1 -1
  15. package/dist/components/Slippage/Slippage.d.ts.map +1 -1
  16. package/dist/components/SwapDetails/SwapDetails.styles.d.ts.map +1 -1
  17. package/dist/components/SwapDetailsModal/SwapDetailsModal.WalletState.d.ts.map +1 -1
  18. package/dist/index.js +1 -1
  19. package/dist/index.js.map +4 -4
  20. package/dist/pages/ConfirmSwapPage.d.ts.map +1 -1
  21. package/dist/pages/LiquiditySourcePage.d.ts.map +1 -1
  22. package/dist/pages/WalletsPage.d.ts.map +1 -1
  23. package/dist/utils/common.d.ts +1 -0
  24. package/dist/utils/common.d.ts.map +1 -1
  25. package/package.json +2 -2
  26. package/src/components/BlockchainsChip/BlockchainsChip.styles.ts +16 -4
  27. package/src/components/ConfirmWalletsModal/ConfirmWallets.styles.ts +42 -4
  28. package/src/components/ConfirmWalletsModal/ConfirmWalletsModal.tsx +1 -0
  29. package/src/components/HeaderButtons/HeaderButtons.styles.ts +2 -2
  30. package/src/components/HeaderButtons/HeaderButtons.types.ts +1 -0
  31. package/src/components/HeaderButtons/HomeButtons.tsx +18 -5
  32. package/src/components/HeaderButtons/WalletButton.tsx +4 -1
  33. package/src/components/Layout/Layout.tsx +2 -0
  34. package/src/components/SettingsContainer/SettingsContainer.style.ts +0 -6
  35. package/src/components/SettingsContainer/index.ts +0 -1
  36. package/src/components/Slippage/Slippage.tsx +5 -1
  37. package/src/components/SwapDetails/SwapDetails.styles.ts +7 -2
  38. package/src/components/SwapDetailsModal/SwapDetailsModal.WalletState.tsx +3 -0
  39. package/src/pages/ConfirmSwapPage.tsx +8 -1
  40. package/src/pages/LiquiditySourcePage.tsx +1 -2
  41. package/src/pages/WalletsPage.tsx +2 -0
  42. package/src/utils/common.ts +3 -0
package/dist/index.js.map CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
- "sources": ["../src/Widget.tsx", "../src/components/AppRouter.tsx", "../src/constants/navigationRoutes.ts", "../src/pages/Home.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/HomeButtons.tsx", "../src/components/NotificationContent/NotificationContent.tsx", "../src/store/meta.ts", "../src/services/httpService.ts", "../src/utils/configs.ts", "../src/utils/common.ts", "../src/utils/wallets.ts", "../src/constants/numbers.ts", "../src/constants/wallets.ts", "../src/utils/numbers.ts", "../src/store/selectors.ts", "../src/store/wallets.ts", "../src/store/bestRoute.ts", "../src/utils/routing.ts", "../src/utils/swap.ts", "../src/components/ConfirmWalletsModal/ConfirmWallets.helpers.ts", "../src/constants/errors.ts", "../src/types/routing.ts", "../src/constants/messages.ts", "../src/store/notification.ts", "../src/store/ui.ts", "../src/components/NotificationContent/NotificationContent.styles.ts", "../src/components/NotificationContent/NotificationNotFound.tsx", "../src/components/HeaderButtons/UnreadNotificationsBadge.tsx", "../src/components/Layout/Layout.tsx", "../src/components/Layout/Layout.styles.ts", "../src/components/NoRoutes/NoRoutes.tsx", "../src/store/settings.ts", "../src/constants/swapSettings.ts", "../src/components/NoRoutes/NoRoutes.helper.ts", "../src/components/NoRoutes/NoRoutes.styles.ts", "../src/components/RouteErrors/RouteErrors.tsx", "../src/components/RouteErrors/RouteErrors.styles.ts", "../src/components/RouteErrors/RouteErrorsModal.tsx", "../src/components/RouteErrors/RouteErrorsModalItem.tsx", "../src/components/SwitchFromAndTo.tsx", "../src/hooks/useSwapInput.ts", "../src/hooks/useFetchBestRoute.ts", "../src/components/UpdateUrl.tsx", "../src/components/AppRoutes.tsx", "../src/pages/ConfirmSwapPage.tsx", "../src/components/ConfirmWalletsModal/ConfirmWalletsModal.tsx", "../src/constants/warnings.ts", "../src/components/ConfirmWalletsModal/ConfirmWallets.styles.ts", "../src/components/ConfirmWalletsModal/WalletList.tsx", "../src/hooks/useWalletList.ts", "../src/utils/providers.ts", "../src/pages/WalletsPage.tsx", "../src/components/WalletModal/WalletModal.tsx", "../src/components/WalletModal/WalletModalContent.tsx", "../src/components/WalletModal/WalletModalContent.styles.ts", "../src/hooks/useNavigateBack.ts", "../src/utils/meta.ts", "../src/components/ConfirmWalletsModal/WalletList.styles.ts", "../src/hooks/useConfirmSwap.ts", "../src/pages/HistoryPage.tsx", "../src/components/SearchInput/SearchInput.tsx", "../src/components/SearchInput/SearchInput.styles.ts", "../src/components/SwapsGroup/SwapsGroup.tsx", "../src/components/SwapsGroup/SwapsGroup.styles.ts", "../src/utils/date.ts", "../src/utils/queue.ts", "../src/pages/LanguagePage.tsx", "../src/components/SettingsContainer/SettingsContainer.style.ts", "../src/pages/LiquiditySourcePage.tsx", "../src/components/LoadingLiquiditySourceList/LoadingLiquiditySourceList.tsx", "../src/components/LoadingLiquiditySourceList/LoadingLiquiditySourceList.styles.ts", "../src/utils/settings.ts", "../src/pages/SelectBlockchainPage.tsx", "../src/components/BlockchainList/BlockchainList.tsx", "../src/components/BlockchainList/BlockchainList.helpers.ts", "../src/components/SelectableCategoryList/SelectableCategoryList.types.ts", "../src/components/BlockchainList/BlockchainList.styles.ts", "../src/components/BlockchainList/LoadingBlockchainList.tsx", "../src/components/SelectableCategoryList/SelectableCategoryList.tsx", "../src/components/BlockchainsChip/BlockchainsChip.tsx", "../src/components/BlockchainsChip/BlockchainsChip.styles.ts", "../src/components/SelectableCategoryList/SelectableCategoryList.helpers.ts", "../src/components/SelectableCategoryList/SelectableCategoryList.styles.ts", "../src/pages/SelectSwapItemsPage.tsx", "../src/components/BlockchainsSection/BlockchainsSection.tsx", "../src/components/BlockchainsSection/BlockchainSection.helpers.ts", "../src/components/BlockchainsSection/BlockchainsSection.styles.ts", "../src/components/TokenList/TokenList.tsx", "../src/components/TokenList/LoadingTokenList.tsx", "../src/components/TokenList/TokenList.styles.ts", "../src/components/TokenList/TokenList.helpers.ts", "../src/pages/SettingsPage.tsx", "../src/components/Slippage/Slippage.tsx", "../src/components/Slippage/Slippage.styles.ts", "../src/components/Slippage/SlippageTooltipContent.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.helpers.tsx", "../src/components/SwapDetailsModal/SwapDetailsModal.WalletState.tsx", "../src/components/SwapDetailsModal/SwapDetailsModal.styles.ts", "../src/components/SwapDetailsModal/SwapDetailsCompleteModal.tsx", "../src/components/SwapDetails/SwapDetails.helpers.tsx", "../src/components/SwapDetailsAlerts/SwapDetailsAlerts.tsx", "../src/components/SwapDetailsAlerts/SwapDetailsAlerts.Failed.tsx", "../src/components/SwapDetailsAlerts/SwapDetailsAlerts.styles.ts", "../src/components/SwapDetailsAlerts/SwapDetailsAlerts.Warning.tsx", "../src/components/SwapDetails/SwapDetails.styles.ts", "../src/components/SwapDetails/SwapDetails.Placeholder.tsx", "../src/components/LoadingSwapDetails/LoadingSwapDetails.tsx", "../src/components/LoadingSwapDetails/LoadingSwapDetails.styles.ts", "../src/components/LoadingSwapDetails/LoadingSwapDetailStep.tsx", "../src/pages/ThemePage.tsx", "../src/components/WidgetEvents.tsx", "../src/types/notification.ts", "../src/globalStyles.ts", "../src/hooks/useTheme.ts", "../src/QueueManager.tsx", "../src/Wallets.tsx", "../src/hooks/useWalletProviders.ts", "../src/index.ts"],
4
- "sourcesContent": ["import type { WidgetConfig } from './types';\nimport type { WalletType } from '@rango-dev/wallets-shared';\nimport type { PropsWithChildren } from 'react';\n\nimport { I18nManager, styled } from '@rango-dev/ui';\nimport React, { useContext, useEffect, useMemo, useState } from 'react';\n\nimport { AppRouter } from './components/AppRouter';\nimport { AppRoutes } from './components/AppRoutes';\nimport { WidgetEvents } from './components/WidgetEvents';\nimport { globalFont } from './globalStyles';\nimport { useTheme } from './hooks/useTheme';\nimport QueueManager from './QueueManager';\nimport { useBestRouteStore } from './store/bestRoute';\nimport { useMetaStore } from './store/meta';\nimport { useNotificationStore } from './store/notification';\nimport { useSettingsStore } from './store/settings';\nimport { initConfig } from './utils/configs';\nimport { tokensAreEqual } from './utils/wallets';\nimport { WidgetContext, WidgetWallets } from './Wallets';\n\nconst MainContainer = styled('div', {\n width: '100%',\n display: 'flex',\n justifyContent: 'center',\n alignItems: 'center',\n fontFamily: '$widget',\n boxSizing: 'border-box',\n '& *, *::before, *::after': {\n boxSizing: 'inherit',\n listStyleType: 'none',\n },\n});\n\nexport type WidgetProps = {\n config?: WidgetConfig;\n};\n\nexport function Main(props: PropsWithChildren<WidgetProps>) {\n const { config } = props;\n globalFont();\n\n const { activeTheme } = useTheme(config?.theme || {});\n const [lastConnectedWalletWithNetwork, setLastConnectedWalletWithNetwork] =\n useState<string>('');\n const [disconnectedWallet, setDisconnectedWallet] = useState<WalletType>();\n const widgetContext = useContext(WidgetContext);\n\n useMemo(() => {\n if (config?.apiKey) {\n initConfig({\n API_KEY: config?.apiKey,\n });\n }\n }, [config]);\n\n useEffect(() => {\n void useSettingsStore.persist.rehydrate();\n void useNotificationStore.persist.rehydrate();\n widgetContext.onConnectWallet(setLastConnectedWalletWithNetwork);\n }, []);\n\n const {\n setInputAmount,\n setToToken,\n setToBlockchain,\n setFromBlockchain,\n setFromToken,\n } = useBestRouteStore();\n\n const {\n meta: { tokens, blockchains },\n loadingStatus: loadingMetaStatus,\n } = useMetaStore();\n\n const { setAffiliateRef, setAffiliatePercent, setAffiliateWallets } =\n useSettingsStore();\n\n useEffect(() => {\n setInputAmount(config?.amount?.toString() || '');\n }, [config?.amount]);\n\n useEffect(() => {\n if (loadingMetaStatus === 'success') {\n const chain = blockchains.find(\n (chain) => chain.name === config?.from?.blockchain\n );\n const token = tokens.find((t) =>\n tokensAreEqual(t, config?.from?.token || null)\n );\n\n setFromBlockchain(chain || null);\n setFromToken(token || null);\n }\n }, [config?.from?.token, config?.from?.blockchain, loadingMetaStatus]);\n\n useEffect(() => {\n if (loadingMetaStatus === 'success') {\n const chain = blockchains.find(\n (chain) => chain.name === config?.to?.blockchain\n );\n const token = tokens.find((t) =>\n tokensAreEqual(t, config?.to?.token || null)\n );\n setToBlockchain(chain || null);\n setToToken(token || null);\n }\n }, [config?.to?.token, config?.to?.blockchain, loadingMetaStatus]);\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 return (\n <I18nManager language={config?.language}>\n <MainContainer id=\"swap-container\" className={activeTheme}>\n <QueueManager>\n <WidgetEvents />\n <AppRouter\n lastConnectedWallet={lastConnectedWalletWithNetwork}\n disconnectedWallet={disconnectedWallet}\n clearDisconnectedWallet={() => {\n setDisconnectedWallet(undefined);\n }}>\n <AppRoutes config={config} />\n </AppRouter>\n </QueueManager>\n </MainContainer>\n </I18nManager>\n );\n}\n\nexport function Widget(props: PropsWithChildren<WidgetProps>) {\n if (!props.config?.externalWallets) {\n return (\n <WidgetWallets\n providers={props.config?.wallets}\n options={{\n walletConnectProjectId: props.config?.walletConnectProjectId,\n }}>\n <Main {...props} />\n </WidgetWallets>\n );\n }\n return <Main {...props} />;\n}\n", "import type { WalletType } from '@rango-dev/wallets-shared';\nimport type { PropsWithChildren } from 'react';\n\nimport { useQueueManager } from '@rango-dev/queue-manager-rango-preset';\nimport { useWallets } from '@rango-dev/wallets-react';\nimport { isEvmBlockchain } from 'rango-types';\nimport React, { useEffect, useRef } from 'react';\nimport { MemoryRouter, useInRouterContext } from 'react-router';\nimport { useLocation, useNavigate } from 'react-router-dom';\n\nimport { navigationRoutes } from '../constants/navigationRoutes';\nimport { Home } from '../pages/Home';\nimport { useMetaStore } from '../store/meta';\n\nimport { UpdateUrl } from './UpdateUrl';\n\nfunction Route(props: PropsWithChildren) {\n const location = useLocation();\n const navigate = useNavigate();\n const ref = useRef(true);\n\n useEffect(() => {\n if (\n location.pathname === '/' + navigationRoutes.confirmSwap &&\n ref.current\n ) {\n navigate(navigationRoutes.home + location.search, { state: 'redirect' });\n }\n\n ref.current = false;\n }, []);\n\n if (location.pathname === '/' + navigationRoutes.confirmSwap && ref.current) {\n return <Home />;\n }\n\n return <> {props.children}</>;\n}\n\nexport function AppRouter({\n children,\n ...props\n}: PropsWithChildren & {\n lastConnectedWallet: string;\n disconnectedWallet: WalletType | undefined;\n clearDisconnectedWallet: () => void;\n}) {\n const isRouterInContext = useInRouterContext();\n const Router = isRouterInContext ? Route : MemoryRouter;\n const { blockchains } = useMetaStore.use.meta();\n const { canSwitchNetworkTo } = useWallets();\n\n const evmChains = blockchains.filter(isEvmBlockchain);\n\n useQueueManager({\n lastConnectedWallet: props.lastConnectedWallet,\n clearDisconnectedWallet: props.clearDisconnectedWallet,\n disconnectedWallet: props.disconnectedWallet,\n evmChains,\n canSwitchNetworkTo,\n });\n\n return (\n <>\n <Router>{children}</Router>\n {isRouterInContext && <UpdateUrl />}\n </>\n );\n}\n", "export const navigationRoutes = {\n home: '/',\n fromSwap: 'from-swap',\n fromBlockchain: '/from-swap/blockchains',\n toBlockchain: '/to-swap/blockchains',\n toSwap: 'to-swap',\n settings: 'settings',\n liquiditySources: '/settings/liquidity-sources',\n themes: '/settings/themes',\n bridges: '/settings/bridges',\n exchanges: '/settings/exchanges',\n languages: '/settings/languages',\n swaps: 'swaps',\n wallets: 'wallets',\n confirmSwap: 'confirm-swap',\n swapDetails: 'swaps/:requestId',\n};\n", "import type { SwapResult } from 'rango-sdk';\n\nimport { i18n } from '@lingui/core';\nimport {\n Alert,\n BestRoute,\n BestRouteSkeleton,\n Button,\n Divider,\n styled,\n SwapInput,\n Typography,\n WarningIcon,\n} from '@rango-dev/ui';\nimport React, { useEffect, useRef, useState } from 'react';\nimport { useNavigate } from 'react-router-dom';\n\nimport { HomeButtons } from '../components/HeaderButtons';\nimport { Layout } from '../components/Layout';\nimport { NoRoutes } from '../components/NoRoutes';\nimport { RouteErrors } from '../components/RouteErrors';\nimport { SwitchFromAndToButton } from '../components/SwitchFromAndTo';\nimport { errorMessages } from '../constants/errors';\nimport { navigationRoutes } from '../constants/navigationRoutes';\nimport {\n BALANCE_MAX_DECIMALS,\n BALANCE_MIN_DECIMALS,\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 { useSwapInput } from '../hooks/useSwapInput';\nimport { useBestRouteStore } from '../store/bestRoute';\nimport { useMetaStore } from '../store/meta';\nimport { useUiStore } from '../store/ui';\nimport { useWalletsStore } from '../store/wallets';\nimport { ButtonState } from '../types';\nimport {\n numberToString,\n secondsToString,\n totalArrivalTime,\n} from '../utils/numbers';\nimport { getFormattedBestRoute, getPriceImpactLevel } from '../utils/routing';\nimport {\n canComputePriceImpact,\n getOutputRatio,\n getPercentageChange,\n getSwapButtonState,\n getTotalFeeInUsd,\n hasLimitError,\n LimitErrorMessage,\n outputRatioHasWarning,\n} from '../utils/swap';\nimport { getBalanceFromWallet } from '../utils/wallets';\n\nconst Container = styled('div', {\n display: 'flex',\n flexDirection: 'column',\n overflowY: 'visible',\n});\n\nconst FromContainer = styled('div', {\n position: 'relative',\n});\n\nconst InputsContainer = styled('div', {\n display: 'flex',\n flexDirection: 'column',\n gap: 5,\n alignSelf: 'stretch',\n});\n\nconst BestRouteContainer = styled('div', {\n width: '100%',\n paddingTop: '$2',\n});\n\nconst FooterStepAlarm = styled('div', {\n paddingBottom: '$15',\n});\n\nconst FooterAlert = styled('div', {\n width: '100%',\n display: 'flex',\n});\n\nexport function Home() {\n const navigate = useNavigate();\n const {\n fetch: refetchBestRoute,\n loading: fetchingBestRoute,\n error: bestRouteError,\n } = useSwapInput();\n const {\n fromToken,\n fromBlockchain,\n toToken,\n toBlockchain,\n setInputAmount,\n inputAmount,\n inputUsdValue,\n outputAmount,\n outputUsdValue,\n bestRoute,\n resetRouteWallets,\n } = useBestRouteStore();\n\n const {\n meta: { tokens },\n loadingStatus: loadingMetaStatus,\n } = useMetaStore();\n\n const connectedWallets = useWalletsStore.use.connectedWallets();\n const setCurrentPage = useUiStore.use.setCurrentPage();\n const [openWarningModal, setOpenWarningModal] = useState(false);\n const {\n fromAmountRangeError,\n swap: swapHasError,\n recommendation,\n } = LimitErrorMessage(bestRoute);\n const layoutRef = useRef<HTMLDivElement>(null);\n\n const showBestRoute =\n !!Number(inputAmount) &&\n (!!bestRoute || fetchingBestRoute || !!bestRouteError);\n\n const needsToWarnEthOnPath = false;\n\n const outToInRatio = getOutputRatio(inputUsdValue, outputUsdValue);\n const highValueLoss = outputRatioHasWarning(inputUsdValue, outToInRatio);\n\n const priceImpactInputCanNotBeComputed = !canComputePriceImpact(\n bestRoute,\n inputAmount,\n inputUsdValue\n );\n\n const priceImpactOutputCanNotBeComputed = !canComputePriceImpact(\n bestRoute,\n inputAmount,\n outputUsdValue\n );\n const swapButtonState = getSwapButtonState(\n loadingMetaStatus,\n connectedWallets,\n fetchingBestRoute,\n bestRoute,\n hasLimitError(bestRoute),\n highValueLoss,\n priceImpactInputCanNotBeComputed || priceImpactOutputCanNotBeComputed,\n needsToWarnEthOnPath,\n inputAmount\n );\n\n const tokenBalance =\n !!fromBlockchain && !!fromToken\n ? numberToString(\n getBalanceFromWallet(\n connectedWallets,\n fromBlockchain?.name,\n fromToken?.symbol,\n fromToken?.address\n )?.amount || '0',\n BALANCE_MIN_DECIMALS,\n BALANCE_MAX_DECIMALS\n )\n : '0';\n\n const tokenBalanceReal =\n !!fromBlockchain && !!fromToken\n ? numberToString(\n getBalanceFromWallet(\n connectedWallets,\n fromBlockchain?.name,\n fromToken?.symbol,\n fromToken?.address\n )?.amount || '0',\n getBalanceFromWallet(\n connectedWallets,\n fromBlockchain?.name,\n fromToken?.symbol,\n fromToken?.address\n )?.decimal\n )\n : '0';\n\n useEffect(() => {\n setCurrentPage(navigationRoutes.home);\n resetRouteWallets();\n return setCurrentPage.bind(null, '');\n }, []);\n\n const percentageChange =\n !inputUsdValue || !outputUsdValue || !outputUsdValue.gt(0)\n ? null\n : getPercentageChange(\n inputUsdValue.toNumber(),\n outputUsdValue.toNumber()\n );\n\n const getBestRouteSteps = (swaps: SwapResult[]) => {\n return swaps.map((swap, index) => ({\n swapper: { displayName: swap.swapperId, image: swap.swapperLogo },\n from: {\n token: { displayName: swap.from.symbol, image: swap.from.logo },\n chain: {\n displayName: swap.from.blockchain,\n image: swap.from.blockchainLogo,\n },\n price: {\n value:\n index === 0\n ? numberToString(\n inputAmount,\n TOKEN_AMOUNT_MIN_DECIMALS,\n TOKEN_AMOUNT_MAX_DECIMALS\n )\n : swap.fromAmount,\n },\n },\n to: {\n token: { displayName: swap.to.symbol, image: swap.to.logo },\n chain: {\n displayName: swap.to.blockchain,\n image: swap.to.blockchainLogo,\n },\n price: {\n value: swap.toAmount,\n },\n },\n alerts:\n swap.swapperId === swapHasError?.swapperId ? (\n <FooterStepAlarm>\n <Alert\n type=\"error\"\n title={recommendation}\n footer={\n <FooterAlert>\n <Typography size=\"xsmall\" variant=\"body\" color=\"neutral900\">\n {fromAmountRangeError}\n </Typography>\n <Divider direction=\"horizontal\" size={8} />\n <Typography size=\"xsmall\" variant=\"body\" color=\"neutral900\">\n |\n </Typography>\n <Divider direction=\"horizontal\" size={8} />\n <Typography size=\"xsmall\" variant=\"body\" color=\"neutral900\">\n {`Yours: ${numberToString(\n swapHasError?.fromAmount || null,\n TOKEN_AMOUNT_MIN_DECIMALS,\n TOKEN_AMOUNT_MAX_DECIMALS\n )} ${swap?.from.symbol}`}\n </Typography>\n </FooterAlert>\n }\n />\n </FooterStepAlarm>\n ) : undefined,\n }));\n };\n\n const totalFeeInUsd = getTotalFeeInUsd(bestRoute, tokens);\n\n const bestRouteData = getFormattedBestRoute(bestRoute);\n\n return (\n <Layout\n ref={layoutRef}\n fixedHeight={false}\n hasLogo\n footer={\n <Button\n type=\"primary\"\n size=\"large\"\n disabled={swapButtonState.disabled}\n prefix={\n !swapButtonState.disabled &&\n swapButtonState.hasWarning && <WarningIcon />\n }\n fullWidth\n onClick={() => {\n if (swapButtonState.state === ButtonState.WAITFORCONNECTING) {\n navigate(navigationRoutes.wallets);\n } else if (swapButtonState.state === ButtonState.NEEDTOCONFIRM) {\n setOpenWarningModal(true);\n } else {\n navigate(navigationRoutes.confirmSwap);\n }\n }}>\n {swapButtonState.title}\n </Button>\n }\n header={{\n hasConnectWallet: true,\n title: i18n.t('Swap'),\n suffix: (\n <HomeButtons\n layoutRef={layoutRef.current}\n onClickRefresh={\n !!bestRoute || bestRouteError ? refetchBestRoute : undefined\n }\n onClickHistory={() => navigate(navigationRoutes.swaps)}\n onClickSettings={() => navigate(navigationRoutes.settings)}\n />\n ),\n }}>\n <Container>\n <InputsContainer>\n <FromContainer>\n <SwapInput\n label=\"From\"\n onInputChange={setInputAmount}\n balance={tokenBalance}\n chain={{\n displayName: fromBlockchain?.displayName || '',\n image: fromBlockchain?.logo || '',\n }}\n token={{\n displayName: fromToken?.symbol || '',\n image: fromToken?.image || '',\n }}\n onClickToken={() => navigate('from-swap')}\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 error: priceImpactInputCanNotBeComputed\n ? errorMessages.unknownPriceError.impactTitle\n : undefined,\n }}\n disabled={loadingMetaStatus === 'failed'}\n loading={loadingMetaStatus === 'loading'}\n onSelectMaxBalance={() => {\n if (tokenBalance !== '0') {\n setInputAmount(tokenBalanceReal.split(',').join(''));\n }\n }}\n />\n <SwitchFromAndToButton />\n </FromContainer>\n <SwapInput\n sharpBottomStyle={!!bestRoute?.result || fetchingBestRoute}\n label=\"To\"\n chain={{\n displayName: toBlockchain?.displayName || '',\n image: toBlockchain?.logo || '',\n }}\n token={{\n displayName: toToken?.symbol || '',\n image: toToken?.image || '',\n }}\n percentageChange={\n !!percentageChange?.lt(0)\n ? numberToString(\n percentageChange,\n PERCENTAGE_CHANGE_MIN_DECIMALS,\n PERCENTAGE_CHANGE_MAX_DECIMALS\n )\n : null\n }\n warningLevel={getPriceImpactLevel(\n percentageChange?.toNumber() ?? 0\n )}\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 error: priceImpactOutputCanNotBeComputed\n ? errorMessages.unknownPriceError.impactTitle\n : undefined,\n }}\n onClickToken={() => navigate('to-swap')}\n disabled={loadingMetaStatus === 'failed'}\n loading={loadingMetaStatus === 'loading'}\n />\n </InputsContainer>\n {fetchingBestRoute && (\n <BestRouteContainer>\n <BestRouteSkeleton type=\"basic\" />\n </BestRouteContainer>\n )}\n {showBestRoute &&\n !fetchingBestRoute &&\n bestRouteData?.result?.swaps?.length ? (\n <BestRouteContainer>\n <BestRoute\n type=\"basic\"\n recommended={true}\n input={{\n value: numberToString(\n inputAmount,\n TOKEN_AMOUNT_MIN_DECIMALS,\n TOKEN_AMOUNT_MAX_DECIMALS\n ),\n usdValue: numberToString(\n inputUsdValue,\n USD_VALUE_MIN_DECIMALS,\n USD_VALUE_MAX_DECIMALS\n ),\n }}\n output={{\n value: numberToString(\n outputAmount,\n TOKEN_AMOUNT_MIN_DECIMALS,\n TOKEN_AMOUNT_MAX_DECIMALS\n ),\n usdValue: numberToString(\n outputUsdValue,\n USD_VALUE_MIN_DECIMALS,\n USD_VALUE_MAX_DECIMALS\n ),\n }}\n steps={getBestRouteSteps(bestRouteData.result.swaps)}\n percentageChange={numberToString(\n percentageChange,\n PERCENTAGE_CHANGE_MIN_DECIMALS,\n PERCENTAGE_CHANGE_MAX_DECIMALS\n )}\n totalFee={numberToString(\n totalFeeInUsd,\n GAS_FEE_MIN_DECIMALS,\n GAS_FEE_MAX_DECIMALS\n )}\n totalTime={secondsToString(totalArrivalTime(bestRoute))}\n />\n </BestRouteContainer>\n ) : showBestRoute && !fetchingBestRoute ? (\n <>\n <Divider size={20} />\n <NoRoutes\n diagnosisMessage={bestRouteData?.diagnosisMessages?.[0]}\n fetch={refetchBestRoute}\n error={!!bestRouteError}\n />\n </>\n ) : null}\n </Container>\n <RouteErrors\n openModal={openWarningModal}\n onToggle={setOpenWarningModal}\n totalFeeInUsd={totalFeeInUsd}\n outputUsdValue={outputUsdValue}\n inputUsdValue={inputUsdValue}\n percentageChange={percentageChange}\n highValueLoss={highValueLoss}\n priceImpactCanNotBeComputed={\n priceImpactInputCanNotBeComputed || priceImpactOutputCanNotBeComputed\n }\n loading={fetchingBestRoute || loadingMetaStatus === 'loading'}\n extraSpace={!!bestRoute?.result || !bestRoute}\n />\n </Layout>\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 variant=\"ghost\" size=\"small\" onClick={props.onClick}>\n <ChevronLeftIcon color=\"black\" size={16} />\n </HeaderButton>\n );\n}\n\nexport { BackButton };\n", "import { Button, darkTheme, styled } from '@rango-dev/ui';\n\nexport const HeaderButton = styled(Button, {\n width: '$24',\n position: 'relative',\n padding: '0',\n overflow: 'unset',\n});\n\nexport const ConnectedIcon = styled('div', {\n position: 'absolute',\n background: '$secondary500',\n [`.${darkTheme} &`]: {\n $$color: '$colors$secondary400',\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 width: '$40',\n});\n\nexport const NotificationsBadgeContainer = styled('div', {\n position: 'absolute',\n backgroundColor: '$secondary500',\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});\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 variant=\"ghost\" onClick={props.onClick} 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 { Tooltip, WalletIcon } from '@rango-dev/ui';\nimport React from 'react';\n\nimport { ConnectedIcon, HeaderButton } from './HeaderButtons.styles';\n\nfunction WalletButton(props: PropTypes) {\n return (\n <Tooltip side=\"top\" content={i18n.t('Connect Wallet')}>\n <HeaderButton variant=\"ghost\" size=\"small\" 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 { HomeButtonsPropTypes } from './HeaderButtons.types';\n\nimport { i18n } from '@lingui/core';\nimport {\n NotificationsIcon,\n Popover,\n RefreshIcon,\n SettingsIcon,\n Tooltip,\n TransactionIcon,\n} from '@rango-dev/ui';\nimport React from 'react';\n\nimport { NotificationContent } from '../NotificationContent';\n\nimport { HeaderButton } from './HeaderButtons.styles';\nimport { UnreadNotificationsBadge } from './UnreadNotificationsBadge';\n\nexport function HomeButtons(props: HomeButtonsPropTypes) {\n const {\n layoutRef,\n onClickRefresh,\n onClickHistory,\n onClickSettings,\n onClickNotifications,\n } = props;\n\n return (\n <>\n <Tooltip side=\"top\" content={i18n.t('Refresh')}>\n <HeaderButton\n variant=\"ghost\"\n size=\"small\"\n onClick={onClickRefresh}\n disabled={!onClickRefresh}>\n <RefreshIcon size={16} color={!onClickRefresh ? 'gray' : 'black'} />\n </HeaderButton>\n </Tooltip>\n\n <Tooltip side=\"top\" content={i18n.t('Notifications')}>\n <Popover\n align=\"center\"\n collisionBoundary={layoutRef}\n collisionPadding={{ right: 20, left: 20 }}\n container={document.getElementById('swap-box') as HTMLElement}\n content={<NotificationContent />}>\n <HeaderButton\n size=\"small\"\n variant=\"ghost\"\n onClick={onClickNotifications}>\n <NotificationsIcon size={18} color=\"black\" />\n <UnreadNotificationsBadge />\n </HeaderButton>\n </Popover>\n </Tooltip>\n <Tooltip side=\"top\" content={i18n.t('Settings')}>\n <HeaderButton size=\"small\" variant=\"ghost\" onClick={onClickSettings}>\n <SettingsIcon size={18} color=\"black\" />\n </HeaderButton>\n </Tooltip>\n <Tooltip side=\"top\" content={i18n.t('Transactions History')}>\n <HeaderButton size=\"small\" variant=\"ghost\" onClick={onClickHistory}>\n <TransactionIcon size={18} color=\"black\" />\n </HeaderButton>\n </Tooltip>\n </>\n );\n}\n", "import type { Notification } from '../../types/notification';\n\nimport {\n ChainToken,\n ChevronRightIcon,\n ListItemButton,\n Typography,\n} from '@rango-dev/ui';\nimport React from 'react';\nimport { useNavigate } from 'react-router-dom';\n\nimport { useMetaStore } from '../../store/meta';\nimport { useNotificationStore } from '../../store/notification';\nimport { useUiStore } from '../../store/ui';\n\nimport { Container, Images, List } from './NotificationContent.styles';\nimport { NotificationNotFound } from './NotificationNotFound';\n\nconst MAX_NOTIFICATIONS_DISPLAYED = 4;\n\nexport function NotificationContent() {\n const navigate = useNavigate();\n const setSelectedSwap = useUiStore.use.setSelectedSwap();\n\n const { getUnreadNotifications } = useNotificationStore();\n\n const notifications: Notification[] = getUnreadNotifications();\n const { tokens, blockchains } = useMetaStore.use.meta();\n const sortedNotification = notifications\n .sort((a, b) => b.creationTime - a.creationTime)\n .slice(0, MAX_NOTIFICATIONS_DISPLAYED);\n\n const handleOnClick = (requestId: Notification['requestId']) => {\n setSelectedSwap(requestId);\n navigate(`/swaps/${requestId}`);\n };\n\n return (\n <Container>\n {sortedNotification.length ? (\n <List>\n {sortedNotification.map((notificationItem) => {\n const fromToken = tokens.find(\n (tokenItem) =>\n tokenItem.address ===\n notificationItem.route.from.tokenAddress &&\n tokenItem.blockchain ===\n notificationItem.route.from.blockchain &&\n tokenItem.symbol === notificationItem.route.from.tokenSymbol\n );\n\n const fromBlockchain = blockchains.find(\n (blockchainItem) =>\n blockchainItem.name === notificationItem.route.from.blockchain\n );\n\n const toToken = tokens.find(\n (tokenItem) =>\n tokenItem.address === notificationItem.route.to.tokenAddress &&\n tokenItem.blockchain === notificationItem.route.to.blockchain &&\n tokenItem.symbol === notificationItem.route.to.tokenSymbol\n );\n\n const toBlockchain = blockchains.find(\n (blockchainItem) =>\n blockchainItem.name === notificationItem.route.to.blockchain\n );\n\n return (\n <ListItemButton\n key={notificationItem.requestId}\n onClick={() => handleOnClick(notificationItem.requestId)}\n title={\n <Typography variant=\"body\" size=\"small\" color=\"$neutral900\">\n {notificationItem.event.message}\n </Typography>\n }\n id={notificationItem.requestId}\n start={\n <Images>\n <div className=\"from-chain-token\">\n <ChainToken\n tokenImage={fromToken ? fromToken.image : ''}\n chainImage={fromBlockchain ? fromBlockchain.logo : ''}\n size=\"small\"\n />\n </div>\n <div className=\"to-chain-token\">\n <ChainToken\n tokenImage={toToken ? toToken.image : ''}\n chainImage={toBlockchain ? toBlockchain.logo : ''}\n size=\"small\"\n />\n </div>\n </Images>\n }\n end={<ChevronRightIcon size={12} color=\"gray\" />}\n />\n );\n })}\n </List>\n ) : (\n <NotificationNotFound />\n )}\n </Container>\n );\n}\n", "import type { TokenWithBalance } from '../components/TokenList';\nimport type { MetaResponse } from 'rango-sdk';\n\nimport { create } from 'zustand';\n\nimport { httpService } from '../services/httpService';\nimport { removeDuplicateFrom } from '../utils/common';\nimport { getTokensWithBalance, sortTokens } from '../utils/wallets';\n\nimport createSelectors from './selectors';\nimport { useWalletsStore } from './wallets';\n\nexport type LoadingStatus = 'loading' | 'success' | 'failed';\n\nexport interface MetaState {\n meta: MetaResponse & { tokens: TokenWithBalance[] };\n loadingStatus: LoadingStatus;\n fetchMeta: () => Promise<void>;\n setTokensWithBalance: () => void;\n}\n\nexport const useMetaStore = createSelectors(\n create<MetaState>()((set) => ({\n meta: { blockchains: [], popularTokens: [], swappers: [], tokens: [] },\n loadingStatus: 'loading',\n setTokensWithBalance: () => {\n const connectedWallets = useWalletsStore.getState().connectedWallets;\n\n set((state) => ({\n ...state,\n meta: {\n ...state.meta,\n tokens: sortTokens(\n getTokensWithBalance(state.meta.tokens, connectedWallets)\n ),\n },\n }));\n },\n fetchMeta: async () => {\n try {\n const response = await httpService().getAllMetadata();\n const chainThatHasTokenInMetaResponse = removeDuplicateFrom(\n response.tokens.map((t) => t.blockchain)\n );\n const enabledChains = response.blockchains.filter(\n (chain) =>\n chain.enabled &&\n chainThatHasTokenInMetaResponse.includes(chain.name)\n );\n response.blockchains = enabledChains.sort((a, b) => a.sort - b.sort);\n set({ meta: response, loadingStatus: 'success' });\n } catch (error) {\n set({ loadingStatus: 'failed' });\n }\n },\n }))\n);\n", "import { RangoClient } from 'rango-sdk';\nimport { getConfig } from '../utils/configs';\n\n// this API key is limited and\n// it is only for test purpose\nexport const RANGO_PUBLIC_API_KEY = 'c6381a79-2817-4602-83bf-6a641a409e32';\n\nlet rango: RangoClient | undefined = undefined;\n\nexport const httpService = () => {\n if (rango) return rango;\n rango = new RangoClient(getConfig('API_KEY'));\n return rango;\n};\n", "export interface Configs {\n API_KEY: string;\n}\n\nconst RANGO_PUBLIC_API_KEY = 'c6381a79-2817-4602-83bf-6a641a409e32';\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\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", "/* eslint-disable @typescript-eslint/no-magic-numbers */\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// eslint-disable-next-line @typescript-eslint/ban-types\nexport function debounce(fn: Function, time: number) {\n let timeoutId: ReturnType<typeof setTimeout> | null;\n return wrapper;\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 // eslint-disable-next-line @typescript-eslint/no-magic-numbers\n return text.toLowerCase().indexOf(searchText.toLowerCase()) > -1;\n}\n\nexport const colorShade = (col: string, amt: number) => {\n col = col.replace(/^#/, '');\n if (col.length === 3) {\n col = col[0] + col[0] + col[1] + col[1] + col[2] + col[2];\n }\n let [r, g, b]: any = col.match(/.{2}/g);\n [r, g, b] = [\n parseInt(r, 16) + amt,\n parseInt(g, 16) + amt,\n parseInt(b, 16) + amt,\n ];\n\n r = Math.max(Math.min(255, r), 0).toString(16);\n g = Math.max(Math.min(255, g), 0).toString(16);\n b = Math.max(Math.min(255, b), 0).toString(16);\n\n const rr = (r.length < 2 ? '0' : '') + r;\n const gg = (g.length < 2 ? '0' : '') + g;\n const bb = (b.length < 2 ? '0' : '') + b;\n\n return `#${rr}${gg}${bb}`;\n};\n\nexport const generateRangeColors = (name: string, color: string) => {\n let colors = { [name]: color };\n for (let i = 1; i < 10; i++) {\n if (i < 5) {\n colors = {\n ...colors,\n [name + i * 100]: colorShade(color, (5 - i) * 32),\n };\n }\n if (i === 5) {\n colors = {\n ...colors,\n [name + i * 100]: color,\n };\n }\n if (i > 5) {\n colors = {\n ...colors,\n [name + i * 100]: colorShade(color, -((i - 5) * 32)),\n };\n }\n }\n return colors;\n};\n", "import type { TokenWithBalance } from '../components/TokenList';\nimport type { ConnectedWallet, TokenBalance } from '../store/wallets';\nimport type { Wallet } from '../types';\nimport type { WalletInfo as ModalWalletInfo } from '@rango-dev/ui';\nimport type {\n Network,\n WalletInfo,\n WalletState,\n WalletType,\n WalletTypes,\n} from '@rango-dev/wallets-shared';\nimport type {\n BestRouteResponse,\n BlockchainMeta,\n Token,\n WalletDetail,\n} from 'rango-sdk';\n\nimport { WalletState as WalletStatus } from '@rango-dev/ui';\nimport { readAccountAddress } from '@rango-dev/wallets-react';\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 { EXCLUDED_WALLETS } from '../constants/wallets';\n\nimport { numberToString } from './numbers';\n\nexport function mapStatusToWalletState(state: WalletState): WalletStatus {\n switch (true) {\n case state.connected:\n return WalletStatus.CONNECTED;\n case state.connecting:\n return WalletStatus.CONNECTING;\n case !state.installed:\n return WalletStatus.NOT_INSTALLED;\n default:\n return WalletStatus.DISCONNECTED;\n }\n}\n\nexport function mapWalletTypesToWalletInfo(\n getState: (type: WalletType) => WalletState,\n getWalletInfo: (type: WalletType) => WalletInfo,\n list: WalletType[],\n chain?: string\n): ModalWalletInfo[] {\n return list\n .filter((wallet) => !EXCLUDED_WALLETS.includes(wallet as WalletTypes))\n .filter((wallet) => {\n if (chain) {\n const { supportedChains } = getWalletInfo(wallet);\n return !!supportedChains.find(\n (supportedChain) => supportedChain.name === chain\n );\n }\n return true;\n })\n .map((type) => {\n const { name, img: image, installLink } = getWalletInfo(type);\n const state = mapStatusToWalletState(getState(type));\n return {\n title: name,\n image,\n link: detectInstallLink(installLink),\n state,\n type,\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): Wallet[] {\n const result: Wallet[] = [];\n\n function addAccount(network: Network, address: string) {\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 };\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 /*\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((chain) =>\n 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 } else {\n addAccount(network, address);\n }\n });\n\n return result;\n}\n\nexport function getRequiredChains(route: BestRouteResponse | null) {\n const wallets: string[] = [];\n\n route?.result?.swaps.forEach((swap) => {\n const currentStepFromBlockchain = swap.from.blockchain;\n const currentStepToBlockchain = swap.to.blockchain;\n if (!wallets.includes(currentStepFromBlockchain)) {\n wallets.push(currentStepFromBlockchain);\n }\n if (!wallets.includes(currentStepToBlockchain)) {\n wallets.push(currentStepToBlockchain);\n }\n\n // Check if internalSwaps array exists\n if (swap.internalSwaps && Array.isArray(swap.internalSwaps)) {\n swap.internalSwaps.forEach((internalSwap) => {\n const internalStepFromBlockchain = internalSwap.from.blockchain;\n const internalStepToBlockchain = internalSwap.to.blockchain;\n if (!wallets.includes(internalStepFromBlockchain)) {\n wallets.push(internalStepFromBlockchain);\n }\n if (!wallets.includes(internalStepToBlockchain)) {\n wallets.push(internalStepToBlockchain);\n }\n });\n }\n });\n return wallets;\n}\n\ntype Blockchain = { name: string; accounts: ConnectedWallet[] };\n\nexport function getSelectableWallets(\n connectedWallets: ConnectedWallet[],\n getWalletInfo: (type: WalletType) => WalletInfo,\n destinationChain?: string\n): Wallet[] {\n const selectableWallets = connectedWallets.map(\n (connectedWallet: ConnectedWallet) => {\n return {\n address: connectedWallet.address,\n walletType: connectedWallet.walletType,\n chain: connectedWallet.chain,\n image: getWalletInfo(connectedWallet.walletType).img,\n name: getWalletInfo(connectedWallet.walletType).name,\n selected:\n destinationChain === connectedWallet.chain\n ? false\n : connectedWallet.selected,\n };\n }\n );\n\n return selectableWallets;\n}\n\nexport function getBalanceFromWallet(\n connectedWallets: ConnectedWallet[],\n chain: string,\n symbol: string,\n address: string | null\n): TokenBalance | null {\n if (connectedWallets.length === 0) {\n return null;\n }\n\n const selectedChainWallets = connectedWallets.filter(\n (wallet) => wallet.chain === chain\n );\n if (selectedChainWallets.length === 0) {\n return null;\n }\n\n return (\n selectedChainWallets\n .map(\n (wallet) =>\n wallet.balances?.find(\n (balance) =>\n (address !== null && balance.address === address) ||\n (address === null &&\n balance.address === address &&\n balance.symbol === symbol)\n ) || null\n )\n .filter((balance) => balance !== null)\n .sort(\n (a, b) => parseFloat(b?.amount || '0') - parseFloat(a?.amount || '1')\n )\n .find(() => true) || null\n );\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 makeBalanceFor(\n retrievedBalance: WalletDetail,\n tokens: Token[]\n): TokenBalance[] {\n const { blockChain: chain, balances = [] } = retrievedBalance;\n return (\n balances?.map((tokenBalance) => ({\n chain,\n symbol: tokenBalance.asset.symbol,\n ticker: tokenBalance.asset.symbol,\n address: tokenBalance.asset.address || null,\n rawAmount: tokenBalance.amount.amount,\n decimal: tokenBalance.amount.decimals,\n amount: new BigNumber(tokenBalance.amount.amount)\n .shiftedBy(-tokenBalance.amount.decimals)\n .toFixed(),\n logo: '',\n usdPrice:\n getUsdPrice(\n chain,\n tokenBalance.asset.symbol,\n tokenBalance.asset.address,\n tokens\n ) || null,\n })) || []\n );\n}\n\nexport function resetConnectedWalletState(\n connectedWallet: ConnectedWallet\n): ConnectedWallet {\n return { ...connectedWallet, loading: false, error: true };\n}\n\nexport const calculateWalletUsdValue = (connectedWallet: ConnectedWallet[]) => {\n const uniqueAccountAddresses = new Set<string | null>();\n const uniqueBalance: ConnectedWallet[] = connectedWallet?.reduce(\n (acc: ConnectedWallet[], current: ConnectedWallet) => {\n return acc.findIndex(\n (i) => i.address === current.address && i.chain === current.chain\n // eslint-disable-next-line @typescript-eslint/no-magic-numbers\n ) === -1\n ? [...acc, current]\n : acc;\n },\n []\n );\n\n const modifiedWalletBlockchains = uniqueBalance?.map((chain) => {\n const modifiedWalletBlockchain: Blockchain = {\n name: chain.chain,\n accounts: [],\n };\n if (!uniqueAccountAddresses.has(chain.address)) {\n uniqueAccountAddresses.add(chain.address);\n }\n uniqueAccountAddresses.forEach((accountAddress) => {\n if (chain.address === accountAddress) {\n modifiedWalletBlockchain.accounts.push(chain);\n }\n });\n return modifiedWalletBlockchain;\n });\n const total = numberToString(\n modifiedWalletBlockchains\n ?.flatMap((b) => b.accounts)\n ?.flatMap((a) => a?.balances)\n ?.map((b) =>\n new BigNumber(b?.amount || ZERO).multipliedBy(b?.usdPrice || 0)\n )\n ?.reduce((a, b) => a.plus(b), ZERO) || ZERO\n ).toString();\n\n return numberWithThousandSeparator(total);\n};\n\nfunction numberWithThousandSeparator(number: string | number): string {\n const parts = number.toString().split('.');\n parts[0] = parts[0].replace(/\\B(?=(\\d{3})+(?!\\d))/g, ',');\n return parts.join('.');\n}\n\nexport const sortTokens = (tokens: TokenWithBalance[]): TokenWithBalance[] => {\n const walletConnected = !!tokens.some((token) => token.balance);\n if (!walletConnected) {\n return tokens\n .filter((token) => !token.address)\n .concat(\n tokens.filter((token) => token.address && !token.isSecondaryCoin),\n tokens.filter((token) => token.isSecondaryCoin)\n );\n }\n\n return tokens\n .filter((token) => !!token.balance)\n .sort(\n (tokenA, tokenB) =>\n parseFloat(tokenB.balance?.usdValue || '0') -\n parseFloat(tokenA.balance?.usdValue || '0')\n )\n .concat(\n tokens.filter((token) => !token.balance && !token.isSecondaryCoin),\n tokens.filter((token) => !token.balance && token.isSecondaryCoin)\n );\n};\n\nexport const getUsdPrice = (\n blockchain: string,\n symbol: string,\n address: string | null,\n allTokens: Token[]\n): number | null => {\n const token = allTokens?.find(\n (t) =>\n t.blockchain === blockchain &&\n t.symbol?.toUpperCase() === symbol?.toUpperCase() &&\n t.address === address\n );\n return token?.usdPrice || null;\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\nexport function getTokensWithBalance(\n tokens: TokenWithBalance[],\n connectedWallets: ConnectedWallet[]\n): TokenWithBalance[] {\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n return tokens.map(({ balance, ...otherProps }) => {\n const tokenAmount = numberToString(\n new BigNumber(\n getBalanceFromWallet(\n connectedWallets,\n otherProps.blockchain,\n otherProps.symbol,\n otherProps.address\n )?.amount || ZERO\n )\n );\n\n let tokenUsdValue = '';\n if (otherProps.usdPrice) {\n tokenUsdValue = numberToString(\n new BigNumber(\n getBalanceFromWallet(\n connectedWallets,\n otherProps.blockchain,\n otherProps.symbol,\n otherProps.address\n )?.amount || ZERO\n ).multipliedBy(otherProps.usdPrice)\n );\n }\n\n return {\n ...otherProps,\n ...(tokenAmount !== '0' && {\n balance: { amount: tokenAmount, usdValue: tokenUsdValue },\n }),\n };\n });\n}\n\nexport function getSortedTokens(\n chain: BlockchainMeta | null,\n tokens: Token[],\n connectedWallets: ConnectedWallet[],\n otherChainTokens: TokenWithBalance[]\n): TokenWithBalance[] {\n const fromChainEqualsToToBlockchain =\n chain?.name === otherChainTokens[0]?.name;\n if (fromChainEqualsToToBlockchain) {\n return otherChainTokens;\n }\n const filteredTokens = tokens.filter(\n (token) => token.blockchain === chain?.name\n );\n return sortTokens(getTokensWithBalance(filteredTokens, connectedWallets));\n}\n\nexport function tokensAreEqual(\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 === tokenB?.symbol &&\n tokenA?.address === tokenB?.address\n );\n}\n\nexport function getDefaultToken(\n sortedTokens: TokenWithBalance[],\n otherToken: TokenWithBalance | null\n): TokenWithBalance {\n let selectedToken: TokenWithBalance;\n const firstToken = sortedTokens[0];\n const secondToken = sortedTokens[1];\n if (sortedTokens.length === 1) {\n selectedToken = firstToken;\n } else if (tokensAreEqual(firstToken, otherToken)) {\n selectedToken = secondToken;\n } else {\n selectedToken = firstToken;\n }\n return selectedToken;\n}\n\nexport function sortWalletsBasedOnConnectionState(\n wallets: ModalWalletInfo[]\n): ModalWalletInfo[] {\n return wallets.sort(\n (a, b) =>\n Number(b.state === WalletStatus.CONNECTED) -\n Number(a.state === WalletStatus.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", "import BigNumber from 'bignumber.js';\n\nexport const ZERO = new BigNumber(0);\n", "import { WalletTypes } from '@rango-dev/wallets-shared';\n\nexport const EXCLUDED_WALLETS = [WalletTypes.LEAP];\n", "/* eslint-disable @typescript-eslint/no-magic-numbers */\n\nimport type { BestRouteResponse } from 'rango-sdk';\n\nimport { BigNumber } from 'bignumber.js';\n\nexport const percentToString = (p: number, fractions = 0): string =>\n (p * 100).toFixed(fractions);\n\nexport const secondsToString = (s: number): string => {\n const seconds = (s % 60).toString().padStart(2, '0');\n const minutes = parseInt((s / 60).toString())\n .toString()\n .padStart(2, '0');\n return `${minutes}:${seconds}`;\n};\n\nexport const numberToString = (\n number: BigNumber | string | 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 convertBigNumberToHex = (\n value: BigNumber,\n decimals: number\n): string => {\n return '0x' + value.shiftedBy(decimals).toString(16);\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 function dollarToConciseString(num: number | undefined): string {\n if (!num) {\n return '-';\n }\n if (num < 1) {\n return ' < 1$';\n }\n if (num < 1000) {\n return numberToString(new BigNumber(num)) + '$';\n }\n if (num < 10_000) {\n return parseInt((num / 100).toString()) / 10 + 'K';\n }\n if (num < 1_000_000) {\n return parseInt((num / 1000).toString()) + 'K';\n }\n if (num < 100_000_000) {\n return parseInt((num / 100000).toString()) / 10 + 'M';\n }\n return parseInt((num / 1000000).toString()) + 'M';\n}\n\nexport function removeExtraDecimals(num: string, maxDecimals: number): string {\n try {\n if (!num.includes('.')) {\n return num;\n }\n const [b, f] = num.split('.');\n if (f && f.length > maxDecimals) {\n return `${b}.${f.substring(0, maxDecimals)}`;\n }\n return num;\n } catch (e) {\n return num;\n }\n}\n\nexport const totalArrivalTime = (data: BestRouteResponse | null) =>\n data?.result?.swaps?.reduce((a, b) => a + b.estimatedTimeInSeconds, 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;\n10;\n\nexport function limitDecimalPlaces(\n numberString: string,\n maxDecimalPlaces = 4\n): string {\n const number = parseFloat(numberString);\n if (isNaN(number)) {\n return numberString;\n } // Return the original string if it's not a valid number\n\n const multiplier = Math.pow(10, maxDecimalPlaces);\n const roundedNumber = Math.round(number * multiplier) / multiplier;\n return roundedNumber.toString();\n}\n", "import { 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>>>(_store: S) => {\n let store = _store as WithSelectors<typeof _store>;\n store.use = {};\n for (let 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 { Wallet } from '../types';\nimport type { WalletType } from '@rango-dev/wallets-shared';\n\nimport { create } from 'zustand';\nimport { subscribeWithSelector } from 'zustand/middleware';\nimport { shallow } from 'zustand/shallow';\n\nimport { httpService } from '../services/httpService';\nimport {\n getTokensWithBalance,\n isAccountAndWalletMatched,\n makeBalanceFor,\n resetConnectedWalletState,\n sortTokens,\n} from '../utils/wallets';\n\nimport { useBestRouteStore } from './bestRoute';\nimport { useMetaStore } from './meta';\nimport createSelectors from './selectors';\n\nexport type TokenBalance = {\n chain: string;\n symbol: string;\n ticker: string;\n address: string | null;\n rawAmount: string;\n decimal: number | null;\n amount: string;\n logo: string | null;\n usdPrice: number | null;\n};\n\nexport interface ConnectedWallet extends Wallet {\n balances: TokenBalance[] | null;\n explorerUrl: string | null;\n selected: boolean;\n loading: boolean;\n error: boolean;\n}\n\ninterface WalletsStore {\n connectedWallets: ConnectedWallet[];\n customDestination: string;\n loading: boolean;\n connectWallet: (accounts: Wallet[]) => void;\n disconnectWallet: (walletType: WalletType) => void;\n selectWallets: (wallets: { walletType: string; chain: string }[]) => void;\n clearConnectedWallet: () => void;\n getWalletsDetails: (accounts: Wallet[], shouldRetry?: boolean) => void;\n}\n\nexport const useWalletsStore = createSelectors(\n create<WalletsStore>()(\n subscribeWithSelector((set, get) => ({\n connectedWallets: [],\n customDestination: '',\n loading: false,\n connectWallet: (accounts) => {\n const getWalletsDetails = get().getWalletsDetails;\n set((state) => ({\n loading: true,\n connectedWallets: state.connectedWallets\n .filter((wallet) => wallet.walletType !== accounts[0].walletType)\n .concat(\n accounts.map((account) => {\n const shouldMarkWalletAsSelected = !state.connectedWallets.find(\n (connectedWallet) =>\n connectedWallet.chain === account.chain &&\n connectedWallet.selected\n );\n return {\n balances: [],\n address: account.address,\n chain: account.chain,\n explorerUrl: null,\n walletType: account.walletType,\n selected: shouldMarkWalletAsSelected,\n loading: true,\n error: false,\n };\n })\n ),\n }));\n getWalletsDetails(accounts);\n },\n disconnectWallet: (walletType) => {\n set((state) => {\n const selectedWallets = state.connectedWallets\n .filter(\n (connectedWallet) =>\n connectedWallet.selected &&\n connectedWallet.walletType !== walletType\n )\n .map((selectedWallet) => selectedWallet.chain);\n return {\n connectedWallets: state.connectedWallets\n .filter(\n (connectedWallet) => connectedWallet.walletType !== walletType\n )\n .map((connectedWallet) => {\n const anyWalletSelectedForBlockchain = selectedWallets.includes(\n connectedWallet.chain\n );\n if (anyWalletSelectedForBlockchain) {\n return connectedWallet;\n }\n selectedWallets.push(connectedWallet.chain);\n return { ...connectedWallet, selected: true };\n }),\n };\n });\n },\n selectWallets: (wallets) =>\n set((state) => ({\n connectedWallets: state.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 clearConnectedWallet: () =>\n set(() => ({\n connectedWallets: [],\n selectedWallets: [],\n })),\n getWalletsDetails: async (accounts, shouldRetry = true) => {\n const getWalletsDetails = get().getWalletsDetails;\n const { tokens } = useMetaStore.getState().meta;\n set((state) => ({\n loading: true,\n connectedWallets: state.connectedWallets.map((wallet) => {\n return accounts.find((account) =>\n isAccountAndWalletMatched(account, wallet)\n )\n ? { ...wallet, loading: true }\n : wallet;\n }),\n }));\n try {\n const data = accounts.map(({ address, chain }) => ({\n address,\n blockchain: chain,\n }));\n const response = await httpService().getWalletsDetails(data);\n const retrievedBalance = response.wallets;\n if (retrievedBalance) {\n set((state) => ({\n loading: false,\n connectedWallets: state.connectedWallets.map(\n (connectedWallet) => {\n const matchedAccount = accounts.find((account) =>\n isAccountAndWalletMatched(account, connectedWallet)\n );\n const retrievedBalanceAccount = retrievedBalance.find(\n (balance) =>\n balance.address === connectedWallet.address &&\n balance.blockChain === connectedWallet.chain\n );\n if (\n retrievedBalanceAccount?.failed &&\n matchedAccount &&\n shouldRetry\n ) {\n getWalletsDetails([matchedAccount], false);\n }\n return matchedAccount && retrievedBalanceAccount\n ? {\n ...connectedWallet,\n explorerUrl: retrievedBalanceAccount.explorerUrl,\n balances: makeBalanceFor(\n retrievedBalanceAccount,\n tokens\n ),\n }\n : connectedWallet;\n }\n ),\n }));\n } else {\n throw new Error('Wallet not found');\n }\n } catch (error) {\n set((state) => ({\n loading: false,\n connectedWallets: state.connectedWallets.map((balance) => {\n return accounts.find((account) =>\n isAccountAndWalletMatched(account, balance)\n )\n ? resetConnectedWalletState(balance)\n : balance;\n }),\n }));\n }\n },\n }))\n )\n);\n\nuseWalletsStore.subscribe(\n (state) => state.connectedWallets,\n (connectedWallets) => {\n useBestRouteStore.setState(({ sourceTokens, destinationTokens }) => {\n const sourceTokensWithBalance = getTokensWithBalance(\n sourceTokens,\n connectedWallets\n );\n const destinationTokensWithBalance = getTokensWithBalance(\n destinationTokens,\n connectedWallets\n );\n return {\n sourceTokens: sortTokens(sourceTokensWithBalance),\n destinationTokens: sortTokens(destinationTokensWithBalance),\n };\n });\n },\n {\n equalityFn: shallow,\n }\n);\n\nexport const fetchingBalanceSelector = (state: WalletsStore) =>\n !!state.connectedWallets.find((wallet) => wallet.loading);\n", "import type { TokenWithBalance } from '../components/TokenList';\nimport type { Wallet } from '../types';\nimport type { PendingSwap } from '@rango-dev/queue-manager-rango-preset/dist/shared';\nimport type { BestRouteResponse, BlockchainMeta, Token } from 'rango-sdk';\n\nimport BigNumber from 'bignumber.js';\nimport { create } from 'zustand';\nimport { subscribeWithSelector } from 'zustand/middleware';\n\nimport { ZERO } from '../constants/numbers';\nimport { isPositiveNumber } from '../utils/numbers';\nimport { getBestRouteToTokenUsdPrice } from '../utils/routing';\nimport { calcOutputUsdValue } from '../utils/swap';\nimport {\n getDefaultToken,\n getSortedTokens,\n tokensAreEqual,\n} from '../utils/wallets';\n\nimport { useMetaStore } from './meta';\nimport createSelectors from './selectors';\nimport { useWalletsStore } from './wallets';\n\nconst getUsdValue = (token: Token | null, amount: string): BigNumber | null =>\n token?.usdPrice\n ? new BigNumber(amount || ZERO).multipliedBy(token?.usdPrice || 0)\n : null;\n\nexport interface RouteState {\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: TokenWithBalance | null;\n toToken: TokenWithBalance | null;\n routeWalletsConfirmed: boolean;\n sourceTokens: Token[];\n destinationTokens: Token[];\n selectedWallets: Wallet[];\n resetRoute: () => void;\n resetToBlockchain: () => void;\n resetFromBlockchain: () => void;\n setFromBlockchain: (\n chain: BlockchainMeta | null,\n setDefaultToken?: boolean\n ) => void;\n setToBlockchain: (\n chian: BlockchainMeta | null,\n setDefaultToken?: boolean\n ) => void;\n\n setFromToken: (token: Token | null) => void;\n setToToken: (token: Token | null) => void;\n setInputAmount: (amount: string) => void;\n bestRoute: BestRouteResponse | null;\n setRoute: (bestRoute: BestRouteResponse | null) => void;\n retry: (pendingSwap: PendingSwap) => void;\n switchFromAndTo: () => void;\n setRouteWalletConfirmed: (flag: boolean) => void;\n setSelectedWallets: (wallets: Wallet[]) => void;\n customDestination: string;\n setCustomDestination: (address: string) => void;\n resetRouteWallets: () => void;\n}\n\nexport const useBestRouteStore = createSelectors(\n create<RouteState>()(\n subscribeWithSelector((set) => ({\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 bestRoute: null,\n routeWalletsConfirmed: false,\n sourceTokens: [],\n destinationTokens: [],\n selectedWallets: [],\n customDestination: '',\n setRoute: (bestRoute) =>\n set((state) => {\n let outputAmount: BigNumber | null = null;\n let outputUsdValue: BigNumber = ZERO;\n if (!isPositiveNumber(state.inputAmount)) {\n return {};\n }\n if (!!bestRoute) {\n outputAmount = !!bestRoute.result?.outputAmount\n ? new BigNumber(bestRoute.result?.outputAmount)\n : null;\n outputUsdValue = calcOutputUsdValue(\n bestRoute.result?.outputAmount,\n getBestRouteToTokenUsdPrice(bestRoute) || state.toToken?.usdPrice\n );\n }\n return {\n bestRoute,\n ...(!!bestRoute && {\n outputAmount,\n outputUsdValue,\n }),\n };\n }),\n resetRoute: () =>\n set(() => ({\n bestRoute: null,\n outputAmount: null,\n outputUsdValue: new BigNumber(0),\n })),\n setFromBlockchain: (chain, setDefaultToken) => {\n set((state) => {\n if (state.fromBlockchain?.name === chain?.name) {\n return {};\n }\n const tokens = useMetaStore.getState().meta.tokens;\n const connectedWallets = useWalletsStore.getState().connectedWallets;\n const sortedTokens = getSortedTokens(\n chain,\n tokens,\n connectedWallets,\n state.destinationTokens\n );\n const fromToken = getDefaultToken(sortedTokens, state.toToken);\n return {\n fromBlockchain: chain,\n sourceTokens: sortedTokens,\n ...(setDefaultToken && {\n fromToken,\n }),\n ...(!!state.inputAmount && {\n inputUsdValue: getUsdValue(fromToken, state.inputAmount),\n }),\n };\n });\n },\n setFromToken: (token) =>\n set((state) => ({\n fromToken: token,\n ...(!!state.inputAmount && {\n inputUsdValue: getUsdValue(token, state.inputAmount),\n }),\n })),\n setToBlockchain: (chain, setDefaultToken) => {\n set((state) => {\n if (state.toBlockchain?.name === chain?.name) {\n return {};\n }\n const tokens = useMetaStore.getState().meta.tokens;\n const connectedWallets = useWalletsStore.getState().connectedWallets;\n const sortedTokens = getSortedTokens(\n chain,\n tokens,\n connectedWallets,\n state.destinationTokens\n );\n\n return {\n toBlockchain: chain,\n destinationTokens: sortedTokens,\n ...(setDefaultToken && {\n toToken: getDefaultToken(sortedTokens, state.fromToken),\n }),\n };\n });\n },\n setToToken: (token) =>\n set(() => ({\n toToken: token,\n })),\n setInputAmount: (amount) => {\n set((state) => ({\n inputAmount: amount,\n ...(!amount && {\n outputAmount: new BigNumber(0),\n outputUsdValue: new BigNumber(0),\n bestRoute: null,\n }),\n ...(!!state.fromToken && {\n inputUsdValue: getUsdValue(state.fromToken, amount),\n }),\n }));\n },\n retry: (pendingSwap) => {\n const { tokens, blockchains } = useMetaStore.getState().meta;\n const connectedWallets = useWalletsStore.getState().connectedWallets;\n const failedIndex =\n pendingSwap.status === 'failed'\n ? pendingSwap.steps.findIndex((s) => s.status === 'failed')\n : null;\n\n if (failedIndex === null || failedIndex < 0) {\n return;\n }\n\n const firstStep = pendingSwap.steps[0];\n const lastStep = pendingSwap.steps[pendingSwap.steps.length - 1];\n const fromBlockchain =\n blockchains.find(\n (blockchain) => blockchain.name === firstStep.fromBlockchain\n ) || null;\n const toBlockchain =\n blockchains.find(\n (blockchain) => blockchain.name === lastStep.toBlockchain\n ) || null;\n\n const fromToken = tokens.find((token) =>\n tokensAreEqual(token, {\n blockchain: firstStep.fromBlockchain,\n symbol: firstStep.fromSymbol,\n address: firstStep.fromSymbolAddress,\n })\n );\n\n const toToken = tokens.find((token) =>\n tokensAreEqual(token, {\n blockchain: lastStep.toBlockchain,\n symbol: lastStep.toSymbol,\n address: lastStep.toSymbolAddress,\n })\n );\n const sortedSourceTokens = getSortedTokens(\n fromBlockchain,\n tokens,\n connectedWallets,\n []\n );\n const sortedDestinationTokens = getSortedTokens(\n toBlockchain,\n tokens,\n connectedWallets,\n []\n );\n const inputAmount = pendingSwap.inputAmount;\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 bestRoute: null,\n sourceTokens: sortedSourceTokens,\n destinationTokens: sortedDestinationTokens,\n });\n },\n switchFromAndTo: () =>\n set((state) => ({\n fromBlockchain: state.toBlockchain,\n fromToken: state.toToken,\n toBlockchain: state.fromBlockchain,\n toToken: state.fromToken,\n sourceTokens: state.destinationTokens,\n destinationTokens: state.sourceTokens,\n inputAmount: state.outputAmount?.toString() || '',\n inputUsdValue: getUsdValue(\n state.toToken,\n state.outputAmount?.toString() || ''\n ),\n })),\n\n resetFromBlockchain: () =>\n set(() => ({\n fromBlockchain: null,\n sourceTokens: [],\n })),\n resetToBlockchain: () =>\n set(() => ({\n toBlockchain: null,\n destinationTokens: [],\n })),\n setRouteWalletConfirmed: (flag) =>\n set({\n routeWalletsConfirmed: flag,\n }),\n setSelectedWallets: (wallets) => set({ selectedWallets: wallets }),\n setCustomDestination: (address) => set({ customDestination: address }),\n resetRouteWallets: () =>\n set({\n routeWalletsConfirmed: false,\n selectedWallets: [],\n customDestination: '',\n }),\n }))\n )\n);\n", "/* eslint-disable @typescript-eslint/no-magic-numbers */\nimport type { BestRouteEqualityParams, Wallet } from '../types';\nimport type { PendingSwap } from '@rango-dev/queue-manager-rango-preset';\nimport type { PriceImpactWarningLevel } from '@rango-dev/ui';\nimport type {\n SimulationAssetAndAmount,\n SimulationValidationStatus,\n} from '@rango-dev/ui/dist/widget/ui/src/types/swaps';\nimport type {\n Asset,\n BestRouteResponse,\n BlockchainMeta,\n Token,\n} from 'rango-sdk';\n\nimport BigNumber from 'bignumber.js';\n\nimport {\n GAS_FEE_MAX_DECIMALS,\n GAS_FEE_MIN_DECIMALS,\n HIGHT_PRICE_IMPACT,\n LOW_PRICE_IMPACT,\n TOKEN_AMOUNT_MAX_DECIMALS,\n TOKEN_AMOUNT_MIN_DECIMALS,\n} from '../constants/routing';\n\nimport { areEqual } from './common';\nimport { numberToString } from './numbers';\n\nexport function searchParamsToToken(\n tokens: Token[],\n searchParams: string | null,\n chain: BlockchainMeta | null\n): Token | null {\n if (!chain) {\n return null;\n }\n return (\n tokens.find((token) => {\n const symbolAndAddress = searchParams?.split('--');\n if (symbolAndAddress?.length === 1) {\n return (\n token.symbol === symbolAndAddress[0] &&\n token.address === null &&\n token.blockchain === chain.name\n );\n }\n return (\n token.symbol === symbolAndAddress?.[0] &&\n token.address === symbolAndAddress?.[1] &&\n token.blockchain === chain.name\n );\n }) || null\n );\n}\n\nexport function getBestRouteToTokenUsdPrice(\n bestRoute: BestRouteResponse | null\n): number | null | undefined {\n return bestRoute?.result?.swaps[bestRoute?.result?.swaps.length - 1].to\n .usdPrice;\n}\n\nexport function isNumberOfSwapsChanged(\n route1: BestRouteResponse,\n route2: BestRouteResponse\n) {\n const route1Swaps = route1.result?.swaps || [];\n const route2Swaps = route2.result?.swaps || [];\n return route1Swaps.length !== route2Swaps.length;\n}\n\nexport function isRouteSwappersUpdated(\n route1: BestRouteResponse,\n route2: BestRouteResponse\n) {\n const route1Swappers =\n route1.result?.swaps.map((swap) => swap.swapperId) || [];\n const route2Swappers =\n route2.result?.swaps.map((swap) => swap.swapperId) || [];\n return !areEqual(route1Swappers, route2Swappers);\n}\n\nexport function isRouteInternalCoinsUpdated(\n route1: BestRouteResponse,\n route2: BestRouteResponse\n) {\n const route1InternalCoins =\n route1.result?.swaps.map((swap) => swap.to.symbol) || [];\n const route2InternalCoins =\n route2.result?.swaps.map((swap) => swap.to.symbol) || [];\n return !areEqual(route1InternalCoins, route2InternalCoins);\n}\n\nexport function isRouteChanged(\n route1: BestRouteResponse,\n route2: BestRouteResponse\n): boolean {\n return (\n isNumberOfSwapsChanged(route1, route2) ||\n isRouteSwappersUpdated(route1, route2) ||\n isRouteInternalCoinsUpdated(route1, route2)\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 isRouteParametersChanged(params: BestRouteEqualityParams) {\n if (params.store === 'bestRoute') {\n const { prevState, currentState } = params;\n return (\n !!currentState.fromToken &&\n !!currentState.toToken &&\n (prevState.fromBlockchain?.name !== currentState.fromBlockchain?.name ||\n prevState.toBlockchain?.name !== currentState.toBlockchain?.name ||\n prevState.fromToken?.symbol !== currentState.fromToken?.symbol ||\n prevState.toToken?.symbol !== currentState.toToken?.symbol ||\n prevState.fromToken?.blockchain !== prevState.fromToken?.blockchain ||\n prevState.toToken?.blockchain !== currentState.toToken?.blockchain ||\n prevState.fromToken?.address !== currentState.fromToken?.address ||\n prevState.toToken?.address !== currentState.toToken?.address ||\n prevState.inputAmount !== currentState.inputAmount)\n );\n } else if (params.store === 'settings') {\n const { prevState, currentState } = params;\n return (\n prevState.slippage !== currentState.slippage ||\n prevState.customSlippage !== currentState.customSlippage ||\n prevState.disabledLiquiditySources?.length !==\n currentState.disabledLiquiditySources?.length ||\n prevState.infiniteApprove ||\n currentState.infiniteApprove\n );\n }\n return false;\n}\n\nexport function getFormattedBestRoute(\n bestRoute: BestRouteResponse | null\n): BestRouteResponse | null {\n if (!bestRoute) {\n return null;\n }\n\n const formattedSwaps = (bestRoute.result?.swaps || []).map((swap) => ({\n ...swap,\n fromAmount: numberToString(\n swap.fromAmount,\n TOKEN_AMOUNT_MIN_DECIMALS,\n TOKEN_AMOUNT_MAX_DECIMALS\n ),\n toAmount: numberToString(\n swap.toAmount,\n TOKEN_AMOUNT_MIN_DECIMALS,\n TOKEN_AMOUNT_MAX_DECIMALS\n ),\n }));\n\n return {\n ...bestRoute,\n ...(bestRoute.result && {\n result: { ...bestRoute.result, swaps: formattedSwaps },\n }),\n };\n}\n\nexport function getFormattedPendingSwap(pendingSwap: PendingSwap): PendingSwap {\n const formattedSteps = pendingSwap.steps.map((step) => ({\n ...step,\n feeInUsd: numberToString(\n step.feeInUsd,\n GAS_FEE_MIN_DECIMALS,\n GAS_FEE_MAX_DECIMALS\n ),\n outputAmount: numberToString(\n step.outputAmount,\n TOKEN_AMOUNT_MIN_DECIMALS,\n TOKEN_AMOUNT_MAX_DECIMALS\n ),\n expectedOutputAmountHumanReadable: numberToString(\n step.expectedOutputAmountHumanReadable,\n TOKEN_AMOUNT_MIN_DECIMALS,\n TOKEN_AMOUNT_MAX_DECIMALS\n ),\n }));\n\n return {\n ...pendingSwap,\n inputAmount: numberToString(\n pendingSwap.inputAmount,\n TOKEN_AMOUNT_MIN_DECIMALS,\n TOKEN_AMOUNT_MAX_DECIMALS\n ),\n steps: formattedSteps,\n };\n}\n\n//todo: refactor bestRoute store and add loadingStatus\nexport const getBestRouteStatus = (loading: boolean, error: boolean) => {\n if (loading) {\n return 'loading';\n }\n if (error) {\n return 'failed';\n }\n return 'success';\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 tokenToString = (token: Asset): string =>\n `${token.symbol}-${token.blockchain}-${token.address ?? ''}`;\n\n const set = new Set();\n\n listA.forEach((token) => set.add(tokenToString(token)));\n\n return listB.filter((token) => set.has(tokenToString(token))) as R;\n}\n", "/* eslint-disable @typescript-eslint/no-magic-numbers */\nimport type { LoadingStatus } from '../store/meta';\nimport type { ConnectedWallet } from '../store/wallets';\nimport type { ConvertedToken, SwapButtonState, Wallet } from '../types';\nimport type {\n PendingSwap,\n PendingSwapStep,\n} from '@rango-dev/queue-manager-rango-preset';\nimport type { WalletType } from '@rango-dev/wallets-shared';\nimport type {\n BestRouteRequest,\n BestRouteResponse,\n BlockchainMeta,\n RecommendedSlippage,\n SwapResult,\n Token,\n} from 'rango-sdk';\n\nimport { PendingSwapNetworkStatus } from '@rango-dev/queue-manager-rango-preset';\nimport BigNumber from 'bignumber.js';\n\nimport { isValidAddress } from '../components/ConfirmWalletsModal/ConfirmWallets.helpers';\nimport { errorMessages } from '../constants/errors';\nimport { swapButtonTitles } from '../constants/messages';\nimport { ZERO } from '../constants/numbers';\nimport {\n BALANCE_MAX_DECIMALS,\n BALANCE_MIN_DECIMALS,\n TOKEN_AMOUNT_MAX_DECIMALS,\n TOKEN_AMOUNT_MIN_DECIMALS,\n} from '../constants/routing';\nimport { useMetaStore } from '../store/meta';\nimport { ButtonState } from '../types';\n\nimport { removeDuplicateFrom } from './common';\nimport { numberToString } from './numbers';\nimport { getRequiredBalanceOfWallet } from './routing';\nimport { getRequiredChains } 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.div(inputUsdValue).minus(1).multipliedBy(100);\n}\n\nexport function outputRatioHasWarning(\n inputUsdValue: BigNumber | null,\n outputRatio: BigNumber | 0\n): boolean {\n return (\n ((parseInt(outputRatio.toFixed(2) || '0') <= -10 &&\n inputUsdValue?.gte(new BigNumber(400))) ||\n (parseInt(outputRatio.toFixed(2) || '0') <= -5 &&\n inputUsdValue?.gte(new BigNumber(1000)))) ??\n false\n );\n}\n\nexport function hasLimitError(bestRoute: BestRouteResponse | null): boolean {\n return (\n (bestRoute?.result?.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 LimitErrorMessage(bestRoute: BestRouteResponse | null): {\n swap: SwapResult | null;\n fromAmountRangeError: string;\n recommendation: string;\n} {\n if (!bestRoute) {\n return { swap: null, fromAmountRangeError: '', recommendation: '' };\n }\n const swap = (bestRoute?.result?.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 if (!swap) {\n return { swap: null, fromAmountRangeError: '', recommendation: '' };\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 = `Required: >= ${numberToString(\n minimum,\n TOKEN_AMOUNT_MIN_DECIMALS,\n TOKEN_AMOUNT_MAX_DECIMALS\n )} ${swap.from.symbol}`;\n recommendation = errorMessages.bridgeLimitErrors.increaseAmount;\n } else if (isExclusive && !!minimum && minimum.gte(swap.fromAmount)) {\n fromAmountRangeError = `Required: > ${numberToString(\n minimum,\n TOKEN_AMOUNT_MIN_DECIMALS,\n TOKEN_AMOUNT_MAX_DECIMALS\n )} ${swap.from.symbol}`;\n recommendation = errorMessages.bridgeLimitErrors.increaseAmount;\n }\n\n if (!isExclusive && !!maximum && maximum.lt(swap.fromAmount)) {\n fromAmountRangeError = `Required: <= ${numberToString(\n maximum,\n TOKEN_AMOUNT_MIN_DECIMALS,\n TOKEN_AMOUNT_MAX_DECIMALS\n )} ${swap.from.symbol}`;\n recommendation = errorMessages.bridgeLimitErrors.decreaseAmount;\n } else if (isExclusive && !!maximum && maximum.lte(swap.fromAmount)) {\n fromAmountRangeError = `Required: < ${numberToString(\n maximum,\n TOKEN_AMOUNT_MIN_DECIMALS,\n TOKEN_AMOUNT_MAX_DECIMALS\n )} ${swap.from.symbol}`;\n recommendation = errorMessages.bridgeLimitErrors.decreaseAmount;\n }\n\n return { swap, fromAmountRangeError, recommendation };\n}\n\nexport function getSwapButtonState(\n loadingMetaStatus: LoadingStatus,\n connectedWallets: ConnectedWallet[],\n loading: boolean,\n bestRoute: BestRouteResponse | null,\n hasLimitError: boolean,\n highValueLoss: boolean,\n priceImpactCanNotBeComputed: boolean,\n needsToWarnEthOnPath: boolean,\n inputAmount: string\n): SwapButtonState {\n if (loadingMetaStatus !== 'success') {\n return {\n title: swapButtonTitles.connectWallet,\n state: ButtonState.WAITFORCONNECTING,\n disabled: true,\n };\n }\n if (connectedWallets.length == 0) {\n return {\n title: swapButtonTitles.connectWallet,\n state: ButtonState.WAITFORCONNECTING,\n disabled: false,\n };\n }\n if (\n loading ||\n !bestRoute ||\n !bestRoute.result ||\n hasLimitError ||\n !inputAmount ||\n inputAmount === '0'\n ) {\n return {\n title: swapButtonTitles.swap,\n disabled: true,\n state: ButtonState.SWAP,\n };\n } else if (highValueLoss || priceImpactCanNotBeComputed) {\n return {\n title: swapButtonTitles.swapAnyway,\n disabled: false,\n hasWarning: true,\n state: ButtonState.NEEDTOCONFIRM,\n };\n } else if (needsToWarnEthOnPath) {\n return {\n title: swapButtonTitles.ethRouteWarning,\n disabled: false,\n hasWarning: true,\n state: ButtonState.WARNING,\n };\n }\n return {\n title: swapButtonTitles.swap,\n disabled: false,\n state: ButtonState.SWAP,\n };\n}\n\nexport function canComputePriceImpact(\n bestRoute: BestRouteResponse | null,\n inputAmount: string,\n usdValue: BigNumber | null\n) {\n return !(\n (!usdValue || usdValue.lte(ZERO)) &&\n !!bestRoute?.result &&\n !!inputAmount &&\n inputAmount !== '0' &&\n parseFloat(inputAmount || '0') !== 0 &&\n !!bestRoute.result\n );\n}\n\nexport function requiredWallets(route: BestRouteResponse | null) {\n const wallets: string[] = [];\n\n route?.result?.swaps.forEach((swap) => {\n const currentStepFromBlockchain = swap.from.blockchain;\n const currentStepToBlockchain = swap.to.blockchain;\n let lastAddedWallet = wallets[wallets.length - 1];\n if (currentStepFromBlockchain != lastAddedWallet) {\n wallets.push(currentStepFromBlockchain);\n }\n lastAddedWallet = wallets[wallets.length - 1];\n if (currentStepToBlockchain != lastAddedWallet) {\n wallets.push(currentStepToBlockchain);\n }\n });\n return wallets;\n}\n\nexport const getUsdPrice = (\n blockchain: string,\n symbol: string,\n address: string | null,\n allTokens: Token[]\n): number | null => {\n const token = allTokens?.find(\n (t) =>\n t.blockchain === blockchain &&\n t.symbol?.toUpperCase() === symbol?.toUpperCase() &&\n t.address === address\n );\n return token?.usdPrice || null;\n};\n\nexport function getUsdFeeOfStep(\n step: SwapResult,\n allTokens: Token[]\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.expenseType === 'DECREASE_FROM_OUTPUT') {\n continue;\n }\n\n const unitPrice = getUsdPrice(\n fee.asset.blockchain,\n fee.asset.symbol,\n fee.asset.address,\n allTokens\n );\n totalFeeInUsd = totalFeeInUsd.plus(\n new BigNumber(fee.amount).multipliedBy(unitPrice || 0)\n );\n }\n\n return totalFeeInUsd;\n}\n\nexport function getTotalFeeInUsd(\n bestRoute: BestRouteResponse | null,\n allTokens: Token[]\n): BigNumber | null {\n return (\n bestRoute?.result?.swaps.reduce(\n (totalFee: BigNumber, step) =>\n totalFee.plus(getUsdFeeOfStep(step, allTokens)),\n ZERO\n ) || null\n );\n}\n\nexport function hasHighFee(totalFeeInUsd: BigNumber | null) {\n if (!totalFeeInUsd) {\n return false;\n }\n return !totalFeeInUsd.lt(new BigNumber(30));\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 getMinRequiredSlippage(\n route: BestRouteResponse\n): string | null {\n const slippages = route.result?.swaps.map(\n (slippage) => slippage.recommendedSlippage\n );\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 route: BestRouteResponse,\n selectedWallets: Wallet[]\n) {\n const fee = route.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 route: BestRouteResponse,\n selectedWallets: Wallet[],\n userSlippage: string,\n minRequiredSlippage: string | null\n): boolean {\n return (\n hasEnoughBalance(route, selectedWallets) &&\n hasProperSlippage(userSlippage, minRequiredSlippage)\n );\n}\n\nexport function createBestRouteRequestBody(params: {\n fromToken: Token;\n toToken: Token;\n inputAmount: string;\n wallets?: Wallet[];\n selectedWallets?: Wallet[];\n disabledLiquiditySources: string[];\n slippage: number;\n affiliateRef: string | null;\n affiliatePercent: number | null;\n affiliateWallets: { [key: string]: string } | null;\n initialRoute?: BestRouteResponse;\n destination?: string;\n}): BestRouteRequest {\n const {\n fromToken,\n toToken,\n inputAmount,\n wallets,\n selectedWallets,\n disabledLiquiditySources,\n slippage,\n affiliateRef,\n affiliatePercent,\n affiliateWallets,\n initialRoute,\n destination,\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 const chainAndAccounts = connectedWallets.find(\n (connectedWallet) => connectedWallet.blockchain === wallet.chain\n );\n if (!!chainAndAccounts) {\n chainAndAccounts.addresses.push(wallet.address);\n } else {\n connectedWallets.push({\n blockchain: wallet.chain,\n addresses: [wallet.address],\n });\n }\n });\n\n const checkPrerequisites = !!initialRoute;\n\n const filteredBlockchains = removeDuplicateFrom(\n (initialRoute?.result?.swaps || []).reduce(\n (blockchains: string[], swap) => {\n blockchains.push(swap.from.blockchain, swap.to.blockchain);\n // Check if internalSwaps array exists\n if (swap.internalSwaps && Array.isArray(swap.internalSwaps)) {\n swap.internalSwaps.map((internalSwap) => {\n blockchains.push(\n internalSwap.from.blockchain,\n internalSwap.to.blockchain\n );\n });\n }\n return blockchains;\n },\n []\n )\n );\n\n const requestBody: BestRouteRequest = {\n amount: inputAmount.toString(),\n affiliateRef: affiliateRef ?? undefined,\n affiliatePercent: affiliatePercent ?? undefined,\n affiliateWallets: affiliateWallets ?? undefined,\n checkPrerequisites,\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 ...(destination && { destination: destination }),\n ...(disabledLiquiditySources.length > 0 && {\n swapperGroups: disabledLiquiditySources,\n swappersGroupsExclude: true,\n }),\n ...(checkPrerequisites && { blockchains: filteredBlockchains }),\n };\n\n return requestBody;\n}\n\nexport function getWalletsForNewSwap(selectedWallets: Wallet[]) {\n const wallets = selectedWallets.reduce(\n (\n selectedWalletsMap: {\n [p: string]: { address: string; walletType: WalletType };\n },\n selectedWallet\n ) => (\n (selectedWalletsMap[selectedWallet.chain] = {\n address: selectedWallet.address,\n walletType: selectedWallet.walletType,\n }),\n selectedWalletsMap\n ),\n {}\n );\n\n return wallets;\n}\n\nexport function getRouteOutputAmount(route: BestRouteResponse | null) {\n return route?.result?.outputAmount || null;\n}\n\nexport function getPercentageChange(\n inputUsdValue: string | number | null,\n outputUsdValue: string | number | null\n) {\n if (!inputUsdValue || !outputUsdValue) {\n return null;\n }\n return new BigNumber(outputUsdValue)\n .div(new BigNumber(inputUsdValue))\n .minus(1)\n .multipliedBy(100);\n}\n\nexport function isOutputAmountChangedALot(\n oldRoute: BestRouteResponse,\n newRoute: BestRouteResponse\n) {\n const oldOutputAmount = getRouteOutputAmount(oldRoute);\n const newOutputAmount = getRouteOutputAmount(newRoute);\n if (!oldOutputAmount || !newOutputAmount) {\n return false;\n }\n const percentageChange = getPercentageChange(\n oldOutputAmount,\n newOutputAmount\n );\n if (!percentageChange) {\n return true;\n }\n\n return percentageChange.toNumber() <= -1;\n}\n\nexport function getBalanceWarnings(\n route: BestRouteResponse,\n selectedWallets: Wallet[]\n) {\n const fee = route.validationStatus;\n const requiredWallets = getRequiredChains(route);\n const walletsSortedByRequiredWallets = selectedWallets.sort(\n (selectedWallet1, selectedWallet2) =>\n requiredWallets.indexOf(selectedWallet1.chain) -\n requiredWallets.indexOf(selectedWallet2.chain)\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 = ' for network fee';\n }\n if (asset.reason === 'INPUT_ASSET') {\n reason = ' for swap';\n }\n if (asset.reason === 'FEE_AND_INPUT_ASSET') {\n reason = ' for input and network fee';\n }\n const warningMessage = `Needs \u2248 ${requiredAmount} ${symbol}${reason}, but you have ${currentAmount} ${symbol} in your ${asset.asset.blockchain} wallet.`;\n return warningMessage;\n });\n}\n\nexport function calcOutputUsdValue(\n outputAmount?: string,\n tokenPrice?: number | null\n) {\n const amount = !!outputAmount ? new BigNumber(outputAmount) : ZERO;\n\n return amount.multipliedBy(tokenPrice || 0);\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): {\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 // eslint-disable-next-line @typescript-eslint/switch-exhaustiveness-check\n switch (currentStep?.networkStatus) {\n case PendingSwapNetworkStatus.WaitingForConnectingWallet:\n message = message || 'Waiting for connecting wallet';\n break;\n case PendingSwapNetworkStatus.WaitingForQueue:\n message = message || 'Waiting for other running tasks to be finished';\n break;\n case PendingSwapNetworkStatus.WaitingForNetworkChange:\n message = message || 'Waiting for changing wallet network';\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 (\n pendingSwap.status === 'failed' &&\n !!pendingSwap.finishTime &&\n new Date().getTime() - parseInt(pendingSwap.finishTime) < 4 * 3600 * 1000\n );\n}\nexport function isValidCustomDestination(\n blockchain: string,\n address: string\n): boolean {\n const blockchains = useMetaStore.getState().meta.blockchains;\n const regex =\n blockchains.find((chain) => chain.name === blockchain)?.addressPatterns ||\n [];\n return regex.filter((r) => new RegExp(r).test(address)).length > 0;\n}\n\nexport function confirmSwapDisabled(\n fetching: boolean,\n showCustomDestination: boolean,\n customDestination: string,\n bestRoute: BestRouteResponse | null,\n selectedWallets: { walletType: string; chain: string }[],\n lastStepToBlockchain?: BlockchainMeta\n) {\n return (\n fetching ||\n (!showCustomDestination &&\n !requiredWallets(bestRoute).every((chain) =>\n selectedWallets.map((wallet) => wallet.chain).includes(chain)\n )) ||\n (!!showCustomDestination && !customDestination) ||\n (!!showCustomDestination &&\n !!customDestination &&\n lastStepToBlockchain &&\n !isValidAddress(lastStepToBlockchain, customDestination))\n );\n}\n", "/* eslint-disable @typescript-eslint/no-magic-numbers */\nimport type { Step } from '@rango-dev/ui/dist/widget/ui/src/components/BestRoute/BestRoute.types';\nimport type { BestRouteResponse, BlockchainMeta } from 'rango-sdk';\n\nimport {\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 { numberToString } from '../../utils/numbers';\n\nexport function formatBestRoute(\n bestRoute: BestRouteResponse\n): Step[] | undefined {\n return bestRoute.result?.swaps.map((swap) => {\n return {\n swapper: { displayName: swap.swapperId, image: swap.swapperLogo },\n from: {\n token: { displayName: swap.from.symbol, image: swap.from.logo },\n chain: {\n displayName: swap.from.blockchain,\n image: swap.from.blockchainLogo,\n },\n price: {\n value: numberToString(\n swap.fromAmount,\n TOKEN_AMOUNT_MIN_DECIMALS,\n TOKEN_AMOUNT_MAX_DECIMALS\n ),\n usdValue: numberToString(\n swap.from.usdPrice?.toString(),\n USD_VALUE_MIN_DECIMALS,\n USD_VALUE_MAX_DECIMALS\n ),\n },\n },\n to: {\n token: { displayName: swap.to.symbol, image: swap.to.logo },\n chain: {\n displayName: swap.to.blockchain,\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?.toString(),\n USD_VALUE_MIN_DECIMALS,\n USD_VALUE_MAX_DECIMALS\n ),\n },\n },\n };\n });\n}\n\nexport function getRequiredWallets(route: BestRouteResponse | null): string[] {\n const wallets: string[] = [];\n\n route?.result?.swaps.forEach((swap) => {\n const currentStepFromBlockchain = swap.from.blockchain;\n const currentStepToBlockchain = swap.to.blockchain;\n let lastAddedWallet = wallets[wallets.length - 1];\n if (currentStepFromBlockchain != lastAddedWallet) {\n wallets.push(currentStepFromBlockchain);\n }\n lastAddedWallet = wallets[wallets.length - 1];\n if (currentStepToBlockchain != lastAddedWallet) {\n wallets.push(currentStepToBlockchain);\n }\n });\n return wallets;\n}\n\nexport function isValidAddress(\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 { ConfirmSwapError } from '../types';\n\nimport { i18n } from '@lingui/core';\n\nimport { ConfirmSwapErrorTypes } from '../types';\n\nexport const errorMessages = {\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 noRoutesError: {\n title: i18n.t('No Routes Found'),\n description:\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 bridgeLimitErrors: {\n increaseAmount: i18n.t('Bridge Limit Error: Please increase your amount'),\n decreaseAmount: i18n.t('Bridge Limit Error: Please decrease your amount'),\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. If you are sure, continue, otherwise, change the swap.'\n ),\n confirmMessage: i18n.t('Confirm High price impact'),\n },\n routeUpdatedWithHighValueLoss: {\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\nexport function getConfirmSwapErrorMessage(error: ConfirmSwapError) {\n switch (error.type) {\n case ConfirmSwapErrorTypes.NO_ROUTE:\n return error.diagnosisMessage ?? errorMessages.noRoutesError.title;\n case ConfirmSwapErrorTypes.REQUEST_FAILED:\n return errorMessages.genericServerError;\n case ConfirmSwapErrorTypes.ROUTE_UPDATED_WITH_HIGH_VALUE_LOSS:\n return errorMessages.routeUpdatedWithHighValueLoss.title;\n default:\n return '';\n }\n}\n", "/* eslint-disable @typescript-eslint/prefer-enum-initializers */\nimport type { RouteState } from '../store/bestRoute';\nimport type { SettingsState } from '../store/settings';\n\ninterface BestRouteStoreParams {\n fromBlockchain?: RouteState['fromBlockchain'];\n toBlockchain?: RouteState['toBlockchain'];\n fromToken?: RouteState['fromToken'];\n toToken?: RouteState['toToken'];\n inputAmount?: RouteState['inputAmount'];\n}\n\ninterface SettingsStoreParams {\n slippage?: SettingsState['slippage'];\n customSlippage?: SettingsState['customSlippage'];\n disabledLiquiditySources?: SettingsState['disabledLiquiditySources'];\n infiniteApprove?: SettingsState['infiniteApprove'];\n}\n\nexport type BestRouteEqualityParams =\n | {\n store: 'bestRoute';\n prevState: BestRouteStoreParams;\n currentState: BestRouteStoreParams;\n }\n | {\n store: 'settings';\n prevState: SettingsStoreParams;\n currentState: SettingsStoreParams;\n };\n\nexport enum ConfirmSwapErrorTypes {\n NO_ROUTE,\n ROUTE_UPDATED_WITH_HIGH_VALUE_LOSS,\n REQUEST_FAILED,\n REQUEST_CANCELED,\n}\n\nexport type ConfirmSwapError =\n | {\n type: ConfirmSwapErrorTypes.NO_ROUTE;\n diagnosisMessage?: string;\n }\n | {\n type: Exclude<ConfirmSwapErrorTypes, ConfirmSwapErrorTypes.NO_ROUTE>;\n };\n\nexport enum RouteWarningType {\n ROUTE_UPDATED,\n ROUTE_SWAPPERS_UPDATED,\n ROUTE_COINS_UPDATED,\n ROUTE_AND_OUTPUT_AMOUNT_UPDATED,\n}\n\nexport type RouteWarning =\n | {\n type: RouteWarningType.ROUTE_AND_OUTPUT_AMOUNT_UPDATED;\n newOutputAmount: string;\n percentageChange: string;\n }\n | {\n type: Exclude<\n RouteWarningType,\n RouteWarningType.ROUTE_AND_OUTPUT_AMOUNT_UPDATED\n >;\n };\n\nexport enum SlippageWarningType {\n INSUFFICIENT_SLIPPAGE,\n HIGH_SLIPPAGE,\n}\n\nexport type ConfirmSwapWarnings = {\n route: RouteWarning | null;\n balance: { messages: string[] } | null;\n slippage: { type: SlippageWarningType; slippage: string | null } | null;\n};\n", "import { i18n } from '@lingui/core';\n\nexport const swapButtonTitles = {\n connectWallet: i18n.t('Connect Wallet'),\n swap: i18n.t('Swap'),\n swapAnyway: i18n.t('Swap anyway'),\n ethRouteWarning: i18n.t('The route goes through Ethereum. Continue?'),\n};\n", "import type { Notification } from '../types/notification';\nimport type {\n Route,\n RouteEvent,\n StepEvent,\n} from '@rango-dev/queue-manager-rango-preset';\n\nimport { create } from 'zustand';\nimport { persist, subscribeWithSelector } from 'zustand/middleware';\n\nimport createSelectors from './selectors';\n\nexport interface NotificationState {\n notifications: Notification[];\n setNotification: (event: RouteEvent | StepEvent, route: Route) => void;\n setAsRead: (requestId: Notification['requestId']) => void;\n getUnreadNotifications: () => Notification[];\n}\n\nexport const useNotificationStore = createSelectors(\n create<NotificationState>()(\n persist(\n subscribeWithSelector((set, get) => ({\n notifications: [],\n setNotification: (event, route) => {\n const fromStep = route.steps[0];\n const toStep = route.steps[route.steps.length - 1];\n\n const notification: Notification = {\n event,\n creationTime: Date.now(),\n read: false,\n requestId: route.requestId,\n route: {\n from: {\n blockchain: fromStep.fromBlockchain,\n tokenAddress: fromStep.fromSymbolAddress,\n tokenSymbol: fromStep.fromSymbol,\n },\n to: {\n blockchain: toStep.toBlockchain,\n tokenSymbol: toStep.toSymbol,\n tokenAddress: toStep.toSymbolAddress,\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 setAsRead: (requestId) => {\n set((state) => ({\n notifications: state.notifications.map((notificationItem) =>\n notificationItem.requestId === requestId\n ? { ...notificationItem, read: true }\n : notificationItem\n ),\n }));\n },\n getUnreadNotifications: () => {\n return get().notifications.filter(\n (notificationItem) => !notificationItem.read\n );\n },\n })),\n {\n name: 'notification',\n skipHydration: true,\n }\n )\n )\n);\n", "import { create } from 'zustand';\n\nimport createSelectors from './selectors';\n\ninterface UiState {\n connectWalletsButtonDisabled: boolean;\n selectedSwapRequestId: string | null;\n currentPage: string;\n setSelectedSwap: (requestId: string | null) => void;\n setCurrentPage: (path: string) => void;\n}\n\nexport const useUiStore = createSelectors(\n create<UiState>()((set) => ({\n connectWalletsButtonDisabled: false,\n selectedSwapRequestId: null,\n currentPage: '',\n setSelectedSwap: (requestId) => set({ selectedSwapRequestId: requestId }),\n setCurrentPage: (path) => set({ currentPage: path }),\n }))\n);\n", "import { styled } from '@rango-dev/ui';\n\nexport const Container = styled('div', {\n padding: '$10',\n width: '350px',\n minHeight: '150px',\n});\n\nexport const List = styled('ul', {\n padding: 0,\n margin: 0,\n listStyle: 'none',\n\n '.to-chain-token': {\n transform: 'translateX(-3px)',\n },\n});\n\nexport const Images = styled('div', {\n display: 'flex',\n padding: 0,\n alignItems: 'center',\n alignSelf: 'stretch',\n});\n\nexport const NotFoundContainer = styled('div', {\n display: 'flex',\n justifyContent: 'center',\n alignItems: 'center',\n flexDirection: 'column',\n padding: '$10',\n width: '100%',\n height: '150px',\n});\n", "import { i18n } from '@lingui/core';\nimport { Divider, NoNotificationIcon, Typography } from '@rango-dev/ui';\nimport React from 'react';\n\nimport { NotFoundContainer } from './NotificationContent.styles';\n\nexport function NotificationNotFound() {\n return (\n <NotFoundContainer>\n <NoNotificationIcon color=\"secondary\" size={26} />\n <Divider size={12} />\n <Typography variant=\"body\" size=\"medium\" color=\"neutral900\">\n {i18n.t('You have no notification')}\n </Typography>\n </NotFoundContainer>\n );\n}\n", "import { Typography } from '@rango-dev/ui';\nimport React from 'react';\n\nimport { useNotificationStore } from '../../store/notification';\n\nimport { NotificationsBadgeContainer } from './HeaderButtons.styles';\n\nexport function UnreadNotificationsBadge() {\n const { getUnreadNotifications } = useNotificationStore();\n\n const notificationsCount = getUnreadNotifications().length;\n\n return notificationsCount ? (\n <NotificationsBadgeContainer>\n <Typography variant=\"body\" size=\"xsmall\" color=\"$background\">\n {notificationsCount}\n </Typography>\n </NotificationsBadgeContainer>\n ) : null;\n}\n", "import type { PropTypes, Ref } from './Layout.types';\nimport type { PropsWithChildren } from 'react';\n\nimport { BottomLogo, Divider, Header } from '@rango-dev/ui';\nimport React from 'react';\nimport { useNavigate } from 'react-router-dom';\n\nimport { navigationRoutes } from '../../constants/navigationRoutes';\nimport { useUiStore } from '../../store/ui';\nimport { useWalletsStore } from '../../store/wallets';\nimport { BackButton, CancelButton, WalletButton } from '../HeaderButtons';\n\nimport { Container, Content, Footer } from './Layout.styles';\n\nfunction LayoutComponent(props: PropsWithChildren<PropTypes>, ref: Ref) {\n const {\n children,\n header,\n footer,\n noPadding,\n hasLogo = true,\n fixedHeight = true,\n } = props;\n const connectedWallets = useWalletsStore.use.connectedWallets();\n\n const connectWalletsButtonDisabled =\n useUiStore.use.connectWalletsButtonDisabled();\n const navigate = useNavigate();\n\n const onConnectWallet = () => {\n if (!connectWalletsButtonDisabled) {\n navigate('/' + navigationRoutes.wallets);\n }\n };\n return (\n <Container ref={ref} fixedHeight={fixedHeight} id=\"swap-box\">\n <Header\n prefix={<>{header.onBack && <BackButton onClick={header.onBack} />}</>}\n title={header.title}\n suffix={\n <>\n {header.suffix}\n {header.hasConnectWallet && (\n <WalletButton\n onClick={onConnectWallet}\n isConnected={!!connectedWallets?.length}\n />\n )}\n {header.onCancel && <CancelButton onClick={header.onCancel} />}\n </>\n }\n />\n <Content noPadding={noPadding}>{children}</Content>\n {(hasLogo || footer) && (\n <Footer>\n <div className=\"footer__content\">{footer}</div>\n {hasLogo && (\n <div className=\"footer__logo\">\n <Divider size={12} />\n <BottomLogo />\n </div>\n )}\n </Footer>\n )}\n </Container>\n );\n}\n\nconst Layout = React.forwardRef(LayoutComponent);\nLayout.displayName = 'Layout';\n\nexport { Layout };\n", "import { styled } from '@rango-dev/ui';\n\nexport const Container = styled('div', {\n position: 'relative',\n display: 'flex',\n flexDirection: 'column',\n borderRadius: '$primary',\n overflow: 'hidden !important',\n boxShadow: '15px 15px 15px 0px rgba(0, 0, 0, 0.05)',\n width: '95vw',\n maxWidth: '390px',\n maxHeight: '700px',\n variants: {\n fixedHeight: {\n true: {\n height: '95vh',\n },\n false: {\n height: 'auto',\n },\n },\n },\n});\nexport const Content = styled('div', {\n display: 'flex',\n flexDirection: 'column',\n flex: 1,\n padding: '$20 $20 $10 $20',\n backgroundColor: '$background',\n position: 'relative',\n overflowY: 'auto',\n overflowX: 'hidden',\n variants: {\n noPadding: {\n true: {\n padding: '0',\n },\n },\n },\n});\n\nexport const Footer = styled('div', {\n backgroundColor: '$background',\n '& .footer__content': {\n padding: '$0 $20',\n },\n '& .footer__logo': {\n padding: '$0 $20 $10 $20',\n },\n});\n", "import type { PropTypes } from './NoRoutes.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 { useMetaStore } from '../../store/meta';\nimport { useSettingsStore } from '../../store/settings';\n\nimport { makeInfo } from './NoRoutes.helper';\nimport { Container, Footer, PrefixIcon } from './NoRoutes.styles';\n\nexport function NoRoutes(props: PropTypes) {\n const { diagnosisMessage, fetch, error } = props;\n const disabledLiquiditySources =\n useSettingsStore.use.disabledLiquiditySources();\n const loadingMetaStatus = useMetaStore.use.loadingStatus();\n const toggleAllLiquiditySources =\n useSettingsStore.use.toggleAllLiquiditySources();\n\n const hasError = error || loadingMetaStatus === 'failed';\n\n const info = makeInfo(\n diagnosisMessage ?? null,\n disabledLiquiditySources,\n hasError,\n toggleAllLiquiditySources,\n fetch\n );\n\n return (\n <Container>\n <NoRouteIcon size={24} color=\"gray\" />\n <Divider size={4} />\n <Typography variant=\"title\" size=\"small\">\n {errorMessages.noRoutesError.title}\n </Typography>\n {!!info.description && (\n <Typography\n variant=\"body\"\n size=\"small\"\n align=\"center\"\n color=\"neutral900\">\n {info.description}\n </Typography>\n )}\n <Divider size={4} />\n {!!info.alert && (\n <Footer>\n <Alert\n type={info.alert.type}\n title={info.alert.text}\n action={\n info.alert.action && (\n <Button\n size=\"xsmall\"\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 { create } from 'zustand';\nimport { persist, subscribeWithSelector } from 'zustand/middleware';\n\nimport { DEFAULT_SLIPPAGE } from '../constants/swapSettings';\nimport { removeDuplicateFrom } from '../utils/common';\n\nimport { useMetaStore } from './meta';\nimport createSelectors from './selectors';\n\ntype Theme = 'auto' | 'dark' | 'light';\n\nexport interface SettingsState {\n slippage: number;\n customSlippage: number | null;\n infiniteApprove: boolean;\n disabledLiquiditySources: string[];\n theme: Theme;\n affiliateRef: string | null;\n affiliatePercent: number | null;\n affiliateWallets: { [key: string]: string } | null;\n setSlippage: (slippage: number) => void;\n setCustomSlippage: (customSlippage: number | null) => void;\n toggleInfiniteApprove: () => void;\n toggleLiquiditySource: (name: string) => void;\n setTheme: (theme: Theme) => void;\n toggleAllLiquiditySources: (shouldReset?: boolean) => void;\n setAffiliateRef: (affiliateRef: string | null) => void;\n setAffiliatePercent: (affiliatePercent: number | null) => void;\n setAffiliateWallets: (\n affiliateWallets: { [key: string]: string } | null\n ) => void;\n}\n\nexport const useSettingsStore = createSelectors(\n create<SettingsState>()(\n persist(\n subscribeWithSelector((set) => ({\n slippage: DEFAULT_SLIPPAGE,\n customSlippage: null,\n infiniteApprove: false,\n affiliateRef: null,\n affiliatePercent: null,\n affiliateWallets: null,\n disabledLiquiditySources: [],\n theme: 'auto',\n setSlippage: (slippage) =>\n set(() => ({\n slippage: slippage,\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: (shouldReset?: boolean) =>\n set((state) => {\n if (shouldReset) {\n return { disabledLiquiditySources: [] };\n }\n const { swappers } = useMetaStore.getState().meta;\n const swappersGroup = removeDuplicateFrom(\n swappers.map((swapper) => swapper.swapperGroup)\n );\n\n if (\n swappersGroup.length === state.disabledLiquiditySources.length\n ) {\n return { disabledLiquiditySources: [] };\n }\n\n return {\n disabledLiquiditySources: swappersGroup,\n };\n }),\n toggleInfiniteApprove: () =>\n set((state) => ({\n infiniteApprove: !state.infiniteApprove,\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:\n state.disabledLiquiditySources.concat(name),\n };\n }),\n setTheme: (theme) =>\n set(() => ({\n theme,\n })),\n })),\n {\n name: 'user-settings',\n skipHydration: true,\n }\n )\n )\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 = 100;\n\nexport const MIN_SLIPPGAE = 0;\n", "import type { Info } from './NoRoutes.types';\n\nimport { errorMessages } from '../../constants/errors';\n\nexport function makeInfo(\n diagnosisMessage: string | null,\n disabledLiquiditySources: string[],\n hasError: boolean,\n toggleAllLiquiditySources: (shouldReset: boolean) => void,\n refetchBestRoute: () => void\n): Info {\n if (hasError) {\n return {\n alert: {\n type: 'warning',\n text: errorMessages.genericServerError,\n action: {\n onClick: refetchBestRoute,\n title: 'Retry',\n },\n },\n description: '',\n };\n } else if (diagnosisMessage) {\n return {\n alert: {\n type: 'error',\n text: diagnosisMessage,\n action: null,\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: 'Reset',\n },\n },\n description: errorMessages.liquiditySourcesError.description,\n };\n }\n return {\n alert: null,\n description: errorMessages.noRoutesError.description,\n };\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 Footer = styled('div', {\n width: '100%',\n});\n\nexport const PrefixIcon = styled('div', {\n padding: '$6 $0',\n});\n", "import type { PropTypes } from './RouteErrors.types';\n\nimport { Alert, Divider, InfoIcon } from '@rango-dev/ui';\nimport React from 'react';\n\nimport { errorMessages } from '../../constants/errors';\nimport { useBestRouteStore } from '../../store/bestRoute';\nimport { hasLimitError, LimitErrorMessage } from '../../utils/swap';\n\nimport { Action, Alerts } from './RouteErrors.styles';\nimport { RouteErrorsModal } from './RouteErrorsModal';\n\nconst WARNING_LEVEL_LIMIT = -10;\n\nexport function RouteErrors(props: PropTypes) {\n const { bestRoute } = useBestRouteStore();\n const {\n highValueLoss,\n percentageChange,\n priceImpactCanNotBeComputed,\n openModal,\n onToggle,\n totalFeeInUsd,\n outputUsdValue,\n inputUsdValue,\n loading,\n extraSpace,\n } = props;\n const error = hasLimitError(bestRoute);\n const { recommendation } = LimitErrorMessage(bestRoute);\n\n const showWarnings = !error && (highValueLoss || priceImpactCanNotBeComputed);\n const showAlerts = showWarnings || error;\n\n return (\n <>\n {(loading || (extraSpace && !showAlerts)) && <Divider size={20} />}\n {showAlerts && (\n <Alerts>\n {showWarnings && (\n <>\n <Alert\n title={\n highValueLoss\n ? errorMessages.highValueLossError.title\n : errorMessages.unknownPriceError.title\n }\n type={\n highValueLoss && !!percentageChange?.lt(WARNING_LEVEL_LIMIT)\n ? 'error'\n : 'warning'\n }\n variant=\"alarm\"\n action={\n <Action onClick={() => onToggle(true)}>\n <InfoIcon size={12} color=\"gray\" />\n </Action>\n }\n />\n </>\n )}\n {error && (\n <Alert type=\"error\" variant=\"alarm\" title={recommendation} />\n )}\n </Alerts>\n )}\n\n <RouteErrorsModal\n highValueLoss={highValueLoss}\n open={openModal}\n onToggle={onToggle}\n percentageChange={percentageChange}\n inputUsdValue={inputUsdValue}\n outputUsdValue={outputUsdValue}\n totalFeeInUsd={totalFeeInUsd}\n />\n </>\n );\n}\n", "import { styled } from '@rango-dev/ui';\n\nexport const Alerts = styled('div', {\n width: '100%',\n paddingTop: '$10',\n});\n\nexport const Flex = styled('div', {\n display: 'flex',\n flexDirection: 'column',\n alignItems: 'flex-start',\n gap: 10,\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});\n\nexport const Action = styled('div', {\n padding: '$2',\n alignSelf: 'flex-start',\n cursor: 'pointer',\n});\n", "import type { ModalPropTypes } from './RouteErrors.types';\n\nimport {\n Button,\n Divider,\n MessageBox,\n Modal,\n Typography,\n WarningIcon,\n} from '@rango-dev/ui';\nimport React from 'react';\nimport { useNavigate } from 'react-router-dom';\n\nimport { errorMessages } from '../../constants/errors';\nimport { navigationRoutes } from '../../constants/navigationRoutes';\nimport {\n GAS_FEE_MAX_DECIMALS,\n GAS_FEE_MIN_DECIMALS,\n HIGHT_PRICE_IMPACT,\n PERCENTAGE_CHANGE_MAX_DECIMALS,\n PERCENTAGE_CHANGE_MIN_DECIMALS,\n USD_VALUE_MAX_DECIMALS,\n USD_VALUE_MIN_DECIMALS,\n} from '../../constants/routing';\nimport { numberToString } from '../../utils/numbers';\n\nimport { Flex } from './RouteErrors.styles';\nimport { RouteErrorsModalItem } from './RouteErrorsModalItem';\n\nexport function RouteErrorsModal(props: ModalPropTypes) {\n const {\n highValueLoss,\n open,\n onToggle,\n percentageChange,\n inputUsdValue,\n outputUsdValue,\n totalFeeInUsd,\n } = props;\n const navigate = useNavigate();\n const type =\n highValueLoss && !!percentageChange?.lt(HIGHT_PRICE_IMPACT)\n ? 'error'\n : 'warning';\n const highValueLossData = [\n {\n title: 'Swapping',\n value: numberToString(\n inputUsdValue,\n USD_VALUE_MIN_DECIMALS,\n USD_VALUE_MAX_DECIMALS\n ),\n },\n {\n title: 'Gas cost',\n value: numberToString(\n totalFeeInUsd,\n GAS_FEE_MIN_DECIMALS,\n GAS_FEE_MAX_DECIMALS\n ),\n },\n {\n title: 'Receiving',\n value: numberToString(\n outputUsdValue,\n USD_VALUE_MIN_DECIMALS,\n USD_VALUE_MAX_DECIMALS\n ),\n },\n {\n title: 'Price impact',\n value: numberToString(\n percentageChange,\n PERCENTAGE_CHANGE_MIN_DECIMALS,\n PERCENTAGE_CHANGE_MAX_DECIMALS\n ),\n valueColor: `${type}500`,\n },\n ];\n\n return (\n <Modal\n open={open}\n onClose={() => onToggle(false)}\n container={document.getElementById('swap-box') || document.body}>\n {highValueLoss ? (\n <MessageBox\n type={type}\n title={errorMessages.highValueLossError.impactTitle}\n description={errorMessages.highValueLossError.description}\n />\n ) : (\n <MessageBox\n type={type}\n title={errorMessages.unknownPriceError.impactTitle}\n description={errorMessages.unknownPriceError.description}\n />\n )}\n {highValueLoss && (\n <Flex>\n <Divider size={20} />\n <Typography size=\"small\" variant=\"title\">\n Details\n </Typography>\n <Flex>\n {highValueLossData.map((item, index) => {\n const key = index;\n return <RouteErrorsModalItem key={key} {...item} />;\n })}\n </Flex>\n </Flex>\n )}\n <Divider size={32} />\n <Button\n type=\"primary\"\n size=\"large\"\n prefix={<WarningIcon />}\n fullWidth\n onClick={() => {\n navigate(navigationRoutes.confirmSwap);\n }}>\n {highValueLoss\n ? errorMessages.highValueLossError.confirmMessage\n : errorMessages.unknownPriceError.confirmMessage}\n </Button>\n </Modal>\n );\n}\n", "import type { ModalContentData } from './RouteErrors.types';\n\nimport { Typography } from '@rango-dev/ui';\nimport React from 'react';\n\nimport { Item } from './RouteErrors.styles';\n\nexport function RouteErrorsModalItem(props: ModalContentData) {\n const { title, value, valueColor } = props;\n\n return (\n <Item>\n <Typography size=\"medium\" variant=\"label\" color=\"neutral800\">\n {title}\n </Typography>\n <Typography\n size=\"large\"\n variant=\"label\"\n color={valueColor || 'foreground'}>\n {`${valueColor ? '%' : '$'}${value}`}\n </Typography>\n </Item>\n );\n}\n", "import { ReverseIcon, styled } from '@rango-dev/ui';\nimport React from 'react';\n\nimport { useBestRouteStore } from '../store/bestRoute';\n\nconst SwitchButtonContainer = styled('div', {\n position: 'absolute',\n bottom: '-12px',\n left: '50%',\n transform: 'translate(-50%, 10%)',\n cursor: 'pointer',\n});\n\nconst 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 '&:hover': {\n color: '$secondary500',\n },\n});\n\nexport function SwitchFromAndToButton() {\n const switchFromAndTo = useBestRouteStore.use.switchFromAndTo();\n\n return (\n <SwitchButtonContainer>\n <StyledButton\n onClick={() => {\n switchFromAndTo();\n }}>\n <ReverseIcon size={12} />\n </StyledButton>\n </SwitchButtonContainer>\n );\n}\n", "import { useEffect, useRef, useState } from 'react';\n\nimport { useBestRouteStore } from '../store/bestRoute';\nimport { useSettingsStore } from '../store/settings';\nimport { debounce } from '../utils/common';\nimport { isPositiveNumber } from '../utils/numbers';\nimport { createBestRouteRequestBody } from '../utils/swap';\nimport { tokensAreEqual } from '../utils/wallets';\n\nimport { useFetchBestRoute } from './useFetchBestRoute';\n\nconst DEBOUNCE_DELAY = 600;\n\ntype UseSwapInput = {\n fetch: () => void;\n loading: boolean;\n error: string;\n};\n\n/**\n * a hook for fetching best route based on from and to input values\n * we use this hook in home page\n */\nexport function useSwapInput(): UseSwapInput {\n const { fetch: fetchBestRoute, cancelFetch } = useFetchBestRoute();\n const [loading, setLoading] = useState(false);\n const {\n fromToken,\n toToken,\n inputAmount,\n inputUsdValue,\n resetRoute,\n setRoute,\n } = useBestRouteStore();\n const {\n slippage,\n customSlippage,\n affiliatePercent,\n affiliateRef,\n affiliateWallets,\n disabledLiquiditySources,\n } = useSettingsStore();\n const [error, setError] = useState('');\n const prevDisabledLiquiditySources = useRef(disabledLiquiditySources);\n const userSlippage = customSlippage ?? slippage;\n const hasTokensValue = !fromToken || !toToken;\n const shouldSkipRequest =\n hasTokensValue ||\n tokensAreEqual(fromToken, toToken) ||\n !isPositiveNumber(inputAmount);\n\n const fetch: UseSwapInput['fetch'] = () => {\n if (!loading) {\n setLoading(true);\n }\n if (!shouldSkipRequest) {\n resetRoute();\n const requestBody = createBestRouteRequestBody({\n fromToken,\n toToken,\n inputAmount,\n disabledLiquiditySources,\n slippage: userSlippage,\n affiliateRef,\n affiliatePercent,\n affiliateWallets,\n });\n fetchBestRoute(requestBody)\n .then((res) => {\n setLoading(false);\n setRoute(res);\n })\n .catch((error) => {\n resetRoute();\n if (error?.code !== 'ERR_CANCELED') {\n setError(error.message);\n setLoading(false);\n }\n });\n }\n };\n\n const debouncedFetch = debounce(() => {\n if (!shouldSkipRequest) {\n fetch();\n }\n }, DEBOUNCE_DELAY);\n\n useEffect(() => {\n if (!isPositiveNumber(inputAmount) || inputUsdValue?.eq(0)) {\n setLoading(false);\n cancelFetch();\n return;\n }\n if (shouldSkipRequest) {\n return;\n }\n resetRoute();\n setLoading(true);\n debouncedFetch();\n return cancelFetch;\n }, [inputAmount, shouldSkipRequest]);\n\n useEffect(() => {\n const disabledLiquiditySourceReset =\n !!prevDisabledLiquiditySources.current.length &&\n !disabledLiquiditySources.length;\n if (!shouldSkipRequest && disabledLiquiditySourceReset) {\n fetch();\n }\n prevDisabledLiquiditySources.current = disabledLiquiditySources;\n return cancelFetch;\n }, [disabledLiquiditySources.length]);\n\n return { fetch, loading, error };\n}\n", "import type { BestRouteRequest, BestRouteResponse } from 'rango-sdk';\n\nimport { useRef, useState } from 'react';\n\nimport { httpService } from '../services/httpService';\n\ninterface UseFetchBestRoute {\n fetch: (requestBody: BestRouteRequest) => Promise<BestRouteResponse>;\n cancelFetch: () => void;\n loading: boolean;\n}\n\nexport function useFetchBestRoute(): UseFetchBestRoute {\n const [loading, setLoading] = useState(false);\n const abortController = useRef<AbortController | null>(null);\n const cancel = () => abortController.current?.abort();\n\n const fetch: UseFetchBestRoute['fetch'] = async (requestBody) => {\n cancel();\n abortController.current = new AbortController();\n\n setLoading(true);\n\n try {\n const res = await httpService().getBestRoute(requestBody, {\n signal: abortController.current.signal,\n });\n abortController.current = null;\n return res;\n // eslint-disable-next-line @typescript-eslint/no-explicit-any, no-useless-catch\n } catch (error: any) {\n throw error;\n } finally {\n setLoading(false);\n }\n };\n return { fetch, loading, cancelFetch: cancel };\n}\n", "import { useEffect, useRef } from 'react';\nimport {\n createSearchParams,\n useLocation,\n useSearchParams,\n} from 'react-router-dom';\n\nimport { navigationRoutes } from '../constants/navigationRoutes';\nimport { SearchParams } from '../constants/searchParams';\nimport { useBestRouteStore } from '../store/bestRoute';\nimport { useMetaStore } from '../store/meta';\nimport { useUiStore } from '../store/ui';\nimport { searchParamsToToken } from '../utils/routing';\n\nexport function UpdateUrl() {\n const firstRender = useRef(true);\n const [searchParams, setSearchParams] = useSearchParams();\n const location = useLocation();\n const firstRenderSearchParams = useRef(location.search);\n const searchParamsRef = useRef<Record<string, string>>({});\n const fromBlockchain = useBestRouteStore.use.fromBlockchain();\n const toBlockchain = useBestRouteStore.use.toBlockchain();\n const fromToken = useBestRouteStore.use.fromToken();\n const toToken = useBestRouteStore.use.toToken();\n const setFromBlockchain = useBestRouteStore.use.setFromBlockchain();\n const setFromToken = useBestRouteStore.use.setFromToken();\n const setToBlockchain = useBestRouteStore.use.setToBlockchain();\n const setToToken = useBestRouteStore.use.setToToken();\n const inputAmount = useBestRouteStore.use.inputAmount();\n const setInputAmount = useBestRouteStore.use.setInputAmount();\n const loadingStatus = useMetaStore.use.loadingStatus();\n const { blockchains, tokens } = useMetaStore.use.meta();\n const setSelectedSwap = useUiStore.use.setSelectedSwap();\n\n useEffect(() => {\n const params: Record<string, string> = {};\n createSearchParams(firstRenderSearchParams.current).forEach(\n (value, key) => {\n params[key] = value;\n }\n );\n searchParamsRef.current = params;\n const requestId =\n location.pathname.split(navigationRoutes.swaps + '/')[1] || null;\n if (requestId) {\n setSelectedSwap(requestId);\n }\n }, []);\n\n useEffect(() => {\n if (!firstRender.current) {\n let fromChainString = '',\n fromTokenString = '',\n toChainString = '',\n toTokenString = '',\n fromAmount = '';\n if (loadingStatus !== 'success') {\n fromChainString = searchParamsRef.current[SearchParams.FROM_CHAIN];\n fromTokenString = searchParamsRef.current[SearchParams.FROM_TOKEN];\n toChainString = searchParamsRef.current[SearchParams.TO_CHAIN];\n toTokenString = searchParamsRef.current[SearchParams.TO_TOKEN];\n fromAmount =\n searchParamsRef.current[SearchParams.FROM_AMOUNT] || inputAmount;\n } else {\n if (location.state === 'redirect') {\n return;\n }\n fromChainString = fromBlockchain?.name || '';\n fromTokenString =\n (fromToken?.symbol || '') +\n (fromToken?.address ? `--${fromToken?.address}` : '');\n toChainString = toBlockchain?.name || '';\n toTokenString =\n (toToken?.symbol || '') +\n (toToken?.address ? `--${toToken?.address}` : '');\n fromAmount = inputAmount;\n }\n setSearchParams(\n {\n ...(fromChainString && {\n [SearchParams.FROM_CHAIN]: fromChainString,\n }),\n ...(fromTokenString && {\n [SearchParams.FROM_TOKEN]: fromTokenString,\n }),\n ...(toChainString && { [SearchParams.TO_CHAIN]: toChainString }),\n ...(toTokenString && { [SearchParams.TO_TOKEN]: toTokenString }),\n ...(fromAmount && {\n [SearchParams.FROM_AMOUNT]: fromAmount.toString(),\n }),\n },\n { replace: true }\n );\n }\n firstRender.current = false;\n }, [\n location.pathname,\n inputAmount,\n fromBlockchain,\n fromToken,\n toBlockchain,\n toToken,\n ]);\n\n useEffect(() => {\n if (loadingStatus === 'success') {\n const fromChainString = searchParams.get(SearchParams.FROM_CHAIN);\n const fromTokenString = searchParams.get(SearchParams.FROM_TOKEN);\n const toChainString = searchParams.get(SearchParams.TO_CHAIN);\n const toTokenString = searchParams.get(SearchParams.TO_TOKEN);\n const fromAmount = searchParams.get(SearchParams.FROM_AMOUNT);\n const fromBlockchain = blockchains.find(\n (blockchain) => blockchain.name === fromChainString\n );\n const fromToken = searchParamsToToken(\n tokens,\n fromTokenString,\n fromBlockchain || null\n );\n const toBlockchain = blockchains.find(\n (blockchain) => blockchain.name === toChainString\n );\n const toToken = searchParamsToToken(\n tokens,\n toTokenString,\n toBlockchain || null\n );\n if (!!fromBlockchain) {\n setFromBlockchain(fromBlockchain);\n if (!!fromToken) {\n setFromToken(fromToken);\n }\n }\n if (!!toBlockchain) {\n setToBlockchain(toBlockchain);\n if (!!toToken) {\n setToToken(toToken);\n }\n }\n if (fromAmount) {\n setInputAmount(fromAmount);\n }\n }\n }, [loadingStatus]);\n\n return null;\n}\n", "import type { WidgetConfig } from '../types';\n\nimport React from 'react';\nimport { useRoutes } from 'react-router-dom';\n\nimport { navigationRoutes } from '../constants/navigationRoutes';\nimport { ConfirmSwapPage } from '../pages/ConfirmSwapPage';\nimport { HistoryPage } from '../pages/HistoryPage';\nimport { Home } from '../pages/Home';\nimport { LanguagePage } from '../pages/LanguagePage';\nimport { LiquiditySourcePage } from '../pages/LiquiditySourcePage';\nimport { SelectBlockchainPage } from '../pages/SelectBlockchainPage';\nimport { SelectSwapItemsPage } from '../pages/SelectSwapItemsPage';\nimport { SettingsPage } from '../pages/SettingsPage';\nimport { SwapDetailsPage } from '../pages/SwapDetailsPage';\nimport { ThemePage } from '../pages/ThemePage';\nimport { WalletsPage } from '../pages/WalletsPage';\n\nconst getAbsolutePath = (path: string) => path.replace('/', '');\n\ninterface PropTypes {\n config?: WidgetConfig;\n}\n\nexport function AppRoutes(props: PropTypes) {\n const { config } = props;\n\n return useRoutes([\n {\n path: navigationRoutes.home,\n element: <Home />,\n },\n {\n path: navigationRoutes.fromSwap,\n element: (\n <SelectSwapItemsPage\n type=\"from\"\n supportedBlockchains={config?.from?.blockchains}\n supportedTokens={config?.from?.tokens}\n pinnedTokens={config?.pinnedTokens}\n />\n ),\n },\n {\n path: navigationRoutes.toSwap,\n element: (\n <SelectSwapItemsPage\n type=\"to\"\n supportedBlockchains={config?.to?.blockchains}\n supportedTokens={config?.to?.tokens}\n pinnedTokens={config?.pinnedTokens}\n />\n ),\n },\n {\n path: navigationRoutes.fromBlockchain,\n element: (\n <SelectBlockchainPage\n type=\"from\"\n supportedBlockchains={config?.to?.blockchains}\n />\n ),\n },\n {\n path: navigationRoutes.toBlockchain,\n element: (\n <SelectBlockchainPage\n type=\"to\"\n supportedBlockchains={config?.to?.blockchains}\n />\n ),\n },\n {\n path: navigationRoutes.settings,\n element: (\n <SettingsPage\n singleTheme={config?.theme?.singleTheme}\n supportedSwappers={config?.liquiditySources}\n />\n ),\n },\n {\n path: navigationRoutes.themes,\n element: <ThemePage />,\n },\n {\n path: navigationRoutes.languages,\n element: <LanguagePage />,\n },\n {\n path: navigationRoutes.exchanges,\n element: (\n <LiquiditySourcePage\n sourceType=\"Exchanges\"\n supportedSwappers={config?.liquiditySources}\n />\n ),\n },\n {\n path: navigationRoutes.bridges,\n element: (\n <LiquiditySourcePage\n sourceType=\"Bridges\"\n supportedSwappers={config?.liquiditySources}\n />\n ),\n },\n { path: navigationRoutes.swaps, element: <HistoryPage /> },\n {\n path: navigationRoutes.swapDetails,\n element: <SwapDetailsPage />,\n },\n {\n path: navigationRoutes.wallets,\n element: (\n <WalletsPage\n supportedWallets={config?.wallets}\n multiWallets={\n typeof config?.multiWallets === 'undefined'\n ? true\n : config.multiWallets\n }\n config={config}\n />\n ),\n },\n {\n path: getAbsolutePath(navigationRoutes.confirmSwap),\n element: <ConfirmSwapPage config={config} />,\n },\n ]);\n}\n", "/* eslint-disable @typescript-eslint/no-magic-numbers */\nimport type {\n ConfirmSwap,\n ConfirmSwapFetchResult,\n} from '../hooks/useConfirmSwap';\nimport type { WidgetConfig } from '../types';\n\nimport { i18n } from '@lingui/core';\nimport { useManager } from '@rango-dev/queue-manager-react';\nimport {\n Alert,\n BestRoute,\n BestRouteSkeleton,\n Button,\n Divider,\n IconButton,\n MessageBox,\n Modal,\n RefreshIcon,\n SettingsIcon,\n styled,\n Tooltip,\n Typography,\n WalletIcon,\n} from '@rango-dev/ui';\nimport React, { useEffect, useState } from 'react';\nimport { flushSync } from 'react-dom';\nimport { useNavigate } from 'react-router-dom';\n\nimport {\n formatBestRoute,\n getRequiredWallets,\n} from '../components/ConfirmWalletsModal/ConfirmWallets.helpers';\nimport { ConfirmWalletsModal } from '../components/ConfirmWalletsModal/ConfirmWalletsModal';\nimport { HeaderButton } from '../components/HeaderButtons/HeaderButtons.styles';\nimport { Layout } from '../components/Layout';\nimport { NoRoutes } from '../components/NoRoutes';\nimport { getConfirmSwapErrorMessage } from '../constants/errors';\nimport { navigationRoutes } from '../constants/navigationRoutes';\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 { getRouteWarningMessage } from '../constants/warnings';\nimport { useConfirmSwap } from '../hooks/useConfirmSwap';\nimport { useBestRouteStore } from '../store/bestRoute';\nimport { useMetaStore } from '../store/meta';\nimport { useSettingsStore } from '../store/settings';\nimport { useUiStore } from '../store/ui';\nimport { useWalletsStore } from '../store/wallets';\nimport {\n ConfirmSwapErrorTypes,\n RouteWarningType,\n SlippageWarningType,\n} from '../types';\nimport {\n numberToString,\n secondsToString,\n totalArrivalTime,\n} from '../utils/numbers';\nimport { getPriceImpactLevel } from '../utils/routing';\nimport { getPercentageChange, getTotalFeeInUsd } from '../utils/swap';\n\nconst Container = styled('div', {\n position: 'relative',\n width: '100%',\n '& .description': {\n display: 'flex',\n justifyContent: 'space-between',\n alignItems: 'center',\n paddingBottom: '$10',\n },\n '& .icon': {\n width: '$24',\n height: '$24',\n display: 'flex',\n justifyContent: 'center',\n alignItems: 'center',\n },\n});\n\nconst Buttons = styled('div', {\n width: '100%',\n display: 'flex',\n justifyContent: 'space-between',\n '& .confirm-button': {\n flexGrow: 1,\n paddingRight: '$10',\n },\n [`& ${IconButton}`]: {\n width: '$48',\n height: '$48',\n },\n});\n\ntype PropTypes = {\n config?: WidgetConfig;\n};\n\nexport function ConfirmSwapPage(props: PropTypes) {\n //TODO: move component's logics to a custom hook\n const { config } = props;\n const {\n bestRoute,\n inputAmount,\n outputAmount,\n inputUsdValue,\n outputUsdValue,\n setInputAmount,\n selectedWallets,\n routeWalletsConfirmed,\n setRouteWalletConfirmed,\n customDestination,\n } = useBestRouteStore();\n const navigate = useNavigate();\n const [dbErrorMessage, setDbErrorMessage] = useState<string>('');\n const [showSlippageWarning, setShowSlippageWarning] = useState(false);\n\n const { connectedWallets } = useWalletsStore();\n const showWalletsOnInit = !routeWalletsConfirmed;\n const [showWallets, setShowWallets] = useState(false);\n const setSelectedSwap = useUiStore.use.setSelectedSwap();\n const {\n meta: { tokens },\n loadingStatus: loadingMetaStatus,\n } = useMetaStore();\n const slippage = useSettingsStore.use.slippage();\n const customSlippage = useSettingsStore.use.customSlippage();\n const { manager } = useManager();\n const selectedSlippage = customSlippage || slippage;\n const {\n fetch: confirmSwap,\n loading: fetchingConfirmationRoute,\n cancelFetch,\n } = useConfirmSwap();\n const [confirmSwapResult, setConfirmSwapResult] =\n useState<ConfirmSwapFetchResult>({\n swap: null,\n error: null,\n warnings: null,\n });\n const showSkeleton =\n fetchingConfirmationRoute || loadingMetaStatus === 'loading';\n const showNoRouteFound =\n !fetchingConfirmationRoute &&\n confirmSwapResult.error &&\n [\n ConfirmSwapErrorTypes.NO_ROUTE,\n ConfirmSwapErrorTypes.REQUEST_FAILED,\n ].includes(confirmSwapResult.error.type);\n const showBestRoute =\n !showNoRouteFound &&\n !fetchingConfirmationRoute &&\n bestRoute &&\n bestRoute.result;\n\n const totalFeeInUsd = getTotalFeeInUsd(bestRoute, tokens);\n const percentageChange = numberToString(\n getPercentageChange(\n inputUsdValue?.toNumber() ?? 0,\n outputUsdValue?.toNumber() ?? 0\n ),\n PERCENTAGE_CHANGE_MIN_DECIMALS,\n PERCENTAGE_CHANGE_MAX_DECIMALS\n );\n\n const warningLevel = getPriceImpactLevel(parseFloat(percentageChange));\n\n const onConfirmSwap: ConfirmSwap['fetch'] = async ({\n selectedWallets,\n customDestination,\n }) => {\n const result = await confirmSwap?.({ selectedWallets, customDestination });\n setConfirmSwapResult(result);\n return result;\n };\n\n const addNewSwap = async () => {\n if (confirmSwapResult.swap && routeWalletsConfirmed) {\n try {\n await manager?.create(\n 'swap',\n { swapDetails: confirmSwapResult.swap },\n { id: confirmSwapResult.swap.requestId }\n );\n setSelectedSwap(confirmSwapResult.swap.requestId);\n navigate(\n '/' + navigationRoutes.swaps + `/${confirmSwapResult.swap.requestId}`,\n {\n replace: true,\n }\n );\n setTimeout(() => {\n setInputAmount('');\n }, 0);\n } catch (e) {\n setDbErrorMessage('Error: ' + (e as any)?.message);\n }\n }\n };\n\n const onConfirm = async () => {\n await addNewSwap();\n };\n\n const onStartConfirmSwap = async () => {\n if (confirmSwapResult?.warnings?.slippage) {\n setShowSlippageWarning(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 })\n .then((res) => {\n setConfirmSwapResult(res);\n })\n .catch((error) => console.error(error));\n };\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 useEffect(() => {\n const routeChanged =\n confirmSwapResult.warnings?.route?.type &&\n Object.values(RouteWarningType).includes(\n confirmSwapResult.warnings?.route?.type\n );\n\n const selectedWalletDisconnected =\n selectedWallets.length < 1 ||\n !selectedWallets.every((selectedWallet) =>\n connectedWallets.find(\n (connectedWallet) =>\n selectedWallet.address === connectedWallet.address &&\n selectedWallet.walletType === connectedWallet.walletType &&\n selectedWallet.chain === connectedWallet.chain\n )\n );\n\n let routeWalletsChanged = false;\n\n if (routeChanged) {\n let requiredWallets = getRequiredWallets(bestRoute);\n\n const lastStepToBlockchain =\n bestRoute?.result?.swaps[bestRoute.result.swaps.length - 1].to\n .blockchain;\n\n const isLastWalletRequired = !!bestRoute?.result?.swaps.find(\n (swap) => swap.from.blockchain === lastStepToBlockchain\n );\n\n if (!isLastWalletRequired) {\n requiredWallets = requiredWallets.slice(\n -requiredWallets.length,\n requiredWallets.length - 1\n );\n }\n\n const allRequiredWalletsSelected = requiredWallets.every(\n (requiredWallet) =>\n selectedWallets.find(\n (selectedWallet) => selectedWallet.chain === requiredWallet\n )\n );\n\n if (!allRequiredWalletsSelected) {\n routeWalletsChanged = true;\n }\n }\n\n if (bestRoute && (selectedWalletDisconnected || routeWalletsChanged)) {\n queueMicrotask(() => flushSync(setShowWallets.bind(null, true)));\n setRouteWalletConfirmed(false);\n }\n }, [\n confirmSwapResult.warnings?.route,\n selectedWallets.length,\n connectedWallets.length,\n ]);\n\n return (\n <Layout\n header={{\n title: 'Confirm Swap',\n onBack: navigate.bind(null, -1),\n hasConnectWallet: true,\n suffix: (\n <Tooltip side=\"bottom\" content={i18n.t('Settings')}>\n <HeaderButton\n size=\"small\"\n variant=\"ghost\"\n onClick={() => navigate('/' + navigationRoutes.settings)}>\n <SettingsIcon size={18} color=\"black\" />\n </HeaderButton>\n </Tooltip>\n ),\n }}\n footer={\n <Buttons>\n <div className=\"confirm-button\">\n <Button\n variant=\"contained\"\n type=\"primary\"\n size=\"large\"\n fullWidth\n loading={fetchingConfirmationRoute}\n disabled={!!confirmSwapResult.error}\n onClick={onStartConfirmSwap}>\n Start Swap\n </Button>\n </div>\n <IconButton\n variant=\"contained\"\n type=\"primary\"\n size=\"large\"\n loading={fetchingConfirmationRoute}\n onClick={setShowWallets.bind(null, true)}>\n <WalletIcon size={24} />\n </IconButton>\n </Buttons>\n }>\n <Modal\n anchor=\"bottom\"\n open={showSlippageWarning}\n prefix={\n <Button\n size=\"small\"\n variant=\"ghost\"\n onClick={() => navigate('/' + navigationRoutes.settings)}>\n <Typography variant=\"label\" size=\"medium\" color=\"$neutral900\">\n Change settings\n </Typography>\n </Button>\n }\n container={document.querySelector('#swap-box') as HTMLDivElement}\n onClose={setShowSlippageWarning.bind(null, (prevState) => !prevState)}>\n {confirmSwapResult.warnings?.slippage && (\n <MessageBox\n type=\"warning\"\n title={\n confirmSwapResult.warnings.slippage.type ===\n SlippageWarningType.HIGH_SLIPPAGE\n ? 'High slippage'\n : 'Low slippage'\n }\n description={\n confirmSwapResult.warnings.slippage.type ===\n SlippageWarningType.HIGH_SLIPPAGE\n ? i18n.t(\n 'highSlippage',\n { selectedSlippage },\n {\n message:\n ' Caution, your slippage is high (={selectedSlippage}). Your trade may be front run.',\n }\n )\n : i18n.t(\n 'increaseSlippage',\n\n {\n minRequiredSlippage:\n confirmSwapResult.warnings.slippage.slippage,\n },\n {\n message:\n 'We recommend you to increase slippage to at least {minRequiredSlippage} for this route.',\n }\n )\n }>\n <Divider size={18} />\n <Divider size={32} />\n <Button\n size=\"large\"\n type=\"primary\"\n variant=\"contained\"\n fullWidth\n onClick={onConfirm}>\n Confirm anyway\n </Button>\n </MessageBox>\n )}\n </Modal>\n {showWallets && (\n <ConfirmWalletsModal\n open={showWallets}\n onClose={() => setShowWallets(false)}\n onCancel={cancelFetch}\n loading={fetchingConfirmationRoute}\n onCheckBalance={onConfirmSwap}\n config={config}\n />\n )}\n\n <Container>\n <div className=\"description\">\n <Typography variant=\"title\" size=\"small\">\n You get\n </Typography>\n <Button\n style={{ padding: '0' }}\n variant=\"ghost\"\n disabled={fetchingConfirmationRoute}\n onClick={onRefresh}>\n <div className=\"icon\">\n <RefreshIcon size={16} />\n </div>\n </Button>\n </div>\n {dbErrorMessage && (\n <>\n <Alert type=\"error\" variant=\"alarm\" title={dbErrorMessage} />\n <Divider size={12} />\n </>\n )}\n {confirmSwapResult.warnings?.route && (\n <>\n <Alert\n variant=\"alarm\"\n type=\"warning\"\n title={getRouteWarningMessage(confirmSwapResult.warnings.route)}\n />\n <Divider size={12} />\n </>\n )}\n {showSkeleton && <BestRouteSkeleton type=\"swap-preview\" expanded />}\n {showBestRoute && (\n <BestRoute\n expanded={true}\n steps={formatBestRoute(bestRoute) ?? []}\n input={{\n value: numberToString(\n inputAmount,\n TOKEN_AMOUNT_MIN_DECIMALS,\n TOKEN_AMOUNT_MAX_DECIMALS\n ),\n usdValue: numberToString(\n inputUsdValue,\n USD_VALUE_MIN_DECIMALS,\n USD_VALUE_MAX_DECIMALS\n ),\n }}\n output={{\n value: numberToString(\n outputAmount,\n TOKEN_AMOUNT_MIN_DECIMALS,\n TOKEN_AMOUNT_MAX_DECIMALS\n ),\n usdValue: numberToString(\n outputUsdValue,\n USD_VALUE_MIN_DECIMALS,\n USD_VALUE_MAX_DECIMALS\n ),\n }}\n totalFee={numberToString(\n totalFeeInUsd,\n GAS_FEE_MIN_DECIMALS,\n GAS_FEE_MAX_DECIMALS\n )}\n totalTime={secondsToString(totalArrivalTime(bestRoute))}\n recommended={true}\n type=\"swap-preview\"\n percentageChange={percentageChange}\n warningLevel={warningLevel}\n />\n )}\n {showNoRouteFound && (\n <>\n <Divider size={12} />\n <NoRoutes\n diagnosisMessage={\n confirmSwapResult.error?.type === ConfirmSwapErrorTypes.NO_ROUTE\n ? confirmSwapResult.error.diagnosisMessage\n : undefined\n }\n error={\n confirmSwapResult.error?.type ===\n ConfirmSwapErrorTypes.REQUEST_FAILED\n }\n fetch={onRefresh}\n />\n </>\n )}\n {confirmSwapResult.error?.type ===\n ConfirmSwapErrorTypes.ROUTE_UPDATED_WITH_HIGH_VALUE_LOSS && (\n <>\n <Alert\n variant=\"alarm\"\n type=\"error\"\n title={getConfirmSwapErrorMessage(confirmSwapResult.error)}\n />\n <Divider size={12} />\n </>\n )}\n </Container>\n </Layout>\n );\n}\n", "import type { PropTypes } from './ConfirmWalletsModal.types';\nimport type { ConnectedWallet } from '../../store/wallets';\nimport type { ConfirmSwapWarnings, Wallet } from '../../types';\n\nimport {\n Alert,\n BalanceErrors,\n Button,\n ChevronDownIcon,\n ChevronLeftIcon,\n Divider,\n MessageBox,\n Modal,\n Typography,\n WalletIcon,\n} from '@rango-dev/ui';\nimport React, { useEffect, useState } from 'react';\nimport { useNavigate } from 'react-router-dom';\n\nimport { getConfirmSwapErrorMessage } from '../../constants/errors';\nimport { navigationRoutes } from '../../constants/navigationRoutes';\nimport { getRouteWarningMessage } from '../../constants/warnings';\nimport { useBestRouteStore } from '../../store/bestRoute';\nimport { useMetaStore } from '../../store/meta';\nimport { useWalletsStore } from '../../store/wallets';\nimport { confirmSwapDisabled } from '../../utils/swap';\n\nimport { getRequiredWallets, isValidAddress } from './ConfirmWallets.helpers';\nimport {\n CollapsibleContent,\n CollapsibleRoot,\n ConfirmButton,\n CustomDestination,\n CustomDestinationButton,\n ExpandedIcon,\n ListContainer,\n NavigateBack,\n ShowMoreHeader,\n StyledTextField,\n Title,\n Trigger,\n Wallets,\n WalletsContainer,\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, config, loading } = props;\n const { blockchains } = useMetaStore.use.meta();\n const {\n bestRoute,\n setSelectedWallets: selectRouteWallets,\n routeWalletsConfirmed,\n setRouteWalletConfirmed,\n customDestination,\n setCustomDestination,\n } = useBestRouteStore();\n const { connectedWallets, selectWallets } = useWalletsStore();\n\n const [showMoreWalletFor, setShowMoreWalletFor] = useState('');\n const [balanceWarnings, setBalanceWarnings] = useState<string[]>([]);\n const [error, setError] = useState('');\n const [routeWarning, setRouteWarning] = useState<\n ConfirmSwapWarnings['route'] | null\n >(null);\n const [destination, setDestination] = useState(customDestination);\n const [showCustomDestination, setShowCustomDestination] = useState(\n !!customDestination\n );\n const requiredWallets = getRequiredWallets(bestRoute);\n const customDestinationEnabled =\n typeof config?.customDestination === 'undefined'\n ? true\n : config.customDestination;\n\n const lastStepToBlockchain = blockchains.find(\n (blockchain) =>\n blockchain.name ===\n bestRoute?.result?.swaps[bestRoute?.result?.swaps.length - 1].to\n .blockchain\n );\n const isWalletRequiredFor = (blockchain: string) =>\n !!bestRoute?.result?.swaps.find(\n (swap) => swap.from.blockchain === blockchain\n );\n\n const [selectableWallets, setSelectableWallets] = useState<ConnectedWallet[]>(\n connectedWallets.filter((connectedWallet) => {\n return (\n connectedWallet.selected &&\n requiredWallets.includes(connectedWallet.chain)\n );\n })\n );\n const lastStepToBlockchainMeta = blockchains.find(\n (chain) => chain.name === lastStepToBlockchain?.name\n );\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) && !destination))\n );\n\n const isAddressMatched =\n !!destination &&\n showCustomDestination &&\n lastStepToBlockchainMeta &&\n !isValidAddress(lastStepToBlockchainMeta, destination);\n\n const resetCustomDestination = () => {\n setShowCustomDestination(false);\n setDestination('');\n setSelectableWallets((selectableWallets) => {\n let anyWalletSelected = false;\n return selectableWallets.map((selectableWallet) => {\n if (\n !anyWalletSelected &&\n selectableWallet.chain === lastStepToBlockchain?.name\n ) {\n anyWalletSelected = true;\n return {\n ...selectableWallet,\n selected: true,\n };\n }\n return selectableWallet;\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 (wallet.chain === lastStepToBlockchain?.name && showCustomDestination) {\n setShowCustomDestination(false);\n setDestination('');\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 selectWallets(lastSelectedWallets);\n selectRouteWallets(lastSelectedWallets);\n setCustomDestination(destination);\n setRouteWalletConfirmed(true);\n onClose();\n };\n\n const onConfirmWallets = async () => {\n setBalanceWarnings([]);\n setError('');\n setRouteWarning(null);\n const selectedWallets = connectedWallets.filter((connectedWallet) =>\n selectableWallets.find(\n (selectableWallet) =>\n selectableWallet.chain === connectedWallet.chain &&\n selectableWallet.walletType === connectedWallet.walletType\n )\n );\n const result = await onCheckBalance?.({\n selectedWallets,\n customDestination: destination,\n });\n\n const warnings = result.warnings;\n if (warnings?.balance?.messages) {\n setBalanceWarnings(warnings.balance.messages);\n }\n if (warnings?.route) {\n setRouteWarning(warnings.route);\n }\n if (result.error) {\n setError(getConfirmSwapErrorMessage(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 selectableWallets.concat(\n connectedWallets.filter((connectedWallet) => {\n const anyWalletSelected = !!selectableWallets.find(\n (selectableWallet) =>\n selectableWallet.chain === connectedWallet.chain\n );\n\n return (\n !anyWalletSelected &&\n connectedWallet.selected &&\n requiredWallets.includes(connectedWallet.chain)\n );\n })\n )\n );\n }, [connectedWallets.length]);\n\n const modalContainer = document.querySelector('#swap-box') as HTMLDivElement;\n\n const navigate = useNavigate();\n return (\n <Modal\n open={open}\n onClose={() => {\n if (!routeWalletsConfirmed) {\n navigate(navigationRoutes.home, { replace: true });\n }\n onClose();\n }}\n dismissible={!showMoreWalletFor}\n container={modalContainer}\n {...(!showMoreWalletFor && {\n footer: (\n <ConfirmButton>\n <Button\n loading={loading}\n disabled={confirmSwapDisabled(\n loading,\n showCustomDestination,\n destination,\n bestRoute,\n selectableWallets,\n lastStepToBlockchain\n )}\n onClick={onConfirmWallets}\n variant=\"contained\"\n type=\"primary\"\n fullWidth\n size=\"large\">\n Confirm\n </Button>\n </ConfirmButton>\n ),\n })}\n {...(showMoreWalletFor && {\n containerStyle: { padding: '$0' },\n header: (\n <ShowMoreHeader>\n <NavigateBack\n variant=\"ghost\"\n onClick={setShowMoreWalletFor.bind(null, '')}>\n <ChevronLeftIcon size={16} />\n </NavigateBack>\n <Typography\n variant=\"headline\"\n size=\"small\">{`Your ${showMoreWalletFor} wallets`}</Typography>\n </ShowMoreHeader>\n ),\n })}\n anchor=\"center\">\n <Modal\n open={balanceWarnings.length > 0}\n onClose={setBalanceWarnings.bind(null, [])}\n container={modalContainer}>\n <MessageBox\n title=\"Insufficient account balance\"\n type=\"error\"\n description={<BalanceErrors messages={balanceWarnings ?? []} />}>\n <Button\n variant=\"outlined\"\n size=\"large\"\n type=\"primary\"\n fullWidth\n onClick={onConfirmBalance}>\n Proceed anyway\n </Button>\n </MessageBox>\n </Modal>\n {showMoreWalletFor && (\n <WalletsContainer>\n <div className=\"wallets-list\">\n <WalletList\n chain={showMoreWalletFor}\n isSelected={isSelected}\n selectWallet={onChange}\n multiWallets={config?.multiWallets ?? true}\n supportedWallets={config?.wallets ?? []}\n config={config}\n onShowMore={setShowMoreWalletFor.bind(null, showMoreWalletFor)}\n />\n </div>\n </WalletsContainer>\n )}\n {!showMoreWalletFor && (\n <>\n {error && (\n <>\n <Alert variant=\"alarm\" type=\"error\" title={error} />\n <Divider size={12} />\n </>\n )}\n {routeWarning && (\n <>\n <Alert\n variant=\"alarm\"\n type=\"warning\"\n title={getRouteWarningMessage(routeWarning)}\n />\n <Divider size={12} />\n </>\n )}\n <Wallets>\n {requiredWallets.map((requiredWallet, index) => {\n const blockchain = blockchains.find(\n (blockchain) => blockchain.name === requiredWallet\n );\n\n const key = `wallet-${index}`;\n const isLastWallet = index === requiredWallets.length - 1;\n\n return (\n <div key={key}>\n <Title>\n <Typography\n variant=\"title\"\n size=\"xmedium\">{`Your ${blockchain?.displayName} wallets`}</Typography>\n <Typography\n variant=\"label\"\n color=\"$neutral900\"\n size=\"medium\">{`You need to connect a ${blockchain?.displayName} wallet.`}</Typography>\n </Title>\n <Divider size={24} />\n <ListContainer>\n <WalletList\n chain={requiredWallet}\n isSelected={isSelected}\n selectWallet={onChange}\n multiWallets={config?.multiWallets ?? true}\n supportedWallets={config?.wallets ?? []}\n config={config}\n limit={NUMBER_OF_WALLETS_TO_DISPLAY}\n onShowMore={() =>\n setShowMoreWalletFor(blockchain?.name ?? '')\n }\n />\n </ListContainer>\n {!isLastWallet && <Divider size={32} />}\n {isLastWallet && customDestinationEnabled && (\n <CustomDestination>\n <CollapsibleRoot\n selected={showCustomDestination}\n open={showCustomDestination}\n onOpenChange={(checked) => {\n if (!checked) {\n resetCustomDestination();\n } else {\n if (\n !isWalletRequiredFor(\n lastStepToBlockchain?.name ?? ''\n )\n ) {\n setSelectableWallets((selectableWallets) =>\n selectableWallets.map((selectableWallet) => {\n if (\n selectableWallet.chain ===\n lastStepToBlockchain?.name\n ) {\n return {\n ...selectableWallet,\n selected: false,\n };\n }\n return selectableWallet;\n })\n );\n }\n }\n }}>\n <Trigger\n onClick={() =>\n setShowCustomDestination((prevState) => !prevState)\n }>\n <CustomDestinationButton\n fullWidth\n suffix={\n <ExpandedIcon\n orientation={\n showCustomDestination ? 'up' : 'down'\n }>\n <ChevronDownIcon size={10} color=\"gray\" />\n </ExpandedIcon>\n }>\n <div className=\"button__content\">\n <WalletIcon size={18} color=\"info\" />\n <Divider size={4} direction=\"horizontal\" />\n <Typography variant=\"label\" size=\"medium\">\n Send to a different address\n </Typography>\n </div>\n </CustomDestinationButton>\n </Trigger>\n <CollapsibleContent open={showCustomDestination}>\n <>\n <Divider size={4} />\n <StyledTextField\n autoFocus\n placeholder=\"Your destination address\"\n value={destination}\n onChange={(e) => {\n setDestination(e.target.value);\n }}\n />\n </>\n </CollapsibleContent>\n </CollapsibleRoot>\n {isAddressMatched && (\n <div className=\"alarms\">\n <Alert\n variant=\"alarm\"\n type=\"error\"\n title={`Address '${destination}' doesn't match the blockchain address pattern.`}\n />\n </div>\n )}\n </CustomDestination>\n )}\n </div>\n );\n })}\n </Wallets>\n </>\n )}\n </Modal>\n );\n}\n", "import type { RouteWarning } from '../types';\n\nimport { i18n } from '@lingui/core';\n\nimport { RouteWarningType } from '../types';\n\nexport function getRouteWarningMessage(warning: RouteWarning) {\n switch (warning.type) {\n case RouteWarningType.ROUTE_UPDATED:\n return i18n.t('Route has been updated.');\n case RouteWarningType.ROUTE_AND_OUTPUT_AMOUNT_UPDATED:\n return i18n.t(\n 'Output amount changed to {newOutputAmount} ({percentageChange}% change).',\n {\n newOutputAmount: warning.newOutputAmount,\n percentageChange: warning.percentageChange,\n }\n );\n case RouteWarningType.ROUTE_SWAPPERS_UPDATED:\n return i18n.t('Route swappers has been updated.');\n case RouteWarningType.ROUTE_COINS_UPDATED:\n return i18n.t('Route internal coins has been updated.');\n default:\n return '';\n }\n}\n", "import * as Collapsible from '@radix-ui/react-collapsible';\nimport {\n Button,\n IconButton,\n keyframes,\n styled,\n TextField,\n} from '@rango-dev/ui';\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 Title = styled('div', {\n display: 'flex',\n flexDirection: 'column',\n justifyContent: 'center',\n alignItems: 'center',\n});\n\nexport const ListContainer = styled('div', {\n display: 'grid',\n gap: '$10',\n gridTemplateColumns: ' repeat(3, minmax(0, 1fr))',\n alignContent: 'baseline',\n});\n\nexport const WalletButton = styled('button', {\n borderRadius: '$xm',\n padding: '$10',\n border: '0',\n display: 'flex',\n justifyContent: 'center',\n backgroundColor: '$neutral100',\n alignItems: 'center',\n cursor: 'pointer',\n width: 110,\n position: 'relative',\n '&:hover': {\n backgroundColor: '$surface600',\n opacity: '0.8',\n },\n variants: {\n selected: {\n true: {\n outlineWidth: 1,\n outlineColor: '$secondary',\n outlineStyle: 'solid',\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});\n\nexport const ShowMoreHeader = styled('div', {\n padding: '$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 '& .wallets-list': {\n display: 'grid',\n gap: '$10',\n gridTemplateColumns: ' repeat(3, minmax(0, 1fr))',\n alignContent: 'baseline',\n },\n});\n\nexport const CollapsibleRoot = styled(Collapsible.Root, {\n backgroundColor: '$neutral200',\n borderRadius: '$sm',\n variants: {\n selected: {\n true: {\n outlineWidth: 1,\n outlineColor: '$secondary500',\n outlineStyle: 'solid',\n },\n },\n },\n});\n\nexport const CustomDestinationButton = styled(Button, {\n width: '100%',\n borderRadius: '$sm !important',\n padding: '$15 !important',\n justifyContent: 'space-between',\n alignItems: 'center',\n backgroundColor: '$neutral100 !important',\n});\n\nexport const CustomDestination = styled('div', {\n padding: '$10 $0',\n '& .button__content': {\n display: 'flex',\n justifyContent: 'center',\n alignItems: 'center',\n },\n '& .alarms': { paddingTop: '5px' },\n});\n\nexport const ExpandedIcon = styled('div', {\n transition: 'all 300ms 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 ConfirmButton = styled('div', {\n display: 'flex',\n});\n\nexport const StyledTextField = styled(TextField, {\n padding: '$0 $15 $15 $15',\n});\n\nexport const CollapsibleContent = styled(Collapsible.Content, {\n overflow: 'hidden',\n variants: {\n open: {\n true: {\n animation: `${slideDown} 300ms ease-out`,\n },\n false: {\n animation: `${slideUp} 300ms ease-out`,\n },\n },\n },\n});\n\nexport const Wallets = styled('div', { overflow: 'visible', width: '100%' });\n", "/* eslint-disable @typescript-eslint/no-magic-numbers */\nimport type { PropTypes } from './WalletList.type';\nimport type { Wallet } from '../../types';\nimport type { WalletInfo } from '@rango-dev/ui';\nimport type { WalletType } from '@rango-dev/wallets-shared';\n\nimport {\n Button,\n Divider,\n Image,\n MessageBox,\n Modal,\n SelectableWallet,\n Typography,\n WalletState,\n} from '@rango-dev/ui';\nimport React, { useEffect, useState } from 'react';\n\nimport { useWallets } from '../..';\nimport { useWalletList } from '../../hooks/useWalletList';\nimport { TIME_TO_CLOSE_MODAL } from '../../pages/WalletsPage';\nimport { useMetaStore } from '../../store/meta';\nimport { useWalletsStore } from '../../store/wallets';\nimport { getBlockchainDisplayNameFor } from '../../utils/meta';\nimport {\n getAddress,\n getConciseAddress,\n isExperimentalChain,\n} from '../../utils/wallets';\nimport { WalletModal } from '../WalletModal';\n\nimport { WalletButton } from './ConfirmWallets.styles';\nimport {\n LogoContainer,\n Spinner,\n WalletImageContainer,\n} from './WalletList.styles';\n\nexport function WalletList(props: PropTypes) {\n const { config, chain, isSelected, selectWallet, limit, onShowMore } = props;\n\n const connectedWallets = useWalletsStore.use.connectedWallets();\n const { blockchains } = useMetaStore.use.meta();\n const [openWalletStateModal, setOpenWalletStateModal] =\n useState<WalletType>('');\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' | null>(null);\n const { connect } = useWallets();\n const { list, error, handleClick } = useWalletList({\n config,\n chain,\n onBeforeConnect: setOpenWalletStateModal,\n onConnect: () =>\n setTimeout(() => setOpenWalletStateModal(''), TIME_TO_CLOSE_MODAL),\n });\n const [sortedList, setSortedList] = useState<WalletInfo[]>(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 await connect(wallet.walletType, wallet.chain);\n setAddingExperimentalChainStatus('completed');\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.querySelector('#swap-box') as HTMLDivElement;\n\n useEffect(() => {\n let timeout: ReturnType<typeof setTimeout> | null = null;\n if (addingExperimentalChainStatus === 'completed') {\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 conciseAddress = address ? getConciseAddress(address) : '';\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 connectedWalletDescription = couldAddExperimentalChain\n ? `Add ${chain} chain`\n : conciseAddress;\n\n const onClick = () => {\n if (wallet.state === WalletState.DISCONNECTED) {\n void handleClick(wallet.type);\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 blockchainDisplayName: string | undefined =\n experimentalChainWallet?.chain\n ? getBlockchainDisplayNameFor(\n experimentalChainWallet.chain,\n blockchains\n )\n : undefined;\n return (\n <>\n {openWalletStateModal === wallet.type && (\n <WalletModal\n open={openWalletStateModal === wallet.type}\n onClose={() => setOpenWalletStateModal('')}\n image={wallet.image}\n state={wallet.state}\n error={error}\n />\n )}\n {!!experimentalChainWallet && (\n <Modal\n open={!!experimentalChainWallet && showExperimentalChainModal}\n container={modalContainer}\n onClose={() => {\n setExperimentalChainWallet(null);\n }}>\n <MessageBox\n title={`Add ${blockchainDisplayName} Chain`}\n type=\"warning\"\n description={`You should connect a ${blockchainDisplayName} supported wallet or choose a different ${blockchainDisplayName} address`}>\n <Divider size={18} />\n <Divider size={32} />\n <Button\n onClick={addExperimentalChain.bind(\n null,\n experimentalChainWallet\n )}\n variant=\"outlined\"\n type=\"primary\"\n fullWidth\n size=\"large\">\n Confirm\n </Button>\n </MessageBox>\n </Modal>\n )}\n {addingExperimentalChainStatus && (\n <Modal\n open={!!addingExperimentalChainStatus}\n onClose={setAddingExperimentalChainStatus.bind(null, null)}\n container={modalContainer}>\n {addingExperimentalChainStatus === 'in-progress' ? (\n <MessageBox\n type=\"loading\"\n title={`Add ${blockchainDisplayName} Chain`}\n description={`You should connect a ${blockchainDisplayName} supported wallet or choose a different ${blockchainDisplayName} address.`}\n icon={\n <LogoContainer>\n <WalletImageContainer>\n <Image src={wallet.image} size={45} />\n </WalletImageContainer>\n <Spinner />\n </LogoContainer>\n }\n />\n ) : (\n <MessageBox\n type=\"success\"\n title={`${blockchainDisplayName} Chain Added`}\n description={`${blockchainDisplayName} is added to your wallet, you can use it to swap.`}\n />\n )}\n <Divider direction=\"vertical\" size={32} />\n </Modal>\n )}\n <SelectableWallet\n key={wallet.type}\n description={connectedWalletDescription}\n onClick={onClick}\n selected={isSelected(wallet.type, chain)}\n {...wallet}\n />\n </>\n );\n })}\n {shouldShowMoreWallets && (\n <WalletButton selected={false} onClick={onShowMore.bind(null)}>\n <Typography variant=\"label\" size=\"medium\">\n Show more wallets\n <Typography variant=\"label\" size=\"medium\" color=\"$primary\">\n &nbsp;+{numberOfSupportedWallets - (limit ?? 0)}\n </Typography>\n </Typography>\n </WalletButton>\n )}\n </>\n );\n}\n", "import type { WidgetConfig } from '../types';\nimport type { BlockchainMeta } from 'rango-sdk';\n\nimport { WalletState } from '@rango-dev/ui';\nimport { useWallets } from '@rango-dev/wallets-react';\nimport {\n KEPLR_COMPATIBLE_WALLETS,\n type WalletType,\n WalletTypes,\n} from '@rango-dev/wallets-shared';\nimport { useEffect, useState } from 'react';\n\nimport { useMetaStore } from '../store/meta';\nimport { useWalletsStore } from '../store/wallets';\nimport { configWalletsToWalletName } from '../utils/providers';\nimport {\n isExperimentalChain,\n mapWalletTypesToWalletInfo,\n sortWalletsBasedOnConnectionState,\n} from '../utils/wallets';\n\nconst ALL_SUPPORTED_WALLETS = Object.values(WalletTypes);\n\ninterface Params {\n config?: WidgetConfig;\n chain?: string;\n onBeforeConnect?: (walletType: string) => void;\n onConnect?: (walletType: string) => void;\n}\n\n/**\n * gets list of wallets with their information and an action for handling click callback fo UI\n * we need to share the logic of rendering list of wallets and handle clicking on them in different places\n * you can use this list whenever you need to show the list of wallets and needed callbacks\n */\nexport function useWalletList(params: Params) {\n const { config, chain, onBeforeConnect, onConnect } = params;\n const { state, disconnect, getWalletInfo, connect } = useWallets();\n const { connectedWallets } = useWalletsStore();\n const { blockchains } = useMetaStore().meta;\n const multiWallets =\n typeof config?.multiWallets === 'undefined' ? true : config.multiWallets;\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 =\n configWalletsToWalletName(config?.wallets, {\n walletConnectProjectId: config?.walletConnectProjectId,\n }) || ALL_SUPPORTED_WALLETS;\n\n const wallets = mapWalletTypesToWalletInfo(\n state,\n getWalletInfo,\n listAvailableWalletTypes,\n chain\n );\n\n const sortedWallets = sortWalletsBasedOnConnectionState(wallets);\n const [error, setError] = useState('');\n\n const isExperimentalChainNotAdded = (walletType: string) =>\n !connectedWallets.find(\n (connectedWallet) =>\n connectedWallet.walletType === walletType &&\n connectedWallet.chain === chain\n );\n\n const handleClick = async (type: WalletType) => {\n const wallet = state(type);\n try {\n if (error) {\n setError('');\n }\n if (wallet.connected) {\n await disconnect(type);\n } else {\n const atLeastOneWalletIsConnected = !!wallets.find(\n (w) => w.state === WalletState.CONNECTED\n );\n if (!multiWallets && atLeastOneWalletIsConnected) {\n return;\n }\n onBeforeConnect?.(type);\n await connect(type);\n onConnect?.(type);\n }\n } catch (e) {\n setError('Error: ' + (e as any)?.message);\n }\n };\n\n const disconnectConnectingWallets = () => {\n const connectingWallets =\n wallets?.filter((wallet) => wallet.state === WalletState.CONNECTING) ||\n [];\n for (const wallet of connectingWallets) {\n void disconnect(wallet.type);\n }\n };\n\n useEffect(() => {\n return () => {\n disconnectConnectingWallets();\n };\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 );\n };\n\n return {\n list: sortedWallets.filter(\n (wallet) => !shouldExcludeWallet(wallet.type, chain ?? '', blockchains)\n ),\n error,\n handleClick,\n };\n}\n", "import { allProviders } from '@rango-dev/provider-all';\nimport { ProviderInterface } from '@rango-dev/wallets-react';\nimport { WidgetConfig } from '../types';\n\nexport interface ProvidersOptions {\n walletConnectProjectId?: WidgetConfig['walletConnectProjectId'];\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 ProviderInterface[] a list of ProviderInterface\n *\n */\nexport function matchAndGenerateProviders(\n providers: WidgetConfig['wallets'],\n options?: ProvidersOptions\n): ProviderInterface[] {\n const all = allProviders({\n walletconnect2: {\n WC_PROJECT_ID: options?.walletConnectProjectId || '',\n },\n });\n\n if (providers) {\n const selectedProviders: ProviderInterface[] = [];\n\n providers.forEach((requestedProvider) => {\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 if (typeof requestedProvider === 'string') {\n const result: ProviderInterface | undefined = all.find((provider) => {\n return provider.config.type === requestedProvider;\n });\n if (result) {\n selectedProviders.push(result);\n } else {\n console.warn(\n `Couldn't find ${requestedProvider} 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 selectedProviders.push(requestedProvider);\n }\n });\n return selectedProviders;\n }\n\n return all;\n}\n\nexport function configWalletsToWalletName(\n config: WidgetConfig['wallets'],\n options?: ProvidersOptions\n): string[] {\n const providers = matchAndGenerateProviders(config, options);\n const names = providers.map((provider) => {\n return provider.config.type;\n });\n return names;\n}\n", "import type { WidgetConfig } from '../types';\nimport type { WalletType } from '@rango-dev/wallets-shared';\n\nimport { i18n } from '@lingui/core';\nimport { styled, Typography, Wallet, WalletState } from '@rango-dev/ui';\nimport React, { Fragment, useState } from 'react';\n\nimport { Layout } from '../components/Layout';\nimport { WalletModal } from '../components/WalletModal';\nimport { navigationRoutes } from '../constants/navigationRoutes';\nimport { useNavigateBack } from '../hooks/useNavigateBack';\nimport { useWalletList } from '../hooks/useWalletList';\nimport { useMetaStore } from '../store/meta';\n\ninterface PropTypes {\n supportedWallets: WidgetConfig['wallets'];\n multiWallets: boolean;\n config?: WidgetConfig;\n}\n\nconst ListContainer = styled('div', {\n display: 'grid',\n gap: '$10',\n gridTemplateColumns: ' repeat(3, minmax(0, 1fr))',\n alignContent: 'baseline',\n paddingTop: '$15',\n height: '100%',\n});\n\nconst Container = styled('div', {\n textAlign: 'center',\n});\n\nexport const TIME_TO_CLOSE_MODAL = 3_000;\nexport const TIME_TO_IGNORE_MODAL = 300;\n\nexport function WalletsPage({ config }: PropTypes) {\n const { navigateBackFrom } = useNavigateBack();\n const [openModal, setOpenModal] = useState<WalletType>('');\n let modalTimerId: ReturnType<typeof setTimeout> | null = null;\n\n const { list, handleClick, error } = useWalletList({\n config,\n onBeforeConnect: (type) => {\n modalTimerId = setTimeout(() => {\n setOpenModal(type);\n }, TIME_TO_IGNORE_MODAL);\n },\n onConnect: () => {\n if (modalTimerId) {\n clearTimeout(modalTimerId);\n }\n setTimeout(() => {\n setOpenModal('');\n }, TIME_TO_CLOSE_MODAL);\n },\n });\n\n const loadingMetaStatus = useMetaStore.use.loadingStatus();\n const selectedWallet = list.find((wallet) => wallet.type === openModal);\n const selectedWalletImage = selectedWallet?.image || '';\n const selectedWalletState =\n selectedWallet?.state || WalletState.NOT_INSTALLED;\n\n return (\n <Layout\n header={{\n title: i18n.t('Connect Wallets'),\n onBack: navigateBackFrom.bind(null, navigationRoutes.wallets),\n }}>\n <Container>\n <Typography variant=\"title\" size=\"xmedium\" align=\"center\">\n {i18n.t('Choose a wallet to connect.')}\n </Typography>\n <ListContainer>\n {list.map((wallet, index) => {\n const key = `wallet-${index}-${wallet.type}`;\n return (\n <Fragment key={key}>\n <Wallet\n {...wallet}\n onClick={(type) => {\n void handleClick(type);\n }}\n isLoading={loadingMetaStatus === 'loading'}\n />\n </Fragment>\n );\n })}\n <WalletModal\n open={!!openModal}\n onClose={() => setOpenModal('')}\n image={selectedWalletImage}\n state={selectedWalletState}\n error={error}\n />\n </ListContainer>\n </Container>\n </Layout>\n );\n}\n", "import type { PropTypes } from './WalletModal.types';\n\nimport { Divider, Modal } from '@rango-dev/ui';\nimport React from 'react';\n\nimport { ModalContent } from './WalletModalContent';\n\nexport function WalletModal(props: PropTypes) {\n const { open, onClose, ...otherProps } = props;\n\n return (\n <Modal\n open={open}\n onClose={onClose}\n container={document.getElementById('swap-box') || document.body}>\n <ModalContent {...otherProps} />\n <Divider direction=\"vertical\" size={32} />\n </Modal>\n );\n}\n", "import type { ModalContentProps } from './WalletModal.types';\n\nimport { i18n } from '@lingui/core';\nimport { Image, MessageBox, WalletState } from '@rango-dev/ui';\nimport React from 'react';\n\nimport {\n LogoContainer,\n Spinner,\n WalletImageContainer,\n} from './WalletModalContent.styles';\n\nexport function ModalContent(props: ModalContentProps) {\n const { state, image, error } = props;\n if (state === 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\nexport const WalletImageContainer = styled('div', {\n '& img': {\n borderRadius: '50%',\n },\n});\n", "import { useInRouterContext, useNavigate } from 'react-router-dom';\n\nimport { navigationRoutes } from '../constants/navigationRoutes';\nimport { useBestRouteStore } from '../store/bestRoute';\n\nexport function useNavigateBack() {\n const isRouterInContext = useInRouterContext();\n const navigate = useNavigate();\n const routeWalletsConfirmed = useBestRouteStore.use.routeWalletsConfirmed();\n\n navigationRoutes;\n\n const navigateBackFrom = (currentRoute: string) => {\n if (currentRoute === navigationRoutes.swapDetails) {\n return navigate('/' + navigationRoutes.swaps, { replace: true });\n }\n\n if (\n !isRouterInContext ||\n (window.history.state && window.history.state.idx > 0)\n ) {\n // eslint-disable-next-line @typescript-eslint/no-magic-numbers\n navigate(-1);\n } else {\n if (\n [navigationRoutes.settings, navigationRoutes.wallets].includes(\n currentRoute\n ) &&\n routeWalletsConfirmed\n ) {\n return navigate('/' + navigationRoutes.confirmSwap, { replace: true });\n }\n if (\n [\n navigationRoutes.fromSwap,\n navigationRoutes.toSwap,\n navigationRoutes.settings,\n navigationRoutes.wallets,\n navigationRoutes.swaps,\n navigationRoutes.confirmSwap,\n ].includes(currentRoute)\n ) {\n navigate(navigationRoutes.home, { replace: true });\n } else if (currentRoute === navigationRoutes.fromBlockchain) {\n navigate('/' + navigationRoutes.fromSwap, { replace: true });\n } else if (currentRoute === navigationRoutes.toBlockchain) {\n navigate('/' + navigationRoutes.fromSwap, { replace: true });\n } else if (currentRoute === navigationRoutes.liquiditySources) {\n navigate('/' + navigationRoutes.settings, { replace: true });\n }\n }\n };\n\n return { navigateBackFrom };\n}\n", "import type { BlockchainMeta } 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}\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", "/* eslint-disable @typescript-eslint/no-magic-numbers */\nimport type {\n ConfirmSwapError,\n ConfirmSwapWarnings,\n PendingSwapSettings,\n Wallet,\n} from '../types';\nimport type { PendingSwap } from '@rango-dev/queue-manager-rango-preset';\nimport type { BestRouteResponse } from 'rango-sdk';\n\nimport { calculatePendingSwap } from '@rango-dev/queue-manager-rango-preset';\nimport BigNumber from 'bignumber.js';\nimport { useEffect } from 'react';\n\nimport { errorMessages } from '../constants/errors';\nimport { HIGH_SLIPPAGE } from '../constants/swapSettings';\nimport { useBestRouteStore } from '../store/bestRoute';\nimport { useMetaStore } from '../store/meta';\nimport { useSettingsStore } from '../store/settings';\nimport { useWalletsStore } from '../store/wallets';\nimport {\n ConfirmSwapErrorTypes,\n RouteWarningType,\n SlippageWarningType,\n} from '../types';\nimport { numberToString } from '../utils/numbers';\nimport {\n isNumberOfSwapsChanged,\n isRouteChanged,\n isRouteInternalCoinsUpdated,\n isRouteSwappersUpdated,\n} from '../utils/routing';\nimport {\n createBestRouteRequestBody,\n getBalanceWarnings,\n getMinRequiredSlippage,\n getOutputRatio,\n getPercentageChange,\n getRouteOutputAmount,\n getWalletsForNewSwap,\n hasProperSlippage,\n isOutputAmountChangedALot,\n outputRatioHasWarning,\n} from '../utils/swap';\n\nimport { useFetchBestRoute } from './useFetchBestRoute';\n\nexport type ConfirmSwapFetchResult = {\n swap: PendingSwap | null;\n error: ConfirmSwapError | null;\n warnings: ConfirmSwapWarnings | null;\n};\n\nexport type ConfirmSwap = {\n loading: boolean;\n fetch: (params: Params) => Promise<ConfirmSwapFetchResult>;\n cancelFetch: () => void;\n};\n\ntype Params = {\n selectedWallets: Wallet[];\n customDestination?: string;\n};\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 */\nfunction throwErrorIfResponseIsNotValid(\n response: BestRouteResponse,\n params: { inputUsdValue: BigNumber | null; outputUsdValue: number | null }\n) {\n if (!response.result) {\n throw new Error(errorMessages.noRoutesError.title, {\n cause: {\n type: ConfirmSwapErrorTypes.NO_ROUTE,\n diagnosisMessage: response.diagnosisMessages?.[0],\n },\n });\n }\n\n const newRouteOutputUsdValue = new BigNumber(\n response.result?.outputAmount || '0'\n ).multipliedBy(params.outputUsdValue || 0);\n\n const outputRatio = getOutputRatio(\n params.inputUsdValue,\n newRouteOutputUsdValue\n );\n const highValueLoss = outputRatioHasWarning(\n params.inputUsdValue,\n outputRatio\n );\n\n if (highValueLoss) {\n throw new Error('High value loss for route', {\n cause: {\n type: ConfirmSwapErrorTypes.ROUTE_UPDATED_WITH_HIGH_VALUE_LOSS,\n },\n });\n }\n\n return response;\n}\n\nfunction generateWarnings(\n previousRoute: BestRouteResponse,\n currentRoute: BestRouteResponse,\n params: {\n selectedWallets: Wallet[];\n userSlippage: number;\n }\n): ConfirmSwapWarnings {\n const routeChanged = isRouteChanged(previousRoute, currentRoute);\n const output: ConfirmSwapWarnings = {\n balance: null,\n route: null,\n slippage: null,\n };\n\n if (routeChanged) {\n if (isOutputAmountChangedALot(previousRoute, currentRoute)) {\n output.route = {\n type: RouteWarningType.ROUTE_AND_OUTPUT_AMOUNT_UPDATED,\n newOutputAmount: numberToString(getRouteOutputAmount(currentRoute)),\n percentageChange: numberToString(\n getPercentageChange(\n getRouteOutputAmount(previousRoute),\n getRouteOutputAmount(currentRoute)\n ),\n null,\n 2\n ),\n };\n } else if (isNumberOfSwapsChanged(previousRoute, currentRoute)) {\n output.route = {\n type: RouteWarningType.ROUTE_UPDATED,\n };\n } else if (isRouteSwappersUpdated(previousRoute, currentRoute)) {\n output.route = {\n type: RouteWarningType.ROUTE_SWAPPERS_UPDATED,\n };\n } else if (isRouteInternalCoinsUpdated(previousRoute, currentRoute)) {\n output.route = {\n type: RouteWarningType.ROUTE_COINS_UPDATED,\n };\n }\n }\n\n const balanceWarnings = getBalanceWarnings(\n currentRoute,\n params.selectedWallets\n );\n const enoughBalance = balanceWarnings.length === 0;\n\n if (!enoughBalance) {\n output.balance = {\n messages: balanceWarnings,\n };\n }\n\n const minRequiredSlippage = getMinRequiredSlippage(previousRoute);\n const highSlippage = params.userSlippage > HIGH_SLIPPAGE;\n\n if (!hasProperSlippage(params.userSlippage.toString(), minRequiredSlippage)) {\n output.slippage = {\n type: SlippageWarningType.INSUFFICIENT_SLIPPAGE,\n slippage: minRequiredSlippage,\n };\n } else if (highSlippage) {\n output.slippage = {\n type: SlippageWarningType.HIGH_SLIPPAGE,\n slippage: params.userSlippage.toString(),\n };\n }\n\n return output;\n}\n\nexport function useConfirmSwap(): ConfirmSwap {\n const {\n fromToken,\n toToken,\n inputAmount,\n inputUsdValue,\n setRoute,\n bestRoute: initialRoute,\n customDestination: customDestinationFromStore,\n } = useBestRouteStore();\n\n const {\n slippage,\n customSlippage,\n affiliatePercent,\n affiliateRef,\n affiliateWallets,\n disabledLiquiditySources,\n } = useSettingsStore();\n const { connectedWallets } = useWalletsStore();\n\n const { meta } = useMetaStore();\n\n const userSlippage = customSlippage || slippage;\n\n const { fetch: fetchBestRoute, cancelFetch, loading } = useFetchBestRoute();\n\n useEffect(() => cancelFetch, []);\n\n const fetch: ConfirmSwap['fetch'] = async (params: Params) => {\n const selectedWallets = params.selectedWallets;\n const customDestination =\n params?.customDestination ?? customDestinationFromStore;\n\n if (!fromToken || !toToken || !inputAmount || !initialRoute) {\n return {\n route: null,\n swap: null,\n error: null,\n warnings: null,\n };\n }\n\n const requestBody = createBestRouteRequestBody({\n fromToken,\n toToken,\n inputAmount,\n wallets: connectedWallets,\n selectedWallets,\n disabledLiquiditySources,\n slippage: userSlippage,\n affiliateRef,\n affiliatePercent,\n affiliateWallets,\n initialRoute,\n destination: customDestination,\n });\n\n let currentRoute: BestRouteResponse;\n try {\n currentRoute = await fetchBestRoute(requestBody).then((response) =>\n throwErrorIfResponseIsNotValid(response, {\n outputUsdValue: toToken.usdPrice,\n inputUsdValue,\n })\n );\n setRoute(currentRoute);\n } catch (error: any) {\n if (error?.code === 'ERR_CANCELED') {\n return {\n swap: null,\n error: {\n type: ConfirmSwapErrorTypes.REQUEST_CANCELED,\n },\n warnings: null,\n };\n }\n\n if (error.cause) {\n return {\n swap: null,\n error: error.cause,\n warnings: null,\n };\n }\n\n return {\n swap: null,\n error: {\n type: ConfirmSwapErrorTypes.REQUEST_FAILED,\n },\n warnings: null,\n };\n }\n\n const swapSettings: PendingSwapSettings = {\n slippage: userSlippage.toString(),\n disabledSwappersGroups: disabledLiquiditySources,\n };\n const swap = calculatePendingSwap(\n inputAmount.toString(),\n currentRoute,\n getWalletsForNewSwap(selectedWallets),\n swapSettings,\n false,\n meta\n );\n\n return {\n route: currentRoute,\n swap,\n error: null,\n warnings: generateWarnings(initialRoute, currentRoute, {\n selectedWallets,\n userSlippage,\n }),\n };\n };\n\n return {\n loading,\n fetch,\n cancelFetch,\n };\n}\n", "import type { PendingSwap } from '@rango-dev/queue-manager-rango-preset';\nimport type { PendingSwapStep } from 'rango-types';\n\nimport { i18n } from '@lingui/core';\nimport { useManager } from '@rango-dev/queue-manager-react';\nimport { Divider, NotFound, styled } from '@rango-dev/ui';\nimport React, { useState } from 'react';\nimport { useNavigate } from 'react-router-dom';\n\nimport { Layout } from '../components/Layout';\nimport { SearchInput } from '../components/SearchInput';\nimport { SwapsGroup } from '../components/SwapsGroup';\nimport { NotFoundContainer } from '../components/SwapsGroup/SwapsGroup.styles';\nimport { navigationRoutes } from '../constants/navigationRoutes';\nimport { useNavigateBack } from '../hooks/useNavigateBack';\nimport { useUiStore } from '../store/ui';\nimport { groupSwapsByDate } from '../utils/date';\nimport { containsText } from '../utils/numbers';\nimport { getPendingSwaps } from '../utils/queue';\n\nconst Container = styled('div', {\n display: 'flex',\n flexDirection: 'column',\n alignItems: 'flex-start',\n height: '100%',\n gap: 15,\n});\n\nconst SwapsGroupContainer = styled('div', {\n overflowY: 'visible',\n width: '100%',\n display: 'flex',\n flexDirection: 'column',\n gap: 15,\n height: '100%',\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 setSelectedSwap = useUiStore.use.setSelectedSwap();\n const navigate = useNavigate();\n const { navigateBackFrom } = useNavigateBack();\n const { manager, state } = useManager();\n const list: PendingSwap[] = getPendingSwaps(manager).map(({ swap }) => swap);\n const [searchedFor, setSearchedFor] = useState<string>('');\n const loading = !state.loadedFromPersistor;\n\n const searchHandler = (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(\n (swap) =>\n containsText(swap.inputAmount, searchedFor) ||\n containsText(swap.status, searchedFor) ||\n isStepContainsText(swap.steps, searchedFor) ||\n containsText(swap.requestId, searchedFor)\n );\n }\n\n const isEmpty = !filteredList?.length && !loading;\n\n return (\n <Layout\n header={{\n onBack: navigateBackFrom.bind(null, navigationRoutes.swaps),\n title: i18n.t('History'),\n }}>\n <Container>\n <SearchInput\n setValue={setSearchedFor}\n fullWidth\n variant=\"contained\"\n placeholder=\"Search Transaction\"\n autoFocus\n onChange={searchHandler}\n value={searchedFor}\n />\n <SwapsGroupContainer>\n {isEmpty && (\n <NotFoundContainer>\n <Divider size={32} />\n <NotFound\n title={i18n.t('No results found')}\n description={\n searchedFor ? i18n.t('Try using different keywords') : ''\n }\n />\n </NotFoundContainer>\n )}\n {!isEmpty && (\n <SwapsGroup\n list={filteredList}\n onSwapClick={(requestId) => {\n setSelectedSwap(requestId);\n navigate(`${requestId}`, { replace: true });\n }}\n groupBy={groupSwapsByDate}\n isLoading={loading}\n />\n )}\n </SwapsGroupContainer>\n </Container>\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 } from './SearchInput.styles';\n\nexport function SearchInput(props: PropTypes) {\n const {\n variant,\n fullWidth,\n color,\n size,\n onChange,\n value,\n setValue,\n ...inputAttributes\n } = props;\n\n return (\n <TextField\n prefix={\n <IconWrapper>\n <SearchIcon color=\"black\" />\n </IconWrapper>\n }\n suffix={\n !!value.length && (\n <IconButton\n variant=\"ghost\"\n onClick={() => setValue?.('')}\n size=\"small\">\n <CloseIcon color=\"gray\" size={10} />\n </IconButton>\n )\n }\n fullWidth={fullWidth}\n color={color}\n variant={variant}\n style={{\n padding: 10,\n borderRadius: 25,\n alignItems: 'center',\n }}\n size={size}\n value={value}\n onChange={onChange}\n {...inputAttributes}\n />\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", "import type { PropTypes } from './SwapsGroup.types';\n\nimport { Divider, SwapListItem, Typography } from '@rango-dev/ui';\nimport React from 'react';\n\nimport { limitDecimalPlaces } from '../../utils/numbers';\n\nimport { Group, SwapList, Time } from './SwapsGroup.styles';\n\nexport function SwapsGroup(props: PropTypes) {\n const { list, onSwapClick, groupBy, isLoading } = props;\n const groups = groupBy ? groupBy(list) : [{ title: 'History', swaps: list }];\n\n if (isLoading) {\n const swaps = [{}, {}];\n\n const loadingGroups = [\n {\n title: 'Today',\n swaps,\n },\n {\n title: 'Last month',\n swaps,\n },\n ];\n return (\n <>\n {loadingGroups.map((group) => (\n <React.Fragment key={group.title}>\n <Group>\n <Time>\n <Typography\n variant=\"label\"\n size=\"medium\"\n color=\"neutral800\"\n className=\"group-title\">\n {group.title}\n </Typography>\n </Time>\n <Divider size={4} />\n <SwapList>\n {group.swaps.map((_, index) => {\n const key = index + group.title;\n return (\n <React.Fragment key={key}>\n <SwapListItem isLoading={true} />\n </React.Fragment>\n );\n })}\n </SwapList>\n </Group>\n </React.Fragment>\n ))}\n </>\n );\n }\n\n return (\n <>\n {groups\n .filter((group) => group.swaps.length > 0)\n .map((group) => (\n <React.Fragment key={group.title}>\n <Group>\n <Time>\n <Typography\n variant=\"label\"\n size=\"medium\"\n color=\"neutral800\"\n className=\"group-title\">\n {group.title}\n </Typography>\n </Time>\n <Divider size={4} />\n <SwapList>\n {group.swaps.map((swap) => {\n const firstStep = swap.steps[0];\n const lastStep = swap.steps[swap.steps.length - 1];\n return (\n <React.Fragment key={swap.requestId}>\n <SwapListItem\n requestId={swap.requestId}\n creationTime={swap.creationTime}\n status={swap.status}\n onClick={onSwapClick}\n onlyShowTime={group.title === '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: limitDecimalPlaces(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: limitDecimalPlaces(\n lastStep.outputAmount || ''\n ),\n estimatedAmount: limitDecimalPlaces(\n lastStep.expectedOutputAmountHumanReadable || ''\n ),\n },\n }}\n />\n </React.Fragment>\n );\n })}\n </SwapList>\n </Group>\n </React.Fragment>\n ))}\n </>\n );\n}\n", "import { styled } from '@rango-dev/ui';\n\nexport const Group = styled('div', {\n width: '100%',\n display: 'flex',\n flexDirection: 'column',\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/SwapsGroup/SwapsGroup.types';\nimport type { PendingSwap } from '@rango-dev/queue-manager-rango-preset';\n\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: 'Today',\n swaps: [],\n },\n ],\n [\n 'month',\n {\n title: 'Last month',\n swaps: [],\n },\n ],\n [\n 'year',\n {\n title: 'Last year',\n swaps: [],\n },\n ],\n [\n 'history',\n {\n title: 'History',\n swaps: [],\n },\n ],\n ]);\n\n const now = dayjs();\n swaps.forEach((swap) => {\n const swapDate = dayjs(Number(swap.creationTime));\n if (now.isSame(swapDate, 'day')) {\n output.get('today')?.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 output.get('history')?.swaps.push(swap);\n }\n });\n\n return Array.from(output.values());\n};\n", "import { Manager } from '@rango-dev/queue-manager-core';\nimport {\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 { i18n } from '@lingui/core';\nimport {\n List,\n ListItemButton,\n Radio,\n RadioRoot,\n Typography,\n} from '@rango-dev/ui';\nimport React, { useState } from 'react';\n\nimport { Layout } from '../components/Layout';\nimport { SettingsContainer } from '../components/SettingsContainer';\nimport { navigationRoutes } from '../constants/navigationRoutes';\nimport { useNavigateBack } from '../hooks/useNavigateBack';\n\nenum Languages {\n ENGLISH = 'english',\n FRENCH = 'french',\n SPANISH = 'spanish',\n}\nexport function LanguagePage() {\n const { navigateBackFrom } = useNavigateBack();\n const [language, setLanguage] = useState(Languages.ENGLISH);\n\n const languageList = [\n {\n id: Languages.ENGLISH,\n value: Languages.ENGLISH,\n title: (\n <Typography variant=\"title\" size=\"xmedium\">\n {i18n.t('English')}\n </Typography>\n ),\n onClick: () => setLanguage(Languages.ENGLISH),\n end: <Radio value={Languages.ENGLISH} />,\n },\n {\n id: Languages.FRENCH,\n value: Languages.FRENCH,\n title: (\n <Typography variant=\"title\" size=\"xmedium\">\n {i18n.t('French')}\n </Typography>\n ),\n onClick: () => setLanguage(Languages.FRENCH),\n end: <Radio value={Languages.FRENCH} />,\n },\n {\n id: Languages.SPANISH,\n value: Languages.SPANISH,\n title: (\n <Typography variant=\"title\" size=\"xmedium\">\n {i18n.t('Spanish')}\n </Typography>\n ),\n onClick: () => setLanguage(Languages.SPANISH),\n end: <Radio value={Languages.SPANISH} />,\n },\n ];\n\n return (\n <Layout\n header={{\n onBack: navigateBackFrom.bind(null, navigationRoutes.settings),\n title: i18n.t('Language'),\n }}>\n <SettingsContainer>\n <RadioRoot value={language}>\n <List\n type={\n <ListItemButton\n title=\"language\"\n id=\"_\"\n onClick={() => console.log()}\n />\n }\n items={languageList}\n />\n </RadioRoot>\n </SettingsContainer>\n </Layout>\n );\n}\n", "import { styled } from '@rango-dev/ui';\n\nexport const SettingsContainer = styled('div', {\n height: '100%',\n});\n\nexport const LiquiditySourceList = styled('ul', {\n padding: '$15 $5 0',\n margin: 0,\n listStyle: 'none',\n height: '100%',\n overflowY: 'visible',\n});\n\nexport const LiquiditySourceDivider = styled('li', {\n margin: '0 auto',\n width: '100%',\n height: '1px',\n backgroundColor: '$neutral300',\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 type {\n LiquiditySourceType,\n UniqueSwappersGroupType,\n} from '../utils/settings';\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 } from '../components/Layout';\nimport { LoadingLiquiditySourceList } from '../components/LoadingLiquiditySourceList';\nimport { SearchInput } from '../components/SearchInput';\nimport {\n LiquiditySourceDivider,\n LiquiditySourceList,\n LiquiditySourceSuffix,\n NotFoundContainer,\n SettingsContainer,\n} from '../components/SettingsContainer';\nimport { navigationRoutes } from '../constants/navigationRoutes';\nimport { useNavigateBack } from '../hooks/useNavigateBack';\nimport { useMetaStore } from '../store/meta';\nimport { useSettingsStore } from '../store/settings';\nimport { containsText } from '../utils/numbers';\nimport { getUniqueSwappersGroups } from '../utils/settings';\n\ninterface PropTypes {\n supportedSwappers?: string[];\n sourceType: 'Exchanges' | 'Bridges';\n}\n\nexport function LiquiditySourcePage({\n supportedSwappers,\n sourceType,\n}: PropTypes) {\n const [searchedFor, setSearchedFor] = useState<string>('');\n const toggleLiquiditySource = useSettingsStore.use.toggleLiquiditySource();\n const { navigateBackFrom } = useNavigateBack();\n const loadingMetaStatus = useMetaStore.use.loadingStatus();\n\n const supportedUniqueSwappersGroups: Array<UniqueSwappersGroupType> =\n getUniqueSwappersGroups(supportedSwappers);\n\n const validTypes: Array<LiquiditySourceType> = [];\n if (sourceType === 'Exchanges') {\n validTypes.push('DEX');\n }\n if (sourceType === 'Bridges') {\n validTypes.push('BRIDGE');\n validTypes.push('AGGREGATOR');\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 } = sourceItem;\n return {\n start: <Image src={logo} size={22} type=\"circular\" />,\n onClick: () => toggleLiquiditySource(groupTitle),\n end: <Checkbox checked={selected} />,\n title: (\n <Typography variant=\"title\" size=\"xmedium\">\n {i18n.t(groupTitle)}\n </Typography>\n ),\n ...sourceItem,\n };\n });\n\n const searchHandler = (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 onBack: navigateBackFrom.bind(null, navigationRoutes.settings),\n title: i18n.t(sourceType),\n suffix: (\n <LiquiditySourceSuffix>\n <Button variant=\"ghost\" size=\"xsmall\" onClick={toggleAllSources}>\n {i18n.t(hasSelectAll ? 'Deselect all' : 'Select all')}\n </Button>\n </LiquiditySourceSuffix>\n ),\n }}>\n <SettingsContainer>\n <SearchInput\n value={searchedFor}\n setValue={setSearchedFor}\n fullWidth\n color=\"light\"\n variant=\"contained\"\n placeholder={i18n.t('Swap {sourceType}', { sourceType })}\n onChange={searchHandler}\n />\n {loadingMetaStatus === '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 loadingMetaStatus === 'success' && (\n <LiquiditySourceList>\n {filteredList.map((sourceItem) => {\n return (\n <React.Fragment key={sourceItem.id}>\n <ListItemButton\n style={{ height: '61px' }}\n {...sourceItem}\n selected={false}\n />\n <LiquiditySourceDivider />\n </React.Fragment>\n );\n })}\n </LiquiditySourceList>\n )\n )}\n </SettingsContainer>\n </Layout>\n );\n}\n", "import { Checkbox, Skeleton } from '@rango-dev/ui';\nimport React from 'react';\n\nimport { LiquiditySourceList } from '../SettingsContainer';\n\nimport { CustomeListItem } from './LoadingLiquiditySourceList.styles';\n\nconst ITEM_SKELETON_COUNT = 30;\nexport function LoadingLiquiditySourceList() {\n return (\n <LiquiditySourceList>\n {Array.from(Array(ITEM_SKELETON_COUNT), (e) => (\n <CustomeListItem\n hasDivider\n key={e}\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 { ListItem, styled } from '@rango-dev/ui';\n\nexport const CustomeListItem = styled(ListItem, {\n height: 61,\n});\n", "import { useMetaStore } from '../store/meta';\nimport { useSettingsStore } from '../store/settings';\n\nimport { removeDuplicateFrom } from './common';\n\nexport type LiquiditySourceType = 'BRIDGE' | 'AGGREGATOR' | 'DEX';\n\nexport type UniqueSwappersGroupType = {\n id: string;\n groupTitle: string;\n logo: string;\n type: LiquiditySourceType;\n selected: boolean;\n};\n\nexport function getUniqueSwappersGroups(\n supportedSwappers?: string[]\n): UniqueSwappersGroupType[] {\n const swappers = useMetaStore.use.meta().swappers;\n const disabledLiquiditySources =\n useSettingsStore.use.disabledLiquiditySources();\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.title\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", "import { i18n } from '@lingui/core';\nimport { Divider } from '@rango-dev/ui';\nimport React, { useState } from 'react';\n\nimport { BlockchainList } from '../components/BlockchainList';\nimport { Layout } from '../components/Layout';\nimport { SearchInput } from '../components/SearchInput';\nimport { SelectableCategoryList } from '../components/SelectableCategoryList';\nimport { navigationRoutes } from '../constants/navigationRoutes';\nimport { useNavigateBack } from '../hooks/useNavigateBack';\nimport { useBestRouteStore } from '../store/bestRoute';\nimport { useMetaStore } from '../store/meta';\n\ninterface PropTypes {\n type: 'from' | 'to';\n supportedBlockchains?: string[];\n}\n\nexport function SelectBlockchainPage(props: PropTypes) {\n const { type, supportedBlockchains } = props;\n const { navigateBackFrom } = useNavigateBack();\n const [searchedFor, setSearchedFor] = useState<string>('');\n const [blockchainCategory, setBlockchainCategory] = useState<string>('ALL');\n const setToBlockchain = useBestRouteStore.use.setToBlockchain();\n const setFromBlockchain = useBestRouteStore.use.setFromBlockchain();\n\n const blockchains = supportedBlockchains\n ? useMetaStore.use\n .meta()\n .blockchains.filter((chain) =>\n supportedBlockchains.includes(chain.name)\n )\n : useMetaStore.use.meta().blockchains;\n\n return (\n <Layout\n header={{\n onBack: navigateBackFrom.bind(\n null,\n navigationRoutes[`${type}Blockchain`]\n ),\n title: i18n.t(`Select Blockchain`),\n }}>\n <Divider size={12} />\n <SelectableCategoryList\n setCategory={setBlockchainCategory}\n category={blockchainCategory}\n />\n <Divider size={24} />\n <SearchInput\n value={searchedFor}\n autoFocus\n placeholder={i18n.t('Search Blockchain')}\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={blockchains}\n searchedFor={searchedFor}\n blockchainCategory={blockchainCategory}\n onChange={(blockchain) => {\n if (type === 'from') {\n setFromBlockchain(blockchain, true);\n } else {\n setToBlockchain(blockchain, true);\n }\n navigateBackFrom(navigationRoutes[`${type}Blockchain`]);\n }}\n />\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 { useMetaStore } from '../../store/meta';\n\nimport { filterBlockchains } from './BlockchainList.helpers';\nimport { Container, List } from './BlockchainList.styles';\nimport { LoadingBlockchainList } from './LoadingBlockchainList';\n\nexport function BlockchainList(props: PropTypes) {\n const { list, searchedFor, onChange, blockchainCategory } = props;\n const [blockchains, setBlockchains] = useState<BlockchainMeta[]>(list);\n const loadingStatus = useMetaStore.use.loadingStatus();\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 <>\n <Divider size={32} />\n <NotFound\n title={i18n.t('No results found')}\n description={i18n.t('Try using different keywords')}\n />\n </>\n );\n }\n return (\n <List key={`${blockchainCategory}-${searchedFor}`}>\n {blockchains.map((item) => (\n <ListItemButton\n key={`${item.name}-${item.chainId}`}\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.chainId as string}\n />\n ))}\n </List>\n );\n };\n\n return (\n <Container>\n <Typography variant=\"label\" size=\"large\">\n {i18n.t('Select Blockchain')}\n </Typography>\n <Divider size={4} />\n {loadingStatus === 'loading' && <LoadingBlockchainList />}\n {loadingStatus === 'success' && renderList()}\n </Container>\n );\n}\n", "import { type BlockchainMeta, TransactionType } from 'rango-sdk';\n\nimport { containsText } from '../../utils/common';\nimport { BlockchainCategories } from '../SelectableCategoryList/SelectableCategoryList.types';\n\nexport const filterByType = (\n blockchain: BlockchainMeta,\n type: string\n): boolean => {\n switch (type) {\n case BlockchainCategories.ALL:\n return true;\n case BlockchainCategories.UTXO:\n return blockchain.type === TransactionType.TRANSFER;\n case BlockchainCategories.OTHER:\n return (\n blockchain.type !== TransactionType.TRANSFER &&\n blockchain.type !== TransactionType.COSMOS &&\n blockchain.type !== TransactionType.EVM\n );\n default:\n return blockchain.type === type;\n }\n};\n\nexport const filterBlockchains = (\n list: BlockchainMeta[],\n searchedFor: string,\n blockchainType: string\n) =>\n list\n .filter((blockchain) => filterByType(blockchain, blockchainType))\n .filter(\n (blockchain) =>\n containsText(blockchain.name, searchedFor) ||\n containsText(blockchain.displayName, searchedFor)\n );\n", "export interface PropTypes {\n setCategory: (type: string) => void;\n category: string;\n}\n\nexport enum BlockchainCategories {\n ALL = 'ALL',\n EVM = 'EVM',\n COSMOS = 'COSMOS',\n UTXO = 'UTXO',\n OTHER = 'OTHER',\n}\n", "import { styled } from '@rango-dev/ui';\n\nexport const Container = styled('div', {\n display: 'flex',\n flexDirection: 'column',\n overflow: 'hidden',\n});\n\nexport const List = styled('ul', {\n padding: 0,\n margin: 0,\n listStyle: 'none',\n overflowY: 'auto',\n paddingRight: '$5',\n '.image-container': {\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>\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", "/* eslint-disable @typescript-eslint/no-magic-numbers */\nimport type { PropTypes } from './SelectableCategoryList.types';\n\nimport { i18n } from '@lingui/core';\nimport { Divider, Image, Skeleton, Typography } from '@rango-dev/ui';\nimport React from 'react';\n\nimport { useMetaStore } from '../../store/meta';\nimport { BlockchainsChip } from '../BlockchainsChip';\n\nimport { generateBlockchainsLogo } from './SelectableCategoryList.helpers';\nimport {\n Container,\n FirstImage,\n ImageContent,\n} from './SelectableCategoryList.styles';\nimport { BlockchainCategories } from './SelectableCategoryList.types';\n\nexport function SelectableCategoryList(props: PropTypes) {\n const { setCategory, category } = props;\n const blockchains = useMetaStore.use.meta().blockchains;\n const loadingStatus = useMetaStore.use.loadingStatus();\n const categories = Object.keys(\n BlockchainCategories\n ) as BlockchainCategories[];\n return (\n <Container>\n {loadingStatus === 'loading' &&\n Array.from(Array(5), (_, index) => (\n <Skeleton\n key={index}\n variant=\"rounded\"\n height={70}\n width={index === 0 ? 45 : 65}\n />\n ))}\n {loadingStatus === 'success' &&\n categories.map((blockchainCategory) => (\n <BlockchainsChip\n selected={category === blockchainCategory}\n key={blockchainCategory}\n onClick={() => setCategory(blockchainCategory)}>\n {blockchainCategory !== BlockchainCategories.ALL && (\n <>\n <ImageContent>\n {generateBlockchainsLogo(blockchains, blockchainCategory).map(\n (blockchain, index) =>\n index === 0 ? (\n <FirstImage\n key={`image-${blockchain.name}-${blockchain.chainId}`}\n src={blockchain.logo}\n />\n ) : (\n <Image\n key={`image-${blockchain.name}-${blockchain.chainId}`}\n src={blockchain.logo}\n size={15}\n />\n )\n )}\n </ImageContent>\n <Divider size={12} />\n </>\n )}\n <Typography\n size=\"xsmall\"\n variant=\"body\"\n color={\n blockchainCategory === BlockchainCategories.ALL\n ? 'secondary500'\n : undefined\n }>\n {i18n.t(BlockchainCategories[blockchainCategory])}\n </Typography>\n </BlockchainsChip>\n ))}\n </Container>\n );\n}\n", "import type { PropTypes } from './BlockchainsChip.types';\nimport type { PropsWithChildren } from 'react';\n\nimport React from 'react';\n\nimport { Chip } from './BlockchainsChip.styles';\n\nexport function BlockchainsChip(props: PropsWithChildren<PropTypes>) {\n const { children, selected, onClick } = props;\n return (\n <Chip selected={selected} onClick={onClick}>\n {children}\n </Chip>\n );\n}\n", "import { styled } from '@rango-dev/ui';\n\nexport const Chip = styled('button', {\n padding: '$10',\n borderRadius: '$sm',\n backgroundColor: '$neutral100',\n display: 'flex',\n flexDirection: 'column',\n justifyContent: 'center',\n alignItems: 'center',\n cursor: 'pointer',\n border: 0,\n '.image-container': {\n borderRadius: '$xm',\n overflow: 'hidden',\n },\n '&:hover': {\n backgroundColor: '$neutral400',\n },\n '&:focus-visible': {\n outline: 0,\n backgroundColor: '$neutral500',\n },\n variants: {\n selected: {\n true: { outline: '1px solid $secondary500' },\n false: { outline: 0 },\n },\n },\n});\n", "import { type BlockchainMeta } from 'rango-sdk';\n\nimport { filterByType } from '../BlockchainList/BlockchainList.helpers';\n\nimport { BlockchainCategories } from './SelectableCategoryList.types';\n\nconst blockchainslogo = {\n [BlockchainCategories.EVM]: ['ETH', 'BSC', 'POLYGON'],\n [BlockchainCategories.COSMOS]: ['COSMOS', 'OSMOSIS', 'JUNO'],\n [BlockchainCategories.UTXO]: ['BTC', 'LTC', 'BCH'],\n [BlockchainCategories.OTHER]: ['STARKNET', 'TRON', 'SOLANA'],\n};\n\nexport const generateBlockchainsLogo = (\n list: BlockchainMeta[],\n type: Exclude<BlockchainCategories, 'ALL'>\n) =>\n list\n .filter((item) => filterByType(item, type))\n .filter((item) => blockchainslogo[type].includes(item.name));\n", "import { styled } from '@rango-dev/ui';\n\nexport const Container = styled('div', {\n display: 'grid',\n gap: '$10',\n gridTemplateColumns: 'auto 1fr 1fr 1fr 1fr',\n});\n\nexport const ImageContent = styled('div', {\n display: 'flex',\n position: 'relative',\n alignItems: 'center',\n justifyContent: 'center',\n paddingTop: '$10',\n});\nexport const FirstImage = styled('img', {\n position: 'absolute',\n top: -2,\n width: 15,\n height: 15,\n});\n", "/* eslint-disable @typescript-eslint/no-magic-numbers */\nimport type { Asset, Token } from 'rango-sdk';\n\nimport { i18n } from '@lingui/core';\nimport { Divider } from '@rango-dev/ui';\nimport React, { useEffect, useState } from 'react';\nimport { useNavigate } from 'react-router-dom';\n\nimport { BlockchainsSection } from '../components/BlockchainsSection';\nimport { Layout } from '../components/Layout';\nimport { SearchInput } from '../components/SearchInput';\nimport { TokenList } from '../components/TokenList/TokenList';\nimport { filterTokens } from '../components/TokenList/TokenList.helpers';\nimport { navigationRoutes } from '../constants/navigationRoutes';\nimport { useNavigateBack } from '../hooks/useNavigateBack';\nimport { useBestRouteStore } from '../store/bestRoute';\nimport { useMetaStore } from '../store/meta';\nimport { useWalletsStore } from '../store/wallets';\nimport { findCommonTokens } from '../utils/routing';\nimport { tokensAreEqual } from '../utils/wallets';\n\ninterface PropTypes {\n type: 'from' | 'to';\n supportedBlockchains?: string[];\n supportedTokens?: Asset[];\n pinnedTokens?: Asset[];\n}\n\nexport function SelectSwapItemsPage(props: PropTypes) {\n const { type, supportedBlockchains, supportedTokens, pinnedTokens } = props;\n const [selectedBlockchain, setSelectedBlockchain] = useState('');\n const navigate = useNavigate();\n const { navigateBackFrom } = useNavigateBack();\n const {\n meta: { tokens },\n setTokensWithBalance,\n } = useMetaStore();\n const {\n sourceTokens,\n destinationTokens,\n fromBlockchain,\n toBlockchain,\n setFromToken,\n setToToken,\n setFromBlockchain,\n setToBlockchain,\n } = useBestRouteStore();\n const { connectedWallets, loading: loadingWallet } = useWalletsStore();\n const [searchedFor, setSearchedFor] = useState<string>('');\n\n const blockchains = supportedBlockchains\n ? useMetaStore.use\n .meta()\n .blockchains.filter((chain) =>\n supportedBlockchains.includes(chain.name)\n )\n : useMetaStore.use.meta().blockchains;\n\n const allTokens = supportedTokens\n ? findCommonTokens(supportedTokens, tokens)\n : tokens.filter((token) =>\n new Set(blockchains.map((blockchain) => blockchain.name)).has(\n token.blockchain\n )\n );\n\n const supportedSourceTokens = supportedTokens\n ? findCommonTokens(supportedTokens, sourceTokens)\n : sourceTokens;\n\n const supportedDestinationTokens = supportedTokens\n ? findCommonTokens(supportedTokens, destinationTokens)\n : destinationTokens;\n\n const tokensByType =\n type === 'from' ? supportedSourceTokens : supportedDestinationTokens;\n\n let tokenList: Token[] = [];\n\n const noBlockchainSelected =\n (type === 'from' && !fromBlockchain) || (type === 'to' && !toBlockchain);\n\n if (noBlockchainSelected) {\n tokenList = allTokens;\n } else if (tokensByType.length) {\n tokenList = tokensByType.map((token) => ({\n ...token,\n pin: pinnedTokens?.some((pinnedToken) =>\n tokensAreEqual(pinnedToken, token)\n ),\n }));\n }\n\n useEffect(() => {\n if (connectedWallets.length && !loadingWallet) {\n setTokensWithBalance();\n }\n }, [connectedWallets, loadingWallet]);\n\n return (\n <Layout\n header={{\n onBack: () =>\n navigateBackFrom(\n type === 'from'\n ? navigationRoutes.fromSwap\n : navigationRoutes.toSwap\n ),\n title: i18n.t('Swap {type}', { type }),\n }}>\n <BlockchainsSection\n blockchains={blockchains}\n type={type}\n blockchain={type === 'from' ? fromBlockchain : toBlockchain}\n onMoreClick={() =>\n navigate(\n type === 'from'\n ? navigationRoutes.fromBlockchain\n : navigationRoutes.toBlockchain\n )\n }\n onChange={(blockchain) => {\n {\n if (type === 'from') {\n setFromBlockchain(blockchain, true);\n } else {\n setToBlockchain(blockchain, true);\n }\n setSelectedBlockchain(blockchain.name);\n }\n }}\n />\n <Divider size={24} />\n <SearchInput\n value={searchedFor}\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 />\n <Divider size={16} />\n <TokenList\n list={filterTokens(tokenList, searchedFor)}\n selectedBlockchain={selectedBlockchain}\n searchedFor={searchedFor}\n onChange={(token) => {\n const blockchain = blockchains.find(\n (chain) => token.blockchain === chain.name\n );\n if (type === 'from') {\n setFromToken(token);\n if (!!blockchain) {\n setFromBlockchain(blockchain, true);\n }\n } else {\n setToToken(token);\n if (!!blockchain) {\n setToBlockchain(blockchain, true);\n }\n }\n navigateBackFrom(navigationRoutes.fromSwap);\n }}\n />\n </Layout>\n );\n}\n", "/* eslint-disable @typescript-eslint/no-magic-numbers */\nimport type { PropTypes } from './BlockchainsSection.types';\n\nimport { i18n } from '@lingui/core';\nimport { Divider, Image, Skeleton, Typography } from '@rango-dev/ui';\nimport { type BlockchainMeta } from 'rango-sdk';\nimport React, { useEffect, useState } from 'react';\n\nimport { useBestRouteStore } from '../../store/bestRoute';\nimport { useMetaStore } from '../../store/meta';\nimport { BlockchainsChip } from '../BlockchainsChip';\n\nimport { sortBlockchains } from './BlockchainSection.helpers';\nimport { Container } from './BlockchainsSection.styles';\n\nconst MIN = 9;\nconst MAX = 10;\nconst NUMBER_OF_LOADING = 12;\nexport function BlockchainsSection(props: PropTypes) {\n const { blockchains, type, blockchain, onChange, onMoreClick } = props;\n const sortedBlockchains = sortBlockchains(blockchains);\n const [selectFromMoreBlockchain, setSelectFromMoreBlockchain] =\n useState<BlockchainMeta | null>(null);\n const loadingStatus = useMetaStore.use.loadingStatus();\n const resetToBlockchain = useBestRouteStore.use.resetToBlockchain();\n const resetFromBlockchain = useBestRouteStore.use.resetFromBlockchain();\n const COUNT_BLOCKCHAINS = !!selectFromMoreBlockchain ? MIN : MAX;\n\n useEffect(() => {\n const selectBlockchainFromMore = sortedBlockchains\n .slice(MAX, sortedBlockchains.length)\n .find(\n (item) =>\n item.chainId === blockchain?.chainId && item.name === blockchain?.name\n );\n if (!!selectBlockchainFromMore) {\n setSelectFromMoreBlockchain(selectBlockchainFromMore);\n }\n }, [blockchain]);\n\n return (\n <div>\n <Divider size={12} />\n <Typography variant=\"label\" size=\"large\">\n {i18n.t('Select Blockchain')}\n </Typography>\n <Divider size={12} />\n <Container>\n {loadingStatus === 'loading' &&\n Array.from(Array(NUMBER_OF_LOADING), (e) => (\n <Skeleton key={e} variant=\"rounded\" height={50} />\n ))}\n {loadingStatus === 'success' && (\n <>\n <BlockchainsChip\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 {!!selectFromMoreBlockchain && (\n <BlockchainsChip\n selected={\n !!selectFromMoreBlockchain &&\n selectFromMoreBlockchain.chainId === blockchain?.chainId\n }\n key={selectFromMoreBlockchain.chainId}\n onClick={() => onChange(selectFromMoreBlockchain)}>\n <Image src={selectFromMoreBlockchain.logo} size={30} />\n </BlockchainsChip>\n )}\n {sortedBlockchains.slice(0, COUNT_BLOCKCHAINS).map((item) => (\n <BlockchainsChip\n key={item.chainId}\n selected={!!blockchain && blockchain.chainId === item.chainId}\n onClick={() => onChange(item)}>\n <Image src={item.logo} size={30} />\n </BlockchainsChip>\n ))}\n\n <BlockchainsChip onClick={onMoreClick}>\n <Typography variant=\"body\" size=\"xsmall\" color=\"secondary500\">\n {i18n._('More +{count}', {\n count: sortedBlockchains.length - MAX,\n })}\n </Typography>\n </BlockchainsChip>\n </>\n )}\n </Container>\n </div>\n );\n}\n", "import type { BlockchainMeta } from 'rango-sdk';\n\nexport const sortBlockchains = (blockchains: BlockchainMeta[]) => {\n const importantBlockchains: BlockchainMeta[] = [];\n const otherBlockchains: BlockchainMeta[] = [];\n\n for (const blockchain of blockchains) {\n if (\n blockchain.name === 'ETH' ||\n blockchain.name === 'COSMOS' ||\n blockchain.name === 'OSMOSIS'\n ) {\n importantBlockchains.push(blockchain);\n } else {\n otherBlockchains.push(blockchain);\n }\n }\n\n return importantBlockchains.concat(otherBlockchains);\n};\n", "import { styled } from '@rango-dev/ui';\n\nexport const Container = styled('div', {\n display: 'grid',\n gap: '$10',\n gridTemplateColumns: 'repeat(6, minmax(0, 1fr))',\n});\n", "/* eslint-disable @typescript-eslint/no-magic-numbers */\nimport type {\n PropTypes,\n RenderDescProps,\n TokenWithBalance,\n} from './TokenList.types';\nimport type { CommonProps } from 'react-window';\n\nimport { i18n } from '@lingui/core';\nimport {\n darkTheme,\n Divider,\n ExternalLinkIcon,\n Image,\n ListItemButton,\n NotFound,\n PinIcon,\n Skeleton,\n Typography,\n VirtualizedList,\n} from '@rango-dev/ui';\nimport React, { forwardRef, useEffect, useState } from 'react';\n\nimport { useMetaStore } from '../../store/meta';\nimport { useWalletsStore } from '../../store/wallets';\nimport { generateRangeColors } from '../../utils/common';\n\nimport { LoadingTokenList } from './LoadingTokenList';\nimport {\n BalanceContainer,\n Container,\n End,\n ImageSection,\n List,\n Pin,\n Tag,\n TagTitle,\n Title,\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=\"description\">\n {name ? (\n <div className=\"token-name\">{name}</div>\n ) : (\n <Title className=\"token-title\">\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={`token-address ${!name && 'token-address-without-name'}`}>\n <a\n href={url}\n target=\"_blank\"\n rel=\"nofollow noreferrer\"\n onClick={(e) => e.stopPropagation()}>\n {length > 10\n ? `${address.slice(0, 5)}...${address.slice(length - 6, length)}`\n : address}{' '}\n <ExternalLinkIcon color=\"gray\" size={12} />\n </a>\n </div>\n )}\n </div>\n );\n};\n\nexport function TokenList(props: PropTypes) {\n const { list, searchedFor = '', onChange, selectedBlockchain } = props;\n\n const [tokens, setTokens] = useState<TokenWithBalance[]>(list);\n const loadingStatus = useMetaStore.use.loadingStatus();\n const [hasNextPage, setHasNextPage] = useState<boolean>(true);\n const loadingWallet = useWalletsStore.use.loading();\n const { blockchains } = useMetaStore.use.meta();\n\n // eslint-disable-next-line react/display-name\n const innerElementType: React.FC<CommonProps> = forwardRef((render, ref) => {\n return (\n <div\n {...render}\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n ref={ref as any}\n style={{\n ...render.style,\n height: `${parseFloat(render.style?.height as string) + 8 * 2}px`,\n }}\n />\n );\n });\n const loadNextPage = () => {\n setTokens(list.slice(0, tokens.length + PAGE_SIZE));\n };\n\n useEffect(() => {\n setHasNextPage(list.length > tokens.length);\n }, [tokens.length]);\n\n useEffect(() => {\n setTokens(list.slice(0, PAGE_SIZE));\n }, [list]);\n\n const renderList = () => {\n if (!tokens.length && !!searchedFor) {\n return (\n <>\n <Divider size={32} />\n <NotFound\n title={i18n.t('No results found')}\n description={i18n.t('Try using different keywords')}\n />\n </>\n );\n }\n return (\n <VirtualizedList\n Item={({ index, style }) => {\n const address = tokens[index].address || '';\n const blockchain = blockchains.find(\n (blockchain) => blockchain.name === tokens[index].blockchain\n );\n const color = generateRangeColors(\n tokens[index].symbol,\n blockchain?.color || ''\n );\n\n const customCssForTag = {\n $$color: color[`${tokens[index].symbol}100`],\n [`.${darkTheme} &`]: {\n $$color: color[`${tokens[index].symbol}900`],\n },\n backgroundColor: '$$color',\n };\n\n const customCssForTagTitle = {\n $$color: color[`${tokens[index].symbol}700`],\n [`.${darkTheme} &`]: {\n $$color: color[`${tokens[index].symbol}100`],\n },\n color: '$$color',\n };\n\n return (\n <div\n style={{\n ...style,\n paddingRight: 5,\n }}>\n <ListItemButton\n style={{\n height: style?.height,\n }}\n tab-index={index}\n key={`${tokens[index].symbol}${tokens[index].address}`}\n id={`${tokens[index].symbol}${tokens[index].address}`}\n hasDivider\n onClick={() => onChange(tokens[index])}\n start={\n <ImageSection>\n <Image src={tokens[index].image} size={30} />\n {tokens[index].pin && (\n <Pin>\n <PinIcon size={12} color=\"gray\" />\n </Pin>\n )}\n </ImageSection>\n }\n title={\n blockchain?.type === 'COSMOS' ||\n !!tokens[index].name ||\n (!tokens[index].name && !address) ? (\n <Title>\n <Typography variant=\"title\" size=\"xmedium\">\n {tokens[index].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 {tokens[index].blockchain}\n </TagTitle>\n </Tag>\n </Title>\n ) : undefined\n }\n description={\n !!blockchain?.info &&\n !!address &&\n blockchain.type !== 'COSMOS'\n ? renderDesc({\n address,\n token: tokens[index],\n customCssForTag,\n customCssForTagTitle,\n name: tokens[index].name,\n url: blockchain.info.addressUrl\n .split('{wallet}')\n .join(address),\n })\n : tokens[index].name || undefined\n }\n end={\n loadingWallet ? (\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 tokens[index]?.balance && (\n <BalanceContainer>\n <Typography variant=\"title\" size=\"small\">\n {tokens[index].balance?.amount}\n </Typography>\n <div />\n {tokens[index].balance?.usdValue && (\n <Typography\n variant=\"body\"\n color=\"neutral800\"\n size=\"xsmall\">\n {`$${tokens[index].balance?.usdValue}`}\n </Typography>\n )}\n </BalanceContainer>\n )\n )\n }\n />\n </div>\n );\n }}\n hasNextPage={hasNextPage}\n itemCount={tokens.length}\n loadNextPage={loadNextPage}\n innerElementType={innerElementType}\n size={60}\n key={`${selectedBlockchain}-${searchedFor}`}\n />\n );\n };\n\n return (\n <Container>\n <Typography variant=\"label\" size=\"large\">\n {i18n.t('Select Token')}\n </Typography>\n <Divider size={4} />\n {loadingStatus === 'loading' && <LoadingTokenList size={PAGE_SIZE} />}\n {loadingStatus === 'success' && <List>{renderList()}</List>}\n </Container>\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 { styled, Typography } from '@rango-dev/ui';\n\nexport const Container = styled('div', {\n display: 'flex',\n flexDirection: 'column',\n flexGrow: 1,\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 padding: 0,\n margin: 0,\n listStyle: 'none',\n '& li': {\n alignItems: 'none',\n '.description': {\n position: 'relative',\n height: 12,\n width: 150,\n '.token-title': {\n position: 'absolute',\n transform: 'none',\n transition: 'transform 225ms cubic-bezier(0, 0, 0.2, 1) 0ms',\n bottom: '-8px',\n },\n\n '.token-address': {\n transform: 'translateY(12px)',\n visibility: 'hidden',\n '& a': {\n fontSize: '$12',\n lineHeight: '$16',\n color: '$neutral800',\n textDecoration: 'none',\n },\n },\n '.token-name': {\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 },\n },\n '&:hover': {\n '.description': {\n '.token-address': {\n position: 'absolute',\n transform: 'none',\n transition: 'transform 225ms cubic-bezier(0, 0, 0.2, 1) 0ms',\n visibility: 'visible',\n },\n '.token-address-without-name': {\n bottom: '-15px',\n },\n '.token-name': {\n position: 'absolute',\n transform: 'translateY(-12px)',\n visibility: 'hidden',\n },\n '.token-title': {\n position: 'absolute',\n transform: 'translateY(-12px)',\n bottom: '-10px',\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});\n\nexport const End = styled('ul', {\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 '.image-container': {\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", "import type { TokenWithBalance } from './TokenList.types';\n\nimport { containsText } from '../../utils/common';\n\nexport const filterTokens = (list: TokenWithBalance[], searchedFor: string) =>\n list\n .filter(\n (token) =>\n containsText(token.symbol, searchedFor) ||\n containsText(token.address || '', searchedFor) ||\n containsText(token.name || '', searchedFor)\n )\n .sort((a, b) => (b.pin as any) - (a.pin as any));\n", "import { i18n } from '@lingui/core';\nimport {\n ChevronRightIcon,\n Divider,\n List,\n ListItemButton,\n Skeleton,\n Switch,\n Typography,\n} from '@rango-dev/ui';\nimport React from 'react';\nimport { useNavigate } from 'react-router-dom';\n\nimport { Layout } from '../components/Layout';\nimport { SettingsContainer } from '../components/SettingsContainer';\nimport { Slippage } from '../components/Slippage';\nimport { navigationRoutes } from '../constants/navigationRoutes';\nimport { useNavigateBack } from '../hooks/useNavigateBack';\nimport { useMetaStore } from '../store/meta';\nimport { useSettingsStore } from '../store/settings';\nimport { getUniqueSwappersGroups } from '../utils/settings';\n\ninterface PropTypes {\n supportedSwappers?: string[];\n singleTheme?: boolean;\n}\n\nexport function SettingsPage({ supportedSwappers, singleTheme }: PropTypes) {\n const navigate = useNavigate();\n const { navigateBackFrom } = useNavigateBack();\n\n const infiniteApprove = useSettingsStore.use.infiniteApprove();\n const toggleInfiniteApprove = useSettingsStore.use.toggleInfiniteApprove();\n const loadingMetaStatus = useMetaStore.use.loadingStatus();\n\n const supportedUniqueSwappersGroups =\n getUniqueSwappersGroups(supportedSwappers);\n\n const bridgeSources = supportedUniqueSwappersGroups.filter(\n (uniqueItem) =>\n uniqueItem.type === 'BRIDGE' || uniqueItem.type === 'AGGREGATOR'\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 const totalExchangeSources = exchangeSources.length;\n const totalSelectedExchangeSources = exchangeSources.filter(\n (uniqueItem) => uniqueItem.selected\n ).length;\n\n const handleEndItem = (totalSelected: number, total: number) => {\n switch (loadingMetaStatus) {\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 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: 'bridge-item',\n title: (\n <Typography variant=\"title\" size=\"xmedium\">\n {i18n.t('Enabled bridges')}\n </Typography>\n ),\n end: (\n <>\n {handleEndItem(totalSelectedBridgeSources, totalBridgeSources)}\n <Divider direction=\"horizontal\" size={8} />\n <ChevronRightIcon color=\"black\" />\n </>\n ),\n onClick: () => navigate(navigationRoutes.bridges),\n };\n\n const exchangeItem = {\n id: 'exchange-item',\n title: (\n <Typography variant=\"title\" size=\"xmedium\">\n {i18n.t('Enabled exchanges')}\n </Typography>\n ),\n end: (\n <>\n {handleEndItem(totalSelectedExchangeSources, totalExchangeSources)}\n <Divider direction=\"horizontal\" size={8} />\n <ChevronRightIcon color=\"gray\" />\n </>\n ),\n onClick: () => navigate(navigationRoutes.exchanges),\n };\n\n const languageItem = {\n id: 'language-item',\n title: (\n <Typography variant=\"title\" size=\"xmedium\">\n {i18n.t('Language')}\n </Typography>\n ),\n end: <ChevronRightIcon color=\"gray\" />,\n onClick: () => navigate(navigationRoutes.languages),\n };\n\n const themeItem = {\n id: 'theme-item',\n title: (\n <Typography variant=\"title\" size=\"xmedium\">\n {i18n.t('Theme')}\n </Typography>\n ),\n end: <ChevronRightIcon color=\"gray\" />,\n onClick: () => navigate(navigationRoutes.themes),\n };\n\n const infiniteApprovalItem = {\n id: 'infinite-approval-item',\n title: (\n <Typography variant=\"title\" size=\"xmedium\">\n {i18n.t('Infinite Approval')}\n </Typography>\n ),\n end: <Switch checked={infiniteApprove} />,\n onClick: toggleInfiniteApprove,\n };\n\n const settingItems = [bridgeItem, exchangeItem, languageItem];\n if (!singleTheme) {\n settingItems.push(themeItem);\n }\n settingItems.push(infiniteApprovalItem);\n\n return (\n <Layout\n header={{\n onBack: navigateBackFrom.bind(null, navigationRoutes.settings),\n title: i18n.t('Setting'),\n }}>\n <SettingsContainer>\n <Slippage />\n <List\n type={\n <ListItemButton title=\"_\" id=\"_\" onClick={() => console.log()} />\n }\n items={settingItems}\n />\n </SettingsContainer>\n </Layout>\n );\n}\n", "import { i18n } from '@lingui/core';\nimport {\n Chip,\n Divider,\n InfoIcon,\n TextField,\n Tooltip,\n Typography,\n} from '@rango-dev/ui';\nimport React from 'react';\n\nimport {\n MAX_SLIPPAGE,\n MIN_SLIPPGAE,\n SLIPPAGES,\n} from '../../constants/swapSettings';\nimport { useSettingsStore } from '../../store/settings';\n\nimport { BaseContainer, Head, SlippageChipsContainer } from './Slippage.styles';\nimport { SlippageTooltipContent } from './SlippageTooltipContent';\n\nexport function Slippage() {\n const slippage = useSettingsStore.use.slippage();\n const setSlippage = useSettingsStore.use.setSlippage();\n const customSlippage = useSettingsStore.use.customSlippage();\n const setCustomSlippage = useSettingsStore.use.setCustomSlippage();\n\n return (\n <BaseContainer>\n <Head>\n <Typography variant=\"title\" size=\"xmedium\">\n {i18n.t('Slippage tolerance per swap')}\n </Typography>\n <Divider direction=\"horizontal\" size={4} />\n <Tooltip side=\"top\" 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 <>\n <Chip\n style={{ width: '64px', flexShrink: 0 }}\n key={key}\n onClick={() => {\n if (customSlippage) {\n setCustomSlippage(null);\n }\n setSlippage(slippageItem);\n }}\n selected={!customSlippage && slippageItem === slippage}\n label={`${slippageItem.toString()}%`}\n />\n <Divider direction=\"horizontal\" size={8} />\n </>\n );\n })}\n <TextField\n type=\"number\"\n min=\"0.01\"\n max=\"30\"\n step=\"0.01\"\n fullWidth\n variant=\"contained\"\n value={customSlippage || ''}\n color=\"dark\"\n onChange={(event) => {\n const parsedValue = parseFloat(event.target.value);\n if (\n !parsedValue ||\n (parsedValue >= MIN_SLIPPGAE && parsedValue <= MAX_SLIPPAGE)\n ) {\n setCustomSlippage(parsedValue);\n }\n }}\n suffix={\n customSlippage && (\n <Typography variant=\"body\" size=\"small\">\n %\n </Typography>\n )\n }\n placeholder=\"Custom\"\n />\n </SlippageChipsContainer>\n </BaseContainer>\n );\n}\n", "import { styled } from '@rango-dev/ui';\n\nexport const BaseContainer = styled('div', {\n paddingTop: '$5',\n paddingBottom: '30px',\n});\n\nexport const SlippageChipsContainer = styled('div', {\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'start',\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: '300px',\n padding: '$10',\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=\"small\" color=\"neutral900\">\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 per step, e.g. 1Inch, Thorchain, etc. and only that step will be reverted, not the whole transaction'\n )}\n </Typography>\n </SlippageTooltipContainer>\n );\n}\n", "import { cancelSwap } from '@rango-dev/queue-manager-rango-preset';\nimport { useManager } from '@rango-dev/queue-manager-react';\nimport React from 'react';\n\nimport { SwapDetails } from '../components/SwapDetails';\nimport { SwapDetailsPlaceholder } from '../components/SwapDetails/SwapDetails.Placeholder';\nimport { navigationRoutes } from '../constants/navigationRoutes';\nimport { useNavigateBack } from '../hooks/useNavigateBack';\nimport { useMetaStore } from '../store/meta';\nimport { useUiStore } from '../store/ui';\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 = useUiStore.use.selectedSwapRequestId();\n const { navigateBackFrom } = useNavigateBack();\n const { loadingStatus } = useMetaStore();\n\n const showSkeleton = loading || loadingStatus === 'loading';\n\n const selectedSwap = pendingSwaps.find(\n ({ swap }) => swap.requestId === requestId\n );\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 await manager?.deleteQueue(selectedSwap.id);\n navigateBackFrom(navigationRoutes.swapDetails);\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';\n\nimport { i18n } from '@lingui/core';\nimport {\n getCurrentBlockchainOfOrNull,\n getCurrentStep,\n getRelatedWalletOrNull,\n PendingSwapNetworkStatus,\n} from '@rango-dev/queue-manager-rango-preset';\nimport {\n Button,\n CopyIcon,\n Divider,\n IconButton,\n RouteCost,\n RouteSummary,\n StepDetails,\n Typography,\n useCopyToClipboard,\n} from '@rango-dev/ui';\nimport { useWallets } from '@rango-dev/wallets-react';\nimport React, { useEffect, useRef, useState } from 'react';\nimport { useNavigate } from 'react-router-dom';\n\nimport { navigationRoutes } from '../../constants/navigationRoutes';\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 { useNavigateBack } from '../../hooks/useNavigateBack';\nimport { useBestRouteStore } from '../../store/bestRoute';\nimport { useMetaStore } from '../../store/meta';\nimport { useNotificationStore } from '../../store/notification';\nimport { numberToString } from '../../utils/numbers';\nimport { getPriceImpactLevel } from '../../utils/routing';\nimport {\n getLastConvertedTokenInFailedSwap,\n getPercentageChange,\n getSwapMessages,\n shouldRetrySwap,\n} from '../../utils/swap';\nimport { getSwapDate } from '../../utils/time';\nimport { getConciseAddress, getUsdPrice } from '../../utils/wallets';\nimport { SuffixContainer } from '../HeaderButtons/HeaderButtons.styles';\nimport { Layout } from '../Layout';\nimport {\n SwapDetailsCompleteModal,\n SwapDetailsModal,\n} from '../SwapDetailsModal';\n\nimport {\n getSteps,\n getStepState,\n RESET_INTERVAL,\n SECONDS,\n} from './SwapDetails.helpers';\nimport { Container, HeaderDetails, StepsList } from './SwapDetails.styles';\n\nexport function SwapDetails(props: SwapDetailsProps) {\n const { swap, requestId, onDelete, onCancel: onCancelProps } = props;\n const { canSwitchNetworkTo, connect, getWalletInfo } = useWallets();\n const retry = useBestRouteStore.use.retry();\n const navigate = useNavigate();\n const { navigateBackFrom } = useNavigateBack();\n const [_, handleCopy] = useCopyToClipboard(RESET_INTERVAL);\n const listRef = useRef<HTMLDivElement | null>(null);\n const [modalState, setModalState] = useState<ModalState>(null);\n const [showCompletedModal, setShowCompletedModal] = useState<\n 'success' | 'failed' | null\n >(null);\n const {\n meta: { tokens },\n } = useMetaStore();\n\n const onCancel = () => {\n onCancelProps();\n setModalState(null);\n };\n\n const getUnreadNotifications =\n useNotificationStore.use.getUnreadNotifications();\n const setAsRead = useNotificationStore.use.setAsRead();\n const unreadNotifications = getUnreadNotifications();\n const currentStep = getCurrentStep(swap);\n const currentStepNetworkStatus = currentStep?.networkStatus;\n\n useEffect(() => {\n const existNotification = unreadNotifications.find(\n (n) => n.requestId === swap.requestId\n );\n if (existNotification) {\n if (swap.status === 'success' || swap.status === 'failed') {\n setShowCompletedModal(swap.status);\n setAsRead(swap.requestId);\n }\n }\n }, [swap.status]);\n\n useEffect(() => {\n if (showSwitchNetwork) {\n setModalState(PendingSwapNetworkStatus.WaitingForNetworkChange);\n } else if (\n currentStepNetworkStatus ===\n PendingSwapNetworkStatus.WaitingForConnectingWallet ||\n currentStepNetworkStatus === PendingSwapNetworkStatus.NetworkChanged\n ) {\n setModalState(currentStepNetworkStatus);\n } else {\n setModalState(null);\n }\n }, [currentStepNetworkStatus]);\n\n const lastConvertedTokenInFailedSwap =\n getLastConvertedTokenInFailedSwap(swap);\n\n const currentStepBlockchain = currentStep\n ? getCurrentBlockchainOfOrNull(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 isMobileWallet = (walletType: string): boolean =>\n !!getWalletInfo(walletType)?.mobileWallet;\n\n const showSwitchNetwork =\n currentStepNetworkStatus ===\n PendingSwapNetworkStatus.WaitingForNetworkChange &&\n !!currentStepBlockchain &&\n !!currentStepWallet?.walletType &&\n (isMobileWallet(currentStepWallet.walletType) ||\n canSwitchNetworkTo(currentStepWallet.walletType, currentStepBlockchain));\n\n const switchNetwork = showSwitchNetwork\n ? connect.bind(null, currentStepWallet.walletType, currentStepBlockchain)\n : undefined;\n\n const stepMessage = getSwapMessages(swap, currentStep);\n const steps = getSteps({\n swap,\n switchNetwork,\n showNetworkModal: currentStepNetworkStatus,\n setNetworkModal: setModalState,\n message: stepMessage,\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 totalTime = swap.steps.reduce(\n (totalTime, step) => totalTime + (step.estimatedTimeInSeconds || 0),\n 0\n );\n\n const minutes = Math.floor(totalTime / SECONDS);\n\n const diagnosisUrl = swap.steps.find(\n (step) => step.diagnosisUrl\n )?.diagnosisUrl;\n\n const outputUsdValue = numberToString(\n String(\n parseFloat(\n numberToString(\n outputAmount,\n TOKEN_AMOUNT_MIN_DECIMALS,\n TOKEN_AMOUNT_MAX_DECIMALS\n )\n ) *\n (getUsdPrice(\n lastStep.toBlockchain,\n lastStep.toSymbol,\n lastStep.toSymbolAddress,\n tokens\n ) || 0)\n ),\n USD_VALUE_MIN_DECIMALS,\n USD_VALUE_MAX_DECIMALS\n );\n\n const inputUsdValue = numberToString(\n String(\n parseFloat(swap.inputAmount) *\n (getUsdPrice(\n firstStep.fromBlockchain,\n firstStep.fromSymbol,\n firstStep.fromSymbolAddress,\n tokens\n ) || 0)\n ),\n USD_VALUE_MIN_DECIMALS,\n USD_VALUE_MAX_DECIMALS\n );\n\n const percentageChange = getPercentageChange(inputUsdValue, outputUsdValue);\n\n const completeModalDesc =\n swap.status === 'success'\n ? `You have received ${numberToString(\n outputAmount,\n TOKEN_AMOUNT_MIN_DECIMALS,\n TOKEN_AMOUNT_MAX_DECIMALS\n )} ${\n steps[numberOfSteps - 1].to.token.displayName\n } in ${getConciseAddress(\n swap.wallets[steps[numberOfSteps - 1].to.chain.displayName]\n ?.address || ''\n )} wallet on ${steps[numberOfSteps - 1].to.chain.displayName} chain.`\n : `${i18n.t('Transaction was not sent.')} ${\n lastConvertedTokenInFailedSwap\n ? `${lastConvertedTokenInFailedSwap.outputAmount} ${lastConvertedTokenInFailedSwap.symbol} on ${lastConvertedTokenInFailedSwap.blockchain} remain in your wallet`\n : ''\n }`;\n\n return (\n <Layout\n noPadding\n header={{\n title: i18n.t('Swap and Bridge'),\n onBack: navigateBackFrom.bind(null, navigationRoutes.swapDetails),\n onCancel:\n swap.status === 'running' ? () => setModalState('cancel') : undefined,\n suffix: swap.status !== 'running' && (\n <SuffixContainer>\n <Button\n variant=\"ghost\"\n type=\"error\"\n size=\"xsmall\"\n onClick={() => setModalState('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 variant=\"contained\"\n type=\"primary\"\n size=\"large\"\n onClick={() => {\n retry(swap);\n setTimeout(() => {\n navigate(navigationRoutes.home);\n }, 0);\n }}>\n {i18n.t('Try again')}\n </Button>\n )\n }>\n <Container>\n <HeaderDetails>\n <div className=\"row\">\n <Typography variant=\"label\" size=\"large\" color=\"neutral900\">\n {`${i18n.t('Request ID')}:`}\n </Typography>\n <div className=\"request-id\">\n <Typography variant=\"label\" size=\"small\" color=\"neutral900\">\n {requestId}\n </Typography>\n <IconButton\n variant=\"ghost\"\n onClick={handleCopy.bind(null, requestId || '')}>\n <CopyIcon size={16} color=\"gray\" />\n </IconButton>\n </div>\n </div>\n <div className=\"row\">\n <Typography variant=\"label\" size=\"large\" color=\"neutral900\">\n {`${i18n.t('Created at')}:`}\n </Typography>\n <Typography variant=\"label\" size=\"small\" color=\"neutral900\">\n {swapDate}\n </Typography>\n </div>\n </HeaderDetails>\n\n <div className=\"output\">\n <RouteCost\n fee={numberToString(\n String(totalFee),\n GAS_FEE_MIN_DECIMALS,\n GAS_FEE_MAX_DECIMALS\n )}\n time={minutes}\n steps={numberOfSteps}\n />\n <RouteSummary\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 },\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 },\n token: {\n displayName: 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: 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(\n percentageChange?.toNumber() ?? 0\n )}\n />\n </div>\n <div className=\"title-steps\">\n <Typography variant=\"title\" size=\"small\">\n {i18n.t('Swaps steps')}\n </Typography>\n </div>\n <Divider size={8} />\n <StepsList ref={listRef}>\n {steps.map((step, index) => {\n const key = index;\n const state = 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 key={key}\n step={step}\n type=\"route-progress\"\n ref={listRef}\n state={state}\n hasSeparator={index !== 0}\n tabIndex={key}\n isFocused={isFocused}\n />\n );\n })}\n </StepsList>\n </Container>\n\n <SwapDetailsModal\n state={modalState}\n onClose={() => setModalState(null)}\n onCancel={onCancel}\n onDelete={onDelete}\n message={stepMessage.detailedMessage.content}\n currentStepWallet={currentStepWallet}\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 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 { PendingSwap } from '@rango-dev/queue-manager-rango-preset';\n\nexport function timeSince(timeMillis: number): string {\n const seconds = Math.floor((new Date().getTime() - timeMillis) / 1000);\n let intervalType: string;\n\n let interval = Math.floor(seconds / 31536000);\n if (interval >= 1) {\n intervalType = 'year';\n } else {\n interval = Math.floor(seconds / 2592000);\n if (interval >= 1) {\n intervalType = 'month';\n } else {\n interval = Math.floor(seconds / 86400);\n if (interval >= 1) {\n intervalType = 'day';\n } else {\n interval = Math.floor(seconds / 3600);\n if (interval >= 1) {\n intervalType = 'hour';\n } else {\n interval = Math.floor(seconds / 60);\n if (interval >= 1) {\n intervalType = 'minute';\n } else {\n interval = seconds;\n intervalType = 'second';\n }\n }\n }\n }\n }\n\n if (interval > 1 || interval === 0) {\n intervalType += 's';\n }\n\n return interval + ' ' + intervalType;\n}\n\nexport function getSwapDate(pendingSwap: PendingSwap) {\n return pendingSwap.finishTime\n ? `${timeSince(parseInt(pendingSwap.finishTime))} ago`\n : `${timeSince(parseInt(pendingSwap.creationTime))} ago`;\n}\n", "import type { ModalPropTypes } from './SwapDetailsModal.types';\n\nimport { PendingSwapNetworkStatus } from '@rango-dev/queue-manager-rango-preset';\nimport { Modal } from '@rango-dev/ui';\nimport React from 'react';\n\nimport { CancelContent } from './SwapDetailsModal.Cancel';\nimport { DeleteContent } from './SwapDetailsModal.Delete';\nimport { modalNetworkValues } from './SwapDetailsModal.helpers';\nimport { WalletStateContent } from './SwapDetailsModal.WalletState';\n\nexport function SwapDetailsModal(props: ModalPropTypes) {\n const { state, onClose, onDelete, onCancel, currentStepWallet, message } =\n props;\n\n const showWalletStateContent =\n state === PendingSwapNetworkStatus.WaitingForNetworkChange ||\n state === PendingSwapNetworkStatus.WaitingForConnectingWallet ||\n state === PendingSwapNetworkStatus.NetworkChanged;\n\n return (\n <Modal\n open={!!state}\n onClose={onClose}\n container={document.getElementById('swap-box') || document.body}>\n {showWalletStateContent && (\n <WalletStateContent\n type={modalNetworkValues[state].type}\n title={modalNetworkValues[state].title}\n currentStepWallet={currentStepWallet}\n message={message}\n showWalletButton={\n state !== PendingSwapNetworkStatus.WaitingForNetworkChange\n }\n />\n )}\n {state === 'delete' && (\n <DeleteContent onClose={onClose} onDelete={onDelete} />\n )}\n {state === 'cancel' && (\n <CancelContent onClose={onClose} onCancel={onCancel} />\n )}\n </Modal>\n );\n}\n", "import type { CancelContentProps } 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 CancelContent = ({ onCancel, onClose }: CancelContentProps) => {\n return (\n <>\n <Divider size={20} />\n <MessageBox\n type=\"error\"\n title={i18n.t('Transaction Cancel')}\n description={i18n.t('Are you sure you want to Cancel this swap?')}\n />\n <Divider size={32} />\n <Button\n variant=\"contained\"\n type=\"primary\"\n size=\"large\"\n onClick={onCancel}>\n <Typography variant=\"title\" size=\"medium\" color=\"neutral100\">\n {i18n.t('Yes, Cancel it')}\n </Typography>\n </Button>\n <Divider size={12} />\n <Button variant=\"outlined\" type=\"primary\" size=\"large\" onClick={onClose}>\n <Typography variant=\"title\" size=\"medium\" color=\"primary\">\n {i18n.t('No, Continue')}\n </Typography>\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 variant=\"contained\"\n type=\"primary\"\n size=\"large\"\n onClick={onDelete}>\n <Typography variant=\"title\" size=\"medium\" color=\"neutral100\">\n {i18n.t('Yes, Delete it')}\n </Typography>\n </Button>\n <Divider size={12} />\n <Button variant=\"outlined\" type=\"primary\" size=\"large\" 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 { ModalNetworkValueTypes } from './SwapDetailsModal.types';\n\nimport { i18n } from '@lingui/core';\nimport { PendingSwapNetworkStatus } from '@rango-dev/queue-manager-rango-preset';\n\nexport const modalNetworkValues: Record<\n Exclude<PendingSwapNetworkStatus, PendingSwapNetworkStatus.WaitingForQueue>,\n ModalNetworkValueTypes\n> = {\n [PendingSwapNetworkStatus.WaitingForNetworkChange]: {\n type: 'loading',\n title: i18n.t('Change Network'),\n },\n [PendingSwapNetworkStatus.WaitingForConnectingWallet]: {\n type: 'warning',\n title: i18n.t('Connect Wallet'),\n },\n [PendingSwapNetworkStatus.NetworkChanged]: {\n type: 'success',\n title: i18n.t('Network Changed'),\n },\n};\n", "import type { WalletStateContentProps } from './SwapDetailsModal.types';\n\nimport { MessageBox, Wallet, WalletState } from '@rango-dev/ui';\nimport { useWallets } from '@rango-dev/wallets-react';\nimport React from 'react';\n\nimport { WalletContainer } from './SwapDetailsModal.styles';\n\nexport const WalletStateContent = (props: WalletStateContentProps) => {\n const { type, title, currentStepWallet, message, showWalletButton } = props;\n const { connect, getWalletInfo, state: walletState } = useWallets();\n const walletType = currentStepWallet?.walletType;\n const isConnected = walletType && walletState(walletType).connected;\n const state = isConnected ? WalletState.CONNECTED : WalletState.DISCONNECTED;\n return (\n <>\n <MessageBox type={type} title={title} description={message} />\n {showWalletButton && walletType && (\n <WalletContainer>\n <Wallet\n title={getWalletInfo(walletType).name}\n image={getWalletInfo(walletType).img}\n type={walletType}\n state={state}\n onClick={async () => connect(walletType)}\n />\n </WalletContainer>\n )}\n </>\n );\n};\n", "import { styled } from '@rango-dev/ui';\n\nexport const WalletContainer = styled('div', {\n display: 'flex',\n justifyContent: 'center',\n});\n", "import type { CompleteModalPropTypes } from './SwapDetailsModal.types';\n\nimport { i18n } from '@lingui/core';\nimport {\n Button,\n Divider,\n MessageBox,\n Modal,\n TokenAmount,\n Typography,\n} from '@rango-dev/ui';\nimport React from 'react';\nimport { useNavigate } from 'react-router-dom';\n\nimport { navigationRoutes } from '../../constants/navigationRoutes';\n\nexport function SwapDetailsCompleteModal(props: CompleteModalPropTypes) {\n const {\n open,\n onClose,\n status,\n priceValue,\n usdValue,\n token,\n chain,\n percentageChange,\n description,\n diagnosisUrl,\n } = props;\n const navigate = useNavigate();\n\n return (\n <Modal\n open={open}\n onClose={onClose}\n container={document.getElementById('swap-box') || document.body}>\n {status === 'success' ? (\n <MessageBox type=\"success\" title={i18n.t('Swap Successful')}>\n <TokenAmount\n direction=\"vertical\"\n type=\"output\"\n centerAlign={true}\n price={{\n value: priceValue,\n usdValue,\n }}\n token={token}\n chain={chain}\n percentageChange={percentageChange}\n />\n <Divider size={12} />\n <Typography\n variant=\"body\"\n size=\"medium\"\n color=\"neutral900\"\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={32} />\n {status === 'success' && (\n <Button\n variant=\"contained\"\n type=\"primary\"\n size=\"large\"\n onClick={() => navigate(navigationRoutes.home)}>\n <Typography variant=\"title\" size=\"medium\" color=\"neutral100\">\n {i18n.t('Done')}\n </Typography>\n </Button>\n )}\n <Divider size={12} />\n {diagnosisUrl && (\n <>\n <Button\n variant=\"contained\"\n type=\"primary\"\n size=\"large\"\n onClick={() => window.open(diagnosisUrl, '_blank')}>\n <Typography variant=\"title\" size=\"medium\" color=\"primary\">\n {i18n.t('Diagnosis')}\n </Typography>\n </Button>\n <Divider size={12} />\n </>\n )}\n <Button variant=\"outlined\" type=\"primary\" size=\"large\" onClick={onClose}>\n <Typography variant=\"title\" size=\"medium\" color=\"primary\">\n {i18n.t('See Details')}\n </Typography>\n </Button>\n </Modal>\n );\n}\n", "import type { GetStep } from '../SwapDetailsAlerts';\nimport type { PendingSwapStep } from '@rango-dev/queue-manager-rango-preset';\nimport type { Step, StepDetailsProps } from '@rango-dev/ui';\n\nimport React from 'react';\n\nimport {\n TOKEN_AMOUNT_MAX_DECIMALS,\n TOKEN_AMOUNT_MIN_DECIMALS,\n} from '../../constants/routing';\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 = ({ swap, ...args }: GetStep): Step[] => {\n const hasAlreadyProceededToSign = swap.hasAlreadyProceededToSign !== false;\n return swap.steps.map((step, index) => {\n const amountToConvert =\n index === 0 ? swap.inputAmount : swap.steps[index - 1].outputAmount;\n return {\n from: {\n token: { displayName: step.fromSymbol, image: step.fromLogo || '' },\n chain: {\n displayName: step.fromBlockchain,\n image: step.fromBlockchainLogo || '',\n },\n price: {\n value: numberToString(\n amountToConvert,\n TOKEN_AMOUNT_MIN_DECIMALS,\n TOKEN_AMOUNT_MAX_DECIMALS\n ),\n },\n },\n to: {\n token: { displayName: step.toSymbol, image: step.toLogo },\n chain: {\n displayName: step.toBlockchain,\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 },\n },\n swapper: { displayName: step.swapperId, image: step.swapperLogo || '' },\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 switchNetwork,\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 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 = (lastUrl && inProgress) || waitingForApproval;\n const error = lastUrl && step.status === 'failed';\n\n return (\n <Fragment key={key}>\n <Alert\n type={(loading && 'loading') || (error && 'error') || 'success'}\n title={\n !explorerUrl.description\n ? i18n.t('View transaction')\n : `${explorerUrl.description} Tx`\n }\n action={\n explorerUrl.url && (\n <IconButton\n variant=\"ghost\"\n size=\"xsmall\"\n onClick={() => window.open(explorerUrl.url, '_blank')}>\n <LinkIcon size={16} />\n </IconButton>\n )\n }\n />\n </Fragment>\n );\n })}\n {((inProgress && !hasAlreadyProceededToSign) ||\n (waitingForApproval && !step.explorerUrl?.length)) && (\n <Alert type=\"loading\" title={message.shortMessage} />\n )}\n {step.status !== 'failed' && hasWarning && (\n <WarningAlert\n switchNetwork={switchNetwork}\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 {\n Alert,\n ChevronDownIcon,\n ChevronUpIcon,\n IconButton,\n} from '@rango-dev/ui';\nimport React, { useState } from 'react';\n\nexport function FailedAlert(props: FailedAlertsProps) {\n const { message } = props;\n const [showContentError, setShowContentError] = useState(false);\n\n return (\n <Alert\n type=\"error\"\n title={message.shortMessage}\n action={\n message.detailedMessage.content && (\n <IconButton\n onClick={() => setShowContentError((prev) => !prev)}\n variant=\"ghost\"\n size=\"xsmall\">\n {showContentError ? (\n <ChevronUpIcon size={12} color=\"gray\" />\n ) : (\n <ChevronDownIcon size={12} color=\"gray\" />\n )}\n </IconButton>\n )\n }\n footer={showContentError ? message.detailedMessage.content : undefined}\n />\n );\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", "import type { WaningAlertsProps } from './SwapDetailsAlerts.types';\n\nimport { i18n } from '@lingui/core';\nimport { PendingSwapNetworkStatus } from '@rango-dev/queue-manager-rango-preset';\nimport { Alert, Button } from '@rango-dev/ui';\nimport React from 'react';\n\nexport function WarningAlert(props: WaningAlertsProps) {\n const { switchNetwork, setNetworkModal, message, showNetworkModal } = props;\n if (!!switchNetwork) {\n return (\n <Alert\n type=\"warning\"\n title={message.shortMessage}\n action={\n <Button\n size=\"xxsmall\"\n type=\"warning\"\n onClick={() => {\n setNetworkModal(PendingSwapNetworkStatus.WaitingForNetworkChange);\n switchNetwork().catch((e) => {\n console.log(e);\n });\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 action={\n <Button\n size=\"xxsmall\"\n type=\"warning\"\n onClick={() => {\n setNetworkModal(\n PendingSwapNetworkStatus.WaitingForConnectingWallet\n );\n }}>\n {i18n.t('Connect')}\n </Button>\n }\n />\n );\n }\n\n return <Alert type=\"warning\" title={message.shortMessage} />;\n}\n", "import { styled } from '@rango-dev/ui';\n\nexport const Container = styled('div', {\n display: 'flex',\n width: '100%',\n flexDirection: 'column',\n alignItems: 'center',\n height: '0',\n flexGrow: 1,\n '& .row': {\n display: 'flex',\n width: '100%',\n justifyContent: 'space-between',\n alignItems: 'center',\n padding: '$10 $5',\n borderBottom: '1px solid $neutral300',\n color: '$neutral500',\n },\n '& .request-id': {\n display: 'flex',\n justifyContent: 'center',\n alignItems: 'center',\n height: '$24',\n },\n '& .output': {\n display: 'flex',\n width: '100%',\n padding: '$15 $20 $20',\n flexDirection: 'column',\n alignItems: 'start',\n },\n '& .title-steps': {\n textAlign: 'left',\n width: '100%',\n padding: '0 $20 $10',\n },\n});\n\nexport const HeaderDetails = styled('div', {\n width: '100%',\n padding: '0px 15px',\n});\n\nexport const StepsList = styled('div', {\n padding: '$0 $20 $20 $20',\n width: '100%',\n overflow: 'auto',\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 textAlign: '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", "import type { SwapDetailsPlaceholderPropTypes } from './SwapDetails.types';\n\nimport { i18n } from '@lingui/core';\nimport {\n CopyIcon,\n IconButton,\n NotFound,\n Skeleton,\n Typography,\n} from '@rango-dev/ui';\nimport React from 'react';\n\nimport { navigationRoutes } from '../../constants/navigationRoutes';\nimport { useNavigateBack } from '../../hooks/useNavigateBack';\nimport { SuffixContainer } from '../HeaderButtons/HeaderButtons.styles';\nimport { Layout } from '../Layout';\nimport { LoadingSwapDetails } from '../LoadingSwapDetails';\n\nimport {\n Container,\n HeaderDetails,\n PlaceholderContainer,\n} from './SwapDetails.styles';\n\nexport function SwapDetailsPlaceholder(props: SwapDetailsPlaceholderPropTypes) {\n const { requestId, showSkeleton } = props;\n const { navigateBackFrom } = useNavigateBack();\n\n return (\n <Layout\n noPadding\n header={{\n title: i18n.t('Swap and Bridge'),\n onBack: navigateBackFrom.bind(null, navigationRoutes.swapDetails),\n suffix: <SuffixContainer />,\n }}>\n {showSkeleton && (\n <Container>\n <HeaderDetails>\n <div className=\"row\">\n <Typography variant=\"label\" size=\"large\" color=\"neutral900\">\n {`${i18n.t('Request ID')}:`}\n </Typography>\n <div className=\"request-id\">\n <Typography variant=\"label\" size=\"small\" color=\"neutral900\">\n <Skeleton width={60} height={10} variant=\"rounded\" />\n </Typography>\n <IconButton variant=\"ghost\">\n <CopyIcon size={16} color=\"gray\" />\n </IconButton>\n </div>\n </div>\n <div className=\"row\">\n <Typography variant=\"label\" size=\"large\" color=\"neutral900\">\n {`${i18n.t('Created at')}:`}\n </Typography>\n <Typography variant=\"label\" size=\"small\" color=\"neutral900\">\n <Skeleton width={60} height={10} variant=\"rounded\" />\n </Typography>\n </div>\n </HeaderDetails>\n <LoadingSwapDetails />\n </Container>\n )}\n {!showSkeleton && (\n <PlaceholderContainer>\n <NotFound\n title={i18n.t('Not found')}\n description={i18n.t(\n 'swapNotFound',\n { requestId },\n { message: 'Swap with request ID = ${requestId} not found.' }\n )}\n />\n </PlaceholderContainer>\n )}\n </Layout>\n );\n}\n", "import { i18n } from '@lingui/core';\nimport { ChainToken, Divider, Skeleton, Typography } from '@rango-dev/ui';\nimport React from 'react';\n\nimport { Container, StepSeparator } from './LoadingSwapDetails.styles';\nimport { LoadingSwapDetailStep } from './LoadingSwapDetailStep';\n\nexport function LoadingSwapDetails() {\n const routeSummary = (\n <div className=\"route-summary-item\">\n <div className=\"token-amount\">\n <ChainToken loading size=\"medium\" chainImage=\"\" tokenImage=\"\" />\n <Divider size={8} direction=\"horizontal\" />\n <Skeleton height={15} width={148} variant=\"rounded\" />\n </div>\n <Skeleton height={12} width={64} variant=\"rounded\" />\n </div>\n );\n\n return (\n <Container>\n <div className=\"cost\">\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 </div>\n\n <div className=\"route-summary\">\n {routeSummary}\n <div className=\"route-summary-separator\"></div>\n {routeSummary}\n </div>\n\n <div className=\"swaps-steps\">\n <Typography variant=\"title\" size=\"small\">\n {i18n.t('Swaps steps')}\n </Typography>\n </div>\n\n <div className=\"step-container\">\n <LoadingSwapDetailStep extraInfo />\n <StepSeparator />\n <LoadingSwapDetailStep />\n <StepSeparator />\n <LoadingSwapDetailStep />\n <StepSeparator />\n <LoadingSwapDetailStep />\n </div>\n </Container>\n );\n}\n", "import { styled } from '@rango-dev/ui';\n\nexport const Container = styled('div', {\n width: '100%',\n height: '100%',\n padding: '$0 $20',\n\n '.cost': {\n paddingTop: '$15',\n display: 'flex',\n },\n\n '.route-summary': {\n padding: '$15 $0',\n },\n\n '.route-summary-item': {\n display: 'flex',\n justifyContent: 'space-between',\n alignItems: 'center',\n },\n\n '.token-amount': {\n display: 'flex',\n justifyContent: 'space-between',\n alignItems: 'center',\n },\n\n '.route-summary-separator': {\n width: '0px',\n height: '$16',\n borderLeft: '1px solid $neutral400',\n marginLeft: '13px',\n },\n\n '.swaps-steps': {\n paddingBottom: '$10',\n },\n});\n\nexport const StepContainer = styled('div', {\n backgroundColor: '$neutral100',\n borderRadius: '$xm',\n padding: '$10 $15',\n\n '.step-title': {\n display: 'flex',\n justifyContent: 'start',\n alignItems: 'center',\n },\n '.step-tokens': {\n paddingTop: '$5',\n display: 'flex',\n alignItems: 'center',\n },\n '.step-token-info': {\n display: 'flex',\n alignItems: 'center',\n },\n '.step-icon-container': {\n padding: '$4 $6',\n display: 'flex',\n justifyContent: 'center',\n alignItems: 'center',\n },\n\n '.extra-info': {\n display: 'flex',\n paddingTop: '$10',\n paddingBottom: '$5',\n },\n});\nexport const StepSeparator = styled('div', {\n width: '0px',\n height: '$20',\n borderLeft: '1px dashed $neutral900',\n marginLeft: '25px',\n});\n", "import type { StepSkeletonPropsTypes } from './LoadingSwapDetails.types';\n\nimport { ChainToken, Divider, NextIcon, Skeleton } from '@rango-dev/ui';\nimport React from 'react';\n\nimport { StepContainer } from './LoadingSwapDetails.styles';\n\nexport function LoadingSwapDetailStep(props: StepSkeletonPropsTypes) {\n const { extraInfo } = props;\n return (\n <StepContainer>\n <div className=\"step-title\">\n <Skeleton height={28} width={28} variant=\"circular\" />\n <Divider direction=\"horizontal\" size={8} />\n <Skeleton height={15} width={148} variant=\"rounded\" />\n </div>\n <div className=\"step-tokens\">\n <Divider direction=\"horizontal\" size={20} />\n <div className=\"step-token-info\">\n <ChainToken size=\"small\" loading chainImage=\"\" tokenImage=\"\" />\n <Divider direction=\"horizontal\" size={8} />\n <Skeleton height={12} width={76} variant=\"rounded\" />\n </div>\n <div className=\"step-icon-container\">\n <NextIcon color=\"gray\" size={16} />\n </div>\n <div className=\"step-token-info\">\n <ChainToken size=\"small\" loading chainImage=\"\" tokenImage=\"\" />\n <Divider direction=\"horizontal\" size={8} />\n <Skeleton height={12} width={76} variant=\"rounded\" />\n </div>\n </div>\n {extraInfo && (\n <div className=\"extra-info\">\n <Divider direction=\"horizontal\" size={20} />\n <Skeleton height={22} width={297} variant=\"rectangular\" />\n </div>\n )}\n </StepContainer>\n );\n}\n", "import { i18n } from '@lingui/core';\nimport {\n AutoThemeIcon,\n DarkModeIcon,\n LightModeIcon,\n List,\n ListItemButton,\n Radio,\n RadioRoot,\n Typography,\n} from '@rango-dev/ui';\nimport React from 'react';\n\nimport { Layout } from '../components/Layout';\nimport { SettingsContainer } from '../components/SettingsContainer';\nimport { navigationRoutes } from '../constants/navigationRoutes';\nimport { useNavigateBack } from '../hooks/useNavigateBack';\nimport { useSettingsStore } from '../store/settings';\n\ntype Theme = 'dark' | 'light' | 'auto';\n\nenum Mode {\n DARK = 'dark',\n LIGHT = 'light',\n AUTO = 'auto',\n}\n\nexport function ThemePage() {\n const { navigateBackFrom } = useNavigateBack();\n const theme = useSettingsStore.use.theme();\n const setTheme = useSettingsStore.use.setTheme();\n\n const themesList = [\n {\n id: Mode.LIGHT,\n value: Mode.LIGHT,\n title: (\n <Typography variant=\"title\" size=\"xmedium\">\n {i18n.t('Light')}\n </Typography>\n ),\n onClick: () => setTheme(Mode.LIGHT as Theme),\n start: <LightModeIcon color=\"gray\" />,\n end: <Radio value={Mode.LIGHT} />,\n },\n {\n id: Mode.DARK,\n value: Mode.DARK,\n title: (\n <Typography variant=\"title\" size=\"xmedium\">\n {i18n.t('Dark')}\n </Typography>\n ),\n onClick: () => setTheme(Mode.DARK as Theme),\n start: <DarkModeIcon color=\"gray\" />,\n end: <Radio value={Mode.DARK} />,\n },\n {\n id: Mode.AUTO,\n value: Mode.AUTO,\n title: (\n <Typography variant=\"title\" size=\"xmedium\">\n {i18n.t('Auto')}\n </Typography>\n ),\n onClick: () => setTheme(Mode.AUTO as Theme),\n start: <AutoThemeIcon color=\"gray\" />,\n end: <Radio value={Mode.AUTO} />,\n },\n ];\n\n return (\n <Layout\n header={{\n onBack: navigateBackFrom.bind(null, navigationRoutes.settings),\n title: i18n.t('Theme'),\n }}>\n <SettingsContainer>\n <RadioRoot\n onValueChange={(value) => setTheme(value as Theme)}\n value={theme}>\n <List\n type={\n <ListItemButton\n title=\"Theme\"\n id=\"_\"\n onClick={() => console.log()}\n />\n }\n items={themesList}\n />\n </RadioRoot>\n </SettingsContainer>\n </Layout>\n );\n}\n", "import {\n isApprovalTX,\n MainEvents,\n RouteEventType,\n StepEventType,\n StepExecutionEventStatus,\n useEvents,\n} from '@rango-dev/queue-manager-rango-preset';\nimport { useEffect } from 'react';\n\nimport { useNotificationStore } from '../store/notification';\nimport { useWalletsStore } from '../store/wallets';\nimport { validBlockedStatuses } from '../types/notification';\n\nexport function WidgetEvents() {\n const connectedWallets = useWalletsStore.use.connectedWallets();\n const getWalletsDetails = useWalletsStore.use.getWalletsDetails();\n const setNotification = useNotificationStore.use.setNotification();\n const setAsRead = useNotificationStore.use.setAsRead();\n const widgetEvents = useEvents();\n\n useEffect(() => {\n widgetEvents.on(MainEvents.StepEvent, (widgetEvent) => {\n const { event, step, route } = widgetEvent;\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 fromAccount = connectedWallets.find(\n (account) => account.chain === step?.fromBlockchain\n );\n const toAccount =\n step?.fromBlockchain !== step?.toBlockchain &&\n connectedWallets.find(\n (wallet) => wallet.chain === step?.toBlockchain\n );\n\n fromAccount && getWalletsDetails([fromAccount]);\n toAccount && getWalletsDetails([toAccount]);\n }\n if (\n (event.type === StepEventType.TX_EXECUTION_BLOCKED &&\n validBlockedStatuses.includes(event.status)) ||\n event.type === StepEventType.FAILED\n ) {\n setNotification(event, route);\n } else if (\n event.type === StepEventType.TX_EXECUTION ||\n event.type === StepEventType.CHECK_STATUS\n ) {\n setAsRead(route.requestId);\n }\n });\n\n return () => widgetEvents.all.clear();\n }, [widgetEvents, connectedWallets.length]);\n\n useEffect(() => {\n widgetEvents.on(MainEvents.RouteEvent, (widgetEvent) => {\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\n return () => widgetEvents.all.clear();\n }, [widgetEvents, connectedWallets.length]);\n\n return null;\n}\n", "import {\n type Route,\n type RouteEvent,\n type Step,\n type StepEvent,\n StepExecutionBlockedEventStatus,\n} from '@rango-dev/queue-manager-rango-preset';\n\ntype NotificationRoute = {\n from: {\n blockchain: Step['fromBlockchain'];\n tokenSymbol: Step['fromSymbol'];\n tokenAddress: Step['fromSymbolAddress'];\n };\n to: {\n blockchain: Step['toBlockchain'];\n tokenSymbol: Step['toSymbol'];\n tokenAddress: Step['toSymbolAddress'];\n };\n};\n\nexport type Notification = Pick<Route, 'requestId'> & {\n event: RouteEvent | StepEvent;\n creationTime: number;\n read: boolean;\n route: NotificationRoute;\n};\n\nexport const validBlockedStatuses: StepExecutionBlockedEventStatus[] = [\n StepExecutionBlockedEventStatus.WAITING_FOR_CHANGE_WALLET_ACCOUNT,\n StepExecutionBlockedEventStatus.WAITING_FOR_NETWORK_CHANGE,\n StepExecutionBlockedEventStatus.WAITING_FOR_WALLET_CONNECT,\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 \"url('https://fonts.cdnfonts.com/css/times-new-roman')\",\n ],\n })();\n", "import type { WidgetTheme } from '../types';\n\nimport { createTheme, darkTheme, lightTheme } from '@rango-dev/ui';\nimport { useEffect, useState } from 'react';\n\nimport { useMetaStore } from '../store/meta';\nimport { useSettingsStore } from '../store/settings';\nimport {\n DEFAULT_PRIMARY_RADIUS,\n DEFAULT_SECONDARY_RADIUS,\n} from '../utils/configs';\n\nexport function useTheme({\n // colors,\n fontFamily = 'Roboto',\n borderRadius = DEFAULT_PRIMARY_RADIUS,\n secondaryBorderRadius = DEFAULT_SECONDARY_RADIUS,\n mode = 'auto',\n}: WidgetTheme) {\n const theme = useSettingsStore.use.theme();\n const fetchMeta = useMetaStore.use.fetchMeta();\n const setTheme = useSettingsStore.use.setTheme();\n\n const customTheme = createTheme({\n radii: {\n primary: `${borderRadius}px`,\n secondary: `${secondaryBorderRadius}px`,\n },\n fonts: {\n widget: fontFamily,\n },\n });\n\n const lightClassName = `${customTheme.className} ${lightTheme.className}`;\n const darkClassName = `${customTheme.className} ${darkTheme.className}`;\n\n const [OSTheme, setOSTheme] = useState('light');\n\n useEffect(() => {\n const fetchData = async () => {\n await fetchMeta();\n };\n void fetchData();\n\n const switchTheme = (event: MediaQueryListEvent) => {\n if (event.matches) {\n setOSTheme('dark');\n } else {\n setOSTheme('light');\n }\n };\n\n if (\n window.matchMedia &&\n window.matchMedia('(prefers-color-scheme: dark)').matches\n ) {\n setOSTheme('dark');\n }\n\n window\n .matchMedia('(prefers-color-scheme: dark)')\n .addEventListener('change', switchTheme);\n return () => {\n window\n .matchMedia('(prefers-color-scheme: dark)')\n .removeEventListener('change', switchTheme);\n };\n }, []);\n useEffect(() => {\n if (mode !== 'auto') {\n setTheme(mode);\n }\n }, [mode]);\n\n const getActiveTheme = () => {\n if (theme === 'auto') {\n return OSTheme === 'dark' ? darkClassName : lightClassName;\n }\n return theme === 'dark' ? darkClassName : lightClassName;\n };\n\n return { activeTheme: getActiveTheme() };\n}\n", "import React, { PropsWithChildren, useMemo } from 'react';\nimport { Provider as ManagerProvider } from '@rango-dev/queue-manager-react';\nimport {\n makeQueueDefinition,\n SwapQueueContext,\n checkWaitingForNetworkChange,\n} from '@rango-dev/queue-manager-rango-preset';\nimport { useWallets } from '@rango-dev/wallets-react';\nimport {\n convertEvmBlockchainMetaToEvmChainInfo,\n Network,\n WalletType,\n} from '@rango-dev/wallets-shared';\nimport { useMetaStore } from './store/meta';\nimport { useWalletsStore } from './store/wallets';\nimport { walletAndSupportedChainsNames } from './utils/wallets';\nimport { getConfig } from './utils/configs';\nimport { isEvmBlockchain } from 'rango-types';\n\nfunction QueueManager(props: PropsWithChildren) {\n const {\n providers,\n getSigners,\n state,\n connect,\n canSwitchNetworkTo,\n getWalletInfo,\n } = useWallets();\n\n const swapQueueDef = useMemo(() => {\n return makeQueueDefinition({\n API_KEY: getConfig('API_KEY'),\n });\n }, []);\n\n const { blockchains } = useMetaStore.use.meta();\n const connectedWallets = useWalletsStore.use.connectedWallets();\n\n const wallets = {\n blockchains: connectedWallets.map((wallet) => ({\n accounts: [wallet],\n name: wallet.chain,\n })),\n };\n\n const switchNetwork = (wallet: WalletType, network: Network) => {\n if (!canSwitchNetworkTo(wallet, network)) {\n return undefined;\n }\n return connect(wallet, network);\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 = blockchains\n .filter((blockchain) => blockchain.enabled)\n .reduce(\n (blockchainsObj: any, blockchain) => (\n (blockchainsObj[blockchain.name] = blockchain), blockchainsObj\n ),\n {}\n );\n const evmBasedChains = blockchains.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 //todo: remove Network type\n // eslint-disable-next-line @typescript-eslint/ban-ts-comment\n //@ts-ignore\n wallets,\n providers: allProviders,\n switchNetwork,\n canSwitchNetworkTo,\n connect,\n state,\n isMobileWallet,\n };\n\n return (\n <ManagerProvider\n queuesDefs={[swapQueueDef]}\n context={context}\n onPersistedDataLoaded={(manager) => {\n checkWaitingForNetworkChange(manager);\n }}\n isPaused={false}>\n {props.children}\n </ManagerProvider>\n );\n}\n\nexport default QueueManager;\n", "import type { WidgetConfig } from './types';\nimport type { ProvidersOptions } from './utils/providers';\nimport type { EventHandler } from '@rango-dev/wallets-react';\nimport type { Network } from '@rango-dev/wallets-shared';\nimport type { PropsWithChildren } from 'react';\n\nimport { Events, Provider } from '@rango-dev/wallets-react';\nimport { isEvmBlockchain } from 'rango-sdk';\nimport React, { createContext, useRef } from 'react';\n\nimport { useWalletProviders } from './hooks/useWalletProviders';\nimport { useMetaStore } from './store/meta';\nimport { useWalletsStore } from './store/wallets';\nimport {\n prepareAccountsForWalletStore,\n walletAndSupportedChainsNames,\n} from './utils/wallets';\n\ntype OnConnectHandler = (key: string) => void;\ninterface WidgetContextInterface {\n onConnectWallet(handler: OnConnectHandler): void;\n}\n\nexport const WidgetContext = createContext<WidgetContextInterface>({\n onConnectWallet: () => {\n return;\n },\n});\n\nexport function WidgetWallets(\n props: PropsWithChildren<{\n providers: WidgetConfig['wallets'];\n options?: ProvidersOptions;\n onUpdateState?: EventHandler;\n }>\n) {\n const { blockchains } = useMetaStore.use.meta();\n const { providers } = useWalletProviders(props.providers, props?.options);\n const disconnectWallet = useWalletsStore.use.disconnectWallet();\n const connectWallet = useWalletsStore.use.connectWallet();\n const onConnectWalletHandler = useRef<OnConnectHandler>();\n\n const evmBasedChainNames = blockchains\n .filter(isEvmBlockchain)\n .map((chain) => chain.name);\n\n const onUpdateState: EventHandler = (\n type,\n event,\n value,\n state,\n supportedBlockchains\n ) => {\n if (event === Events.ACCOUNTS) {\n if (value) {\n const supportedChainNames: Network[] | null =\n walletAndSupportedChainsNames(supportedBlockchains);\n const data = prepareAccountsForWalletStore(\n type,\n value,\n evmBasedChainNames,\n supportedChainNames\n );\n connectWallet(data);\n } else {\n disconnectWallet(type);\n }\n }\n if (event === Events.ACCOUNTS && state.connected) {\n const key = `${type}-${state.network}-${value}`;\n\n if (state.connected) {\n if (!!onConnectWalletHandler.current) {\n onConnectWalletHandler.current(key);\n } else {\n console.warn(\n `onConnectWallet handler hasn't been set. Are you sure?`\n );\n }\n }\n }\n\n if (event === Events.NETWORK && state.network) {\n const key = `${type}-${state.network}`;\n if (!!onConnectWalletHandler.current) {\n onConnectWalletHandler.current(key);\n } else {\n console.warn(`onConnectWallet handler hasn't been set. Are you sure?`);\n }\n }\n\n // propagate updates for Dapps using external wallets\n if (props.onUpdateState) {\n props.onUpdateState(type, event, value, state, supportedBlockchains);\n }\n };\n return (\n <WidgetContext.Provider\n // eslint-disable-next-line react/jsx-no-constructed-context-values\n value={{\n onConnectWallet: (handler) => {\n onConnectWalletHandler.current = handler;\n },\n }}>\n <Provider\n allBlockChains={blockchains}\n providers={providers}\n onUpdateState={onUpdateState}\n autoConnect>\n {props.children}\n </Provider>\n </WidgetContext.Provider>\n );\n}\n", "import { ProviderInterface } from '@rango-dev/wallets-react';\nimport { useEffect } from 'react';\nimport { useWalletsStore } from '../store/wallets';\nimport { WidgetConfig } from '../types';\nimport {\n matchAndGenerateProviders,\n ProvidersOptions,\n} from '../utils/providers';\n\nexport function useWalletProviders(\n providers: WidgetConfig['wallets'],\n options?: ProvidersOptions\n) {\n const clearConnectedWallet = useWalletsStore.use.clearConnectedWallet();\n let generateProviders: ProviderInterface[] = matchAndGenerateProviders(\n undefined,\n options\n );\n\n useEffect(() => {\n clearConnectedWallet();\n generateProviders = matchAndGenerateProviders(providers, {\n walletConnectProjectId: options?.walletConnectProjectId,\n });\n }, [providers]);\n\n return {\n providers: generateProviders,\n };\n}\n", "import {\n WidgetTheme,\n WidgetConfig,\n WidgetColors,\n BlockchainAndTokenConfig,\n} from './types';\nimport { WidgetProps, Widget } from './Widget';\nimport { WalletType } from '@rango-dev/wallets-shared';\nimport { WidgetWallets } from './Wallets';\nimport {\n useWallets,\n ProviderInterface,\n EventHandler as HandleWalletsUpdate,\n} from '@rango-dev/wallets-react';\nimport {\n useEvents as useWidgetEvents,\n MainEvents,\n RouteEvent,\n StepEvent,\n Route,\n Step,\n RouteStartedEvent,\n RouteSucceededEvent,\n RouteFailedEvent,\n RouteEventType,\n StepStartedEvent,\n StepSucceededEvent,\n StepFailedEvent,\n StepTxExecutionUpdatedEvent,\n StepTxExecutionBlockedEvent,\n StepCheckStatusEvent,\n StepApprovalTxSucceededEvent,\n StepOutputRevealedEvent,\n StepEventType,\n StepExecutionEventStatus,\n StepExecutionBlockedEventStatus,\n} from '@rango-dev/queue-manager-rango-preset';\n\nexport type {\n WidgetConfig,\n WalletType,\n WidgetTheme,\n WidgetColors,\n ProviderInterface,\n BlockchainAndTokenConfig,\n WidgetProps,\n RouteEvent,\n StepEvent,\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};\nexport {\n Widget,\n WidgetWallets,\n useWallets,\n useWidgetEvents,\n MainEvents,\n RouteEventType,\n StepEventType,\n StepExecutionEventStatus,\n StepExecutionBlockedEventStatus,\n};\n"],
5
- "mappings": "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",
6
- "names": ["I18nManager", "styled", "React", "useContext", "useEffect", "useMemo", "useState", "useQueueManager", "useWallets", "isEvmBlockchain", "React", "useEffect", "useRef", "MemoryRouter", "useInRouterContext", "useLocation", "useNavigate", "navigationRoutes", "i18n", "Alert", "BestRoute", "BestRouteSkeleton", "Button", "Divider", "styled", "SwapInput", "Typography", "WarningIcon", "React", "useEffect", "useRef", "useState", "useNavigate", "ChevronLeftIcon", "React", "Button", "darkTheme", "styled", "HeaderButton", "ConnectedIcon", "SuffixContainer", "NotificationsBadgeContainer", "BackButton", "props", "React", "HeaderButton", "ChevronLeftIcon", "__name", "i18n", "Button", "Typography", "React", "CancelButton", "props", "React", "SuffixContainer", "Button", "Typography", "i18n", "__name", "i18n", "Tooltip", "WalletIcon", "React", "WalletButton", "props", "React", "Tooltip", "i18n", "HeaderButton", "ConnectedIcon", "WalletIcon", "__name", "i18n", "NotificationsIcon", "Popover", "RefreshIcon", "SettingsIcon", "Tooltip", "TransactionIcon", "React", "ChainToken", "ChevronRightIcon", "ListItemButton", "Typography", "React", "useNavigate", "create", "RangoClient", "RANGO_PUBLIC_API_KEY", "configs", "getConfig", "name", "__name", "initConfig", "nextConfigs", "clonedConfigs", "configs", "__name", "DEFAULT_PRIMARY_RADIUS", "DEFAULT_SECONDARY_RADIUS", "rango", "httpService", "__name", "RangoClient", "getConfig", "removeDuplicateFrom", "array", "__name", "areEqual", "array1", "array2", "v", "i", "debounce", "fn", "time", "timeoutId", "wrapper", "args", "containsText", "text", "searchText", "colorShade", "col", "amt", "r", "g", "b", "rr", "gg", "bb", "generateRangeColors", "name", "color", "colors", "WalletStatus", "readAccountAddress", "detectInstallLink", "getCosmosExperimentalChainInfo", "isEvmAddress", "KEPLR_COMPATIBLE_WALLETS", "Networks", "BigNumber", "isCosmosBlockchain", "BigNumber", "ZERO", "WalletTypes", "EXCLUDED_WALLETS", "BigNumber", "secondsToString", "__name", "s", "seconds", "numberToString", "number", "minDecimals", "maxDecimals", "BigNumber", "roundingMode", "maxI", "i", "totalArrivalTime", "__name", "data", "a", "b", "containsText", "__name", "text", "searchText", "isPositiveNumber", "limitDecimalPlaces", "numberString", "maxDecimalPlaces", "number", "multiplier", "mapStatusToWalletState", "state", "WalletStatus", "__name", "mapWalletTypesToWalletInfo", "getState", "getWalletInfo", "list", "chain", "wallet", "EXCLUDED_WALLETS", "supportedChains", "supportedChain", "type", "name", "image", "installLink", "detectInstallLink", "walletAndSupportedChainsNames", "supportedBlockchains", "blockchainMeta", "prepareAccountsForWalletStore", "accounts", "evmBasedChains", "supportedChainNames", "result", "addAccount", "network", "address", "account", "newAccount", "readAccountAddress", "hasLimitation", "isSupported", "isUnknown", "Networks", "isUnknownAndEvmBased", "isEvmAddress", "getRequiredChains", "route", "wallets", "swap", "currentStepFromBlockchain", "currentStepToBlockchain", "internalSwap", "internalStepFromBlockchain", "internalStepToBlockchain", "getBalanceFromWallet", "connectedWallets", "chain", "symbol", "address", "selectedChainWallets", "wallet", "balance", "a", "b", "__name", "isAccountAndWalletMatched", "account", "connectedWallet", "makeBalanceFor", "retrievedBalance", "tokens", "balances", "tokenBalance", "BigNumber", "getUsdPrice", "resetConnectedWalletState", "sortTokens", "__name", "tokens", "token", "tokenA", "tokenB", "getUsdPrice", "blockchain", "symbol", "address", "allTokens", "t", "isExperimentalChain", "blockchains", "wallet", "cosmosExperimentalChainInfo", "getCosmosExperimentalChainInfo", "blockchainMeta", "isCosmosBlockchain", "getTokensWithBalance", "tokens", "connectedWallets", "balance", "otherProps", "tokenAmount", "numberToString", "BigNumber", "getBalanceFromWallet", "ZERO", "tokenUsdValue", "__name", "getSortedTokens", "chain", "otherChainTokens", "filteredTokens", "token", "sortTokens", "tokensAreEqual", "tokenA", "tokenB", "getDefaultToken", "sortedTokens", "otherToken", "selectedToken", "firstToken", "secondToken", "sortWalletsBasedOnConnectionState", "wallets", "a", "b", "WalletStatus", "getConciseAddress", "address", "maxChars", "ellipsisLength", "start", "end", "getAddress", "walletType", "connectedWallet", "createSelectors", "__name", "_store", "store", "k", "s", "selectors_default", "create", "subscribeWithSelector", "shallow", "BigNumber", "create", "subscribeWithSelector", "BigNumber", "searchParamsToToken", "tokens", "searchParams", "chain", "token", "symbolAndAddress", "__name", "getBestRouteToTokenUsdPrice", "bestRoute", "isNumberOfSwapsChanged", "route1", "route2", "route1Swaps", "route2Swaps", "isRouteSwappersUpdated", "route1Swappers", "swap", "route2Swappers", "areEqual", "isRouteInternalCoinsUpdated", "route1InternalCoins", "route2InternalCoins", "isRouteChanged", "getRequiredBalanceOfWallet", "selectedWallet", "fee", "relatedFeeStatus", "item", "wallet", "__name", "getFormattedBestRoute", "bestRoute", "formattedSwaps", "swap", "numberToString", "__name", "getPriceImpactLevel", "priceImpact", "warningLevel", "__name", "findCommonTokens", "listA", "listB", "tokenToString", "token", "set", "PendingSwapNetworkStatus", "BigNumber", "formatBestRoute", "bestRoute", "swap", "numberToString", "__name", "getRequiredWallets", "route", "wallets", "currentStepFromBlockchain", "currentStepToBlockchain", "lastAddedWallet", "isValidAddress", "chain", "address", "i18n", "RouteWarningType", "errorMessages", "i18n", "getConfirmSwapErrorMessage", "error", "__name", "i18n", "swapButtonTitles", "getOutputRatio", "inputUsdValue", "outputUsdValue", "ZERO", "__name", "outputRatioHasWarning", "outputRatio", "BigNumber", "hasLimitError", "bestRoute", "swap", "minimum", "maximum", "LimitErrorMessage", "isExclusive", "fromAmountRangeError", "recommendation", "numberToString", "errorMessages", "getSwapButtonState", "loadingMetaStatus", "connectedWallets", "loading", "highValueLoss", "priceImpactCanNotBeComputed", "needsToWarnEthOnPath", "inputAmount", "swapButtonTitles", "canComputePriceImpact", "usdValue", "requiredWallets", "route", "wallets", "currentStepFromBlockchain", "currentStepToBlockchain", "lastAddedWallet", "getUsdPrice", "blockchain", "symbol", "address", "allTokens", "t", "getUsdFeeOfStep", "step", "totalFeeInUsd", "i", "fee", "unitPrice", "getTotalFeeInUsd", "totalFee", "getMinRequiredSlippage", "route", "slippage", "s", "a", "b", "__name", "hasProperSlippage", "userSlippage", "minRequiredSlippage", "createBestRouteRequestBody", "params", "fromToken", "toToken", "inputAmount", "wallets", "selectedWallets", "disabledLiquiditySources", "slippage", "affiliateRef", "affiliatePercent", "affiliateWallets", "initialRoute", "destination", "selectedWalletsMap", "selectedWallet", "connectedWallets", "wallet", "chainAndAccounts", "connectedWallet", "checkPrerequisites", "filteredBlockchains", "removeDuplicateFrom", "blockchains", "swap", "internalSwap", "__name", "getWalletsForNewSwap", "getRouteOutputAmount", "route", "getPercentageChange", "inputUsdValue", "outputUsdValue", "BigNumber", "isOutputAmountChangedALot", "oldRoute", "newRoute", "oldOutputAmount", "newOutputAmount", "percentageChange", "getBalanceWarnings", "fee", "requiredWallets", "getRequiredChains", "selectedWallet1", "selectedWallet2", "getRequiredBalanceOfWallet", "asset", "symbol", "currentAmount", "numberToString", "requiredAmount", "reason", "calcOutputUsdValue", "outputAmount", "tokenPrice", "ZERO", "isNetworkStatusInWarningState", "pendingSwapStep", "PendingSwapNetworkStatus", "getSwapMessages", "pendingSwap", "currentStep", "textForRemove", "message", "detailedMessage", "isRpc", "getLastConvertedTokenInFailedSwap", "resultToken", "lastSuccessStep", "step", "shouldRetrySwap", "confirmSwapDisabled", "fetching", "showCustomDestination", "customDestination", "bestRoute", "selectedWallets", "lastStepToBlockchain", "requiredWallets", "chain", "wallet", "isValidAddress", "__name", "getUsdValue", "__name", "token", "amount", "BigNumber", "ZERO", "useBestRouteStore", "selectors_default", "create", "subscribeWithSelector", "set", "bestRoute", "state", "outputAmount", "outputUsdValue", "isPositiveNumber", "calcOutputUsdValue", "getBestRouteToTokenUsdPrice", "chain", "setDefaultToken", "tokens", "useMetaStore", "connectedWallets", "useWalletsStore", "sortedTokens", "getSortedTokens", "fromToken", "getDefaultToken", "pendingSwap", "blockchains", "failedIndex", "s", "firstStep", "lastStep", "fromBlockchain", "blockchain", "toBlockchain", "tokensAreEqual", "toToken", "sortedSourceTokens", "sortedDestinationTokens", "inputAmount", "flag", "wallets", "address", "useWalletsStore", "selectors_default", "create", "subscribeWithSelector", "set", "get", "accounts", "getWalletsDetails", "state", "wallet", "account", "shouldMarkWalletAsSelected", "connectedWallet", "walletType", "selectedWallets", "selectedWallet", "wallets", "walletSelected", "walletNotSelected", "shouldRetry", "tokens", "useMetaStore", "isAccountAndWalletMatched", "data", "address", "chain", "retrievedBalance", "httpService", "matchedAccount", "retrievedBalanceAccount", "balance", "makeBalanceFor", "resetConnectedWalletState", "connectedWallets", "useBestRouteStore", "sourceTokens", "destinationTokens", "sourceTokensWithBalance", "getTokensWithBalance", "destinationTokensWithBalance", "sortTokens", "shallow", "useMetaStore", "selectors_default", "create", "set", "connectedWallets", "useWalletsStore", "state", "sortTokens", "getTokensWithBalance", "response", "httpService", "chainThatHasTokenInMetaResponse", "removeDuplicateFrom", "t", "enabledChains", "chain", "a", "b", "create", "persist", "subscribeWithSelector", "useNotificationStore", "selectors_default", "create", "persist", "subscribeWithSelector", "set", "get", "event", "route", "fromStep", "toStep", "notification", "excludedList", "notificationItem", "requestId", "state", "create", "useUiStore", "selectors_default", "create", "set", "requestId", "path", "styled", "Container", "List", "Images", "NotFoundContainer", "i18n", "Divider", "NoNotificationIcon", "Typography", "React", "NotificationNotFound", "React", "NotFoundContainer", "NoNotificationIcon", "Divider", "Typography", "i18n", "__name", "MAX_NOTIFICATIONS_DISPLAYED", "NotificationContent", "navigate", "useNavigate", "setSelectedSwap", "useUiStore", "getUnreadNotifications", "useNotificationStore", "notifications", "tokens", "blockchains", "useMetaStore", "sortedNotification", "a", "b", "handleOnClick", "__name", "requestId", "React", "Container", "List", "notificationItem", "fromToken", "tokenItem", "fromBlockchain", "blockchainItem", "toToken", "toBlockchain", "ListItemButton", "Typography", "Images", "ChainToken", "ChevronRightIcon", "NotificationNotFound", "Typography", "React", "UnreadNotificationsBadge", "getUnreadNotifications", "useNotificationStore", "notificationsCount", "React", "NotificationsBadgeContainer", "Typography", "__name", "HomeButtons", "props", "layoutRef", "onClickRefresh", "onClickHistory", "onClickSettings", "onClickNotifications", "React", "Tooltip", "i18n", "HeaderButton", "RefreshIcon", "Popover", "NotificationContent", "NotificationsIcon", "UnreadNotificationsBadge", "SettingsIcon", "TransactionIcon", "__name", "BottomLogo", "Divider", "Header", "React", "useNavigate", "styled", "Container", "Content", "Footer", "LayoutComponent", "props", "ref", "children", "header", "footer", "noPadding", "hasLogo", "fixedHeight", "connectedWallets", "useWalletsStore", "connectWalletsButtonDisabled", "useUiStore", "navigate", "useNavigate", "onConnectWallet", "__name", "navigationRoutes", "React", "Container", "Header", "BackButton", "WalletButton", "CancelButton", "Content", "Footer", "Divider", "BottomLogo", "Layout", "Alert", "Button", "Divider", "NoRouteIcon", "RefreshIcon", "Typography", "React", "create", "persist", "subscribeWithSelector", "SLIPPAGES", "DEFAULT_SLIPPAGE", "HIGH_SLIPPAGE", "MAX_SLIPPAGE", "MIN_SLIPPGAE", "useSettingsStore", "selectors_default", "create", "persist", "subscribeWithSelector", "set", "DEFAULT_SLIPPAGE", "slippage", "customSlippage", "affiliateRef", "affiliatePercent", "affiliateWallets", "shouldReset", "state", "swappers", "useMetaStore", "swappersGroup", "removeDuplicateFrom", "swapper", "name", "liquiditySource", "theme", "makeInfo", "diagnosisMessage", "disabledLiquiditySources", "hasError", "toggleAllLiquiditySources", "refetchBestRoute", "errorMessages", "__name", "styled", "Container", "Footer", "PrefixIcon", "NoRoutes", "props", "diagnosisMessage", "fetch", "error", "disabledLiquiditySources", "useSettingsStore", "loadingMetaStatus", "useMetaStore", "toggleAllLiquiditySources", "info", "makeInfo", "React", "Container", "NoRouteIcon", "Divider", "Typography", "errorMessages", "Footer", "Alert", "Button", "PrefixIcon", "RefreshIcon", "__name", "Alert", "Divider", "InfoIcon", "React", "styled", "Alerts", "Flex", "Item", "Action", "Button", "Divider", "MessageBox", "Modal", "Typography", "WarningIcon", "React", "useNavigate", "Typography", "React", "RouteErrorsModalItem", "props", "title", "value", "valueColor", "React", "Item", "Typography", "__name", "RouteErrorsModal", "props", "highValueLoss", "open", "onToggle", "percentageChange", "inputUsdValue", "outputUsdValue", "totalFeeInUsd", "navigate", "useNavigate", "type", "highValueLossData", "numberToString", "React", "Modal", "MessageBox", "errorMessages", "Flex", "Divider", "Typography", "item", "index", "RouteErrorsModalItem", "Button", "WarningIcon", "navigationRoutes", "__name", "WARNING_LEVEL_LIMIT", "RouteErrors", "props", "bestRoute", "useBestRouteStore", "highValueLoss", "percentageChange", "priceImpactCanNotBeComputed", "openModal", "onToggle", "totalFeeInUsd", "outputUsdValue", "inputUsdValue", "loading", "extraSpace", "error", "hasLimitError", "recommendation", "LimitErrorMessage", "showWarnings", "showAlerts", "React", "Divider", "Alerts", "Alert", "errorMessages", "Action", "InfoIcon", "RouteErrorsModal", "__name", "ReverseIcon", "styled", "React", "SwitchButtonContainer", "styled", "StyledButton", "SwitchFromAndToButton", "switchFromAndTo", "useBestRouteStore", "React", "ReverseIcon", "__name", "useEffect", "useRef", "useState", "useRef", "useState", "useFetchBestRoute", "loading", "setLoading", "useState", "abortController", "useRef", "cancel", "__name", "requestBody", "res", "httpService", "error", "DEBOUNCE_DELAY", "useSwapInput", "fetchBestRoute", "cancelFetch", "useFetchBestRoute", "loading", "setLoading", "useState", "fromToken", "toToken", "inputAmount", "inputUsdValue", "resetRoute", "setRoute", "useBestRouteStore", "slippage", "customSlippage", "affiliatePercent", "affiliateRef", "affiliateWallets", "disabledLiquiditySources", "useSettingsStore", "error", "setError", "prevDisabledLiquiditySources", "useRef", "userSlippage", "shouldSkipRequest", "tokensAreEqual", "isPositiveNumber", "fetch", "__name", "requestBody", "createBestRouteRequestBody", "res", "debouncedFetch", "debounce", "useEffect", "disabledLiquiditySourceReset", "Container", "styled", "FromContainer", "InputsContainer", "BestRouteContainer", "FooterStepAlarm", "FooterAlert", "Home", "navigate", "useNavigate", "refetchBestRoute", "fetchingBestRoute", "bestRouteError", "useSwapInput", "fromToken", "fromBlockchain", "toToken", "toBlockchain", "setInputAmount", "inputAmount", "inputUsdValue", "outputAmount", "outputUsdValue", "bestRoute", "resetRouteWallets", "useBestRouteStore", "tokens", "loadingMetaStatus", "useMetaStore", "connectedWallets", "useWalletsStore", "setCurrentPage", "useUiStore", "openWarningModal", "setOpenWarningModal", "useState", "fromAmountRangeError", "swapHasError", "recommendation", "LimitErrorMessage", "layoutRef", "useRef", "showBestRoute", "needsToWarnEthOnPath", "outToInRatio", "getOutputRatio", "highValueLoss", "outputRatioHasWarning", "priceImpactInputCanNotBeComputed", "canComputePriceImpact", "priceImpactOutputCanNotBeComputed", "swapButtonState", "getSwapButtonState", "hasLimitError", "tokenBalance", "numberToString", "getBalanceFromWallet", "tokenBalanceReal", "useEffect", "navigationRoutes", "percentageChange", "getPercentageChange", "getBestRouteSteps", "__name", "swaps", "swap", "index", "React", "Alert", "Typography", "Divider", "totalFeeInUsd", "getTotalFeeInUsd", "bestRouteData", "getFormattedBestRoute", "Layout", "Button", "WarningIcon", "i18n", "HomeButtons", "SwapInput", "errorMessages", "SwitchFromAndToButton", "getPriceImpactLevel", "BestRouteSkeleton", "BestRoute", "secondsToString", "totalArrivalTime", "NoRoutes", "RouteErrors", "useEffect", "useRef", "createSearchParams", "useLocation", "useSearchParams", "UpdateUrl", "firstRender", "useRef", "searchParams", "setSearchParams", "useSearchParams", "location", "useLocation", "firstRenderSearchParams", "searchParamsRef", "fromBlockchain", "useBestRouteStore", "toBlockchain", "fromToken", "toToken", "setFromBlockchain", "setFromToken", "setToBlockchain", "setToToken", "inputAmount", "setInputAmount", "loadingStatus", "useMetaStore", "blockchains", "tokens", "setSelectedSwap", "useUiStore", "useEffect", "params", "createSearchParams", "value", "key", "requestId", "navigationRoutes", "fromChainString", "fromTokenString", "toChainString", "toTokenString", "fromAmount", "blockchain", "searchParamsToToken", "__name", "Route", "props", "location", "useLocation", "navigate", "useNavigate", "ref", "useRef", "useEffect", "navigationRoutes", "React", "Home", "__name", "AppRouter", "children", "isRouterInContext", "useInRouterContext", "Router", "MemoryRouter", "blockchains", "useMetaStore", "canSwitchNetworkTo", "useWallets", "evmChains", "isEvmBlockchain", "useQueueManager", "UpdateUrl", "React", "useRoutes", "i18n", "useManager", "Alert", "BestRoute", "BestRouteSkeleton", "Button", "Divider", "IconButton", "MessageBox", "Modal", "RefreshIcon", "SettingsIcon", "styled", "Tooltip", "Typography", "WalletIcon", "React", "useEffect", "useState", "flushSync", "useNavigate", "Alert", "BalanceErrors", "Button", "ChevronDownIcon", "ChevronLeftIcon", "Divider", "MessageBox", "Modal", "Typography", "WalletIcon", "React", "useEffect", "useState", "useNavigate", "i18n", "getRouteWarningMessage", "warning", "i18n", "__name", "Collapsible", "Button", "IconButton", "keyframes", "styled", "TextField", "slideDown", "slideUp", "Title", "ListContainer", "WalletButton", "Trigger", "ShowMoreHeader", "NavigateBack", "WalletsContainer", "CollapsibleRoot", "CustomDestinationButton", "CustomDestination", "ExpandedIcon", "ConfirmButton", "StyledTextField", "CollapsibleContent", "Wallets", "Button", "Divider", "Image", "MessageBox", "Modal", "SelectableWallet", "Typography", "WalletState", "React", "useEffect", "useState", "WalletState", "useWallets", "KEPLR_COMPATIBLE_WALLETS", "WalletTypes", "useEffect", "useState", "allProviders", "matchAndGenerateProviders", "providers", "options", "all", "allProviders", "selectedProviders", "requestedProvider", "result", "provider", "__name", "configWalletsToWalletName", "config", "ALL_SUPPORTED_WALLETS", "WalletTypes", "useWalletList", "params", "config", "chain", "onBeforeConnect", "onConnect", "state", "disconnect", "getWalletInfo", "connect", "useWallets", "connectedWallets", "useWalletsStore", "blockchains", "useMetaStore", "multiWallets", "listAvailableWalletTypes", "configWalletsToWalletName", "wallets", "mapWalletTypesToWalletInfo", "sortedWallets", "sortWalletsBasedOnConnectionState", "error", "setError", "useState", "isExperimentalChainNotAdded", "__name", "walletType", "connectedWallet", "handleClick", "type", "wallet", "atLeastOneWalletIsConnected", "w", "WalletState", "e", "disconnectConnectingWallets", "connectingWallets", "useEffect", "shouldExcludeWallet", "isExperimentalChain", "KEPLR_COMPATIBLE_WALLETS", "i18n", "styled", "Typography", "Wallet", "WalletState", "React", "Fragment", "useState", "Divider", "Modal", "React", "i18n", "Image", "MessageBox", "WalletState", "React", "keyframes", "styled", "IconContainer", "LogoContainer", "spin", "Spinner", "WalletImageContainer", "ModalContent", "props", "state", "image", "error", "WalletState", "React", "MessageBox", "i18n", "LogoContainer", "WalletImageContainer", "Image", "Spinner", "__name", "WalletModal", "props", "open", "onClose", "otherProps", "React", "Modal", "ModalContent", "Divider", "__name", "useInRouterContext", "useNavigate", "useNavigateBack", "isRouterInContext", "useInRouterContext", "navigate", "useNavigate", "routeWalletsConfirmed", "useBestRouteStore", "navigationRoutes", "__name", "currentRoute", "ListContainer", "styled", "Container", "TIME_TO_CLOSE_MODAL", "TIME_TO_IGNORE_MODAL", "WalletsPage", "config", "navigateBackFrom", "useNavigateBack", "openModal", "setOpenModal", "useState", "modalTimerId", "list", "handleClick", "error", "useWalletList", "type", "loadingMetaStatus", "useMetaStore", "selectedWallet", "wallet", "selectedWalletImage", "selectedWalletState", "WalletState", "React", "Layout", "i18n", "navigationRoutes", "Typography", "index", "key", "Fragment", "Wallet", "WalletModal", "__name", "getBlockchainDisplayNameFor", "blockchainName", "blockchains", "blockchain", "__name", "keyframes", "styled", "LogoContainer", "SpinAnimation", "Spinner", "WalletImageContainer", "WalletList", "props", "config", "chain", "isSelected", "selectWallet", "limit", "onShowMore", "connectedWallets", "useWalletsStore", "blockchains", "useMetaStore", "openWalletStateModal", "setOpenWalletStateModal", "useState", "experimentalChainWallet", "setExperimentalChainWallet", "showExperimentalChainModal", "setShowExperimentalChainModal", "addingExperimentalChainStatus", "setAddingExperimentalChainStatus", "connect", "useWallets", "list", "error", "handleClick", "useWalletList", "TIME_TO_CLOSE_MODAL", "sortedList", "setSortedList", "numberOfSupportedWallets", "shouldShowMoreWallets", "addExperimentalChain", "__name", "wallet", "useEffect", "selectedWalletIndex", "_", "index", "sortedItem", "listItem", "modalContainer", "timeout", "React", "address", "getAddress", "conciseAddress", "getConciseAddress", "experimentalChain", "isExperimentalChain", "experimentalChainNotAdded", "connectedWallet", "couldAddExperimentalChain", "WalletState", "connectedWalletDescription", "onClick", "blockchainDisplayName", "getBlockchainDisplayNameFor", "WalletModal", "Modal", "MessageBox", "Divider", "Button", "LogoContainer", "WalletImageContainer", "Image", "Spinner", "SelectableWallet", "WalletButton", "Typography", "NUMBER_OF_WALLETS_TO_DISPLAY", "ConfirmWalletsModal", "props", "open", "onClose", "onCancel", "onCheckBalance", "config", "loading", "blockchains", "useMetaStore", "bestRoute", "selectRouteWallets", "routeWalletsConfirmed", "setRouteWalletConfirmed", "customDestination", "setCustomDestination", "useBestRouteStore", "connectedWallets", "selectWallets", "useWalletsStore", "showMoreWalletFor", "setShowMoreWalletFor", "useState", "balanceWarnings", "setBalanceWarnings", "error", "setError", "routeWarning", "setRouteWarning", "destination", "setDestination", "showCustomDestination", "setShowCustomDestination", "requiredWallets", "getRequiredWallets", "customDestinationEnabled", "lastStepToBlockchain", "blockchain", "isWalletRequiredFor", "__name", "swap", "selectableWallets", "setSelectableWallets", "connectedWallet", "lastStepToBlockchainMeta", "chain", "isSelected", "walletType", "selectableWallet", "isAddressMatched", "isValidAddress", "resetCustomDestination", "anyWalletSelected", "onChange", "wallet", "onConfirmBalance", "lastSelectedWallets", "onConfirmWallets", "selectedWallets", "result", "warnings", "getConfirmSwapErrorMessage", "useEffect", "modalContainer", "navigate", "useNavigate", "React", "Modal", "navigationRoutes", "ConfirmButton", "Button", "confirmSwapDisabled", "ShowMoreHeader", "NavigateBack", "ChevronLeftIcon", "Typography", "MessageBox", "BalanceErrors", "WalletsContainer", "WalletList", "Alert", "Divider", "getRouteWarningMessage", "Wallets", "requiredWallet", "index", "key", "isLastWallet", "Title", "ListContainer", "CustomDestination", "CollapsibleRoot", "checked", "Trigger", "prevState", "CustomDestinationButton", "ExpandedIcon", "ChevronDownIcon", "WalletIcon", "CollapsibleContent", "StyledTextField", "e", "calculatePendingSwap", "BigNumber", "useEffect", "throwErrorIfResponseIsNotValid", "response", "params", "errorMessages", "newRouteOutputUsdValue", "BigNumber", "outputRatio", "getOutputRatio", "outputRatioHasWarning", "__name", "generateWarnings", "previousRoute", "currentRoute", "routeChanged", "isRouteChanged", "output", "isOutputAmountChangedALot", "numberToString", "getRouteOutputAmount", "getPercentageChange", "isNumberOfSwapsChanged", "isRouteSwappersUpdated", "isRouteInternalCoinsUpdated", "balanceWarnings", "getBalanceWarnings", "minRequiredSlippage", "getMinRequiredSlippage", "highSlippage", "HIGH_SLIPPAGE", "hasProperSlippage", "useConfirmSwap", "fromToken", "toToken", "inputAmount", "inputUsdValue", "setRoute", "initialRoute", "customDestinationFromStore", "useBestRouteStore", "slippage", "customSlippage", "affiliatePercent", "affiliateRef", "affiliateWallets", "disabledLiquiditySources", "useSettingsStore", "connectedWallets", "useWalletsStore", "meta", "useMetaStore", "userSlippage", "fetchBestRoute", "cancelFetch", "loading", "useFetchBestRoute", "useEffect", "selectedWallets", "customDestination", "requestBody", "createBestRouteRequestBody", "error", "swapSettings", "swap", "calculatePendingSwap", "getWalletsForNewSwap", "Container", "styled", "Buttons", "IconButton", "ConfirmSwapPage", "props", "config", "bestRoute", "inputAmount", "outputAmount", "inputUsdValue", "outputUsdValue", "setInputAmount", "selectedWallets", "routeWalletsConfirmed", "setRouteWalletConfirmed", "customDestination", "useBestRouteStore", "navigate", "useNavigate", "dbErrorMessage", "setDbErrorMessage", "useState", "showSlippageWarning", "setShowSlippageWarning", "connectedWallets", "useWalletsStore", "showWalletsOnInit", "showWallets", "setShowWallets", "setSelectedSwap", "useUiStore", "tokens", "loadingMetaStatus", "useMetaStore", "slippage", "useSettingsStore", "customSlippage", "manager", "useManager", "selectedSlippage", "confirmSwap", "fetchingConfirmationRoute", "cancelFetch", "useConfirmSwap", "confirmSwapResult", "setConfirmSwapResult", "showSkeleton", "showNoRouteFound", "showBestRoute", "totalFeeInUsd", "getTotalFeeInUsd", "percentageChange", "numberToString", "getPercentageChange", "warningLevel", "getPriceImpactLevel", "onConfirmSwap", "__name", "result", "addNewSwap", "navigationRoutes", "e", "onConfirm", "onStartConfirmSwap", "onRefresh", "res", "error", "useEffect", "routeChanged", "RouteWarningType", "selectedWalletDisconnected", "selectedWallet", "connectedWallet", "routeWalletsChanged", "requiredWallets", "getRequiredWallets", "lastStepToBlockchain", "swap", "requiredWallet", "flushSync", "React", "Layout", "Tooltip", "i18n", "HeaderButton", "SettingsIcon", "Button", "WalletIcon", "Modal", "Typography", "prevState", "MessageBox", "Divider", "ConfirmWalletsModal", "RefreshIcon", "Alert", "getRouteWarningMessage", "BestRouteSkeleton", "BestRoute", "formatBestRoute", "secondsToString", "totalArrivalTime", "NoRoutes", "getConfirmSwapErrorMessage", "i18n", "useManager", "Divider", "NotFound", "styled", "React", "useState", "useNavigate", "CloseIcon", "IconButton", "SearchIcon", "TextField", "React", "styled", "IconWrapper", "SearchInput", "props", "variant", "fullWidth", "color", "size", "onChange", "value", "setValue", "inputAttributes", "React", "TextField", "IconWrapper", "SearchIcon", "IconButton", "CloseIcon", "__name", "Divider", "SwapListItem", "Typography", "React", "styled", "Group", "Time", "SwapList", "NotFoundContainer", "SwapsGroup", "props", "list", "onSwapClick", "groupBy", "isLoading", "groups", "swaps", "React", "group", "Group", "Time", "Typography", "Divider", "SwapList", "_", "index", "key", "SwapListItem", "swap", "firstStep", "lastStep", "limitDecimalPlaces", "__name", "dayjs", "groupSwapsByDate", "__name", "swaps", "output", "now", "dayjs", "swap", "swapDate", "getPendingSwaps", "__name", "manager", "result", "q", "id", "storage", "a", "b", "Container", "styled", "SwapsGroupContainer", "isStepContainsText", "__name", "steps", "value", "step", "containsText", "HistoryPage", "setSelectedSwap", "useUiStore", "navigate", "useNavigate", "navigateBackFrom", "useNavigateBack", "manager", "state", "useManager", "list", "getPendingSwaps", "swap", "searchedFor", "setSearchedFor", "useState", "loading", "searchHandler", "event", "filteredList", "isEmpty", "React", "Layout", "navigationRoutes", "i18n", "SearchInput", "NotFoundContainer", "Divider", "NotFound", "SwapsGroup", "requestId", "groupSwapsByDate", "i18n", "List", "ListItemButton", "Radio", "RadioRoot", "Typography", "React", "useState", "styled", "SettingsContainer", "LiquiditySourceList", "LiquiditySourceDivider", "LiquiditySourceSuffix", "NotFoundContainer", "LanguagePage", "navigateBackFrom", "useNavigateBack", "language", "setLanguage", "useState", "languageList", "React", "Typography", "i18n", "Radio", "Layout", "navigationRoutes", "SettingsContainer", "RadioRoot", "List", "ListItemButton", "__name", "i18n", "Button", "Checkbox", "Image", "ListItemButton", "NotFound", "Typography", "React", "useState", "Checkbox", "Skeleton", "React", "ListItem", "styled", "CustomeListItem", "ITEM_SKELETON_COUNT", "LoadingLiquiditySourceList", "React", "LiquiditySourceList", "e", "CustomeListItem", "Skeleton", "Checkbox", "__name", "getUniqueSwappersGroups", "supportedSwappers", "swappers", "useMetaStore", "disabledLiquiditySources", "useSettingsStore", "uniqueSupportedSwappersGroups", "removeDuplicateFrom", "uniqueGroupItem", "swapperItem", "swapper", "isSupportedSwapper", "supportedItem", "swapperTypeItem", "__name", "LiquiditySourcePage", "supportedSwappers", "sourceType", "searchedFor", "setSearchedFor", "useState", "toggleLiquiditySource", "useSettingsStore", "navigateBackFrom", "useNavigateBack", "loadingMetaStatus", "useMetaStore", "supportedUniqueSwappersGroups", "getUniqueSwappersGroups", "validTypes", "liquiditySources", "uniqueItem", "hasSelectAll", "sourceItem", "toggleAllSources", "__name", "list", "selected", "groupTitle", "logo", "React", "Image", "Checkbox", "Typography", "i18n", "searchHandler", "event", "value", "filteredList", "containsText", "Layout", "navigationRoutes", "LiquiditySourceSuffix", "Button", "SettingsContainer", "SearchInput", "LoadingLiquiditySourceList", "NotFoundContainer", "NotFound", "LiquiditySourceList", "ListItemButton", "LiquiditySourceDivider", "i18n", "Divider", "React", "useState", "i18n", "Divider", "Image", "ListItemButton", "NotFound", "Typography", "React", "useEffect", "useState", "TransactionType", "BlockchainCategories", "filterByType", "__name", "blockchain", "type", "TransactionType", "filterBlockchains", "list", "searchedFor", "blockchainType", "containsText", "styled", "Container", "List", "ListItem", "Skeleton", "React", "ITEM_SKELETON_COUNT", "LoadingBlockchainList", "React", "List", "e", "ListItem", "Skeleton", "__name", "BlockchainList", "props", "list", "searchedFor", "onChange", "blockchainCategory", "blockchains", "setBlockchains", "useState", "loadingStatus", "useMetaStore", "useEffect", "filterBlockchains", "renderList", "__name", "React", "Divider", "NotFound", "i18n", "List", "item", "ListItemButton", "Image", "Typography", "Container", "LoadingBlockchainList", "i18n", "Divider", "Image", "Skeleton", "Typography", "React", "React", "styled", "Chip", "BlockchainsChip", "props", "children", "selected", "onClick", "React", "Chip", "__name", "blockchainslogo", "generateBlockchainsLogo", "__name", "list", "type", "item", "filterByType", "styled", "Container", "ImageContent", "FirstImage", "SelectableCategoryList", "props", "setCategory", "category", "blockchains", "useMetaStore", "loadingStatus", "categories", "BlockchainCategories", "React", "Container", "_", "index", "Skeleton", "blockchainCategory", "BlockchainsChip", "ImageContent", "generateBlockchainsLogo", "blockchain", "FirstImage", "Image", "Divider", "Typography", "i18n", "__name", "SelectBlockchainPage", "props", "type", "supportedBlockchains", "navigateBackFrom", "useNavigateBack", "searchedFor", "setSearchedFor", "useState", "blockchainCategory", "setBlockchainCategory", "setToBlockchain", "useBestRouteStore", "setFromBlockchain", "blockchains", "useMetaStore", "chain", "React", "Layout", "navigationRoutes", "i18n", "Divider", "SelectableCategoryList", "SearchInput", "event", "BlockchainList", "blockchain", "__name", "i18n", "Divider", "React", "useEffect", "useState", "useNavigate", "i18n", "Divider", "Image", "Skeleton", "Typography", "React", "useEffect", "useState", "sortBlockchains", "__name", "blockchains", "importantBlockchains", "otherBlockchains", "blockchain", "styled", "Container", "MIN", "MAX", "NUMBER_OF_LOADING", "BlockchainsSection", "props", "blockchains", "type", "blockchain", "onChange", "onMoreClick", "sortedBlockchains", "sortBlockchains", "selectFromMoreBlockchain", "setSelectFromMoreBlockchain", "useState", "loadingStatus", "useMetaStore", "resetToBlockchain", "useBestRouteStore", "resetFromBlockchain", "COUNT_BLOCKCHAINS", "useEffect", "selectBlockchainFromMore", "item", "React", "Divider", "Typography", "i18n", "Container", "e", "Skeleton", "BlockchainsChip", "Image", "__name", "i18n", "darkTheme", "Divider", "ExternalLinkIcon", "Image", "ListItemButton", "NotFound", "PinIcon", "Skeleton", "Typography", "VirtualizedList", "React", "forwardRef", "useEffect", "useState", "Divider", "ListItem", "Skeleton", "React", "styled", "Typography", "Container", "Title", "List", "Tag", "TagTitle", "BalanceContainer", "End", "Description", "ImageSection", "Pin", "LoadingTokenList", "props", "React", "List", "ListItem", "Skeleton", "End", "Divider", "__name", "PAGE_SIZE", "renderDesc", "__name", "props", "address", "name", "url", "token", "customCssForTag", "customCssForTagTitle", "length", "React", "Title", "Typography", "Divider", "Tag", "TagTitle", "e", "ExternalLinkIcon", "TokenList", "list", "searchedFor", "onChange", "selectedBlockchain", "tokens", "setTokens", "useState", "loadingStatus", "useMetaStore", "hasNextPage", "setHasNextPage", "loadingWallet", "useWalletsStore", "blockchains", "innerElementType", "forwardRef", "render", "ref", "loadNextPage", "useEffect", "renderList", "NotFound", "i18n", "VirtualizedList", "index", "style", "blockchain", "color", "generateRangeColors", "darkTheme", "ListItemButton", "ImageSection", "Image", "Pin", "PinIcon", "End", "Skeleton", "BalanceContainer", "Container", "LoadingTokenList", "List", "filterTokens", "__name", "list", "searchedFor", "token", "containsText", "a", "b", "SelectSwapItemsPage", "props", "type", "supportedBlockchains", "supportedTokens", "pinnedTokens", "selectedBlockchain", "setSelectedBlockchain", "useState", "navigate", "useNavigate", "navigateBackFrom", "useNavigateBack", "tokens", "setTokensWithBalance", "useMetaStore", "sourceTokens", "destinationTokens", "fromBlockchain", "toBlockchain", "setFromToken", "setToToken", "setFromBlockchain", "setToBlockchain", "useBestRouteStore", "connectedWallets", "loadingWallet", "useWalletsStore", "searchedFor", "setSearchedFor", "blockchains", "chain", "allTokens", "findCommonTokens", "token", "blockchain", "supportedSourceTokens", "supportedDestinationTokens", "tokensByType", "tokenList", "pinnedToken", "tokensAreEqual", "useEffect", "React", "Layout", "navigationRoutes", "i18n", "BlockchainsSection", "Divider", "SearchInput", "event", "TokenList", "filterTokens", "__name", "i18n", "ChevronRightIcon", "Divider", "List", "ListItemButton", "Skeleton", "Switch", "Typography", "React", "useNavigate", "i18n", "Chip", "Divider", "InfoIcon", "TextField", "Tooltip", "Typography", "React", "styled", "BaseContainer", "SlippageChipsContainer", "Head", "SlippageTooltipContainer", "i18n", "Typography", "React", "SlippageTooltipContent", "React", "SlippageTooltipContainer", "Typography", "i18n", "__name", "Slippage", "slippage", "useSettingsStore", "setSlippage", "customSlippage", "setCustomSlippage", "React", "BaseContainer", "Head", "Typography", "i18n", "Divider", "Tooltip", "SlippageTooltipContent", "InfoIcon", "SlippageChipsContainer", "SLIPPAGES", "slippageItem", "index", "key", "Chip", "TextField", "event", "parsedValue", "MIN_SLIPPGAE", "MAX_SLIPPAGE", "__name", "SettingsPage", "supportedSwappers", "singleTheme", "navigate", "useNavigate", "navigateBackFrom", "useNavigateBack", "infiniteApprove", "useSettingsStore", "toggleInfiniteApprove", "loadingMetaStatus", "useMetaStore", "supportedUniqueSwappersGroups", "getUniqueSwappersGroups", "bridgeSources", "uniqueItem", "totalBridgeSources", "totalSelectedBridgeSources", "exchangeSources", "totalExchangeSources", "totalSelectedExchangeSources", "handleEndItem", "__name", "totalSelected", "total", "React", "Skeleton", "Typography", "bridgeItem", "i18n", "Divider", "ChevronRightIcon", "navigationRoutes", "exchangeItem", "languageItem", "themeItem", "infiniteApprovalItem", "Switch", "settingItems", "Layout", "SettingsContainer", "Slippage", "List", "ListItemButton", "cancelSwap", "useManager", "React", "i18n", "getCurrentBlockchainOfOrNull", "getCurrentStep", "getRelatedWalletOrNull", "PendingSwapNetworkStatus", "Button", "CopyIcon", "Divider", "IconButton", "RouteCost", "RouteSummary", "StepDetails", "Typography", "useCopyToClipboard", "useWallets", "React", "useEffect", "useRef", "useState", "useNavigate", "timeSince", "timeMillis", "seconds", "intervalType", "interval", "__name", "getSwapDate", "pendingSwap", "PendingSwapNetworkStatus", "Modal", "React", "i18n", "Button", "Divider", "MessageBox", "Typography", "React", "CancelContent", "__name", "onCancel", "onClose", "React", "Divider", "MessageBox", "i18n", "Button", "Typography", "i18n", "Button", "Divider", "MessageBox", "Typography", "React", "DeleteContent", "__name", "onDelete", "onClose", "React", "Divider", "MessageBox", "i18n", "Button", "Typography", "i18n", "PendingSwapNetworkStatus", "modalNetworkValues", "MessageBox", "Wallet", "WalletState", "useWallets", "React", "styled", "WalletContainer", "WalletStateContent", "__name", "props", "type", "title", "currentStepWallet", "message", "showWalletButton", "connect", "getWalletInfo", "walletState", "useWallets", "walletType", "state", "WalletState", "React", "MessageBox", "WalletContainer", "Wallet", "SwapDetailsModal", "props", "state", "onClose", "onDelete", "onCancel", "currentStepWallet", "message", "showWalletStateContent", "PendingSwapNetworkStatus", "React", "Modal", "WalletStateContent", "modalNetworkValues", "DeleteContent", "CancelContent", "__name", "i18n", "Button", "Divider", "MessageBox", "Modal", "TokenAmount", "Typography", "React", "useNavigate", "SwapDetailsCompleteModal", "props", "open", "onClose", "status", "priceValue", "usdValue", "token", "chain", "percentageChange", "description", "diagnosisUrl", "navigate", "useNavigate", "React", "Modal", "MessageBox", "i18n", "TokenAmount", "Divider", "Typography", "Button", "navigationRoutes", "__name", "React", "i18n", "Alert", "IconButton", "LinkIcon", "React", "Fragment", "Alert", "ChevronDownIcon", "ChevronUpIcon", "IconButton", "React", "useState", "FailedAlert", "props", "message", "showContentError", "setShowContentError", "useState", "React", "Alert", "IconButton", "prev", "ChevronUpIcon", "ChevronDownIcon", "__name", "styled", "Alerts", "i18n", "PendingSwapNetworkStatus", "Alert", "Button", "React", "WarningAlert", "props", "switchNetwork", "setNetworkModal", "message", "showNetworkModal", "React", "Alert", "Button", "PendingSwapNetworkStatus", "e", "i18n", "__name", "SwapDetailsAlerts", "props", "switchNetwork", "showNetworkModal", "setNetworkModal", "message", "step", "hasAlreadyProceededToSign", "hasWarning", "isNetworkStatusInWarningState", "waitingForApproval", "inProgress", "React", "Alerts", "explorerUrl", "index", "urls", "key", "lastUrl", "loading", "error", "Fragment", "Alert", "i18n", "IconButton", "LinkIcon", "WarningAlert", "FailedAlert", "__name", "RESET_INTERVAL", "SECONDS", "getSteps", "__name", "swap", "args", "hasAlreadyProceededToSign", "step", "index", "amountToConvert", "numberToString", "React", "SwapDetailsAlerts", "getStepState", "isNetworkStatusInWarningState", "styled", "Container", "HeaderDetails", "StepsList", "Alerts", "PlaceholderContainer", "LoaderContainer", "SwapDetails", "props", "swap", "requestId", "onDelete", "onCancelProps", "canSwitchNetworkTo", "connect", "getWalletInfo", "useWallets", "retry", "useBestRouteStore", "navigate", "useNavigate", "navigateBackFrom", "useNavigateBack", "_", "handleCopy", "useCopyToClipboard", "RESET_INTERVAL", "listRef", "useRef", "modalState", "setModalState", "useState", "showCompletedModal", "setShowCompletedModal", "tokens", "useMetaStore", "onCancel", "__name", "getUnreadNotifications", "useNotificationStore", "setAsRead", "unreadNotifications", "currentStep", "getCurrentStep", "currentStepNetworkStatus", "useEffect", "n", "showSwitchNetwork", "PendingSwapNetworkStatus", "lastConvertedTokenInFailedSwap", "getLastConvertedTokenInFailedSwap", "currentStepBlockchain", "getCurrentBlockchainOfOrNull", "currentStepWallet", "getRelatedWalletOrNull", "swapDate", "getSwapDate", "shouldRetry", "shouldRetrySwap", "isMobileWallet", "walletType", "switchNetwork", "stepMessage", "getSwapMessages", "steps", "getSteps", "numberOfSteps", "firstStep", "lastStep", "outputAmount", "totalFee", "totalTime", "step", "minutes", "SECONDS", "diagnosisUrl", "outputUsdValue", "numberToString", "getUsdPrice", "inputUsdValue", "percentageChange", "getPercentageChange", "completeModalDesc", "getConciseAddress", "i18n", "React", "Layout", "navigationRoutes", "SuffixContainer", "Button", "Typography", "Container", "HeaderDetails", "IconButton", "CopyIcon", "RouteCost", "RouteSummary", "getPriceImpactLevel", "Divider", "StepsList", "index", "key", "state", "getStepState", "isFocused", "StepDetails", "SwapDetailsModal", "SwapDetailsCompleteModal", "i18n", "CopyIcon", "IconButton", "NotFound", "Skeleton", "Typography", "React", "i18n", "ChainToken", "Divider", "Skeleton", "Typography", "React", "styled", "Container", "StepContainer", "StepSeparator", "ChainToken", "Divider", "NextIcon", "Skeleton", "React", "LoadingSwapDetailStep", "props", "extraInfo", "React", "StepContainer", "Skeleton", "Divider", "ChainToken", "NextIcon", "__name", "LoadingSwapDetails", "routeSummary", "React", "ChainToken", "Divider", "Skeleton", "Container", "Typography", "i18n", "LoadingSwapDetailStep", "StepSeparator", "__name", "SwapDetailsPlaceholder", "props", "requestId", "showSkeleton", "navigateBackFrom", "useNavigateBack", "React", "Layout", "i18n", "navigationRoutes", "SuffixContainer", "Container", "HeaderDetails", "Typography", "Skeleton", "IconButton", "CopyIcon", "LoadingSwapDetails", "PlaceholderContainer", "NotFound", "__name", "SwapDetailsPage", "manager", "state", "useManager", "loading", "pendingSwaps", "getPendingSwaps", "requestId", "useUiStore", "navigateBackFrom", "useNavigateBack", "loadingStatus", "useMetaStore", "showSkeleton", "selectedSwap", "swap", "onCancel", "__name", "cancelSwap", "onDelete", "navigationRoutes", "e", "React", "SwapDetailsPlaceholder", "SwapDetails", "i18n", "AutoThemeIcon", "DarkModeIcon", "LightModeIcon", "List", "ListItemButton", "Radio", "RadioRoot", "Typography", "React", "ThemePage", "navigateBackFrom", "useNavigateBack", "theme", "useSettingsStore", "setTheme", "themesList", "React", "Typography", "i18n", "LightModeIcon", "Radio", "DarkModeIcon", "AutoThemeIcon", "Layout", "navigationRoutes", "SettingsContainer", "RadioRoot", "value", "List", "ListItemButton", "__name", "getAbsolutePath", "__name", "path", "AppRoutes", "props", "config", "useRoutes", "navigationRoutes", "React", "Home", "SelectSwapItemsPage", "SelectBlockchainPage", "SettingsPage", "ThemePage", "LanguagePage", "LiquiditySourcePage", "HistoryPage", "SwapDetailsPage", "WalletsPage", "ConfirmSwapPage", "isApprovalTX", "MainEvents", "RouteEventType", "StepEventType", "StepExecutionEventStatus", "useEvents", "useEffect", "StepExecutionBlockedEventStatus", "validBlockedStatuses", "WidgetEvents", "connectedWallets", "useWalletsStore", "getWalletsDetails", "setNotification", "useNotificationStore", "setAsRead", "widgetEvents", "useEvents", "useEffect", "MainEvents", "widgetEvent", "event", "step", "route", "StepEventType", "StepExecutionEventStatus", "isApprovalTX", "fromAccount", "account", "toAccount", "wallet", "validBlockedStatuses", "RouteEventType", "__name", "globalCss", "globalFont", "__name", "globalCss", "createTheme", "darkTheme", "lightTheme", "useEffect", "useState", "useTheme", "fontFamily", "borderRadius", "DEFAULT_PRIMARY_RADIUS", "secondaryBorderRadius", "DEFAULT_SECONDARY_RADIUS", "mode", "theme", "useSettingsStore", "fetchMeta", "useMetaStore", "setTheme", "customTheme", "createTheme", "lightClassName", "lightTheme", "darkClassName", "darkTheme", "OSTheme", "setOSTheme", "useState", "useEffect", "__name", "switchTheme", "event", "React", "useMemo", "ManagerProvider", "makeQueueDefinition", "checkWaitingForNetworkChange", "useWallets", "convertEvmBlockchainMetaToEvmChainInfo", "isEvmBlockchain", "QueueManager", "props", "providers", "getSigners", "state", "connect", "canSwitchNetworkTo", "getWalletInfo", "useWallets", "swapQueueDef", "useMemo", "makeQueueDefinition", "getConfig", "blockchains", "useMetaStore", "wallets", "useWalletsStore", "wallet", "switchNetwork", "__name", "network", "isMobileWallet", "walletType", "allBlockchains", "blockchain", "blockchainsObj", "evmBasedChains", "isEvmBlockchain", "getSupportedChainNames", "type", "supportedChains", "walletAndSupportedChainsNames", "allProviders", "context", "convertEvmBlockchainMetaToEvmChainInfo", "React", "ManagerProvider", "manager", "checkWaitingForNetworkChange", "QueueManager_default", "Events", "Provider", "isEvmBlockchain", "React", "createContext", "useRef", "useEffect", "useWalletProviders", "providers", "options", "clearConnectedWallet", "useWalletsStore", "generateProviders", "matchAndGenerateProviders", "useEffect", "__name", "WidgetContext", "createContext", "WidgetWallets", "props", "blockchains", "useMetaStore", "providers", "useWalletProviders", "disconnectWallet", "useWalletsStore", "connectWallet", "onConnectWalletHandler", "useRef", "evmBasedChainNames", "isEvmBlockchain", "chain", "onUpdateState", "__name", "type", "event", "value", "state", "supportedBlockchains", "Events", "supportedChainNames", "walletAndSupportedChainsNames", "data", "prepareAccountsForWalletStore", "key", "React", "handler", "Provider", "MainContainer", "styled", "Main", "props", "config", "globalFont", "activeTheme", "useTheme", "lastConnectedWalletWithNetwork", "setLastConnectedWalletWithNetwork", "useState", "disconnectedWallet", "setDisconnectedWallet", "widgetContext", "useContext", "WidgetContext", "useMemo", "initConfig", "useEffect", "useSettingsStore", "useNotificationStore", "setInputAmount", "setToToken", "setToBlockchain", "setFromBlockchain", "setFromToken", "useBestRouteStore", "tokens", "blockchains", "loadingMetaStatus", "useMetaStore", "setAffiliateRef", "setAffiliatePercent", "setAffiliateWallets", "chain", "token", "t", "tokensAreEqual", "React", "I18nManager", "QueueManager_default", "WidgetEvents", "AppRouter", "AppRoutes", "__name", "Widget", "WidgetWallets", "useWallets", "useWidgetEvents", "MainEvents", "RouteEventType", "StepEventType", "StepExecutionEventStatus", "StepExecutionBlockedEventStatus"]
3
+ "sources": ["../src/Widget.tsx", "../src/components/AppRouter.tsx", "../src/constants/navigationRoutes.ts", "../src/pages/Home.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/HomeButtons.tsx", "../src/utils/common.ts", "../src/components/NotificationContent/NotificationContent.tsx", "../src/store/meta.ts", "../src/services/httpService.ts", "../src/utils/configs.ts", "../src/utils/wallets.ts", "../src/constants/numbers.ts", "../src/constants/wallets.ts", "../src/utils/numbers.ts", "../src/store/selectors.ts", "../src/store/wallets.ts", "../src/store/bestRoute.ts", "../src/utils/routing.ts", "../src/utils/swap.ts", "../src/components/ConfirmWalletsModal/ConfirmWallets.helpers.ts", "../src/constants/errors.ts", "../src/types/routing.ts", "../src/constants/messages.ts", "../src/store/notification.ts", "../src/store/ui.ts", "../src/components/NotificationContent/NotificationContent.styles.ts", "../src/components/NotificationContent/NotificationNotFound.tsx", "../src/components/HeaderButtons/UnreadNotificationsBadge.tsx", "../src/components/Layout/Layout.tsx", "../src/components/Layout/Layout.styles.ts", "../src/components/NoRoutes/NoRoutes.tsx", "../src/store/settings.ts", "../src/constants/swapSettings.ts", "../src/components/NoRoutes/NoRoutes.helper.ts", "../src/components/NoRoutes/NoRoutes.styles.ts", "../src/components/RouteErrors/RouteErrors.tsx", "../src/components/RouteErrors/RouteErrors.styles.ts", "../src/components/RouteErrors/RouteErrorsModal.tsx", "../src/components/RouteErrors/RouteErrorsModalItem.tsx", "../src/components/SwitchFromAndTo.tsx", "../src/hooks/useSwapInput.ts", "../src/hooks/useFetchBestRoute.ts", "../src/components/UpdateUrl.tsx", "../src/components/AppRoutes.tsx", "../src/pages/ConfirmSwapPage.tsx", "../src/components/ConfirmWalletsModal/ConfirmWalletsModal.tsx", "../src/constants/warnings.ts", "../src/components/ConfirmWalletsModal/ConfirmWallets.styles.ts", "../src/components/ConfirmWalletsModal/WalletList.tsx", "../src/hooks/useWalletList.ts", "../src/utils/providers.ts", "../src/pages/WalletsPage.tsx", "../src/components/WalletModal/WalletModal.tsx", "../src/components/WalletModal/WalletModalContent.tsx", "../src/components/WalletModal/WalletModalContent.styles.ts", "../src/hooks/useNavigateBack.ts", "../src/utils/meta.ts", "../src/components/ConfirmWalletsModal/WalletList.styles.ts", "../src/hooks/useConfirmSwap.ts", "../src/pages/HistoryPage.tsx", "../src/components/SearchInput/SearchInput.tsx", "../src/components/SearchInput/SearchInput.styles.ts", "../src/components/SwapsGroup/SwapsGroup.tsx", "../src/components/SwapsGroup/SwapsGroup.styles.ts", "../src/utils/date.ts", "../src/utils/queue.ts", "../src/pages/LanguagePage.tsx", "../src/components/SettingsContainer/SettingsContainer.style.ts", "../src/pages/LiquiditySourcePage.tsx", "../src/components/LoadingLiquiditySourceList/LoadingLiquiditySourceList.tsx", "../src/components/LoadingLiquiditySourceList/LoadingLiquiditySourceList.styles.ts", "../src/utils/settings.ts", "../src/pages/SelectBlockchainPage.tsx", "../src/components/BlockchainList/BlockchainList.tsx", "../src/components/BlockchainList/BlockchainList.helpers.ts", "../src/components/SelectableCategoryList/SelectableCategoryList.types.ts", "../src/components/BlockchainList/BlockchainList.styles.ts", "../src/components/BlockchainList/LoadingBlockchainList.tsx", "../src/components/SelectableCategoryList/SelectableCategoryList.tsx", "../src/components/BlockchainsChip/BlockchainsChip.tsx", "../src/components/BlockchainsChip/BlockchainsChip.styles.ts", "../src/components/SelectableCategoryList/SelectableCategoryList.helpers.ts", "../src/components/SelectableCategoryList/SelectableCategoryList.styles.ts", "../src/pages/SelectSwapItemsPage.tsx", "../src/components/BlockchainsSection/BlockchainsSection.tsx", "../src/components/BlockchainsSection/BlockchainSection.helpers.ts", "../src/components/BlockchainsSection/BlockchainsSection.styles.ts", "../src/components/TokenList/TokenList.tsx", "../src/components/TokenList/LoadingTokenList.tsx", "../src/components/TokenList/TokenList.styles.ts", "../src/components/TokenList/TokenList.helpers.ts", "../src/pages/SettingsPage.tsx", "../src/components/Slippage/Slippage.tsx", "../src/components/Slippage/Slippage.styles.ts", "../src/components/Slippage/SlippageTooltipContent.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.helpers.tsx", "../src/components/SwapDetailsModal/SwapDetailsModal.WalletState.tsx", "../src/components/SwapDetailsModal/SwapDetailsModal.styles.ts", "../src/components/SwapDetailsModal/SwapDetailsCompleteModal.tsx", "../src/components/SwapDetails/SwapDetails.helpers.tsx", "../src/components/SwapDetailsAlerts/SwapDetailsAlerts.tsx", "../src/components/SwapDetailsAlerts/SwapDetailsAlerts.Failed.tsx", "../src/components/SwapDetailsAlerts/SwapDetailsAlerts.styles.ts", "../src/components/SwapDetailsAlerts/SwapDetailsAlerts.Warning.tsx", "../src/components/SwapDetails/SwapDetails.styles.ts", "../src/components/SwapDetails/SwapDetails.Placeholder.tsx", "../src/components/LoadingSwapDetails/LoadingSwapDetails.tsx", "../src/components/LoadingSwapDetails/LoadingSwapDetails.styles.ts", "../src/components/LoadingSwapDetails/LoadingSwapDetailStep.tsx", "../src/pages/ThemePage.tsx", "../src/components/WidgetEvents.tsx", "../src/types/notification.ts", "../src/globalStyles.ts", "../src/hooks/useTheme.ts", "../src/QueueManager.tsx", "../src/Wallets.tsx", "../src/hooks/useWalletProviders.ts", "../src/index.ts"],
4
+ "sourcesContent": ["import type { WidgetConfig } from './types';\nimport type { WalletType } from '@rango-dev/wallets-shared';\nimport type { PropsWithChildren } from 'react';\n\nimport { I18nManager, styled } from '@rango-dev/ui';\nimport React, { useContext, useEffect, useMemo, useState } from 'react';\n\nimport { AppRouter } from './components/AppRouter';\nimport { AppRoutes } from './components/AppRoutes';\nimport { WidgetEvents } from './components/WidgetEvents';\nimport { globalFont } from './globalStyles';\nimport { useTheme } from './hooks/useTheme';\nimport QueueManager from './QueueManager';\nimport { useBestRouteStore } from './store/bestRoute';\nimport { useMetaStore } from './store/meta';\nimport { useNotificationStore } from './store/notification';\nimport { useSettingsStore } from './store/settings';\nimport { initConfig } from './utils/configs';\nimport { tokensAreEqual } from './utils/wallets';\nimport { WidgetContext, WidgetWallets } from './Wallets';\n\nconst MainContainer = styled('div', {\n width: '100%',\n display: 'flex',\n justifyContent: 'center',\n alignItems: 'center',\n fontFamily: '$widget',\n boxSizing: 'border-box',\n '& *, *::before, *::after': {\n boxSizing: 'inherit',\n listStyleType: 'none',\n },\n});\n\nexport type WidgetProps = {\n config?: WidgetConfig;\n};\n\nexport function Main(props: PropsWithChildren<WidgetProps>) {\n const { config } = props;\n globalFont();\n\n const { activeTheme } = useTheme(config?.theme || {});\n const [lastConnectedWalletWithNetwork, setLastConnectedWalletWithNetwork] =\n useState<string>('');\n const [disconnectedWallet, setDisconnectedWallet] = useState<WalletType>();\n const widgetContext = useContext(WidgetContext);\n\n useMemo(() => {\n if (config?.apiKey) {\n initConfig({\n API_KEY: config?.apiKey,\n });\n }\n }, [config]);\n\n useEffect(() => {\n void useSettingsStore.persist.rehydrate();\n void useNotificationStore.persist.rehydrate();\n widgetContext.onConnectWallet(setLastConnectedWalletWithNetwork);\n }, []);\n\n const {\n setInputAmount,\n setToToken,\n setToBlockchain,\n setFromBlockchain,\n setFromToken,\n } = useBestRouteStore();\n\n const {\n meta: { tokens, blockchains },\n loadingStatus: loadingMetaStatus,\n } = useMetaStore();\n\n const { setAffiliateRef, setAffiliatePercent, setAffiliateWallets } =\n useSettingsStore();\n\n useEffect(() => {\n setInputAmount(config?.amount?.toString() || '');\n }, [config?.amount]);\n\n useEffect(() => {\n if (loadingMetaStatus === 'success') {\n const chain = blockchains.find(\n (chain) => chain.name === config?.from?.blockchain\n );\n const token = tokens.find((t) =>\n tokensAreEqual(t, config?.from?.token || null)\n );\n\n setFromBlockchain(chain || null);\n setFromToken(token || null);\n }\n }, [config?.from?.token, config?.from?.blockchain, loadingMetaStatus]);\n\n useEffect(() => {\n if (loadingMetaStatus === 'success') {\n const chain = blockchains.find(\n (chain) => chain.name === config?.to?.blockchain\n );\n const token = tokens.find((t) =>\n tokensAreEqual(t, config?.to?.token || null)\n );\n setToBlockchain(chain || null);\n setToToken(token || null);\n }\n }, [config?.to?.token, config?.to?.blockchain, loadingMetaStatus]);\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 return (\n <I18nManager language={config?.language}>\n <MainContainer id=\"swap-container\" className={activeTheme}>\n <QueueManager>\n <WidgetEvents />\n <AppRouter\n lastConnectedWallet={lastConnectedWalletWithNetwork}\n disconnectedWallet={disconnectedWallet}\n clearDisconnectedWallet={() => {\n setDisconnectedWallet(undefined);\n }}>\n <AppRoutes config={config} />\n </AppRouter>\n </QueueManager>\n </MainContainer>\n </I18nManager>\n );\n}\n\nexport function Widget(props: PropsWithChildren<WidgetProps>) {\n if (!props.config?.externalWallets) {\n return (\n <WidgetWallets\n providers={props.config?.wallets}\n options={{\n walletConnectProjectId: props.config?.walletConnectProjectId,\n }}>\n <Main {...props} />\n </WidgetWallets>\n );\n }\n return <Main {...props} />;\n}\n", "import type { WalletType } from '@rango-dev/wallets-shared';\nimport type { PropsWithChildren } from 'react';\n\nimport { useQueueManager } from '@rango-dev/queue-manager-rango-preset';\nimport { useWallets } from '@rango-dev/wallets-react';\nimport { isEvmBlockchain } from 'rango-types';\nimport React, { useEffect, useRef } from 'react';\nimport { MemoryRouter, useInRouterContext } from 'react-router';\nimport { useLocation, useNavigate } from 'react-router-dom';\n\nimport { navigationRoutes } from '../constants/navigationRoutes';\nimport { Home } from '../pages/Home';\nimport { useMetaStore } from '../store/meta';\n\nimport { UpdateUrl } from './UpdateUrl';\n\nfunction Route(props: PropsWithChildren) {\n const location = useLocation();\n const navigate = useNavigate();\n const ref = useRef(true);\n\n useEffect(() => {\n if (\n location.pathname === '/' + navigationRoutes.confirmSwap &&\n ref.current\n ) {\n navigate(navigationRoutes.home + location.search, { state: 'redirect' });\n }\n\n ref.current = false;\n }, []);\n\n if (location.pathname === '/' + navigationRoutes.confirmSwap && ref.current) {\n return <Home />;\n }\n\n return <> {props.children}</>;\n}\n\nexport function AppRouter({\n children,\n ...props\n}: PropsWithChildren & {\n lastConnectedWallet: string;\n disconnectedWallet: WalletType | undefined;\n clearDisconnectedWallet: () => void;\n}) {\n const isRouterInContext = useInRouterContext();\n const Router = isRouterInContext ? Route : MemoryRouter;\n const { blockchains } = useMetaStore.use.meta();\n const { canSwitchNetworkTo } = useWallets();\n\n const evmChains = blockchains.filter(isEvmBlockchain);\n\n useQueueManager({\n lastConnectedWallet: props.lastConnectedWallet,\n clearDisconnectedWallet: props.clearDisconnectedWallet,\n disconnectedWallet: props.disconnectedWallet,\n evmChains,\n canSwitchNetworkTo,\n });\n\n return (\n <>\n <Router>{children}</Router>\n {isRouterInContext && <UpdateUrl />}\n </>\n );\n}\n", "export const navigationRoutes = {\n home: '/',\n fromSwap: 'from-swap',\n fromBlockchain: '/from-swap/blockchains',\n toBlockchain: '/to-swap/blockchains',\n toSwap: 'to-swap',\n settings: 'settings',\n liquiditySources: '/settings/liquidity-sources',\n themes: '/settings/themes',\n bridges: '/settings/bridges',\n exchanges: '/settings/exchanges',\n languages: '/settings/languages',\n swaps: 'swaps',\n wallets: 'wallets',\n confirmSwap: 'confirm-swap',\n swapDetails: 'swaps/:requestId',\n};\n", "import type { SwapResult } from 'rango-sdk';\n\nimport { i18n } from '@lingui/core';\nimport {\n Alert,\n BestRoute,\n BestRouteSkeleton,\n Button,\n Divider,\n styled,\n SwapInput,\n Typography,\n WarningIcon,\n} from '@rango-dev/ui';\nimport React, { useEffect, useRef, useState } from 'react';\nimport { useNavigate } from 'react-router-dom';\n\nimport { HomeButtons } from '../components/HeaderButtons';\nimport { Layout } from '../components/Layout';\nimport { NoRoutes } from '../components/NoRoutes';\nimport { RouteErrors } from '../components/RouteErrors';\nimport { SwitchFromAndToButton } from '../components/SwitchFromAndTo';\nimport { errorMessages } from '../constants/errors';\nimport { navigationRoutes } from '../constants/navigationRoutes';\nimport {\n BALANCE_MAX_DECIMALS,\n BALANCE_MIN_DECIMALS,\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 { useSwapInput } from '../hooks/useSwapInput';\nimport { useBestRouteStore } from '../store/bestRoute';\nimport { useMetaStore } from '../store/meta';\nimport { useUiStore } from '../store/ui';\nimport { useWalletsStore } from '../store/wallets';\nimport { ButtonState } from '../types';\nimport {\n numberToString,\n secondsToString,\n totalArrivalTime,\n} from '../utils/numbers';\nimport { getFormattedBestRoute, getPriceImpactLevel } from '../utils/routing';\nimport {\n canComputePriceImpact,\n getOutputRatio,\n getPercentageChange,\n getSwapButtonState,\n getTotalFeeInUsd,\n hasLimitError,\n LimitErrorMessage,\n outputRatioHasWarning,\n} from '../utils/swap';\nimport { getBalanceFromWallet } from '../utils/wallets';\n\nconst Container = styled('div', {\n display: 'flex',\n flexDirection: 'column',\n overflowY: 'visible',\n});\n\nconst FromContainer = styled('div', {\n position: 'relative',\n});\n\nconst InputsContainer = styled('div', {\n display: 'flex',\n flexDirection: 'column',\n gap: 5,\n alignSelf: 'stretch',\n});\n\nconst BestRouteContainer = styled('div', {\n width: '100%',\n paddingTop: '$2',\n});\n\nconst FooterStepAlarm = styled('div', {\n paddingBottom: '$15',\n});\n\nconst FooterAlert = styled('div', {\n width: '100%',\n display: 'flex',\n});\n\nexport function Home() {\n const navigate = useNavigate();\n const {\n fetch: refetchBestRoute,\n loading: fetchingBestRoute,\n error: bestRouteError,\n } = useSwapInput();\n const {\n fromToken,\n fromBlockchain,\n toToken,\n toBlockchain,\n setInputAmount,\n inputAmount,\n inputUsdValue,\n outputAmount,\n outputUsdValue,\n bestRoute,\n resetRouteWallets,\n } = useBestRouteStore();\n\n const {\n meta: { tokens },\n loadingStatus: loadingMetaStatus,\n } = useMetaStore();\n\n const connectedWallets = useWalletsStore.use.connectedWallets();\n const setCurrentPage = useUiStore.use.setCurrentPage();\n const [openWarningModal, setOpenWarningModal] = useState(false);\n const {\n fromAmountRangeError,\n swap: swapHasError,\n recommendation,\n } = LimitErrorMessage(bestRoute);\n const layoutRef = useRef<HTMLDivElement>(null);\n\n const showBestRoute =\n !!Number(inputAmount) &&\n (!!bestRoute || fetchingBestRoute || !!bestRouteError);\n\n const needsToWarnEthOnPath = false;\n\n const outToInRatio = getOutputRatio(inputUsdValue, outputUsdValue);\n const highValueLoss = outputRatioHasWarning(inputUsdValue, outToInRatio);\n\n const priceImpactInputCanNotBeComputed = !canComputePriceImpact(\n bestRoute,\n inputAmount,\n inputUsdValue\n );\n\n const priceImpactOutputCanNotBeComputed = !canComputePriceImpact(\n bestRoute,\n inputAmount,\n outputUsdValue\n );\n const swapButtonState = getSwapButtonState(\n loadingMetaStatus,\n connectedWallets,\n fetchingBestRoute,\n bestRoute,\n hasLimitError(bestRoute),\n highValueLoss,\n priceImpactInputCanNotBeComputed || priceImpactOutputCanNotBeComputed,\n needsToWarnEthOnPath,\n inputAmount\n );\n\n const tokenBalance =\n !!fromBlockchain && !!fromToken\n ? numberToString(\n getBalanceFromWallet(\n connectedWallets,\n fromBlockchain?.name,\n fromToken?.symbol,\n fromToken?.address\n )?.amount || '0',\n BALANCE_MIN_DECIMALS,\n BALANCE_MAX_DECIMALS\n )\n : '0';\n\n const tokenBalanceReal =\n !!fromBlockchain && !!fromToken\n ? numberToString(\n getBalanceFromWallet(\n connectedWallets,\n fromBlockchain?.name,\n fromToken?.symbol,\n fromToken?.address\n )?.amount || '0',\n getBalanceFromWallet(\n connectedWallets,\n fromBlockchain?.name,\n fromToken?.symbol,\n fromToken?.address\n )?.decimal\n )\n : '0';\n\n useEffect(() => {\n setCurrentPage(navigationRoutes.home);\n resetRouteWallets();\n return setCurrentPage.bind(null, '');\n }, []);\n\n const percentageChange =\n !inputUsdValue || !outputUsdValue || !outputUsdValue.gt(0)\n ? null\n : getPercentageChange(\n inputUsdValue.toNumber(),\n outputUsdValue.toNumber()\n );\n\n const getBestRouteSteps = (swaps: SwapResult[]) => {\n return swaps.map((swap, index) => ({\n swapper: { displayName: swap.swapperId, image: swap.swapperLogo },\n from: {\n token: { displayName: swap.from.symbol, image: swap.from.logo },\n chain: {\n displayName: swap.from.blockchain,\n image: swap.from.blockchainLogo,\n },\n price: {\n value:\n index === 0\n ? numberToString(\n inputAmount,\n TOKEN_AMOUNT_MIN_DECIMALS,\n TOKEN_AMOUNT_MAX_DECIMALS\n )\n : swap.fromAmount,\n },\n },\n to: {\n token: { displayName: swap.to.symbol, image: swap.to.logo },\n chain: {\n displayName: swap.to.blockchain,\n image: swap.to.blockchainLogo,\n },\n price: {\n value: swap.toAmount,\n },\n },\n alerts:\n swap.swapperId === swapHasError?.swapperId ? (\n <FooterStepAlarm>\n <Alert\n type=\"error\"\n title={recommendation}\n footer={\n <FooterAlert>\n <Typography size=\"xsmall\" variant=\"body\" color=\"neutral900\">\n {fromAmountRangeError}\n </Typography>\n <Divider direction=\"horizontal\" size={8} />\n <Typography size=\"xsmall\" variant=\"body\" color=\"neutral900\">\n |\n </Typography>\n <Divider direction=\"horizontal\" size={8} />\n <Typography size=\"xsmall\" variant=\"body\" color=\"neutral900\">\n {`Yours: ${numberToString(\n swapHasError?.fromAmount || null,\n TOKEN_AMOUNT_MIN_DECIMALS,\n TOKEN_AMOUNT_MAX_DECIMALS\n )} ${swap?.from.symbol}`}\n </Typography>\n </FooterAlert>\n }\n />\n </FooterStepAlarm>\n ) : undefined,\n }));\n };\n\n const totalFeeInUsd = getTotalFeeInUsd(bestRoute, tokens);\n\n const bestRouteData = getFormattedBestRoute(bestRoute);\n\n return (\n <Layout\n ref={layoutRef}\n fixedHeight={false}\n hasLogo\n footer={\n <Button\n type=\"primary\"\n size=\"large\"\n disabled={swapButtonState.disabled}\n prefix={\n !swapButtonState.disabled &&\n swapButtonState.hasWarning && <WarningIcon />\n }\n fullWidth\n onClick={() => {\n if (swapButtonState.state === ButtonState.WAITFORCONNECTING) {\n navigate(navigationRoutes.wallets);\n } else if (swapButtonState.state === ButtonState.NEEDTOCONFIRM) {\n setOpenWarningModal(true);\n } else {\n navigate(navigationRoutes.confirmSwap);\n }\n }}>\n {swapButtonState.title}\n </Button>\n }\n header={{\n hasConnectWallet: true,\n title: i18n.t('Swap'),\n suffix: (\n <HomeButtons\n layoutRef={layoutRef.current}\n onClickRefresh={\n !!bestRoute || bestRouteError ? refetchBestRoute : undefined\n }\n onClickHistory={() => navigate(navigationRoutes.swaps)}\n onClickSettings={() => navigate(navigationRoutes.settings)}\n />\n ),\n }}>\n <Container>\n <InputsContainer>\n <FromContainer>\n <SwapInput\n label=\"From\"\n onInputChange={setInputAmount}\n balance={tokenBalance}\n chain={{\n displayName: fromBlockchain?.displayName || '',\n image: fromBlockchain?.logo || '',\n }}\n token={{\n displayName: fromToken?.symbol || '',\n image: fromToken?.image || '',\n }}\n onClickToken={() => navigate('from-swap')}\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 error: priceImpactInputCanNotBeComputed\n ? errorMessages.unknownPriceError.impactTitle\n : undefined,\n }}\n disabled={loadingMetaStatus === 'failed'}\n loading={loadingMetaStatus === 'loading'}\n onSelectMaxBalance={() => {\n if (tokenBalance !== '0') {\n setInputAmount(tokenBalanceReal.split(',').join(''));\n }\n }}\n />\n <SwitchFromAndToButton />\n </FromContainer>\n <SwapInput\n sharpBottomStyle={!!bestRoute?.result || fetchingBestRoute}\n label=\"To\"\n chain={{\n displayName: toBlockchain?.displayName || '',\n image: toBlockchain?.logo || '',\n }}\n token={{\n displayName: toToken?.symbol || '',\n image: toToken?.image || '',\n }}\n percentageChange={\n !!percentageChange?.lt(0)\n ? numberToString(\n percentageChange,\n PERCENTAGE_CHANGE_MIN_DECIMALS,\n PERCENTAGE_CHANGE_MAX_DECIMALS\n )\n : null\n }\n warningLevel={getPriceImpactLevel(\n percentageChange?.toNumber() ?? 0\n )}\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 error: priceImpactOutputCanNotBeComputed\n ? errorMessages.unknownPriceError.impactTitle\n : undefined,\n }}\n onClickToken={() => navigate('to-swap')}\n disabled={loadingMetaStatus === 'failed'}\n loading={loadingMetaStatus === 'loading'}\n />\n </InputsContainer>\n {fetchingBestRoute && (\n <BestRouteContainer>\n <BestRouteSkeleton type=\"basic\" />\n </BestRouteContainer>\n )}\n {showBestRoute &&\n !fetchingBestRoute &&\n bestRouteData?.result?.swaps?.length ? (\n <BestRouteContainer>\n <BestRoute\n type=\"basic\"\n recommended={true}\n input={{\n value: numberToString(\n inputAmount,\n TOKEN_AMOUNT_MIN_DECIMALS,\n TOKEN_AMOUNT_MAX_DECIMALS\n ),\n usdValue: numberToString(\n inputUsdValue,\n USD_VALUE_MIN_DECIMALS,\n USD_VALUE_MAX_DECIMALS\n ),\n }}\n output={{\n value: numberToString(\n outputAmount,\n TOKEN_AMOUNT_MIN_DECIMALS,\n TOKEN_AMOUNT_MAX_DECIMALS\n ),\n usdValue: numberToString(\n outputUsdValue,\n USD_VALUE_MIN_DECIMALS,\n USD_VALUE_MAX_DECIMALS\n ),\n }}\n steps={getBestRouteSteps(bestRouteData.result.swaps)}\n percentageChange={numberToString(\n percentageChange,\n PERCENTAGE_CHANGE_MIN_DECIMALS,\n PERCENTAGE_CHANGE_MAX_DECIMALS\n )}\n totalFee={numberToString(\n totalFeeInUsd,\n GAS_FEE_MIN_DECIMALS,\n GAS_FEE_MAX_DECIMALS\n )}\n totalTime={secondsToString(totalArrivalTime(bestRoute))}\n />\n </BestRouteContainer>\n ) : showBestRoute && !fetchingBestRoute ? (\n <>\n <Divider size={20} />\n <NoRoutes\n diagnosisMessage={bestRouteData?.diagnosisMessages?.[0]}\n fetch={refetchBestRoute}\n error={!!bestRouteError}\n />\n </>\n ) : null}\n </Container>\n <RouteErrors\n openModal={openWarningModal}\n onToggle={setOpenWarningModal}\n totalFeeInUsd={totalFeeInUsd}\n outputUsdValue={outputUsdValue}\n inputUsdValue={inputUsdValue}\n percentageChange={percentageChange}\n highValueLoss={highValueLoss}\n priceImpactCanNotBeComputed={\n priceImpactInputCanNotBeComputed || priceImpactOutputCanNotBeComputed\n }\n loading={fetchingBestRoute || loadingMetaStatus === 'loading'}\n extraSpace={!!bestRoute?.result || !bestRoute}\n />\n </Layout>\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 variant=\"ghost\" size=\"small\" onClick={props.onClick}>\n <ChevronLeftIcon color=\"black\" size={16} />\n </HeaderButton>\n );\n}\n\nexport { BackButton };\n", "import { 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});\n\nexport const ConnectedIcon = styled('div', {\n position: 'absolute',\n background: '$secondary500',\n [`.${darkTheme} &`]: {\n $$color: '$colors$secondary400',\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 width: '$40',\n});\n\nexport const NotificationsBadgeContainer = styled('div', {\n position: 'absolute',\n backgroundColor: '$secondary500',\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});\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 variant=\"ghost\" onClick={props.onClick} 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 { Tooltip, WalletIcon } from '@rango-dev/ui';\nimport React from 'react';\n\nimport { ConnectedIcon, HeaderButton } from './HeaderButtons.styles';\n\nfunction WalletButton(props: PropTypes) {\n return (\n <Tooltip\n container={props.container}\n side=\"top\"\n content={i18n.t('Connect Wallet')}>\n <HeaderButton variant=\"ghost\" size=\"small\" 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 { HomeButtonsPropTypes } from './HeaderButtons.types';\n\nimport { i18n } from '@lingui/core';\nimport {\n NotificationsIcon,\n Popover,\n RefreshIcon,\n SettingsIcon,\n Tooltip,\n TransactionIcon,\n} from '@rango-dev/ui';\nimport React from 'react';\n\nimport { getContainer } from '../../utils/common';\nimport { NotificationContent } from '../NotificationContent';\n\nimport { HeaderButton } from './HeaderButtons.styles';\nimport { UnreadNotificationsBadge } from './UnreadNotificationsBadge';\n\nexport function HomeButtons(props: HomeButtonsPropTypes) {\n const {\n layoutRef,\n onClickRefresh,\n onClickHistory,\n onClickSettings,\n onClickNotifications,\n } = props;\n\n return (\n <>\n <Tooltip\n container={getContainer()}\n side=\"top\"\n content={i18n.t('Refresh')}>\n <HeaderButton\n variant=\"ghost\"\n size=\"small\"\n onClick={onClickRefresh}\n disabled={!onClickRefresh}>\n <RefreshIcon size={16} color={!onClickRefresh ? 'gray' : 'black'} />\n </HeaderButton>\n </Tooltip>\n\n <Tooltip\n container={getContainer()}\n side=\"top\"\n content={i18n.t('Notifications')}>\n <Popover\n align=\"center\"\n collisionBoundary={layoutRef}\n collisionPadding={{ right: 20, left: 20 }}\n container={getContainer()}\n content={<NotificationContent />}>\n <HeaderButton\n size=\"small\"\n variant=\"ghost\"\n onClick={onClickNotifications}>\n <NotificationsIcon size={18} color=\"black\" />\n <UnreadNotificationsBadge />\n </HeaderButton>\n </Popover>\n </Tooltip>\n <Tooltip\n container={getContainer()}\n side=\"top\"\n content={i18n.t('Settings')}>\n <HeaderButton size=\"small\" variant=\"ghost\" onClick={onClickSettings}>\n <SettingsIcon size={18} color=\"black\" />\n </HeaderButton>\n </Tooltip>\n <Tooltip\n container={getContainer()}\n side=\"top\"\n content={i18n.t('Transactions History')}>\n <HeaderButton size=\"small\" variant=\"ghost\" onClick={onClickHistory}>\n <TransactionIcon size={18} color=\"black\" />\n </HeaderButton>\n </Tooltip>\n </>\n );\n}\n", "/* eslint-disable @typescript-eslint/no-magic-numbers */\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// eslint-disable-next-line @typescript-eslint/ban-types\nexport function debounce(fn: Function, time: number) {\n let timeoutId: ReturnType<typeof setTimeout> | null;\n return wrapper;\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 // eslint-disable-next-line @typescript-eslint/no-magic-numbers\n return text.toLowerCase().indexOf(searchText.toLowerCase()) > -1;\n}\n\nexport const colorShade = (col: string, amt: number) => {\n col = col.replace(/^#/, '');\n if (col.length === 3) {\n col = col[0] + col[0] + col[1] + col[1] + col[2] + col[2];\n }\n let [r, g, b]: any = col.match(/.{2}/g);\n [r, g, b] = [\n parseInt(r, 16) + amt,\n parseInt(g, 16) + amt,\n parseInt(b, 16) + amt,\n ];\n\n r = Math.max(Math.min(255, r), 0).toString(16);\n g = Math.max(Math.min(255, g), 0).toString(16);\n b = Math.max(Math.min(255, b), 0).toString(16);\n\n const rr = (r.length < 2 ? '0' : '') + r;\n const gg = (g.length < 2 ? '0' : '') + g;\n const bb = (b.length < 2 ? '0' : '') + b;\n\n return `#${rr}${gg}${bb}`;\n};\n\nexport const generateRangeColors = (name: string, color: string) => {\n let colors = { [name]: color };\n for (let i = 1; i < 10; i++) {\n if (i < 5) {\n colors = {\n ...colors,\n [name + i * 100]: colorShade(color, (5 - i) * 32),\n };\n }\n if (i === 5) {\n colors = {\n ...colors,\n [name + i * 100]: color,\n };\n }\n if (i > 5) {\n colors = {\n ...colors,\n [name + i * 100]: colorShade(color, -((i - 5) * 32)),\n };\n }\n }\n return colors;\n};\n\nexport const getContainer = () =>\n document.getElementById('swap-box') as HTMLElement;\n", "import type { Notification } from '../../types/notification';\n\nimport {\n ChainToken,\n ChevronRightIcon,\n ListItemButton,\n Typography,\n} from '@rango-dev/ui';\nimport React from 'react';\nimport { useNavigate } from 'react-router-dom';\n\nimport { useMetaStore } from '../../store/meta';\nimport { useNotificationStore } from '../../store/notification';\nimport { useUiStore } from '../../store/ui';\n\nimport { Container, Images, List } from './NotificationContent.styles';\nimport { NotificationNotFound } from './NotificationNotFound';\n\nconst MAX_NOTIFICATIONS_DISPLAYED = 4;\n\nexport function NotificationContent() {\n const navigate = useNavigate();\n const setSelectedSwap = useUiStore.use.setSelectedSwap();\n\n const { getUnreadNotifications } = useNotificationStore();\n\n const notifications: Notification[] = getUnreadNotifications();\n const { tokens, blockchains } = useMetaStore.use.meta();\n const sortedNotification = notifications\n .sort((a, b) => b.creationTime - a.creationTime)\n .slice(0, MAX_NOTIFICATIONS_DISPLAYED);\n\n const handleOnClick = (requestId: Notification['requestId']) => {\n setSelectedSwap(requestId);\n navigate(`/swaps/${requestId}`);\n };\n\n return (\n <Container>\n {sortedNotification.length ? (\n <List>\n {sortedNotification.map((notificationItem) => {\n const fromToken = tokens.find(\n (tokenItem) =>\n tokenItem.address ===\n notificationItem.route.from.tokenAddress &&\n tokenItem.blockchain ===\n notificationItem.route.from.blockchain &&\n tokenItem.symbol === notificationItem.route.from.tokenSymbol\n );\n\n const fromBlockchain = blockchains.find(\n (blockchainItem) =>\n blockchainItem.name === notificationItem.route.from.blockchain\n );\n\n const toToken = tokens.find(\n (tokenItem) =>\n tokenItem.address === notificationItem.route.to.tokenAddress &&\n tokenItem.blockchain === notificationItem.route.to.blockchain &&\n tokenItem.symbol === notificationItem.route.to.tokenSymbol\n );\n\n const toBlockchain = blockchains.find(\n (blockchainItem) =>\n blockchainItem.name === notificationItem.route.to.blockchain\n );\n\n return (\n <ListItemButton\n key={notificationItem.requestId}\n onClick={() => handleOnClick(notificationItem.requestId)}\n title={\n <Typography variant=\"body\" size=\"small\" color=\"$neutral900\">\n {notificationItem.event.message}\n </Typography>\n }\n id={notificationItem.requestId}\n start={\n <Images>\n <div className=\"from-chain-token\">\n <ChainToken\n tokenImage={fromToken ? fromToken.image : ''}\n chainImage={fromBlockchain ? fromBlockchain.logo : ''}\n size=\"small\"\n />\n </div>\n <div className=\"to-chain-token\">\n <ChainToken\n tokenImage={toToken ? toToken.image : ''}\n chainImage={toBlockchain ? toBlockchain.logo : ''}\n size=\"small\"\n />\n </div>\n </Images>\n }\n end={<ChevronRightIcon size={12} color=\"gray\" />}\n />\n );\n })}\n </List>\n ) : (\n <NotificationNotFound />\n )}\n </Container>\n );\n}\n", "import type { TokenWithBalance } from '../components/TokenList';\nimport type { MetaResponse } from 'rango-sdk';\n\nimport { create } from 'zustand';\n\nimport { httpService } from '../services/httpService';\nimport { removeDuplicateFrom } from '../utils/common';\nimport { getTokensWithBalance, sortTokens } from '../utils/wallets';\n\nimport createSelectors from './selectors';\nimport { useWalletsStore } from './wallets';\n\nexport type LoadingStatus = 'loading' | 'success' | 'failed';\n\nexport interface MetaState {\n meta: MetaResponse & { tokens: TokenWithBalance[] };\n loadingStatus: LoadingStatus;\n fetchMeta: () => Promise<void>;\n setTokensWithBalance: () => void;\n}\n\nexport const useMetaStore = createSelectors(\n create<MetaState>()((set) => ({\n meta: { blockchains: [], popularTokens: [], swappers: [], tokens: [] },\n loadingStatus: 'loading',\n setTokensWithBalance: () => {\n const connectedWallets = useWalletsStore.getState().connectedWallets;\n\n set((state) => ({\n ...state,\n meta: {\n ...state.meta,\n tokens: sortTokens(\n getTokensWithBalance(state.meta.tokens, connectedWallets)\n ),\n },\n }));\n },\n fetchMeta: async () => {\n try {\n const response = await httpService().getAllMetadata();\n const chainThatHasTokenInMetaResponse = removeDuplicateFrom(\n response.tokens.map((t) => t.blockchain)\n );\n const enabledChains = response.blockchains.filter(\n (chain) =>\n chain.enabled &&\n chainThatHasTokenInMetaResponse.includes(chain.name)\n );\n response.blockchains = enabledChains.sort((a, b) => a.sort - b.sort);\n set({ meta: response, loadingStatus: 'success' });\n } catch (error) {\n set({ loadingStatus: 'failed' });\n }\n },\n }))\n);\n", "import { RangoClient } from 'rango-sdk';\nimport { getConfig } from '../utils/configs';\n\n// this API key is limited and\n// it is only for test purpose\nexport const RANGO_PUBLIC_API_KEY = 'c6381a79-2817-4602-83bf-6a641a409e32';\n\nlet rango: RangoClient | undefined = undefined;\n\nexport const httpService = () => {\n if (rango) return rango;\n rango = new RangoClient(getConfig('API_KEY'));\n return rango;\n};\n", "export interface Configs {\n API_KEY: string;\n}\n\nconst RANGO_PUBLIC_API_KEY = 'c6381a79-2817-4602-83bf-6a641a409e32';\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\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", "import type { TokenWithBalance } from '../components/TokenList';\nimport type { ConnectedWallet, TokenBalance } from '../store/wallets';\nimport type { Wallet } from '../types';\nimport type { WalletInfo as ModalWalletInfo } from '@rango-dev/ui';\nimport type {\n Network,\n WalletInfo,\n WalletState,\n WalletType,\n WalletTypes,\n} from '@rango-dev/wallets-shared';\nimport type {\n BestRouteResponse,\n BlockchainMeta,\n Token,\n WalletDetail,\n} from 'rango-sdk';\n\nimport { WalletState as WalletStatus } from '@rango-dev/ui';\nimport { readAccountAddress } from '@rango-dev/wallets-react';\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 { EXCLUDED_WALLETS } from '../constants/wallets';\n\nimport { numberToString } from './numbers';\n\nexport function mapStatusToWalletState(state: WalletState): WalletStatus {\n switch (true) {\n case state.connected:\n return WalletStatus.CONNECTED;\n case state.connecting:\n return WalletStatus.CONNECTING;\n case !state.installed:\n return WalletStatus.NOT_INSTALLED;\n default:\n return WalletStatus.DISCONNECTED;\n }\n}\n\nexport function mapWalletTypesToWalletInfo(\n getState: (type: WalletType) => WalletState,\n getWalletInfo: (type: WalletType) => WalletInfo,\n list: WalletType[],\n chain?: string\n): ModalWalletInfo[] {\n return list\n .filter((wallet) => !EXCLUDED_WALLETS.includes(wallet as WalletTypes))\n .filter((wallet) => {\n if (chain) {\n const { supportedChains } = getWalletInfo(wallet);\n return !!supportedChains.find(\n (supportedChain) => supportedChain.name === chain\n );\n }\n return true;\n })\n .map((type) => {\n const { name, img: image, installLink } = getWalletInfo(type);\n const state = mapStatusToWalletState(getState(type));\n return {\n title: name,\n image,\n link: detectInstallLink(installLink),\n state,\n type,\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): Wallet[] {\n const result: Wallet[] = [];\n\n function addAccount(network: Network, address: string) {\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 };\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 /*\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((chain) =>\n 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 } else {\n addAccount(network, address);\n }\n });\n\n return result;\n}\n\nexport function getRequiredChains(route: BestRouteResponse | null) {\n const wallets: string[] = [];\n\n route?.result?.swaps.forEach((swap) => {\n const currentStepFromBlockchain = swap.from.blockchain;\n const currentStepToBlockchain = swap.to.blockchain;\n if (!wallets.includes(currentStepFromBlockchain)) {\n wallets.push(currentStepFromBlockchain);\n }\n if (!wallets.includes(currentStepToBlockchain)) {\n wallets.push(currentStepToBlockchain);\n }\n\n // Check if internalSwaps array exists\n if (swap.internalSwaps && Array.isArray(swap.internalSwaps)) {\n swap.internalSwaps.forEach((internalSwap) => {\n const internalStepFromBlockchain = internalSwap.from.blockchain;\n const internalStepToBlockchain = internalSwap.to.blockchain;\n if (!wallets.includes(internalStepFromBlockchain)) {\n wallets.push(internalStepFromBlockchain);\n }\n if (!wallets.includes(internalStepToBlockchain)) {\n wallets.push(internalStepToBlockchain);\n }\n });\n }\n });\n return wallets;\n}\n\ntype Blockchain = { name: string; accounts: ConnectedWallet[] };\n\nexport function getSelectableWallets(\n connectedWallets: ConnectedWallet[],\n getWalletInfo: (type: WalletType) => WalletInfo,\n destinationChain?: string\n): Wallet[] {\n const selectableWallets = connectedWallets.map(\n (connectedWallet: ConnectedWallet) => {\n return {\n address: connectedWallet.address,\n walletType: connectedWallet.walletType,\n chain: connectedWallet.chain,\n image: getWalletInfo(connectedWallet.walletType).img,\n name: getWalletInfo(connectedWallet.walletType).name,\n selected:\n destinationChain === connectedWallet.chain\n ? false\n : connectedWallet.selected,\n };\n }\n );\n\n return selectableWallets;\n}\n\nexport function getBalanceFromWallet(\n connectedWallets: ConnectedWallet[],\n chain: string,\n symbol: string,\n address: string | null\n): TokenBalance | null {\n if (connectedWallets.length === 0) {\n return null;\n }\n\n const selectedChainWallets = connectedWallets.filter(\n (wallet) => wallet.chain === chain\n );\n if (selectedChainWallets.length === 0) {\n return null;\n }\n\n return (\n selectedChainWallets\n .map(\n (wallet) =>\n wallet.balances?.find(\n (balance) =>\n (address !== null && balance.address === address) ||\n (address === null &&\n balance.address === address &&\n balance.symbol === symbol)\n ) || null\n )\n .filter((balance) => balance !== null)\n .sort(\n (a, b) => parseFloat(b?.amount || '0') - parseFloat(a?.amount || '1')\n )\n .find(() => true) || null\n );\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 makeBalanceFor(\n retrievedBalance: WalletDetail,\n tokens: Token[]\n): TokenBalance[] {\n const { blockChain: chain, balances = [] } = retrievedBalance;\n return (\n balances?.map((tokenBalance) => ({\n chain,\n symbol: tokenBalance.asset.symbol,\n ticker: tokenBalance.asset.symbol,\n address: tokenBalance.asset.address || null,\n rawAmount: tokenBalance.amount.amount,\n decimal: tokenBalance.amount.decimals,\n amount: new BigNumber(tokenBalance.amount.amount)\n .shiftedBy(-tokenBalance.amount.decimals)\n .toFixed(),\n logo: '',\n usdPrice:\n getUsdPrice(\n chain,\n tokenBalance.asset.symbol,\n tokenBalance.asset.address,\n tokens\n ) || null,\n })) || []\n );\n}\n\nexport function resetConnectedWalletState(\n connectedWallet: ConnectedWallet\n): ConnectedWallet {\n return { ...connectedWallet, loading: false, error: true };\n}\n\nexport const calculateWalletUsdValue = (connectedWallet: ConnectedWallet[]) => {\n const uniqueAccountAddresses = new Set<string | null>();\n const uniqueBalance: ConnectedWallet[] = connectedWallet?.reduce(\n (acc: ConnectedWallet[], current: ConnectedWallet) => {\n return acc.findIndex(\n (i) => i.address === current.address && i.chain === current.chain\n // eslint-disable-next-line @typescript-eslint/no-magic-numbers\n ) === -1\n ? [...acc, current]\n : acc;\n },\n []\n );\n\n const modifiedWalletBlockchains = uniqueBalance?.map((chain) => {\n const modifiedWalletBlockchain: Blockchain = {\n name: chain.chain,\n accounts: [],\n };\n if (!uniqueAccountAddresses.has(chain.address)) {\n uniqueAccountAddresses.add(chain.address);\n }\n uniqueAccountAddresses.forEach((accountAddress) => {\n if (chain.address === accountAddress) {\n modifiedWalletBlockchain.accounts.push(chain);\n }\n });\n return modifiedWalletBlockchain;\n });\n const total = numberToString(\n modifiedWalletBlockchains\n ?.flatMap((b) => b.accounts)\n ?.flatMap((a) => a?.balances)\n ?.map((b) =>\n new BigNumber(b?.amount || ZERO).multipliedBy(b?.usdPrice || 0)\n )\n ?.reduce((a, b) => a.plus(b), ZERO) || ZERO\n ).toString();\n\n return numberWithThousandSeparator(total);\n};\n\nfunction numberWithThousandSeparator(number: string | number): string {\n const parts = number.toString().split('.');\n parts[0] = parts[0].replace(/\\B(?=(\\d{3})+(?!\\d))/g, ',');\n return parts.join('.');\n}\n\nexport const sortTokens = (tokens: TokenWithBalance[]): TokenWithBalance[] => {\n const walletConnected = !!tokens.some((token) => token.balance);\n if (!walletConnected) {\n return tokens\n .filter((token) => !token.address)\n .concat(\n tokens.filter((token) => token.address && !token.isSecondaryCoin),\n tokens.filter((token) => token.isSecondaryCoin)\n );\n }\n\n return tokens\n .filter((token) => !!token.balance)\n .sort(\n (tokenA, tokenB) =>\n parseFloat(tokenB.balance?.usdValue || '0') -\n parseFloat(tokenA.balance?.usdValue || '0')\n )\n .concat(\n tokens.filter((token) => !token.balance && !token.isSecondaryCoin),\n tokens.filter((token) => !token.balance && token.isSecondaryCoin)\n );\n};\n\nexport const getUsdPrice = (\n blockchain: string,\n symbol: string,\n address: string | null,\n allTokens: Token[]\n): number | null => {\n const token = allTokens?.find(\n (t) =>\n t.blockchain === blockchain &&\n t.symbol?.toUpperCase() === symbol?.toUpperCase() &&\n t.address === address\n );\n return token?.usdPrice || null;\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\nexport function getTokensWithBalance(\n tokens: TokenWithBalance[],\n connectedWallets: ConnectedWallet[]\n): TokenWithBalance[] {\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n return tokens.map(({ balance, ...otherProps }) => {\n const tokenAmount = numberToString(\n new BigNumber(\n getBalanceFromWallet(\n connectedWallets,\n otherProps.blockchain,\n otherProps.symbol,\n otherProps.address\n )?.amount || ZERO\n )\n );\n\n let tokenUsdValue = '';\n if (otherProps.usdPrice) {\n tokenUsdValue = numberToString(\n new BigNumber(\n getBalanceFromWallet(\n connectedWallets,\n otherProps.blockchain,\n otherProps.symbol,\n otherProps.address\n )?.amount || ZERO\n ).multipliedBy(otherProps.usdPrice)\n );\n }\n\n return {\n ...otherProps,\n ...(tokenAmount !== '0' && {\n balance: { amount: tokenAmount, usdValue: tokenUsdValue },\n }),\n };\n });\n}\n\nexport function getSortedTokens(\n chain: BlockchainMeta | null,\n tokens: Token[],\n connectedWallets: ConnectedWallet[],\n otherChainTokens: TokenWithBalance[]\n): TokenWithBalance[] {\n const fromChainEqualsToToBlockchain =\n chain?.name === otherChainTokens[0]?.name;\n if (fromChainEqualsToToBlockchain) {\n return otherChainTokens;\n }\n const filteredTokens = tokens.filter(\n (token) => token.blockchain === chain?.name\n );\n return sortTokens(getTokensWithBalance(filteredTokens, connectedWallets));\n}\n\nexport function tokensAreEqual(\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 === tokenB?.symbol &&\n tokenA?.address === tokenB?.address\n );\n}\n\nexport function getDefaultToken(\n sortedTokens: TokenWithBalance[],\n otherToken: TokenWithBalance | null\n): TokenWithBalance {\n let selectedToken: TokenWithBalance;\n const firstToken = sortedTokens[0];\n const secondToken = sortedTokens[1];\n if (sortedTokens.length === 1) {\n selectedToken = firstToken;\n } else if (tokensAreEqual(firstToken, otherToken)) {\n selectedToken = secondToken;\n } else {\n selectedToken = firstToken;\n }\n return selectedToken;\n}\n\nexport function sortWalletsBasedOnConnectionState(\n wallets: ModalWalletInfo[]\n): ModalWalletInfo[] {\n return wallets.sort(\n (a, b) =>\n Number(b.state === WalletStatus.CONNECTED) -\n Number(a.state === WalletStatus.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", "import BigNumber from 'bignumber.js';\n\nexport const ZERO = new BigNumber(0);\n", "import { WalletTypes } from '@rango-dev/wallets-shared';\n\nexport const EXCLUDED_WALLETS = [WalletTypes.LEAP];\n", "/* eslint-disable @typescript-eslint/no-magic-numbers */\n\nimport type { BestRouteResponse } from 'rango-sdk';\n\nimport { BigNumber } from 'bignumber.js';\n\nexport const percentToString = (p: number, fractions = 0): string =>\n (p * 100).toFixed(fractions);\n\nexport const secondsToString = (s: number): string => {\n const seconds = (s % 60).toString().padStart(2, '0');\n const minutes = parseInt((s / 60).toString())\n .toString()\n .padStart(2, '0');\n return `${minutes}:${seconds}`;\n};\n\nexport const numberToString = (\n number: BigNumber | string | 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 convertBigNumberToHex = (\n value: BigNumber,\n decimals: number\n): string => {\n return '0x' + value.shiftedBy(decimals).toString(16);\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 function dollarToConciseString(num: number | undefined): string {\n if (!num) {\n return '-';\n }\n if (num < 1) {\n return ' < 1$';\n }\n if (num < 1000) {\n return numberToString(new BigNumber(num)) + '$';\n }\n if (num < 10_000) {\n return parseInt((num / 100).toString()) / 10 + 'K';\n }\n if (num < 1_000_000) {\n return parseInt((num / 1000).toString()) + 'K';\n }\n if (num < 100_000_000) {\n return parseInt((num / 100000).toString()) / 10 + 'M';\n }\n return parseInt((num / 1000000).toString()) + 'M';\n}\n\nexport function removeExtraDecimals(num: string, maxDecimals: number): string {\n try {\n if (!num.includes('.')) {\n return num;\n }\n const [b, f] = num.split('.');\n if (f && f.length > maxDecimals) {\n return `${b}.${f.substring(0, maxDecimals)}`;\n }\n return num;\n } catch (e) {\n return num;\n }\n}\n\nexport const totalArrivalTime = (data: BestRouteResponse | null) =>\n data?.result?.swaps?.reduce((a, b) => a + b.estimatedTimeInSeconds, 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;\n10;\n\nexport function limitDecimalPlaces(\n numberString: string,\n maxDecimalPlaces = 4\n): string {\n const number = parseFloat(numberString);\n if (isNaN(number)) {\n return numberString;\n } // Return the original string if it's not a valid number\n\n const multiplier = Math.pow(10, maxDecimalPlaces);\n const roundedNumber = Math.round(number * multiplier) / multiplier;\n return roundedNumber.toString();\n}\n", "import { 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>>>(_store: S) => {\n let store = _store as WithSelectors<typeof _store>;\n store.use = {};\n for (let 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 { Wallet } from '../types';\nimport type { WalletType } from '@rango-dev/wallets-shared';\n\nimport { create } from 'zustand';\nimport { subscribeWithSelector } from 'zustand/middleware';\nimport { shallow } from 'zustand/shallow';\n\nimport { httpService } from '../services/httpService';\nimport {\n getTokensWithBalance,\n isAccountAndWalletMatched,\n makeBalanceFor,\n resetConnectedWalletState,\n sortTokens,\n} from '../utils/wallets';\n\nimport { useBestRouteStore } from './bestRoute';\nimport { useMetaStore } from './meta';\nimport createSelectors from './selectors';\n\nexport type TokenBalance = {\n chain: string;\n symbol: string;\n ticker: string;\n address: string | null;\n rawAmount: string;\n decimal: number | null;\n amount: string;\n logo: string | null;\n usdPrice: number | null;\n};\n\nexport interface ConnectedWallet extends Wallet {\n balances: TokenBalance[] | null;\n explorerUrl: string | null;\n selected: boolean;\n loading: boolean;\n error: boolean;\n}\n\ninterface WalletsStore {\n connectedWallets: ConnectedWallet[];\n customDestination: string;\n loading: boolean;\n connectWallet: (accounts: Wallet[]) => void;\n disconnectWallet: (walletType: WalletType) => void;\n selectWallets: (wallets: { walletType: string; chain: string }[]) => void;\n clearConnectedWallet: () => void;\n getWalletsDetails: (accounts: Wallet[], shouldRetry?: boolean) => void;\n}\n\nexport const useWalletsStore = createSelectors(\n create<WalletsStore>()(\n subscribeWithSelector((set, get) => ({\n connectedWallets: [],\n customDestination: '',\n loading: false,\n connectWallet: (accounts) => {\n const getWalletsDetails = get().getWalletsDetails;\n set((state) => ({\n loading: true,\n connectedWallets: state.connectedWallets\n .filter((wallet) => wallet.walletType !== accounts[0].walletType)\n .concat(\n accounts.map((account) => {\n const shouldMarkWalletAsSelected = !state.connectedWallets.find(\n (connectedWallet) =>\n connectedWallet.chain === account.chain &&\n connectedWallet.selected\n );\n return {\n balances: [],\n address: account.address,\n chain: account.chain,\n explorerUrl: null,\n walletType: account.walletType,\n selected: shouldMarkWalletAsSelected,\n loading: true,\n error: false,\n };\n })\n ),\n }));\n getWalletsDetails(accounts);\n },\n disconnectWallet: (walletType) => {\n set((state) => {\n const selectedWallets = state.connectedWallets\n .filter(\n (connectedWallet) =>\n connectedWallet.selected &&\n connectedWallet.walletType !== walletType\n )\n .map((selectedWallet) => selectedWallet.chain);\n return {\n connectedWallets: state.connectedWallets\n .filter(\n (connectedWallet) => connectedWallet.walletType !== walletType\n )\n .map((connectedWallet) => {\n const anyWalletSelectedForBlockchain = selectedWallets.includes(\n connectedWallet.chain\n );\n if (anyWalletSelectedForBlockchain) {\n return connectedWallet;\n }\n selectedWallets.push(connectedWallet.chain);\n return { ...connectedWallet, selected: true };\n }),\n };\n });\n },\n selectWallets: (wallets) =>\n set((state) => ({\n connectedWallets: state.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 clearConnectedWallet: () =>\n set(() => ({\n connectedWallets: [],\n selectedWallets: [],\n })),\n getWalletsDetails: async (accounts, shouldRetry = true) => {\n const getWalletsDetails = get().getWalletsDetails;\n const { tokens } = useMetaStore.getState().meta;\n set((state) => ({\n loading: true,\n connectedWallets: state.connectedWallets.map((wallet) => {\n return accounts.find((account) =>\n isAccountAndWalletMatched(account, wallet)\n )\n ? { ...wallet, loading: true }\n : wallet;\n }),\n }));\n try {\n const data = accounts.map(({ address, chain }) => ({\n address,\n blockchain: chain,\n }));\n const response = await httpService().getWalletsDetails(data);\n const retrievedBalance = response.wallets;\n if (retrievedBalance) {\n set((state) => ({\n loading: false,\n connectedWallets: state.connectedWallets.map(\n (connectedWallet) => {\n const matchedAccount = accounts.find((account) =>\n isAccountAndWalletMatched(account, connectedWallet)\n );\n const retrievedBalanceAccount = retrievedBalance.find(\n (balance) =>\n balance.address === connectedWallet.address &&\n balance.blockChain === connectedWallet.chain\n );\n if (\n retrievedBalanceAccount?.failed &&\n matchedAccount &&\n shouldRetry\n ) {\n getWalletsDetails([matchedAccount], false);\n }\n return matchedAccount && retrievedBalanceAccount\n ? {\n ...connectedWallet,\n explorerUrl: retrievedBalanceAccount.explorerUrl,\n balances: makeBalanceFor(\n retrievedBalanceAccount,\n tokens\n ),\n }\n : connectedWallet;\n }\n ),\n }));\n } else {\n throw new Error('Wallet not found');\n }\n } catch (error) {\n set((state) => ({\n loading: false,\n connectedWallets: state.connectedWallets.map((balance) => {\n return accounts.find((account) =>\n isAccountAndWalletMatched(account, balance)\n )\n ? resetConnectedWalletState(balance)\n : balance;\n }),\n }));\n }\n },\n }))\n )\n);\n\nuseWalletsStore.subscribe(\n (state) => state.connectedWallets,\n (connectedWallets) => {\n useBestRouteStore.setState(({ sourceTokens, destinationTokens }) => {\n const sourceTokensWithBalance = getTokensWithBalance(\n sourceTokens,\n connectedWallets\n );\n const destinationTokensWithBalance = getTokensWithBalance(\n destinationTokens,\n connectedWallets\n );\n return {\n sourceTokens: sortTokens(sourceTokensWithBalance),\n destinationTokens: sortTokens(destinationTokensWithBalance),\n };\n });\n },\n {\n equalityFn: shallow,\n }\n);\n\nexport const fetchingBalanceSelector = (state: WalletsStore) =>\n !!state.connectedWallets.find((wallet) => wallet.loading);\n", "import type { TokenWithBalance } from '../components/TokenList';\nimport type { Wallet } from '../types';\nimport type { PendingSwap } from '@rango-dev/queue-manager-rango-preset/dist/shared';\nimport type { BestRouteResponse, BlockchainMeta, Token } from 'rango-sdk';\n\nimport BigNumber from 'bignumber.js';\nimport { create } from 'zustand';\nimport { subscribeWithSelector } from 'zustand/middleware';\n\nimport { ZERO } from '../constants/numbers';\nimport { isPositiveNumber } from '../utils/numbers';\nimport { getBestRouteToTokenUsdPrice } from '../utils/routing';\nimport { calcOutputUsdValue } from '../utils/swap';\nimport {\n getDefaultToken,\n getSortedTokens,\n tokensAreEqual,\n} from '../utils/wallets';\n\nimport { useMetaStore } from './meta';\nimport createSelectors from './selectors';\nimport { useWalletsStore } from './wallets';\n\nconst getUsdValue = (token: Token | null, amount: string): BigNumber | null =>\n token?.usdPrice\n ? new BigNumber(amount || ZERO).multipliedBy(token?.usdPrice || 0)\n : null;\n\nexport interface RouteState {\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: TokenWithBalance | null;\n toToken: TokenWithBalance | null;\n routeWalletsConfirmed: boolean;\n sourceTokens: Token[];\n destinationTokens: Token[];\n selectedWallets: Wallet[];\n resetRoute: () => void;\n resetToBlockchain: () => void;\n resetFromBlockchain: () => void;\n setFromBlockchain: (\n chain: BlockchainMeta | null,\n setDefaultToken?: boolean\n ) => void;\n setToBlockchain: (\n chian: BlockchainMeta | null,\n setDefaultToken?: boolean\n ) => void;\n\n setFromToken: (token: Token | null) => void;\n setToToken: (token: Token | null) => void;\n setInputAmount: (amount: string) => void;\n bestRoute: BestRouteResponse | null;\n setRoute: (bestRoute: BestRouteResponse | null) => void;\n retry: (pendingSwap: PendingSwap) => void;\n switchFromAndTo: () => void;\n setRouteWalletConfirmed: (flag: boolean) => void;\n setSelectedWallets: (wallets: Wallet[]) => void;\n customDestination: string;\n setCustomDestination: (address: string) => void;\n resetRouteWallets: () => void;\n}\n\nexport const useBestRouteStore = createSelectors(\n create<RouteState>()(\n subscribeWithSelector((set) => ({\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 bestRoute: null,\n routeWalletsConfirmed: false,\n sourceTokens: [],\n destinationTokens: [],\n selectedWallets: [],\n customDestination: '',\n setRoute: (bestRoute) =>\n set((state) => {\n let outputAmount: BigNumber | null = null;\n let outputUsdValue: BigNumber = ZERO;\n if (!isPositiveNumber(state.inputAmount)) {\n return {};\n }\n if (!!bestRoute) {\n outputAmount = !!bestRoute.result?.outputAmount\n ? new BigNumber(bestRoute.result?.outputAmount)\n : null;\n outputUsdValue = calcOutputUsdValue(\n bestRoute.result?.outputAmount,\n getBestRouteToTokenUsdPrice(bestRoute) || state.toToken?.usdPrice\n );\n }\n return {\n bestRoute,\n ...(!!bestRoute && {\n outputAmount,\n outputUsdValue,\n }),\n };\n }),\n resetRoute: () =>\n set(() => ({\n bestRoute: null,\n outputAmount: null,\n outputUsdValue: new BigNumber(0),\n })),\n setFromBlockchain: (chain, setDefaultToken) => {\n set((state) => {\n if (state.fromBlockchain?.name === chain?.name) {\n return {};\n }\n const tokens = useMetaStore.getState().meta.tokens;\n const connectedWallets = useWalletsStore.getState().connectedWallets;\n const sortedTokens = getSortedTokens(\n chain,\n tokens,\n connectedWallets,\n state.destinationTokens\n );\n const fromToken = getDefaultToken(sortedTokens, state.toToken);\n return {\n fromBlockchain: chain,\n sourceTokens: sortedTokens,\n ...(setDefaultToken && {\n fromToken,\n }),\n ...(!!state.inputAmount && {\n inputUsdValue: getUsdValue(fromToken, state.inputAmount),\n }),\n };\n });\n },\n setFromToken: (token) =>\n set((state) => ({\n fromToken: token,\n ...(!!state.inputAmount && {\n inputUsdValue: getUsdValue(token, state.inputAmount),\n }),\n })),\n setToBlockchain: (chain, setDefaultToken) => {\n set((state) => {\n if (state.toBlockchain?.name === chain?.name) {\n return {};\n }\n const tokens = useMetaStore.getState().meta.tokens;\n const connectedWallets = useWalletsStore.getState().connectedWallets;\n const sortedTokens = getSortedTokens(\n chain,\n tokens,\n connectedWallets,\n state.destinationTokens\n );\n\n return {\n toBlockchain: chain,\n destinationTokens: sortedTokens,\n ...(setDefaultToken && {\n toToken: getDefaultToken(sortedTokens, state.fromToken),\n }),\n };\n });\n },\n setToToken: (token) =>\n set(() => ({\n toToken: token,\n })),\n setInputAmount: (amount) => {\n set((state) => ({\n inputAmount: amount,\n ...(!amount && {\n outputAmount: new BigNumber(0),\n outputUsdValue: new BigNumber(0),\n bestRoute: null,\n }),\n ...(!!state.fromToken && {\n inputUsdValue: getUsdValue(state.fromToken, amount),\n }),\n }));\n },\n retry: (pendingSwap) => {\n const { tokens, blockchains } = useMetaStore.getState().meta;\n const connectedWallets = useWalletsStore.getState().connectedWallets;\n const failedIndex =\n pendingSwap.status === 'failed'\n ? pendingSwap.steps.findIndex((s) => s.status === 'failed')\n : null;\n\n if (failedIndex === null || failedIndex < 0) {\n return;\n }\n\n const firstStep = pendingSwap.steps[0];\n const lastStep = pendingSwap.steps[pendingSwap.steps.length - 1];\n const fromBlockchain =\n blockchains.find(\n (blockchain) => blockchain.name === firstStep.fromBlockchain\n ) || null;\n const toBlockchain =\n blockchains.find(\n (blockchain) => blockchain.name === lastStep.toBlockchain\n ) || null;\n\n const fromToken = tokens.find((token) =>\n tokensAreEqual(token, {\n blockchain: firstStep.fromBlockchain,\n symbol: firstStep.fromSymbol,\n address: firstStep.fromSymbolAddress,\n })\n );\n\n const toToken = tokens.find((token) =>\n tokensAreEqual(token, {\n blockchain: lastStep.toBlockchain,\n symbol: lastStep.toSymbol,\n address: lastStep.toSymbolAddress,\n })\n );\n const sortedSourceTokens = getSortedTokens(\n fromBlockchain,\n tokens,\n connectedWallets,\n []\n );\n const sortedDestinationTokens = getSortedTokens(\n toBlockchain,\n tokens,\n connectedWallets,\n []\n );\n const inputAmount = pendingSwap.inputAmount;\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 bestRoute: null,\n sourceTokens: sortedSourceTokens,\n destinationTokens: sortedDestinationTokens,\n });\n },\n switchFromAndTo: () =>\n set((state) => ({\n fromBlockchain: state.toBlockchain,\n fromToken: state.toToken,\n toBlockchain: state.fromBlockchain,\n toToken: state.fromToken,\n sourceTokens: state.destinationTokens,\n destinationTokens: state.sourceTokens,\n inputAmount: state.outputAmount?.toString() || '',\n inputUsdValue: getUsdValue(\n state.toToken,\n state.outputAmount?.toString() || ''\n ),\n })),\n\n resetFromBlockchain: () =>\n set(() => ({\n fromBlockchain: null,\n sourceTokens: [],\n })),\n resetToBlockchain: () =>\n set(() => ({\n toBlockchain: null,\n destinationTokens: [],\n })),\n setRouteWalletConfirmed: (flag) =>\n set({\n routeWalletsConfirmed: flag,\n }),\n setSelectedWallets: (wallets) => set({ selectedWallets: wallets }),\n setCustomDestination: (address) => set({ customDestination: address }),\n resetRouteWallets: () =>\n set({\n routeWalletsConfirmed: false,\n selectedWallets: [],\n customDestination: '',\n }),\n }))\n )\n);\n", "/* eslint-disable @typescript-eslint/no-magic-numbers */\nimport type { BestRouteEqualityParams, Wallet } from '../types';\nimport type { PendingSwap } from '@rango-dev/queue-manager-rango-preset';\nimport type { PriceImpactWarningLevel } from '@rango-dev/ui';\nimport type {\n SimulationAssetAndAmount,\n SimulationValidationStatus,\n} from '@rango-dev/ui/dist/widget/ui/src/types/swaps';\nimport type {\n Asset,\n BestRouteResponse,\n BlockchainMeta,\n Token,\n} from 'rango-sdk';\n\nimport BigNumber from 'bignumber.js';\n\nimport {\n GAS_FEE_MAX_DECIMALS,\n GAS_FEE_MIN_DECIMALS,\n HIGHT_PRICE_IMPACT,\n LOW_PRICE_IMPACT,\n TOKEN_AMOUNT_MAX_DECIMALS,\n TOKEN_AMOUNT_MIN_DECIMALS,\n} from '../constants/routing';\n\nimport { areEqual } from './common';\nimport { numberToString } from './numbers';\n\nexport function searchParamsToToken(\n tokens: Token[],\n searchParams: string | null,\n chain: BlockchainMeta | null\n): Token | null {\n if (!chain) {\n return null;\n }\n return (\n tokens.find((token) => {\n const symbolAndAddress = searchParams?.split('--');\n if (symbolAndAddress?.length === 1) {\n return (\n token.symbol === symbolAndAddress[0] &&\n token.address === null &&\n token.blockchain === chain.name\n );\n }\n return (\n token.symbol === symbolAndAddress?.[0] &&\n token.address === symbolAndAddress?.[1] &&\n token.blockchain === chain.name\n );\n }) || null\n );\n}\n\nexport function getBestRouteToTokenUsdPrice(\n bestRoute: BestRouteResponse | null\n): number | null | undefined {\n return bestRoute?.result?.swaps[bestRoute?.result?.swaps.length - 1].to\n .usdPrice;\n}\n\nexport function isNumberOfSwapsChanged(\n route1: BestRouteResponse,\n route2: BestRouteResponse\n) {\n const route1Swaps = route1.result?.swaps || [];\n const route2Swaps = route2.result?.swaps || [];\n return route1Swaps.length !== route2Swaps.length;\n}\n\nexport function isRouteSwappersUpdated(\n route1: BestRouteResponse,\n route2: BestRouteResponse\n) {\n const route1Swappers =\n route1.result?.swaps.map((swap) => swap.swapperId) || [];\n const route2Swappers =\n route2.result?.swaps.map((swap) => swap.swapperId) || [];\n return !areEqual(route1Swappers, route2Swappers);\n}\n\nexport function isRouteInternalCoinsUpdated(\n route1: BestRouteResponse,\n route2: BestRouteResponse\n) {\n const route1InternalCoins =\n route1.result?.swaps.map((swap) => swap.to.symbol) || [];\n const route2InternalCoins =\n route2.result?.swaps.map((swap) => swap.to.symbol) || [];\n return !areEqual(route1InternalCoins, route2InternalCoins);\n}\n\nexport function isRouteChanged(\n route1: BestRouteResponse,\n route2: BestRouteResponse\n): boolean {\n return (\n isNumberOfSwapsChanged(route1, route2) ||\n isRouteSwappersUpdated(route1, route2) ||\n isRouteInternalCoinsUpdated(route1, route2)\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 isRouteParametersChanged(params: BestRouteEqualityParams) {\n if (params.store === 'bestRoute') {\n const { prevState, currentState } = params;\n return (\n !!currentState.fromToken &&\n !!currentState.toToken &&\n (prevState.fromBlockchain?.name !== currentState.fromBlockchain?.name ||\n prevState.toBlockchain?.name !== currentState.toBlockchain?.name ||\n prevState.fromToken?.symbol !== currentState.fromToken?.symbol ||\n prevState.toToken?.symbol !== currentState.toToken?.symbol ||\n prevState.fromToken?.blockchain !== prevState.fromToken?.blockchain ||\n prevState.toToken?.blockchain !== currentState.toToken?.blockchain ||\n prevState.fromToken?.address !== currentState.fromToken?.address ||\n prevState.toToken?.address !== currentState.toToken?.address ||\n prevState.inputAmount !== currentState.inputAmount)\n );\n } else if (params.store === 'settings') {\n const { prevState, currentState } = params;\n return (\n prevState.slippage !== currentState.slippage ||\n prevState.customSlippage !== currentState.customSlippage ||\n prevState.disabledLiquiditySources?.length !==\n currentState.disabledLiquiditySources?.length ||\n prevState.infiniteApprove ||\n currentState.infiniteApprove\n );\n }\n return false;\n}\n\nexport function getFormattedBestRoute(\n bestRoute: BestRouteResponse | null\n): BestRouteResponse | null {\n if (!bestRoute) {\n return null;\n }\n\n const formattedSwaps = (bestRoute.result?.swaps || []).map((swap) => ({\n ...swap,\n fromAmount: numberToString(\n swap.fromAmount,\n TOKEN_AMOUNT_MIN_DECIMALS,\n TOKEN_AMOUNT_MAX_DECIMALS\n ),\n toAmount: numberToString(\n swap.toAmount,\n TOKEN_AMOUNT_MIN_DECIMALS,\n TOKEN_AMOUNT_MAX_DECIMALS\n ),\n }));\n\n return {\n ...bestRoute,\n ...(bestRoute.result && {\n result: { ...bestRoute.result, swaps: formattedSwaps },\n }),\n };\n}\n\nexport function getFormattedPendingSwap(pendingSwap: PendingSwap): PendingSwap {\n const formattedSteps = pendingSwap.steps.map((step) => ({\n ...step,\n feeInUsd: numberToString(\n step.feeInUsd,\n GAS_FEE_MIN_DECIMALS,\n GAS_FEE_MAX_DECIMALS\n ),\n outputAmount: numberToString(\n step.outputAmount,\n TOKEN_AMOUNT_MIN_DECIMALS,\n TOKEN_AMOUNT_MAX_DECIMALS\n ),\n expectedOutputAmountHumanReadable: numberToString(\n step.expectedOutputAmountHumanReadable,\n TOKEN_AMOUNT_MIN_DECIMALS,\n TOKEN_AMOUNT_MAX_DECIMALS\n ),\n }));\n\n return {\n ...pendingSwap,\n inputAmount: numberToString(\n pendingSwap.inputAmount,\n TOKEN_AMOUNT_MIN_DECIMALS,\n TOKEN_AMOUNT_MAX_DECIMALS\n ),\n steps: formattedSteps,\n };\n}\n\n//todo: refactor bestRoute store and add loadingStatus\nexport const getBestRouteStatus = (loading: boolean, error: boolean) => {\n if (loading) {\n return 'loading';\n }\n if (error) {\n return 'failed';\n }\n return 'success';\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 tokenToString = (token: Asset): string =>\n `${token.symbol}-${token.blockchain}-${token.address ?? ''}`;\n\n const set = new Set();\n\n listA.forEach((token) => set.add(tokenToString(token)));\n\n return listB.filter((token) => set.has(tokenToString(token))) as R;\n}\n", "/* eslint-disable @typescript-eslint/no-magic-numbers */\nimport type { LoadingStatus } from '../store/meta';\nimport type { ConnectedWallet } from '../store/wallets';\nimport type { ConvertedToken, SwapButtonState, Wallet } from '../types';\nimport type {\n PendingSwap,\n PendingSwapStep,\n} from '@rango-dev/queue-manager-rango-preset';\nimport type { WalletType } from '@rango-dev/wallets-shared';\nimport type {\n BestRouteRequest,\n BestRouteResponse,\n BlockchainMeta,\n RecommendedSlippage,\n SwapResult,\n Token,\n} from 'rango-sdk';\n\nimport { PendingSwapNetworkStatus } from '@rango-dev/queue-manager-rango-preset';\nimport BigNumber from 'bignumber.js';\n\nimport { isValidAddress } from '../components/ConfirmWalletsModal/ConfirmWallets.helpers';\nimport { errorMessages } from '../constants/errors';\nimport { swapButtonTitles } from '../constants/messages';\nimport { ZERO } from '../constants/numbers';\nimport {\n BALANCE_MAX_DECIMALS,\n BALANCE_MIN_DECIMALS,\n TOKEN_AMOUNT_MAX_DECIMALS,\n TOKEN_AMOUNT_MIN_DECIMALS,\n} from '../constants/routing';\nimport { useMetaStore } from '../store/meta';\nimport { ButtonState } from '../types';\n\nimport { removeDuplicateFrom } from './common';\nimport { numberToString } from './numbers';\nimport { getRequiredBalanceOfWallet } from './routing';\nimport { getRequiredChains } 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.div(inputUsdValue).minus(1).multipliedBy(100);\n}\n\nexport function outputRatioHasWarning(\n inputUsdValue: BigNumber | null,\n outputRatio: BigNumber | 0\n): boolean {\n return (\n ((parseInt(outputRatio.toFixed(2) || '0') <= -10 &&\n inputUsdValue?.gte(new BigNumber(400))) ||\n (parseInt(outputRatio.toFixed(2) || '0') <= -5 &&\n inputUsdValue?.gte(new BigNumber(1000)))) ??\n false\n );\n}\n\nexport function hasLimitError(bestRoute: BestRouteResponse | null): boolean {\n return (\n (bestRoute?.result?.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 LimitErrorMessage(bestRoute: BestRouteResponse | null): {\n swap: SwapResult | null;\n fromAmountRangeError: string;\n recommendation: string;\n} {\n if (!bestRoute) {\n return { swap: null, fromAmountRangeError: '', recommendation: '' };\n }\n const swap = (bestRoute?.result?.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 if (!swap) {\n return { swap: null, fromAmountRangeError: '', recommendation: '' };\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 = `Required: >= ${numberToString(\n minimum,\n TOKEN_AMOUNT_MIN_DECIMALS,\n TOKEN_AMOUNT_MAX_DECIMALS\n )} ${swap.from.symbol}`;\n recommendation = errorMessages.bridgeLimitErrors.increaseAmount;\n } else if (isExclusive && !!minimum && minimum.gte(swap.fromAmount)) {\n fromAmountRangeError = `Required: > ${numberToString(\n minimum,\n TOKEN_AMOUNT_MIN_DECIMALS,\n TOKEN_AMOUNT_MAX_DECIMALS\n )} ${swap.from.symbol}`;\n recommendation = errorMessages.bridgeLimitErrors.increaseAmount;\n }\n\n if (!isExclusive && !!maximum && maximum.lt(swap.fromAmount)) {\n fromAmountRangeError = `Required: <= ${numberToString(\n maximum,\n TOKEN_AMOUNT_MIN_DECIMALS,\n TOKEN_AMOUNT_MAX_DECIMALS\n )} ${swap.from.symbol}`;\n recommendation = errorMessages.bridgeLimitErrors.decreaseAmount;\n } else if (isExclusive && !!maximum && maximum.lte(swap.fromAmount)) {\n fromAmountRangeError = `Required: < ${numberToString(\n maximum,\n TOKEN_AMOUNT_MIN_DECIMALS,\n TOKEN_AMOUNT_MAX_DECIMALS\n )} ${swap.from.symbol}`;\n recommendation = errorMessages.bridgeLimitErrors.decreaseAmount;\n }\n\n return { swap, fromAmountRangeError, recommendation };\n}\n\nexport function getSwapButtonState(\n loadingMetaStatus: LoadingStatus,\n connectedWallets: ConnectedWallet[],\n loading: boolean,\n bestRoute: BestRouteResponse | null,\n hasLimitError: boolean,\n highValueLoss: boolean,\n priceImpactCanNotBeComputed: boolean,\n needsToWarnEthOnPath: boolean,\n inputAmount: string\n): SwapButtonState {\n if (loadingMetaStatus !== 'success') {\n return {\n title: swapButtonTitles.connectWallet,\n state: ButtonState.WAITFORCONNECTING,\n disabled: true,\n };\n }\n if (connectedWallets.length == 0) {\n return {\n title: swapButtonTitles.connectWallet,\n state: ButtonState.WAITFORCONNECTING,\n disabled: false,\n };\n }\n if (\n loading ||\n !bestRoute ||\n !bestRoute.result ||\n hasLimitError ||\n !inputAmount ||\n inputAmount === '0'\n ) {\n return {\n title: swapButtonTitles.swap,\n disabled: true,\n state: ButtonState.SWAP,\n };\n } else if (highValueLoss || priceImpactCanNotBeComputed) {\n return {\n title: swapButtonTitles.swapAnyway,\n disabled: false,\n hasWarning: true,\n state: ButtonState.NEEDTOCONFIRM,\n };\n } else if (needsToWarnEthOnPath) {\n return {\n title: swapButtonTitles.ethRouteWarning,\n disabled: false,\n hasWarning: true,\n state: ButtonState.WARNING,\n };\n }\n return {\n title: swapButtonTitles.swap,\n disabled: false,\n state: ButtonState.SWAP,\n };\n}\n\nexport function canComputePriceImpact(\n bestRoute: BestRouteResponse | null,\n inputAmount: string,\n usdValue: BigNumber | null\n) {\n return !(\n (!usdValue || usdValue.lte(ZERO)) &&\n !!bestRoute?.result &&\n !!inputAmount &&\n inputAmount !== '0' &&\n parseFloat(inputAmount || '0') !== 0 &&\n !!bestRoute.result\n );\n}\n\nexport function requiredWallets(route: BestRouteResponse | null) {\n const wallets: string[] = [];\n\n route?.result?.swaps.forEach((swap) => {\n const currentStepFromBlockchain = swap.from.blockchain;\n const currentStepToBlockchain = swap.to.blockchain;\n let lastAddedWallet = wallets[wallets.length - 1];\n if (currentStepFromBlockchain != lastAddedWallet) {\n wallets.push(currentStepFromBlockchain);\n }\n lastAddedWallet = wallets[wallets.length - 1];\n if (currentStepToBlockchain != lastAddedWallet) {\n wallets.push(currentStepToBlockchain);\n }\n });\n return wallets;\n}\n\nexport const getUsdPrice = (\n blockchain: string,\n symbol: string,\n address: string | null,\n allTokens: Token[]\n): number | null => {\n const token = allTokens?.find(\n (t) =>\n t.blockchain === blockchain &&\n t.symbol?.toUpperCase() === symbol?.toUpperCase() &&\n t.address === address\n );\n return token?.usdPrice || null;\n};\n\nexport function getUsdFeeOfStep(\n step: SwapResult,\n allTokens: Token[]\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.expenseType === 'DECREASE_FROM_OUTPUT') {\n continue;\n }\n\n const unitPrice = getUsdPrice(\n fee.asset.blockchain,\n fee.asset.symbol,\n fee.asset.address,\n allTokens\n );\n totalFeeInUsd = totalFeeInUsd.plus(\n new BigNumber(fee.amount).multipliedBy(unitPrice || 0)\n );\n }\n\n return totalFeeInUsd;\n}\n\nexport function getTotalFeeInUsd(\n bestRoute: BestRouteResponse | null,\n allTokens: Token[]\n): BigNumber | null {\n return (\n bestRoute?.result?.swaps.reduce(\n (totalFee: BigNumber, step) =>\n totalFee.plus(getUsdFeeOfStep(step, allTokens)),\n ZERO\n ) || null\n );\n}\n\nexport function hasHighFee(totalFeeInUsd: BigNumber | null) {\n if (!totalFeeInUsd) {\n return false;\n }\n return !totalFeeInUsd.lt(new BigNumber(30));\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 getMinRequiredSlippage(\n route: BestRouteResponse\n): string | null {\n const slippages = route.result?.swaps.map(\n (slippage) => slippage.recommendedSlippage\n );\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 route: BestRouteResponse,\n selectedWallets: Wallet[]\n) {\n const fee = route.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 route: BestRouteResponse,\n selectedWallets: Wallet[],\n userSlippage: string,\n minRequiredSlippage: string | null\n): boolean {\n return (\n hasEnoughBalance(route, selectedWallets) &&\n hasProperSlippage(userSlippage, minRequiredSlippage)\n );\n}\n\nexport function createBestRouteRequestBody(params: {\n fromToken: Token;\n toToken: Token;\n inputAmount: string;\n wallets?: Wallet[];\n selectedWallets?: Wallet[];\n disabledLiquiditySources: string[];\n slippage: number;\n affiliateRef: string | null;\n affiliatePercent: number | null;\n affiliateWallets: { [key: string]: string } | null;\n initialRoute?: BestRouteResponse;\n destination?: string;\n}): BestRouteRequest {\n const {\n fromToken,\n toToken,\n inputAmount,\n wallets,\n selectedWallets,\n disabledLiquiditySources,\n slippage,\n affiliateRef,\n affiliatePercent,\n affiliateWallets,\n initialRoute,\n destination,\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 const chainAndAccounts = connectedWallets.find(\n (connectedWallet) => connectedWallet.blockchain === wallet.chain\n );\n if (!!chainAndAccounts) {\n chainAndAccounts.addresses.push(wallet.address);\n } else {\n connectedWallets.push({\n blockchain: wallet.chain,\n addresses: [wallet.address],\n });\n }\n });\n\n const checkPrerequisites = !!initialRoute;\n\n const filteredBlockchains = removeDuplicateFrom(\n (initialRoute?.result?.swaps || []).reduce(\n (blockchains: string[], swap) => {\n blockchains.push(swap.from.blockchain, swap.to.blockchain);\n // Check if internalSwaps array exists\n if (swap.internalSwaps && Array.isArray(swap.internalSwaps)) {\n swap.internalSwaps.map((internalSwap) => {\n blockchains.push(\n internalSwap.from.blockchain,\n internalSwap.to.blockchain\n );\n });\n }\n return blockchains;\n },\n []\n )\n );\n\n const requestBody: BestRouteRequest = {\n amount: inputAmount.toString(),\n affiliateRef: affiliateRef ?? undefined,\n affiliatePercent: affiliatePercent ?? undefined,\n affiliateWallets: affiliateWallets ?? undefined,\n checkPrerequisites,\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 ...(destination && { destination: destination }),\n ...(disabledLiquiditySources.length > 0 && {\n swapperGroups: disabledLiquiditySources,\n swappersGroupsExclude: true,\n }),\n ...(checkPrerequisites && { blockchains: filteredBlockchains }),\n };\n\n return requestBody;\n}\n\nexport function getWalletsForNewSwap(selectedWallets: Wallet[]) {\n const wallets = selectedWallets.reduce(\n (\n selectedWalletsMap: {\n [p: string]: { address: string; walletType: WalletType };\n },\n selectedWallet\n ) => (\n (selectedWalletsMap[selectedWallet.chain] = {\n address: selectedWallet.address,\n walletType: selectedWallet.walletType,\n }),\n selectedWalletsMap\n ),\n {}\n );\n\n return wallets;\n}\n\nexport function getRouteOutputAmount(route: BestRouteResponse | null) {\n return route?.result?.outputAmount || null;\n}\n\nexport function getPercentageChange(\n inputUsdValue: string | number | null,\n outputUsdValue: string | number | null\n) {\n if (!inputUsdValue || !outputUsdValue) {\n return null;\n }\n return new BigNumber(outputUsdValue)\n .div(new BigNumber(inputUsdValue))\n .minus(1)\n .multipliedBy(100);\n}\n\nexport function isOutputAmountChangedALot(\n oldRoute: BestRouteResponse,\n newRoute: BestRouteResponse\n) {\n const oldOutputAmount = getRouteOutputAmount(oldRoute);\n const newOutputAmount = getRouteOutputAmount(newRoute);\n if (!oldOutputAmount || !newOutputAmount) {\n return false;\n }\n const percentageChange = getPercentageChange(\n oldOutputAmount,\n newOutputAmount\n );\n if (!percentageChange) {\n return true;\n }\n\n return percentageChange.toNumber() <= -1;\n}\n\nexport function getBalanceWarnings(\n route: BestRouteResponse,\n selectedWallets: Wallet[]\n) {\n const fee = route.validationStatus;\n const requiredWallets = getRequiredChains(route);\n const walletsSortedByRequiredWallets = selectedWallets.sort(\n (selectedWallet1, selectedWallet2) =>\n requiredWallets.indexOf(selectedWallet1.chain) -\n requiredWallets.indexOf(selectedWallet2.chain)\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 = ' for network fee';\n }\n if (asset.reason === 'INPUT_ASSET') {\n reason = ' for swap';\n }\n if (asset.reason === 'FEE_AND_INPUT_ASSET') {\n reason = ' for input and network fee';\n }\n const warningMessage = `Needs \u2248 ${requiredAmount} ${symbol}${reason}, but you have ${currentAmount} ${symbol} in your ${asset.asset.blockchain} wallet.`;\n return warningMessage;\n });\n}\n\nexport function calcOutputUsdValue(\n outputAmount?: string,\n tokenPrice?: number | null\n) {\n const amount = !!outputAmount ? new BigNumber(outputAmount) : ZERO;\n\n return amount.multipliedBy(tokenPrice || 0);\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): {\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 // eslint-disable-next-line @typescript-eslint/switch-exhaustiveness-check\n switch (currentStep?.networkStatus) {\n case PendingSwapNetworkStatus.WaitingForConnectingWallet:\n message = message || 'Waiting for connecting wallet';\n break;\n case PendingSwapNetworkStatus.WaitingForQueue:\n message = message || 'Waiting for other running tasks to be finished';\n break;\n case PendingSwapNetworkStatus.WaitingForNetworkChange:\n message = message || 'Waiting for changing wallet network';\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 (\n pendingSwap.status === 'failed' &&\n !!pendingSwap.finishTime &&\n new Date().getTime() - parseInt(pendingSwap.finishTime) < 4 * 3600 * 1000\n );\n}\nexport function isValidCustomDestination(\n blockchain: string,\n address: string\n): boolean {\n const blockchains = useMetaStore.getState().meta.blockchains;\n const regex =\n blockchains.find((chain) => chain.name === blockchain)?.addressPatterns ||\n [];\n return regex.filter((r) => new RegExp(r).test(address)).length > 0;\n}\n\nexport function confirmSwapDisabled(\n fetching: boolean,\n showCustomDestination: boolean,\n customDestination: string,\n bestRoute: BestRouteResponse | null,\n selectedWallets: { walletType: string; chain: string }[],\n lastStepToBlockchain?: BlockchainMeta\n) {\n return (\n fetching ||\n (!showCustomDestination &&\n !requiredWallets(bestRoute).every((chain) =>\n selectedWallets.map((wallet) => wallet.chain).includes(chain)\n )) ||\n (!!showCustomDestination && !customDestination) ||\n (!!showCustomDestination &&\n !!customDestination &&\n lastStepToBlockchain &&\n !isValidAddress(lastStepToBlockchain, customDestination))\n );\n}\n", "/* eslint-disable @typescript-eslint/no-magic-numbers */\nimport type { Step } from '@rango-dev/ui/dist/widget/ui/src/components/BestRoute/BestRoute.types';\nimport type { BestRouteResponse, BlockchainMeta } from 'rango-sdk';\n\nimport {\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 { numberToString } from '../../utils/numbers';\n\nexport function formatBestRoute(\n bestRoute: BestRouteResponse\n): Step[] | undefined {\n return bestRoute.result?.swaps.map((swap) => {\n return {\n swapper: { displayName: swap.swapperId, image: swap.swapperLogo },\n from: {\n token: { displayName: swap.from.symbol, image: swap.from.logo },\n chain: {\n displayName: swap.from.blockchain,\n image: swap.from.blockchainLogo,\n },\n price: {\n value: numberToString(\n swap.fromAmount,\n TOKEN_AMOUNT_MIN_DECIMALS,\n TOKEN_AMOUNT_MAX_DECIMALS\n ),\n usdValue: numberToString(\n swap.from.usdPrice?.toString(),\n USD_VALUE_MIN_DECIMALS,\n USD_VALUE_MAX_DECIMALS\n ),\n },\n },\n to: {\n token: { displayName: swap.to.symbol, image: swap.to.logo },\n chain: {\n displayName: swap.to.blockchain,\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?.toString(),\n USD_VALUE_MIN_DECIMALS,\n USD_VALUE_MAX_DECIMALS\n ),\n },\n },\n };\n });\n}\n\nexport function getRequiredWallets(route: BestRouteResponse | null): string[] {\n const wallets: string[] = [];\n\n route?.result?.swaps.forEach((swap) => {\n const currentStepFromBlockchain = swap.from.blockchain;\n const currentStepToBlockchain = swap.to.blockchain;\n let lastAddedWallet = wallets[wallets.length - 1];\n if (currentStepFromBlockchain != lastAddedWallet) {\n wallets.push(currentStepFromBlockchain);\n }\n lastAddedWallet = wallets[wallets.length - 1];\n if (currentStepToBlockchain != lastAddedWallet) {\n wallets.push(currentStepToBlockchain);\n }\n });\n return wallets;\n}\n\nexport function isValidAddress(\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 { ConfirmSwapError } from '../types';\n\nimport { i18n } from '@lingui/core';\n\nimport { ConfirmSwapErrorTypes } from '../types';\n\nexport const errorMessages = {\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 noRoutesError: {\n title: i18n.t('No Routes Found'),\n description:\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 bridgeLimitErrors: {\n increaseAmount: i18n.t('Bridge Limit Error: Please increase your amount'),\n decreaseAmount: i18n.t('Bridge Limit Error: Please decrease your amount'),\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. If you are sure, continue, otherwise, change the swap.'\n ),\n confirmMessage: i18n.t('Confirm High price impact'),\n },\n routeUpdatedWithHighValueLoss: {\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\nexport function getConfirmSwapErrorMessage(error: ConfirmSwapError) {\n switch (error.type) {\n case ConfirmSwapErrorTypes.NO_ROUTE:\n return error.diagnosisMessage ?? errorMessages.noRoutesError.title;\n case ConfirmSwapErrorTypes.REQUEST_FAILED:\n return errorMessages.genericServerError;\n case ConfirmSwapErrorTypes.ROUTE_UPDATED_WITH_HIGH_VALUE_LOSS:\n return errorMessages.routeUpdatedWithHighValueLoss.title;\n default:\n return '';\n }\n}\n", "/* eslint-disable @typescript-eslint/prefer-enum-initializers */\nimport type { RouteState } from '../store/bestRoute';\nimport type { SettingsState } from '../store/settings';\n\ninterface BestRouteStoreParams {\n fromBlockchain?: RouteState['fromBlockchain'];\n toBlockchain?: RouteState['toBlockchain'];\n fromToken?: RouteState['fromToken'];\n toToken?: RouteState['toToken'];\n inputAmount?: RouteState['inputAmount'];\n}\n\ninterface SettingsStoreParams {\n slippage?: SettingsState['slippage'];\n customSlippage?: SettingsState['customSlippage'];\n disabledLiquiditySources?: SettingsState['disabledLiquiditySources'];\n infiniteApprove?: SettingsState['infiniteApprove'];\n}\n\nexport type BestRouteEqualityParams =\n | {\n store: 'bestRoute';\n prevState: BestRouteStoreParams;\n currentState: BestRouteStoreParams;\n }\n | {\n store: 'settings';\n prevState: SettingsStoreParams;\n currentState: SettingsStoreParams;\n };\n\nexport enum ConfirmSwapErrorTypes {\n NO_ROUTE,\n ROUTE_UPDATED_WITH_HIGH_VALUE_LOSS,\n REQUEST_FAILED,\n REQUEST_CANCELED,\n}\n\nexport type ConfirmSwapError =\n | {\n type: ConfirmSwapErrorTypes.NO_ROUTE;\n diagnosisMessage?: string;\n }\n | {\n type: Exclude<ConfirmSwapErrorTypes, ConfirmSwapErrorTypes.NO_ROUTE>;\n };\n\nexport enum RouteWarningType {\n ROUTE_UPDATED,\n ROUTE_SWAPPERS_UPDATED,\n ROUTE_COINS_UPDATED,\n ROUTE_AND_OUTPUT_AMOUNT_UPDATED,\n}\n\nexport type RouteWarning =\n | {\n type: RouteWarningType.ROUTE_AND_OUTPUT_AMOUNT_UPDATED;\n newOutputAmount: string;\n percentageChange: string;\n }\n | {\n type: Exclude<\n RouteWarningType,\n RouteWarningType.ROUTE_AND_OUTPUT_AMOUNT_UPDATED\n >;\n };\n\nexport enum SlippageWarningType {\n INSUFFICIENT_SLIPPAGE,\n HIGH_SLIPPAGE,\n}\n\nexport type ConfirmSwapWarnings = {\n route: RouteWarning | null;\n balance: { messages: string[] } | null;\n slippage: { type: SlippageWarningType; slippage: string | null } | null;\n};\n", "import { i18n } from '@lingui/core';\n\nexport const swapButtonTitles = {\n connectWallet: i18n.t('Connect Wallet'),\n swap: i18n.t('Swap'),\n swapAnyway: i18n.t('Swap anyway'),\n ethRouteWarning: i18n.t('The route goes through Ethereum. Continue?'),\n};\n", "import type { Notification } from '../types/notification';\nimport type {\n Route,\n RouteEvent,\n StepEvent,\n} from '@rango-dev/queue-manager-rango-preset';\n\nimport { create } from 'zustand';\nimport { persist, subscribeWithSelector } from 'zustand/middleware';\n\nimport createSelectors from './selectors';\n\nexport interface NotificationState {\n notifications: Notification[];\n setNotification: (event: RouteEvent | StepEvent, route: Route) => void;\n setAsRead: (requestId: Notification['requestId']) => void;\n getUnreadNotifications: () => Notification[];\n}\n\nexport const useNotificationStore = createSelectors(\n create<NotificationState>()(\n persist(\n subscribeWithSelector((set, get) => ({\n notifications: [],\n setNotification: (event, route) => {\n const fromStep = route.steps[0];\n const toStep = route.steps[route.steps.length - 1];\n\n const notification: Notification = {\n event,\n creationTime: Date.now(),\n read: false,\n requestId: route.requestId,\n route: {\n from: {\n blockchain: fromStep.fromBlockchain,\n tokenAddress: fromStep.fromSymbolAddress,\n tokenSymbol: fromStep.fromSymbol,\n },\n to: {\n blockchain: toStep.toBlockchain,\n tokenSymbol: toStep.toSymbol,\n tokenAddress: toStep.toSymbolAddress,\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 setAsRead: (requestId) => {\n set((state) => ({\n notifications: state.notifications.map((notificationItem) =>\n notificationItem.requestId === requestId\n ? { ...notificationItem, read: true }\n : notificationItem\n ),\n }));\n },\n getUnreadNotifications: () => {\n return get().notifications.filter(\n (notificationItem) => !notificationItem.read\n );\n },\n })),\n {\n name: 'notification',\n skipHydration: true,\n }\n )\n )\n);\n", "import { create } from 'zustand';\n\nimport createSelectors from './selectors';\n\ninterface UiState {\n connectWalletsButtonDisabled: boolean;\n selectedSwapRequestId: string | null;\n currentPage: string;\n setSelectedSwap: (requestId: string | null) => void;\n setCurrentPage: (path: string) => void;\n}\n\nexport const useUiStore = createSelectors(\n create<UiState>()((set) => ({\n connectWalletsButtonDisabled: false,\n selectedSwapRequestId: null,\n currentPage: '',\n setSelectedSwap: (requestId) => set({ selectedSwapRequestId: requestId }),\n setCurrentPage: (path) => set({ currentPage: path }),\n }))\n);\n", "import { styled } from '@rango-dev/ui';\n\nexport const Container = styled('div', {\n padding: '$10',\n width: '350px',\n minHeight: '150px',\n});\n\nexport const List = styled('ul', {\n padding: 0,\n margin: 0,\n listStyle: 'none',\n\n '.to-chain-token': {\n transform: 'translateX(-3px)',\n },\n});\n\nexport const Images = styled('div', {\n display: 'flex',\n padding: 0,\n alignItems: 'center',\n alignSelf: 'stretch',\n});\n\nexport const NotFoundContainer = styled('div', {\n display: 'flex',\n justifyContent: 'center',\n alignItems: 'center',\n flexDirection: 'column',\n padding: '$10',\n width: '100%',\n height: '150px',\n});\n", "import { i18n } from '@lingui/core';\nimport { Divider, NoNotificationIcon, Typography } from '@rango-dev/ui';\nimport React from 'react';\n\nimport { NotFoundContainer } from './NotificationContent.styles';\n\nexport function NotificationNotFound() {\n return (\n <NotFoundContainer>\n <NoNotificationIcon color=\"secondary\" size={26} />\n <Divider size={12} />\n <Typography variant=\"body\" size=\"medium\" color=\"neutral900\">\n {i18n.t('You have no notification')}\n </Typography>\n </NotFoundContainer>\n );\n}\n", "import { Typography } from '@rango-dev/ui';\nimport React from 'react';\n\nimport { useNotificationStore } from '../../store/notification';\n\nimport { NotificationsBadgeContainer } from './HeaderButtons.styles';\n\nexport function UnreadNotificationsBadge() {\n const { getUnreadNotifications } = useNotificationStore();\n\n const notificationsCount = getUnreadNotifications().length;\n\n return notificationsCount ? (\n <NotificationsBadgeContainer>\n <Typography variant=\"body\" size=\"xsmall\" color=\"$background\">\n {notificationsCount}\n </Typography>\n </NotificationsBadgeContainer>\n ) : null;\n}\n", "import type { PropTypes, Ref } from './Layout.types';\nimport type { PropsWithChildren } from 'react';\n\nimport { BottomLogo, Divider, Header } from '@rango-dev/ui';\nimport React from 'react';\nimport { useNavigate } from 'react-router-dom';\n\nimport { navigationRoutes } from '../../constants/navigationRoutes';\nimport { useUiStore } from '../../store/ui';\nimport { useWalletsStore } from '../../store/wallets';\nimport { getContainer } from '../../utils/common';\nimport { BackButton, CancelButton, WalletButton } from '../HeaderButtons';\n\nimport { Container, Content, Footer } from './Layout.styles';\n\nfunction LayoutComponent(props: PropsWithChildren<PropTypes>, ref: Ref) {\n const {\n children,\n header,\n footer,\n noPadding,\n hasLogo = true,\n fixedHeight = true,\n } = props;\n const connectedWallets = useWalletsStore.use.connectedWallets();\n\n const connectWalletsButtonDisabled =\n useUiStore.use.connectWalletsButtonDisabled();\n const navigate = useNavigate();\n\n const onConnectWallet = () => {\n if (!connectWalletsButtonDisabled) {\n navigate('/' + navigationRoutes.wallets);\n }\n };\n return (\n <Container ref={ref} fixedHeight={fixedHeight} id=\"swap-box\">\n <Header\n prefix={<>{header.onBack && <BackButton onClick={header.onBack} />}</>}\n title={header.title}\n suffix={\n <>\n {header.suffix}\n {header.hasConnectWallet && (\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 noPadding={noPadding}>{children}</Content>\n {(hasLogo || footer) && (\n <Footer>\n <div className=\"footer__content\">{footer}</div>\n {hasLogo && (\n <div className=\"footer__logo\">\n <Divider size={12} />\n <BottomLogo />\n </div>\n )}\n </Footer>\n )}\n </Container>\n );\n}\n\nconst Layout = React.forwardRef(LayoutComponent);\nLayout.displayName = 'Layout';\n\nexport { Layout };\n", "import { styled } from '@rango-dev/ui';\n\nexport const Container = styled('div', {\n position: 'relative',\n display: 'flex',\n flexDirection: 'column',\n borderRadius: '$primary',\n overflow: 'hidden !important',\n boxShadow: '15px 15px 15px 0px rgba(0, 0, 0, 0.05)',\n width: '95vw',\n maxWidth: '390px',\n maxHeight: '700px',\n variants: {\n fixedHeight: {\n true: {\n height: '95vh',\n },\n false: {\n height: 'auto',\n },\n },\n },\n});\nexport const Content = styled('div', {\n display: 'flex',\n flexDirection: 'column',\n flex: 1,\n padding: '$20 $20 $10 $20',\n backgroundColor: '$background',\n position: 'relative',\n overflowY: 'auto',\n overflowX: 'hidden',\n variants: {\n noPadding: {\n true: {\n padding: '0',\n },\n },\n },\n});\n\nexport const Footer = styled('div', {\n backgroundColor: '$background',\n '& .footer__content': {\n padding: '$0 $20',\n },\n '& .footer__logo': {\n padding: '$0 $20 $10 $20',\n },\n});\n", "import type { PropTypes } from './NoRoutes.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 { useMetaStore } from '../../store/meta';\nimport { useSettingsStore } from '../../store/settings';\n\nimport { makeInfo } from './NoRoutes.helper';\nimport { Container, Footer, PrefixIcon } from './NoRoutes.styles';\n\nexport function NoRoutes(props: PropTypes) {\n const { diagnosisMessage, fetch, error } = props;\n const disabledLiquiditySources =\n useSettingsStore.use.disabledLiquiditySources();\n const loadingMetaStatus = useMetaStore.use.loadingStatus();\n const toggleAllLiquiditySources =\n useSettingsStore.use.toggleAllLiquiditySources();\n\n const hasError = error || loadingMetaStatus === 'failed';\n\n const info = makeInfo(\n diagnosisMessage ?? null,\n disabledLiquiditySources,\n hasError,\n toggleAllLiquiditySources,\n fetch\n );\n\n return (\n <Container>\n <NoRouteIcon size={24} color=\"gray\" />\n <Divider size={4} />\n <Typography variant=\"title\" size=\"small\">\n {errorMessages.noRoutesError.title}\n </Typography>\n {!!info.description && (\n <Typography\n variant=\"body\"\n size=\"small\"\n align=\"center\"\n color=\"neutral900\">\n {info.description}\n </Typography>\n )}\n <Divider size={4} />\n {!!info.alert && (\n <Footer>\n <Alert\n type={info.alert.type}\n title={info.alert.text}\n action={\n info.alert.action && (\n <Button\n size=\"xsmall\"\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 { create } from 'zustand';\nimport { persist, subscribeWithSelector } from 'zustand/middleware';\n\nimport { DEFAULT_SLIPPAGE } from '../constants/swapSettings';\nimport { removeDuplicateFrom } from '../utils/common';\n\nimport { useMetaStore } from './meta';\nimport createSelectors from './selectors';\n\ntype Theme = 'auto' | 'dark' | 'light';\n\nexport interface SettingsState {\n slippage: number;\n customSlippage: number | null;\n infiniteApprove: boolean;\n disabledLiquiditySources: string[];\n theme: Theme;\n affiliateRef: string | null;\n affiliatePercent: number | null;\n affiliateWallets: { [key: string]: string } | null;\n setSlippage: (slippage: number) => void;\n setCustomSlippage: (customSlippage: number | null) => void;\n toggleInfiniteApprove: () => void;\n toggleLiquiditySource: (name: string) => void;\n setTheme: (theme: Theme) => void;\n toggleAllLiquiditySources: (shouldReset?: boolean) => void;\n setAffiliateRef: (affiliateRef: string | null) => void;\n setAffiliatePercent: (affiliatePercent: number | null) => void;\n setAffiliateWallets: (\n affiliateWallets: { [key: string]: string } | null\n ) => void;\n}\n\nexport const useSettingsStore = createSelectors(\n create<SettingsState>()(\n persist(\n subscribeWithSelector((set) => ({\n slippage: DEFAULT_SLIPPAGE,\n customSlippage: null,\n infiniteApprove: false,\n affiliateRef: null,\n affiliatePercent: null,\n affiliateWallets: null,\n disabledLiquiditySources: [],\n theme: 'auto',\n setSlippage: (slippage) =>\n set(() => ({\n slippage: slippage,\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: (shouldReset?: boolean) =>\n set((state) => {\n if (shouldReset) {\n return { disabledLiquiditySources: [] };\n }\n const { swappers } = useMetaStore.getState().meta;\n const swappersGroup = removeDuplicateFrom(\n swappers.map((swapper) => swapper.swapperGroup)\n );\n\n if (\n swappersGroup.length === state.disabledLiquiditySources.length\n ) {\n return { disabledLiquiditySources: [] };\n }\n\n return {\n disabledLiquiditySources: swappersGroup,\n };\n }),\n toggleInfiniteApprove: () =>\n set((state) => ({\n infiniteApprove: !state.infiniteApprove,\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:\n state.disabledLiquiditySources.concat(name),\n };\n }),\n setTheme: (theme) =>\n set(() => ({\n theme,\n })),\n })),\n {\n name: 'user-settings',\n skipHydration: true,\n }\n )\n )\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 = 100;\n\nexport const MIN_SLIPPGAE = 0;\n", "import type { Info } from './NoRoutes.types';\n\nimport { errorMessages } from '../../constants/errors';\n\nexport function makeInfo(\n diagnosisMessage: string | null,\n disabledLiquiditySources: string[],\n hasError: boolean,\n toggleAllLiquiditySources: (shouldReset: boolean) => void,\n refetchBestRoute: () => void\n): Info {\n if (hasError) {\n return {\n alert: {\n type: 'warning',\n text: errorMessages.genericServerError,\n action: {\n onClick: refetchBestRoute,\n title: 'Retry',\n },\n },\n description: '',\n };\n } else if (diagnosisMessage) {\n return {\n alert: {\n type: 'error',\n text: diagnosisMessage,\n action: null,\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: 'Reset',\n },\n },\n description: errorMessages.liquiditySourcesError.description,\n };\n }\n return {\n alert: null,\n description: errorMessages.noRoutesError.description,\n };\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 Footer = styled('div', {\n width: '100%',\n});\n\nexport const PrefixIcon = styled('div', {\n padding: '$6 $0',\n});\n", "import type { PropTypes } from './RouteErrors.types';\n\nimport { Alert, Divider, InfoIcon } from '@rango-dev/ui';\nimport React from 'react';\n\nimport { errorMessages } from '../../constants/errors';\nimport { useBestRouteStore } from '../../store/bestRoute';\nimport { hasLimitError, LimitErrorMessage } from '../../utils/swap';\n\nimport { Action, Alerts } from './RouteErrors.styles';\nimport { RouteErrorsModal } from './RouteErrorsModal';\n\nconst WARNING_LEVEL_LIMIT = -10;\n\nexport function RouteErrors(props: PropTypes) {\n const { bestRoute } = useBestRouteStore();\n const {\n highValueLoss,\n percentageChange,\n priceImpactCanNotBeComputed,\n openModal,\n onToggle,\n totalFeeInUsd,\n outputUsdValue,\n inputUsdValue,\n loading,\n extraSpace,\n } = props;\n const error = hasLimitError(bestRoute);\n const { recommendation } = LimitErrorMessage(bestRoute);\n\n const showWarnings = !error && (highValueLoss || priceImpactCanNotBeComputed);\n const showAlerts = showWarnings || error;\n\n return (\n <>\n {(loading || (extraSpace && !showAlerts)) && <Divider size={20} />}\n {showAlerts && (\n <Alerts>\n {showWarnings && (\n <>\n <Alert\n title={\n highValueLoss\n ? errorMessages.highValueLossError.title\n : errorMessages.unknownPriceError.title\n }\n type={\n highValueLoss && !!percentageChange?.lt(WARNING_LEVEL_LIMIT)\n ? 'error'\n : 'warning'\n }\n variant=\"alarm\"\n action={\n <Action onClick={() => onToggle(true)}>\n <InfoIcon size={12} color=\"gray\" />\n </Action>\n }\n />\n </>\n )}\n {error && (\n <Alert type=\"error\" variant=\"alarm\" title={recommendation} />\n )}\n </Alerts>\n )}\n\n <RouteErrorsModal\n highValueLoss={highValueLoss}\n open={openModal}\n onToggle={onToggle}\n percentageChange={percentageChange}\n inputUsdValue={inputUsdValue}\n outputUsdValue={outputUsdValue}\n totalFeeInUsd={totalFeeInUsd}\n />\n </>\n );\n}\n", "import { styled } from '@rango-dev/ui';\n\nexport const Alerts = styled('div', {\n width: '100%',\n paddingTop: '$10',\n});\n\nexport const Flex = styled('div', {\n display: 'flex',\n flexDirection: 'column',\n alignItems: 'flex-start',\n gap: 10,\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});\n\nexport const Action = styled('div', {\n padding: '$2',\n alignSelf: 'flex-start',\n cursor: 'pointer',\n});\n", "import type { ModalPropTypes } from './RouteErrors.types';\n\nimport {\n Button,\n Divider,\n MessageBox,\n Modal,\n Typography,\n WarningIcon,\n} from '@rango-dev/ui';\nimport React from 'react';\nimport { useNavigate } from 'react-router-dom';\n\nimport { errorMessages } from '../../constants/errors';\nimport { navigationRoutes } from '../../constants/navigationRoutes';\nimport {\n GAS_FEE_MAX_DECIMALS,\n GAS_FEE_MIN_DECIMALS,\n HIGHT_PRICE_IMPACT,\n PERCENTAGE_CHANGE_MAX_DECIMALS,\n PERCENTAGE_CHANGE_MIN_DECIMALS,\n USD_VALUE_MAX_DECIMALS,\n USD_VALUE_MIN_DECIMALS,\n} from '../../constants/routing';\nimport { numberToString } from '../../utils/numbers';\n\nimport { Flex } from './RouteErrors.styles';\nimport { RouteErrorsModalItem } from './RouteErrorsModalItem';\n\nexport function RouteErrorsModal(props: ModalPropTypes) {\n const {\n highValueLoss,\n open,\n onToggle,\n percentageChange,\n inputUsdValue,\n outputUsdValue,\n totalFeeInUsd,\n } = props;\n const navigate = useNavigate();\n const type =\n highValueLoss && !!percentageChange?.lt(HIGHT_PRICE_IMPACT)\n ? 'error'\n : 'warning';\n const highValueLossData = [\n {\n title: 'Swapping',\n value: numberToString(\n inputUsdValue,\n USD_VALUE_MIN_DECIMALS,\n USD_VALUE_MAX_DECIMALS\n ),\n },\n {\n title: 'Gas cost',\n value: numberToString(\n totalFeeInUsd,\n GAS_FEE_MIN_DECIMALS,\n GAS_FEE_MAX_DECIMALS\n ),\n },\n {\n title: 'Receiving',\n value: numberToString(\n outputUsdValue,\n USD_VALUE_MIN_DECIMALS,\n USD_VALUE_MAX_DECIMALS\n ),\n },\n {\n title: 'Price impact',\n value: numberToString(\n percentageChange,\n PERCENTAGE_CHANGE_MIN_DECIMALS,\n PERCENTAGE_CHANGE_MAX_DECIMALS\n ),\n valueColor: `${type}500`,\n },\n ];\n\n return (\n <Modal\n open={open}\n onClose={() => onToggle(false)}\n container={document.getElementById('swap-box') || document.body}>\n {highValueLoss ? (\n <MessageBox\n type={type}\n title={errorMessages.highValueLossError.impactTitle}\n description={errorMessages.highValueLossError.description}\n />\n ) : (\n <MessageBox\n type={type}\n title={errorMessages.unknownPriceError.impactTitle}\n description={errorMessages.unknownPriceError.description}\n />\n )}\n {highValueLoss && (\n <Flex>\n <Divider size={20} />\n <Typography size=\"small\" variant=\"title\">\n Details\n </Typography>\n <Flex>\n {highValueLossData.map((item, index) => {\n const key = index;\n return <RouteErrorsModalItem key={key} {...item} />;\n })}\n </Flex>\n </Flex>\n )}\n <Divider size={32} />\n <Button\n type=\"primary\"\n size=\"large\"\n prefix={<WarningIcon />}\n fullWidth\n onClick={() => {\n navigate(navigationRoutes.confirmSwap);\n }}>\n {highValueLoss\n ? errorMessages.highValueLossError.confirmMessage\n : errorMessages.unknownPriceError.confirmMessage}\n </Button>\n </Modal>\n );\n}\n", "import type { ModalContentData } from './RouteErrors.types';\n\nimport { Typography } from '@rango-dev/ui';\nimport React from 'react';\n\nimport { Item } from './RouteErrors.styles';\n\nexport function RouteErrorsModalItem(props: ModalContentData) {\n const { title, value, valueColor } = props;\n\n return (\n <Item>\n <Typography size=\"medium\" variant=\"label\" color=\"neutral800\">\n {title}\n </Typography>\n <Typography\n size=\"large\"\n variant=\"label\"\n color={valueColor || 'foreground'}>\n {`${valueColor ? '%' : '$'}${value}`}\n </Typography>\n </Item>\n );\n}\n", "import { ReverseIcon, styled } from '@rango-dev/ui';\nimport React from 'react';\n\nimport { useBestRouteStore } from '../store/bestRoute';\n\nconst SwitchButtonContainer = styled('div', {\n position: 'absolute',\n bottom: '-12px',\n left: '50%',\n transform: 'translate(-50%, 10%)',\n cursor: 'pointer',\n});\n\nconst 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 '&:hover': {\n color: '$secondary500',\n },\n});\n\nexport function SwitchFromAndToButton() {\n const switchFromAndTo = useBestRouteStore.use.switchFromAndTo();\n\n return (\n <SwitchButtonContainer>\n <StyledButton\n onClick={() => {\n switchFromAndTo();\n }}>\n <ReverseIcon size={12} />\n </StyledButton>\n </SwitchButtonContainer>\n );\n}\n", "import { useEffect, useRef, useState } from 'react';\n\nimport { useBestRouteStore } from '../store/bestRoute';\nimport { useSettingsStore } from '../store/settings';\nimport { debounce } from '../utils/common';\nimport { isPositiveNumber } from '../utils/numbers';\nimport { createBestRouteRequestBody } from '../utils/swap';\nimport { tokensAreEqual } from '../utils/wallets';\n\nimport { useFetchBestRoute } from './useFetchBestRoute';\n\nconst DEBOUNCE_DELAY = 600;\n\ntype UseSwapInput = {\n fetch: () => void;\n loading: boolean;\n error: string;\n};\n\n/**\n * a hook for fetching best route based on from and to input values\n * we use this hook in home page\n */\nexport function useSwapInput(): UseSwapInput {\n const { fetch: fetchBestRoute, cancelFetch } = useFetchBestRoute();\n const [loading, setLoading] = useState(false);\n const {\n fromToken,\n toToken,\n inputAmount,\n inputUsdValue,\n resetRoute,\n setRoute,\n } = useBestRouteStore();\n const {\n slippage,\n customSlippage,\n affiliatePercent,\n affiliateRef,\n affiliateWallets,\n disabledLiquiditySources,\n } = useSettingsStore();\n const [error, setError] = useState('');\n const prevDisabledLiquiditySources = useRef(disabledLiquiditySources);\n const userSlippage = customSlippage ?? slippage;\n const hasTokensValue = !fromToken || !toToken;\n const shouldSkipRequest =\n hasTokensValue ||\n tokensAreEqual(fromToken, toToken) ||\n !isPositiveNumber(inputAmount);\n\n const fetch: UseSwapInput['fetch'] = () => {\n if (!loading) {\n setLoading(true);\n }\n if (!shouldSkipRequest) {\n resetRoute();\n const requestBody = createBestRouteRequestBody({\n fromToken,\n toToken,\n inputAmount,\n disabledLiquiditySources,\n slippage: userSlippage,\n affiliateRef,\n affiliatePercent,\n affiliateWallets,\n });\n fetchBestRoute(requestBody)\n .then((res) => {\n setLoading(false);\n setRoute(res);\n })\n .catch((error) => {\n resetRoute();\n if (error?.code !== 'ERR_CANCELED') {\n setError(error.message);\n setLoading(false);\n }\n });\n }\n };\n\n const debouncedFetch = debounce(() => {\n if (!shouldSkipRequest) {\n fetch();\n }\n }, DEBOUNCE_DELAY);\n\n useEffect(() => {\n if (!isPositiveNumber(inputAmount) || inputUsdValue?.eq(0)) {\n setLoading(false);\n cancelFetch();\n return;\n }\n if (shouldSkipRequest) {\n return;\n }\n resetRoute();\n setLoading(true);\n debouncedFetch();\n return cancelFetch;\n }, [inputAmount, shouldSkipRequest]);\n\n useEffect(() => {\n const disabledLiquiditySourceReset =\n !!prevDisabledLiquiditySources.current.length &&\n !disabledLiquiditySources.length;\n if (!shouldSkipRequest && disabledLiquiditySourceReset) {\n fetch();\n }\n prevDisabledLiquiditySources.current = disabledLiquiditySources;\n return cancelFetch;\n }, [disabledLiquiditySources.length]);\n\n return { fetch, loading, error };\n}\n", "import type { BestRouteRequest, BestRouteResponse } from 'rango-sdk';\n\nimport { useRef, useState } from 'react';\n\nimport { httpService } from '../services/httpService';\n\ninterface UseFetchBestRoute {\n fetch: (requestBody: BestRouteRequest) => Promise<BestRouteResponse>;\n cancelFetch: () => void;\n loading: boolean;\n}\n\nexport function useFetchBestRoute(): UseFetchBestRoute {\n const [loading, setLoading] = useState(false);\n const abortController = useRef<AbortController | null>(null);\n const cancel = () => abortController.current?.abort();\n\n const fetch: UseFetchBestRoute['fetch'] = async (requestBody) => {\n cancel();\n abortController.current = new AbortController();\n\n setLoading(true);\n\n try {\n const res = await httpService().getBestRoute(requestBody, {\n signal: abortController.current.signal,\n });\n abortController.current = null;\n return res;\n // eslint-disable-next-line @typescript-eslint/no-explicit-any, no-useless-catch\n } catch (error: any) {\n throw error;\n } finally {\n setLoading(false);\n }\n };\n return { fetch, loading, cancelFetch: cancel };\n}\n", "import { useEffect, useRef } from 'react';\nimport {\n createSearchParams,\n useLocation,\n useSearchParams,\n} from 'react-router-dom';\n\nimport { navigationRoutes } from '../constants/navigationRoutes';\nimport { SearchParams } from '../constants/searchParams';\nimport { useBestRouteStore } from '../store/bestRoute';\nimport { useMetaStore } from '../store/meta';\nimport { useUiStore } from '../store/ui';\nimport { searchParamsToToken } from '../utils/routing';\n\nexport function UpdateUrl() {\n const firstRender = useRef(true);\n const [searchParams, setSearchParams] = useSearchParams();\n const location = useLocation();\n const firstRenderSearchParams = useRef(location.search);\n const searchParamsRef = useRef<Record<string, string>>({});\n const fromBlockchain = useBestRouteStore.use.fromBlockchain();\n const toBlockchain = useBestRouteStore.use.toBlockchain();\n const fromToken = useBestRouteStore.use.fromToken();\n const toToken = useBestRouteStore.use.toToken();\n const setFromBlockchain = useBestRouteStore.use.setFromBlockchain();\n const setFromToken = useBestRouteStore.use.setFromToken();\n const setToBlockchain = useBestRouteStore.use.setToBlockchain();\n const setToToken = useBestRouteStore.use.setToToken();\n const inputAmount = useBestRouteStore.use.inputAmount();\n const setInputAmount = useBestRouteStore.use.setInputAmount();\n const loadingStatus = useMetaStore.use.loadingStatus();\n const { blockchains, tokens } = useMetaStore.use.meta();\n const setSelectedSwap = useUiStore.use.setSelectedSwap();\n\n useEffect(() => {\n const params: Record<string, string> = {};\n createSearchParams(firstRenderSearchParams.current).forEach(\n (value, key) => {\n params[key] = value;\n }\n );\n searchParamsRef.current = params;\n const requestId =\n location.pathname.split(navigationRoutes.swaps + '/')[1] || null;\n if (requestId) {\n setSelectedSwap(requestId);\n }\n }, []);\n\n useEffect(() => {\n if (!firstRender.current) {\n let fromChainString = '',\n fromTokenString = '',\n toChainString = '',\n toTokenString = '',\n fromAmount = '';\n if (loadingStatus !== 'success') {\n fromChainString = searchParamsRef.current[SearchParams.FROM_CHAIN];\n fromTokenString = searchParamsRef.current[SearchParams.FROM_TOKEN];\n toChainString = searchParamsRef.current[SearchParams.TO_CHAIN];\n toTokenString = searchParamsRef.current[SearchParams.TO_TOKEN];\n fromAmount =\n searchParamsRef.current[SearchParams.FROM_AMOUNT] || inputAmount;\n } else {\n if (location.state === 'redirect') {\n return;\n }\n fromChainString = fromBlockchain?.name || '';\n fromTokenString =\n (fromToken?.symbol || '') +\n (fromToken?.address ? `--${fromToken?.address}` : '');\n toChainString = toBlockchain?.name || '';\n toTokenString =\n (toToken?.symbol || '') +\n (toToken?.address ? `--${toToken?.address}` : '');\n fromAmount = inputAmount;\n }\n setSearchParams(\n {\n ...(fromChainString && {\n [SearchParams.FROM_CHAIN]: fromChainString,\n }),\n ...(fromTokenString && {\n [SearchParams.FROM_TOKEN]: fromTokenString,\n }),\n ...(toChainString && { [SearchParams.TO_CHAIN]: toChainString }),\n ...(toTokenString && { [SearchParams.TO_TOKEN]: toTokenString }),\n ...(fromAmount && {\n [SearchParams.FROM_AMOUNT]: fromAmount.toString(),\n }),\n },\n { replace: true }\n );\n }\n firstRender.current = false;\n }, [\n location.pathname,\n inputAmount,\n fromBlockchain,\n fromToken,\n toBlockchain,\n toToken,\n ]);\n\n useEffect(() => {\n if (loadingStatus === 'success') {\n const fromChainString = searchParams.get(SearchParams.FROM_CHAIN);\n const fromTokenString = searchParams.get(SearchParams.FROM_TOKEN);\n const toChainString = searchParams.get(SearchParams.TO_CHAIN);\n const toTokenString = searchParams.get(SearchParams.TO_TOKEN);\n const fromAmount = searchParams.get(SearchParams.FROM_AMOUNT);\n const fromBlockchain = blockchains.find(\n (blockchain) => blockchain.name === fromChainString\n );\n const fromToken = searchParamsToToken(\n tokens,\n fromTokenString,\n fromBlockchain || null\n );\n const toBlockchain = blockchains.find(\n (blockchain) => blockchain.name === toChainString\n );\n const toToken = searchParamsToToken(\n tokens,\n toTokenString,\n toBlockchain || null\n );\n if (!!fromBlockchain) {\n setFromBlockchain(fromBlockchain);\n if (!!fromToken) {\n setFromToken(fromToken);\n }\n }\n if (!!toBlockchain) {\n setToBlockchain(toBlockchain);\n if (!!toToken) {\n setToToken(toToken);\n }\n }\n if (fromAmount) {\n setInputAmount(fromAmount);\n }\n }\n }, [loadingStatus]);\n\n return null;\n}\n", "import type { WidgetConfig } from '../types';\n\nimport React from 'react';\nimport { useRoutes } from 'react-router-dom';\n\nimport { navigationRoutes } from '../constants/navigationRoutes';\nimport { ConfirmSwapPage } from '../pages/ConfirmSwapPage';\nimport { HistoryPage } from '../pages/HistoryPage';\nimport { Home } from '../pages/Home';\nimport { LanguagePage } from '../pages/LanguagePage';\nimport { LiquiditySourcePage } from '../pages/LiquiditySourcePage';\nimport { SelectBlockchainPage } from '../pages/SelectBlockchainPage';\nimport { SelectSwapItemsPage } from '../pages/SelectSwapItemsPage';\nimport { SettingsPage } from '../pages/SettingsPage';\nimport { SwapDetailsPage } from '../pages/SwapDetailsPage';\nimport { ThemePage } from '../pages/ThemePage';\nimport { WalletsPage } from '../pages/WalletsPage';\n\nconst getAbsolutePath = (path: string) => path.replace('/', '');\n\ninterface PropTypes {\n config?: WidgetConfig;\n}\n\nexport function AppRoutes(props: PropTypes) {\n const { config } = props;\n\n return useRoutes([\n {\n path: navigationRoutes.home,\n element: <Home />,\n },\n {\n path: navigationRoutes.fromSwap,\n element: (\n <SelectSwapItemsPage\n type=\"from\"\n supportedBlockchains={config?.from?.blockchains}\n supportedTokens={config?.from?.tokens}\n pinnedTokens={config?.pinnedTokens}\n />\n ),\n },\n {\n path: navigationRoutes.toSwap,\n element: (\n <SelectSwapItemsPage\n type=\"to\"\n supportedBlockchains={config?.to?.blockchains}\n supportedTokens={config?.to?.tokens}\n pinnedTokens={config?.pinnedTokens}\n />\n ),\n },\n {\n path: navigationRoutes.fromBlockchain,\n element: (\n <SelectBlockchainPage\n type=\"from\"\n supportedBlockchains={config?.to?.blockchains}\n />\n ),\n },\n {\n path: navigationRoutes.toBlockchain,\n element: (\n <SelectBlockchainPage\n type=\"to\"\n supportedBlockchains={config?.to?.blockchains}\n />\n ),\n },\n {\n path: navigationRoutes.settings,\n element: (\n <SettingsPage\n singleTheme={config?.theme?.singleTheme}\n supportedSwappers={config?.liquiditySources}\n />\n ),\n },\n {\n path: navigationRoutes.themes,\n element: <ThemePage />,\n },\n {\n path: navigationRoutes.languages,\n element: <LanguagePage />,\n },\n {\n path: navigationRoutes.exchanges,\n element: (\n <LiquiditySourcePage\n sourceType=\"Exchanges\"\n supportedSwappers={config?.liquiditySources}\n />\n ),\n },\n {\n path: navigationRoutes.bridges,\n element: (\n <LiquiditySourcePage\n sourceType=\"Bridges\"\n supportedSwappers={config?.liquiditySources}\n />\n ),\n },\n { path: navigationRoutes.swaps, element: <HistoryPage /> },\n {\n path: navigationRoutes.swapDetails,\n element: <SwapDetailsPage />,\n },\n {\n path: navigationRoutes.wallets,\n element: (\n <WalletsPage\n supportedWallets={config?.wallets}\n multiWallets={\n typeof config?.multiWallets === 'undefined'\n ? true\n : config.multiWallets\n }\n config={config}\n />\n ),\n },\n {\n path: getAbsolutePath(navigationRoutes.confirmSwap),\n element: <ConfirmSwapPage config={config} />,\n },\n ]);\n}\n", "/* eslint-disable @typescript-eslint/no-magic-numbers */\nimport type {\n ConfirmSwap,\n ConfirmSwapFetchResult,\n} from '../hooks/useConfirmSwap';\nimport type { WidgetConfig } from '../types';\n\nimport { i18n } from '@lingui/core';\nimport { useManager } from '@rango-dev/queue-manager-react';\nimport {\n Alert,\n BestRoute,\n BestRouteSkeleton,\n Button,\n Divider,\n IconButton,\n MessageBox,\n Modal,\n RefreshIcon,\n SettingsIcon,\n styled,\n Tooltip,\n Typography,\n WalletIcon,\n} from '@rango-dev/ui';\nimport React, { useEffect, useState } from 'react';\nimport { flushSync } from 'react-dom';\nimport { useNavigate } from 'react-router-dom';\n\nimport {\n formatBestRoute,\n getRequiredWallets,\n} from '../components/ConfirmWalletsModal/ConfirmWallets.helpers';\nimport { ConfirmWalletsModal } from '../components/ConfirmWalletsModal/ConfirmWalletsModal';\nimport { HeaderButton } from '../components/HeaderButtons/HeaderButtons.styles';\nimport { Layout } from '../components/Layout';\nimport { NoRoutes } from '../components/NoRoutes';\nimport { getConfirmSwapErrorMessage } from '../constants/errors';\nimport { navigationRoutes } from '../constants/navigationRoutes';\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 { getRouteWarningMessage } from '../constants/warnings';\nimport { useConfirmSwap } from '../hooks/useConfirmSwap';\nimport { useBestRouteStore } from '../store/bestRoute';\nimport { useMetaStore } from '../store/meta';\nimport { useSettingsStore } from '../store/settings';\nimport { useUiStore } from '../store/ui';\nimport { useWalletsStore } from '../store/wallets';\nimport {\n ConfirmSwapErrorTypes,\n RouteWarningType,\n SlippageWarningType,\n} from '../types';\nimport { getContainer } from '../utils/common';\nimport {\n numberToString,\n secondsToString,\n totalArrivalTime,\n} from '../utils/numbers';\nimport { getPriceImpactLevel } from '../utils/routing';\nimport { getPercentageChange, getTotalFeeInUsd } from '../utils/swap';\n\nconst Container = styled('div', {\n position: 'relative',\n width: '100%',\n '& .description': {\n display: 'flex',\n justifyContent: 'space-between',\n alignItems: 'center',\n paddingBottom: '$10',\n },\n '& .icon': {\n width: '$24',\n height: '$24',\n display: 'flex',\n justifyContent: 'center',\n alignItems: 'center',\n },\n});\n\nconst Buttons = styled('div', {\n width: '100%',\n display: 'flex',\n justifyContent: 'space-between',\n '& .confirm-button': {\n flexGrow: 1,\n paddingRight: '$10',\n },\n [`& ${IconButton}`]: {\n width: '$48',\n height: '$48',\n },\n});\n\ntype PropTypes = {\n config?: WidgetConfig;\n};\n\nexport function ConfirmSwapPage(props: PropTypes) {\n //TODO: move component's logics to a custom hook\n const { config } = props;\n const {\n bestRoute,\n inputAmount,\n outputAmount,\n inputUsdValue,\n outputUsdValue,\n setInputAmount,\n selectedWallets,\n routeWalletsConfirmed,\n setRouteWalletConfirmed,\n customDestination,\n } = useBestRouteStore();\n const navigate = useNavigate();\n const [dbErrorMessage, setDbErrorMessage] = useState<string>('');\n const [showSlippageWarning, setShowSlippageWarning] = useState(false);\n\n const { connectedWallets } = useWalletsStore();\n const showWalletsOnInit = !routeWalletsConfirmed;\n const [showWallets, setShowWallets] = useState(false);\n const setSelectedSwap = useUiStore.use.setSelectedSwap();\n const {\n meta: { tokens },\n loadingStatus: loadingMetaStatus,\n } = useMetaStore();\n const slippage = useSettingsStore.use.slippage();\n const customSlippage = useSettingsStore.use.customSlippage();\n const { manager } = useManager();\n const selectedSlippage = customSlippage || slippage;\n const {\n fetch: confirmSwap,\n loading: fetchingConfirmationRoute,\n cancelFetch,\n } = useConfirmSwap();\n const [confirmSwapResult, setConfirmSwapResult] =\n useState<ConfirmSwapFetchResult>({\n swap: null,\n error: null,\n warnings: null,\n });\n const showSkeleton =\n fetchingConfirmationRoute || loadingMetaStatus === 'loading';\n const showNoRouteFound =\n !fetchingConfirmationRoute &&\n confirmSwapResult.error &&\n [\n ConfirmSwapErrorTypes.NO_ROUTE,\n ConfirmSwapErrorTypes.REQUEST_FAILED,\n ].includes(confirmSwapResult.error.type);\n const showBestRoute =\n !showNoRouteFound &&\n !fetchingConfirmationRoute &&\n bestRoute &&\n bestRoute.result;\n\n const totalFeeInUsd = getTotalFeeInUsd(bestRoute, tokens);\n const percentageChange = numberToString(\n getPercentageChange(\n inputUsdValue?.toNumber() ?? 0,\n outputUsdValue?.toNumber() ?? 0\n ),\n PERCENTAGE_CHANGE_MIN_DECIMALS,\n PERCENTAGE_CHANGE_MAX_DECIMALS\n );\n\n const warningLevel = getPriceImpactLevel(parseFloat(percentageChange));\n\n const onConfirmSwap: ConfirmSwap['fetch'] = async ({\n selectedWallets,\n customDestination,\n }) => {\n const result = await confirmSwap?.({ selectedWallets, customDestination });\n setConfirmSwapResult(result);\n return result;\n };\n\n const addNewSwap = async () => {\n if (confirmSwapResult.swap && routeWalletsConfirmed) {\n try {\n await manager?.create(\n 'swap',\n { swapDetails: confirmSwapResult.swap },\n { id: confirmSwapResult.swap.requestId }\n );\n setSelectedSwap(confirmSwapResult.swap.requestId);\n navigate(\n '/' + navigationRoutes.swaps + `/${confirmSwapResult.swap.requestId}`,\n {\n replace: true,\n }\n );\n setTimeout(() => {\n setInputAmount('');\n }, 0);\n } catch (e) {\n setDbErrorMessage('Error: ' + (e as any)?.message);\n }\n }\n };\n\n const onConfirm = async () => {\n await addNewSwap();\n };\n\n const onStartConfirmSwap = async () => {\n if (confirmSwapResult?.warnings?.slippage) {\n setShowSlippageWarning(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 })\n .then((res) => {\n setConfirmSwapResult(res);\n })\n .catch((error) => console.error(error));\n };\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 useEffect(() => {\n const routeChanged =\n confirmSwapResult.warnings?.route?.type &&\n Object.values(RouteWarningType).includes(\n confirmSwapResult.warnings?.route?.type\n );\n\n const selectedWalletDisconnected =\n selectedWallets.length < 1 ||\n !selectedWallets.every((selectedWallet) =>\n connectedWallets.find(\n (connectedWallet) =>\n selectedWallet.address === connectedWallet.address &&\n selectedWallet.walletType === connectedWallet.walletType &&\n selectedWallet.chain === connectedWallet.chain\n )\n );\n\n let routeWalletsChanged = false;\n\n if (routeChanged) {\n let requiredWallets = getRequiredWallets(bestRoute);\n\n const lastStepToBlockchain =\n bestRoute?.result?.swaps[bestRoute.result.swaps.length - 1].to\n .blockchain;\n\n const isLastWalletRequired = !!bestRoute?.result?.swaps.find(\n (swap) => swap.from.blockchain === lastStepToBlockchain\n );\n\n if (!isLastWalletRequired) {\n requiredWallets = requiredWallets.slice(\n -requiredWallets.length,\n requiredWallets.length - 1\n );\n }\n\n const allRequiredWalletsSelected = requiredWallets.every(\n (requiredWallet) =>\n selectedWallets.find(\n (selectedWallet) => selectedWallet.chain === requiredWallet\n )\n );\n\n if (!allRequiredWalletsSelected) {\n routeWalletsChanged = true;\n }\n }\n\n if (bestRoute && (selectedWalletDisconnected || routeWalletsChanged)) {\n queueMicrotask(() => flushSync(setShowWallets.bind(null, true)));\n setRouteWalletConfirmed(false);\n }\n }, [\n confirmSwapResult.warnings?.route,\n selectedWallets.length,\n connectedWallets.length,\n ]);\n\n return (\n <Layout\n header={{\n title: 'Confirm Swap',\n onBack: navigate.bind(null, -1),\n hasConnectWallet: true,\n suffix: (\n <Tooltip\n container={getContainer()}\n side=\"bottom\"\n content={i18n.t('Settings')}>\n <HeaderButton\n size=\"small\"\n variant=\"ghost\"\n onClick={() => navigate('/' + navigationRoutes.settings)}>\n <SettingsIcon size={18} color=\"black\" />\n </HeaderButton>\n </Tooltip>\n ),\n }}\n footer={\n <Buttons>\n <div className=\"confirm-button\">\n <Button\n variant=\"contained\"\n type=\"primary\"\n size=\"large\"\n fullWidth\n loading={fetchingConfirmationRoute}\n disabled={!!confirmSwapResult.error}\n onClick={onStartConfirmSwap}>\n Start Swap\n </Button>\n </div>\n <IconButton\n variant=\"contained\"\n type=\"primary\"\n size=\"large\"\n loading={fetchingConfirmationRoute}\n onClick={setShowWallets.bind(null, true)}>\n <WalletIcon size={24} />\n </IconButton>\n </Buttons>\n }>\n <Modal\n anchor=\"bottom\"\n open={showSlippageWarning}\n prefix={\n <Button\n size=\"small\"\n variant=\"ghost\"\n onClick={() => navigate('/' + navigationRoutes.settings)}>\n <Typography variant=\"label\" size=\"medium\" color=\"$neutral900\">\n Change settings\n </Typography>\n </Button>\n }\n container={document.querySelector('#swap-box') as HTMLDivElement}\n onClose={setShowSlippageWarning.bind(null, (prevState) => !prevState)}>\n {confirmSwapResult.warnings?.slippage && (\n <MessageBox\n type=\"warning\"\n title={\n confirmSwapResult.warnings.slippage.type ===\n SlippageWarningType.HIGH_SLIPPAGE\n ? 'High slippage'\n : 'Low slippage'\n }\n description={\n confirmSwapResult.warnings.slippage.type ===\n SlippageWarningType.HIGH_SLIPPAGE\n ? i18n.t(\n 'highSlippage',\n { selectedSlippage },\n {\n message:\n ' Caution, your slippage is high (={selectedSlippage}). Your trade may be front run.',\n }\n )\n : i18n.t(\n 'increaseSlippage',\n\n {\n minRequiredSlippage:\n confirmSwapResult.warnings.slippage.slippage,\n },\n {\n message:\n 'We recommend you to increase slippage to at least {minRequiredSlippage} for this route.',\n }\n )\n }>\n <Divider size={18} />\n <Divider size={32} />\n <Button\n size=\"large\"\n type=\"primary\"\n variant=\"contained\"\n fullWidth\n onClick={onConfirm}>\n Confirm anyway\n </Button>\n </MessageBox>\n )}\n </Modal>\n {showWallets && (\n <ConfirmWalletsModal\n open={showWallets}\n onClose={() => setShowWallets(false)}\n onCancel={cancelFetch}\n loading={fetchingConfirmationRoute}\n onCheckBalance={onConfirmSwap}\n config={config}\n />\n )}\n\n <Container>\n <div className=\"description\">\n <Typography variant=\"title\" size=\"small\">\n You get\n </Typography>\n <Button\n style={{ padding: '0' }}\n variant=\"ghost\"\n disabled={fetchingConfirmationRoute}\n onClick={onRefresh}>\n <div className=\"icon\">\n <RefreshIcon size={16} />\n </div>\n </Button>\n </div>\n {dbErrorMessage && (\n <>\n <Alert type=\"error\" variant=\"alarm\" title={dbErrorMessage} />\n <Divider size={12} />\n </>\n )}\n {confirmSwapResult.warnings?.route && (\n <>\n <Alert\n variant=\"alarm\"\n type=\"warning\"\n title={getRouteWarningMessage(confirmSwapResult.warnings.route)}\n />\n <Divider size={12} />\n </>\n )}\n {showSkeleton && <BestRouteSkeleton type=\"swap-preview\" expanded />}\n {showBestRoute && (\n <BestRoute\n expanded={true}\n tooltipContainer={\n document.getElementById('swap-box') as HTMLElement\n }\n steps={formatBestRoute(bestRoute) ?? []}\n input={{\n value: numberToString(\n inputAmount,\n TOKEN_AMOUNT_MIN_DECIMALS,\n TOKEN_AMOUNT_MAX_DECIMALS\n ),\n usdValue: numberToString(\n inputUsdValue,\n USD_VALUE_MIN_DECIMALS,\n USD_VALUE_MAX_DECIMALS\n ),\n }}\n output={{\n value: numberToString(\n outputAmount,\n TOKEN_AMOUNT_MIN_DECIMALS,\n TOKEN_AMOUNT_MAX_DECIMALS\n ),\n usdValue: numberToString(\n outputUsdValue,\n USD_VALUE_MIN_DECIMALS,\n USD_VALUE_MAX_DECIMALS\n ),\n }}\n totalFee={numberToString(\n totalFeeInUsd,\n GAS_FEE_MIN_DECIMALS,\n GAS_FEE_MAX_DECIMALS\n )}\n totalTime={secondsToString(totalArrivalTime(bestRoute))}\n recommended={true}\n type=\"swap-preview\"\n percentageChange={percentageChange}\n warningLevel={warningLevel}\n />\n )}\n {showNoRouteFound && (\n <>\n <Divider size={12} />\n <NoRoutes\n diagnosisMessage={\n confirmSwapResult.error?.type === ConfirmSwapErrorTypes.NO_ROUTE\n ? confirmSwapResult.error.diagnosisMessage\n : undefined\n }\n error={\n confirmSwapResult.error?.type ===\n ConfirmSwapErrorTypes.REQUEST_FAILED\n }\n fetch={onRefresh}\n />\n </>\n )}\n {confirmSwapResult.error?.type ===\n ConfirmSwapErrorTypes.ROUTE_UPDATED_WITH_HIGH_VALUE_LOSS && (\n <>\n <Alert\n variant=\"alarm\"\n type=\"error\"\n title={getConfirmSwapErrorMessage(confirmSwapResult.error)}\n />\n <Divider size={12} />\n </>\n )}\n </Container>\n </Layout>\n );\n}\n", "import type { PropTypes } from './ConfirmWalletsModal.types';\nimport type { ConnectedWallet } from '../../store/wallets';\nimport type { ConfirmSwapWarnings, Wallet } from '../../types';\n\nimport {\n Alert,\n BalanceErrors,\n Button,\n ChevronDownIcon,\n ChevronLeftIcon,\n Divider,\n MessageBox,\n Modal,\n Typography,\n WalletIcon,\n} from '@rango-dev/ui';\nimport React, { useEffect, useState } from 'react';\nimport { useNavigate } from 'react-router-dom';\n\nimport { getConfirmSwapErrorMessage } from '../../constants/errors';\nimport { navigationRoutes } from '../../constants/navigationRoutes';\nimport { getRouteWarningMessage } from '../../constants/warnings';\nimport { useBestRouteStore } from '../../store/bestRoute';\nimport { useMetaStore } from '../../store/meta';\nimport { useWalletsStore } from '../../store/wallets';\nimport { confirmSwapDisabled } from '../../utils/swap';\n\nimport { getRequiredWallets, isValidAddress } from './ConfirmWallets.helpers';\nimport {\n CollapsibleContent,\n CollapsibleRoot,\n ConfirmButton,\n CustomDestination,\n CustomDestinationButton,\n ExpandedIcon,\n ListContainer,\n NavigateBack,\n ShowMoreHeader,\n StyledTextField,\n Title,\n Trigger,\n Wallets,\n WalletsContainer,\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, config, loading } = props;\n const { blockchains } = useMetaStore.use.meta();\n const {\n bestRoute,\n setSelectedWallets: selectRouteWallets,\n routeWalletsConfirmed,\n setRouteWalletConfirmed,\n customDestination,\n setCustomDestination,\n } = useBestRouteStore();\n const { connectedWallets, selectWallets } = useWalletsStore();\n\n const [showMoreWalletFor, setShowMoreWalletFor] = useState('');\n const [balanceWarnings, setBalanceWarnings] = useState<string[]>([]);\n const [error, setError] = useState('');\n const [routeWarning, setRouteWarning] = useState<\n ConfirmSwapWarnings['route'] | null\n >(null);\n const [destination, setDestination] = useState(customDestination);\n const [showCustomDestination, setShowCustomDestination] = useState(\n !!customDestination\n );\n const requiredWallets = getRequiredWallets(bestRoute);\n const customDestinationEnabled =\n typeof config?.customDestination === 'undefined'\n ? true\n : config.customDestination;\n\n const lastStepToBlockchain = blockchains.find(\n (blockchain) =>\n blockchain.name ===\n bestRoute?.result?.swaps[bestRoute?.result?.swaps.length - 1].to\n .blockchain\n );\n const isWalletRequiredFor = (blockchain: string) =>\n !!bestRoute?.result?.swaps.find(\n (swap) => swap.from.blockchain === blockchain\n );\n\n const [selectableWallets, setSelectableWallets] = useState<ConnectedWallet[]>(\n connectedWallets.filter((connectedWallet) => {\n return (\n connectedWallet.selected &&\n requiredWallets.includes(connectedWallet.chain)\n );\n })\n );\n const lastStepToBlockchainMeta = blockchains.find(\n (chain) => chain.name === lastStepToBlockchain?.name\n );\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) && !destination))\n );\n\n const isAddressMatched =\n !!destination &&\n showCustomDestination &&\n lastStepToBlockchainMeta &&\n !isValidAddress(lastStepToBlockchainMeta, destination);\n\n const resetCustomDestination = () => {\n setShowCustomDestination(false);\n setDestination('');\n setSelectableWallets((selectableWallets) => {\n let anyWalletSelected = false;\n return selectableWallets.map((selectableWallet) => {\n if (\n !anyWalletSelected &&\n selectableWallet.chain === lastStepToBlockchain?.name\n ) {\n anyWalletSelected = true;\n return {\n ...selectableWallet,\n selected: true,\n };\n }\n return selectableWallet;\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 (wallet.chain === lastStepToBlockchain?.name && showCustomDestination) {\n setShowCustomDestination(false);\n setDestination('');\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 selectWallets(lastSelectedWallets);\n selectRouteWallets(lastSelectedWallets);\n setCustomDestination(destination);\n setRouteWalletConfirmed(true);\n onClose();\n };\n\n const onConfirmWallets = async () => {\n setBalanceWarnings([]);\n setError('');\n setRouteWarning(null);\n const selectedWallets = connectedWallets.filter((connectedWallet) =>\n selectableWallets.find(\n (selectableWallet) =>\n selectableWallet.chain === connectedWallet.chain &&\n selectableWallet.walletType === connectedWallet.walletType\n )\n );\n const result = await onCheckBalance?.({\n selectedWallets,\n customDestination: destination,\n });\n\n const warnings = result.warnings;\n if (warnings?.balance?.messages) {\n setBalanceWarnings(warnings.balance.messages);\n }\n if (warnings?.route) {\n setRouteWarning(warnings.route);\n }\n if (result.error) {\n setError(getConfirmSwapErrorMessage(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 selectableWallets.concat(\n connectedWallets.filter((connectedWallet) => {\n const anyWalletSelected = !!selectableWallets.find(\n (selectableWallet) =>\n selectableWallet.chain === connectedWallet.chain\n );\n\n return (\n !anyWalletSelected &&\n connectedWallet.selected &&\n requiredWallets.includes(connectedWallet.chain)\n );\n })\n )\n );\n }, [connectedWallets.length]);\n\n const modalContainer = document.querySelector('#swap-box') as HTMLDivElement;\n\n const navigate = useNavigate();\n return (\n <Modal\n open={open}\n onClose={() => {\n if (!routeWalletsConfirmed) {\n navigate(navigationRoutes.home, { replace: true });\n }\n onClose();\n }}\n dismissible={!showMoreWalletFor}\n container={modalContainer}\n {...(!showMoreWalletFor && {\n footer: (\n <ConfirmButton>\n <Button\n loading={loading}\n disabled={confirmSwapDisabled(\n loading,\n showCustomDestination,\n destination,\n bestRoute,\n selectableWallets,\n lastStepToBlockchain\n )}\n onClick={onConfirmWallets}\n variant=\"contained\"\n type=\"primary\"\n fullWidth\n size=\"large\">\n Confirm\n </Button>\n </ConfirmButton>\n ),\n })}\n {...(showMoreWalletFor && {\n containerStyle: { padding: '$0' },\n header: (\n <ShowMoreHeader>\n <NavigateBack\n variant=\"ghost\"\n onClick={setShowMoreWalletFor.bind(null, '')}>\n <ChevronLeftIcon size={16} />\n </NavigateBack>\n <Typography\n variant=\"headline\"\n size=\"small\">{`Your ${showMoreWalletFor} wallets`}</Typography>\n </ShowMoreHeader>\n ),\n })}\n anchor=\"center\">\n <Modal\n open={balanceWarnings.length > 0}\n onClose={setBalanceWarnings.bind(null, [])}\n container={modalContainer}>\n <MessageBox\n title=\"Insufficient account balance\"\n type=\"error\"\n description={<BalanceErrors messages={balanceWarnings ?? []} />}>\n <Button\n variant=\"outlined\"\n size=\"large\"\n type=\"primary\"\n fullWidth\n onClick={onConfirmBalance}>\n Proceed anyway\n </Button>\n </MessageBox>\n </Modal>\n {showMoreWalletFor && (\n <WalletsContainer>\n <div className=\"wallets-list\">\n <WalletList\n chain={showMoreWalletFor}\n isSelected={isSelected}\n selectWallet={onChange}\n multiWallets={config?.multiWallets ?? true}\n supportedWallets={config?.wallets ?? []}\n config={config}\n onShowMore={setShowMoreWalletFor.bind(null, showMoreWalletFor)}\n />\n </div>\n </WalletsContainer>\n )}\n {!showMoreWalletFor && (\n <>\n {error && (\n <>\n <Alert variant=\"alarm\" type=\"error\" title={error} />\n <Divider size={12} />\n </>\n )}\n {routeWarning && (\n <>\n <Alert\n variant=\"alarm\"\n type=\"warning\"\n title={getRouteWarningMessage(routeWarning)}\n />\n <Divider size={12} />\n </>\n )}\n <Wallets>\n {requiredWallets.map((requiredWallet, index) => {\n const blockchain = blockchains.find(\n (blockchain) => blockchain.name === requiredWallet\n );\n\n const key = `wallet-${index}`;\n const isLastWallet = index === requiredWallets.length - 1;\n\n return (\n <div key={key}>\n <Title>\n <Typography\n variant=\"title\"\n size=\"xmedium\">{`Your ${blockchain?.displayName} wallets`}</Typography>\n <Typography\n variant=\"label\"\n color=\"$neutral900\"\n size=\"medium\">{`You need to connect a ${blockchain?.displayName} wallet.`}</Typography>\n </Title>\n <Divider size={24} />\n <ListContainer>\n <WalletList\n chain={requiredWallet}\n isSelected={isSelected}\n selectWallet={onChange}\n multiWallets={config?.multiWallets ?? true}\n supportedWallets={config?.wallets ?? []}\n config={config}\n limit={NUMBER_OF_WALLETS_TO_DISPLAY}\n onShowMore={() =>\n setShowMoreWalletFor(blockchain?.name ?? '')\n }\n />\n </ListContainer>\n {!isLastWallet && <Divider size={32} />}\n {isLastWallet && customDestinationEnabled && (\n <CustomDestination>\n <CollapsibleRoot\n selected={showCustomDestination}\n open={showCustomDestination}\n onOpenChange={(checked) => {\n if (!checked) {\n resetCustomDestination();\n } else {\n if (\n !isWalletRequiredFor(\n lastStepToBlockchain?.name ?? ''\n )\n ) {\n setSelectableWallets((selectableWallets) =>\n selectableWallets.map((selectableWallet) => {\n if (\n selectableWallet.chain ===\n lastStepToBlockchain?.name\n ) {\n return {\n ...selectableWallet,\n selected: false,\n };\n }\n return selectableWallet;\n })\n );\n }\n }\n }}>\n <Trigger\n onClick={() =>\n setShowCustomDestination((prevState) => !prevState)\n }>\n <CustomDestinationButton\n fullWidth\n variant=\"default\"\n suffix={\n <ExpandedIcon\n orientation={\n showCustomDestination ? 'up' : 'down'\n }>\n <ChevronDownIcon size={10} color=\"gray\" />\n </ExpandedIcon>\n }>\n <div className=\"button__content\">\n <WalletIcon size={18} color=\"info\" />\n <Divider size={4} direction=\"horizontal\" />\n <Typography variant=\"label\" size=\"medium\">\n Send to a different address\n </Typography>\n </div>\n </CustomDestinationButton>\n </Trigger>\n <CollapsibleContent open={showCustomDestination}>\n <>\n <Divider size={4} />\n <StyledTextField\n autoFocus\n placeholder=\"Your destination address\"\n value={destination}\n onChange={(e) => {\n setDestination(e.target.value);\n }}\n />\n </>\n </CollapsibleContent>\n </CollapsibleRoot>\n {isAddressMatched && (\n <div className=\"alarms\">\n <Alert\n variant=\"alarm\"\n type=\"error\"\n title={`Address '${destination}' doesn't match the blockchain address pattern.`}\n />\n </div>\n )}\n </CustomDestination>\n )}\n </div>\n );\n })}\n </Wallets>\n </>\n )}\n </Modal>\n );\n}\n", "import type { RouteWarning } from '../types';\n\nimport { i18n } from '@lingui/core';\n\nimport { RouteWarningType } from '../types';\n\nexport function getRouteWarningMessage(warning: RouteWarning) {\n switch (warning.type) {\n case RouteWarningType.ROUTE_UPDATED:\n return i18n.t('Route has been updated.');\n case RouteWarningType.ROUTE_AND_OUTPUT_AMOUNT_UPDATED:\n return i18n.t(\n 'Output amount changed to {newOutputAmount} ({percentageChange}% change).',\n {\n newOutputAmount: warning.newOutputAmount,\n percentageChange: warning.percentageChange,\n }\n );\n case RouteWarningType.ROUTE_SWAPPERS_UPDATED:\n return i18n.t('Route swappers has been updated.');\n case RouteWarningType.ROUTE_COINS_UPDATED:\n return i18n.t('Route internal coins has been updated.');\n default:\n return '';\n }\n}\n", "import * as Collapsible from '@radix-ui/react-collapsible';\nimport {\n Button,\n darkTheme,\n IconButton,\n keyframes,\n styled,\n TextField,\n} from '@rango-dev/ui';\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 Title = styled('div', {\n display: 'flex',\n flexDirection: 'column',\n justifyContent: 'center',\n alignItems: 'center',\n});\n\nexport const ListContainer = styled('div', {\n display: 'grid',\n gap: '$10',\n gridTemplateColumns: ' repeat(3, minmax(0, 1fr))',\n alignContent: 'baseline',\n});\n\nexport const WalletButton = styled('button', {\n borderRadius: '$xm',\n padding: '$10',\n border: '0',\n display: 'flex',\n justifyContent: 'center',\n $$color: '$colors$neutral100',\n [`.${darkTheme} &`]: {\n $$color: '$colors$neutral300',\n },\n backgroundColor: '$$color',\n alignItems: 'center',\n cursor: 'pointer',\n width: 110,\n position: 'relative',\n\n '&:hover': {\n $$color: '$colors$info100',\n [`.${darkTheme} &`]: {\n $$color: '$colors$neutral100',\n },\n backgroundColor: '$$color',\n },\n\n '&:focus-visible': {\n $$color: '$colors$info100',\n [`.${darkTheme} &`]: {\n $$color: '$colors$info700',\n },\n backgroundColor: '$$color',\n outline: 0,\n },\n variants: {\n selected: {\n true: {\n outlineWidth: 1,\n outlineColor: '$secondary',\n outlineStyle: 'solid',\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});\n\nexport const ShowMoreHeader = styled('div', {\n padding: '$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 '& .wallets-list': {\n display: 'grid',\n gap: '$10',\n gridTemplateColumns: ' repeat(3, minmax(0, 1fr))',\n alignContent: 'baseline',\n },\n});\n\nexport const CollapsibleRoot = styled(Collapsible.Root, {\n backgroundColor: '$neutral200',\n borderRadius: '$sm',\n variants: {\n selected: {\n true: {\n outlineWidth: 1,\n outlineColor: '$secondary500',\n outlineStyle: 'solid',\n },\n },\n },\n});\n\nexport const CustomDestinationButton = styled(Button, {\n width: '100%',\n borderRadius: '$sm !important',\n padding: '$15 !important',\n justifyContent: 'space-between',\n alignItems: 'center',\n $$color: '$colors$neutral100',\n [`.${darkTheme} &`]: {\n $$color: '$colors$neutral300',\n },\n backgroundColor: '$$color',\n\n '&:hover': {\n $$color: '$colors$info100',\n [`.${darkTheme} &`]: {\n $$color: '$colors$neutral100',\n },\n backgroundColor: '$$color',\n },\n '&:focus-visible': {\n $$background: '$colors$info100',\n [`.${darkTheme} &`]: {\n $$background: '$colors$info700',\n },\n backgroundColor: '$$background',\n outline: 0,\n },\n});\n\nexport const CustomDestination = styled('div', {\n padding: '$10 $0',\n '& .button__content': {\n display: 'flex',\n justifyContent: 'center',\n alignItems: 'center',\n },\n '& .alarms': { paddingTop: '5px' },\n});\n\nexport const ExpandedIcon = styled('div', {\n transition: 'all 300ms 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 ConfirmButton = styled('div', {\n display: 'flex',\n});\n\nexport const StyledTextField = styled(TextField, {\n padding: '$0 $15 $15 $15',\n});\n\nexport const CollapsibleContent = styled(Collapsible.Content, {\n overflow: 'hidden',\n variants: {\n open: {\n true: {\n animation: `${slideDown} 300ms ease-out`,\n },\n false: {\n animation: `${slideUp} 300ms ease-out`,\n },\n },\n },\n});\n\nexport const Wallets = styled('div', { overflow: 'visible', width: '100%' });\n", "/* eslint-disable @typescript-eslint/no-magic-numbers */\nimport type { PropTypes } from './WalletList.type';\nimport type { Wallet } from '../../types';\nimport type { WalletInfo } from '@rango-dev/ui';\nimport type { WalletType } from '@rango-dev/wallets-shared';\n\nimport {\n Button,\n Divider,\n Image,\n MessageBox,\n Modal,\n SelectableWallet,\n Typography,\n WalletState,\n} from '@rango-dev/ui';\nimport React, { useEffect, useState } from 'react';\n\nimport { useWallets } from '../..';\nimport { useWalletList } from '../../hooks/useWalletList';\nimport { TIME_TO_CLOSE_MODAL } from '../../pages/WalletsPage';\nimport { useMetaStore } from '../../store/meta';\nimport { useWalletsStore } from '../../store/wallets';\nimport { getBlockchainDisplayNameFor } from '../../utils/meta';\nimport {\n getAddress,\n getConciseAddress,\n isExperimentalChain,\n} from '../../utils/wallets';\nimport { WalletModal } from '../WalletModal';\n\nimport { WalletButton } from './ConfirmWallets.styles';\nimport {\n LogoContainer,\n Spinner,\n WalletImageContainer,\n} from './WalletList.styles';\n\nexport function WalletList(props: PropTypes) {\n const { config, chain, isSelected, selectWallet, limit, onShowMore } = props;\n\n const connectedWallets = useWalletsStore.use.connectedWallets();\n const { blockchains } = useMetaStore.use.meta();\n const [openWalletStateModal, setOpenWalletStateModal] =\n useState<WalletType>('');\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' | null>(null);\n const { connect } = useWallets();\n const { list, error, handleClick } = useWalletList({\n config,\n chain,\n onBeforeConnect: setOpenWalletStateModal,\n onConnect: () =>\n setTimeout(() => setOpenWalletStateModal(''), TIME_TO_CLOSE_MODAL),\n });\n const [sortedList, setSortedList] = useState<WalletInfo[]>(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 await connect(wallet.walletType, wallet.chain);\n setAddingExperimentalChainStatus('completed');\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.querySelector('#swap-box') as HTMLDivElement;\n\n useEffect(() => {\n let timeout: ReturnType<typeof setTimeout> | null = null;\n if (addingExperimentalChainStatus === 'completed') {\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 conciseAddress = address ? getConciseAddress(address) : '';\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 connectedWalletDescription = couldAddExperimentalChain\n ? `Add ${chain} chain`\n : conciseAddress;\n\n const onClick = () => {\n if (wallet.state === WalletState.DISCONNECTED) {\n void handleClick(wallet.type);\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 blockchainDisplayName: string | undefined =\n experimentalChainWallet?.chain\n ? getBlockchainDisplayNameFor(\n experimentalChainWallet.chain,\n blockchains\n )\n : undefined;\n return (\n <>\n {openWalletStateModal === wallet.type && (\n <WalletModal\n open={openWalletStateModal === wallet.type}\n onClose={() => setOpenWalletStateModal('')}\n image={wallet.image}\n state={wallet.state}\n error={error}\n />\n )}\n {!!experimentalChainWallet && (\n <Modal\n open={!!experimentalChainWallet && showExperimentalChainModal}\n container={modalContainer}\n onClose={() => {\n setExperimentalChainWallet(null);\n }}>\n <MessageBox\n title={`Add ${blockchainDisplayName} Chain`}\n type=\"warning\"\n description={`You should connect a ${blockchainDisplayName} supported wallet or choose a different ${blockchainDisplayName} address`}>\n <Divider size={18} />\n <Divider size={32} />\n <Button\n onClick={addExperimentalChain.bind(\n null,\n experimentalChainWallet\n )}\n variant=\"outlined\"\n type=\"primary\"\n fullWidth\n size=\"large\">\n Confirm\n </Button>\n </MessageBox>\n </Modal>\n )}\n {addingExperimentalChainStatus && (\n <Modal\n open={!!addingExperimentalChainStatus}\n onClose={setAddingExperimentalChainStatus.bind(null, null)}\n container={modalContainer}>\n {addingExperimentalChainStatus === 'in-progress' ? (\n <MessageBox\n type=\"loading\"\n title={`Add ${blockchainDisplayName} Chain`}\n description={`You should connect a ${blockchainDisplayName} supported wallet or choose a different ${blockchainDisplayName} address.`}\n icon={\n <LogoContainer>\n <WalletImageContainer>\n <Image src={wallet.image} size={45} />\n </WalletImageContainer>\n <Spinner />\n </LogoContainer>\n }\n />\n ) : (\n <MessageBox\n type=\"success\"\n title={`${blockchainDisplayName} Chain Added`}\n description={`${blockchainDisplayName} is added to your wallet, you can use it to swap.`}\n />\n )}\n <Divider direction=\"vertical\" size={32} />\n </Modal>\n )}\n <SelectableWallet\n key={wallet.type}\n description={connectedWalletDescription}\n onClick={onClick}\n selected={isSelected(wallet.type, chain)}\n {...wallet}\n />\n </>\n );\n })}\n {shouldShowMoreWallets && (\n <WalletButton selected={false} onClick={onShowMore.bind(null)}>\n <Typography variant=\"label\" size=\"medium\">\n Show more wallets\n <Typography variant=\"label\" size=\"medium\" color=\"$primary\">\n &nbsp;+{numberOfSupportedWallets - (limit ?? 0)}\n </Typography>\n </Typography>\n </WalletButton>\n )}\n </>\n );\n}\n", "import type { WidgetConfig } from '../types';\nimport type { BlockchainMeta } from 'rango-sdk';\n\nimport { WalletState } from '@rango-dev/ui';\nimport { useWallets } from '@rango-dev/wallets-react';\nimport {\n KEPLR_COMPATIBLE_WALLETS,\n type WalletType,\n WalletTypes,\n} from '@rango-dev/wallets-shared';\nimport { useEffect, useState } from 'react';\n\nimport { useMetaStore } from '../store/meta';\nimport { useWalletsStore } from '../store/wallets';\nimport { configWalletsToWalletName } from '../utils/providers';\nimport {\n isExperimentalChain,\n mapWalletTypesToWalletInfo,\n sortWalletsBasedOnConnectionState,\n} from '../utils/wallets';\n\nconst ALL_SUPPORTED_WALLETS = Object.values(WalletTypes);\n\ninterface Params {\n config?: WidgetConfig;\n chain?: string;\n onBeforeConnect?: (walletType: string) => void;\n onConnect?: (walletType: string) => void;\n}\n\n/**\n * gets list of wallets with their information and an action for handling click callback fo UI\n * we need to share the logic of rendering list of wallets and handle clicking on them in different places\n * you can use this list whenever you need to show the list of wallets and needed callbacks\n */\nexport function useWalletList(params: Params) {\n const { config, chain, onBeforeConnect, onConnect } = params;\n const { state, disconnect, getWalletInfo, connect } = useWallets();\n const { connectedWallets } = useWalletsStore();\n const { blockchains } = useMetaStore().meta;\n const multiWallets =\n typeof config?.multiWallets === 'undefined' ? true : config.multiWallets;\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 =\n configWalletsToWalletName(config?.wallets, {\n walletConnectProjectId: config?.walletConnectProjectId,\n }) || ALL_SUPPORTED_WALLETS;\n\n const wallets = mapWalletTypesToWalletInfo(\n state,\n getWalletInfo,\n listAvailableWalletTypes,\n chain\n );\n\n const sortedWallets = sortWalletsBasedOnConnectionState(wallets);\n const [error, setError] = useState('');\n\n const isExperimentalChainNotAdded = (walletType: string) =>\n !connectedWallets.find(\n (connectedWallet) =>\n connectedWallet.walletType === walletType &&\n connectedWallet.chain === chain\n );\n\n const handleClick = async (type: WalletType) => {\n const wallet = state(type);\n try {\n if (error) {\n setError('');\n }\n if (wallet.connected) {\n await disconnect(type);\n } else {\n const atLeastOneWalletIsConnected = !!wallets.find(\n (w) => w.state === WalletState.CONNECTED\n );\n if (!multiWallets && atLeastOneWalletIsConnected) {\n return;\n }\n onBeforeConnect?.(type);\n await connect(type);\n onConnect?.(type);\n }\n } catch (e) {\n setError('Error: ' + (e as any)?.message);\n }\n };\n\n const disconnectConnectingWallets = () => {\n const connectingWallets =\n wallets?.filter((wallet) => wallet.state === WalletState.CONNECTING) ||\n [];\n for (const wallet of connectingWallets) {\n void disconnect(wallet.type);\n }\n };\n\n useEffect(() => {\n return () => {\n disconnectConnectingWallets();\n };\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 );\n };\n\n return {\n list: sortedWallets.filter(\n (wallet) => !shouldExcludeWallet(wallet.type, chain ?? '', blockchains)\n ),\n error,\n handleClick,\n };\n}\n", "import { allProviders } from '@rango-dev/provider-all';\nimport { ProviderInterface } from '@rango-dev/wallets-react';\nimport { WidgetConfig } from '../types';\n\nexport interface ProvidersOptions {\n walletConnectProjectId?: WidgetConfig['walletConnectProjectId'];\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 ProviderInterface[] a list of ProviderInterface\n *\n */\nexport function matchAndGenerateProviders(\n providers: WidgetConfig['wallets'],\n options?: ProvidersOptions\n): ProviderInterface[] {\n const all = allProviders({\n walletconnect2: {\n WC_PROJECT_ID: options?.walletConnectProjectId || '',\n },\n });\n\n if (providers) {\n const selectedProviders: ProviderInterface[] = [];\n\n providers.forEach((requestedProvider) => {\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 if (typeof requestedProvider === 'string') {\n const result: ProviderInterface | undefined = all.find((provider) => {\n return provider.config.type === requestedProvider;\n });\n if (result) {\n selectedProviders.push(result);\n } else {\n console.warn(\n `Couldn't find ${requestedProvider} 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 selectedProviders.push(requestedProvider);\n }\n });\n return selectedProviders;\n }\n\n return all;\n}\n\nexport function configWalletsToWalletName(\n config: WidgetConfig['wallets'],\n options?: ProvidersOptions\n): string[] {\n const providers = matchAndGenerateProviders(config, options);\n const names = providers.map((provider) => {\n return provider.config.type;\n });\n return names;\n}\n", "import type { WidgetConfig } from '../types';\nimport type { WalletType } from '@rango-dev/wallets-shared';\n\nimport { i18n } from '@lingui/core';\nimport { styled, Typography, Wallet, WalletState } from '@rango-dev/ui';\nimport React, { Fragment, useState } from 'react';\n\nimport { Layout } from '../components/Layout';\nimport { WalletModal } from '../components/WalletModal';\nimport { navigationRoutes } from '../constants/navigationRoutes';\nimport { useNavigateBack } from '../hooks/useNavigateBack';\nimport { useWalletList } from '../hooks/useWalletList';\nimport { useMetaStore } from '../store/meta';\nimport { getContainer } from '../utils/common';\n\ninterface PropTypes {\n supportedWallets: WidgetConfig['wallets'];\n multiWallets: boolean;\n config?: WidgetConfig;\n}\n\nconst ListContainer = styled('div', {\n display: 'grid',\n gap: '$10',\n gridTemplateColumns: ' repeat(3, minmax(0, 1fr))',\n alignContent: 'baseline',\n paddingTop: '$15',\n height: '100%',\n});\n\nconst Container = styled('div', {\n textAlign: 'center',\n});\n\nexport const TIME_TO_CLOSE_MODAL = 3_000;\nexport const TIME_TO_IGNORE_MODAL = 300;\n\nexport function WalletsPage({ config }: PropTypes) {\n const { navigateBackFrom } = useNavigateBack();\n const [openModal, setOpenModal] = useState<WalletType>('');\n let modalTimerId: ReturnType<typeof setTimeout> | null = null;\n\n const { list, handleClick, error } = useWalletList({\n config,\n onBeforeConnect: (type) => {\n modalTimerId = setTimeout(() => {\n setOpenModal(type);\n }, TIME_TO_IGNORE_MODAL);\n },\n onConnect: () => {\n if (modalTimerId) {\n clearTimeout(modalTimerId);\n }\n setTimeout(() => {\n setOpenModal('');\n }, TIME_TO_CLOSE_MODAL);\n },\n });\n\n const loadingMetaStatus = useMetaStore.use.loadingStatus();\n const selectedWallet = list.find((wallet) => wallet.type === openModal);\n const selectedWalletImage = selectedWallet?.image || '';\n const selectedWalletState =\n selectedWallet?.state || WalletState.NOT_INSTALLED;\n\n return (\n <Layout\n header={{\n title: i18n.t('Connect Wallets'),\n onBack: navigateBackFrom.bind(null, navigationRoutes.wallets),\n }}>\n <Container>\n <Typography variant=\"title\" size=\"xmedium\" align=\"center\">\n {i18n.t('Choose a wallet to connect.')}\n </Typography>\n <ListContainer>\n {list.map((wallet, index) => {\n const key = `wallet-${index}-${wallet.type}`;\n return (\n <Fragment key={key}>\n <Wallet\n {...wallet}\n container={getContainer()}\n onClick={(type) => {\n void handleClick(type);\n }}\n isLoading={loadingMetaStatus === 'loading'}\n />\n </Fragment>\n );\n })}\n <WalletModal\n open={!!openModal}\n onClose={() => setOpenModal('')}\n image={selectedWalletImage}\n state={selectedWalletState}\n error={error}\n />\n </ListContainer>\n </Container>\n </Layout>\n );\n}\n", "import type { PropTypes } from './WalletModal.types';\n\nimport { Divider, Modal } from '@rango-dev/ui';\nimport React from 'react';\n\nimport { ModalContent } from './WalletModalContent';\n\nexport function WalletModal(props: PropTypes) {\n const { open, onClose, ...otherProps } = props;\n\n return (\n <Modal\n open={open}\n onClose={onClose}\n container={document.getElementById('swap-box') || document.body}>\n <ModalContent {...otherProps} />\n <Divider direction=\"vertical\" size={32} />\n </Modal>\n );\n}\n", "import type { ModalContentProps } from './WalletModal.types';\n\nimport { i18n } from '@lingui/core';\nimport { Image, MessageBox, WalletState } from '@rango-dev/ui';\nimport React from 'react';\n\nimport {\n LogoContainer,\n Spinner,\n WalletImageContainer,\n} from './WalletModalContent.styles';\n\nexport function ModalContent(props: ModalContentProps) {\n const { state, image, error } = props;\n if (state === 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\nexport const WalletImageContainer = styled('div', {\n '& img': {\n borderRadius: '50%',\n },\n});\n", "import { useInRouterContext, useNavigate } from 'react-router-dom';\n\nimport { navigationRoutes } from '../constants/navigationRoutes';\nimport { useBestRouteStore } from '../store/bestRoute';\n\nexport function useNavigateBack() {\n const isRouterInContext = useInRouterContext();\n const navigate = useNavigate();\n const routeWalletsConfirmed = useBestRouteStore.use.routeWalletsConfirmed();\n\n navigationRoutes;\n\n const navigateBackFrom = (currentRoute: string) => {\n if (currentRoute === navigationRoutes.swapDetails) {\n return navigate('/' + navigationRoutes.swaps, { replace: true });\n }\n\n if (\n !isRouterInContext ||\n (window.history.state && window.history.state.idx > 0)\n ) {\n // eslint-disable-next-line @typescript-eslint/no-magic-numbers\n navigate(-1);\n } else {\n if (\n [navigationRoutes.settings, navigationRoutes.wallets].includes(\n currentRoute\n ) &&\n routeWalletsConfirmed\n ) {\n return navigate('/' + navigationRoutes.confirmSwap, { replace: true });\n }\n if (\n [\n navigationRoutes.fromSwap,\n navigationRoutes.toSwap,\n navigationRoutes.settings,\n navigationRoutes.wallets,\n navigationRoutes.swaps,\n navigationRoutes.confirmSwap,\n ].includes(currentRoute)\n ) {\n navigate(navigationRoutes.home, { replace: true });\n } else if (currentRoute === navigationRoutes.fromBlockchain) {\n navigate('/' + navigationRoutes.fromSwap, { replace: true });\n } else if (currentRoute === navigationRoutes.toBlockchain) {\n navigate('/' + navigationRoutes.fromSwap, { replace: true });\n } else if (currentRoute === navigationRoutes.liquiditySources) {\n navigate('/' + navigationRoutes.settings, { replace: true });\n }\n }\n };\n\n return { navigateBackFrom };\n}\n", "import type { BlockchainMeta } 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}\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", "/* eslint-disable @typescript-eslint/no-magic-numbers */\nimport type {\n ConfirmSwapError,\n ConfirmSwapWarnings,\n PendingSwapSettings,\n Wallet,\n} from '../types';\nimport type { PendingSwap } from '@rango-dev/queue-manager-rango-preset';\nimport type { BestRouteResponse } from 'rango-sdk';\n\nimport { calculatePendingSwap } from '@rango-dev/queue-manager-rango-preset';\nimport BigNumber from 'bignumber.js';\nimport { useEffect } from 'react';\n\nimport { errorMessages } from '../constants/errors';\nimport { HIGH_SLIPPAGE } from '../constants/swapSettings';\nimport { useBestRouteStore } from '../store/bestRoute';\nimport { useMetaStore } from '../store/meta';\nimport { useSettingsStore } from '../store/settings';\nimport { useWalletsStore } from '../store/wallets';\nimport {\n ConfirmSwapErrorTypes,\n RouteWarningType,\n SlippageWarningType,\n} from '../types';\nimport { numberToString } from '../utils/numbers';\nimport {\n isNumberOfSwapsChanged,\n isRouteChanged,\n isRouteInternalCoinsUpdated,\n isRouteSwappersUpdated,\n} from '../utils/routing';\nimport {\n createBestRouteRequestBody,\n getBalanceWarnings,\n getMinRequiredSlippage,\n getOutputRatio,\n getPercentageChange,\n getRouteOutputAmount,\n getWalletsForNewSwap,\n hasProperSlippage,\n isOutputAmountChangedALot,\n outputRatioHasWarning,\n} from '../utils/swap';\n\nimport { useFetchBestRoute } from './useFetchBestRoute';\n\nexport type ConfirmSwapFetchResult = {\n swap: PendingSwap | null;\n error: ConfirmSwapError | null;\n warnings: ConfirmSwapWarnings | null;\n};\n\nexport type ConfirmSwap = {\n loading: boolean;\n fetch: (params: Params) => Promise<ConfirmSwapFetchResult>;\n cancelFetch: () => void;\n};\n\ntype Params = {\n selectedWallets: Wallet[];\n customDestination?: string;\n};\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 */\nfunction throwErrorIfResponseIsNotValid(\n response: BestRouteResponse,\n params: { inputUsdValue: BigNumber | null; outputUsdValue: number | null }\n) {\n if (!response.result) {\n throw new Error(errorMessages.noRoutesError.title, {\n cause: {\n type: ConfirmSwapErrorTypes.NO_ROUTE,\n diagnosisMessage: response.diagnosisMessages?.[0],\n },\n });\n }\n\n const newRouteOutputUsdValue = new BigNumber(\n response.result?.outputAmount || '0'\n ).multipliedBy(params.outputUsdValue || 0);\n\n const outputRatio = getOutputRatio(\n params.inputUsdValue,\n newRouteOutputUsdValue\n );\n const highValueLoss = outputRatioHasWarning(\n params.inputUsdValue,\n outputRatio\n );\n\n if (highValueLoss) {\n throw new Error('High value loss for route', {\n cause: {\n type: ConfirmSwapErrorTypes.ROUTE_UPDATED_WITH_HIGH_VALUE_LOSS,\n },\n });\n }\n\n return response;\n}\n\nfunction generateWarnings(\n previousRoute: BestRouteResponse,\n currentRoute: BestRouteResponse,\n params: {\n selectedWallets: Wallet[];\n userSlippage: number;\n }\n): ConfirmSwapWarnings {\n const routeChanged = isRouteChanged(previousRoute, currentRoute);\n const output: ConfirmSwapWarnings = {\n balance: null,\n route: null,\n slippage: null,\n };\n\n if (routeChanged) {\n if (isOutputAmountChangedALot(previousRoute, currentRoute)) {\n output.route = {\n type: RouteWarningType.ROUTE_AND_OUTPUT_AMOUNT_UPDATED,\n newOutputAmount: numberToString(getRouteOutputAmount(currentRoute)),\n percentageChange: numberToString(\n getPercentageChange(\n getRouteOutputAmount(previousRoute),\n getRouteOutputAmount(currentRoute)\n ),\n null,\n 2\n ),\n };\n } else if (isNumberOfSwapsChanged(previousRoute, currentRoute)) {\n output.route = {\n type: RouteWarningType.ROUTE_UPDATED,\n };\n } else if (isRouteSwappersUpdated(previousRoute, currentRoute)) {\n output.route = {\n type: RouteWarningType.ROUTE_SWAPPERS_UPDATED,\n };\n } else if (isRouteInternalCoinsUpdated(previousRoute, currentRoute)) {\n output.route = {\n type: RouteWarningType.ROUTE_COINS_UPDATED,\n };\n }\n }\n\n const balanceWarnings = getBalanceWarnings(\n currentRoute,\n params.selectedWallets\n );\n const enoughBalance = balanceWarnings.length === 0;\n\n if (!enoughBalance) {\n output.balance = {\n messages: balanceWarnings,\n };\n }\n\n const minRequiredSlippage = getMinRequiredSlippage(previousRoute);\n const highSlippage = params.userSlippage > HIGH_SLIPPAGE;\n\n if (!hasProperSlippage(params.userSlippage.toString(), minRequiredSlippage)) {\n output.slippage = {\n type: SlippageWarningType.INSUFFICIENT_SLIPPAGE,\n slippage: minRequiredSlippage,\n };\n } else if (highSlippage) {\n output.slippage = {\n type: SlippageWarningType.HIGH_SLIPPAGE,\n slippage: params.userSlippage.toString(),\n };\n }\n\n return output;\n}\n\nexport function useConfirmSwap(): ConfirmSwap {\n const {\n fromToken,\n toToken,\n inputAmount,\n inputUsdValue,\n setRoute,\n bestRoute: initialRoute,\n customDestination: customDestinationFromStore,\n } = useBestRouteStore();\n\n const {\n slippage,\n customSlippage,\n affiliatePercent,\n affiliateRef,\n affiliateWallets,\n disabledLiquiditySources,\n } = useSettingsStore();\n const { connectedWallets } = useWalletsStore();\n\n const { meta } = useMetaStore();\n\n const userSlippage = customSlippage || slippage;\n\n const { fetch: fetchBestRoute, cancelFetch, loading } = useFetchBestRoute();\n\n useEffect(() => cancelFetch, []);\n\n const fetch: ConfirmSwap['fetch'] = async (params: Params) => {\n const selectedWallets = params.selectedWallets;\n const customDestination =\n params?.customDestination ?? customDestinationFromStore;\n\n if (!fromToken || !toToken || !inputAmount || !initialRoute) {\n return {\n route: null,\n swap: null,\n error: null,\n warnings: null,\n };\n }\n\n const requestBody = createBestRouteRequestBody({\n fromToken,\n toToken,\n inputAmount,\n wallets: connectedWallets,\n selectedWallets,\n disabledLiquiditySources,\n slippage: userSlippage,\n affiliateRef,\n affiliatePercent,\n affiliateWallets,\n initialRoute,\n destination: customDestination,\n });\n\n let currentRoute: BestRouteResponse;\n try {\n currentRoute = await fetchBestRoute(requestBody).then((response) =>\n throwErrorIfResponseIsNotValid(response, {\n outputUsdValue: toToken.usdPrice,\n inputUsdValue,\n })\n );\n setRoute(currentRoute);\n } catch (error: any) {\n if (error?.code === 'ERR_CANCELED') {\n return {\n swap: null,\n error: {\n type: ConfirmSwapErrorTypes.REQUEST_CANCELED,\n },\n warnings: null,\n };\n }\n\n if (error.cause) {\n return {\n swap: null,\n error: error.cause,\n warnings: null,\n };\n }\n\n return {\n swap: null,\n error: {\n type: ConfirmSwapErrorTypes.REQUEST_FAILED,\n },\n warnings: null,\n };\n }\n\n const swapSettings: PendingSwapSettings = {\n slippage: userSlippage.toString(),\n disabledSwappersGroups: disabledLiquiditySources,\n };\n const swap = calculatePendingSwap(\n inputAmount.toString(),\n currentRoute,\n getWalletsForNewSwap(selectedWallets),\n swapSettings,\n false,\n meta\n );\n\n return {\n route: currentRoute,\n swap,\n error: null,\n warnings: generateWarnings(initialRoute, currentRoute, {\n selectedWallets,\n userSlippage,\n }),\n };\n };\n\n return {\n loading,\n fetch,\n cancelFetch,\n };\n}\n", "import type { PendingSwap } from '@rango-dev/queue-manager-rango-preset';\nimport type { PendingSwapStep } from 'rango-types';\n\nimport { i18n } from '@lingui/core';\nimport { useManager } from '@rango-dev/queue-manager-react';\nimport { Divider, NotFound, styled } from '@rango-dev/ui';\nimport React, { useState } from 'react';\nimport { useNavigate } from 'react-router-dom';\n\nimport { Layout } from '../components/Layout';\nimport { SearchInput } from '../components/SearchInput';\nimport { SwapsGroup } from '../components/SwapsGroup';\nimport { NotFoundContainer } from '../components/SwapsGroup/SwapsGroup.styles';\nimport { navigationRoutes } from '../constants/navigationRoutes';\nimport { useNavigateBack } from '../hooks/useNavigateBack';\nimport { useUiStore } from '../store/ui';\nimport { groupSwapsByDate } from '../utils/date';\nimport { containsText } from '../utils/numbers';\nimport { getPendingSwaps } from '../utils/queue';\n\nconst Container = styled('div', {\n display: 'flex',\n flexDirection: 'column',\n alignItems: 'flex-start',\n height: '100%',\n gap: 15,\n});\n\nconst SwapsGroupContainer = styled('div', {\n overflowY: 'visible',\n width: '100%',\n display: 'flex',\n flexDirection: 'column',\n gap: 15,\n height: '100%',\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 setSelectedSwap = useUiStore.use.setSelectedSwap();\n const navigate = useNavigate();\n const { navigateBackFrom } = useNavigateBack();\n const { manager, state } = useManager();\n const list: PendingSwap[] = getPendingSwaps(manager).map(({ swap }) => swap);\n const [searchedFor, setSearchedFor] = useState<string>('');\n const loading = !state.loadedFromPersistor;\n\n const searchHandler = (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(\n (swap) =>\n containsText(swap.inputAmount, searchedFor) ||\n containsText(swap.status, searchedFor) ||\n isStepContainsText(swap.steps, searchedFor) ||\n containsText(swap.requestId, searchedFor)\n );\n }\n\n const isEmpty = !filteredList?.length && !loading;\n\n return (\n <Layout\n header={{\n onBack: navigateBackFrom.bind(null, navigationRoutes.swaps),\n title: i18n.t('History'),\n }}>\n <Container>\n <SearchInput\n setValue={setSearchedFor}\n fullWidth\n variant=\"contained\"\n placeholder=\"Search Transaction\"\n autoFocus\n onChange={searchHandler}\n value={searchedFor}\n />\n <SwapsGroupContainer>\n {isEmpty && (\n <NotFoundContainer>\n <Divider size={32} />\n <NotFound\n title={i18n.t('No results found')}\n description={\n searchedFor ? i18n.t('Try using different keywords') : ''\n }\n />\n </NotFoundContainer>\n )}\n {!isEmpty && (\n <SwapsGroup\n list={filteredList}\n onSwapClick={(requestId) => {\n setSelectedSwap(requestId);\n navigate(`${requestId}`, { replace: true });\n }}\n groupBy={groupSwapsByDate}\n isLoading={loading}\n />\n )}\n </SwapsGroupContainer>\n </Container>\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 } from './SearchInput.styles';\n\nexport function SearchInput(props: PropTypes) {\n const {\n variant,\n fullWidth,\n color,\n size,\n onChange,\n value,\n setValue,\n ...inputAttributes\n } = props;\n\n return (\n <TextField\n prefix={\n <IconWrapper>\n <SearchIcon color=\"black\" />\n </IconWrapper>\n }\n suffix={\n !!value.length && (\n <IconButton\n variant=\"ghost\"\n onClick={() => setValue?.('')}\n size=\"small\">\n <CloseIcon color=\"gray\" size={10} />\n </IconButton>\n )\n }\n fullWidth={fullWidth}\n color={color}\n variant={variant}\n style={{\n padding: 10,\n borderRadius: 25,\n alignItems: 'center',\n }}\n size={size}\n value={value}\n onChange={onChange}\n {...inputAttributes}\n />\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", "import type { PropTypes } from './SwapsGroup.types';\n\nimport { Divider, SwapListItem, Typography } from '@rango-dev/ui';\nimport React from 'react';\n\nimport { limitDecimalPlaces } from '../../utils/numbers';\n\nimport { Group, SwapList, Time } from './SwapsGroup.styles';\n\nexport function SwapsGroup(props: PropTypes) {\n const { list, onSwapClick, groupBy, isLoading } = props;\n const groups = groupBy ? groupBy(list) : [{ title: 'History', swaps: list }];\n\n if (isLoading) {\n const swaps = [{}, {}];\n\n const loadingGroups = [\n {\n title: 'Today',\n swaps,\n },\n {\n title: 'Last month',\n swaps,\n },\n ];\n return (\n <>\n {loadingGroups.map((group) => (\n <React.Fragment key={group.title}>\n <Group>\n <Time>\n <Typography\n variant=\"label\"\n size=\"medium\"\n color=\"neutral800\"\n className=\"group-title\">\n {group.title}\n </Typography>\n </Time>\n <Divider size={4} />\n <SwapList>\n {group.swaps.map((_, index) => {\n const key = index + group.title;\n return (\n <React.Fragment key={key}>\n <SwapListItem isLoading={true} />\n </React.Fragment>\n );\n })}\n </SwapList>\n </Group>\n </React.Fragment>\n ))}\n </>\n );\n }\n\n return (\n <>\n {groups\n .filter((group) => group.swaps.length > 0)\n .map((group) => (\n <React.Fragment key={group.title}>\n <Group>\n <Time>\n <Typography\n variant=\"label\"\n size=\"medium\"\n color=\"neutral800\"\n className=\"group-title\">\n {group.title}\n </Typography>\n </Time>\n <Divider size={4} />\n <SwapList>\n {group.swaps.map((swap) => {\n const firstStep = swap.steps[0];\n const lastStep = swap.steps[swap.steps.length - 1];\n return (\n <React.Fragment key={swap.requestId}>\n <SwapListItem\n requestId={swap.requestId}\n creationTime={swap.creationTime}\n status={swap.status}\n onClick={onSwapClick}\n onlyShowTime={group.title === '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: limitDecimalPlaces(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: limitDecimalPlaces(\n lastStep.outputAmount || ''\n ),\n estimatedAmount: limitDecimalPlaces(\n lastStep.expectedOutputAmountHumanReadable || ''\n ),\n },\n }}\n />\n </React.Fragment>\n );\n })}\n </SwapList>\n </Group>\n </React.Fragment>\n ))}\n </>\n );\n}\n", "import { styled } from '@rango-dev/ui';\n\nexport const Group = styled('div', {\n width: '100%',\n display: 'flex',\n flexDirection: 'column',\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/SwapsGroup/SwapsGroup.types';\nimport type { PendingSwap } from '@rango-dev/queue-manager-rango-preset';\n\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: 'Today',\n swaps: [],\n },\n ],\n [\n 'month',\n {\n title: 'Last month',\n swaps: [],\n },\n ],\n [\n 'year',\n {\n title: 'Last year',\n swaps: [],\n },\n ],\n [\n 'history',\n {\n title: 'History',\n swaps: [],\n },\n ],\n ]);\n\n const now = dayjs();\n swaps.forEach((swap) => {\n const swapDate = dayjs(Number(swap.creationTime));\n if (now.isSame(swapDate, 'day')) {\n output.get('today')?.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 output.get('history')?.swaps.push(swap);\n }\n });\n\n return Array.from(output.values());\n};\n", "import { Manager } from '@rango-dev/queue-manager-core';\nimport {\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 { i18n } from '@lingui/core';\nimport {\n List,\n ListItemButton,\n Radio,\n RadioRoot,\n Typography,\n} from '@rango-dev/ui';\nimport React, { useState } from 'react';\n\nimport { Layout } from '../components/Layout';\nimport { SettingsContainer } from '../components/SettingsContainer';\nimport { navigationRoutes } from '../constants/navigationRoutes';\nimport { useNavigateBack } from '../hooks/useNavigateBack';\n\nenum Languages {\n ENGLISH = 'english',\n FRENCH = 'french',\n SPANISH = 'spanish',\n}\nexport function LanguagePage() {\n const { navigateBackFrom } = useNavigateBack();\n const [language, setLanguage] = useState(Languages.ENGLISH);\n\n const languageList = [\n {\n id: Languages.ENGLISH,\n value: Languages.ENGLISH,\n title: (\n <Typography variant=\"title\" size=\"xmedium\">\n {i18n.t('English')}\n </Typography>\n ),\n onClick: () => setLanguage(Languages.ENGLISH),\n end: <Radio value={Languages.ENGLISH} />,\n },\n {\n id: Languages.FRENCH,\n value: Languages.FRENCH,\n title: (\n <Typography variant=\"title\" size=\"xmedium\">\n {i18n.t('French')}\n </Typography>\n ),\n onClick: () => setLanguage(Languages.FRENCH),\n end: <Radio value={Languages.FRENCH} />,\n },\n {\n id: Languages.SPANISH,\n value: Languages.SPANISH,\n title: (\n <Typography variant=\"title\" size=\"xmedium\">\n {i18n.t('Spanish')}\n </Typography>\n ),\n onClick: () => setLanguage(Languages.SPANISH),\n end: <Radio value={Languages.SPANISH} />,\n },\n ];\n\n return (\n <Layout\n header={{\n onBack: navigateBackFrom.bind(null, navigationRoutes.settings),\n title: i18n.t('Language'),\n }}>\n <SettingsContainer>\n <RadioRoot value={language}>\n <List\n type={\n <ListItemButton\n title=\"language\"\n id=\"_\"\n onClick={() => console.log()}\n />\n }\n items={languageList}\n />\n </RadioRoot>\n </SettingsContainer>\n </Layout>\n );\n}\n", "import { styled } from '@rango-dev/ui';\n\nexport const SettingsContainer = styled('div', {\n height: '100%',\n});\n\nexport const LiquiditySourceList = styled('ul', {\n padding: '$15 $5 0',\n margin: 0,\n listStyle: 'none',\n height: '100%',\n overflowY: 'visible',\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 type {\n LiquiditySourceType,\n UniqueSwappersGroupType,\n} from '../utils/settings';\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 } from '../components/Layout';\nimport { LoadingLiquiditySourceList } from '../components/LoadingLiquiditySourceList';\nimport { SearchInput } from '../components/SearchInput';\nimport {\n LiquiditySourceList,\n LiquiditySourceSuffix,\n NotFoundContainer,\n SettingsContainer,\n} from '../components/SettingsContainer';\nimport { navigationRoutes } from '../constants/navigationRoutes';\nimport { useNavigateBack } from '../hooks/useNavigateBack';\nimport { useMetaStore } from '../store/meta';\nimport { useSettingsStore } from '../store/settings';\nimport { containsText } from '../utils/numbers';\nimport { getUniqueSwappersGroups } from '../utils/settings';\n\ninterface PropTypes {\n supportedSwappers?: string[];\n sourceType: 'Exchanges' | 'Bridges';\n}\n\nexport function LiquiditySourcePage({\n supportedSwappers,\n sourceType,\n}: PropTypes) {\n const [searchedFor, setSearchedFor] = useState<string>('');\n const toggleLiquiditySource = useSettingsStore.use.toggleLiquiditySource();\n const { navigateBackFrom } = useNavigateBack();\n const loadingMetaStatus = useMetaStore.use.loadingStatus();\n\n const supportedUniqueSwappersGroups: Array<UniqueSwappersGroupType> =\n getUniqueSwappersGroups(supportedSwappers);\n\n const validTypes: Array<LiquiditySourceType> = [];\n if (sourceType === 'Exchanges') {\n validTypes.push('DEX');\n }\n if (sourceType === 'Bridges') {\n validTypes.push('BRIDGE');\n validTypes.push('AGGREGATOR');\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 } = sourceItem;\n return {\n start: <Image src={logo} size={22} type=\"circular\" />,\n onClick: () => toggleLiquiditySource(groupTitle),\n end: <Checkbox checked={selected} />,\n title: (\n <Typography variant=\"title\" size=\"xmedium\">\n {i18n.t(groupTitle)}\n </Typography>\n ),\n ...sourceItem,\n };\n });\n\n const searchHandler = (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 onBack: navigateBackFrom.bind(null, navigationRoutes.settings),\n title: i18n.t(sourceType),\n suffix: (\n <LiquiditySourceSuffix>\n <Button variant=\"ghost\" size=\"xsmall\" onClick={toggleAllSources}>\n {i18n.t(hasSelectAll ? 'Deselect all' : 'Select all')}\n </Button>\n </LiquiditySourceSuffix>\n ),\n }}>\n <SettingsContainer>\n <SearchInput\n value={searchedFor}\n setValue={setSearchedFor}\n fullWidth\n color=\"light\"\n variant=\"contained\"\n placeholder={i18n.t('Swap {sourceType}', { sourceType })}\n onChange={searchHandler}\n />\n {loadingMetaStatus === '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 loadingMetaStatus === 'success' && (\n <LiquiditySourceList>\n {filteredList.map((sourceItem) => {\n return (\n <React.Fragment key={sourceItem.id}>\n <ListItemButton\n style={{ height: '61px' }}\n {...sourceItem}\n selected={false}\n hasDivider\n />\n </React.Fragment>\n );\n })}\n </LiquiditySourceList>\n )\n )}\n </SettingsContainer>\n </Layout>\n );\n}\n", "import { Checkbox, Skeleton } from '@rango-dev/ui';\nimport React from 'react';\n\nimport { LiquiditySourceList } from '../SettingsContainer';\n\nimport { CustomeListItem } from './LoadingLiquiditySourceList.styles';\n\nconst ITEM_SKELETON_COUNT = 30;\nexport function LoadingLiquiditySourceList() {\n return (\n <LiquiditySourceList>\n {Array.from(Array(ITEM_SKELETON_COUNT), (e) => (\n <CustomeListItem\n hasDivider\n key={e}\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 { ListItem, styled } from '@rango-dev/ui';\n\nexport const CustomeListItem = styled(ListItem, {\n height: 61,\n});\n", "import { useMetaStore } from '../store/meta';\nimport { useSettingsStore } from '../store/settings';\n\nimport { removeDuplicateFrom } from './common';\n\nexport type LiquiditySourceType = 'BRIDGE' | 'AGGREGATOR' | 'DEX';\n\nexport type UniqueSwappersGroupType = {\n id: string;\n groupTitle: string;\n logo: string;\n type: LiquiditySourceType;\n selected: boolean;\n};\n\nexport function getUniqueSwappersGroups(\n supportedSwappers?: string[]\n): UniqueSwappersGroupType[] {\n const swappers = useMetaStore.use.meta().swappers;\n const disabledLiquiditySources =\n useSettingsStore.use.disabledLiquiditySources();\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.title\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", "import { i18n } from '@lingui/core';\nimport { Divider } from '@rango-dev/ui';\nimport React, { useState } from 'react';\n\nimport { BlockchainList } from '../components/BlockchainList';\nimport { Layout } from '../components/Layout';\nimport { SearchInput } from '../components/SearchInput';\nimport { SelectableCategoryList } from '../components/SelectableCategoryList';\nimport { navigationRoutes } from '../constants/navigationRoutes';\nimport { useNavigateBack } from '../hooks/useNavigateBack';\nimport { useBestRouteStore } from '../store/bestRoute';\nimport { useMetaStore } from '../store/meta';\n\ninterface PropTypes {\n type: 'from' | 'to';\n supportedBlockchains?: string[];\n}\n\nexport function SelectBlockchainPage(props: PropTypes) {\n const { type, supportedBlockchains } = props;\n const { navigateBackFrom } = useNavigateBack();\n const [searchedFor, setSearchedFor] = useState<string>('');\n const [blockchainCategory, setBlockchainCategory] = useState<string>('ALL');\n const setToBlockchain = useBestRouteStore.use.setToBlockchain();\n const setFromBlockchain = useBestRouteStore.use.setFromBlockchain();\n\n const blockchains = supportedBlockchains\n ? useMetaStore.use\n .meta()\n .blockchains.filter((chain) =>\n supportedBlockchains.includes(chain.name)\n )\n : useMetaStore.use.meta().blockchains;\n\n return (\n <Layout\n header={{\n onBack: navigateBackFrom.bind(\n null,\n navigationRoutes[`${type}Blockchain`]\n ),\n title: i18n.t(`Select Blockchain`),\n }}>\n <Divider size={12} />\n <SelectableCategoryList\n setCategory={setBlockchainCategory}\n category={blockchainCategory}\n />\n <Divider size={24} />\n <SearchInput\n value={searchedFor}\n autoFocus\n placeholder={i18n.t('Search Blockchain')}\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={blockchains}\n searchedFor={searchedFor}\n blockchainCategory={blockchainCategory}\n onChange={(blockchain) => {\n if (type === 'from') {\n setFromBlockchain(blockchain, true);\n } else {\n setToBlockchain(blockchain, true);\n }\n navigateBackFrom(navigationRoutes[`${type}Blockchain`]);\n }}\n />\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 { useMetaStore } from '../../store/meta';\n\nimport { filterBlockchains } from './BlockchainList.helpers';\nimport { Container, List } from './BlockchainList.styles';\nimport { LoadingBlockchainList } from './LoadingBlockchainList';\n\nexport function BlockchainList(props: PropTypes) {\n const { list, searchedFor, onChange, blockchainCategory } = props;\n const [blockchains, setBlockchains] = useState<BlockchainMeta[]>(list);\n const loadingStatus = useMetaStore.use.loadingStatus();\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 <>\n <Divider size={32} />\n <NotFound\n title={i18n.t('No results found')}\n description={i18n.t('Try using different keywords')}\n />\n </>\n );\n }\n return (\n <List key={`${blockchainCategory}-${searchedFor}`}>\n {blockchains.map((item) => (\n <ListItemButton\n key={`${item.name}-${item.chainId}`}\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.chainId as string}\n />\n ))}\n </List>\n );\n };\n\n return (\n <Container>\n <Typography variant=\"label\" size=\"large\">\n {i18n.t('Select Blockchain')}\n </Typography>\n <Divider size={4} />\n {loadingStatus === 'loading' && <LoadingBlockchainList />}\n {loadingStatus === 'success' && renderList()}\n </Container>\n );\n}\n", "import { type BlockchainMeta, TransactionType } from 'rango-sdk';\n\nimport { containsText } from '../../utils/common';\nimport { BlockchainCategories } from '../SelectableCategoryList/SelectableCategoryList.types';\n\nexport const filterByType = (\n blockchain: BlockchainMeta,\n type: string\n): boolean => {\n switch (type) {\n case BlockchainCategories.ALL:\n return true;\n case BlockchainCategories.UTXO:\n return blockchain.type === TransactionType.TRANSFER;\n case BlockchainCategories.OTHER:\n return (\n blockchain.type !== TransactionType.TRANSFER &&\n blockchain.type !== TransactionType.COSMOS &&\n blockchain.type !== TransactionType.EVM\n );\n default:\n return blockchain.type === type;\n }\n};\n\nexport const filterBlockchains = (\n list: BlockchainMeta[],\n searchedFor: string,\n blockchainType: string\n) =>\n list\n .filter((blockchain) => filterByType(blockchain, blockchainType))\n .filter(\n (blockchain) =>\n containsText(blockchain.name, searchedFor) ||\n containsText(blockchain.displayName, searchedFor)\n );\n", "export interface PropTypes {\n setCategory: (type: string) => void;\n category: string;\n}\n\nexport enum BlockchainCategories {\n ALL = 'ALL',\n EVM = 'EVM',\n COSMOS = 'COSMOS',\n UTXO = 'UTXO',\n OTHER = 'OTHER',\n}\n", "import { styled } from '@rango-dev/ui';\n\nexport const Container = styled('div', {\n display: 'flex',\n flexDirection: 'column',\n overflow: 'hidden',\n});\n\nexport const List = styled('ul', {\n padding: 0,\n margin: 0,\n listStyle: 'none',\n overflowY: 'auto',\n paddingRight: '$5',\n '.image-container': {\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>\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", "/* eslint-disable @typescript-eslint/no-magic-numbers */\nimport type { PropTypes } from './SelectableCategoryList.types';\n\nimport { i18n } from '@lingui/core';\nimport { Divider, Image, Skeleton, Typography } from '@rango-dev/ui';\nimport React from 'react';\n\nimport { useMetaStore } from '../../store/meta';\nimport { BlockchainsChip } from '../BlockchainsChip';\n\nimport { generateBlockchainsLogo } from './SelectableCategoryList.helpers';\nimport {\n Container,\n FirstImage,\n ImageContent,\n} from './SelectableCategoryList.styles';\nimport { BlockchainCategories } from './SelectableCategoryList.types';\n\nexport function SelectableCategoryList(props: PropTypes) {\n const { setCategory, category } = props;\n const blockchains = useMetaStore.use.meta().blockchains;\n const loadingStatus = useMetaStore.use.loadingStatus();\n const categories = Object.keys(\n BlockchainCategories\n ) as BlockchainCategories[];\n return (\n <Container>\n {loadingStatus === 'loading' &&\n Array.from(Array(5), (_, index) => (\n <Skeleton\n key={index}\n variant=\"rounded\"\n height={70}\n width={index === 0 ? 45 : 65}\n />\n ))}\n {loadingStatus === 'success' &&\n categories.map((blockchainCategory) => (\n <BlockchainsChip\n selected={category === blockchainCategory}\n key={blockchainCategory}\n onClick={() => setCategory(blockchainCategory)}>\n {blockchainCategory !== BlockchainCategories.ALL && (\n <>\n <ImageContent>\n {generateBlockchainsLogo(blockchains, blockchainCategory).map(\n (blockchain, index) =>\n index === 0 ? (\n <FirstImage\n key={`image-${blockchain.name}-${blockchain.chainId}`}\n src={blockchain.logo}\n />\n ) : (\n <Image\n key={`image-${blockchain.name}-${blockchain.chainId}`}\n src={blockchain.logo}\n size={15}\n />\n )\n )}\n </ImageContent>\n <Divider size={12} />\n </>\n )}\n <Typography\n size=\"xsmall\"\n variant=\"body\"\n color={\n blockchainCategory === BlockchainCategories.ALL\n ? 'secondary500'\n : undefined\n }>\n {i18n.t(BlockchainCategories[blockchainCategory])}\n </Typography>\n </BlockchainsChip>\n ))}\n </Container>\n );\n}\n", "import type { PropTypes } from './BlockchainsChip.types';\nimport type { PropsWithChildren } from 'react';\n\nimport React from 'react';\n\nimport { Chip } from './BlockchainsChip.styles';\n\nexport function BlockchainsChip(props: PropsWithChildren<PropTypes>) {\n const { children, selected, onClick } = props;\n return (\n <Chip selected={selected} onClick={onClick}>\n {children}\n </Chip>\n );\n}\n", "import { darkTheme, styled } from '@rango-dev/ui';\n\nexport const Chip = styled('button', {\n padding: '$10',\n borderRadius: '$sm',\n $$color: '$colors$neutral100',\n [`.${darkTheme} &`]: {\n $$color: '$colors$neutral300',\n },\n backgroundColor: '$$color',\n display: 'flex',\n flexDirection: 'column',\n justifyContent: 'center',\n alignItems: 'center',\n cursor: 'pointer',\n border: 0,\n '.image-container': {\n borderRadius: '$xm',\n overflow: 'hidden',\n },\n '&:hover': {\n $$color: '$colors$info100',\n [`.${darkTheme} &`]: {\n $$color: '$colors$neutral100',\n },\n backgroundColor: '$$color',\n },\n '&:focus-visible': {\n outline: 0,\n $$color: '$colors$info100',\n [`.${darkTheme} &`]: {\n $$color: '$colors$info700',\n },\n backgroundColor: '$$color',\n },\n variants: {\n selected: {\n true: { outline: '1px solid $secondary500' },\n false: { outline: 0 },\n },\n },\n});\n", "import { type BlockchainMeta } from 'rango-sdk';\n\nimport { filterByType } from '../BlockchainList/BlockchainList.helpers';\n\nimport { BlockchainCategories } from './SelectableCategoryList.types';\n\nconst blockchainslogo = {\n [BlockchainCategories.EVM]: ['ETH', 'BSC', 'POLYGON'],\n [BlockchainCategories.COSMOS]: ['COSMOS', 'OSMOSIS', 'JUNO'],\n [BlockchainCategories.UTXO]: ['BTC', 'LTC', 'BCH'],\n [BlockchainCategories.OTHER]: ['STARKNET', 'TRON', 'SOLANA'],\n};\n\nexport const generateBlockchainsLogo = (\n list: BlockchainMeta[],\n type: Exclude<BlockchainCategories, 'ALL'>\n) =>\n list\n .filter((item) => filterByType(item, type))\n .filter((item) => blockchainslogo[type].includes(item.name));\n", "import { styled } from '@rango-dev/ui';\n\nexport const Container = styled('div', {\n display: 'grid',\n gap: '$10',\n gridTemplateColumns: 'auto 1fr 1fr 1fr 1fr',\n});\n\nexport const ImageContent = styled('div', {\n display: 'flex',\n position: 'relative',\n alignItems: 'center',\n justifyContent: 'center',\n paddingTop: '$10',\n});\nexport const FirstImage = styled('img', {\n position: 'absolute',\n top: -2,\n width: 15,\n height: 15,\n});\n", "/* eslint-disable @typescript-eslint/no-magic-numbers */\nimport type { Asset, Token } from 'rango-sdk';\n\nimport { i18n } from '@lingui/core';\nimport { Divider } from '@rango-dev/ui';\nimport React, { useEffect, useState } from 'react';\nimport { useNavigate } from 'react-router-dom';\n\nimport { BlockchainsSection } from '../components/BlockchainsSection';\nimport { Layout } from '../components/Layout';\nimport { SearchInput } from '../components/SearchInput';\nimport { TokenList } from '../components/TokenList/TokenList';\nimport { filterTokens } from '../components/TokenList/TokenList.helpers';\nimport { navigationRoutes } from '../constants/navigationRoutes';\nimport { useNavigateBack } from '../hooks/useNavigateBack';\nimport { useBestRouteStore } from '../store/bestRoute';\nimport { useMetaStore } from '../store/meta';\nimport { useWalletsStore } from '../store/wallets';\nimport { findCommonTokens } from '../utils/routing';\nimport { tokensAreEqual } from '../utils/wallets';\n\ninterface PropTypes {\n type: 'from' | 'to';\n supportedBlockchains?: string[];\n supportedTokens?: Asset[];\n pinnedTokens?: Asset[];\n}\n\nexport function SelectSwapItemsPage(props: PropTypes) {\n const { type, supportedBlockchains, supportedTokens, pinnedTokens } = props;\n const [selectedBlockchain, setSelectedBlockchain] = useState('');\n const navigate = useNavigate();\n const { navigateBackFrom } = useNavigateBack();\n const {\n meta: { tokens },\n setTokensWithBalance,\n } = useMetaStore();\n const {\n sourceTokens,\n destinationTokens,\n fromBlockchain,\n toBlockchain,\n setFromToken,\n setToToken,\n setFromBlockchain,\n setToBlockchain,\n } = useBestRouteStore();\n const { connectedWallets, loading: loadingWallet } = useWalletsStore();\n const [searchedFor, setSearchedFor] = useState<string>('');\n\n const blockchains = supportedBlockchains\n ? useMetaStore.use\n .meta()\n .blockchains.filter((chain) =>\n supportedBlockchains.includes(chain.name)\n )\n : useMetaStore.use.meta().blockchains;\n\n const allTokens = supportedTokens\n ? findCommonTokens(supportedTokens, tokens)\n : tokens.filter((token) =>\n new Set(blockchains.map((blockchain) => blockchain.name)).has(\n token.blockchain\n )\n );\n\n const supportedSourceTokens = supportedTokens\n ? findCommonTokens(supportedTokens, sourceTokens)\n : sourceTokens;\n\n const supportedDestinationTokens = supportedTokens\n ? findCommonTokens(supportedTokens, destinationTokens)\n : destinationTokens;\n\n const tokensByType =\n type === 'from' ? supportedSourceTokens : supportedDestinationTokens;\n\n let tokenList: Token[] = [];\n\n const noBlockchainSelected =\n (type === 'from' && !fromBlockchain) || (type === 'to' && !toBlockchain);\n\n if (noBlockchainSelected) {\n tokenList = allTokens;\n } else if (tokensByType.length) {\n tokenList = tokensByType.map((token) => ({\n ...token,\n pin: pinnedTokens?.some((pinnedToken) =>\n tokensAreEqual(pinnedToken, token)\n ),\n }));\n }\n\n useEffect(() => {\n if (connectedWallets.length && !loadingWallet) {\n setTokensWithBalance();\n }\n }, [connectedWallets, loadingWallet]);\n\n return (\n <Layout\n header={{\n onBack: () =>\n navigateBackFrom(\n type === 'from'\n ? navigationRoutes.fromSwap\n : navigationRoutes.toSwap\n ),\n title: i18n.t('Swap {type}', { type }),\n }}>\n <BlockchainsSection\n blockchains={blockchains}\n type={type}\n blockchain={type === 'from' ? fromBlockchain : toBlockchain}\n onMoreClick={() =>\n navigate(\n type === 'from'\n ? navigationRoutes.fromBlockchain\n : navigationRoutes.toBlockchain\n )\n }\n onChange={(blockchain) => {\n {\n if (type === 'from') {\n setFromBlockchain(blockchain, true);\n } else {\n setToBlockchain(blockchain, true);\n }\n setSelectedBlockchain(blockchain.name);\n }\n }}\n />\n <Divider size={24} />\n <SearchInput\n value={searchedFor}\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 />\n <Divider size={16} />\n <TokenList\n list={filterTokens(tokenList, searchedFor)}\n selectedBlockchain={selectedBlockchain}\n searchedFor={searchedFor}\n onChange={(token) => {\n const blockchain = blockchains.find(\n (chain) => token.blockchain === chain.name\n );\n if (type === 'from') {\n setFromToken(token);\n if (!!blockchain) {\n setFromBlockchain(blockchain, true);\n }\n } else {\n setToToken(token);\n if (!!blockchain) {\n setToBlockchain(blockchain, true);\n }\n }\n navigateBackFrom(navigationRoutes.fromSwap);\n }}\n />\n </Layout>\n );\n}\n", "/* eslint-disable @typescript-eslint/no-magic-numbers */\nimport type { PropTypes } from './BlockchainsSection.types';\n\nimport { i18n } from '@lingui/core';\nimport { Divider, Image, Skeleton, Typography } from '@rango-dev/ui';\nimport { type BlockchainMeta } from 'rango-sdk';\nimport React, { useEffect, useState } from 'react';\n\nimport { useBestRouteStore } from '../../store/bestRoute';\nimport { useMetaStore } from '../../store/meta';\nimport { BlockchainsChip } from '../BlockchainsChip';\n\nimport { sortBlockchains } from './BlockchainSection.helpers';\nimport { Container } from './BlockchainsSection.styles';\n\nconst MIN = 9;\nconst MAX = 10;\nconst NUMBER_OF_LOADING = 12;\nexport function BlockchainsSection(props: PropTypes) {\n const { blockchains, type, blockchain, onChange, onMoreClick } = props;\n const sortedBlockchains = sortBlockchains(blockchains);\n const [selectFromMoreBlockchain, setSelectFromMoreBlockchain] =\n useState<BlockchainMeta | null>(null);\n const loadingStatus = useMetaStore.use.loadingStatus();\n const resetToBlockchain = useBestRouteStore.use.resetToBlockchain();\n const resetFromBlockchain = useBestRouteStore.use.resetFromBlockchain();\n const COUNT_BLOCKCHAINS = !!selectFromMoreBlockchain ? MIN : MAX;\n\n useEffect(() => {\n const selectBlockchainFromMore = sortedBlockchains\n .slice(MAX, sortedBlockchains.length)\n .find(\n (item) =>\n item.chainId === blockchain?.chainId && item.name === blockchain?.name\n );\n if (!!selectBlockchainFromMore) {\n setSelectFromMoreBlockchain(selectBlockchainFromMore);\n }\n }, [blockchain]);\n\n return (\n <div>\n <Divider size={12} />\n <Typography variant=\"label\" size=\"large\">\n {i18n.t('Select Blockchain')}\n </Typography>\n <Divider size={12} />\n <Container>\n {loadingStatus === 'loading' &&\n Array.from(Array(NUMBER_OF_LOADING), (e) => (\n <Skeleton key={e} variant=\"rounded\" height={50} />\n ))}\n {loadingStatus === 'success' && (\n <>\n <BlockchainsChip\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 {!!selectFromMoreBlockchain && (\n <BlockchainsChip\n selected={\n !!selectFromMoreBlockchain &&\n selectFromMoreBlockchain.chainId === blockchain?.chainId\n }\n key={selectFromMoreBlockchain.chainId}\n onClick={() => onChange(selectFromMoreBlockchain)}>\n <Image src={selectFromMoreBlockchain.logo} size={30} />\n </BlockchainsChip>\n )}\n {sortedBlockchains.slice(0, COUNT_BLOCKCHAINS).map((item) => (\n <BlockchainsChip\n key={item.chainId}\n selected={!!blockchain && blockchain.chainId === item.chainId}\n onClick={() => onChange(item)}>\n <Image src={item.logo} size={30} />\n </BlockchainsChip>\n ))}\n\n <BlockchainsChip onClick={onMoreClick}>\n <Typography variant=\"body\" size=\"xsmall\" color=\"secondary500\">\n {i18n._('More +{count}', {\n count: sortedBlockchains.length - MAX,\n })}\n </Typography>\n </BlockchainsChip>\n </>\n )}\n </Container>\n </div>\n );\n}\n", "import type { BlockchainMeta } from 'rango-sdk';\n\nexport const sortBlockchains = (blockchains: BlockchainMeta[]) => {\n const importantBlockchains: BlockchainMeta[] = [];\n const otherBlockchains: BlockchainMeta[] = [];\n\n for (const blockchain of blockchains) {\n if (\n blockchain.name === 'ETH' ||\n blockchain.name === 'COSMOS' ||\n blockchain.name === 'OSMOSIS'\n ) {\n importantBlockchains.push(blockchain);\n } else {\n otherBlockchains.push(blockchain);\n }\n }\n\n return importantBlockchains.concat(otherBlockchains);\n};\n", "import { styled } from '@rango-dev/ui';\n\nexport const Container = styled('div', {\n display: 'grid',\n gap: '$10',\n gridTemplateColumns: 'repeat(6, minmax(0, 1fr))',\n});\n", "/* eslint-disable @typescript-eslint/no-magic-numbers */\nimport type {\n PropTypes,\n RenderDescProps,\n TokenWithBalance,\n} from './TokenList.types';\nimport type { CommonProps } from 'react-window';\n\nimport { i18n } from '@lingui/core';\nimport {\n darkTheme,\n Divider,\n ExternalLinkIcon,\n Image,\n ListItemButton,\n NotFound,\n PinIcon,\n Skeleton,\n Typography,\n VirtualizedList,\n} from '@rango-dev/ui';\nimport React, { forwardRef, useEffect, useState } from 'react';\n\nimport { useMetaStore } from '../../store/meta';\nimport { useWalletsStore } from '../../store/wallets';\nimport { generateRangeColors } from '../../utils/common';\n\nimport { LoadingTokenList } from './LoadingTokenList';\nimport {\n BalanceContainer,\n Container,\n End,\n ImageSection,\n List,\n Pin,\n Tag,\n TagTitle,\n Title,\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=\"description\">\n {name ? (\n <div className=\"token-name\">{name}</div>\n ) : (\n <Title className=\"token-title\">\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={`token-address ${!name && 'token-address-without-name'}`}>\n <a\n href={url}\n target=\"_blank\"\n rel=\"nofollow noreferrer\"\n onClick={(e) => e.stopPropagation()}>\n {length > 10\n ? `${address.slice(0, 5)}...${address.slice(length - 6, length)}`\n : address}{' '}\n <ExternalLinkIcon color=\"gray\" size={12} />\n </a>\n </div>\n )}\n </div>\n );\n};\n\nexport function TokenList(props: PropTypes) {\n const { list, searchedFor = '', onChange, selectedBlockchain } = props;\n\n const [tokens, setTokens] = useState<TokenWithBalance[]>(list);\n const loadingStatus = useMetaStore.use.loadingStatus();\n const [hasNextPage, setHasNextPage] = useState<boolean>(true);\n const loadingWallet = useWalletsStore.use.loading();\n const { blockchains } = useMetaStore.use.meta();\n\n // eslint-disable-next-line react/display-name\n const innerElementType: React.FC<CommonProps> = forwardRef((render, ref) => {\n return (\n <div\n {...render}\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n ref={ref as any}\n style={{\n ...render.style,\n height: `${parseFloat(render.style?.height as string) + 8 * 2}px`,\n }}\n />\n );\n });\n const loadNextPage = () => {\n setTokens(list.slice(0, tokens.length + PAGE_SIZE));\n };\n\n useEffect(() => {\n setHasNextPage(list.length > tokens.length);\n }, [tokens.length]);\n\n useEffect(() => {\n setTokens(list.slice(0, PAGE_SIZE));\n }, [list]);\n\n const renderList = () => {\n if (!tokens.length && !!searchedFor) {\n return (\n <>\n <Divider size={32} />\n <NotFound\n title={i18n.t('No results found')}\n description={i18n.t('Try using different keywords')}\n />\n </>\n );\n }\n return (\n <VirtualizedList\n Item={({ index, style }) => {\n const address = tokens[index].address || '';\n const blockchain = blockchains.find(\n (blockchain) => blockchain.name === tokens[index].blockchain\n );\n const color = generateRangeColors(\n tokens[index].symbol,\n blockchain?.color || ''\n );\n\n const customCssForTag = {\n $$color: color[`${tokens[index].symbol}100`],\n [`.${darkTheme} &`]: {\n $$color: color[`${tokens[index].symbol}900`],\n },\n backgroundColor: '$$color',\n };\n\n const customCssForTagTitle = {\n $$color: color[`${tokens[index].symbol}700`],\n [`.${darkTheme} &`]: {\n $$color: color[`${tokens[index].symbol}100`],\n },\n color: '$$color',\n };\n\n return (\n <div\n style={{\n ...style,\n paddingRight: 5,\n }}>\n <ListItemButton\n style={{\n height: style?.height,\n }}\n tab-index={index}\n key={`${tokens[index].symbol}${tokens[index].address}`}\n id={`${tokens[index].symbol}${tokens[index].address}`}\n hasDivider\n onClick={() => onChange(tokens[index])}\n start={\n <ImageSection>\n <Image src={tokens[index].image} size={30} />\n {tokens[index].pin && (\n <Pin>\n <PinIcon size={12} color=\"gray\" />\n </Pin>\n )}\n </ImageSection>\n }\n title={\n blockchain?.type === 'COSMOS' ||\n !!tokens[index].name ||\n (!tokens[index].name && !address) ? (\n <Title>\n <Typography variant=\"title\" size=\"xmedium\">\n {tokens[index].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 {tokens[index].blockchain}\n </TagTitle>\n </Tag>\n </Title>\n ) : undefined\n }\n description={\n !!blockchain?.info &&\n !!address &&\n blockchain.type !== 'COSMOS'\n ? renderDesc({\n address,\n token: tokens[index],\n customCssForTag,\n customCssForTagTitle,\n name: tokens[index].name,\n url: blockchain.info.addressUrl\n .split('{wallet}')\n .join(address),\n })\n : tokens[index].name || undefined\n }\n end={\n loadingWallet ? (\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 tokens[index]?.balance && (\n <BalanceContainer>\n <Typography variant=\"title\" size=\"small\">\n {tokens[index].balance?.amount}\n </Typography>\n <div />\n {tokens[index].balance?.usdValue && (\n <Typography\n variant=\"body\"\n color=\"neutral800\"\n size=\"xsmall\">\n {`$${tokens[index].balance?.usdValue}`}\n </Typography>\n )}\n </BalanceContainer>\n )\n )\n }\n />\n </div>\n );\n }}\n hasNextPage={hasNextPage}\n itemCount={tokens.length}\n loadNextPage={loadNextPage}\n innerElementType={innerElementType}\n size={60}\n key={`${selectedBlockchain}-${searchedFor}`}\n />\n );\n };\n\n return (\n <Container>\n <Typography variant=\"label\" size=\"large\">\n {i18n.t('Select Token')}\n </Typography>\n <Divider size={4} />\n {loadingStatus === 'loading' && <LoadingTokenList size={PAGE_SIZE} />}\n {loadingStatus === 'success' && <List>{renderList()}</List>}\n </Container>\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 { styled, Typography } from '@rango-dev/ui';\n\nexport const Container = styled('div', {\n display: 'flex',\n flexDirection: 'column',\n flexGrow: 1,\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 padding: 0,\n margin: 0,\n listStyle: 'none',\n '& li': {\n alignItems: 'none',\n '.description': {\n position: 'relative',\n height: 12,\n width: 150,\n '.token-title': {\n position: 'absolute',\n transform: 'none',\n transition: 'transform 225ms cubic-bezier(0, 0, 0.2, 1) 0ms',\n bottom: '-8px',\n },\n\n '.token-address': {\n transform: 'translateY(12px)',\n visibility: 'hidden',\n '& a': {\n fontSize: '$12',\n lineHeight: '$16',\n color: '$neutral800',\n textDecoration: 'none',\n },\n },\n '.token-name': {\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 },\n },\n '&:hover': {\n '.description': {\n '.token-address': {\n position: 'absolute',\n transform: 'none',\n transition: 'transform 225ms cubic-bezier(0, 0, 0.2, 1) 0ms',\n visibility: 'visible',\n },\n '.token-address-without-name': {\n bottom: '-15px',\n },\n '.token-name': {\n position: 'absolute',\n transform: 'translateY(-12px)',\n visibility: 'hidden',\n },\n '.token-title': {\n position: 'absolute',\n transform: 'translateY(-12px)',\n bottom: '-10px',\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});\n\nexport const End = styled('ul', {\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 '.image-container': {\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", "import type { TokenWithBalance } from './TokenList.types';\n\nimport { containsText } from '../../utils/common';\n\nexport const filterTokens = (list: TokenWithBalance[], searchedFor: string) =>\n list\n .filter(\n (token) =>\n containsText(token.symbol, searchedFor) ||\n containsText(token.address || '', searchedFor) ||\n containsText(token.name || '', searchedFor)\n )\n .sort((a, b) => (b.pin as any) - (a.pin as any));\n", "import { i18n } from '@lingui/core';\nimport {\n ChevronRightIcon,\n Divider,\n List,\n ListItemButton,\n Skeleton,\n Switch,\n Typography,\n} from '@rango-dev/ui';\nimport React from 'react';\nimport { useNavigate } from 'react-router-dom';\n\nimport { Layout } from '../components/Layout';\nimport { SettingsContainer } from '../components/SettingsContainer';\nimport { Slippage } from '../components/Slippage';\nimport { navigationRoutes } from '../constants/navigationRoutes';\nimport { useNavigateBack } from '../hooks/useNavigateBack';\nimport { useMetaStore } from '../store/meta';\nimport { useSettingsStore } from '../store/settings';\nimport { getUniqueSwappersGroups } from '../utils/settings';\n\ninterface PropTypes {\n supportedSwappers?: string[];\n singleTheme?: boolean;\n}\n\nexport function SettingsPage({ supportedSwappers, singleTheme }: PropTypes) {\n const navigate = useNavigate();\n const { navigateBackFrom } = useNavigateBack();\n\n const infiniteApprove = useSettingsStore.use.infiniteApprove();\n const toggleInfiniteApprove = useSettingsStore.use.toggleInfiniteApprove();\n const loadingMetaStatus = useMetaStore.use.loadingStatus();\n\n const supportedUniqueSwappersGroups =\n getUniqueSwappersGroups(supportedSwappers);\n\n const bridgeSources = supportedUniqueSwappersGroups.filter(\n (uniqueItem) =>\n uniqueItem.type === 'BRIDGE' || uniqueItem.type === 'AGGREGATOR'\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 const totalExchangeSources = exchangeSources.length;\n const totalSelectedExchangeSources = exchangeSources.filter(\n (uniqueItem) => uniqueItem.selected\n ).length;\n\n const handleEndItem = (totalSelected: number, total: number) => {\n switch (loadingMetaStatus) {\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 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: 'bridge-item',\n title: (\n <Typography variant=\"title\" size=\"xmedium\">\n {i18n.t('Enabled bridges')}\n </Typography>\n ),\n end: (\n <>\n {handleEndItem(totalSelectedBridgeSources, totalBridgeSources)}\n <Divider direction=\"horizontal\" size={8} />\n <ChevronRightIcon color=\"black\" />\n </>\n ),\n onClick: () => navigate(navigationRoutes.bridges),\n };\n\n const exchangeItem = {\n id: 'exchange-item',\n title: (\n <Typography variant=\"title\" size=\"xmedium\">\n {i18n.t('Enabled exchanges')}\n </Typography>\n ),\n end: (\n <>\n {handleEndItem(totalSelectedExchangeSources, totalExchangeSources)}\n <Divider direction=\"horizontal\" size={8} />\n <ChevronRightIcon color=\"gray\" />\n </>\n ),\n onClick: () => navigate(navigationRoutes.exchanges),\n };\n\n const languageItem = {\n id: 'language-item',\n title: (\n <Typography variant=\"title\" size=\"xmedium\">\n {i18n.t('Language')}\n </Typography>\n ),\n end: <ChevronRightIcon color=\"gray\" />,\n onClick: () => navigate(navigationRoutes.languages),\n };\n\n const themeItem = {\n id: 'theme-item',\n title: (\n <Typography variant=\"title\" size=\"xmedium\">\n {i18n.t('Theme')}\n </Typography>\n ),\n end: <ChevronRightIcon color=\"gray\" />,\n onClick: () => navigate(navigationRoutes.themes),\n };\n\n const infiniteApprovalItem = {\n id: 'infinite-approval-item',\n title: (\n <Typography variant=\"title\" size=\"xmedium\">\n {i18n.t('Infinite Approval')}\n </Typography>\n ),\n end: <Switch checked={infiniteApprove} />,\n onClick: toggleInfiniteApprove,\n };\n\n const settingItems = [bridgeItem, exchangeItem, languageItem];\n if (!singleTheme) {\n settingItems.push(themeItem);\n }\n settingItems.push(infiniteApprovalItem);\n\n return (\n <Layout\n header={{\n onBack: navigateBackFrom.bind(null, navigationRoutes.settings),\n title: i18n.t('Setting'),\n }}>\n <SettingsContainer>\n <Slippage />\n <List\n type={\n <ListItemButton title=\"_\" id=\"_\" onClick={() => console.log()} />\n }\n items={settingItems}\n />\n </SettingsContainer>\n </Layout>\n );\n}\n", "import { i18n } from '@lingui/core';\nimport {\n Chip,\n Divider,\n InfoIcon,\n TextField,\n Tooltip,\n Typography,\n} from '@rango-dev/ui';\nimport React from 'react';\n\nimport {\n MAX_SLIPPAGE,\n MIN_SLIPPGAE,\n SLIPPAGES,\n} from '../../constants/swapSettings';\nimport { useSettingsStore } from '../../store/settings';\nimport { getContainer } from '../../utils/common';\n\nimport { BaseContainer, Head, SlippageChipsContainer } from './Slippage.styles';\nimport { SlippageTooltipContent } from './SlippageTooltipContent';\n\nexport function Slippage() {\n const slippage = useSettingsStore.use.slippage();\n const setSlippage = useSettingsStore.use.setSlippage();\n const customSlippage = useSettingsStore.use.customSlippage();\n const setCustomSlippage = useSettingsStore.use.setCustomSlippage();\n\n return (\n <BaseContainer>\n <Head>\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 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 <>\n <Chip\n style={{ width: '64px', flexShrink: 0 }}\n key={key}\n onClick={() => {\n if (customSlippage) {\n setCustomSlippage(null);\n }\n setSlippage(slippageItem);\n }}\n selected={!customSlippage && slippageItem === slippage}\n label={`${slippageItem.toString()}%`}\n />\n <Divider direction=\"horizontal\" size={8} />\n </>\n );\n })}\n <TextField\n type=\"number\"\n min=\"0.01\"\n max=\"30\"\n step=\"0.01\"\n fullWidth\n variant=\"contained\"\n value={customSlippage || ''}\n color=\"dark\"\n onChange={(event) => {\n const parsedValue = parseFloat(event.target.value);\n if (\n !parsedValue ||\n (parsedValue >= MIN_SLIPPGAE && parsedValue <= MAX_SLIPPAGE)\n ) {\n setCustomSlippage(parsedValue);\n }\n }}\n suffix={\n customSlippage && (\n <Typography variant=\"body\" size=\"small\">\n %\n </Typography>\n )\n }\n placeholder=\"Custom\"\n />\n </SlippageChipsContainer>\n </BaseContainer>\n );\n}\n", "import { styled } from '@rango-dev/ui';\n\nexport const BaseContainer = styled('div', {\n paddingTop: '$5',\n paddingBottom: '30px',\n});\n\nexport const SlippageChipsContainer = styled('div', {\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'start',\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: '300px',\n padding: '$10',\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=\"small\" color=\"neutral900\">\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 per step, e.g. 1Inch, Thorchain, etc. and only that step will be reverted, not the whole transaction'\n )}\n </Typography>\n </SlippageTooltipContainer>\n );\n}\n", "import { cancelSwap } from '@rango-dev/queue-manager-rango-preset';\nimport { useManager } from '@rango-dev/queue-manager-react';\nimport React from 'react';\n\nimport { SwapDetails } from '../components/SwapDetails';\nimport { SwapDetailsPlaceholder } from '../components/SwapDetails/SwapDetails.Placeholder';\nimport { navigationRoutes } from '../constants/navigationRoutes';\nimport { useNavigateBack } from '../hooks/useNavigateBack';\nimport { useMetaStore } from '../store/meta';\nimport { useUiStore } from '../store/ui';\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 = useUiStore.use.selectedSwapRequestId();\n const { navigateBackFrom } = useNavigateBack();\n const { loadingStatus } = useMetaStore();\n\n const showSkeleton = loading || loadingStatus === 'loading';\n\n const selectedSwap = pendingSwaps.find(\n ({ swap }) => swap.requestId === requestId\n );\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 await manager?.deleteQueue(selectedSwap.id);\n navigateBackFrom(navigationRoutes.swapDetails);\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';\n\nimport { i18n } from '@lingui/core';\nimport {\n getCurrentBlockchainOfOrNull,\n getCurrentStep,\n getRelatedWalletOrNull,\n PendingSwapNetworkStatus,\n} from '@rango-dev/queue-manager-rango-preset';\nimport {\n Button,\n CopyIcon,\n Divider,\n IconButton,\n RouteCost,\n RouteSummary,\n StepDetails,\n Typography,\n useCopyToClipboard,\n} from '@rango-dev/ui';\nimport { useWallets } from '@rango-dev/wallets-react';\nimport React, { useEffect, useRef, useState } from 'react';\nimport { useNavigate } from 'react-router-dom';\n\nimport { navigationRoutes } from '../../constants/navigationRoutes';\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 { useNavigateBack } from '../../hooks/useNavigateBack';\nimport { useBestRouteStore } from '../../store/bestRoute';\nimport { useMetaStore } from '../../store/meta';\nimport { useNotificationStore } from '../../store/notification';\nimport { numberToString } from '../../utils/numbers';\nimport { getPriceImpactLevel } from '../../utils/routing';\nimport {\n getLastConvertedTokenInFailedSwap,\n getPercentageChange,\n getSwapMessages,\n shouldRetrySwap,\n} from '../../utils/swap';\nimport { getSwapDate } from '../../utils/time';\nimport { getConciseAddress, getUsdPrice } from '../../utils/wallets';\nimport { SuffixContainer } from '../HeaderButtons/HeaderButtons.styles';\nimport { Layout } from '../Layout';\nimport {\n SwapDetailsCompleteModal,\n SwapDetailsModal,\n} from '../SwapDetailsModal';\n\nimport {\n getSteps,\n getStepState,\n RESET_INTERVAL,\n SECONDS,\n} from './SwapDetails.helpers';\nimport { Container, HeaderDetails, StepsList } from './SwapDetails.styles';\n\nexport function SwapDetails(props: SwapDetailsProps) {\n const { swap, requestId, onDelete, onCancel: onCancelProps } = props;\n const { canSwitchNetworkTo, connect, getWalletInfo } = useWallets();\n const retry = useBestRouteStore.use.retry();\n const navigate = useNavigate();\n const { navigateBackFrom } = useNavigateBack();\n const [_, handleCopy] = useCopyToClipboard(RESET_INTERVAL);\n const listRef = useRef<HTMLDivElement | null>(null);\n const [modalState, setModalState] = useState<ModalState>(null);\n const [showCompletedModal, setShowCompletedModal] = useState<\n 'success' | 'failed' | null\n >(null);\n const {\n meta: { tokens },\n } = useMetaStore();\n\n const onCancel = () => {\n onCancelProps();\n setModalState(null);\n };\n\n const getUnreadNotifications =\n useNotificationStore.use.getUnreadNotifications();\n const setAsRead = useNotificationStore.use.setAsRead();\n const unreadNotifications = getUnreadNotifications();\n const currentStep = getCurrentStep(swap);\n const currentStepNetworkStatus = currentStep?.networkStatus;\n\n useEffect(() => {\n const existNotification = unreadNotifications.find(\n (n) => n.requestId === swap.requestId\n );\n if (existNotification) {\n if (swap.status === 'success' || swap.status === 'failed') {\n setShowCompletedModal(swap.status);\n setAsRead(swap.requestId);\n }\n }\n }, [swap.status]);\n\n useEffect(() => {\n if (showSwitchNetwork) {\n setModalState(PendingSwapNetworkStatus.WaitingForNetworkChange);\n } else if (\n currentStepNetworkStatus ===\n PendingSwapNetworkStatus.WaitingForConnectingWallet ||\n currentStepNetworkStatus === PendingSwapNetworkStatus.NetworkChanged\n ) {\n setModalState(currentStepNetworkStatus);\n } else {\n setModalState(null);\n }\n }, [currentStepNetworkStatus]);\n\n const lastConvertedTokenInFailedSwap =\n getLastConvertedTokenInFailedSwap(swap);\n\n const currentStepBlockchain = currentStep\n ? getCurrentBlockchainOfOrNull(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 isMobileWallet = (walletType: string): boolean =>\n !!getWalletInfo(walletType)?.mobileWallet;\n\n const showSwitchNetwork =\n currentStepNetworkStatus ===\n PendingSwapNetworkStatus.WaitingForNetworkChange &&\n !!currentStepBlockchain &&\n !!currentStepWallet?.walletType &&\n (isMobileWallet(currentStepWallet.walletType) ||\n canSwitchNetworkTo(currentStepWallet.walletType, currentStepBlockchain));\n\n const switchNetwork = showSwitchNetwork\n ? connect.bind(null, currentStepWallet.walletType, currentStepBlockchain)\n : undefined;\n\n const stepMessage = getSwapMessages(swap, currentStep);\n const steps = getSteps({\n swap,\n switchNetwork,\n showNetworkModal: currentStepNetworkStatus,\n setNetworkModal: setModalState,\n message: stepMessage,\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 totalTime = swap.steps.reduce(\n (totalTime, step) => totalTime + (step.estimatedTimeInSeconds || 0),\n 0\n );\n\n const minutes = Math.floor(totalTime / SECONDS);\n\n const diagnosisUrl = swap.steps.find(\n (step) => step.diagnosisUrl\n )?.diagnosisUrl;\n\n const outputUsdValue = numberToString(\n String(\n parseFloat(\n numberToString(\n outputAmount,\n TOKEN_AMOUNT_MIN_DECIMALS,\n TOKEN_AMOUNT_MAX_DECIMALS\n )\n ) *\n (getUsdPrice(\n lastStep.toBlockchain,\n lastStep.toSymbol,\n lastStep.toSymbolAddress,\n tokens\n ) || 0)\n ),\n USD_VALUE_MIN_DECIMALS,\n USD_VALUE_MAX_DECIMALS\n );\n\n const inputUsdValue = numberToString(\n String(\n parseFloat(swap.inputAmount) *\n (getUsdPrice(\n firstStep.fromBlockchain,\n firstStep.fromSymbol,\n firstStep.fromSymbolAddress,\n tokens\n ) || 0)\n ),\n USD_VALUE_MIN_DECIMALS,\n USD_VALUE_MAX_DECIMALS\n );\n\n const percentageChange = getPercentageChange(inputUsdValue, outputUsdValue);\n\n const completeModalDesc =\n swap.status === 'success'\n ? `You have received ${numberToString(\n outputAmount,\n TOKEN_AMOUNT_MIN_DECIMALS,\n TOKEN_AMOUNT_MAX_DECIMALS\n )} ${\n steps[numberOfSteps - 1].to.token.displayName\n } in ${getConciseAddress(\n swap.wallets[steps[numberOfSteps - 1].to.chain.displayName]\n ?.address || ''\n )} wallet on ${steps[numberOfSteps - 1].to.chain.displayName} chain.`\n : `${i18n.t('Transaction was not sent.')} ${\n lastConvertedTokenInFailedSwap\n ? `${lastConvertedTokenInFailedSwap.outputAmount} ${lastConvertedTokenInFailedSwap.symbol} on ${lastConvertedTokenInFailedSwap.blockchain} remain in your wallet`\n : ''\n }`;\n\n return (\n <Layout\n noPadding\n header={{\n title: i18n.t('Swap and Bridge'),\n onBack: navigateBackFrom.bind(null, navigationRoutes.swapDetails),\n onCancel:\n swap.status === 'running' ? () => setModalState('cancel') : undefined,\n suffix: swap.status !== 'running' && (\n <SuffixContainer>\n <Button\n variant=\"ghost\"\n type=\"error\"\n size=\"xsmall\"\n onClick={() => setModalState('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 variant=\"contained\"\n type=\"primary\"\n size=\"large\"\n onClick={() => {\n retry(swap);\n setTimeout(() => {\n navigate(navigationRoutes.home);\n }, 0);\n }}>\n {i18n.t('Try again')}\n </Button>\n )\n }>\n <Container>\n <HeaderDetails>\n <div className=\"row\">\n <Typography variant=\"label\" size=\"large\" color=\"neutral900\">\n {`${i18n.t('Request ID')}:`}\n </Typography>\n <div className=\"request-id\">\n <Typography variant=\"label\" size=\"small\" color=\"neutral900\">\n {requestId}\n </Typography>\n <IconButton\n variant=\"ghost\"\n onClick={handleCopy.bind(null, requestId || '')}>\n <CopyIcon size={16} color=\"gray\" />\n </IconButton>\n </div>\n </div>\n <div className=\"row\">\n <Typography variant=\"label\" size=\"large\" color=\"neutral900\">\n {`${i18n.t('Created at')}:`}\n </Typography>\n <Typography variant=\"label\" size=\"small\" color=\"neutral900\">\n {swapDate}\n </Typography>\n </div>\n </HeaderDetails>\n\n <div className=\"output\">\n <RouteCost\n fee={numberToString(\n String(totalFee),\n GAS_FEE_MIN_DECIMALS,\n GAS_FEE_MAX_DECIMALS\n )}\n time={minutes}\n steps={numberOfSteps}\n />\n <RouteSummary\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 },\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 },\n token: {\n displayName: 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: 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(\n percentageChange?.toNumber() ?? 0\n )}\n />\n </div>\n <div className=\"title-steps\">\n <Typography variant=\"title\" size=\"small\">\n {i18n.t('Swaps steps')}\n </Typography>\n </div>\n <Divider size={8} />\n <StepsList ref={listRef}>\n {steps.map((step, index) => {\n const key = index;\n const state = 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 key={key}\n step={step}\n type=\"route-progress\"\n ref={listRef}\n state={state}\n hasSeparator={index !== 0}\n tabIndex={key}\n isFocused={isFocused}\n />\n );\n })}\n </StepsList>\n </Container>\n\n <SwapDetailsModal\n state={modalState}\n onClose={() => setModalState(null)}\n onCancel={onCancel}\n onDelete={onDelete}\n message={stepMessage.detailedMessage.content}\n currentStepWallet={currentStepWallet}\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 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 { PendingSwap } from '@rango-dev/queue-manager-rango-preset';\n\nexport function timeSince(timeMillis: number): string {\n const seconds = Math.floor((new Date().getTime() - timeMillis) / 1000);\n let intervalType: string;\n\n let interval = Math.floor(seconds / 31536000);\n if (interval >= 1) {\n intervalType = 'year';\n } else {\n interval = Math.floor(seconds / 2592000);\n if (interval >= 1) {\n intervalType = 'month';\n } else {\n interval = Math.floor(seconds / 86400);\n if (interval >= 1) {\n intervalType = 'day';\n } else {\n interval = Math.floor(seconds / 3600);\n if (interval >= 1) {\n intervalType = 'hour';\n } else {\n interval = Math.floor(seconds / 60);\n if (interval >= 1) {\n intervalType = 'minute';\n } else {\n interval = seconds;\n intervalType = 'second';\n }\n }\n }\n }\n }\n\n if (interval > 1 || interval === 0) {\n intervalType += 's';\n }\n\n return interval + ' ' + intervalType;\n}\n\nexport function getSwapDate(pendingSwap: PendingSwap) {\n return pendingSwap.finishTime\n ? `${timeSince(parseInt(pendingSwap.finishTime))} ago`\n : `${timeSince(parseInt(pendingSwap.creationTime))} ago`;\n}\n", "import type { ModalPropTypes } from './SwapDetailsModal.types';\n\nimport { PendingSwapNetworkStatus } from '@rango-dev/queue-manager-rango-preset';\nimport { Modal } from '@rango-dev/ui';\nimport React from 'react';\n\nimport { CancelContent } from './SwapDetailsModal.Cancel';\nimport { DeleteContent } from './SwapDetailsModal.Delete';\nimport { modalNetworkValues } from './SwapDetailsModal.helpers';\nimport { WalletStateContent } from './SwapDetailsModal.WalletState';\n\nexport function SwapDetailsModal(props: ModalPropTypes) {\n const { state, onClose, onDelete, onCancel, currentStepWallet, message } =\n props;\n\n const showWalletStateContent =\n state === PendingSwapNetworkStatus.WaitingForNetworkChange ||\n state === PendingSwapNetworkStatus.WaitingForConnectingWallet ||\n state === PendingSwapNetworkStatus.NetworkChanged;\n\n return (\n <Modal\n open={!!state}\n onClose={onClose}\n container={document.getElementById('swap-box') || document.body}>\n {showWalletStateContent && (\n <WalletStateContent\n type={modalNetworkValues[state].type}\n title={modalNetworkValues[state].title}\n currentStepWallet={currentStepWallet}\n message={message}\n showWalletButton={\n state !== PendingSwapNetworkStatus.WaitingForNetworkChange\n }\n />\n )}\n {state === 'delete' && (\n <DeleteContent onClose={onClose} onDelete={onDelete} />\n )}\n {state === 'cancel' && (\n <CancelContent onClose={onClose} onCancel={onCancel} />\n )}\n </Modal>\n );\n}\n", "import type { CancelContentProps } 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 CancelContent = ({ onCancel, onClose }: CancelContentProps) => {\n return (\n <>\n <Divider size={20} />\n <MessageBox\n type=\"error\"\n title={i18n.t('Transaction Cancel')}\n description={i18n.t('Are you sure you want to Cancel this swap?')}\n />\n <Divider size={32} />\n <Button\n variant=\"contained\"\n type=\"primary\"\n size=\"large\"\n onClick={onCancel}>\n <Typography variant=\"title\" size=\"medium\" color=\"neutral100\">\n {i18n.t('Yes, Cancel it')}\n </Typography>\n </Button>\n <Divider size={12} />\n <Button variant=\"outlined\" type=\"primary\" size=\"large\" onClick={onClose}>\n <Typography variant=\"title\" size=\"medium\" color=\"primary\">\n {i18n.t('No, Continue')}\n </Typography>\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 variant=\"contained\"\n type=\"primary\"\n size=\"large\"\n onClick={onDelete}>\n <Typography variant=\"title\" size=\"medium\" color=\"neutral100\">\n {i18n.t('Yes, Delete it')}\n </Typography>\n </Button>\n <Divider size={12} />\n <Button variant=\"outlined\" type=\"primary\" size=\"large\" 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 { ModalNetworkValueTypes } from './SwapDetailsModal.types';\n\nimport { i18n } from '@lingui/core';\nimport { PendingSwapNetworkStatus } from '@rango-dev/queue-manager-rango-preset';\n\nexport const modalNetworkValues: Record<\n Exclude<PendingSwapNetworkStatus, PendingSwapNetworkStatus.WaitingForQueue>,\n ModalNetworkValueTypes\n> = {\n [PendingSwapNetworkStatus.WaitingForNetworkChange]: {\n type: 'loading',\n title: i18n.t('Change Network'),\n },\n [PendingSwapNetworkStatus.WaitingForConnectingWallet]: {\n type: 'warning',\n title: i18n.t('Connect Wallet'),\n },\n [PendingSwapNetworkStatus.NetworkChanged]: {\n type: 'success',\n title: i18n.t('Network Changed'),\n },\n};\n", "import type { WalletStateContentProps } from './SwapDetailsModal.types';\n\nimport { MessageBox, Wallet, WalletState } from '@rango-dev/ui';\nimport { useWallets } from '@rango-dev/wallets-react';\nimport React from 'react';\n\nimport { getContainer } from '../../utils/common';\n\nimport { WalletContainer } from './SwapDetailsModal.styles';\n\nexport const WalletStateContent = (props: WalletStateContentProps) => {\n const { type, title, currentStepWallet, message, showWalletButton } = props;\n const { connect, getWalletInfo, state: walletState } = useWallets();\n const walletType = currentStepWallet?.walletType;\n const isConnected = walletType && walletState(walletType).connected;\n const state = isConnected ? WalletState.CONNECTED : WalletState.DISCONNECTED;\n return (\n <>\n <MessageBox type={type} title={title} description={message} />\n {showWalletButton && walletType && (\n <WalletContainer>\n <Wallet\n container={getContainer()}\n title={getWalletInfo(walletType).name}\n image={getWalletInfo(walletType).img}\n type={walletType}\n state={state}\n onClick={async () => connect(walletType)}\n />\n </WalletContainer>\n )}\n </>\n );\n};\n", "import { styled } from '@rango-dev/ui';\n\nexport const WalletContainer = styled('div', {\n display: 'flex',\n justifyContent: 'center',\n});\n", "import type { CompleteModalPropTypes } from './SwapDetailsModal.types';\n\nimport { i18n } from '@lingui/core';\nimport {\n Button,\n Divider,\n MessageBox,\n Modal,\n TokenAmount,\n Typography,\n} from '@rango-dev/ui';\nimport React from 'react';\nimport { useNavigate } from 'react-router-dom';\n\nimport { navigationRoutes } from '../../constants/navigationRoutes';\n\nexport function SwapDetailsCompleteModal(props: CompleteModalPropTypes) {\n const {\n open,\n onClose,\n status,\n priceValue,\n usdValue,\n token,\n chain,\n percentageChange,\n description,\n diagnosisUrl,\n } = props;\n const navigate = useNavigate();\n\n return (\n <Modal\n open={open}\n onClose={onClose}\n container={document.getElementById('swap-box') || document.body}>\n {status === 'success' ? (\n <MessageBox type=\"success\" title={i18n.t('Swap Successful')}>\n <TokenAmount\n direction=\"vertical\"\n type=\"output\"\n centerAlign={true}\n price={{\n value: priceValue,\n usdValue,\n }}\n token={token}\n chain={chain}\n percentageChange={percentageChange}\n />\n <Divider size={12} />\n <Typography\n variant=\"body\"\n size=\"medium\"\n color=\"neutral900\"\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={32} />\n {status === 'success' && (\n <Button\n variant=\"contained\"\n type=\"primary\"\n size=\"large\"\n onClick={() => navigate(navigationRoutes.home)}>\n <Typography variant=\"title\" size=\"medium\" color=\"neutral100\">\n {i18n.t('Done')}\n </Typography>\n </Button>\n )}\n <Divider size={12} />\n {diagnosisUrl && (\n <>\n <Button\n variant=\"contained\"\n type=\"primary\"\n size=\"large\"\n onClick={() => window.open(diagnosisUrl, '_blank')}>\n <Typography variant=\"title\" size=\"medium\" color=\"primary\">\n {i18n.t('Diagnosis')}\n </Typography>\n </Button>\n <Divider size={12} />\n </>\n )}\n <Button variant=\"outlined\" type=\"primary\" size=\"large\" onClick={onClose}>\n <Typography variant=\"title\" size=\"medium\" color=\"primary\">\n {i18n.t('See Details')}\n </Typography>\n </Button>\n </Modal>\n );\n}\n", "import type { GetStep } from '../SwapDetailsAlerts';\nimport type { PendingSwapStep } from '@rango-dev/queue-manager-rango-preset';\nimport type { Step, StepDetailsProps } from '@rango-dev/ui';\n\nimport React from 'react';\n\nimport {\n TOKEN_AMOUNT_MAX_DECIMALS,\n TOKEN_AMOUNT_MIN_DECIMALS,\n} from '../../constants/routing';\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 = ({ swap, ...args }: GetStep): Step[] => {\n const hasAlreadyProceededToSign = swap.hasAlreadyProceededToSign !== false;\n return swap.steps.map((step, index) => {\n const amountToConvert =\n index === 0 ? swap.inputAmount : swap.steps[index - 1].outputAmount;\n return {\n from: {\n token: { displayName: step.fromSymbol, image: step.fromLogo || '' },\n chain: {\n displayName: step.fromBlockchain,\n image: step.fromBlockchainLogo || '',\n },\n price: {\n value: numberToString(\n amountToConvert,\n TOKEN_AMOUNT_MIN_DECIMALS,\n TOKEN_AMOUNT_MAX_DECIMALS\n ),\n },\n },\n to: {\n token: { displayName: step.toSymbol, image: step.toLogo },\n chain: {\n displayName: step.toBlockchain,\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 },\n },\n swapper: { displayName: step.swapperId, image: step.swapperLogo || '' },\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 switchNetwork,\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 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 = (lastUrl && inProgress) || waitingForApproval;\n const error = lastUrl && step.status === 'failed';\n\n return (\n <Fragment key={key}>\n <Alert\n type={(loading && 'loading') || (error && 'error') || 'success'}\n title={\n !explorerUrl.description\n ? i18n.t('View transaction')\n : `${explorerUrl.description} Tx`\n }\n action={\n explorerUrl.url && (\n <IconButton\n variant=\"ghost\"\n size=\"xsmall\"\n onClick={() => window.open(explorerUrl.url, '_blank')}>\n <LinkIcon size={16} />\n </IconButton>\n )\n }\n />\n </Fragment>\n );\n })}\n {((inProgress && !hasAlreadyProceededToSign) ||\n (waitingForApproval && !step.explorerUrl?.length)) && (\n <Alert type=\"loading\" title={message.shortMessage} />\n )}\n {step.status !== 'failed' && hasWarning && (\n <WarningAlert\n switchNetwork={switchNetwork}\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 {\n Alert,\n ChevronDownIcon,\n ChevronUpIcon,\n IconButton,\n} from '@rango-dev/ui';\nimport React, { useState } from 'react';\n\nexport function FailedAlert(props: FailedAlertsProps) {\n const { message } = props;\n const [showContentError, setShowContentError] = useState(false);\n\n return (\n <Alert\n type=\"error\"\n title={message.shortMessage}\n action={\n message.detailedMessage.content && (\n <IconButton\n onClick={() => setShowContentError((prev) => !prev)}\n variant=\"ghost\"\n size=\"xsmall\">\n {showContentError ? (\n <ChevronUpIcon size={12} color=\"gray\" />\n ) : (\n <ChevronDownIcon size={12} color=\"gray\" />\n )}\n </IconButton>\n )\n }\n footer={showContentError ? message.detailedMessage.content : undefined}\n />\n );\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", "import type { WaningAlertsProps } from './SwapDetailsAlerts.types';\n\nimport { i18n } from '@lingui/core';\nimport { PendingSwapNetworkStatus } from '@rango-dev/queue-manager-rango-preset';\nimport { Alert, Button } from '@rango-dev/ui';\nimport React from 'react';\n\nexport function WarningAlert(props: WaningAlertsProps) {\n const { switchNetwork, setNetworkModal, message, showNetworkModal } = props;\n if (!!switchNetwork) {\n return (\n <Alert\n type=\"warning\"\n title={message.shortMessage}\n action={\n <Button\n size=\"xxsmall\"\n type=\"warning\"\n onClick={() => {\n setNetworkModal(PendingSwapNetworkStatus.WaitingForNetworkChange);\n switchNetwork().catch((e) => {\n console.log(e);\n });\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 action={\n <Button\n size=\"xxsmall\"\n type=\"warning\"\n onClick={() => {\n setNetworkModal(\n PendingSwapNetworkStatus.WaitingForConnectingWallet\n );\n }}>\n {i18n.t('Connect')}\n </Button>\n }\n />\n );\n }\n\n return <Alert type=\"warning\" title={message.shortMessage} />;\n}\n", "import { darkTheme, styled } from '@rango-dev/ui';\n\nexport const Container = styled('div', {\n display: 'flex',\n width: '100%',\n flexDirection: 'column',\n alignItems: 'center',\n height: '0',\n flexGrow: 1,\n '& .row': {\n display: 'flex',\n width: '100%',\n justifyContent: 'space-between',\n alignItems: 'center',\n padding: '$10 $5',\n borderBottom: '1px solid',\n $$color: '$colors$neutral300',\n [`.${darkTheme} &`]: {\n $$color: '$colors$neutral400',\n },\n borderColor: '$$color',\n color: '$neutral500',\n },\n '& .request-id': {\n display: 'flex',\n justifyContent: 'center',\n alignItems: 'center',\n height: '$24',\n },\n '& .output': {\n display: 'flex',\n width: '100%',\n padding: '$15 $20 $20',\n flexDirection: 'column',\n alignItems: 'start',\n },\n '& .title-steps': {\n textAlign: 'left',\n width: '100%',\n padding: '0 $20 $10',\n },\n});\n\nexport const HeaderDetails = styled('div', {\n width: '100%',\n padding: '0px 15px',\n});\n\nexport const StepsList = styled('div', {\n padding: '$0 $20 $20 $20',\n width: '100%',\n overflow: 'auto',\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 textAlign: '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", "import type { SwapDetailsPlaceholderPropTypes } from './SwapDetails.types';\n\nimport { i18n } from '@lingui/core';\nimport {\n CopyIcon,\n IconButton,\n NotFound,\n Skeleton,\n Typography,\n} from '@rango-dev/ui';\nimport React from 'react';\n\nimport { navigationRoutes } from '../../constants/navigationRoutes';\nimport { useNavigateBack } from '../../hooks/useNavigateBack';\nimport { SuffixContainer } from '../HeaderButtons/HeaderButtons.styles';\nimport { Layout } from '../Layout';\nimport { LoadingSwapDetails } from '../LoadingSwapDetails';\n\nimport {\n Container,\n HeaderDetails,\n PlaceholderContainer,\n} from './SwapDetails.styles';\n\nexport function SwapDetailsPlaceholder(props: SwapDetailsPlaceholderPropTypes) {\n const { requestId, showSkeleton } = props;\n const { navigateBackFrom } = useNavigateBack();\n\n return (\n <Layout\n noPadding\n header={{\n title: i18n.t('Swap and Bridge'),\n onBack: navigateBackFrom.bind(null, navigationRoutes.swapDetails),\n suffix: <SuffixContainer />,\n }}>\n {showSkeleton && (\n <Container>\n <HeaderDetails>\n <div className=\"row\">\n <Typography variant=\"label\" size=\"large\" color=\"neutral900\">\n {`${i18n.t('Request ID')}:`}\n </Typography>\n <div className=\"request-id\">\n <Typography variant=\"label\" size=\"small\" color=\"neutral900\">\n <Skeleton width={60} height={10} variant=\"rounded\" />\n </Typography>\n <IconButton variant=\"ghost\">\n <CopyIcon size={16} color=\"gray\" />\n </IconButton>\n </div>\n </div>\n <div className=\"row\">\n <Typography variant=\"label\" size=\"large\" color=\"neutral900\">\n {`${i18n.t('Created at')}:`}\n </Typography>\n <Typography variant=\"label\" size=\"small\" color=\"neutral900\">\n <Skeleton width={60} height={10} variant=\"rounded\" />\n </Typography>\n </div>\n </HeaderDetails>\n <LoadingSwapDetails />\n </Container>\n )}\n {!showSkeleton && (\n <PlaceholderContainer>\n <NotFound\n title={i18n.t('Not found')}\n description={i18n.t(\n 'swapNotFound',\n { requestId },\n { message: 'Swap with request ID = ${requestId} not found.' }\n )}\n />\n </PlaceholderContainer>\n )}\n </Layout>\n );\n}\n", "import { i18n } from '@lingui/core';\nimport { ChainToken, Divider, Skeleton, Typography } from '@rango-dev/ui';\nimport React from 'react';\n\nimport { Container, StepSeparator } from './LoadingSwapDetails.styles';\nimport { LoadingSwapDetailStep } from './LoadingSwapDetailStep';\n\nexport function LoadingSwapDetails() {\n const routeSummary = (\n <div className=\"route-summary-item\">\n <div className=\"token-amount\">\n <ChainToken loading size=\"medium\" chainImage=\"\" tokenImage=\"\" />\n <Divider size={8} direction=\"horizontal\" />\n <Skeleton height={15} width={148} variant=\"rounded\" />\n </div>\n <Skeleton height={12} width={64} variant=\"rounded\" />\n </div>\n );\n\n return (\n <Container>\n <div className=\"cost\">\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 </div>\n\n <div className=\"route-summary\">\n {routeSummary}\n <div className=\"route-summary-separator\"></div>\n {routeSummary}\n </div>\n\n <div className=\"swaps-steps\">\n <Typography variant=\"title\" size=\"small\">\n {i18n.t('Swaps steps')}\n </Typography>\n </div>\n\n <div className=\"step-container\">\n <LoadingSwapDetailStep extraInfo />\n <StepSeparator />\n <LoadingSwapDetailStep />\n <StepSeparator />\n <LoadingSwapDetailStep />\n <StepSeparator />\n <LoadingSwapDetailStep />\n </div>\n </Container>\n );\n}\n", "import { styled } from '@rango-dev/ui';\n\nexport const Container = styled('div', {\n width: '100%',\n height: '100%',\n padding: '$0 $20',\n\n '.cost': {\n paddingTop: '$15',\n display: 'flex',\n },\n\n '.route-summary': {\n padding: '$15 $0',\n },\n\n '.route-summary-item': {\n display: 'flex',\n justifyContent: 'space-between',\n alignItems: 'center',\n },\n\n '.token-amount': {\n display: 'flex',\n justifyContent: 'space-between',\n alignItems: 'center',\n },\n\n '.route-summary-separator': {\n width: '0px',\n height: '$16',\n borderLeft: '1px solid $neutral400',\n marginLeft: '13px',\n },\n\n '.swaps-steps': {\n paddingBottom: '$10',\n },\n});\n\nexport const StepContainer = styled('div', {\n backgroundColor: '$neutral100',\n borderRadius: '$xm',\n padding: '$10 $15',\n\n '.step-title': {\n display: 'flex',\n justifyContent: 'start',\n alignItems: 'center',\n },\n '.step-tokens': {\n paddingTop: '$5',\n display: 'flex',\n alignItems: 'center',\n },\n '.step-token-info': {\n display: 'flex',\n alignItems: 'center',\n },\n '.step-icon-container': {\n padding: '$4 $6',\n display: 'flex',\n justifyContent: 'center',\n alignItems: 'center',\n },\n\n '.extra-info': {\n display: 'flex',\n paddingTop: '$10',\n paddingBottom: '$5',\n },\n});\nexport const StepSeparator = styled('div', {\n width: '0px',\n height: '$20',\n borderLeft: '1px dashed $neutral900',\n marginLeft: '25px',\n});\n", "import type { StepSkeletonPropsTypes } from './LoadingSwapDetails.types';\n\nimport { ChainToken, Divider, NextIcon, Skeleton } from '@rango-dev/ui';\nimport React from 'react';\n\nimport { StepContainer } from './LoadingSwapDetails.styles';\n\nexport function LoadingSwapDetailStep(props: StepSkeletonPropsTypes) {\n const { extraInfo } = props;\n return (\n <StepContainer>\n <div className=\"step-title\">\n <Skeleton height={28} width={28} variant=\"circular\" />\n <Divider direction=\"horizontal\" size={8} />\n <Skeleton height={15} width={148} variant=\"rounded\" />\n </div>\n <div className=\"step-tokens\">\n <Divider direction=\"horizontal\" size={20} />\n <div className=\"step-token-info\">\n <ChainToken size=\"small\" loading chainImage=\"\" tokenImage=\"\" />\n <Divider direction=\"horizontal\" size={8} />\n <Skeleton height={12} width={76} variant=\"rounded\" />\n </div>\n <div className=\"step-icon-container\">\n <NextIcon color=\"gray\" size={16} />\n </div>\n <div className=\"step-token-info\">\n <ChainToken size=\"small\" loading chainImage=\"\" tokenImage=\"\" />\n <Divider direction=\"horizontal\" size={8} />\n <Skeleton height={12} width={76} variant=\"rounded\" />\n </div>\n </div>\n {extraInfo && (\n <div className=\"extra-info\">\n <Divider direction=\"horizontal\" size={20} />\n <Skeleton height={22} width={297} variant=\"rectangular\" />\n </div>\n )}\n </StepContainer>\n );\n}\n", "import { i18n } from '@lingui/core';\nimport {\n AutoThemeIcon,\n DarkModeIcon,\n LightModeIcon,\n List,\n ListItemButton,\n Radio,\n RadioRoot,\n Typography,\n} from '@rango-dev/ui';\nimport React from 'react';\n\nimport { Layout } from '../components/Layout';\nimport { SettingsContainer } from '../components/SettingsContainer';\nimport { navigationRoutes } from '../constants/navigationRoutes';\nimport { useNavigateBack } from '../hooks/useNavigateBack';\nimport { useSettingsStore } from '../store/settings';\n\ntype Theme = 'dark' | 'light' | 'auto';\n\nenum Mode {\n DARK = 'dark',\n LIGHT = 'light',\n AUTO = 'auto',\n}\n\nexport function ThemePage() {\n const { navigateBackFrom } = useNavigateBack();\n const theme = useSettingsStore.use.theme();\n const setTheme = useSettingsStore.use.setTheme();\n\n const themesList = [\n {\n id: Mode.LIGHT,\n value: Mode.LIGHT,\n title: (\n <Typography variant=\"title\" size=\"xmedium\">\n {i18n.t('Light')}\n </Typography>\n ),\n onClick: () => setTheme(Mode.LIGHT as Theme),\n start: <LightModeIcon color=\"gray\" />,\n end: <Radio value={Mode.LIGHT} />,\n },\n {\n id: Mode.DARK,\n value: Mode.DARK,\n title: (\n <Typography variant=\"title\" size=\"xmedium\">\n {i18n.t('Dark')}\n </Typography>\n ),\n onClick: () => setTheme(Mode.DARK as Theme),\n start: <DarkModeIcon color=\"gray\" />,\n end: <Radio value={Mode.DARK} />,\n },\n {\n id: Mode.AUTO,\n value: Mode.AUTO,\n title: (\n <Typography variant=\"title\" size=\"xmedium\">\n {i18n.t('Auto')}\n </Typography>\n ),\n onClick: () => setTheme(Mode.AUTO as Theme),\n start: <AutoThemeIcon color=\"gray\" />,\n end: <Radio value={Mode.AUTO} />,\n },\n ];\n\n return (\n <Layout\n header={{\n onBack: navigateBackFrom.bind(null, navigationRoutes.settings),\n title: i18n.t('Theme'),\n }}>\n <SettingsContainer>\n <RadioRoot\n onValueChange={(value) => setTheme(value as Theme)}\n value={theme}>\n <List\n type={\n <ListItemButton\n title=\"Theme\"\n id=\"_\"\n onClick={() => console.log()}\n />\n }\n items={themesList}\n />\n </RadioRoot>\n </SettingsContainer>\n </Layout>\n );\n}\n", "import {\n isApprovalTX,\n MainEvents,\n RouteEventType,\n StepEventType,\n StepExecutionEventStatus,\n useEvents,\n} from '@rango-dev/queue-manager-rango-preset';\nimport { useEffect } from 'react';\n\nimport { useNotificationStore } from '../store/notification';\nimport { useWalletsStore } from '../store/wallets';\nimport { validBlockedStatuses } from '../types/notification';\n\nexport function WidgetEvents() {\n const connectedWallets = useWalletsStore.use.connectedWallets();\n const getWalletsDetails = useWalletsStore.use.getWalletsDetails();\n const setNotification = useNotificationStore.use.setNotification();\n const setAsRead = useNotificationStore.use.setAsRead();\n const widgetEvents = useEvents();\n\n useEffect(() => {\n widgetEvents.on(MainEvents.StepEvent, (widgetEvent) => {\n const { event, step, route } = widgetEvent;\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 fromAccount = connectedWallets.find(\n (account) => account.chain === step?.fromBlockchain\n );\n const toAccount =\n step?.fromBlockchain !== step?.toBlockchain &&\n connectedWallets.find(\n (wallet) => wallet.chain === step?.toBlockchain\n );\n\n fromAccount && getWalletsDetails([fromAccount]);\n toAccount && getWalletsDetails([toAccount]);\n }\n if (\n (event.type === StepEventType.TX_EXECUTION_BLOCKED &&\n validBlockedStatuses.includes(event.status)) ||\n event.type === StepEventType.FAILED\n ) {\n setNotification(event, route);\n } else if (\n event.type === StepEventType.TX_EXECUTION ||\n event.type === StepEventType.CHECK_STATUS\n ) {\n setAsRead(route.requestId);\n }\n });\n\n return () => widgetEvents.all.clear();\n }, [widgetEvents, connectedWallets.length]);\n\n useEffect(() => {\n widgetEvents.on(MainEvents.RouteEvent, (widgetEvent) => {\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\n return () => widgetEvents.all.clear();\n }, [widgetEvents, connectedWallets.length]);\n\n return null;\n}\n", "import {\n type Route,\n type RouteEvent,\n type Step,\n type StepEvent,\n StepExecutionBlockedEventStatus,\n} from '@rango-dev/queue-manager-rango-preset';\n\ntype NotificationRoute = {\n from: {\n blockchain: Step['fromBlockchain'];\n tokenSymbol: Step['fromSymbol'];\n tokenAddress: Step['fromSymbolAddress'];\n };\n to: {\n blockchain: Step['toBlockchain'];\n tokenSymbol: Step['toSymbol'];\n tokenAddress: Step['toSymbolAddress'];\n };\n};\n\nexport type Notification = Pick<Route, 'requestId'> & {\n event: RouteEvent | StepEvent;\n creationTime: number;\n read: boolean;\n route: NotificationRoute;\n};\n\nexport const validBlockedStatuses: StepExecutionBlockedEventStatus[] = [\n StepExecutionBlockedEventStatus.WAITING_FOR_CHANGE_WALLET_ACCOUNT,\n StepExecutionBlockedEventStatus.WAITING_FOR_NETWORK_CHANGE,\n StepExecutionBlockedEventStatus.WAITING_FOR_WALLET_CONNECT,\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 \"url('https://fonts.cdnfonts.com/css/times-new-roman')\",\n ],\n })();\n", "import type { WidgetTheme } from '../types';\n\nimport { createTheme, darkTheme, lightTheme } from '@rango-dev/ui';\nimport { useEffect, useState } from 'react';\n\nimport { useMetaStore } from '../store/meta';\nimport { useSettingsStore } from '../store/settings';\nimport {\n DEFAULT_PRIMARY_RADIUS,\n DEFAULT_SECONDARY_RADIUS,\n} from '../utils/configs';\n\nexport function useTheme({\n // colors,\n fontFamily = 'Roboto',\n borderRadius = DEFAULT_PRIMARY_RADIUS,\n secondaryBorderRadius = DEFAULT_SECONDARY_RADIUS,\n mode = 'auto',\n}: WidgetTheme) {\n const theme = useSettingsStore.use.theme();\n const fetchMeta = useMetaStore.use.fetchMeta();\n const setTheme = useSettingsStore.use.setTheme();\n\n const customTheme = createTheme({\n radii: {\n primary: `${borderRadius}px`,\n secondary: `${secondaryBorderRadius}px`,\n },\n fonts: {\n widget: fontFamily,\n },\n });\n\n const lightClassName = `${customTheme.className} ${lightTheme.className}`;\n const darkClassName = `${customTheme.className} ${darkTheme.className}`;\n\n const [OSTheme, setOSTheme] = useState('light');\n\n useEffect(() => {\n const fetchData = async () => {\n await fetchMeta();\n };\n void fetchData();\n\n const switchTheme = (event: MediaQueryListEvent) => {\n if (event.matches) {\n setOSTheme('dark');\n } else {\n setOSTheme('light');\n }\n };\n\n if (\n window.matchMedia &&\n window.matchMedia('(prefers-color-scheme: dark)').matches\n ) {\n setOSTheme('dark');\n }\n\n window\n .matchMedia('(prefers-color-scheme: dark)')\n .addEventListener('change', switchTheme);\n return () => {\n window\n .matchMedia('(prefers-color-scheme: dark)')\n .removeEventListener('change', switchTheme);\n };\n }, []);\n useEffect(() => {\n if (mode !== 'auto') {\n setTheme(mode);\n }\n }, [mode]);\n\n const getActiveTheme = () => {\n if (theme === 'auto') {\n return OSTheme === 'dark' ? darkClassName : lightClassName;\n }\n return theme === 'dark' ? darkClassName : lightClassName;\n };\n\n return { activeTheme: getActiveTheme() };\n}\n", "import React, { PropsWithChildren, useMemo } from 'react';\nimport { Provider as ManagerProvider } from '@rango-dev/queue-manager-react';\nimport {\n makeQueueDefinition,\n SwapQueueContext,\n checkWaitingForNetworkChange,\n} from '@rango-dev/queue-manager-rango-preset';\nimport { useWallets } from '@rango-dev/wallets-react';\nimport {\n convertEvmBlockchainMetaToEvmChainInfo,\n Network,\n WalletType,\n} from '@rango-dev/wallets-shared';\nimport { useMetaStore } from './store/meta';\nimport { useWalletsStore } from './store/wallets';\nimport { walletAndSupportedChainsNames } from './utils/wallets';\nimport { getConfig } from './utils/configs';\nimport { isEvmBlockchain } from 'rango-types';\n\nfunction QueueManager(props: PropsWithChildren) {\n const {\n providers,\n getSigners,\n state,\n connect,\n canSwitchNetworkTo,\n getWalletInfo,\n } = useWallets();\n\n const swapQueueDef = useMemo(() => {\n return makeQueueDefinition({\n API_KEY: getConfig('API_KEY'),\n });\n }, []);\n\n const { blockchains } = useMetaStore.use.meta();\n const connectedWallets = useWalletsStore.use.connectedWallets();\n\n const wallets = {\n blockchains: connectedWallets.map((wallet) => ({\n accounts: [wallet],\n name: wallet.chain,\n })),\n };\n\n const switchNetwork = (wallet: WalletType, network: Network) => {\n if (!canSwitchNetworkTo(wallet, network)) {\n return undefined;\n }\n return connect(wallet, network);\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 = blockchains\n .filter((blockchain) => blockchain.enabled)\n .reduce(\n (blockchainsObj: any, blockchain) => (\n (blockchainsObj[blockchain.name] = blockchain), blockchainsObj\n ),\n {}\n );\n const evmBasedChains = blockchains.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 //todo: remove Network type\n // eslint-disable-next-line @typescript-eslint/ban-ts-comment\n //@ts-ignore\n wallets,\n providers: allProviders,\n switchNetwork,\n canSwitchNetworkTo,\n connect,\n state,\n isMobileWallet,\n };\n\n return (\n <ManagerProvider\n queuesDefs={[swapQueueDef]}\n context={context}\n onPersistedDataLoaded={(manager) => {\n checkWaitingForNetworkChange(manager);\n }}\n isPaused={false}>\n {props.children}\n </ManagerProvider>\n );\n}\n\nexport default QueueManager;\n", "import type { WidgetConfig } from './types';\nimport type { ProvidersOptions } from './utils/providers';\nimport type { EventHandler } from '@rango-dev/wallets-react';\nimport type { Network } from '@rango-dev/wallets-shared';\nimport type { PropsWithChildren } from 'react';\n\nimport { Events, Provider } from '@rango-dev/wallets-react';\nimport { isEvmBlockchain } from 'rango-sdk';\nimport React, { createContext, useRef } from 'react';\n\nimport { useWalletProviders } from './hooks/useWalletProviders';\nimport { useMetaStore } from './store/meta';\nimport { useWalletsStore } from './store/wallets';\nimport {\n prepareAccountsForWalletStore,\n walletAndSupportedChainsNames,\n} from './utils/wallets';\n\ntype OnConnectHandler = (key: string) => void;\ninterface WidgetContextInterface {\n onConnectWallet(handler: OnConnectHandler): void;\n}\n\nexport const WidgetContext = createContext<WidgetContextInterface>({\n onConnectWallet: () => {\n return;\n },\n});\n\nexport function WidgetWallets(\n props: PropsWithChildren<{\n providers: WidgetConfig['wallets'];\n options?: ProvidersOptions;\n onUpdateState?: EventHandler;\n }>\n) {\n const { blockchains } = useMetaStore.use.meta();\n const { providers } = useWalletProviders(props.providers, props?.options);\n const disconnectWallet = useWalletsStore.use.disconnectWallet();\n const connectWallet = useWalletsStore.use.connectWallet();\n const onConnectWalletHandler = useRef<OnConnectHandler>();\n\n const evmBasedChainNames = blockchains\n .filter(isEvmBlockchain)\n .map((chain) => chain.name);\n\n const onUpdateState: EventHandler = (\n type,\n event,\n value,\n state,\n supportedBlockchains\n ) => {\n if (event === Events.ACCOUNTS) {\n if (value) {\n const supportedChainNames: Network[] | null =\n walletAndSupportedChainsNames(supportedBlockchains);\n const data = prepareAccountsForWalletStore(\n type,\n value,\n evmBasedChainNames,\n supportedChainNames\n );\n connectWallet(data);\n } else {\n disconnectWallet(type);\n }\n }\n if (event === Events.ACCOUNTS && state.connected) {\n const key = `${type}-${state.network}-${value}`;\n\n if (state.connected) {\n if (!!onConnectWalletHandler.current) {\n onConnectWalletHandler.current(key);\n } else {\n console.warn(\n `onConnectWallet handler hasn't been set. Are you sure?`\n );\n }\n }\n }\n\n if (event === Events.NETWORK && state.network) {\n const key = `${type}-${state.network}`;\n if (!!onConnectWalletHandler.current) {\n onConnectWalletHandler.current(key);\n } else {\n console.warn(`onConnectWallet handler hasn't been set. Are you sure?`);\n }\n }\n\n // propagate updates for Dapps using external wallets\n if (props.onUpdateState) {\n props.onUpdateState(type, event, value, state, supportedBlockchains);\n }\n };\n return (\n <WidgetContext.Provider\n // eslint-disable-next-line react/jsx-no-constructed-context-values\n value={{\n onConnectWallet: (handler) => {\n onConnectWalletHandler.current = handler;\n },\n }}>\n <Provider\n allBlockChains={blockchains}\n providers={providers}\n onUpdateState={onUpdateState}\n autoConnect>\n {props.children}\n </Provider>\n </WidgetContext.Provider>\n );\n}\n", "import { ProviderInterface } from '@rango-dev/wallets-react';\nimport { useEffect } from 'react';\nimport { useWalletsStore } from '../store/wallets';\nimport { WidgetConfig } from '../types';\nimport {\n matchAndGenerateProviders,\n ProvidersOptions,\n} from '../utils/providers';\n\nexport function useWalletProviders(\n providers: WidgetConfig['wallets'],\n options?: ProvidersOptions\n) {\n const clearConnectedWallet = useWalletsStore.use.clearConnectedWallet();\n let generateProviders: ProviderInterface[] = matchAndGenerateProviders(\n undefined,\n options\n );\n\n useEffect(() => {\n clearConnectedWallet();\n generateProviders = matchAndGenerateProviders(providers, {\n walletConnectProjectId: options?.walletConnectProjectId,\n });\n }, [providers]);\n\n return {\n providers: generateProviders,\n };\n}\n", "import {\n WidgetTheme,\n WidgetConfig,\n WidgetColors,\n BlockchainAndTokenConfig,\n} from './types';\nimport { WidgetProps, Widget } from './Widget';\nimport { WalletType } from '@rango-dev/wallets-shared';\nimport { WidgetWallets } from './Wallets';\nimport {\n useWallets,\n ProviderInterface,\n EventHandler as HandleWalletsUpdate,\n} from '@rango-dev/wallets-react';\nimport {\n useEvents as useWidgetEvents,\n MainEvents,\n RouteEvent,\n StepEvent,\n Route,\n Step,\n RouteStartedEvent,\n RouteSucceededEvent,\n RouteFailedEvent,\n RouteEventType,\n StepStartedEvent,\n StepSucceededEvent,\n StepFailedEvent,\n StepTxExecutionUpdatedEvent,\n StepTxExecutionBlockedEvent,\n StepCheckStatusEvent,\n StepApprovalTxSucceededEvent,\n StepOutputRevealedEvent,\n StepEventType,\n StepExecutionEventStatus,\n StepExecutionBlockedEventStatus,\n} from '@rango-dev/queue-manager-rango-preset';\n\nexport type {\n WidgetConfig,\n WalletType,\n WidgetTheme,\n WidgetColors,\n ProviderInterface,\n BlockchainAndTokenConfig,\n WidgetProps,\n RouteEvent,\n StepEvent,\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};\nexport {\n Widget,\n WidgetWallets,\n useWallets,\n useWidgetEvents,\n MainEvents,\n RouteEventType,\n StepEventType,\n StepExecutionEventStatus,\n StepExecutionBlockedEventStatus,\n};\n"],
5
+ "mappings": "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",
6
+ "names": ["I18nManager", "styled", "React", "useContext", "useEffect", "useMemo", "useState", "useQueueManager", "useWallets", "isEvmBlockchain", "React", "useEffect", "useRef", "MemoryRouter", "useInRouterContext", "useLocation", "useNavigate", "navigationRoutes", "i18n", "Alert", "BestRoute", "BestRouteSkeleton", "Button", "Divider", "styled", "SwapInput", "Typography", "WarningIcon", "React", "useEffect", "useRef", "useState", "useNavigate", "ChevronLeftIcon", "React", "darkTheme", "IconButton", "styled", "HeaderButton", "ConnectedIcon", "SuffixContainer", "NotificationsBadgeContainer", "BackButton", "props", "React", "HeaderButton", "ChevronLeftIcon", "__name", "i18n", "Button", "Typography", "React", "CancelButton", "props", "React", "SuffixContainer", "Button", "Typography", "i18n", "__name", "i18n", "Tooltip", "WalletIcon", "React", "WalletButton", "props", "React", "Tooltip", "i18n", "HeaderButton", "ConnectedIcon", "WalletIcon", "__name", "i18n", "NotificationsIcon", "Popover", "RefreshIcon", "SettingsIcon", "Tooltip", "TransactionIcon", "React", "removeDuplicateFrom", "array", "__name", "areEqual", "array1", "array2", "v", "i", "debounce", "fn", "time", "timeoutId", "wrapper", "args", "containsText", "text", "searchText", "colorShade", "col", "amt", "r", "g", "b", "rr", "gg", "bb", "generateRangeColors", "name", "color", "colors", "getContainer", "ChainToken", "ChevronRightIcon", "ListItemButton", "Typography", "React", "useNavigate", "create", "RangoClient", "RANGO_PUBLIC_API_KEY", "configs", "getConfig", "name", "__name", "initConfig", "nextConfigs", "clonedConfigs", "configs", "__name", "DEFAULT_PRIMARY_RADIUS", "DEFAULT_SECONDARY_RADIUS", "rango", "httpService", "__name", "RangoClient", "getConfig", "WalletStatus", "readAccountAddress", "detectInstallLink", "getCosmosExperimentalChainInfo", "isEvmAddress", "KEPLR_COMPATIBLE_WALLETS", "Networks", "BigNumber", "isCosmosBlockchain", "BigNumber", "ZERO", "WalletTypes", "EXCLUDED_WALLETS", "BigNumber", "secondsToString", "__name", "s", "seconds", "numberToString", "number", "minDecimals", "maxDecimals", "BigNumber", "roundingMode", "maxI", "i", "totalArrivalTime", "__name", "data", "a", "b", "containsText", "__name", "text", "searchText", "isPositiveNumber", "limitDecimalPlaces", "numberString", "maxDecimalPlaces", "number", "multiplier", "mapStatusToWalletState", "state", "WalletStatus", "__name", "mapWalletTypesToWalletInfo", "getState", "getWalletInfo", "list", "chain", "wallet", "EXCLUDED_WALLETS", "supportedChains", "supportedChain", "type", "name", "image", "installLink", "detectInstallLink", "walletAndSupportedChainsNames", "supportedBlockchains", "blockchainMeta", "prepareAccountsForWalletStore", "accounts", "evmBasedChains", "supportedChainNames", "result", "addAccount", "network", "address", "account", "newAccount", "readAccountAddress", "hasLimitation", "isSupported", "isUnknown", "Networks", "isUnknownAndEvmBased", "isEvmAddress", "getRequiredChains", "route", "wallets", "swap", "currentStepFromBlockchain", "currentStepToBlockchain", "internalSwap", "internalStepFromBlockchain", "internalStepToBlockchain", "getBalanceFromWallet", "connectedWallets", "chain", "symbol", "address", "selectedChainWallets", "wallet", "balance", "a", "b", "__name", "isAccountAndWalletMatched", "account", "connectedWallet", "makeBalanceFor", "retrievedBalance", "tokens", "balances", "tokenBalance", "BigNumber", "getUsdPrice", "resetConnectedWalletState", "sortTokens", "__name", "tokens", "token", "tokenA", "tokenB", "getUsdPrice", "blockchain", "symbol", "address", "allTokens", "t", "isExperimentalChain", "blockchains", "wallet", "cosmosExperimentalChainInfo", "getCosmosExperimentalChainInfo", "blockchainMeta", "isCosmosBlockchain", "getTokensWithBalance", "tokens", "connectedWallets", "balance", "otherProps", "tokenAmount", "numberToString", "BigNumber", "getBalanceFromWallet", "ZERO", "tokenUsdValue", "__name", "getSortedTokens", "chain", "otherChainTokens", "filteredTokens", "token", "sortTokens", "tokensAreEqual", "tokenA", "tokenB", "getDefaultToken", "sortedTokens", "otherToken", "selectedToken", "firstToken", "secondToken", "sortWalletsBasedOnConnectionState", "wallets", "a", "b", "WalletStatus", "getConciseAddress", "address", "maxChars", "ellipsisLength", "start", "end", "getAddress", "walletType", "connectedWallet", "createSelectors", "__name", "_store", "store", "k", "s", "selectors_default", "create", "subscribeWithSelector", "shallow", "BigNumber", "create", "subscribeWithSelector", "BigNumber", "searchParamsToToken", "tokens", "searchParams", "chain", "token", "symbolAndAddress", "__name", "getBestRouteToTokenUsdPrice", "bestRoute", "isNumberOfSwapsChanged", "route1", "route2", "route1Swaps", "route2Swaps", "isRouteSwappersUpdated", "route1Swappers", "swap", "route2Swappers", "areEqual", "isRouteInternalCoinsUpdated", "route1InternalCoins", "route2InternalCoins", "isRouteChanged", "getRequiredBalanceOfWallet", "selectedWallet", "fee", "relatedFeeStatus", "item", "wallet", "__name", "getFormattedBestRoute", "bestRoute", "formattedSwaps", "swap", "numberToString", "__name", "getPriceImpactLevel", "priceImpact", "warningLevel", "__name", "findCommonTokens", "listA", "listB", "tokenToString", "token", "set", "PendingSwapNetworkStatus", "BigNumber", "formatBestRoute", "bestRoute", "swap", "numberToString", "__name", "getRequiredWallets", "route", "wallets", "currentStepFromBlockchain", "currentStepToBlockchain", "lastAddedWallet", "isValidAddress", "chain", "address", "i18n", "RouteWarningType", "errorMessages", "i18n", "getConfirmSwapErrorMessage", "error", "__name", "i18n", "swapButtonTitles", "getOutputRatio", "inputUsdValue", "outputUsdValue", "ZERO", "__name", "outputRatioHasWarning", "outputRatio", "BigNumber", "hasLimitError", "bestRoute", "swap", "minimum", "maximum", "LimitErrorMessage", "isExclusive", "fromAmountRangeError", "recommendation", "numberToString", "errorMessages", "getSwapButtonState", "loadingMetaStatus", "connectedWallets", "loading", "highValueLoss", "priceImpactCanNotBeComputed", "needsToWarnEthOnPath", "inputAmount", "swapButtonTitles", "canComputePriceImpact", "usdValue", "requiredWallets", "route", "wallets", "currentStepFromBlockchain", "currentStepToBlockchain", "lastAddedWallet", "getUsdPrice", "blockchain", "symbol", "address", "allTokens", "t", "getUsdFeeOfStep", "step", "totalFeeInUsd", "i", "fee", "unitPrice", "getTotalFeeInUsd", "totalFee", "getMinRequiredSlippage", "route", "slippage", "s", "a", "b", "__name", "hasProperSlippage", "userSlippage", "minRequiredSlippage", "createBestRouteRequestBody", "params", "fromToken", "toToken", "inputAmount", "wallets", "selectedWallets", "disabledLiquiditySources", "slippage", "affiliateRef", "affiliatePercent", "affiliateWallets", "initialRoute", "destination", "selectedWalletsMap", "selectedWallet", "connectedWallets", "wallet", "chainAndAccounts", "connectedWallet", "checkPrerequisites", "filteredBlockchains", "removeDuplicateFrom", "blockchains", "swap", "internalSwap", "__name", "getWalletsForNewSwap", "getRouteOutputAmount", "route", "getPercentageChange", "inputUsdValue", "outputUsdValue", "BigNumber", "isOutputAmountChangedALot", "oldRoute", "newRoute", "oldOutputAmount", "newOutputAmount", "percentageChange", "getBalanceWarnings", "fee", "requiredWallets", "getRequiredChains", "selectedWallet1", "selectedWallet2", "getRequiredBalanceOfWallet", "asset", "symbol", "currentAmount", "numberToString", "requiredAmount", "reason", "calcOutputUsdValue", "outputAmount", "tokenPrice", "ZERO", "isNetworkStatusInWarningState", "pendingSwapStep", "PendingSwapNetworkStatus", "getSwapMessages", "pendingSwap", "currentStep", "textForRemove", "message", "detailedMessage", "isRpc", "getLastConvertedTokenInFailedSwap", "resultToken", "lastSuccessStep", "step", "shouldRetrySwap", "confirmSwapDisabled", "fetching", "showCustomDestination", "customDestination", "bestRoute", "selectedWallets", "lastStepToBlockchain", "requiredWallets", "chain", "wallet", "isValidAddress", "__name", "getUsdValue", "__name", "token", "amount", "BigNumber", "ZERO", "useBestRouteStore", "selectors_default", "create", "subscribeWithSelector", "set", "bestRoute", "state", "outputAmount", "outputUsdValue", "isPositiveNumber", "calcOutputUsdValue", "getBestRouteToTokenUsdPrice", "chain", "setDefaultToken", "tokens", "useMetaStore", "connectedWallets", "useWalletsStore", "sortedTokens", "getSortedTokens", "fromToken", "getDefaultToken", "pendingSwap", "blockchains", "failedIndex", "s", "firstStep", "lastStep", "fromBlockchain", "blockchain", "toBlockchain", "tokensAreEqual", "toToken", "sortedSourceTokens", "sortedDestinationTokens", "inputAmount", "flag", "wallets", "address", "useWalletsStore", "selectors_default", "create", "subscribeWithSelector", "set", "get", "accounts", "getWalletsDetails", "state", "wallet", "account", "shouldMarkWalletAsSelected", "connectedWallet", "walletType", "selectedWallets", "selectedWallet", "wallets", "walletSelected", "walletNotSelected", "shouldRetry", "tokens", "useMetaStore", "isAccountAndWalletMatched", "data", "address", "chain", "retrievedBalance", "httpService", "matchedAccount", "retrievedBalanceAccount", "balance", "makeBalanceFor", "resetConnectedWalletState", "connectedWallets", "useBestRouteStore", "sourceTokens", "destinationTokens", "sourceTokensWithBalance", "getTokensWithBalance", "destinationTokensWithBalance", "sortTokens", "shallow", "useMetaStore", "selectors_default", "create", "set", "connectedWallets", "useWalletsStore", "state", "sortTokens", "getTokensWithBalance", "response", "httpService", "chainThatHasTokenInMetaResponse", "removeDuplicateFrom", "t", "enabledChains", "chain", "a", "b", "create", "persist", "subscribeWithSelector", "useNotificationStore", "selectors_default", "create", "persist", "subscribeWithSelector", "set", "get", "event", "route", "fromStep", "toStep", "notification", "excludedList", "notificationItem", "requestId", "state", "create", "useUiStore", "selectors_default", "create", "set", "requestId", "path", "styled", "Container", "List", "Images", "NotFoundContainer", "i18n", "Divider", "NoNotificationIcon", "Typography", "React", "NotificationNotFound", "React", "NotFoundContainer", "NoNotificationIcon", "Divider", "Typography", "i18n", "__name", "MAX_NOTIFICATIONS_DISPLAYED", "NotificationContent", "navigate", "useNavigate", "setSelectedSwap", "useUiStore", "getUnreadNotifications", "useNotificationStore", "notifications", "tokens", "blockchains", "useMetaStore", "sortedNotification", "a", "b", "handleOnClick", "__name", "requestId", "React", "Container", "List", "notificationItem", "fromToken", "tokenItem", "fromBlockchain", "blockchainItem", "toToken", "toBlockchain", "ListItemButton", "Typography", "Images", "ChainToken", "ChevronRightIcon", "NotificationNotFound", "Typography", "React", "UnreadNotificationsBadge", "getUnreadNotifications", "useNotificationStore", "notificationsCount", "React", "NotificationsBadgeContainer", "Typography", "__name", "HomeButtons", "props", "layoutRef", "onClickRefresh", "onClickHistory", "onClickSettings", "onClickNotifications", "React", "Tooltip", "getContainer", "i18n", "HeaderButton", "RefreshIcon", "Popover", "NotificationContent", "NotificationsIcon", "UnreadNotificationsBadge", "SettingsIcon", "TransactionIcon", "__name", "BottomLogo", "Divider", "Header", "React", "useNavigate", "styled", "Container", "Content", "Footer", "LayoutComponent", "props", "ref", "children", "header", "footer", "noPadding", "hasLogo", "fixedHeight", "connectedWallets", "useWalletsStore", "connectWalletsButtonDisabled", "useUiStore", "navigate", "useNavigate", "onConnectWallet", "__name", "navigationRoutes", "React", "Container", "Header", "BackButton", "WalletButton", "getContainer", "CancelButton", "Content", "Footer", "Divider", "BottomLogo", "Layout", "Alert", "Button", "Divider", "NoRouteIcon", "RefreshIcon", "Typography", "React", "create", "persist", "subscribeWithSelector", "SLIPPAGES", "DEFAULT_SLIPPAGE", "HIGH_SLIPPAGE", "MAX_SLIPPAGE", "MIN_SLIPPGAE", "useSettingsStore", "selectors_default", "create", "persist", "subscribeWithSelector", "set", "DEFAULT_SLIPPAGE", "slippage", "customSlippage", "affiliateRef", "affiliatePercent", "affiliateWallets", "shouldReset", "state", "swappers", "useMetaStore", "swappersGroup", "removeDuplicateFrom", "swapper", "name", "liquiditySource", "theme", "makeInfo", "diagnosisMessage", "disabledLiquiditySources", "hasError", "toggleAllLiquiditySources", "refetchBestRoute", "errorMessages", "__name", "styled", "Container", "Footer", "PrefixIcon", "NoRoutes", "props", "diagnosisMessage", "fetch", "error", "disabledLiquiditySources", "useSettingsStore", "loadingMetaStatus", "useMetaStore", "toggleAllLiquiditySources", "info", "makeInfo", "React", "Container", "NoRouteIcon", "Divider", "Typography", "errorMessages", "Footer", "Alert", "Button", "PrefixIcon", "RefreshIcon", "__name", "Alert", "Divider", "InfoIcon", "React", "styled", "Alerts", "Flex", "Item", "Action", "Button", "Divider", "MessageBox", "Modal", "Typography", "WarningIcon", "React", "useNavigate", "Typography", "React", "RouteErrorsModalItem", "props", "title", "value", "valueColor", "React", "Item", "Typography", "__name", "RouteErrorsModal", "props", "highValueLoss", "open", "onToggle", "percentageChange", "inputUsdValue", "outputUsdValue", "totalFeeInUsd", "navigate", "useNavigate", "type", "highValueLossData", "numberToString", "React", "Modal", "MessageBox", "errorMessages", "Flex", "Divider", "Typography", "item", "index", "RouteErrorsModalItem", "Button", "WarningIcon", "navigationRoutes", "__name", "WARNING_LEVEL_LIMIT", "RouteErrors", "props", "bestRoute", "useBestRouteStore", "highValueLoss", "percentageChange", "priceImpactCanNotBeComputed", "openModal", "onToggle", "totalFeeInUsd", "outputUsdValue", "inputUsdValue", "loading", "extraSpace", "error", "hasLimitError", "recommendation", "LimitErrorMessage", "showWarnings", "showAlerts", "React", "Divider", "Alerts", "Alert", "errorMessages", "Action", "InfoIcon", "RouteErrorsModal", "__name", "ReverseIcon", "styled", "React", "SwitchButtonContainer", "styled", "StyledButton", "SwitchFromAndToButton", "switchFromAndTo", "useBestRouteStore", "React", "ReverseIcon", "__name", "useEffect", "useRef", "useState", "useRef", "useState", "useFetchBestRoute", "loading", "setLoading", "useState", "abortController", "useRef", "cancel", "__name", "requestBody", "res", "httpService", "error", "DEBOUNCE_DELAY", "useSwapInput", "fetchBestRoute", "cancelFetch", "useFetchBestRoute", "loading", "setLoading", "useState", "fromToken", "toToken", "inputAmount", "inputUsdValue", "resetRoute", "setRoute", "useBestRouteStore", "slippage", "customSlippage", "affiliatePercent", "affiliateRef", "affiliateWallets", "disabledLiquiditySources", "useSettingsStore", "error", "setError", "prevDisabledLiquiditySources", "useRef", "userSlippage", "shouldSkipRequest", "tokensAreEqual", "isPositiveNumber", "fetch", "__name", "requestBody", "createBestRouteRequestBody", "res", "debouncedFetch", "debounce", "useEffect", "disabledLiquiditySourceReset", "Container", "styled", "FromContainer", "InputsContainer", "BestRouteContainer", "FooterStepAlarm", "FooterAlert", "Home", "navigate", "useNavigate", "refetchBestRoute", "fetchingBestRoute", "bestRouteError", "useSwapInput", "fromToken", "fromBlockchain", "toToken", "toBlockchain", "setInputAmount", "inputAmount", "inputUsdValue", "outputAmount", "outputUsdValue", "bestRoute", "resetRouteWallets", "useBestRouteStore", "tokens", "loadingMetaStatus", "useMetaStore", "connectedWallets", "useWalletsStore", "setCurrentPage", "useUiStore", "openWarningModal", "setOpenWarningModal", "useState", "fromAmountRangeError", "swapHasError", "recommendation", "LimitErrorMessage", "layoutRef", "useRef", "showBestRoute", "needsToWarnEthOnPath", "outToInRatio", "getOutputRatio", "highValueLoss", "outputRatioHasWarning", "priceImpactInputCanNotBeComputed", "canComputePriceImpact", "priceImpactOutputCanNotBeComputed", "swapButtonState", "getSwapButtonState", "hasLimitError", "tokenBalance", "numberToString", "getBalanceFromWallet", "tokenBalanceReal", "useEffect", "navigationRoutes", "percentageChange", "getPercentageChange", "getBestRouteSteps", "__name", "swaps", "swap", "index", "React", "Alert", "Typography", "Divider", "totalFeeInUsd", "getTotalFeeInUsd", "bestRouteData", "getFormattedBestRoute", "Layout", "Button", "WarningIcon", "i18n", "HomeButtons", "SwapInput", "errorMessages", "SwitchFromAndToButton", "getPriceImpactLevel", "BestRouteSkeleton", "BestRoute", "secondsToString", "totalArrivalTime", "NoRoutes", "RouteErrors", "useEffect", "useRef", "createSearchParams", "useLocation", "useSearchParams", "UpdateUrl", "firstRender", "useRef", "searchParams", "setSearchParams", "useSearchParams", "location", "useLocation", "firstRenderSearchParams", "searchParamsRef", "fromBlockchain", "useBestRouteStore", "toBlockchain", "fromToken", "toToken", "setFromBlockchain", "setFromToken", "setToBlockchain", "setToToken", "inputAmount", "setInputAmount", "loadingStatus", "useMetaStore", "blockchains", "tokens", "setSelectedSwap", "useUiStore", "useEffect", "params", "createSearchParams", "value", "key", "requestId", "navigationRoutes", "fromChainString", "fromTokenString", "toChainString", "toTokenString", "fromAmount", "blockchain", "searchParamsToToken", "__name", "Route", "props", "location", "useLocation", "navigate", "useNavigate", "ref", "useRef", "useEffect", "navigationRoutes", "React", "Home", "__name", "AppRouter", "children", "isRouterInContext", "useInRouterContext", "Router", "MemoryRouter", "blockchains", "useMetaStore", "canSwitchNetworkTo", "useWallets", "evmChains", "isEvmBlockchain", "useQueueManager", "UpdateUrl", "React", "useRoutes", "i18n", "useManager", "Alert", "BestRoute", "BestRouteSkeleton", "Button", "Divider", "IconButton", "MessageBox", "Modal", "RefreshIcon", "SettingsIcon", "styled", "Tooltip", "Typography", "WalletIcon", "React", "useEffect", "useState", "flushSync", "useNavigate", "Alert", "BalanceErrors", "Button", "ChevronDownIcon", "ChevronLeftIcon", "Divider", "MessageBox", "Modal", "Typography", "WalletIcon", "React", "useEffect", "useState", "useNavigate", "i18n", "getRouteWarningMessage", "warning", "i18n", "__name", "Collapsible", "Button", "darkTheme", "IconButton", "keyframes", "styled", "TextField", "slideDown", "slideUp", "Title", "ListContainer", "WalletButton", "Trigger", "ShowMoreHeader", "NavigateBack", "WalletsContainer", "CollapsibleRoot", "CustomDestinationButton", "CustomDestination", "ExpandedIcon", "ConfirmButton", "StyledTextField", "CollapsibleContent", "Wallets", "Button", "Divider", "Image", "MessageBox", "Modal", "SelectableWallet", "Typography", "WalletState", "React", "useEffect", "useState", "WalletState", "useWallets", "KEPLR_COMPATIBLE_WALLETS", "WalletTypes", "useEffect", "useState", "allProviders", "matchAndGenerateProviders", "providers", "options", "all", "allProviders", "selectedProviders", "requestedProvider", "result", "provider", "__name", "configWalletsToWalletName", "config", "ALL_SUPPORTED_WALLETS", "WalletTypes", "useWalletList", "params", "config", "chain", "onBeforeConnect", "onConnect", "state", "disconnect", "getWalletInfo", "connect", "useWallets", "connectedWallets", "useWalletsStore", "blockchains", "useMetaStore", "multiWallets", "listAvailableWalletTypes", "configWalletsToWalletName", "wallets", "mapWalletTypesToWalletInfo", "sortedWallets", "sortWalletsBasedOnConnectionState", "error", "setError", "useState", "isExperimentalChainNotAdded", "__name", "walletType", "connectedWallet", "handleClick", "type", "wallet", "atLeastOneWalletIsConnected", "w", "WalletState", "e", "disconnectConnectingWallets", "connectingWallets", "useEffect", "shouldExcludeWallet", "isExperimentalChain", "KEPLR_COMPATIBLE_WALLETS", "i18n", "styled", "Typography", "Wallet", "WalletState", "React", "Fragment", "useState", "Divider", "Modal", "React", "i18n", "Image", "MessageBox", "WalletState", "React", "keyframes", "styled", "IconContainer", "LogoContainer", "spin", "Spinner", "WalletImageContainer", "ModalContent", "props", "state", "image", "error", "WalletState", "React", "MessageBox", "i18n", "LogoContainer", "WalletImageContainer", "Image", "Spinner", "__name", "WalletModal", "props", "open", "onClose", "otherProps", "React", "Modal", "ModalContent", "Divider", "__name", "useInRouterContext", "useNavigate", "useNavigateBack", "isRouterInContext", "useInRouterContext", "navigate", "useNavigate", "routeWalletsConfirmed", "useBestRouteStore", "navigationRoutes", "__name", "currentRoute", "ListContainer", "styled", "Container", "TIME_TO_CLOSE_MODAL", "TIME_TO_IGNORE_MODAL", "WalletsPage", "config", "navigateBackFrom", "useNavigateBack", "openModal", "setOpenModal", "useState", "modalTimerId", "list", "handleClick", "error", "useWalletList", "type", "loadingMetaStatus", "useMetaStore", "selectedWallet", "wallet", "selectedWalletImage", "selectedWalletState", "WalletState", "React", "Layout", "i18n", "navigationRoutes", "Typography", "index", "key", "Fragment", "Wallet", "getContainer", "WalletModal", "__name", "getBlockchainDisplayNameFor", "blockchainName", "blockchains", "blockchain", "__name", "keyframes", "styled", "LogoContainer", "SpinAnimation", "Spinner", "WalletImageContainer", "WalletList", "props", "config", "chain", "isSelected", "selectWallet", "limit", "onShowMore", "connectedWallets", "useWalletsStore", "blockchains", "useMetaStore", "openWalletStateModal", "setOpenWalletStateModal", "useState", "experimentalChainWallet", "setExperimentalChainWallet", "showExperimentalChainModal", "setShowExperimentalChainModal", "addingExperimentalChainStatus", "setAddingExperimentalChainStatus", "connect", "useWallets", "list", "error", "handleClick", "useWalletList", "TIME_TO_CLOSE_MODAL", "sortedList", "setSortedList", "numberOfSupportedWallets", "shouldShowMoreWallets", "addExperimentalChain", "__name", "wallet", "useEffect", "selectedWalletIndex", "_", "index", "sortedItem", "listItem", "modalContainer", "timeout", "React", "address", "getAddress", "conciseAddress", "getConciseAddress", "experimentalChain", "isExperimentalChain", "experimentalChainNotAdded", "connectedWallet", "couldAddExperimentalChain", "WalletState", "connectedWalletDescription", "onClick", "blockchainDisplayName", "getBlockchainDisplayNameFor", "WalletModal", "Modal", "MessageBox", "Divider", "Button", "LogoContainer", "WalletImageContainer", "Image", "Spinner", "SelectableWallet", "WalletButton", "Typography", "NUMBER_OF_WALLETS_TO_DISPLAY", "ConfirmWalletsModal", "props", "open", "onClose", "onCancel", "onCheckBalance", "config", "loading", "blockchains", "useMetaStore", "bestRoute", "selectRouteWallets", "routeWalletsConfirmed", "setRouteWalletConfirmed", "customDestination", "setCustomDestination", "useBestRouteStore", "connectedWallets", "selectWallets", "useWalletsStore", "showMoreWalletFor", "setShowMoreWalletFor", "useState", "balanceWarnings", "setBalanceWarnings", "error", "setError", "routeWarning", "setRouteWarning", "destination", "setDestination", "showCustomDestination", "setShowCustomDestination", "requiredWallets", "getRequiredWallets", "customDestinationEnabled", "lastStepToBlockchain", "blockchain", "isWalletRequiredFor", "__name", "swap", "selectableWallets", "setSelectableWallets", "connectedWallet", "lastStepToBlockchainMeta", "chain", "isSelected", "walletType", "selectableWallet", "isAddressMatched", "isValidAddress", "resetCustomDestination", "anyWalletSelected", "onChange", "wallet", "onConfirmBalance", "lastSelectedWallets", "onConfirmWallets", "selectedWallets", "result", "warnings", "getConfirmSwapErrorMessage", "useEffect", "modalContainer", "navigate", "useNavigate", "React", "Modal", "navigationRoutes", "ConfirmButton", "Button", "confirmSwapDisabled", "ShowMoreHeader", "NavigateBack", "ChevronLeftIcon", "Typography", "MessageBox", "BalanceErrors", "WalletsContainer", "WalletList", "Alert", "Divider", "getRouteWarningMessage", "Wallets", "requiredWallet", "index", "key", "isLastWallet", "Title", "ListContainer", "CustomDestination", "CollapsibleRoot", "checked", "Trigger", "prevState", "CustomDestinationButton", "ExpandedIcon", "ChevronDownIcon", "WalletIcon", "CollapsibleContent", "StyledTextField", "e", "calculatePendingSwap", "BigNumber", "useEffect", "throwErrorIfResponseIsNotValid", "response", "params", "errorMessages", "newRouteOutputUsdValue", "BigNumber", "outputRatio", "getOutputRatio", "outputRatioHasWarning", "__name", "generateWarnings", "previousRoute", "currentRoute", "routeChanged", "isRouteChanged", "output", "isOutputAmountChangedALot", "numberToString", "getRouteOutputAmount", "getPercentageChange", "isNumberOfSwapsChanged", "isRouteSwappersUpdated", "isRouteInternalCoinsUpdated", "balanceWarnings", "getBalanceWarnings", "minRequiredSlippage", "getMinRequiredSlippage", "highSlippage", "HIGH_SLIPPAGE", "hasProperSlippage", "useConfirmSwap", "fromToken", "toToken", "inputAmount", "inputUsdValue", "setRoute", "initialRoute", "customDestinationFromStore", "useBestRouteStore", "slippage", "customSlippage", "affiliatePercent", "affiliateRef", "affiliateWallets", "disabledLiquiditySources", "useSettingsStore", "connectedWallets", "useWalletsStore", "meta", "useMetaStore", "userSlippage", "fetchBestRoute", "cancelFetch", "loading", "useFetchBestRoute", "useEffect", "selectedWallets", "customDestination", "requestBody", "createBestRouteRequestBody", "error", "swapSettings", "swap", "calculatePendingSwap", "getWalletsForNewSwap", "Container", "styled", "Buttons", "IconButton", "ConfirmSwapPage", "props", "config", "bestRoute", "inputAmount", "outputAmount", "inputUsdValue", "outputUsdValue", "setInputAmount", "selectedWallets", "routeWalletsConfirmed", "setRouteWalletConfirmed", "customDestination", "useBestRouteStore", "navigate", "useNavigate", "dbErrorMessage", "setDbErrorMessage", "useState", "showSlippageWarning", "setShowSlippageWarning", "connectedWallets", "useWalletsStore", "showWalletsOnInit", "showWallets", "setShowWallets", "setSelectedSwap", "useUiStore", "tokens", "loadingMetaStatus", "useMetaStore", "slippage", "useSettingsStore", "customSlippage", "manager", "useManager", "selectedSlippage", "confirmSwap", "fetchingConfirmationRoute", "cancelFetch", "useConfirmSwap", "confirmSwapResult", "setConfirmSwapResult", "showSkeleton", "showNoRouteFound", "showBestRoute", "totalFeeInUsd", "getTotalFeeInUsd", "percentageChange", "numberToString", "getPercentageChange", "warningLevel", "getPriceImpactLevel", "onConfirmSwap", "__name", "result", "addNewSwap", "navigationRoutes", "e", "onConfirm", "onStartConfirmSwap", "onRefresh", "res", "error", "useEffect", "routeChanged", "RouteWarningType", "selectedWalletDisconnected", "selectedWallet", "connectedWallet", "routeWalletsChanged", "requiredWallets", "getRequiredWallets", "lastStepToBlockchain", "swap", "requiredWallet", "flushSync", "React", "Layout", "Tooltip", "getContainer", "i18n", "HeaderButton", "SettingsIcon", "Button", "WalletIcon", "Modal", "Typography", "prevState", "MessageBox", "Divider", "ConfirmWalletsModal", "RefreshIcon", "Alert", "getRouteWarningMessage", "BestRouteSkeleton", "BestRoute", "formatBestRoute", "secondsToString", "totalArrivalTime", "NoRoutes", "getConfirmSwapErrorMessage", "i18n", "useManager", "Divider", "NotFound", "styled", "React", "useState", "useNavigate", "CloseIcon", "IconButton", "SearchIcon", "TextField", "React", "styled", "IconWrapper", "SearchInput", "props", "variant", "fullWidth", "color", "size", "onChange", "value", "setValue", "inputAttributes", "React", "TextField", "IconWrapper", "SearchIcon", "IconButton", "CloseIcon", "__name", "Divider", "SwapListItem", "Typography", "React", "styled", "Group", "Time", "SwapList", "NotFoundContainer", "SwapsGroup", "props", "list", "onSwapClick", "groupBy", "isLoading", "groups", "swaps", "React", "group", "Group", "Time", "Typography", "Divider", "SwapList", "_", "index", "key", "SwapListItem", "swap", "firstStep", "lastStep", "limitDecimalPlaces", "__name", "dayjs", "groupSwapsByDate", "__name", "swaps", "output", "now", "dayjs", "swap", "swapDate", "getPendingSwaps", "__name", "manager", "result", "q", "id", "storage", "a", "b", "Container", "styled", "SwapsGroupContainer", "isStepContainsText", "__name", "steps", "value", "step", "containsText", "HistoryPage", "setSelectedSwap", "useUiStore", "navigate", "useNavigate", "navigateBackFrom", "useNavigateBack", "manager", "state", "useManager", "list", "getPendingSwaps", "swap", "searchedFor", "setSearchedFor", "useState", "loading", "searchHandler", "event", "filteredList", "isEmpty", "React", "Layout", "navigationRoutes", "i18n", "SearchInput", "NotFoundContainer", "Divider", "NotFound", "SwapsGroup", "requestId", "groupSwapsByDate", "i18n", "List", "ListItemButton", "Radio", "RadioRoot", "Typography", "React", "useState", "styled", "SettingsContainer", "LiquiditySourceList", "LiquiditySourceSuffix", "NotFoundContainer", "LanguagePage", "navigateBackFrom", "useNavigateBack", "language", "setLanguage", "useState", "languageList", "React", "Typography", "i18n", "Radio", "Layout", "navigationRoutes", "SettingsContainer", "RadioRoot", "List", "ListItemButton", "__name", "i18n", "Button", "Checkbox", "Image", "ListItemButton", "NotFound", "Typography", "React", "useState", "Checkbox", "Skeleton", "React", "ListItem", "styled", "CustomeListItem", "ITEM_SKELETON_COUNT", "LoadingLiquiditySourceList", "React", "LiquiditySourceList", "e", "CustomeListItem", "Skeleton", "Checkbox", "__name", "getUniqueSwappersGroups", "supportedSwappers", "swappers", "useMetaStore", "disabledLiquiditySources", "useSettingsStore", "uniqueSupportedSwappersGroups", "removeDuplicateFrom", "uniqueGroupItem", "swapperItem", "swapper", "isSupportedSwapper", "supportedItem", "swapperTypeItem", "__name", "LiquiditySourcePage", "supportedSwappers", "sourceType", "searchedFor", "setSearchedFor", "useState", "toggleLiquiditySource", "useSettingsStore", "navigateBackFrom", "useNavigateBack", "loadingMetaStatus", "useMetaStore", "supportedUniqueSwappersGroups", "getUniqueSwappersGroups", "validTypes", "liquiditySources", "uniqueItem", "hasSelectAll", "sourceItem", "toggleAllSources", "__name", "list", "selected", "groupTitle", "logo", "React", "Image", "Checkbox", "Typography", "i18n", "searchHandler", "event", "value", "filteredList", "containsText", "Layout", "navigationRoutes", "LiquiditySourceSuffix", "Button", "SettingsContainer", "SearchInput", "LoadingLiquiditySourceList", "NotFoundContainer", "NotFound", "LiquiditySourceList", "ListItemButton", "i18n", "Divider", "React", "useState", "i18n", "Divider", "Image", "ListItemButton", "NotFound", "Typography", "React", "useEffect", "useState", "TransactionType", "BlockchainCategories", "filterByType", "__name", "blockchain", "type", "TransactionType", "filterBlockchains", "list", "searchedFor", "blockchainType", "containsText", "styled", "Container", "List", "ListItem", "Skeleton", "React", "ITEM_SKELETON_COUNT", "LoadingBlockchainList", "React", "List", "e", "ListItem", "Skeleton", "__name", "BlockchainList", "props", "list", "searchedFor", "onChange", "blockchainCategory", "blockchains", "setBlockchains", "useState", "loadingStatus", "useMetaStore", "useEffect", "filterBlockchains", "renderList", "__name", "React", "Divider", "NotFound", "i18n", "List", "item", "ListItemButton", "Image", "Typography", "Container", "LoadingBlockchainList", "i18n", "Divider", "Image", "Skeleton", "Typography", "React", "React", "darkTheme", "styled", "Chip", "BlockchainsChip", "props", "children", "selected", "onClick", "React", "Chip", "__name", "blockchainslogo", "generateBlockchainsLogo", "__name", "list", "type", "item", "filterByType", "styled", "Container", "ImageContent", "FirstImage", "SelectableCategoryList", "props", "setCategory", "category", "blockchains", "useMetaStore", "loadingStatus", "categories", "BlockchainCategories", "React", "Container", "_", "index", "Skeleton", "blockchainCategory", "BlockchainsChip", "ImageContent", "generateBlockchainsLogo", "blockchain", "FirstImage", "Image", "Divider", "Typography", "i18n", "__name", "SelectBlockchainPage", "props", "type", "supportedBlockchains", "navigateBackFrom", "useNavigateBack", "searchedFor", "setSearchedFor", "useState", "blockchainCategory", "setBlockchainCategory", "setToBlockchain", "useBestRouteStore", "setFromBlockchain", "blockchains", "useMetaStore", "chain", "React", "Layout", "navigationRoutes", "i18n", "Divider", "SelectableCategoryList", "SearchInput", "event", "BlockchainList", "blockchain", "__name", "i18n", "Divider", "React", "useEffect", "useState", "useNavigate", "i18n", "Divider", "Image", "Skeleton", "Typography", "React", "useEffect", "useState", "sortBlockchains", "__name", "blockchains", "importantBlockchains", "otherBlockchains", "blockchain", "styled", "Container", "MIN", "MAX", "NUMBER_OF_LOADING", "BlockchainsSection", "props", "blockchains", "type", "blockchain", "onChange", "onMoreClick", "sortedBlockchains", "sortBlockchains", "selectFromMoreBlockchain", "setSelectFromMoreBlockchain", "useState", "loadingStatus", "useMetaStore", "resetToBlockchain", "useBestRouteStore", "resetFromBlockchain", "COUNT_BLOCKCHAINS", "useEffect", "selectBlockchainFromMore", "item", "React", "Divider", "Typography", "i18n", "Container", "e", "Skeleton", "BlockchainsChip", "Image", "__name", "i18n", "darkTheme", "Divider", "ExternalLinkIcon", "Image", "ListItemButton", "NotFound", "PinIcon", "Skeleton", "Typography", "VirtualizedList", "React", "forwardRef", "useEffect", "useState", "Divider", "ListItem", "Skeleton", "React", "styled", "Typography", "Container", "Title", "List", "Tag", "TagTitle", "BalanceContainer", "End", "Description", "ImageSection", "Pin", "LoadingTokenList", "props", "React", "List", "ListItem", "Skeleton", "End", "Divider", "__name", "PAGE_SIZE", "renderDesc", "__name", "props", "address", "name", "url", "token", "customCssForTag", "customCssForTagTitle", "length", "React", "Title", "Typography", "Divider", "Tag", "TagTitle", "e", "ExternalLinkIcon", "TokenList", "list", "searchedFor", "onChange", "selectedBlockchain", "tokens", "setTokens", "useState", "loadingStatus", "useMetaStore", "hasNextPage", "setHasNextPage", "loadingWallet", "useWalletsStore", "blockchains", "innerElementType", "forwardRef", "render", "ref", "loadNextPage", "useEffect", "renderList", "NotFound", "i18n", "VirtualizedList", "index", "style", "blockchain", "color", "generateRangeColors", "darkTheme", "ListItemButton", "ImageSection", "Image", "Pin", "PinIcon", "End", "Skeleton", "BalanceContainer", "Container", "LoadingTokenList", "List", "filterTokens", "__name", "list", "searchedFor", "token", "containsText", "a", "b", "SelectSwapItemsPage", "props", "type", "supportedBlockchains", "supportedTokens", "pinnedTokens", "selectedBlockchain", "setSelectedBlockchain", "useState", "navigate", "useNavigate", "navigateBackFrom", "useNavigateBack", "tokens", "setTokensWithBalance", "useMetaStore", "sourceTokens", "destinationTokens", "fromBlockchain", "toBlockchain", "setFromToken", "setToToken", "setFromBlockchain", "setToBlockchain", "useBestRouteStore", "connectedWallets", "loadingWallet", "useWalletsStore", "searchedFor", "setSearchedFor", "blockchains", "chain", "allTokens", "findCommonTokens", "token", "blockchain", "supportedSourceTokens", "supportedDestinationTokens", "tokensByType", "tokenList", "pinnedToken", "tokensAreEqual", "useEffect", "React", "Layout", "navigationRoutes", "i18n", "BlockchainsSection", "Divider", "SearchInput", "event", "TokenList", "filterTokens", "__name", "i18n", "ChevronRightIcon", "Divider", "List", "ListItemButton", "Skeleton", "Switch", "Typography", "React", "useNavigate", "i18n", "Chip", "Divider", "InfoIcon", "TextField", "Tooltip", "Typography", "React", "styled", "BaseContainer", "SlippageChipsContainer", "Head", "SlippageTooltipContainer", "i18n", "Typography", "React", "SlippageTooltipContent", "React", "SlippageTooltipContainer", "Typography", "i18n", "__name", "Slippage", "slippage", "useSettingsStore", "setSlippage", "customSlippage", "setCustomSlippage", "React", "BaseContainer", "Head", "Typography", "i18n", "Divider", "Tooltip", "getContainer", "SlippageTooltipContent", "InfoIcon", "SlippageChipsContainer", "SLIPPAGES", "slippageItem", "index", "key", "Chip", "TextField", "event", "parsedValue", "MIN_SLIPPGAE", "MAX_SLIPPAGE", "__name", "SettingsPage", "supportedSwappers", "singleTheme", "navigate", "useNavigate", "navigateBackFrom", "useNavigateBack", "infiniteApprove", "useSettingsStore", "toggleInfiniteApprove", "loadingMetaStatus", "useMetaStore", "supportedUniqueSwappersGroups", "getUniqueSwappersGroups", "bridgeSources", "uniqueItem", "totalBridgeSources", "totalSelectedBridgeSources", "exchangeSources", "totalExchangeSources", "totalSelectedExchangeSources", "handleEndItem", "__name", "totalSelected", "total", "React", "Skeleton", "Typography", "bridgeItem", "i18n", "Divider", "ChevronRightIcon", "navigationRoutes", "exchangeItem", "languageItem", "themeItem", "infiniteApprovalItem", "Switch", "settingItems", "Layout", "SettingsContainer", "Slippage", "List", "ListItemButton", "cancelSwap", "useManager", "React", "i18n", "getCurrentBlockchainOfOrNull", "getCurrentStep", "getRelatedWalletOrNull", "PendingSwapNetworkStatus", "Button", "CopyIcon", "Divider", "IconButton", "RouteCost", "RouteSummary", "StepDetails", "Typography", "useCopyToClipboard", "useWallets", "React", "useEffect", "useRef", "useState", "useNavigate", "timeSince", "timeMillis", "seconds", "intervalType", "interval", "__name", "getSwapDate", "pendingSwap", "PendingSwapNetworkStatus", "Modal", "React", "i18n", "Button", "Divider", "MessageBox", "Typography", "React", "CancelContent", "__name", "onCancel", "onClose", "React", "Divider", "MessageBox", "i18n", "Button", "Typography", "i18n", "Button", "Divider", "MessageBox", "Typography", "React", "DeleteContent", "__name", "onDelete", "onClose", "React", "Divider", "MessageBox", "i18n", "Button", "Typography", "i18n", "PendingSwapNetworkStatus", "modalNetworkValues", "MessageBox", "Wallet", "WalletState", "useWallets", "React", "styled", "WalletContainer", "WalletStateContent", "__name", "props", "type", "title", "currentStepWallet", "message", "showWalletButton", "connect", "getWalletInfo", "walletState", "useWallets", "walletType", "state", "WalletState", "React", "MessageBox", "WalletContainer", "Wallet", "getContainer", "SwapDetailsModal", "props", "state", "onClose", "onDelete", "onCancel", "currentStepWallet", "message", "showWalletStateContent", "PendingSwapNetworkStatus", "React", "Modal", "WalletStateContent", "modalNetworkValues", "DeleteContent", "CancelContent", "__name", "i18n", "Button", "Divider", "MessageBox", "Modal", "TokenAmount", "Typography", "React", "useNavigate", "SwapDetailsCompleteModal", "props", "open", "onClose", "status", "priceValue", "usdValue", "token", "chain", "percentageChange", "description", "diagnosisUrl", "navigate", "useNavigate", "React", "Modal", "MessageBox", "i18n", "TokenAmount", "Divider", "Typography", "Button", "navigationRoutes", "__name", "React", "i18n", "Alert", "IconButton", "LinkIcon", "React", "Fragment", "Alert", "ChevronDownIcon", "ChevronUpIcon", "IconButton", "React", "useState", "FailedAlert", "props", "message", "showContentError", "setShowContentError", "useState", "React", "Alert", "IconButton", "prev", "ChevronUpIcon", "ChevronDownIcon", "__name", "styled", "Alerts", "i18n", "PendingSwapNetworkStatus", "Alert", "Button", "React", "WarningAlert", "props", "switchNetwork", "setNetworkModal", "message", "showNetworkModal", "React", "Alert", "Button", "PendingSwapNetworkStatus", "e", "i18n", "__name", "SwapDetailsAlerts", "props", "switchNetwork", "showNetworkModal", "setNetworkModal", "message", "step", "hasAlreadyProceededToSign", "hasWarning", "isNetworkStatusInWarningState", "waitingForApproval", "inProgress", "React", "Alerts", "explorerUrl", "index", "urls", "key", "lastUrl", "loading", "error", "Fragment", "Alert", "i18n", "IconButton", "LinkIcon", "WarningAlert", "FailedAlert", "__name", "RESET_INTERVAL", "SECONDS", "getSteps", "__name", "swap", "args", "hasAlreadyProceededToSign", "step", "index", "amountToConvert", "numberToString", "React", "SwapDetailsAlerts", "getStepState", "isNetworkStatusInWarningState", "darkTheme", "styled", "Container", "HeaderDetails", "StepsList", "Alerts", "PlaceholderContainer", "LoaderContainer", "SwapDetails", "props", "swap", "requestId", "onDelete", "onCancelProps", "canSwitchNetworkTo", "connect", "getWalletInfo", "useWallets", "retry", "useBestRouteStore", "navigate", "useNavigate", "navigateBackFrom", "useNavigateBack", "_", "handleCopy", "useCopyToClipboard", "RESET_INTERVAL", "listRef", "useRef", "modalState", "setModalState", "useState", "showCompletedModal", "setShowCompletedModal", "tokens", "useMetaStore", "onCancel", "__name", "getUnreadNotifications", "useNotificationStore", "setAsRead", "unreadNotifications", "currentStep", "getCurrentStep", "currentStepNetworkStatus", "useEffect", "n", "showSwitchNetwork", "PendingSwapNetworkStatus", "lastConvertedTokenInFailedSwap", "getLastConvertedTokenInFailedSwap", "currentStepBlockchain", "getCurrentBlockchainOfOrNull", "currentStepWallet", "getRelatedWalletOrNull", "swapDate", "getSwapDate", "shouldRetry", "shouldRetrySwap", "isMobileWallet", "walletType", "switchNetwork", "stepMessage", "getSwapMessages", "steps", "getSteps", "numberOfSteps", "firstStep", "lastStep", "outputAmount", "totalFee", "totalTime", "step", "minutes", "SECONDS", "diagnosisUrl", "outputUsdValue", "numberToString", "getUsdPrice", "inputUsdValue", "percentageChange", "getPercentageChange", "completeModalDesc", "getConciseAddress", "i18n", "React", "Layout", "navigationRoutes", "SuffixContainer", "Button", "Typography", "Container", "HeaderDetails", "IconButton", "CopyIcon", "RouteCost", "RouteSummary", "getPriceImpactLevel", "Divider", "StepsList", "index", "key", "state", "getStepState", "isFocused", "StepDetails", "SwapDetailsModal", "SwapDetailsCompleteModal", "i18n", "CopyIcon", "IconButton", "NotFound", "Skeleton", "Typography", "React", "i18n", "ChainToken", "Divider", "Skeleton", "Typography", "React", "styled", "Container", "StepContainer", "StepSeparator", "ChainToken", "Divider", "NextIcon", "Skeleton", "React", "LoadingSwapDetailStep", "props", "extraInfo", "React", "StepContainer", "Skeleton", "Divider", "ChainToken", "NextIcon", "__name", "LoadingSwapDetails", "routeSummary", "React", "ChainToken", "Divider", "Skeleton", "Container", "Typography", "i18n", "LoadingSwapDetailStep", "StepSeparator", "__name", "SwapDetailsPlaceholder", "props", "requestId", "showSkeleton", "navigateBackFrom", "useNavigateBack", "React", "Layout", "i18n", "navigationRoutes", "SuffixContainer", "Container", "HeaderDetails", "Typography", "Skeleton", "IconButton", "CopyIcon", "LoadingSwapDetails", "PlaceholderContainer", "NotFound", "__name", "SwapDetailsPage", "manager", "state", "useManager", "loading", "pendingSwaps", "getPendingSwaps", "requestId", "useUiStore", "navigateBackFrom", "useNavigateBack", "loadingStatus", "useMetaStore", "showSkeleton", "selectedSwap", "swap", "onCancel", "__name", "cancelSwap", "onDelete", "navigationRoutes", "e", "React", "SwapDetailsPlaceholder", "SwapDetails", "i18n", "AutoThemeIcon", "DarkModeIcon", "LightModeIcon", "List", "ListItemButton", "Radio", "RadioRoot", "Typography", "React", "ThemePage", "navigateBackFrom", "useNavigateBack", "theme", "useSettingsStore", "setTheme", "themesList", "React", "Typography", "i18n", "LightModeIcon", "Radio", "DarkModeIcon", "AutoThemeIcon", "Layout", "navigationRoutes", "SettingsContainer", "RadioRoot", "value", "List", "ListItemButton", "__name", "getAbsolutePath", "__name", "path", "AppRoutes", "props", "config", "useRoutes", "navigationRoutes", "React", "Home", "SelectSwapItemsPage", "SelectBlockchainPage", "SettingsPage", "ThemePage", "LanguagePage", "LiquiditySourcePage", "HistoryPage", "SwapDetailsPage", "WalletsPage", "ConfirmSwapPage", "isApprovalTX", "MainEvents", "RouteEventType", "StepEventType", "StepExecutionEventStatus", "useEvents", "useEffect", "StepExecutionBlockedEventStatus", "validBlockedStatuses", "WidgetEvents", "connectedWallets", "useWalletsStore", "getWalletsDetails", "setNotification", "useNotificationStore", "setAsRead", "widgetEvents", "useEvents", "useEffect", "MainEvents", "widgetEvent", "event", "step", "route", "StepEventType", "StepExecutionEventStatus", "isApprovalTX", "fromAccount", "account", "toAccount", "wallet", "validBlockedStatuses", "RouteEventType", "__name", "globalCss", "globalFont", "__name", "globalCss", "createTheme", "darkTheme", "lightTheme", "useEffect", "useState", "useTheme", "fontFamily", "borderRadius", "DEFAULT_PRIMARY_RADIUS", "secondaryBorderRadius", "DEFAULT_SECONDARY_RADIUS", "mode", "theme", "useSettingsStore", "fetchMeta", "useMetaStore", "setTheme", "customTheme", "createTheme", "lightClassName", "lightTheme", "darkClassName", "darkTheme", "OSTheme", "setOSTheme", "useState", "useEffect", "__name", "switchTheme", "event", "React", "useMemo", "ManagerProvider", "makeQueueDefinition", "checkWaitingForNetworkChange", "useWallets", "convertEvmBlockchainMetaToEvmChainInfo", "isEvmBlockchain", "QueueManager", "props", "providers", "getSigners", "state", "connect", "canSwitchNetworkTo", "getWalletInfo", "useWallets", "swapQueueDef", "useMemo", "makeQueueDefinition", "getConfig", "blockchains", "useMetaStore", "wallets", "useWalletsStore", "wallet", "switchNetwork", "__name", "network", "isMobileWallet", "walletType", "allBlockchains", "blockchain", "blockchainsObj", "evmBasedChains", "isEvmBlockchain", "getSupportedChainNames", "type", "supportedChains", "walletAndSupportedChainsNames", "allProviders", "context", "convertEvmBlockchainMetaToEvmChainInfo", "React", "ManagerProvider", "manager", "checkWaitingForNetworkChange", "QueueManager_default", "Events", "Provider", "isEvmBlockchain", "React", "createContext", "useRef", "useEffect", "useWalletProviders", "providers", "options", "clearConnectedWallet", "useWalletsStore", "generateProviders", "matchAndGenerateProviders", "useEffect", "__name", "WidgetContext", "createContext", "WidgetWallets", "props", "blockchains", "useMetaStore", "providers", "useWalletProviders", "disconnectWallet", "useWalletsStore", "connectWallet", "onConnectWalletHandler", "useRef", "evmBasedChainNames", "isEvmBlockchain", "chain", "onUpdateState", "__name", "type", "event", "value", "state", "supportedBlockchains", "Events", "supportedChainNames", "walletAndSupportedChainsNames", "data", "prepareAccountsForWalletStore", "key", "React", "handler", "Provider", "MainContainer", "styled", "Main", "props", "config", "globalFont", "activeTheme", "useTheme", "lastConnectedWalletWithNetwork", "setLastConnectedWalletWithNetwork", "useState", "disconnectedWallet", "setDisconnectedWallet", "widgetContext", "useContext", "WidgetContext", "useMemo", "initConfig", "useEffect", "useSettingsStore", "useNotificationStore", "setInputAmount", "setToToken", "setToBlockchain", "setFromBlockchain", "setFromToken", "useBestRouteStore", "tokens", "blockchains", "loadingMetaStatus", "useMetaStore", "setAffiliateRef", "setAffiliatePercent", "setAffiliateWallets", "chain", "token", "t", "tokensAreEqual", "React", "I18nManager", "QueueManager_default", "WidgetEvents", "AppRouter", "AppRoutes", "__name", "Widget", "WidgetWallets", "useWallets", "useWidgetEvents", "MainEvents", "RouteEventType", "StepEventType", "StepExecutionEventStatus", "StepExecutionBlockedEventStatus"]
7
7
  }