@rango-dev/widget-embedded 0.23.1-next.21 → 0.23.1-next.23
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/constants/languages.d.ts.map +1 -1
- package/dist/constants/searchFor.d.ts +7 -0
- package/dist/constants/searchFor.d.ts.map +1 -0
- package/dist/index.js +2 -2
- package/dist/index.js.map +4 -4
- package/dist/pages/LanguagePage.d.ts.map +1 -1
- package/dist/pages/SelectSwapItemsPage.d.ts.map +1 -1
- package/dist/store/AppStore.d.ts +2 -2
- package/dist/store/app.d.ts +2 -2
- package/dist/store/slices/data.d.ts +3 -1
- package/dist/store/slices/data.d.ts.map +1 -1
- package/dist/utils/common.d.ts +4 -0
- package/dist/utils/common.d.ts.map +1 -1
- package/dist/utils/meta.d.ts +1 -0
- package/dist/utils/meta.d.ts.map +1 -1
- package/dist/utils/wallets.d.ts +1 -1
- package/dist/utils/wallets.d.ts.map +1 -1
- package/package.json +2 -2
- package/src/constants/languages.ts +27 -1
- package/src/constants/searchFor.ts +6 -0
- package/src/pages/LanguagePage.tsx +8 -0
- package/src/pages/SelectSwapItemsPage.tsx +2 -7
- package/src/store/slices/data.ts +74 -29
- package/src/utils/common.ts +181 -0
- package/src/utils/meta.ts +21 -0
- package/src/utils/wallets.ts +5 -47
package/dist/index.js.map
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
|
-
"sources": ["../src/index.ts", "../src/constants/index.ts", "../src/containers/Wallets/Wallets.tsx", "../src/hooks/useWalletProviders.ts", "../src/store/wallets.ts", "../src/services/httpService.ts", "../src/utils/wallets.ts", "../src/constants/numbers.ts", "../src/constants/wallets.ts", "../src/utils/numbers.ts", "../src/utils/configs.ts", "../src/store/selectors.ts", "../src/utils/providers.ts", "../src/store/AppStore.tsx", "../src/store/app.ts", "../src/store/slices/config.ts", "../src/utils/common.ts", "../src/utils/settings.ts", "../src/store/slices/data.ts", "../src/constants/languages.ts", "../src/constants/swapSettings.ts", "../src/store/slices/settings.ts", "../src/store/ui.ts", "../src/libs/tabManager/tabManager.constants.ts", "../src/libs/tabManager/tabManager.ts", "../src/containers/Widget/Widget.tsx", "../src/containers/App/App.tsx", "../src/components/AppRouter.tsx", "../src/hooks/useForceAutoConnect.ts", "../src/components/AppRoutes.tsx", "../src/constants/navigationRoutes.ts", "../src/hooks/useSyncStoresWithConfig.ts", "../src/store/quote.ts", "../src/utils/quote.ts", "../src/constants/quote.ts", "../src/types/quote.ts", "../src/utils/
|
|
4
|
-
"sourcesContent": ["import type { WidgetProps } from './containers/Widget';\nimport type { ConnectedWallet } from './store/wallets';\nimport type {\n BlockchainAndTokenConfig,\n Tokens,\n WidgetColors,\n WidgetColorsKeys,\n WidgetConfig,\n WidgetTheme,\n WidgetVariant,\n} from './types';\nimport type {\n PendingSwapWithQueueID,\n Route,\n RouteEvent,\n RouteExecutionEvents,\n RouteFailedEvent,\n RouteStartedEvent,\n RouteSucceededEvent,\n Step,\n StepApprovalTxSucceededEvent,\n StepCheckStatusEvent,\n StepEvent,\n StepFailedEvent,\n StepOutputRevealedEvent,\n StepStartedEvent,\n StepSucceededEvent,\n StepTxExecutionBlockedEvent,\n StepTxExecutionUpdatedEvent,\n} from '@rango-dev/queue-manager-rango-preset';\nimport type {\n EventHandler as HandleWalletsUpdate,\n ProviderInterface,\n} from '@rango-dev/wallets-react';\nimport type {\n WalletInfo,\n WalletState,\n WalletType,\n} from '@rango-dev/wallets-shared';\nimport type { PendingSwap, PendingSwapStep } from 'rango-types';\n\nimport {\n EventSeverity,\n MainEvents,\n RouteEventType,\n StepEventType,\n StepExecutionBlockedEventStatus,\n StepExecutionEventStatus,\n useEvents as useWidgetEvents,\n} from '@rango-dev/queue-manager-rango-preset';\nimport {\n readAccountAddress,\n useWallets,\n Events as WalletEvents,\n} from '@rango-dev/wallets-react';\nimport { Networks, WalletTypes } from '@rango-dev/wallets-shared';\nimport { PendingSwapNetworkStatus } from 'rango-types';\n\nimport { WIDGET_UI_ID as UI_ID } from './constants';\nimport { WidgetWallets } from './containers/Wallets';\nimport { Widget } from './containers/Widget';\nimport { useWidget } from './containers/WidgetInfo';\nimport { WidgetProvider } from './containers/WidgetProvider';\nimport { customizedThemeTokens } from './utils/ui';\n\nexport type {\n WidgetConfig,\n WalletType,\n WidgetTheme,\n WidgetColors,\n WidgetColorsKeys,\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 ConnectedWallet,\n Tokens,\n WidgetVariant,\n};\nexport {\n Widget,\n /**\n * @deprecated Use `WidgetProvider` instead. This component will be removed in future versions.\n */\n WidgetWallets,\n WidgetProvider,\n useWidget,\n useWallets,\n useWidgetEvents,\n customizedThemeTokens,\n MainEvents,\n RouteEventType,\n StepEventType,\n StepExecutionEventStatus,\n StepExecutionBlockedEventStatus,\n UI_ID,\n};\n\n// Internal type exports for Rango\nexport type {\n WalletState,\n WalletInfo,\n PendingSwap,\n PendingSwapWithQueueID,\n PendingSwapStep,\n RouteExecutionEvents,\n};\n\n// Internal function and enum exports for Rango\nexport {\n readAccountAddress,\n Networks,\n WalletEvents,\n WalletTypes,\n PendingSwapNetworkStatus,\n EventSeverity,\n};\n", "import { UI_ID } from '@rango-dev/ui';\n\nexport const RANGO_PUBLIC_API_KEY = 'c6381a79-2817-4602-83bf-6a641a409e32';\nexport const DEFAULT_BASE_URL = 'https://api.rango.exchange';\nexport const SCANNER_BASE_URL = 'https://scan.rango.exchange';\n\nexport const WIDGET_UI_ID = {\n SWAP_BOX_ID: 'rango-swap-box',\n EXPANDED_BOX_ID: 'rango-expanded-box',\n ...UI_ID,\n};\n", "import type {\n OnConnectHandler,\n PropTypes,\n WidgetContextInterface,\n} from './Wallets.types';\nimport type { ProvidersOptions } from '../../utils/providers';\nimport type { EventHandler } from '@rango-dev/wallets-react';\nimport type { PropsWithChildren } from 'react';\n\nimport { Events, Provider } from '@rango-dev/wallets-react';\nimport { type Network } from '@rango-dev/wallets-shared';\nimport { isEvmBlockchain } from 'rango-sdk';\nimport React, { createContext, useEffect, useRef } from 'react';\n\nimport { useWalletProviders } from '../../hooks/useWalletProviders';\nimport { AppStoreProvider, useAppStore } from '../../store/AppStore';\nimport { useUiStore } from '../../store/ui';\nimport { useWalletsStore } from '../../store/wallets';\nimport {\n prepareAccountsForWalletStore,\n walletAndSupportedChainsNames,\n} from '../../utils/wallets';\n\nexport const WidgetContext = createContext<WidgetContextInterface>({\n onConnectWallet: () => {\n return;\n },\n});\n\nfunction Main(props: PropsWithChildren<PropTypes>) {\n const { updateConfig, updateSettings, fetch: fetchMeta } = useAppStore();\n const blockchains = useAppStore().blockchains();\n const tokens = useAppStore().tokens();\n const walletOptions: ProvidersOptions = {\n walletConnectProjectId: props.config?.walletConnectProjectId,\n };\n const { providers } = useWalletProviders(props.config.wallets, walletOptions);\n const { connectWallet, disconnectWallet } = useWalletsStore();\n const onConnectWalletHandler = useRef<OnConnectHandler>();\n\n useEffect(() => {\n void fetchMeta().catch(console.log);\n }, []);\n\n useEffect(() => {\n if (props.config) {\n updateConfig(props.config);\n updateSettings(props.config);\n }\n }, [props.config]);\n\n const evmBasedChainNames = blockchains\n .filter(isEvmBlockchain)\n .map((chain) => chain.name);\n\n const onUpdateState: EventHandler = (type, event, value, state, meta) => {\n if (event === Events.ACCOUNTS) {\n if (value) {\n const supportedChainNames: Network[] | null =\n walletAndSupportedChainsNames(meta.supportedBlockchains);\n const data = prepareAccountsForWalletStore(\n type,\n value,\n evmBasedChainNames,\n supportedChainNames,\n meta.isContractWallet\n );\n if (data.length) {\n connectWallet(data, tokens);\n }\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, meta);\n }\n };\n const isActiveTab = useUiStore.use.isActiveTab();\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={!!isActiveTab}>\n {props.children}\n </Provider>\n </WidgetContext.Provider>\n );\n}\n\nexport function WidgetWallets(props: PropsWithChildren<PropTypes>) {\n const { config, ...otherProps } = props;\n return (\n <AppStoreProvider config={config}>\n <Main {...otherProps} config={config} />\n </AppStoreProvider>\n );\n}\n", "import type { WidgetConfig } from '../types';\nimport type { ProvidersOptions } from '../utils/providers';\nimport type { ProviderInterface } from '@rango-dev/wallets-react';\n\nimport { useEffect } from 'react';\n\nimport { useWalletsStore } from '../store/wallets';\nimport { matchAndGenerateProviders } 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?.length]);\n\n return {\n providers: generateProviders,\n };\n}\n", "import type { Balance, TokensBalance, Wallet } from '../types';\nimport type { WalletType } from '@rango-dev/wallets-shared';\nimport type { Token } from 'rango-sdk';\n\nimport { create } from 'zustand';\nimport { subscribeWithSelector } from 'zustand/middleware';\n\nimport { httpService } from '../services/httpService';\nimport {\n createTokenHash,\n isAccountAndWalletMatched,\n makeBalanceFor,\n makeTokensBalance,\n resetConnectedWalletState,\n} from '../utils/wallets';\n\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}\ninterface WalletsStore {\n connectedWallets: ConnectedWallet[];\n balances: TokensBalance;\n loading: boolean;\n connectWallet: (accounts: Wallet[], tokens: Token[]) => void;\n disconnectWallet: (walletType: WalletType) => void;\n selectWallets: (wallets: { walletType: string; chain: string }[]) => void;\n clearConnectedWallet: () => void;\n getWalletsDetails: (\n accounts: Wallet[],\n tokens: Token[],\n shouldRetry?: boolean\n ) => void;\n getBalanceFor: (token: Token) => Balance | null;\n}\n\nexport const useWalletsStore = createSelectors(\n create<WalletsStore>()(\n subscribeWithSelector((set, get) => ({\n connectedWallets: [],\n balances: {},\n loading: false,\n connectWallet: (accounts, tokens) => {\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, tokens);\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\n const 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 const balances = makeTokensBalance(connectedWallets);\n\n return {\n balances,\n connectedWallets,\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, tokens, shouldRetry = true) => {\n const getWalletsDetails = get().getWalletsDetails;\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 const 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], tokens, false);\n }\n return matchedAccount && retrievedBalanceAccount\n ? {\n ...connectedWallet,\n explorerUrl: retrievedBalanceAccount.explorerUrl,\n balances: makeBalanceFor(\n retrievedBalanceAccount,\n tokens\n ),\n loading: false,\n }\n : connectedWallet;\n }\n );\n\n const balances = makeTokensBalance(connectedWallets);\n\n return {\n loading: false,\n balances,\n connectedWallets,\n };\n });\n } else {\n throw new Error('Wallet not found');\n }\n } catch (error) {\n set((state) => {\n const connectedWallets = state.connectedWallets.map((balance) => {\n return accounts.find((account) =>\n isAccountAndWalletMatched(account, balance)\n )\n ? resetConnectedWalletState(balance)\n : balance;\n });\n\n const balances = makeTokensBalance(connectedWallets);\n\n return {\n loading: false,\n balances,\n connectedWallets,\n };\n });\n }\n },\n getBalanceFor: (token) => {\n const { balances } = get();\n const tokenHash = createTokenHash(token);\n const balance = balances[tokenHash];\n return balance ?? null;\n },\n }))\n )\n);\n", "import { RangoClient } from 'rango-sdk';\n\nimport { getConfig } from '../utils/configs';\n\nlet rango: RangoClient | undefined = undefined;\n\nexport const httpService = () => {\n if (rango) {\n return rango;\n }\n rango = new RangoClient(getConfig('API_KEY'), getConfig('BASE_URL'));\n return rango;\n};\n", "import type { ConnectedWallet, TokenBalance } from '../store/wallets';\nimport type {\n Balance,\n SelectedQuote,\n TokenHash,\n TokensBalance,\n Wallet,\n} from '../types';\nimport type { WalletInfo as ModalWalletInfo } from '@rango-dev/ui';\nimport type {\n Asset,\n Network,\n WalletInfo,\n WalletState,\n WalletType,\n WalletTypes,\n} from '@rango-dev/wallets-shared';\nimport type { BlockchainMeta, Token, WalletDetail } 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 {\n BALANCE_MAX_DECIMALS,\n BALANCE_MIN_DECIMALS,\n USD_VALUE_MAX_DECIMALS,\n USD_VALUE_MIN_DECIMALS,\n} from '../constants/routing';\nimport { EXCLUDED_WALLETS } from '../constants/wallets';\n\nimport { 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 const { supportedChains, isContractWallet } = getWalletInfo(wallet);\n const { installed, network } = getState(wallet);\n const filterContractWallets =\n isContractWallet && (!installed || (!!chain && network !== chain));\n if (filterContractWallets) {\n return false;\n }\n if (chain) {\n return !!supportedChains.find(\n (supportedChain) => supportedChain.name === chain\n );\n }\n return true;\n })\n .map((type) => {\n const { 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 isContractWallet: boolean\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 if (isContractWallet) {\n /*\n * for contract wallets like Safe wallet, we should add only account for the\n * current connected blockchain not all of the supported blockchains\n */\n addAccount(network, address.toLowerCase());\n } else {\n /*\n * all evm chains are not supported in wallets, so we are adding\n * only to those that are supported by wallet.\n */\n const evmChainsSupportedByWallet = supportedBlockchains.filter(\n (chain) => evmBasedChains.includes(chain)\n );\n\n evmChainsSupportedByWallet.forEach((network) => {\n /*\n * EVM addresses are not case sensitive.\n * Some wallets like Binance-chain return some letters in uppercase which produces bugs in our wallet state.\n */\n addAccount(network, address.toLowerCase());\n });\n }\n } else {\n addAccount(network, address);\n }\n });\n\n return result;\n}\n\nexport function getRequiredChains(quote: SelectedQuote | null) {\n const wallets: string[] = [];\n\n quote?.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 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 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 formatBalance(balance: Balance | null): Balance | null {\n const formattedBalance: Balance | null = balance\n ? {\n ...balance,\n amount: numberToString(\n balance.amount,\n BALANCE_MIN_DECIMALS,\n BALANCE_MAX_DECIMALS\n ),\n usdValue: numberToString(\n balance.usdValue,\n USD_VALUE_MIN_DECIMALS,\n USD_VALUE_MAX_DECIMALS\n ),\n }\n : null;\n\n return formattedBalance;\n}\n\nfunction sortTokensByBalance(\n token1Balance: Balance | null,\n token2Balance: Balance | null\n): number {\n if (token1Balance?.usdValue && token2Balance?.usdValue) {\n return (\n parseFloat(token2Balance.usdValue) - parseFloat(token1Balance.usdValue)\n );\n }\n\n if (!token1Balance?.usdValue && token2Balance?.usdValue) {\n return 1;\n }\n\n if (token1Balance?.usdValue && !token2Balance?.usdValue) {\n return -1;\n }\n\n if (!token1Balance?.usdValue && !token2Balance?.usdValue) {\n return (\n parseFloat(token2Balance?.amount || '0') -\n parseFloat(token1Balance?.amount || '0')\n );\n }\n\n return 0;\n}\n\nfunction sortTokensByPinnedToken(\n token1: Token,\n token2: Token,\n isTokenPinned: (token: Token) => boolean\n): number {\n const isToken1Pinned = isTokenPinned(token1);\n const isToken2Pinned = isTokenPinned(token2);\n\n if (isToken1Pinned === isToken2Pinned) {\n return 0;\n }\n if (isToken1Pinned) {\n return -1;\n }\n return 1;\n}\nexport function sortTokens(\n tokens: Token[],\n getBalanceFor: (token: Token) => Balance | null,\n isTokenPinned: (token: Token) => boolean\n) {\n tokens.sort((token1, token2) => {\n const token1Balance = getBalanceFor(token1);\n const token2Balance = getBalanceFor(token2);\n // Check pinned tokens\n const isTokenPin = sortTokensByPinnedToken(token1, token2, isTokenPinned);\n\n return isTokenPin !== 0\n ? isTokenPin\n : sortTokensByBalance(token1Balance, token2Balance);\n });\n\n return tokens;\n}\n\nexport function areTokensEqual(\n tokenA: Pick<Token, 'blockchain' | 'symbol' | 'address'> | null,\n tokenB: Pick<Token, 'blockchain' | 'symbol' | 'address'> | null\n) {\n return (\n tokenA?.blockchain === tokenB?.blockchain &&\n tokenA?.symbol === tokenB?.symbol &&\n tokenA?.address === tokenB?.address\n );\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\nexport function createTokenHash(token: Asset): TokenHash {\n return `${token.blockchain}-${token.symbol}-${token.address ?? ''}`;\n}\n\nexport function makeTokensBalance(connectedWallets: ConnectedWallet[]) {\n return connectedWallets\n .flatMap((wallet) => wallet.balances)\n .reduce((balances: TokensBalance, balance) => {\n const currentBalance = {\n amount: balance?.amount ?? '',\n decimals: balance?.decimal ?? 0,\n usdValue: balance?.usdPrice\n ? new BigNumber(balance?.usdPrice ?? ZERO)\n .multipliedBy(balance?.amount)\n .toString()\n : '',\n };\n\n const tokenHash = balance\n ? createTokenHash({\n symbol: balance.symbol,\n blockchain: balance.chain,\n address: balance.address,\n })\n : null;\n\n const prevBalance = tokenHash ? balances[tokenHash] : null;\n\n const shouldUpdateBalance =\n tokenHash &&\n (!prevBalance ||\n (prevBalance && prevBalance.amount < currentBalance.amount));\n\n if (shouldUpdateBalance) {\n balances[tokenHash] = currentBalance;\n }\n\n return balances;\n }, {});\n}\n\nexport const isFetchingBalance = (\n connectedWallets: ConnectedWallet[],\n blockchain: string\n) =>\n !!connectedWallets.find(\n (wallet) => wallet.chain === blockchain && wallet.loading\n );\n\nexport function hashWalletsState(walletsInfo: ModalWalletInfo[]) {\n return walletsInfo.map((w) => w.state).join('-');\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\nimport { TOOLTIP_DECIMALS } from '../constants/routing';\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 | number | null | undefined,\n minDecimals: number | null = null,\n maxDecimals: number | null = null\n): string => {\n if (number === null || number === undefined) {\n return '';\n }\n if (number === '') {\n return '';\n }\n const n = new BigNumber(number);\n const roundingMode = 1;\n let maxI = 1000;\n for (let i = 0; i < 60; i++) {\n if (new BigNumber(n.toFixed(i, roundingMode)).eq(n)) {\n maxI = i;\n break;\n }\n }\n\n if (n.gte(10000)) {\n return n.toFormat(0, roundingMode);\n }\n if (n.gte(1000)) {\n return n.toFormat(\n Math.min(\n maxI,\n Math.min(maxDecimals || 100, Math.max(minDecimals || 0, 1))\n ),\n roundingMode\n );\n }\n if (n.gte(100)) {\n return n.toFormat(\n Math.min(\n maxI,\n Math.min(maxDecimals || 100, Math.max(minDecimals || 0, 1))\n ),\n roundingMode\n );\n }\n if (n.gte(1)) {\n return n.toFormat(\n Math.min(\n maxI,\n Math.min(maxDecimals || 100, Math.max(minDecimals || 0, 2))\n ),\n roundingMode\n );\n }\n if (n.gte(0.01)) {\n return n.toFormat(\n Math.min(\n maxI,\n Math.min(maxDecimals || 100, Math.max(minDecimals || 0, 4))\n ),\n roundingMode\n );\n }\n for (let i = minDecimals || 4; i < 17; i++) {\n if (n.gte(Math.pow(10, -i))) {\n return n.toFormat(\n Math.min(\n maxI,\n Math.min(maxDecimals || 100, Math.max(minDecimals || 0, i))\n ),\n roundingMode\n );\n }\n }\n if (n.isEqualTo(0)) {\n return '0';\n }\n\n return n.toFormat(\n Math.min(maxI, Math.min(maxDecimals || 100, Math.max(minDecimals || 0, 8))),\n roundingMode\n );\n};\n\nexport const uint8ArrayToHex = (buffer: Uint8Array): string => {\n // buffer is an ArrayBuffer\n // eslint-disable-next-line @typescript-eslint/ban-ts-comment\n // @ts-ignore\n return [...buffer].map((x) => x.toString(16).padStart(2, '0')).join('');\n};\n\nexport const totalArrivalTime = (\n data: { estimatedTimeInSeconds: number | null }[] | undefined\n) => data?.reduce((a, b) => a + (b.estimatedTimeInSeconds ?? 0), 0) || 0;\n\nexport const rawFees = (data: BestRouteResponse): string =>\n (\n data?.result?.swaps?.flatMap((s) =>\n s.fee.map((f) => ({ swapperId: s.swapperId, fee: f }))\n ) || []\n )\n .reduce((partialSum, a) => partialSum + parseFloat(a.fee.amount), 0)\n .toFixed(3);\n\nexport const containsText = (text: string, searchText: string) =>\n text.toLowerCase().indexOf(searchText.toLowerCase()) > -1;\n\nexport const isPositiveNumber = (text?: string) =>\n !!text && parseFloat(text) > 0;\n10;\n\nexport function formatTooltipNumbers(\n number: BigNumber | string | number | null | undefined\n) {\n return numberToString(number, TOOLTIP_DECIMALS, TOOLTIP_DECIMALS).replace(\n /(?:\\.0*|(\\.\\d+?)0*)$/,\n '$1'\n );\n}\n", "import type { Tokens, WidgetVariant } from '../types';\nimport type { Asset, BlockchainMeta, Token } from 'rango-sdk';\n\nimport { RANGO_PUBLIC_API_KEY } from '../constants';\n\nimport { areTokensEqual } from './wallets';\n\nexport interface Configs {\n API_KEY: string;\n BASE_URL?: string;\n}\n\ntype TokensConfig =\n | Asset[]\n | {\n [blockchain: string]: Tokens;\n };\n\nlet configs: Configs = {\n API_KEY: RANGO_PUBLIC_API_KEY,\n};\n\nexport function getConfig(name: keyof Configs) {\n return configs[name] || '';\n}\n\nexport function setConfig(name: keyof Configs, value: any) {\n configs[name] = value;\n\n return value;\n}\n\n/**\n * Getting new configs from params and reset the value of global `configs` with provided param.\n */\nexport function initConfig(nextConfigs: Configs) {\n let clonedConfigs;\n if (typeof structuredClone === 'function') {\n clonedConfigs = structuredClone(nextConfigs);\n } else {\n clonedConfigs = JSON.parse(JSON.stringify(nextConfigs));\n }\n configs = clonedConfigs;\n return configs;\n}\n\nexport const DEFAULT_PRIMARY_RADIUS = 20;\nexport const DEFAULT_SECONDARY_RADIUS = 25;\nexport const DEFAULT_FONT_FAMILY = 'Roboto';\n\nexport const THEME_CLASS_NAME_PREFIX = `theme-widget`;\n\nexport const isTokenExcludedInConfig = (\n token: Token | null,\n tokensConfig?: TokensConfig\n) => {\n let result = false;\n if (tokensConfig && token) {\n if (Array.isArray(tokensConfig)) {\n result = !tokensConfig.some((asset) => areTokensEqual(asset, token));\n } else if (!Array.isArray(tokensConfig) && tokensConfig[token.blockchain]) {\n result = tokensConfig[token.blockchain].tokens.some((asset) =>\n areTokensEqual(asset, token)\n );\n const isExcluded = tokensConfig[token.blockchain].isExcluded;\n return (!isExcluded && !result) || (isExcluded && result);\n }\n }\n return result;\n};\n\nexport const isBlockchainExcludedInConfig = (\n blockchain: BlockchainMeta | null,\n blockchainsConfig?: string[]\n) => {\n return (\n blockchain &&\n blockchainsConfig &&\n !blockchainsConfig.includes(blockchain.name)\n );\n};\n\nexport const isVariantExpandable = (\n isLargeScreen: boolean,\n isExtraLargeScreen: boolean,\n variant?: WidgetVariant\n) => {\n return (\n (variant === 'expanded' && (isLargeScreen || isExtraLargeScreen)) ||\n (variant === 'full-expanded' && isExtraLargeScreen)\n );\n};\n", "import { 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 { WidgetConfig } from '../types';\nimport type { ProviderInterface } from '@rango-dev/wallets-react';\n\nimport { allProviders } from '@rango-dev/provider-all';\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 /*\n * There are two types of provider we get, the first one is only passing the wallet name\n * then we will match the wallet name with our providers (@rango-dev/provider-*).\n * The second way is passing a custom provider which implemented ProviderInterface.\n */\n if (typeof 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 { PropsWithChildren } from 'react';\n\nimport React, { createContext, useContext, useEffect, useRef } from 'react';\n\nimport { createAppStore } from './app';\n\ntype AppStore = ReturnType<typeof createAppStore>;\ntype AppStoreProviderProps = PropsWithChildren<{ config?: WidgetConfig }>;\n\nexport const AppStoreContext = createContext<AppStore | null>(null);\n\nexport function useAppStore() {\n const store = useContext(AppStoreContext);\n\n useEffect(() => {\n if (store && !store.persist.hasHydrated()) {\n void store.persist.rehydrate();\n }\n }, []);\n\n if (!store) {\n throw new Error('Missing AppStoreContext.Provider in the tree');\n }\n\n return store();\n}\n\nexport function AppStoreProvider(props: AppStoreProviderProps) {\n const appStoreRef = useRef<AppStore>();\n\n if (!appStoreRef.current) {\n appStoreRef.current = createAppStore(props.config);\n }\n\n return (\n <AppStoreContext.Provider value={appStoreRef.current}>\n {props.children}\n </AppStoreContext.Provider>\n );\n}\n", "import type { ConfigSlice } from './slices/config';\nimport type { DataSlice } from './slices/data';\nimport type { SettingsSlice } from './slices/settings';\nimport type { WidgetConfig } from '../types';\nimport type { StateCreator } from 'zustand';\n\nimport { create } from 'zustand';\nimport { persist } from 'zustand/middleware';\n\nimport { createConfigSlice } from './slices/config';\nimport { createDataSlice } from './slices/data';\nimport { createSettingsSlice } from './slices/settings';\n\nexport type StateCreatorWithInitialData<\n T extends Partial<WidgetConfig>,\n R extends Partial<AppStoreState>,\n V extends Partial<AppStoreState>\n> = (\n initialData: T | undefined,\n ...rest: Parameters<StateCreator<R, [], [], V>>\n) => ReturnType<StateCreator<R, [], [], V>>;\n\nexport type AppStoreState = DataSlice & ConfigSlice & SettingsSlice;\n\nexport function createAppStore(initialData?: WidgetConfig) {\n return create<AppStoreState>()(\n persist(\n (...a) => ({\n ...createDataSlice(...a),\n ...createSettingsSlice(...a),\n ...createConfigSlice(initialData, ...a),\n }),\n {\n name: 'user-settings',\n skipHydration: true,\n partialize: (state) => {\n return {\n theme: state.theme,\n language: state.language,\n affiliatePercent: state.affiliatePercent,\n affiliateRef: state.affiliateRef,\n affiliateWallets: state.affiliateWallets,\n slippage: state.slippage,\n customSlippage: state.customSlippage,\n infiniteApprove: state.infiniteApprove,\n preferredBlockchains: state.preferredBlockchains,\n disabledLiquiditySources: state.disabledLiquiditySources,\n };\n },\n }\n )\n );\n}\n", "import type { SettingsSlice } from './settings';\nimport type { WidgetConfig } from '../../types';\nimport type { StateCreatorWithInitialData } from '../app';\n\nexport const DEFAULT_CONFIG: WidgetConfig = {\n apiKey: '',\n title: undefined,\n multiWallets: true,\n excludeLiquiditySources: true,\n customDestination: true,\n};\n\ninterface IframeConfigs {\n clientUrl?: string;\n}\n\ninterface CampaignMode {\n liquiditySources?: string[];\n}\n\nconst DEFAULT_IFRAME_CONFIGS: IframeConfigs = {\n clientUrl: undefined,\n};\n\nconst DEFAULT_CAMPAIGN_MODE: CampaignMode = {\n liquiditySources: undefined,\n};\n\nexport interface ConfigSlice {\n // What user can set directly.\n config: WidgetConfig;\n campaignMode: CampaignMode;\n isInCampaignMode: () => boolean;\n getLiquiditySources: () => string[];\n getDisabledLiquiditySources: () => string[];\n excludeLiquiditySources: () => boolean;\n updateConfig: (config: WidgetConfig) => void;\n updateCampaignMode: <K extends keyof CampaignMode>(\n name: K,\n value: CampaignMode[K]\n ) => void;\n // What we are setting based on environments.\n iframe: { clientUrl?: string };\n updateIframe: <K extends keyof IframeConfigs>(\n name: K,\n value: IframeConfigs[K]\n ) => void;\n}\n\nexport const createConfigSlice: StateCreatorWithInitialData<\n WidgetConfig,\n ConfigSlice & SettingsSlice,\n ConfigSlice\n> = (initialData, set, get) => {\n return {\n config: { ...DEFAULT_CONFIG, ...initialData },\n iframe: DEFAULT_IFRAME_CONFIGS,\n campaignMode: DEFAULT_CAMPAIGN_MODE,\n getLiquiditySources: () => {\n const { config, campaignMode } = get();\n return campaignMode.liquiditySources?.length\n ? campaignMode.liquiditySources\n : config.liquiditySources ?? [];\n },\n getDisabledLiquiditySources: () => {\n const { disabledLiquiditySources, campaignMode } = get();\n return campaignMode.liquiditySources?.length\n ? []\n : disabledLiquiditySources;\n },\n excludeLiquiditySources: () => {\n const { config, campaignMode } = get();\n return campaignMode.liquiditySources?.length\n ? false\n : !!config.excludeLiquiditySources;\n },\n isInCampaignMode: () => {\n const { campaignMode } = get();\n return !!campaignMode.liquiditySources?.length;\n },\n\n // Actions\n updateConfig: (nextConfig: WidgetConfig) => {\n const currentConfig = get().config;\n\n set({\n config: {\n ...currentConfig,\n ...nextConfig,\n },\n });\n },\n\n updateCampaignMode: (name, value) => {\n const currentCampaignMode = get().campaignMode;\n\n set({\n campaignMode: {\n ...currentCampaignMode,\n [name]: value,\n },\n });\n },\n\n updateIframe: (name, value) => {\n const currentIframeConfig = get().iframe;\n\n set({\n iframe: {\n ...currentIframeConfig,\n [name]: value,\n },\n });\n },\n };\n};\n", "import { WIDGET_UI_ID } from '../constants';\n\nexport function removeDuplicateFrom<T>(array: T[]): T[] {\n return Array.from(new Set(array));\n}\n\nexport function areEqual(\n array1: (number | string)[],\n array2: (number | string)[]\n) {\n return (\n array1.length === array2.length && array1.every((v, i) => v === array2[i])\n );\n}\n// 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 getContainer = () =>\n document.getElementById(WIDGET_UI_ID.SWAP_BOX_ID) as HTMLElement;\n\nexport const getExpanded = () =>\n document.getElementById(WIDGET_UI_ID.EXPANDED_BOX_ID) as HTMLElement;\n", "import type { Features } from '../types';\nimport type { SwapperMeta, SwapperType } from 'rango-sdk';\n\nimport { removeDuplicateFrom } from './common';\n\nexport type UniqueSwappersGroupType = {\n id: string;\n groupTitle: string;\n logo: string;\n type: SwapperType;\n selected: boolean;\n};\n\nexport function getUniqueSwappersGroups(\n swappers: SwapperMeta[],\n disabledLiquiditySources: string[]\n): UniqueSwappersGroupType[] {\n const supportedSwappers = swappers.map((swapper) => swapper.swapperGroup);\n\n const uniqueSupportedSwappersGroups: Array<UniqueSwappersGroupType> = [];\n\n const uniqueGroup = removeDuplicateFrom(swappers.map((s) => s.swapperGroup));\n\n uniqueGroup.map((uniqueGroupItem) => {\n const swapperItem = swappers.find(\n (swapper) => swapper.swapperGroup === uniqueGroupItem\n );\n\n if (swapperItem) {\n let isSupportedSwapper = true;\n if (supportedSwappers) {\n isSupportedSwapper = supportedSwappers.some(\n (supportedItem) => supportedItem === swapperItem.swapperGroup\n );\n }\n\n if (isSupportedSwapper) {\n swapperItem.types.map((swapperTypeItem) => {\n uniqueSupportedSwappersGroups.push({\n id: swapperItem.swapperGroup,\n groupTitle: swapperItem.swapperGroup,\n logo: swapperItem.logo,\n type: swapperTypeItem,\n selected: !disabledLiquiditySources.includes(\n swapperItem.swapperGroup\n ),\n });\n });\n }\n }\n });\n\n return uniqueSupportedSwappersGroups;\n}\n\nexport function sortLiquiditySourcesByGroupTitle(\n a: SwapperMeta,\n b: SwapperMeta\n) {\n if (a.swapperGroup < b.swapperGroup) {\n return -1;\n }\n\n if (a.swapperGroup > b.swapperGroup) {\n return 1;\n }\n\n return 0;\n}\n\nexport function isFeatureHidden(feature: keyof Features, features?: Features) {\n return features?.[feature] === 'hidden';\n}\n\nexport function isFeatureEnabled(feature: keyof Features, features?: Features) {\n return features?.[feature] === 'enabled';\n}\n", "// We keep all the received data from server in this slice\n\nimport type { ConfigSlice } from './config';\nimport type { BlockchainMeta, SwapperMeta, Token } from 'rango-sdk';\nimport type { StateCreator } from 'zustand';\n\nimport { httpService as sdk } from '../../services/httpService';\nimport { containsText } from '../../utils/common';\nimport { isTokenExcludedInConfig } from '../../utils/configs';\nimport { sortLiquiditySourcesByGroupTitle } from '../../utils/settings';\nimport { areTokensEqual } from '../../utils/wallets';\n\ntype BlockchainOptions = {\n type?: 'source' | 'destination';\n};\n\ntype TokenOptions = {\n type: 'source' | 'destination';\n // filter by an specific blockchain\n blockchain?: string;\n searchFor?: string;\n};\nexport type FetchStatus = 'loading' | 'success' | 'failed';\nexport interface DataSlice {\n _blockchains: BlockchainMeta[];\n _tokens: Token[];\n _popularTokens: Token[];\n _swappers: SwapperMeta[];\n fetchStatus: FetchStatus;\n blockchains: (options?: BlockchainOptions) => BlockchainMeta[];\n tokens: (options?: TokenOptions) => Token[];\n swappers: () => SwapperMeta[];\n isTokenPinned: (token: Token, type: 'source' | 'destination') => boolean;\n\n fetch: () => Promise<void>;\n}\n\nexport const createDataSlice: StateCreator<\n DataSlice & ConfigSlice,\n [],\n [],\n DataSlice\n> = (set, get) => ({\n // State\n _blockchains: [],\n _tokens: [],\n _popularTokens: [],\n _swappers: [],\n fetchStatus: 'loading',\n // Selectors\n blockchains: (options) => {\n const blockchainsFromState = get()._blockchains;\n\n if (!options || !options?.type) {\n return blockchainsFromState;\n }\n\n const config = get().config;\n const supportedBlockchainsFromConfig =\n (options.type === 'source'\n ? config.from?.blockchains\n : config.to?.blockchains) ?? [];\n\n const list = blockchainsFromState.filter((blockchain) => {\n if (\n supportedBlockchainsFromConfig.length > 0 &&\n !supportedBlockchainsFromConfig.includes(blockchain.name)\n ) {\n return false;\n }\n\n return true;\n });\n\n return list;\n },\n tokens: (options) => {\n const tokensFromState = get()._tokens;\n\n if (!options || !options?.type) {\n return tokensFromState;\n }\n\n const config = get().config;\n const supportedTokensConfig =\n (options.type === 'source' ? config.from?.tokens : config.to?.tokens) ??\n {};\n const blockchains = get().blockchains({\n type: options.type,\n });\n\n const list = tokensFromState\n .filter((token) => {\n if (\n supportedTokensConfig &&\n isTokenExcludedInConfig(token, supportedTokensConfig)\n ) {\n return false;\n }\n\n // If a specific blockchain has passed, we only keep that blockchain's tokens.\n if (!!options.blockchain && token.blockchain !== options.blockchain) {\n return false;\n }\n\n // Check only available blockchains\n if (\n !blockchains.some((blockchain) => {\n return blockchain.name === token.blockchain;\n })\n ) {\n return false;\n }\n\n // Search functionality\n if (options.searchFor) {\n if (\n containsText(token.symbol, options.searchFor) ||\n containsText(token.address || '', options.searchFor) ||\n containsText(token.name || '', options.searchFor)\n ) {\n return true;\n }\n\n return false;\n }\n\n return true;\n })\n .sort((a, b) => {\n // Check pinned tokens\n if (get().isTokenPinned(a, options.type)) {\n return -1;\n }\n if (get().isTokenPinned(b, options.type)) {\n return 1;\n }\n\n // Check secondary coins\n if (a.isSecondaryCoin) {\n return 1;\n }\n if (b.isSecondaryCoin) {\n return -1;\n }\n\n // Check it has an address or not.\n if (!a.address && b.address) {\n return -1;\n }\n if (a.address && !b.address) {\n return 1;\n }\n\n return 0;\n });\n\n return list;\n },\n isTokenPinned: (token, type) => {\n const pinnedTokens =\n type === 'source'\n ? get().config.from?.pinnedTokens\n : get().config.to?.pinnedTokens;\n const pinned = !!pinnedTokens?.some((pinnedToken) =>\n areTokensEqual(pinnedToken, token)\n );\n return pinned;\n },\n swappers: () => {\n const { config, campaignMode } = get();\n\n const campaignModeLiquiditySource = campaignMode.liquiditySources?.length\n ? campaignMode.liquiditySources\n : null;\n\n const liquiditySources =\n campaignModeLiquiditySource ?? config.liquiditySources;\n\n const excludeLiquiditySources = campaignModeLiquiditySource\n ? false\n : config.excludeLiquiditySources;\n\n /*\n * If the excludeLiquiditySources flag is set to true, we return all swappers that are not included in the config.\n * Otherwise, we return all swappers that are included in the config.\n */\n const swappers = get()._swappers.filter((swapper) => {\n const swapperGroupIncludedInLiquiditySources = liquiditySources?.includes(\n swapper.swapperGroup\n );\n\n const shouldExcludeLiquiditySources =\n excludeLiquiditySources ||\n !liquiditySources ||\n liquiditySources.length === 0;\n\n return shouldExcludeLiquiditySources\n ? !swapperGroupIncludedInLiquiditySources\n : swapperGroupIncludedInLiquiditySources;\n });\n\n const sortedSwappers = swappers.sort(sortLiquiditySourcesByGroupTitle);\n\n return sortedSwappers;\n },\n // Actions\n fetch: async () => {\n try {\n const { enableCentralizedSwappers } = get().config;\n const response = await sdk().getAllMetadata({\n enableCentralizedSwappers,\n });\n\n set({ fetchStatus: 'success' });\n const blockchains: BlockchainMeta[] = [];\n const tokens: Token[] = [];\n const popularTokens: Token[] = response.popularTokens;\n const swappers: SwapperMeta[] = response.swappers;\n\n const blockchainsWithAtLeastOneToken = new Set();\n\n response.tokens.forEach((token) => {\n blockchainsWithAtLeastOneToken.add(token.blockchain);\n\n tokens.push(token);\n });\n\n response.blockchains.forEach((blockchain) => {\n if (\n blockchain.enabled &&\n blockchainsWithAtLeastOneToken.has(blockchain.name)\n ) {\n blockchains.push(blockchain);\n }\n });\n\n // Sort\n blockchains.sort((a, b) => a.sort - b.sort);\n\n set({\n _blockchains: blockchains,\n _tokens: tokens,\n _popularTokens: popularTokens,\n _swappers: swappers,\n });\n } catch (error) {\n set({ fetchStatus: 'failed' });\n throw error;\n }\n },\n});\n", "import type { FlagPropTypes, Language } from '@rango-dev/ui';\n\nimport { English, French, Japanese, Portuguese, Spanish } from '@rango-dev/ui';\n\nexport type LanguageItem = {\n title: string;\n label: string;\n local: Language;\n SVGFlag: React.ComponentType<FlagPropTypes>;\n};\n\nexport const LANGUAGES: LanguageItem[] = [\n { title: 'English', label: 'English', local: 'en', SVGFlag: English },\n { title: 'Spanish', label: 'Espa\u00F1ol', local: 'es', SVGFlag: Spanish },\n { title: 'French', label: 'Fran\u00E7ais', local: 'fr', SVGFlag: French },\n { title: 'Japanese', label: '\u65E5\u672C\u8A9E', local: 'ja', SVGFlag: Japanese },\n { title: 'Portuguese', label: 'Portugu\u00EAs', local: 'pt', SVGFlag: Portuguese },\n];\n\nexport const DEFAULT_LANGUAGE = 'en';\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 { ConfigSlice } from './config';\nimport type { WidgetConfig } from '../../types';\nimport type { SwapperMeta } from 'rango-sdk';\nimport type { StateCreator } from 'zustand';\n\nimport { type Language } from '@rango-dev/ui';\n\nimport { BLOCKCHAIN_LIST_SIZE } from '../../constants/configs';\nimport { DEFAULT_LANGUAGE } from '../../constants/languages';\nimport { DEFAULT_SLIPPAGE } from '../../constants/swapSettings';\nimport { removeDuplicateFrom } from '../../utils/common';\nimport { isFeatureHidden } from '../../utils/settings';\n\nexport type ThemeMode = 'auto' | 'dark' | 'light';\n\nexport interface SettingsSlice {\n theme: ThemeMode;\n language: Language | null;\n disabledLiquiditySources: string[];\n /** Keeping a history of blockchains that user has selected (in Swap process) */\n preferredBlockchains: string[];\n slippage: number;\n customSlippage: number | null;\n infiniteApprove: boolean;\n affiliateRef: string | null;\n affiliatePercent: number | null;\n affiliateWallets: { [key: string]: string } | null;\n\n setSlippage: (slippage: number) => void;\n setCustomSlippage: (customSlippage: number | null) => void;\n toggleInfiniteApprove: () => void;\n toggleLiquiditySource: (name: string) => void;\n setTheme: (theme: ThemeMode) => void;\n setLanguage: (language: Language | null) => void;\n toggleAllLiquiditySources: (\n swappers: SwapperMeta[],\n shouldReset?: boolean\n ) => void;\n setAffiliateRef: (affiliateRef: string | null) => void;\n setAffiliatePercent: (affiliatePercent: number | null) => void;\n setAffiliateWallets: (\n affiliateWallets: { [key: string]: string } | null\n ) => void;\n addPreferredBlockchain: (blockchain: string) => void;\n updateSettings: (config: WidgetConfig) => void;\n}\n\nexport const createSettingsSlice: StateCreator<\n SettingsSlice & ConfigSlice,\n [],\n [],\n SettingsSlice\n> = (set, get) => ({\n disabledLiquiditySources: [],\n theme: 'auto',\n language: null,\n preferredBlockchains: [],\n slippage: DEFAULT_SLIPPAGE,\n customSlippage: null,\n infiniteApprove: false,\n affiliateRef: null,\n affiliatePercent: null,\n affiliateWallets: null,\n\n addPreferredBlockchain: (blockchain) => {\n const currentPreferredBlockchains = get().preferredBlockchains;\n\n const noNeedToDoAnything = currentPreferredBlockchains.find(\n (preferredBlockchain, index) => {\n const isSameBlockchain = preferredBlockchain === blockchain;\n const isInVisibleList = index <= BLOCKCHAIN_LIST_SIZE - 1;\n\n return isSameBlockchain && isInVisibleList;\n }\n );\n\n if (noNeedToDoAnything) {\n return;\n }\n\n const nextPreferredBlockchains: string[] =\n currentPreferredBlockchains.filter((preferredBlockchain) => {\n const isSameBlockchain = preferredBlockchain === blockchain;\n\n return !isSameBlockchain;\n });\n\n set(() => ({\n preferredBlockchains: [blockchain, ...nextPreferredBlockchains],\n }));\n },\n setSlippage: (slippage) =>\n set(() => ({\n slippage: slippage,\n })),\n setCustomSlippage: (customSlippage) =>\n set(() => ({\n customSlippage: customSlippage,\n })),\n setAffiliateRef: (affiliateRef) =>\n set(() => ({\n affiliateRef,\n })),\n setAffiliatePercent: (affiliatePercent) =>\n set(() => ({\n affiliatePercent,\n })),\n\n setAffiliateWallets: (affiliateWallets) =>\n set(() => ({\n affiliateWallets,\n })),\n toggleAllLiquiditySources: (swappers, shouldReset) =>\n set((state) => {\n if (shouldReset) {\n return { disabledLiquiditySources: [] };\n }\n const swappersGroup = removeDuplicateFrom(\n swappers.map((swapper) => swapper.swapperGroup)\n );\n\n if (swappersGroup.length === state.disabledLiquiditySources.length) {\n return { disabledLiquiditySources: [] };\n }\n\n return {\n disabledLiquiditySources: swappersGroup,\n };\n }),\n toggleInfiniteApprove: () =>\n set((state) => ({\n infiniteApprove: !state.infiniteApprove,\n })),\n toggleLiquiditySource: (name) =>\n set((state) => {\n if (state.disabledLiquiditySources.includes(name)) {\n return {\n disabledLiquiditySources: state.disabledLiquiditySources.filter(\n (liquiditySource) => liquiditySource != name\n ),\n };\n }\n return {\n disabledLiquiditySources: state.disabledLiquiditySources.concat(name),\n };\n }),\n setTheme: (theme) =>\n set(() => ({\n theme,\n })),\n setLanguage: (language) =>\n set(() => ({\n language,\n })),\n updateSettings: (nextConfig: WidgetConfig) => {\n const { features } = nextConfig;\n\n const isThemeHidden = isFeatureHidden('theme', features);\n const isLanguageHidden = isFeatureHidden('language', features);\n const isLiquidityHidden = isFeatureHidden('liquiditySource', features);\n\n set({\n ...(isThemeHidden && { theme: nextConfig.theme?.mode || 'auto' }),\n ...(isLanguageHidden && {\n language: nextConfig.language || DEFAULT_LANGUAGE,\n }),\n ...(isLiquidityHidden && {\n disabledLiquiditySources: nextConfig.liquiditySources || [],\n }),\n });\n },\n});\n", "import type { Watermark } from '../hooks/useFetchApiConfig';\nimport type { TabManagerInterface } from '../libs/tabManager';\n\nimport { create } from 'zustand';\n\nimport { TabManager } from '../libs/tabManager';\n\nimport createSelectors from './selectors';\n\ninterface UiState {\n isActiveTab: boolean;\n tabManagerInitiated: boolean;\n showActivateTabModal: boolean;\n watermark: Watermark;\n activateCurrentTab: (\n setCurrentTabAsActive: () => void,\n hasRunningSwaps: boolean\n ) => void;\n setShowActivateTabModal: (flag: boolean) => void;\n setWatermark: (watermark: Watermark) => void;\n}\n\nexport const useUiStore = createSelectors(\n create<UiState>()((set, get) => ({\n isActiveTab: false,\n tabManagerInitiated: false,\n showActivateTabModal: false,\n watermark: 'NONE',\n fetchingApiConfig: false,\n activateCurrentTab: (setCurrentTabAsActive, hasRunningSwaps) => {\n const { showActivateTabModal } = get();\n\n if (!showActivateTabModal && hasRunningSwaps) {\n set({ showActivateTabModal: true });\n } else if (showActivateTabModal || !hasRunningSwaps) {\n setCurrentTabAsActive();\n }\n },\n setShowActivateTabModal: (flag) => {\n set({ showActivateTabModal: flag });\n },\n setWatermark: (watermark) => {\n set({ watermark });\n },\n }))\n);\n\nexport const tabManager: TabManagerInterface = new TabManager({\n onInit: () => useUiStore.setState({ tabManagerInitiated: true }),\n onClaim: () =>\n useUiStore.setState({ isActiveTab: true, showActivateTabModal: false }),\n onRelease: () => useUiStore.setState({ isActiveTab: false }),\n});\n", "export const TIMEOUT = 300;\nexport const MAXIMUM_TAB_ID = 100_000;\nexport const CHANNEL_NAME = 'rango-widget';\n", "import type {\n Events,\n ID,\n Message,\n TabManagerInterface,\n} from './tabManager.types';\n\nimport { CHANNEL_NAME, MAXIMUM_TAB_ID, TIMEOUT } from './tabManager.constants';\n\nexport class TabManager implements TabManagerInterface {\n private tabId: ID;\n private state: 'not-initiated' | 'not-claimed' | 'claimed' = 'not-initiated';\n private lastTryClaim: number | undefined;\n private events: Events = {};\n private channel: BroadcastChannel;\n\n constructor(events: Events) {\n this.channel = new BroadcastChannel(CHANNEL_NAME);\n this.tabId = Math.trunc(Math.random() * MAXIMUM_TAB_ID);\n this.events = events;\n }\n\n init = () => {\n this.initEvents();\n void this.tryClaim();\n };\n\n /**\n * This is applicable when a user in an inactive tab seeks to activate that tab.\n */\n forceClaim = () => {\n if (!this.isClaimed()) {\n const message: Message = { name: 'force-claim', candidateId: this.tabId };\n this.channel.postMessage(message);\n setTimeout(() => {\n if (!this.isClaimed()) {\n this.claim();\n }\n }, TIMEOUT);\n }\n };\n\n isClaimed = () => {\n return this.state === 'claimed';\n };\n\n /**\n * remove event listeners\n */\n destroy = () => {\n this.channel.removeEventListener('message', this.handleMessageEvent);\n document.removeEventListener(\n 'visibilitychange',\n this.handleVisibilityChange\n );\n document.removeEventListener('resume', this.handleResume);\n };\n\n /**\n * Reacting to messages and window events to claim.\n */\n private initEvents() {\n this.channel.addEventListener('message', this.handleMessageEvent);\n\n document.addEventListener('visibilitychange', this.handleVisibilityChange);\n\n /**\n * The \"resume\" event is currently supported only in certain browsers.\n * It is triggered when a previously frozen tab is unfrozen and resumes execution.\n * To avoid having multiple active tabs,\n * if the current tab is active after the \"resume\" event,\n * we send a signal to other tabs to verify if any of them currently claim to be active.\n * If this is the case, we deactivate the current tab.\n * https://developer.chrome.com/docs/web-platform/page-lifecycle-api\n */\n document.addEventListener('resume', this.handleResume);\n }\n\n /**\n * Runs after a `ping` message and checks if current tab is claimed the tabs,\n * if yes, it responds with `pong`, If not, it doesn't do anything.\n *\n * Note 1: If we receive a `ping` message,\n * it means a tab is trying to claim tabs directly, usually it's the active tab.\n *\n * Note 2: If multiple tabs are opening at once, all of them are broadcasting `ping`\n * and eventually all of them will `claim` the queue after the TIMEOUT.\n * For avoiding this, we will accepts the oldest broadcasted ping. (`isPingSentBefore`)\n */\n private claimedByCurrentTab(pingAt: number) {\n const isPingSentBefore = this.lastTryClaim && this.lastTryClaim < pingAt;\n\n if (this.isClaimed() || isPingSentBefore) {\n const message: Message = {\n name: 'pong',\n };\n this.channel.postMessage(message);\n return;\n }\n }\n\n private handleMessageEvent = (event: MessageEvent<Message>) => {\n const name = event.data.name;\n\n switch (name) {\n case 'ping':\n this.claimedByCurrentTab(event.data.pingAt);\n break;\n\n case 'pong':\n this.alreadyClaimedByAnotherTab();\n break;\n\n case 'force-claim':\n this.forceRelease(event.data.candidateId);\n break;\n\n case 'force-release':\n if (this.tabId === event.data.candidateId) {\n this.claim();\n }\n break;\n\n default:\n throw new Error(`${name} is not supported.`);\n }\n };\n\n private handleVisibilityChange = async () => {\n if (document.visibilityState === 'visible') {\n await this.tryClaim();\n }\n };\n\n private handleResume = async () => {\n if (this.isClaimed()) {\n await this.tryClaim();\n if (!this.isClaimed()) {\n this.events.onRelease?.();\n }\n }\n };\n /**\n * Runs after receiving `pong` message, which means one of tabs already claimed the tabs.\n */\n private alreadyClaimedByAnotherTab() {\n this.resetLastCheck();\n }\n\n /**\n * Try to send a `ping` message to know if the tabs `claimed` or not.\n * On constructing instance, or whenever page is active we will try.\n */\n private async tryClaim() {\n /**\n * Try to ask from possible other running tabs.\n */\n this.setLastCheck();\n return new Promise<void>((resolve) => {\n setTimeout(() => {\n this.check();\n resolve();\n }, TIMEOUT);\n });\n }\n\n /**\n * If `lastCheck` is exist, it means there is no other tabs which `claimed` the tabs.\n * And we mark the current tab as `claimed`\n */\n private check() {\n if (this.state === 'not-initiated') {\n this.events.onInit?.();\n }\n /**\n *it means we didn't get any response from other tabs, this tab can claim.\n */\n if (this.lastTryClaim) {\n this.claim();\n this.resetLastCheck();\n } else {\n this.state = 'not-claimed';\n }\n }\n\n private claim() {\n this.state = 'claimed';\n this.events.onClaim?.();\n }\n\n /**\n * Setting current time as `lastCheck` and broadcast a `ping` message event.\n */\n private setLastCheck() {\n this.lastTryClaim = Date.now();\n const message: Message = {\n name: 'ping',\n pingAt: this.lastTryClaim,\n };\n this.channel.postMessage(message);\n }\n\n private resetLastCheck() {\n this.lastTryClaim = undefined;\n }\n\n /**\n * Upon receipt of a \"force-claim\" message,\n * the presently active tab is expected to deactivate itself and initiate any attached callback associated with this event.\n */\n private forceRelease(nextActiveTab: ID) {\n if (this.isClaimed()) {\n this.state = 'not-claimed';\n\n this.events.onRelease?.();\n\n const message: Message = {\n name: 'force-release',\n candidateId: nextActiveTab,\n };\n\n this.channel.postMessage(message);\n }\n }\n}\n", "import type { WidgetProps } from './Widget.types';\nimport type { PropsWithChildren } from 'react';\n\nimport React, { useEffect } from 'react';\n\nimport { DEFAULT_CONFIG } from '../../store/slices/config';\nimport { tabManager } from '../../store/ui';\nimport { Main } from '../App';\nimport { WidgetProvider } from '../WidgetProvider';\n\nexport function Widget(props: PropsWithChildren<WidgetProps>) {\n useEffect(() => {\n tabManager.init();\n return tabManager.destroy;\n }, []);\n\n if (!props.config?.externalWallets) {\n return (\n <WidgetProvider config={props.config ?? DEFAULT_CONFIG}>\n <Main />\n </WidgetProvider>\n );\n }\n return <Main />;\n}\n", "import type { WalletType } from '@rango-dev/wallets-shared';\n\nimport { I18nManager } from '@rango-dev/ui';\nimport React, { useContext, useEffect, useState } from 'react';\n\nimport { AppRouter } from '../../components/AppRouter';\nimport { AppRoutes } from '../../components/AppRoutes';\nimport { WidgetEvents } from '../../components/WidgetEvents';\nimport { globalFont } from '../../globalStyles';\nimport { useFetchApiConfig } from '../../hooks/useFetchApiConfig';\nimport { useLanguage } from '../../hooks/useLanguage';\nimport { useTheme } from '../../hooks/useTheme';\nimport { useAppStore } from '../../store/AppStore';\nimport { useNotificationStore } from '../../store/notification';\nimport { WidgetContext } from '../Wallets';\n\nimport { MainContainer } from './App.styles';\n\nexport function Main() {\n globalFont();\n\n const { config } = useAppStore();\n const { activeTheme } = useTheme(config?.theme || {});\n const { activeLanguage } = useLanguage();\n const [lastConnectedWalletWithNetwork, setLastConnectedWalletWithNetwork] =\n useState<string>('');\n const [disconnectedWallet, setDisconnectedWallet] = useState<WalletType>();\n const widgetContext = useContext(WidgetContext);\n const { fetchApiConfig } = useFetchApiConfig();\n useEffect(() => {\n void useNotificationStore.persist.rehydrate();\n widgetContext.onConnectWallet(setLastConnectedWalletWithNetwork);\n void fetchApiConfig().catch(console.log);\n }, []);\n\n return (\n <I18nManager language={activeLanguage}>\n <MainContainer id=\"swap-container\" className={activeTheme()}>\n <WidgetEvents />\n <AppRouter\n lastConnectedWallet={lastConnectedWalletWithNetwork}\n disconnectedWallet={disconnectedWallet}\n clearDisconnectedWallet={() => {\n setDisconnectedWallet(undefined);\n }}>\n <AppRoutes />\n </AppRouter>\n </MainContainer>\n </I18nManager>\n );\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, { Fragment } from 'react';\nimport { MemoryRouter, useInRouterContext } from 'react-router';\n\nimport { useForceAutoConnect } from '../hooks/useForceAutoConnect';\nimport { useAppStore } from '../store/AppStore';\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 ? Fragment : MemoryRouter;\n const blockchains = useAppStore().blockchains();\n const { canSwitchNetworkTo } = useWallets();\n\n useForceAutoConnect();\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 <Router>{children}</Router>;\n}\n", "import { useWallets } from '@rango-dev/wallets-react';\nimport { useEffect, useRef } from 'react';\n\nimport { SearchParams } from '../constants/searchParams';\nimport { useAppStore } from '../store/AppStore';\n\nexport function useForceAutoConnect(): void {\n const { connect, state } = useWallets();\n const initiated = useRef<{ [key: string]: boolean }>({});\n const { fetchStatus } = useAppStore();\n const walletType =\n new URLSearchParams(location.search).get(SearchParams.AUTO_CONNECT) || '';\n const walletState = state(walletType);\n\n useEffect(() => {\n const shouldTryConnect =\n fetchStatus === 'success' &&\n walletType &&\n walletState.installed &&\n !walletState.connecting &&\n !walletState.connected;\n if (shouldTryConnect && !initiated.current[walletType]) {\n initiated.current[walletType] = true;\n void connect(walletType);\n }\n }, [walletState, fetchStatus]);\n}\n", "import React from 'react';\nimport { useRoutes } from 'react-router-dom';\n\nimport { navigationRoutes } from '../constants/navigationRoutes';\nimport { useSyncStoresWithConfig } from '../hooks/useSyncStoresWithConfig';\nimport { useSyncUrlAndStore } from '../hooks/useSyncUrlAndStore';\nimport { 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 { RoutesPage } from '../pages/Routes';\nimport { SelectBlockchainPage } from '../pages/SelectBlockchainPage';\nimport { SelectSwapItemsPage } from '../pages/SelectSwapItemsPage';\nimport { SettingsPage } from '../pages/SettingsPage';\nimport { SwapDetailsPage } from '../pages/SwapDetailsPage';\nimport { WalletsPage } from '../pages/WalletsPage';\n\nexport function AppRoutes() {\n /**\n * The configuration of the widget should initially be applied to the widget state.\n * If search parameters exist in the URL,\n * they should be applied later and take precedence over the widget configuration.\n * To achieve this, it is crucial to execute these hooks in the correct sequence.\n */\n useSyncStoresWithConfig();\n useSyncUrlAndStore();\n\n return useRoutes([\n {\n path: navigationRoutes.home,\n element: <Home />,\n },\n {\n path: navigationRoutes.routes,\n element: <RoutesPage />,\n },\n {\n path: navigationRoutes.fromSwap,\n children: [\n {\n index: true,\n element: <SelectSwapItemsPage type=\"source\" />,\n },\n {\n path: navigationRoutes.blockchains,\n element: <SelectBlockchainPage type=\"source\" />,\n },\n ],\n },\n {\n path: navigationRoutes.toSwap,\n children: [\n {\n index: true,\n element: <SelectSwapItemsPage type=\"destination\" />,\n },\n {\n path: navigationRoutes.blockchains,\n element: <SelectBlockchainPage type=\"destination\" />,\n },\n ],\n },\n {\n path: navigationRoutes.settings,\n children: [\n {\n index: true,\n element: <SettingsPage />,\n },\n {\n path: navigationRoutes.languages,\n element: <LanguagePage />,\n },\n {\n path: navigationRoutes.exchanges,\n element: <LiquiditySourcePage sourceType=\"Exchanges\" />,\n },\n {\n path: navigationRoutes.bridges,\n element: <LiquiditySourcePage sourceType=\"Bridges\" />,\n },\n ],\n },\n {\n path: navigationRoutes.swaps,\n children: [\n {\n index: true,\n element: <HistoryPage />,\n },\n {\n path: navigationRoutes.swapDetails,\n element: <SwapDetailsPage />,\n },\n ],\n },\n {\n path: navigationRoutes.wallets,\n element: <WalletsPage />,\n },\n {\n path: navigationRoutes.confirmSwap,\n element: <ConfirmSwapPage />,\n },\n ]);\n}\n", "export const navigationRoutes = {\n home: '/',\n fromSwap: 'from-swap',\n toSwap: 'to-swap',\n blockchains: 'blockchains',\n settings: 'settings',\n liquiditySources: 'liquidity-sources',\n bridges: 'bridges',\n exchanges: 'exchanges',\n languages: 'languages',\n swaps: 'swaps',\n wallets: 'wallets',\n confirmSwap: 'confirm-swap',\n swapDetails: ':requestId',\n routes: 'routes',\n};\n", "import type { Asset } from 'rango-sdk';\n\nimport { useEffect, useRef } from 'react';\n\nimport { useAppStore } from '../store/AppStore';\nimport { useQuoteStore } from '../store/quote';\nimport {\n isBlockchainExcludedInConfig,\n isTokenExcludedInConfig,\n} from '../utils/configs';\nimport { areTokensEqual } from '../utils/wallets';\n\nexport function useSyncStoresWithConfig() {\n const {\n setInputAmount,\n setToToken,\n setToBlockchain,\n setFromBlockchain,\n setFromToken,\n fromToken,\n toToken,\n fromBlockchain,\n toBlockchain,\n } = useQuoteStore();\n\n const config = useAppStore().config;\n const fetchMetaStatus = useAppStore().fetchStatus;\n const blockchains = useAppStore().blockchains();\n const tokens = useAppStore().tokens();\n\n const { setAffiliateRef, setAffiliatePercent, setAffiliateWallets } =\n useAppStore();\n\n const fromTokensConfig = config?.from?.tokens;\n const fromBlockchainsConfig = config?.from?.blockchains;\n const toTokensConfig = config?.to?.tokens;\n const toBlockchainsConfig = config?.to?.blockchains;\n const prevConfigFromToken = useRef<Asset | undefined>(undefined);\n const prevConfigToToken = useRef<Asset | undefined>(undefined);\n const prevConfigFromBlockchain = useRef<string | undefined>(undefined);\n const prevConfigToBlockchain = useRef<string | undefined>(undefined);\n\n useEffect(() => {\n setInputAmount(config?.amount?.toString() || '');\n }, [config?.amount]);\n\n useEffect(() => {\n if (fetchMetaStatus === 'success') {\n const chain = blockchains.find(\n (chain) => chain.name === config?.from?.blockchain\n );\n const token = tokens.find((t) =>\n areTokensEqual(t, config?.from?.token || null)\n );\n\n if (chain || (!chain && prevConfigFromBlockchain.current)) {\n setFromBlockchain(chain ?? null);\n }\n\n if (token) {\n setFromToken({ token, meta: { blockchains, tokens } });\n } else if (!token && prevConfigFromToken.current) {\n setFromToken({ token: null });\n }\n\n prevConfigFromBlockchain.current = config?.from?.blockchain;\n prevConfigFromToken.current = config?.from?.token;\n }\n }, [\n config?.from?.token?.symbol,\n config?.from?.token?.address,\n config?.from?.token?.blockchain,\n config?.from?.blockchain,\n fetchMetaStatus,\n ]);\n\n useEffect(() => {\n if (isTokenExcludedInConfig(fromToken, fromTokensConfig)) {\n setFromToken({ token: null });\n }\n\n if (isBlockchainExcludedInConfig(fromBlockchain, fromBlockchainsConfig)) {\n setFromBlockchain(null);\n }\n }, [fromTokensConfig, fromBlockchainsConfig]);\n\n useEffect(() => {\n if (isTokenExcludedInConfig(toToken, toTokensConfig)) {\n setFromToken({ token: null });\n }\n if (isBlockchainExcludedInConfig(toBlockchain, toBlockchainsConfig)) {\n setToBlockchain(null);\n }\n }, [toTokensConfig, toBlockchainsConfig]);\n\n useEffect(() => {\n if (fetchMetaStatus === 'success') {\n const chain = blockchains.find(\n (chain) => chain.name === config?.to?.blockchain\n );\n const token = tokens.find((t) =>\n areTokensEqual(t, config?.to?.token || null)\n );\n\n if (chain || (!chain && prevConfigToBlockchain.current)) {\n setToBlockchain(chain ?? null);\n }\n\n if (token) {\n setToToken({ token, meta: { blockchains, tokens } });\n } else if (!token && prevConfigToToken.current) {\n setToToken({ token: null });\n }\n\n prevConfigToBlockchain.current = config?.to?.blockchain;\n prevConfigToToken.current = config?.to?.token;\n }\n }, [\n config?.to?.token?.symbol,\n config?.to?.token?.address,\n config?.to?.token?.blockchain,\n config?.to?.blockchain,\n fetchMetaStatus,\n ]);\n\n useEffect(() => {\n setAffiliateRef(config?.affiliate?.ref ?? null);\n setAffiliatePercent(config?.affiliate?.percent ?? null);\n setAffiliateWallets(config?.affiliate?.wallets ?? null);\n }, [\n config?.affiliate?.ref,\n config?.affiliate?.percent,\n config?.affiliate?.wallets,\n ]);\n}\n", "import type { QuoteError, QuoteWarning, SelectedQuote, Wallet } from '../types';\nimport type {\n BlockchainMeta,\n MetaResponse,\n MultiRouteResponse,\n PreferenceType,\n Token,\n} from 'rango-sdk';\nimport type { PendingSwap } from 'rango-types';\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 { createRetryQuote, getQuoteToTokenUsdPrice } from '../utils/quote';\nimport { calcOutputUsdValue } from '../utils/swap';\n\nimport createSelectors from './selectors';\n\nexport const getUsdValue = (\n token: Token | null,\n amount: string\n): BigNumber | null =>\n token?.usdPrice\n ? new BigNumber(amount || ZERO).multipliedBy(token?.usdPrice || 0)\n : null;\n\nexport type Meta = Pick<MetaResponse, 'blockchains' | 'tokens'>;\n\nexport type SetTokenParams = { token: Token; meta: Meta } | { token: null };\n\ntype SomeQuoteState = {\n quotes: MultiRouteResponse | null;\n sortStrategy: PreferenceType;\n refetchQuote: boolean;\n error: QuoteError | null;\n warning: QuoteWarning | null;\n};\n\nexport interface QuoteState {\n fromBlockchain: BlockchainMeta | null;\n toBlockchain: BlockchainMeta | null;\n inputAmount: string;\n inputUsdValue: BigNumber | null;\n outputAmount: BigNumber | null;\n outputUsdValue: BigNumber | null;\n fromToken: Token | null;\n sortStrategy: PreferenceType;\n toToken: Token | null;\n quoteWalletsConfirmed: boolean;\n selectedWallets: Wallet[];\n quoteWarningsConfirmed: boolean;\n refetchQuote: boolean;\n selectedQuote: SelectedQuote | null;\n quotes: MultiRouteResponse | null;\n customDestination: string | null;\n error: QuoteError | null;\n warning: QuoteWarning | null;\n resetQuote: () => void;\n resetAlerts: () => void;\n\n resetToBlockchain: () => void;\n resetFromBlockchain: () => void;\n setFromBlockchain: (chain: BlockchainMeta | null) => void;\n setToBlockchain: (chian: BlockchainMeta | null) => void;\n setFromToken: (params: SetTokenParams) => void;\n setToToken: (params: SetTokenParams) => void;\n updateQuotePartialState: <K extends keyof SomeQuoteState>(\n key: K,\n value: SomeQuoteState[K]\n ) => void;\n setInputAmount: (amount: string) => void;\n setSelectedQuote: (quote: SelectedQuote | null) => void;\n retry: (pendingSwap: PendingSwap, meta: Meta) => void;\n switchFromAndTo: () => void;\n setQuoteWalletConfirmed: (flag: boolean) => void;\n setSelectedWallets: (wallets: Wallet[]) => void;\n setCustomDestination: (address: string | null) => void;\n resetQuoteWallets: () => void;\n setQuoteWarningsConfirmed: (flag: boolean) => void;\n}\n\nexport const useQuoteStore = createSelectors(\n create<QuoteState>()(\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 refetchQuote: true,\n sortStrategy: 'SMART',\n selectedQuote: null,\n quotes: null,\n error: null,\n warning: null,\n quoteWalletsConfirmed: false,\n selectedWallets: [],\n customDestination: null,\n quoteWarningsConfirmed: false,\n updateQuotePartialState: (key, value) =>\n set((state) => ({\n ...state,\n [key]: value,\n })),\n setSelectedQuote: (quote) =>\n set((state) => {\n let outputAmount: BigNumber | null = null;\n let outputUsdValue: BigNumber = ZERO;\n if (!isPositiveNumber(state.inputAmount)) {\n return {};\n }\n if (!!quote) {\n outputAmount = !!quote?.outputAmount\n ? new BigNumber(quote?.outputAmount)\n : null;\n outputUsdValue = calcOutputUsdValue(\n quote?.outputAmount,\n getQuoteToTokenUsdPrice(quote) || state.toToken?.usdPrice\n );\n }\n return {\n selectedQuote: quote,\n ...(!!quote && {\n outputAmount,\n outputUsdValue,\n }),\n };\n }),\n resetAlerts: () =>\n set(() => ({\n error: null,\n warning: null,\n })),\n resetQuote: () =>\n set(() => ({\n selectedQuote: null,\n outputAmount: null,\n outputUsdValue: new BigNumber(0),\n quotes: null,\n refetchQuote: true,\n error: null,\n warning: null,\n })),\n setFromBlockchain: (chain) => {\n set((state) => {\n if (state.fromBlockchain?.name === chain?.name) {\n return {};\n }\n\n return {\n fromBlockchain: chain,\n ...(state.fromToken && {\n selectedQuote: null,\n fromToken: null,\n outputAmount: null,\n outputUsdValue: null,\n }),\n };\n });\n },\n setFromToken: (params) => {\n return set((state) => ({\n fromToken: params.token,\n ...(params.token && {\n fromBlockchain:\n params.meta.blockchains.find(\n (blockchain) => blockchain.name === params.token.blockchain\n ) ?? null,\n }),\n ...(!!state.inputAmount && {\n inputUsdValue: getUsdValue(params.token, state.inputAmount),\n }),\n }));\n },\n setToBlockchain: (chain) => {\n set((state) => {\n if (state.toBlockchain?.name === chain?.name) {\n return {};\n }\n\n return {\n toBlockchain: chain,\n ...(state.toToken && {\n selectedQuote: null,\n toToken: null,\n outputAmount: null,\n outputUsdValue: null,\n }),\n };\n });\n },\n setToToken: (params) => {\n return set(() => ({\n toToken: params.token,\n ...(params.token && {\n toBlockchain:\n params.meta.blockchains.find(\n (blockchain) => blockchain.name === params.token.blockchain\n ) ?? null,\n }),\n }));\n },\n setInputAmount: (amount) => {\n set((state) => ({\n inputAmount: amount,\n ...(!amount && {\n outputAmount: new BigNumber(0),\n outputUsdValue: new BigNumber(0),\n selectedQuote: null,\n }),\n ...(!!state.fromToken && {\n inputUsdValue: getUsdValue(state.fromToken, amount),\n }),\n }));\n },\n retry: (pendingSwap, meta) => {\n const { tokens, blockchains } = meta;\n const {\n fromBlockchain,\n fromToken,\n toBlockchain,\n toToken,\n inputAmount,\n } = createRetryQuote(pendingSwap, blockchains, tokens);\n set({\n fromBlockchain,\n fromToken,\n inputAmount,\n outputAmount: null,\n inputUsdValue: getUsdValue(fromToken ?? null, inputAmount),\n outputUsdValue: new BigNumber(0),\n toBlockchain,\n toToken,\n selectedQuote: null,\n });\n },\n switchFromAndTo: () =>\n set((state) => ({\n fromBlockchain: state.toBlockchain,\n fromToken: state.toToken,\n toBlockchain: state.fromBlockchain,\n toToken: state.fromToken,\n inputAmount: state.outputAmount?.toString() || '',\n inputUsdValue: getUsdValue(\n state.toToken,\n state.outputAmount?.toString() || ''\n ),\n })),\n resetFromBlockchain: () =>\n set(() => ({\n fromToken: null,\n fromBlockchain: null,\n outputAmount: null,\n outputUsdValue: null,\n selectedQuote: null,\n })),\n resetToBlockchain: () =>\n set(() => ({\n toToken: null,\n toBlockchain: null,\n outputAmount: null,\n outputUsdValue: null,\n selectedQuote: null,\n })),\n setQuoteWalletConfirmed: (flag) =>\n set({\n quoteWalletsConfirmed: flag,\n }),\n setSelectedWallets: (wallets) => set({ selectedWallets: wallets }),\n setCustomDestination: (address) => set({ customDestination: address }),\n resetQuoteWallets: () =>\n set({\n quoteWalletsConfirmed: false,\n selectedWallets: [],\n customDestination: null,\n }),\n setQuoteWarningsConfirmed: (flag) =>\n set({ quoteWarningsConfirmed: flag }),\n }))\n )\n);\n", "/* eslint-disable @typescript-eslint/no-magic-numbers */\nimport type { QuoteWarning, SelectedQuote, Wallet } from '../types';\nimport type {\n PriceImpactWarningLevel,\n SimulationAssetAndAmount,\n SimulationValidationStatus,\n Step,\n} from '@rango-dev/ui';\nimport type {\n Asset,\n BlockchainMeta,\n MultiRouteResponse,\n MultiRouteSimulationResult,\n PreferenceType,\n RouteTag,\n Token,\n} from 'rango-sdk';\nimport type { PendingSwap } from 'rango-types';\n\nimport { getLastSuccessfulStep } from '@rango-dev/queue-manager-rango-preset';\nimport BigNumber from 'bignumber.js';\n\nimport { HIGH_PRIORITY_TAGS } from '../constants/quote';\nimport { HIGHT_PRICE_IMPACT, LOW_PRICE_IMPACT } from '../constants/routing';\nimport { HIGH_SLIPPAGE } from '../constants/swapSettings';\nimport { getUsdValue } from '../store/quote';\nimport { QuoteWarningType } from '../types';\n\nimport { areEqual } from './common';\nimport { findBlockchain, findToken } from './meta';\nimport {\n checkSlippageWarnings,\n getMinRequiredSlippage,\n getPercentageChange,\n getTotalFeeInUsd,\n hasHighValueLoss,\n hasProperSlippage,\n} from './swap';\n\nexport function getQuoteToTokenUsdPrice(\n quote: SelectedQuote | null\n): number | null | undefined {\n const swaps = quote?.swaps || [];\n return swaps[swaps.length - 1].to.usdPrice;\n}\n\nexport function isNumberOfSwapsChanged(\n quoteA: SelectedQuote,\n quoteB: SelectedQuote\n) {\n const quoteASwaps = quoteA?.swaps || [];\n const quoteBSwaps = quoteB?.swaps || [];\n return quoteASwaps.length !== quoteBSwaps.length;\n}\n\nexport function isQuoteSwappersUpdated(\n quoteA: SelectedQuote,\n quoteB: SelectedQuote\n) {\n const quoteASwappers = quoteA?.swaps.map((swap) => swap.swapperId) || [];\n const quoteBSwappers = quoteB?.swaps.map((swap) => swap.swapperId) || [];\n return !areEqual(quoteASwappers, quoteBSwappers);\n}\n\nexport function isQuoteInternalCoinsUpdated(\n quoteA: SelectedQuote,\n quoteB: SelectedQuote\n) {\n const quoteAInternalCoins = quoteA?.swaps.map((swap) => swap.to.symbol) || [];\n const quoteBInternalCoins = quoteB?.swaps.map((swap) => swap.to.symbol) || [];\n return !areEqual(quoteAInternalCoins, quoteBInternalCoins);\n}\n\nexport function isQuoteChanged(\n quoteA: SelectedQuote,\n quoteB: SelectedQuote\n): boolean {\n return (\n isNumberOfSwapsChanged(quoteA, quoteB) ||\n isQuoteSwappersUpdated(quoteA, quoteB) ||\n isQuoteInternalCoinsUpdated(quoteA, quoteB)\n );\n}\n\nexport function outToRatioHasWarning(\n fromUsdValue: BigNumber | null,\n outToInRatio: BigNumber | 0\n) {\n return (\n (parseInt(outToInRatio?.toFixed(2) || '0') <= -10 &&\n (fromUsdValue === null || fromUsdValue.gte(new BigNumber(200)))) ||\n (parseInt(outToInRatio?.toFixed(2) || '0') <= -5 &&\n (fromUsdValue === null || fromUsdValue.gte(new BigNumber(1000))))\n );\n}\n\nexport function getRequiredBalanceOfWallet(\n selectedWallet: Wallet,\n fee: SimulationValidationStatus[] | null\n): SimulationAssetAndAmount[] | null {\n if (fee === null) {\n return null;\n }\n const relatedFeeStatus = fee\n ?.find((item) => item.blockchain === selectedWallet.chain)\n ?.wallets.find(\n (wallet) =>\n wallet.address?.toLowerCase() === selectedWallet.address.toLowerCase()\n );\n if (!relatedFeeStatus) {\n return null;\n }\n return relatedFeeStatus.requiredAssets;\n}\n\nexport function getPriceImpactLevel(\n priceImpact: number\n): PriceImpactWarningLevel {\n let warningLevel: PriceImpactWarningLevel = undefined;\n if (priceImpact <= LOW_PRICE_IMPACT && priceImpact > HIGHT_PRICE_IMPACT) {\n warningLevel = 'low';\n } else if (priceImpact <= HIGHT_PRICE_IMPACT) {\n warningLevel = 'high';\n }\n\n return warningLevel;\n}\n\nexport function findCommonTokens<T extends Asset[], R extends Asset[]>(\n listA: T,\n listB: R\n) {\n const 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\nexport function createRetryQuote(\n pendingSwap: PendingSwap,\n blockchains: BlockchainMeta[],\n tokens: Token[]\n): {\n fromBlockchain: BlockchainMeta | null;\n fromToken: Token | null;\n toBlockchain: BlockchainMeta | null;\n toToken: Token | null;\n inputAmount: string;\n} {\n const firstStep = pendingSwap.steps[0];\n const lastStep = pendingSwap.steps[pendingSwap.steps.length - 1];\n const lastSuccessfulStep = getLastSuccessfulStep(pendingSwap.steps);\n\n const toToken = {\n blockchain: lastStep.toBlockchain,\n symbol: lastStep.toSymbol,\n address: lastStep.toSymbolAddress,\n };\n\n const fromBlockchainMeta = findBlockchain(\n lastSuccessfulStep\n ? lastSuccessfulStep.toBlockchain\n : firstStep.fromBlockchain,\n blockchains\n );\n const toBlockchainMeta = findBlockchain(lastStep.toBlockchain, blockchains);\n const fromTokenMeta = findToken(\n lastSuccessfulStep\n ? {\n blockchain: fromBlockchainMeta?.name ?? '',\n symbol: lastSuccessfulStep.toSymbol,\n address: lastSuccessfulStep.toSymbolAddress,\n }\n : {\n blockchain: fromBlockchainMeta?.name ?? '',\n symbol: firstStep.fromSymbol,\n address: firstStep.fromSymbolAddress,\n },\n tokens\n );\n const toTokenMeta = findToken(toToken, tokens);\n const inputAmount = lastSuccessfulStep\n ? lastSuccessfulStep.outputAmount ?? ''\n : pendingSwap.inputAmount;\n\n return {\n fromBlockchain: fromBlockchainMeta,\n fromToken: fromTokenMeta,\n toBlockchain: toBlockchainMeta,\n toToken: toTokenMeta,\n inputAmount,\n };\n}\n\nexport function generateQuoteWarnings(\n quote: SelectedQuote,\n params: {\n fromToken: Token;\n toToken: Token;\n tokens: Token[];\n userSlippage: number;\n }\n): QuoteWarning | null {\n const { fromToken, toToken, tokens, userSlippage } = params;\n const inputUsdValue = getUsdValue(fromToken, quote.requestAmount);\n const outputUsdValue = getUsdValue(toToken, quote?.outputAmount ?? '');\n\n if (!!quote && inputUsdValue && outputUsdValue) {\n const priceImpact = getPriceImpact(\n inputUsdValue.toString(),\n outputUsdValue.toString()\n );\n const highValueLoss =\n !!priceImpact && hasHighValueLoss(inputUsdValue, priceImpact);\n\n if (highValueLoss) {\n const totalFee = getTotalFeeInUsd(quote?.swaps, tokens);\n const warningLevel = getPriceImpactLevel(priceImpact);\n return {\n type: QuoteWarningType.HIGH_VALUE_LOSS,\n inputUsdValue,\n outputUsdValue,\n priceImpact,\n totalFee,\n warningLevel,\n };\n }\n } else if (quote && (!inputUsdValue || !outputUsdValue)) {\n return { type: QuoteWarningType.UNKNOWN_PRICE };\n }\n\n const minRequiredSlippage = getMinRequiredSlippage(quote.swaps);\n const highSlippage = userSlippage > HIGH_SLIPPAGE;\n\n if (!hasProperSlippage(params.userSlippage.toString(), minRequiredSlippage)) {\n return {\n type: QuoteWarningType.INSUFFICIENT_SLIPPAGE,\n recommendedSlippages: checkSlippageWarnings(quote, userSlippage),\n minRequiredSlippage: minRequiredSlippage,\n };\n } else if (\n highSlippage &&\n parseFloat(minRequiredSlippage ?? '0') < userSlippage\n ) {\n return {\n type: QuoteWarningType.HIGH_SLIPPAGE,\n slippage: userSlippage.toString(),\n };\n }\n\n return null;\n}\n\nexport function getPriceImpact(\n inputUsdValue: BigNumber | string | null,\n outputUsdValue: BigNumber | string | null\n): number | null {\n const outputUsdValueIsInvalid =\n typeof outputUsdValue === 'string'\n ? parseFloat(outputUsdValue) <= 0\n : !outputUsdValue?.gt(0);\n const percentageChange =\n !inputUsdValue || !outputUsdValue || outputUsdValueIsInvalid\n ? null\n : getPercentageChange(\n inputUsdValue.toString(),\n outputUsdValue.toString()\n );\n\n return percentageChange && percentageChange < 0 ? percentageChange : null;\n}\n\nexport const getUniqueBlockchains = (steps: Step[]) => {\n const set = new Set();\n const result: { displayName: string; image: string }[] = [];\n steps.forEach((step) => {\n if (!set.has(step.from.chain.displayName)) {\n set.add(step.from.chain.displayName);\n result.push(step.from.chain);\n }\n if (!set.has(step.to.chain.displayName)) {\n set.add(step.to.chain.displayName);\n result.push(step.to.chain);\n }\n });\n\n return result;\n};\n\nexport const sortQuotesBy = (\n strategy: PreferenceType,\n quotes: MultiRouteResponse['results']\n): MultiRouteResponse['results'] => {\n return quotes.sort((quote1, quote2) => {\n const getScore = (route: MultiRouteSimulationResult) =>\n route.scores?.find((score) => score.preferenceType === strategy)?.score ??\n 0;\n\n const quote1Score = getScore(quote1);\n const quote2Score = getScore(quote2);\n\n if (quote1Score !== quote2Score) {\n return quote2Score - quote1Score;\n }\n\n const lowerQuoteId1 = quote1.requestId.toLowerCase();\n const lowerQuoteId2 = quote2.requestId.toLowerCase();\n\n return lowerQuoteId1.localeCompare(lowerQuoteId2);\n });\n};\n\nexport const getDefaultQuote = (\n currentQuote: SelectedQuote | null,\n quotes: MultiRouteSimulationResult[],\n requestAmount: string\n): SelectedQuote | null => {\n if (!quotes.length) {\n return null;\n }\n if (!currentQuote) {\n // Handle the case where currentQuote is null\n return {\n requestAmount: requestAmount,\n ...quotes[0], // Return the first quote from the quotes array\n };\n }\n // Create a set of swapperIds from the currentQuote swaps\n const currentQuoteSwapperIds = new Set(\n currentQuote.swaps.map((swap) => swap.swapperId)\n );\n\n // Find a quote that matches the currentQuote's swapperIds\n const matchedQuote = quotes.find((quote) => {\n // Create a set of swapperIds from the quote swaps\n const quoteSwapperIds = new Set(quote.swaps.map((swap) => swap.swapperId));\n\n // Check if all swapperIds from the currentQuote are present in the quoteSwapperIds\n return Array.from(currentQuoteSwapperIds).every((swapperId) =>\n quoteSwapperIds.has(swapperId)\n );\n });\n\n // Return the matchedQuote if found, otherwise return the first quote from the quotes array\n return {\n requestAmount: requestAmount,\n ...(matchedQuote || quotes[0]),\n };\n};\n\nexport const sortTags = (tags: RouteTag[]): RouteTag[] => {\n const customSort = (a: RouteTag, b: RouteTag) => {\n const indexA = HIGH_PRIORITY_TAGS.indexOf(a.value);\n const indexB = HIGH_PRIORITY_TAGS.indexOf(b.value);\n\n if (indexA !== -1 && indexB !== -1) {\n return indexA - indexB;\n }\n\n if (indexA !== -1) {\n return -1;\n } else if (indexB !== -1) {\n return 1;\n }\n\n return 0;\n };\n\n return tags.sort(customSort);\n};\n", "import type { PreferenceType, SwapFee, TagValue } from 'rango-sdk';\n\nimport { i18n } from '@lingui/core';\n\nexport type NameOfFees =\n | 'Swapper Fee'\n | 'Affiliate Fee'\n | 'Outbound network fee'\n | 'Rango Fee'\n | 'Network Fee';\n\nexport const NAME_OF_FEES: Record<NameOfFees, string> = {\n 'Network Fee': i18n.t('Network Fee'),\n 'Swapper Fee': i18n.t('Protocol Fee'),\n 'Affiliate Fee': i18n.t('Affiliate Fee'),\n 'Outbound network fee': i18n.t('Outbound Fee'),\n 'Rango Fee': i18n.t('Rango Fee'),\n};\n\nexport type FeesGroup = {\n payable: { [key in NameOfFees]?: SwapFee[] };\n nonePayable: { [key in NameOfFees]?: SwapFee[] };\n};\n\nexport const ROUTE_STRATEGY: { value: PreferenceType; label: string }[] = [\n {\n value: 'SMART',\n label: i18n.t('Smart Routing'),\n },\n {\n value: 'FEE',\n label: i18n.t('Lowest Fee'),\n },\n {\n value: 'SPEED',\n label: i18n.t('Fastest Transfer'),\n },\n {\n value: 'NET_OUTPUT',\n label: i18n.t('Maximum Return'),\n },\n {\n value: 'PRICE',\n label: i18n.t('Maximum Output'),\n },\n];\n\nexport const HIGH_PRIORITY_TAGS: TagValue[] = [\n 'RECOMMENDED',\n 'CENTRALIZED',\n 'LOWEST_FEE',\n 'FASTEST',\n 'HIGH_IMPACT',\n];\n\nexport const GAS_FEE_MAX = 30;\n", "/* eslint-disable @typescript-eslint/prefer-enum-initializers */\n\nimport type { PriceImpactWarningLevel } from '@rango-dev/ui';\nimport type BigNumber from 'bignumber.js';\nimport type {\n BlockchainValidationStatus,\n RouteTag,\n RoutingResultType,\n SwapResult,\n} from 'rango-sdk';\n\nexport enum QuoteErrorType {\n NO_RESULT,\n REQUEST_FAILED,\n REQUEST_CANCELED,\n BRIDGE_LIMIT,\n INSUFFICIENT_SLIPPAGE,\n}\n\nexport type NoResultError = {\n type: QuoteErrorType.NO_RESULT;\n diagnosisMessage?: string;\n};\n\nexport type BridgeLimitError = {\n type: QuoteErrorType.BRIDGE_LIMIT;\n swap: SwapResult;\n recommendation: string;\n fromAmountRangeError: string;\n};\n\nexport type InsufficientSlippageError = {\n type: QuoteErrorType.INSUFFICIENT_SLIPPAGE;\n recommendedSlippages: RecommendedSlippages | null;\n minRequiredSlippage: string | null;\n};\n\nexport type QuoteRequestFailed = { type: QuoteErrorType.REQUEST_FAILED };\nexport type QuoteRequestCanceled = { type: QuoteErrorType.REQUEST_CANCELED };\n\nexport type QuoteError =\n | NoResultError\n | BridgeLimitError\n | InsufficientSlippageError\n | QuoteRequestFailed\n | QuoteRequestCanceled;\n\nexport enum QuoteWarningType {\n HIGH_VALUE_LOSS,\n UNKNOWN_PRICE,\n INSUFFICIENT_SLIPPAGE,\n HIGH_SLIPPAGE,\n}\n\nexport enum QuoteUpdateType {\n QUOTE_UPDATED,\n QUOTE_SWAPPERS_UPDATED,\n QUOTE_COINS_UPDATED,\n QUOTE_AND_OUTPUT_AMOUNT_UPDATED,\n QUOTE_UPDATED_WITH_HIGH_VALUE_LOSS,\n}\n\nexport type QuoteUpdateWarning =\n | {\n type: QuoteUpdateType.QUOTE_AND_OUTPUT_AMOUNT_UPDATED;\n newOutputAmount: string;\n percentageChange: string;\n }\n | {\n type: Exclude<\n QuoteUpdateType,\n QuoteUpdateType.QUOTE_AND_OUTPUT_AMOUNT_UPDATED\n >;\n };\n\nexport type RecommendedSlippages = Map<number, string>;\n\nexport type InsufficientSlippageWarning = {\n type: QuoteWarningType.INSUFFICIENT_SLIPPAGE;\n recommendedSlippages: RecommendedSlippages | null;\n minRequiredSlippage: string | null;\n};\n\nexport type HighSlippageWarning = {\n type: QuoteWarningType.HIGH_SLIPPAGE;\n slippage: string | null;\n};\n\nexport type HighValueLossWarning = {\n type: QuoteWarningType.HIGH_VALUE_LOSS;\n warningLevel: PriceImpactWarningLevel;\n inputUsdValue: BigNumber;\n outputUsdValue: BigNumber;\n totalFee: BigNumber;\n priceImpact: number;\n};\n\nexport type UnknownPriceWarning = {\n type: QuoteWarningType.UNKNOWN_PRICE;\n};\n\nexport type QuoteWarning =\n | HighValueLossWarning\n | InsufficientSlippageWarning\n | HighSlippageWarning\n | UnknownPriceWarning;\n\nexport type ConfirmSwapWarnings = {\n quote: QuoteWarning | null;\n quoteUpdate: QuoteUpdateWarning | null;\n balance: { messages: string[] } | null;\n};\n\nexport type QuoteResponse = {\n requestId: string;\n swaps?: SwapResult[];\n diagnosisMessages: string[] | null;\n};\n\nexport type SelectedQuote = {\n swaps: SwapResult[];\n requestId: string;\n outputAmount?: string;\n resultType?: RoutingResultType;\n tags?: RouteTag[];\n validationStatus: BlockchainValidationStatus[] | null;\n requestAmount: string;\n};\n\nexport type QuoteErrorResponse = {\n message: string;\n options: QuoteError;\n};\n", "import type { Asset, BlockchainMeta, SwapperMeta, Token } from 'rango-sdk';\n\nimport { areTokensEqual } from './wallets';\n\nexport function getBlockchainDisplayNameFor(\n blockchainName: string,\n blockchains: BlockchainMeta[]\n): string | undefined {\n return blockchains.find((blockchain) => blockchain.name === blockchainName)\n ?.displayName;\n}\nexport function getBlockchainShortNameFor(\n blockchainName: string,\n blockchains: BlockchainMeta[]\n): string | undefined {\n return blockchains.find((blockchain) => blockchain.name === blockchainName)\n ?.shortName;\n}\n\nexport function getSwapperDisplayName(\n swapperId: string,\n swappers: SwapperMeta[]\n) {\n return swappers.find((swapper) => swapper.id === swapperId)?.swapperGroup;\n}\n\nexport function findToken(t: Asset, tokens: Token[]) {\n return tokens.find((token) => areTokensEqual(token, t)) ?? null;\n}\n\nexport function findBlockchain(name: string, blockchains: BlockchainMeta[]) {\n return blockchains.find((blockchain) => blockchain.name === name) ?? null;\n}\n", "/* eslint-disable @typescript-eslint/no-magic-numbers */\nimport type { FeesGroup, NameOfFees } from '../constants/quote';\nimport type { FetchStatus } from '../store/slices/data';\nimport type { ConnectedWallet } from '../store/wallets';\nimport type {\n ConvertedToken,\n QuoteError,\n QuoteWarning,\n RecommendedSlippages,\n SelectedQuote,\n SwapButtonState,\n Wallet,\n} from '../types';\nimport type { WalletType } from '@rango-dev/wallets-shared';\nimport type {\n BestRouteRequest,\n BlockchainMeta,\n RecommendedSlippage,\n SwapFee,\n SwapResult,\n Token,\n} from 'rango-sdk';\nimport type { PendingSwap, PendingSwapStep } from 'rango-types';\n\nimport { i18n } from '@lingui/core';\nimport BigNumber from 'bignumber.js';\nimport { PendingSwapNetworkStatus } from 'rango-types';\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';\n\nimport { getBlockchainShortNameFor } from './meta';\nimport { numberToString } from './numbers';\nimport { getPriceImpact, getRequiredBalanceOfWallet } from './quote';\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\n .div(inputUsdValue)\n .minus(1)\n .multipliedBy(100)\n .toNumber();\n}\n\nexport function hasHighValueLoss(\n inputUsdValue: BigNumber | null,\n priceImpact: number\n): boolean {\n return (\n ((parseInt(priceImpact.toFixed(2) || '0') <= -10 &&\n inputUsdValue?.gte(new BigNumber(400))) ||\n (parseInt(priceImpact.toFixed(2) || '0') <= -5 &&\n inputUsdValue?.gte(new BigNumber(1000)))) ??\n false\n );\n}\n\nexport function hasLimitError(swaps: SwapResult[]): boolean {\n return (\n (swaps || []).filter((swap) => {\n const minimum = !!swap.fromAmountMinValue\n ? new BigNumber(swap.fromAmountMinValue)\n : null;\n const maximum = !!swap.fromAmountMaxValue\n ? new BigNumber(swap.fromAmountMaxValue)\n : null;\n const isExclusive = swap.fromAmountRestrictionType === 'EXCLUSIVE';\n if (isExclusive) {\n return minimum?.gte(swap.fromAmount) || maximum?.lte(swap.fromAmount);\n }\n return minimum?.gt(swap.fromAmount) || maximum?.lt(swap.fromAmount);\n }).length > 0\n );\n}\n\nexport function getLimitErrorMessage(swaps: SwapResult[]): {\n swap: SwapResult;\n fromAmountRangeError: string;\n recommendation: string;\n} {\n const swap = (swaps || []).filter((swap) => {\n const minimum = !!swap.fromAmountMinValue\n ? new BigNumber(swap.fromAmountMinValue)\n : null;\n const maximum = !!swap.fromAmountMaxValue\n ? new BigNumber(swap.fromAmountMaxValue)\n : null;\n const isExclusive = swap.fromAmountRestrictionType === 'EXCLUSIVE';\n if (isExclusive) {\n return minimum?.gte(swap.fromAmount) || maximum?.lte(swap.fromAmount);\n }\n return minimum?.gt(swap.fromAmount) || maximum?.lt(swap.fromAmount);\n })[0];\n\n const minimum = !!swap.fromAmountMinValue\n ? new BigNumber(swap.fromAmountMinValue)\n : null;\n const maximum = !!swap.fromAmountMaxValue\n ? new BigNumber(swap.fromAmountMaxValue)\n : null;\n const isExclusive = swap.fromAmountRestrictionType === 'EXCLUSIVE';\n\n let fromAmountRangeError = '';\n let recommendation = '';\n if (!isExclusive && !!minimum && minimum.gt(swap.fromAmount)) {\n fromAmountRangeError = i18n.t({\n id: 'Required: >= {min} {symbol}',\n values: {\n min: numberToString(\n minimum,\n TOKEN_AMOUNT_MIN_DECIMALS,\n TOKEN_AMOUNT_MAX_DECIMALS\n ),\n symbol: swap.from.symbol,\n },\n });\n recommendation = errorMessages().bridgeLimitErrors.increaseAmount;\n } else if (isExclusive && !!minimum && minimum.gte(swap.fromAmount)) {\n fromAmountRangeError = i18n.t({\n id: 'Required: > {min} {symbol}',\n values: {\n min: numberToString(\n minimum,\n TOKEN_AMOUNT_MIN_DECIMALS,\n TOKEN_AMOUNT_MAX_DECIMALS\n ),\n symbol: swap.from.symbol,\n },\n });\n recommendation = errorMessages().bridgeLimitErrors.increaseAmount;\n }\n\n if (!isExclusive && !!maximum && maximum.lt(swap.fromAmount)) {\n fromAmountRangeError = i18n.t({\n id: 'Required: <= {max} {symbol}',\n values: {\n max: numberToString(\n maximum,\n TOKEN_AMOUNT_MIN_DECIMALS,\n TOKEN_AMOUNT_MAX_DECIMALS\n ),\n symbol: swap.from.symbol,\n },\n });\n recommendation = errorMessages().bridgeLimitErrors.decreaseAmount;\n } else if (isExclusive && !!maximum && maximum.lte(swap.fromAmount)) {\n fromAmountRangeError = i18n.t({\n id: 'Required: < {max} {symbol}',\n values: {\n max: numberToString(\n maximum,\n TOKEN_AMOUNT_MIN_DECIMALS,\n TOKEN_AMOUNT_MAX_DECIMALS\n ),\n symbol: swap.from.symbol,\n },\n });\n recommendation = errorMessages().bridgeLimitErrors.decreaseAmount;\n }\n\n return { swap, fromAmountRangeError, recommendation };\n}\n\nexport function getSwapButtonState(params: {\n fetchMetaStatus: FetchStatus;\n anyWalletConnected: boolean;\n fetchingQuote: boolean;\n inputAmount: string;\n quote: SelectedQuote | null;\n warning: QuoteWarning | null;\n error: QuoteError | null;\n needsToWarnEthOnPath: boolean;\n}): SwapButtonState {\n const {\n fetchMetaStatus,\n anyWalletConnected,\n fetchingQuote,\n inputAmount,\n quote,\n warning,\n error,\n needsToWarnEthOnPath,\n } = params;\n if (fetchMetaStatus !== 'success') {\n return {\n title: swapButtonTitles().connectWallet,\n action: 'connect-wallet',\n disabled: true,\n };\n }\n if (!anyWalletConnected) {\n return {\n title: swapButtonTitles().connectWallet,\n action: 'connect-wallet',\n disabled: false,\n };\n }\n if (fetchingQuote || !quote || error || !inputAmount || inputAmount === '0') {\n return {\n title: swapButtonTitles().swap,\n action: 'confirm-swap',\n disabled: true,\n };\n } else if (warning) {\n return {\n title: swapButtonTitles().swapAnyway,\n action: 'confirm-warning',\n disabled: false,\n };\n } else if (needsToWarnEthOnPath) {\n return {\n title: swapButtonTitles().ethWarning,\n action: 'confirm-warning',\n disabled: false,\n };\n }\n return {\n title: swapButtonTitles().swap,\n action: 'confirm-swap',\n disabled: false,\n };\n}\n\nexport function canComputePriceImpact(\n quote: SelectedQuote | null,\n inputAmount: string,\n usdValue: BigNumber | null\n) {\n return !(\n (!usdValue || usdValue.lte(ZERO)) &&\n !!quote &&\n !!inputAmount &&\n inputAmount !== '0' &&\n parseFloat(inputAmount || '0') !== 0 &&\n !!quote\n );\n}\n\nexport function requiredWallets(quote: SelectedQuote | null) {\n const wallets: string[] = [];\n\n quote?.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 swaps: SwapResult[],\n allTokens: Token[]\n): BigNumber {\n return swaps.reduce(\n (totalFee: BigNumber, step) =>\n totalFee.plus(getUsdFeeOfStep(step, allTokens)),\n ZERO\n );\n}\n\nexport function getUsdFee(fee: SwapFee): BigNumber {\n let totalFeeInUsd = ZERO;\n totalFeeInUsd = totalFeeInUsd.plus(\n new BigNumber(fee.amount).multipliedBy(fee.price || 0)\n );\n\n return totalFeeInUsd;\n}\n\nexport function getTotalFeesInUsd(fees: SwapFee[]): BigNumber {\n return fees.reduce(\n (totalFee: BigNumber, fee) => totalFee.plus(getUsdFee(fee)),\n ZERO\n );\n}\nexport function getFeesGroup(swaps: SwapResult[]): FeesGroup {\n return swaps.reduce(\n (result, swap) => {\n for (const fee of swap.fee) {\n const name = fee.name as NameOfFees;\n const feeGroup =\n fee.expenseType !== 'DECREASE_FROM_OUTPUT'\n ? result.payable\n : result.nonePayable;\n\n feeGroup[name] = [...(feeGroup[name] || []), fee];\n }\n return result;\n },\n { payable: {}, nonePayable: {} } as FeesGroup\n );\n}\n\nexport function hasHighFee(totalFeeInUsd: BigNumber | null) {\n if (!totalFeeInUsd) {\n return false;\n }\n return !totalFeeInUsd.lt(new BigNumber(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 checkSlippageErrors(\n swaps: SwapResult[]\n): RecommendedSlippages | null {\n const recommendedSlippages: RecommendedSlippages = new Map();\n swaps.forEach((swap, index) => {\n if (swap.recommendedSlippage?.error) {\n recommendedSlippages.set(index, swap.recommendedSlippage.slippage);\n }\n });\n if (recommendedSlippages.size > 0) {\n return recommendedSlippages;\n }\n return null;\n}\n\nexport function checkSlippageWarnings(\n quote: SelectedQuote,\n userSlippage: number\n): RecommendedSlippages | null {\n const recommendedSlippages: RecommendedSlippages = new Map();\n quote?.swaps.forEach((swap, index) => {\n if (\n swap.recommendedSlippage?.slippage &&\n parseFloat(swap.recommendedSlippage.slippage) > userSlippage\n ) {\n recommendedSlippages.set(index, swap.recommendedSlippage.slippage);\n }\n });\n if (recommendedSlippages.size > 0) {\n return recommendedSlippages;\n }\n return null;\n}\n\nexport function getMinRequiredSlippage(swaps: SwapResult[]): string | null {\n const slippages = swaps.map((slippage) => slippage.recommendedSlippage);\n return (\n slippages\n ?.map((s) => s?.slippage || '0')\n ?.filter((s) => parseFloat(s) > 0)\n ?.sort((a, b) => parseFloat(b) - parseFloat(a))\n ?.find(() => true) || null\n );\n}\n\nexport function hasProperSlippage(\n userSlippage: string,\n minRequiredSlippage: string | null\n) {\n if (!minRequiredSlippage) {\n return true;\n }\n return parseFloat(userSlippage) >= parseFloat(minRequiredSlippage);\n}\n\nexport function hasEnoughBalance(\n quote: SelectedQuote,\n selectedWallets: Wallet[]\n) {\n const fee = quote.validationStatus;\n\n if (fee === null || fee.length === 0) {\n return true;\n }\n\n for (const wallet of selectedWallets) {\n const requiredAssets = getRequiredBalanceOfWallet(wallet, fee);\n if (!requiredAssets) {\n continue;\n }\n\n const enoughBalanceInWallet = requiredAssets\n .map((asset) => asset.ok)\n .reduce((previous, current) => previous && current);\n if (!enoughBalanceInWallet) {\n return false;\n }\n }\n\n return true;\n}\n\nexport function hasEnoughBalanceAndProperSlippage(\n quote: SelectedQuote,\n selectedWallets: Wallet[],\n userSlippage: string,\n minRequiredSlippage: string | null\n): boolean {\n return (\n hasEnoughBalance(quote, selectedWallets) &&\n hasProperSlippage(userSlippage, minRequiredSlippage)\n );\n}\n\nexport function createQuoteRequestBody(params: {\n fromToken: Token;\n toToken: Token;\n inputAmount: string;\n wallets?: ConnectedWallet[];\n selectedWallets?: Wallet[];\n liquiditySources?: string[];\n excludeLiquiditySources?: boolean;\n disabledLiquiditySources: string[];\n slippage: number;\n affiliateRef: string | null;\n affiliatePercent: number | null;\n affiliateWallets: { [key: string]: string } | null;\n destination?: string;\n enableCentralizedSwappers?: boolean;\n}): BestRouteRequest {\n const {\n fromToken,\n toToken,\n inputAmount,\n wallets,\n selectedWallets,\n disabledLiquiditySources,\n liquiditySources,\n excludeLiquiditySources,\n slippage,\n affiliateRef,\n affiliatePercent,\n affiliateWallets,\n destination,\n enableCentralizedSwappers,\n } = params;\n const selectedWalletsMap = selectedWallets?.reduce(\n (\n selectedWalletsMap: BestRouteRequest['selectedWallets'],\n selectedWallet\n ) => (\n (selectedWalletsMap[selectedWallet.chain] = selectedWallet.address),\n selectedWalletsMap\n ),\n {}\n );\n\n const connectedWallets: BestRouteRequest['connectedWallets'] = [];\n\n wallets?.forEach((wallet) => {\n connectedWallets.push({\n blockchain: wallet.chain,\n addresses: [wallet.address],\n });\n });\n // eslint-disable-next-line @typescript-eslint/ban-ts-comment\n // @ts-ignore\n const requestBody: BestRouteRequest = {\n amount: inputAmount.toString(),\n affiliateRef: affiliateRef ?? undefined,\n affiliatePercent: affiliatePercent ?? undefined,\n affiliateWallets: affiliateWallets ?? undefined,\n from: {\n address: fromToken.address,\n blockchain: fromToken.blockchain,\n symbol: fromToken.symbol,\n },\n to: {\n address: toToken.address,\n blockchain: toToken.blockchain,\n symbol: toToken.symbol,\n },\n connectedWallets,\n selectedWallets: selectedWalletsMap ?? {},\n slippage: slippage.toString(),\n ...(destination && { destination: destination }),\n ...(excludeLiquiditySources && {\n swapperGroups: disabledLiquiditySources.concat(liquiditySources ?? []),\n swappersGroupsExclude: true,\n }),\n ...(!excludeLiquiditySources && {\n swapperGroups: liquiditySources?.filter(\n (liquiditySource) => !disabledLiquiditySources.includes(liquiditySource)\n ),\n swappersGroupsExclude: false,\n }),\n enableCentralizedSwappers,\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 getQuoteOutputAmount(quote: SelectedQuote) {\n return quote?.outputAmount || null;\n}\n\nexport function getPercentageChange(input: string, output: string) {\n return new BigNumber(output)\n .div(new BigNumber(input))\n .minus(1)\n .multipliedBy(100)\n .toNumber();\n}\n\nexport function isOutputAmountChangedALot(\n oldQuote: SelectedQuote,\n newQuote: SelectedQuote\n) {\n const oldOutputAmount = getQuoteOutputAmount(oldQuote);\n const newOutputAmount = getQuoteOutputAmount(newQuote);\n if (!oldOutputAmount || !newOutputAmount) {\n return false;\n }\n const percentageChange = getPriceImpact(oldOutputAmount, newOutputAmount);\n if (!percentageChange) {\n return true;\n }\n\n return percentageChange <= -1;\n}\n\nexport function generateBalanceWarnings(\n quote: SelectedQuote,\n selectedWallets: Wallet[],\n blockchains: BlockchainMeta[]\n) {\n const fee = quote.validationStatus;\n const requiredWallets = getRequiredChains(quote);\n const walletsSortedByRequiredWallets = selectedWallets.sort(\n (selectedWallet1, selectedWallet2) =>\n requiredWallets.indexOf(selectedWallet1.chain) -\n requiredWallets.indexOf(selectedWallet2.chain)\n );\n\n return walletsSortedByRequiredWallets\n .flatMap((wallet) => getRequiredBalanceOfWallet(wallet, fee) || [])\n .filter((asset) => !asset.ok)\n .map((asset) => {\n const symbol = asset.asset.symbol;\n const currentAmount = numberToString(\n new BigNumber(asset.currentAmount.amount).shiftedBy(\n -asset.currentAmount.decimals\n ),\n BALANCE_MIN_DECIMALS,\n BALANCE_MAX_DECIMALS\n );\n const requiredAmount = numberToString(\n new BigNumber(asset.requiredAmount.amount).shiftedBy(\n -asset.requiredAmount.decimals\n ),\n BALANCE_MIN_DECIMALS,\n BALANCE_MAX_DECIMALS\n );\n let reason = '';\n if (asset.reason === 'FEE') {\n reason = i18n.t(' for network fee');\n }\n if (asset.reason === 'INPUT_ASSET') {\n reason = i18n.t(' for swap');\n }\n if (asset.reason === 'FEE_AND_INPUT_ASSET') {\n reason = i18n.t(' for input and network fee');\n }\n const warningMessage = i18n.t({\n id: `Needs \u2248 {requiredAmount} {symbol}{reason}, but you have {currentAmount} {symbol} in your {blockchain} wallet.`,\n values: {\n requiredAmount,\n symbol,\n reason,\n currentAmount,\n blockchain: getBlockchainShortNameFor(\n asset.asset.blockchain,\n blockchains\n ),\n },\n });\n return warningMessage;\n });\n}\n\nexport function 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 || i18n.t('Waiting for connecting wallet');\n break;\n case PendingSwapNetworkStatus.WaitingForQueue:\n message =\n message || i18n.t('Waiting for other running tasks to be finished');\n break;\n case PendingSwapNetworkStatus.WaitingForNetworkChange:\n message = message || i18n.t('Waiting for changing wallet network');\n break;\n 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}\n\nexport function confirmSwapDisabled(\n fetching: boolean,\n showCustomDestination: boolean,\n customDestination: string | null,\n quote: SelectedQuote | null,\n selectedWallets: { walletType: string; chain: string }[],\n lastStepToBlockchain?: BlockchainMeta\n) {\n return (\n fetching ||\n (!showCustomDestination &&\n !requiredWallets(quote).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\nexport function isTokensIdentical(tokenA: Token, tokenB: Token) {\n return (\n tokenA.blockchain === tokenB.blockchain &&\n tokenA.symbol === tokenB.symbol &&\n tokenA.address === tokenB.address\n );\n}\n", "import type { BlockchainMeta, SwapResult } from 'rango-sdk';\n\nexport function getRequiredWallets(swaps: SwapResult[] | null): string[] {\n const wallets: string[] = [];\n\n 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 { QuoteError } from '../types';\n\nimport { i18n } from '@lingui/core';\n\nimport { QuoteErrorType } from '../types';\n\nexport const errorMessages = () => {\n return {\n genericServerError: i18n.t('Failed Network, Please retry your swap.'),\n liquiditySourcesError: {\n title: i18n.t('Please reset your liquidity sources.'),\n description: i18n.t(\n 'You have limited the liquidity sources and this might result in Rango finding no routes. Please consider resetting your liquidity sources.'\n ),\n },\n noResultError: {\n title: i18n.t('No Routes Found.'),\n description: i18n.t(\n \"Reasons why Rango couldn't find a route: low liquidity on token, very low input amount or no routes available for the selected input/output token combination.\"\n ),\n },\n bridgeLimitErrors: {\n increaseAmount: i18n.t(\n 'Bridge Limit Error: Please increase your amount.'\n ),\n decreaseAmount: i18n.t(\n 'Bridge Limit Error: Please decrease your amount.'\n ),\n },\n highValueLossError: {\n impactTitle: i18n.t('High Price Impact'),\n title: i18n.t('Price impact is too high!'),\n description: i18n.t(\n 'The price impact is significantly higher than the allowed amount. If you are sure, continue, otherwise, change the swap.'\n ),\n confirmMessage: i18n.t('Confirm high price impact'),\n },\n quoteUpdatedWithHighValueLoss: {\n title: i18n.t(\n 'Route updated and price impact is too high, try again later!'\n ),\n },\n unknownPriceError: {\n impactTitle: i18n.t('USD Price Unknown'),\n title: i18n.t('USD Price Unknown, Cannot calculate Price Impact.'),\n description: i18n.t(\n 'USD Price Unknown, Cannot calculate Price Impact. The price impact may be higher than usual. Are you sure to continue the Swap?'\n ),\n confirmMessage: i18n.t('Confirm USD Price Unknown'),\n },\n };\n};\n\nexport function getQuoteErrorMessage(error: QuoteError) {\n switch (error.type) {\n case QuoteErrorType.NO_RESULT:\n return error.diagnosisMessage ?? errorMessages().noResultError.title;\n case QuoteErrorType.REQUEST_FAILED:\n return errorMessages().genericServerError;\n default:\n return '';\n }\n}\n", "import { i18n } from '@lingui/core';\n\nexport const swapButtonTitles = () => {\n return {\n connectWallet: i18n.t('Connect Wallet'),\n swap: i18n.t('Swap'),\n swapAnyway: i18n.t('Swap anyway'),\n ethWarning: i18n.t('The route goes through Ethereum. Continue?'),\n };\n};\n", "import { useEffect, useRef } from 'react';\nimport {\n useInRouterContext,\n useLocation,\n useSearchParams,\n} from 'react-router-dom';\n\nimport { SearchParams } from '../../constants/searchParams';\nimport { useAppStore } from '../../store/AppStore';\nimport { useQuoteStore } from '../../store/quote';\n\nimport {\n searchParamToToken,\n tokenToSearchParam,\n} from './useSyncUrlAndStore.helpers';\n\nexport function useSyncUrlAndStore() {\n const location = useLocation();\n const [searchParams, setSearchParams] = useSearchParams();\n const {\n fromBlockchain,\n toBlockchain,\n fromToken,\n toToken,\n inputAmount,\n setFromBlockchain,\n setToBlockchain,\n setFromToken,\n setToToken,\n setInputAmount,\n } = useQuoteStore();\n const fetchMetaStatus = useAppStore().fetchStatus;\n const blockchains = useAppStore().blockchains();\n const tokens = useAppStore().tokens();\n const isInRouterContext = useInRouterContext();\n const { updateIframe, updateCampaignMode } = useAppStore();\n const campaignMode = useAppStore().isInCampaignMode();\n const liquiditySourcesParamsRef = useRef<string>();\n\n const getUrlSearchParams = () => {\n const fromAmount = searchParams.get(SearchParams.FROM_AMOUNT);\n const fromBlockchain = searchParams.get(SearchParams.FROM_BLOCKCHAIN);\n const fromToken = searchParams.get(SearchParams.FROM_TOKEN);\n const toBlockchain = searchParams.get(SearchParams.TO_BLOCKCHAIN);\n const toToken = searchParams.get(SearchParams.TO_TOKEN);\n const autoConnect = searchParams.get(SearchParams.AUTO_CONNECT);\n const clientUrl = searchParams.get(SearchParams.CLIENT_URL);\n const liquiditySources = searchParams.get(SearchParams.LIQUIDITY_SOURCES);\n\n return {\n fromAmount,\n fromBlockchain,\n fromToken,\n toBlockchain,\n toToken,\n autoConnect,\n clientUrl,\n liquiditySources,\n };\n };\n\n const updateUrlSearchParams = (\n searchParams: Record<string, string | undefined>\n ) => {\n for (const property in searchParams) {\n if (!searchParams[property]) {\n delete searchParams[property];\n }\n }\n setSearchParams(searchParams as Record<string, string>, { replace: true });\n };\n\n useEffect(() => {\n const { autoConnect, clientUrl } = getUrlSearchParams();\n if (isInRouterContext && fetchMetaStatus === 'success') {\n updateUrlSearchParams({\n [SearchParams.FROM_BLOCKCHAIN]: fromBlockchain?.name,\n [SearchParams.FROM_TOKEN]: tokenToSearchParam(fromToken),\n [SearchParams.TO_BLOCKCHAIN]: toBlockchain?.name,\n [SearchParams.TO_TOKEN]: tokenToSearchParam(toToken),\n [SearchParams.FROM_AMOUNT]: inputAmount,\n [SearchParams.AUTO_CONNECT]: autoConnect ?? undefined,\n [SearchParams.CLIENT_URL]: clientUrl ?? undefined,\n [SearchParams.LIQUIDITY_SOURCES]: campaignMode\n ? liquiditySourcesParamsRef.current\n : undefined,\n });\n }\n }, [\n location.pathname,\n inputAmount,\n fromBlockchain,\n fromToken,\n toBlockchain,\n toToken,\n campaignMode,\n ]);\n\n useEffect(() => {\n if (!isInRouterContext) {\n return;\n }\n\n const searchParams = getUrlSearchParams();\n\n if (!liquiditySourcesParamsRef.current && searchParams.liquiditySources) {\n liquiditySourcesParamsRef.current = searchParams.liquiditySources;\n }\n\n if (searchParams.fromAmount) {\n setInputAmount(searchParams.fromAmount);\n }\n\n if (fetchMetaStatus === 'success') {\n const fromBlockchain = blockchains.find(\n (blockchain) => blockchain.name === searchParams.fromBlockchain\n );\n const fromToken = searchParamToToken(\n tokens,\n searchParams.fromToken,\n fromBlockchain ?? null\n );\n const toBlockchain = blockchains.find(\n (blockchain) => blockchain.name === searchParams.toBlockchain\n );\n const toToken = searchParamToToken(\n tokens,\n searchParams.toToken,\n toBlockchain ?? null\n );\n\n if (!!fromBlockchain) {\n setFromBlockchain(fromBlockchain);\n if (!!fromToken) {\n setFromToken({\n token: fromToken,\n meta: {\n blockchains: blockchains,\n tokens: tokens,\n },\n });\n }\n }\n\n if (!!toBlockchain) {\n setToBlockchain(toBlockchain);\n if (!!toToken) {\n setToToken({\n token: toToken,\n meta: { blockchains: blockchains, tokens: tokens },\n });\n }\n }\n }\n }, [fetchMetaStatus]);\n\n useEffect(() => {\n const { clientUrl, liquiditySources } = getUrlSearchParams();\n // We run this only once, because if the app is embedded into an iframe, the data in url for iframe will not change.\n updateIframe('clientUrl', clientUrl || undefined);\n\n updateCampaignMode(\n 'liquiditySources',\n liquiditySources?.split(',') ?? undefined\n );\n }, []);\n}\n", "import type { BlockchainMeta, Token } from 'rango-sdk';\n\nexport function searchParamToToken(\n tokens: Token[],\n searchParam: 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 = searchParam?.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 tokenToSearchParam(token: Token | null): string | undefined {\n if (token) {\n return `${token.symbol}${token.address ? `--${token.address}` : ''}`;\n }\n return undefined;\n}\n", "/* eslint-disable @typescript-eslint/no-magic-numbers */\nimport type {\n ConfirmSwap,\n ConfirmSwapFetchResult,\n} from '../hooks/useConfirmSwap/useConfirmSwap.types';\n\nimport { i18n } from '@lingui/core';\nimport { useManager } from '@rango-dev/queue-manager-react';\nimport {\n Alert,\n Button,\n css,\n Divider,\n IconButton,\n SettingsIcon,\n styled,\n Tooltip,\n Typography,\n WalletIcon,\n} from '@rango-dev/ui';\nimport React, { useEffect, useLayoutEffect, useRef, useState } from 'react';\nimport { flushSync } from 'react-dom';\nimport { useLocation, useNavigate } from 'react-router-dom';\n\nimport { getRequiredWallets } from '../components/ConfirmWalletsModal/ConfirmWallets.helpers';\nimport { ConfirmWalletsModal } from '../components/ConfirmWalletsModal/ConfirmWalletsModal';\nimport { HeaderButton } from '../components/HeaderButtons/HeaderButtons.styles';\nimport { RefreshButton } from '../components/HeaderButtons/RefreshButton';\nimport { Layout, PageContainer } from '../components/Layout';\nimport { QuoteWarningsAndErrors } from '../components/QuoteWarningsAndErrors';\nimport { navigationRoutes } from '../constants/navigationRoutes';\nimport { getQuoteUpdateWarningMessage } from '../constants/warnings';\nimport { QuoteInfo } from '../containers/QuoteInfo';\nimport { useConfirmSwap } from '../hooks/useConfirmSwap';\nimport { useAppStore } from '../store/AppStore';\nimport { useQuoteStore } from '../store/quote';\nimport { useUiStore } from '../store/ui';\nimport { useWalletsStore } from '../store/wallets';\nimport { QuoteWarningType } from '../types';\nimport { getContainer } from '../utils/common';\nimport { joinList } from '../utils/ui';\n\nconst Buttons = styled('div', {\n width: '100%',\n display: 'flex',\n justifyContent: 'space-between',\n [`& ${IconButton}`]: {\n width: '$48',\n height: '$48',\n },\n});\n\nconst confirmBtnStyles = css({\n flexGrow: 1,\n paddingRight: '$10',\n});\n\nconst iconStyles = css({\n width: '$24',\n height: '$24',\n display: 'flex',\n justifyContent: 'center',\n alignItems: 'center',\n});\n\nconst descriptionStyles = css({\n display: 'flex',\n justifyContent: 'space-between',\n alignItems: 'center',\n});\n\nexport function ConfirmSwapPage() {\n //TODO: move component's logics to a custom hook\n const {\n selectedQuote,\n setInputAmount,\n selectedWallets,\n quoteWalletsConfirmed,\n setQuoteWalletConfirmed,\n customDestination,\n quoteWarningsConfirmed,\n } = useQuoteStore();\n const navigate = useNavigate();\n const location = useLocation();\n const [dbErrorMessage, setDbErrorMessage] = useState<string>('');\n\n const { connectedWallets } = useWalletsStore();\n const showWalletsOnInit = !quoteWalletsConfirmed;\n const [showWallets, setShowWallets] = useState(false);\n const { isActiveTab } = useUiStore();\n const disabledLiquiditySources = useAppStore().getDisabledLiquiditySources();\n const prevDisabledLiquiditySources = useRef(disabledLiquiditySources);\n const { manager } = useManager();\n const {\n fetch: confirmSwap,\n loading: fetchingConfirmationQuote,\n cancelFetch,\n } = useConfirmSwap();\n const [confirmSwapResult, setConfirmSwapResult] =\n useState<ConfirmSwapFetchResult>({\n swap: null,\n error: null,\n warnings: null,\n });\n const [showQuoteWarningModal, setShowQuoteWarningModal] = useState(false);\n\n const onConfirmSwap: ConfirmSwap['fetch'] = async ({\n selectedWallets,\n customDestination,\n }) => {\n const result = await confirmSwap?.({ selectedWallets, customDestination });\n\n setConfirmSwapResult(result);\n return result;\n };\n\n const addNewSwap = async () => {\n if (confirmSwapResult.swap && quoteWalletsConfirmed) {\n try {\n await manager?.create(\n 'swap',\n { swapDetails: confirmSwapResult.swap },\n { id: confirmSwapResult.swap.requestId }\n );\n\n const swap_url = `../${navigationRoutes.swaps}/${confirmSwapResult.swap.requestId}`;\n navigate(swap_url, {\n replace: true,\n });\n setTimeout(() => {\n setInputAmount('');\n }, 0);\n } catch (e) {\n 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?.quote && !quoteWarningsConfirmed) {\n setShowQuoteWarningModal(true);\n } else {\n await onConfirm();\n }\n };\n\n const onRefresh = async () => {\n setConfirmSwapResult({\n error: null,\n swap: null,\n warnings: null,\n });\n confirmSwap({ selectedWallets, customDestination })\n .then((res) => {\n setConfirmSwapResult(res);\n })\n .catch((error) => console.error(error));\n };\n\n useEffect(() => {\n const disabledLiquiditySourceReset =\n !!prevDisabledLiquiditySources.current.length &&\n !disabledLiquiditySources.length;\n if (disabledLiquiditySourceReset) {\n void onRefresh();\n }\n prevDisabledLiquiditySources.current = disabledLiquiditySources;\n }, [disabledLiquiditySources.length]);\n\n useEffect(() => {\n if (showWalletsOnInit) {\n cancelFetch();\n }\n }, [showWalletsOnInit]);\n\n useEffect(() => {\n if (showWalletsOnInit) {\n setShowWallets(showWalletsOnInit);\n }\n }, [showWalletsOnInit]);\n\n useEffect(() => {\n if (!showWalletsOnInit) {\n confirmSwap({ selectedWallets, customDestination })\n .then((result) => setConfirmSwapResult(result))\n .catch((error) => console.error(error));\n }\n }, []);\n\n useEffect(() => {\n const quoteChanged =\n confirmSwapResult.warnings?.quote?.type &&\n Object.values(QuoteWarningType).includes(\n confirmSwapResult.warnings?.quote?.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 quoteWalletsChanged = false;\n\n if (quoteChanged) {\n let requiredWallets = getRequiredWallets(selectedQuote?.swaps || null);\n\n const lastStepToBlockchain =\n selectedQuote?.swaps[selectedQuote.swaps.length - 1].to.blockchain;\n\n const isLastWalletRequired = !!selectedQuote?.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 quoteWalletsChanged = true;\n }\n }\n\n if (selectedQuote && (selectedWalletDisconnected || quoteWalletsChanged)) {\n queueMicrotask(() => flushSync(setShowWallets.bind(null, true)));\n setQuoteWalletConfirmed(false);\n }\n }, [\n confirmSwapResult.warnings?.quote,\n selectedWallets.length,\n connectedWallets.length,\n ]);\n\n useLayoutEffect(() => {\n if (!selectedQuote) {\n navigate(`../${location.search}`);\n }\n }, []);\n\n const quoteWarning = confirmSwapResult.warnings?.quote ?? null;\n const quoteError = confirmSwapResult.error;\n const alerts = [];\n if (dbErrorMessage) {\n alerts.push(<Alert type=\"error\" variant=\"alarm\" title={dbErrorMessage} />);\n }\n\n if (confirmSwapResult.warnings?.quoteUpdate) {\n alerts.push(\n <Alert\n variant=\"alarm\"\n type=\"warning\"\n title={\n confirmSwapResult.warnings.quoteUpdate &&\n getQuoteUpdateWarningMessage(confirmSwapResult.warnings.quoteUpdate)\n }\n />\n );\n }\n\n if (quoteWarning || quoteError) {\n const settings_url = `../${navigationRoutes.settings}`;\n alerts.push(\n <QuoteWarningsAndErrors\n warning={quoteWarning}\n error={quoteError}\n refetchQuote={onRefresh}\n showWarningModal={showQuoteWarningModal}\n confirmationDisabled={!isActiveTab}\n onOpenWarningModal={() => setShowQuoteWarningModal(true)}\n onCloseWarningModal={() => setShowQuoteWarningModal(false)}\n onConfirmWarningModal={async () => {\n setShowQuoteWarningModal(false);\n await addNewSwap();\n }}\n onChangeSettings={() => navigate(settings_url)}\n />\n );\n }\n\n return (\n <Layout\n header={{\n title: i18n.t('Confirm Swap'),\n onWallet: () => {\n const wallets_url = `../${navigationRoutes.wallets}`;\n navigate(wallets_url);\n },\n 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={confirmBtnStyles()}>\n <Button\n variant=\"contained\"\n type=\"primary\"\n size=\"large\"\n fullWidth\n loading={fetchingConfirmationQuote}\n disabled={!!confirmSwapResult.error || !isActiveTab}\n onClick={onStartConfirmSwap}>\n {i18n.t('Start Swap')}\n </Button>\n </div>\n <IconButton\n variant=\"contained\"\n type=\"primary\"\n size=\"large\"\n loading={fetchingConfirmationQuote}\n onClick={setShowWallets.bind(null, true)}>\n <WalletIcon size={24} />\n </IconButton>\n </Buttons>\n }>\n {showWallets && (\n <ConfirmWalletsModal\n open={showWallets}\n onClose={() => setShowWallets(false)}\n onCancel={cancelFetch}\n loading={fetchingConfirmationQuote}\n onCheckBalance={onConfirmSwap}\n />\n )}\n\n <PageContainer>\n <div className={descriptionStyles()}>\n <Typography variant=\"title\" size=\"small\">\n {i18n.t('You get')}\n </Typography>\n <div className={iconStyles()}>\n <RefreshButton\n onClick={\n !fetchingConfirmationQuote &&\n !showWallets &&\n !showQuoteWarningModal\n ? onRefresh\n : undefined\n }\n />\n </div>\n </div>\n <Divider size=\"12\" />\n\n {joinList(\n alerts.map((alert, index) => ({\n element: alert,\n key: `alert-${index}`,\n })),\n <Divider size={10} />\n )}\n {alerts.length > 0 ? <Divider size={10} /> : null}\n\n <QuoteInfo\n quote={selectedQuote}\n type=\"swap-preview\"\n expanded={true}\n error={confirmSwapResult.error}\n loading={fetchingConfirmationQuote}\n warning={confirmSwapResult.warnings?.quote ?? null}\n />\n </PageContainer>\n </Layout>\n );\n}\n", "import type { PropTypes } from './ConfirmWalletsModal.types';\nimport type { ConnectedWallet } from '../../store/wallets';\nimport type { ConfirmSwapWarnings, Wallet } from '../../types';\n\nimport { i18n } from '@lingui/core';\nimport {\n Alert,\n BalanceErrors,\n Button,\n ChevronDownIcon,\n ChevronLeftIcon,\n Divider,\n MessageBox,\n Typography,\n WalletIcon,\n} from '@rango-dev/ui';\nimport React, { useEffect, useState } from 'react';\nimport { useNavigate } from 'react-router-dom';\n\nimport { WIDGET_UI_ID } from '../../constants';\nimport { getQuoteErrorMessage } from '../../constants/errors';\nimport { getQuoteUpdateWarningMessage } from '../../constants/warnings';\nimport { useAppStore } from '../../store/AppStore';\nimport { useQuoteStore } from '../../store/quote';\nimport { useWalletsStore } from '../../store/wallets';\nimport { getBlockchainShortNameFor } from '../../utils/meta';\nimport { confirmSwapDisabled } from '../../utils/swap';\nimport { WatermarkedModal } from '../common/WatermarkedModal';\nimport { CustomCollapsible } from '../CustomCollapsible/CustomCollapsible';\nimport { ExpandedIcon } from '../CustomCollapsible/CustomCollapsible.styles';\n\nimport { getRequiredWallets, isValidAddress } from './ConfirmWallets.helpers';\nimport {\n alarmsStyles,\n ConfirmButton,\n CustomDestination,\n CustomDestinationButton,\n ListContainer,\n NavigateBack,\n ShowMoreHeader,\n StyledTextField,\n Title,\n Wallets,\n WalletsContainer,\n walletsListStyles,\n} from './ConfirmWallets.styles';\nimport { WalletList } from './WalletList';\n\nconst NUMBER_OF_WALLETS_TO_DISPLAY = 2;\n\nexport function ConfirmWalletsModal(props: PropTypes) {\n //TODO: move component's logics to a custom hook\n const { open, onClose, onCancel, onCheckBalance, loading } = props;\n const config = useAppStore().config;\n\n const blockchains = useAppStore().blockchains();\n const {\n selectedQuote,\n setSelectedWallets: selectQuoteWallets,\n quoteWalletsConfirmed: quoteWalletsConfirmed,\n setQuoteWalletConfirmed: setQuoteWalletConfirmed,\n customDestination,\n setCustomDestination,\n } = useQuoteStore();\n const { connectedWallets, selectWallets } = useWalletsStore();\n\n const [showMoreWalletFor, setShowMoreWalletFor] = useState('');\n const [balanceWarnings, setBalanceWarnings] = useState<string[]>([]);\n const [error, setError] = useState('');\n const [quoteWarning, setQuoteWarning] = useState<\n ConfirmSwapWarnings['quoteUpdate'] | null\n >(null);\n const [showCustomDestination, setShowCustomDestination] = useState(\n !!customDestination\n );\n\n const requiredWallets = getRequiredWallets(selectedQuote?.swaps || null);\n\n const lastStepToBlockchain = blockchains.find(\n (blockchain) =>\n blockchain.name ===\n selectedQuote?.swaps[selectedQuote?.swaps.length - 1].to.blockchain\n );\n const isWalletRequiredFor = (blockchain: string) =>\n !!selectedQuote?.swaps.find((swap) => swap.from.blockchain === blockchain);\n\n const getInitialSelectableWallets = () =>\n connectedWallets.filter((connectedWallet) => {\n return (\n connectedWallet.selected &&\n requiredWallets.includes(connectedWallet.chain)\n );\n });\n\n const [selectableWallets, setSelectableWallets] = useState<ConnectedWallet[]>(\n getInitialSelectableWallets()\n );\n const lastStepToBlockchainMeta = blockchains.find(\n (chain) => chain.name === lastStepToBlockchain?.name\n );\n\n const isInsufficientBalanceModalOpen = balanceWarnings.length > 0;\n\n const isSelected = (walletType: string, chain: string) =>\n !!selectableWallets.find(\n (selectableWallet) =>\n selectableWallet.walletType === walletType &&\n selectableWallet.chain === chain &&\n selectableWallet.selected &&\n (isWalletRequiredFor(chain) ||\n (!isWalletRequiredFor(chain) && !customDestination))\n );\n\n const isAddressMatched =\n !!customDestination &&\n showCustomDestination &&\n lastStepToBlockchainMeta &&\n !isValidAddress(lastStepToBlockchainMeta, customDestination);\n\n const resetCustomDestination = () => {\n setShowCustomDestination(false);\n setCustomDestination(null);\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 setCustomDestination(null);\n }\n setSelectableWallets((selectableWallets) =>\n selectableWallets\n .filter((selectableWallet) => selectableWallet.chain !== wallet.chain)\n .concat({ ...connectedWallet, selected: true })\n );\n };\n\n const onConfirmBalance = () => {\n const lastSelectedWallets = selectableWallets.filter(\n (wallet) => wallet.selected\n );\n selectWallets(lastSelectedWallets);\n selectQuoteWallets(lastSelectedWallets);\n setQuoteWalletConfirmed(true);\n onClose();\n };\n\n const onConfirmWallets = async () => {\n setBalanceWarnings([]);\n setError('');\n setQuoteWarning(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,\n });\n const warnings = result.warnings;\n if (warnings?.balance?.messages) {\n setBalanceWarnings(warnings.balance.messages);\n }\n if (warnings?.quoteUpdate) {\n setQuoteWarning(warnings.quoteUpdate);\n }\n if (result.error) {\n setError(getQuoteErrorMessage(result.error));\n }\n\n if (!result.error && (!warnings?.balance?.messages.length || 0 > 0)) {\n onConfirmBalance();\n } else {\n setBalanceWarnings(warnings?.balance?.messages ?? []);\n }\n };\n\n useEffect(() => {\n setSelectableWallets((selectableWallets) =>\n 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.getElementById(\n WIDGET_UI_ID.SWAP_BOX_ID\n ) as HTMLDivElement;\n\n const navigate = useNavigate();\n\n return (\n <WatermarkedModal\n open={open}\n onClose={() => {\n if (!quoteWalletsConfirmed) {\n const home = '../';\n navigate(home, { replace: true });\n }\n onClose();\n }}\n dismissible={!showMoreWalletFor}\n container={modalContainer}\n {...(!showMoreWalletFor && {\n footer: (\n <ConfirmButton>\n <Button\n loading={loading}\n disabled={confirmSwapDisabled(\n loading,\n showCustomDestination,\n customDestination,\n selectedQuote,\n selectableWallets,\n lastStepToBlockchain\n )}\n onClick={onConfirmWallets}\n variant=\"contained\"\n type=\"primary\"\n fullWidth\n size=\"large\">\n {i18n.t('Confirm')}\n </Button>\n </ConfirmButton>\n ),\n })}\n {...(showMoreWalletFor && {\n styles: { container: { padding: '$0' } },\n header: (\n <ShowMoreHeader>\n <NavigateBack\n variant=\"ghost\"\n onClick={setShowMoreWalletFor.bind(null, '')}>\n <ChevronLeftIcon size={16} />\n </NavigateBack>\n <Typography variant=\"headline\" size=\"small\">\n {i18n.t({\n id: 'Your {blockchainName} wallets',\n values: {\n blockchainName: getBlockchainShortNameFor(\n showMoreWalletFor,\n blockchains\n ),\n },\n })}\n </Typography>\n </ShowMoreHeader>\n ),\n })}\n anchor=\"center\">\n <WatermarkedModal\n open={isInsufficientBalanceModalOpen}\n onClose={setBalanceWarnings.bind(null, [])}\n container={modalContainer}>\n <MessageBox\n title={i18n.t('Insufficient account balance')}\n type=\"error\"\n description={<BalanceErrors messages={balanceWarnings ?? []} />}>\n <Button\n variant=\"outlined\"\n size=\"large\"\n type=\"primary\"\n fullWidth\n onClick={onConfirmBalance}>\n {i18n.t('Proceed anyway')}\n </Button>\n </MessageBox>\n </WatermarkedModal>\n {showMoreWalletFor && (\n <WalletsContainer>\n <div className={walletsListStyles()}>\n <WalletList\n chain={showMoreWalletFor}\n isSelected={isSelected}\n selectWallet={onChange}\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={i18n.t(error)} />\n <Divider size={12} />\n </>\n )}\n {quoteWarning && (\n <>\n <Alert\n variant=\"alarm\"\n type=\"warning\"\n title={getQuoteUpdateWarningMessage(quoteWarning)}\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 variant=\"title\" size=\"xmedium\">\n {i18n.t({\n id: 'Your {blockchainName} wallets',\n values: { blockchainName: blockchain?.shortName },\n })}\n </Typography>\n <Typography\n variant=\"label\"\n color=\"$neutral700\"\n size=\"medium\">\n {i18n.t({\n id: 'You need to connect a {blockchainName} wallet.',\n values: { blockchainName: blockchain?.shortName },\n })}\n </Typography>\n </Title>\n <Divider size={24} />\n <ListContainer>\n <WalletList\n chain={requiredWallet}\n isSelected={isSelected}\n selectWallet={onChange}\n limit={NUMBER_OF_WALLETS_TO_DISPLAY}\n onShowMore={() =>\n setShowMoreWalletFor(blockchain?.name ?? '')\n }\n />\n </ListContainer>\n {!isLastWallet && <Divider size={32} />}\n {isLastWallet && config?.customDestination && (\n <CustomDestination>\n <CustomCollapsible\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 hasSelected\n open={showCustomDestination}\n triggerAnchor=\"top\"\n trigger={\n <CustomDestinationButton>\n <div className=\"button__content\">\n <WalletIcon size={18} color=\"info\" />\n <Divider size={4} direction=\"horizontal\" />\n <Typography variant=\"label\" size=\"medium\">\n {i18n.t('Send to a different address')}\n </Typography>\n </div>\n <ExpandedIcon\n orientation={\n showCustomDestination ? 'up' : 'down'\n }>\n <ChevronDownIcon size={10} color=\"gray\" />\n </ExpandedIcon>\n </CustomDestinationButton>\n }\n onClickTrigger={() =>\n setShowCustomDestination((prev) => !prev)\n }>\n <Divider size={4} />\n <StyledTextField\n autoFocus\n placeholder={i18n.t('Your destination address')}\n value={customDestination || ''}\n onChange={(e) => {\n const value = e.target.value;\n if (!value.length) {\n setShowCustomDestination(false);\n setCustomDestination(null);\n } else {\n setCustomDestination(value.length ? value : null);\n }\n }}\n />\n </CustomCollapsible>\n\n {isAddressMatched && (\n <div className={alarmsStyles()}>\n <Alert\n variant=\"alarm\"\n type=\"error\"\n title={i18n.t({\n values: { destination: customDestination },\n id: \"Address {destination} doesn't match the blockchain address pattern.\",\n })}\n />\n </div>\n )}\n </CustomDestination>\n )}\n </div>\n );\n })}\n </Wallets>\n </>\n )}\n </WatermarkedModal>\n );\n}\n", "import type { QuoteUpdateWarning } from '../types';\n\nimport { i18n } from '@lingui/core';\n\nimport { QuoteUpdateType } from '../types';\n\nexport function getQuoteUpdateWarningMessage(warning: QuoteUpdateWarning) {\n switch (warning.type) {\n case QuoteUpdateType.QUOTE_UPDATED:\n return i18n.t('Route has been updated.');\n case QuoteUpdateType.QUOTE_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 QuoteUpdateType.QUOTE_SWAPPERS_UPDATED:\n return i18n.t('Route swappers has been updated.');\n case QuoteUpdateType.QUOTE_COINS_UPDATED:\n return i18n.t('Route internal coins has been updated.');\n default:\n return '';\n }\n}\n", "import type { ModalPropTypes } from '@rango-dev/ui';\nimport type { PropsWithChildren } from 'react';\n\nimport { Modal } from '@rango-dev/ui';\nimport React from 'react';\n\nimport { useUiStore } from '../../../store/ui';\n\nexport function WatermarkedModal(props: PropsWithChildren<ModalPropTypes>) {\n const { watermark } = useUiStore();\n\n const hasWatermark = watermark === 'FULL';\n return (\n <Modal hasWatermark={hasWatermark} {...props}>\n {props.children}\n </Modal>\n );\n}\n", "import type { PropTypes } from './CustomCollapsible.types';\nimport type { PropsWithChildren } from 'react';\n\nimport React, { useRef } from 'react';\n\nimport {\n CollapsibleContent,\n CollapsibleRoot,\n Trigger,\n} from './CustomCollapsible.styles';\n\nexport function CustomCollapsible(props: PropsWithChildren<PropTypes>) {\n const {\n open,\n hasSelected,\n onOpenChange,\n children,\n onClickTrigger,\n trigger,\n triggerAnchor,\n } = props;\n const ref = useRef<HTMLDivElement | null>(null);\n\n return (\n <CollapsibleRoot\n ref={ref}\n className=\"collapsible_root\"\n selected={hasSelected && open}\n open={open}\n onOpenChange={onOpenChange}>\n {triggerAnchor === 'top' && (\n <Trigger className=\"collapsible_trigger\" onClick={onClickTrigger}>\n {trigger}\n </Trigger>\n )}\n <CollapsibleContent className=\"collapsible_content\" open={open}>\n {children}\n </CollapsibleContent>\n {triggerAnchor === 'bottom' && (\n <Trigger className=\"collapsible_trigger\" onClick={onClickTrigger}>\n {trigger}\n </Trigger>\n )}\n </CollapsibleRoot>\n );\n}\n", "import * as Collapsible from '@radix-ui/react-collapsible';\nimport { keyframes, styled } from '@rango-dev/ui';\n\nexport const EXPANDABLE_TRANSITION_DURATION = 300;\n\nconst slideDown = keyframes({\n from: {\n height: 0,\n },\n to: {\n height: 'var(--radix-collapsible-content-height)',\n },\n});\n\nconst slideUp = keyframes({\n from: {\n height: 'var(--radix-collapsible-content-height)',\n },\n to: {\n height: 0,\n },\n});\n\nexport const CollapsibleRoot = styled(Collapsible.Root, {\n borderRadius: '$sm',\n variants: {\n selected: {\n true: {\n outlineWidth: 1,\n outlineColor: '$secondary500',\n outlineStyle: 'solid',\n },\n },\n },\n});\n\nexport const Trigger = styled(Collapsible.Trigger, {\n padding: '$0',\n border: 'none',\n outline: 'none',\n width: '100%',\n backgroundColor: 'transparent',\n fontFamily: 'inherit',\n cursor: 'pointer',\n});\n\nexport const CollapsibleContent = styled(Collapsible.Content, {\n overflow: 'hidden',\n variants: {\n open: {\n true: {\n animation: `${slideDown} ${EXPANDABLE_TRANSITION_DURATION}ms ease-out`,\n },\n false: {\n animation: `${slideUp} ${EXPANDABLE_TRANSITION_DURATION}ms ease-out`,\n },\n },\n },\n});\n\nexport const ExpandedIcon = styled('div', {\n transition: `all ${EXPANDABLE_TRANSITION_DURATION}ms ease`,\n display: 'flex',\n alignItems: 'center',\n variants: {\n orientation: {\n down: {\n transform: 'rotate(0)',\n },\n up: {\n transform: 'rotate(180deg)',\n },\n },\n },\n});\n", "import { css, darkTheme, IconButton, styled, TextField } from '@rango-dev/ui';\n\nexport const Title = styled('div', {\n display: 'flex',\n flexDirection: 'column',\n justifyContent: 'center',\n alignItems: 'center',\n});\n\nexport const ListContainer = styled('div', {\n display: 'flex',\n justifyContent: 'space-evenly',\n alignItems: 'center',\n gap: '$10',\n flexWrap: 'wrap',\n paddingTop: '$5',\n height: '100%',\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});\n\nexport const ShowMoreWallets = styled(WalletButton, {\n alignSelf: 'stretch',\n minHeight: '93px',\n});\nexport const ShowMoreHeader = styled('div', {\n padding: '$20 $20 $15 $20',\n display: 'flex',\n justifyContent: 'center',\n alignItems: 'center',\n backgroundColor: '$neutral200',\n position: 'relative',\n width: '100%',\n});\n\nexport const NavigateBack = styled(IconButton, {\n position: 'absolute',\n left: '$20',\n});\n\nexport const WalletsContainer = styled('div', {\n paddingTop: '$20',\n});\n\nexport const walletsListStyles = css({\n display: 'flex',\n justifyContent: 'space-evenly',\n alignItems: 'center',\n gap: '$10',\n flexWrap: 'wrap',\n paddingTop: '$5',\n height: '100%',\n});\n\nexport const CustomDestination = styled('div', {\n padding: '$10 $0',\n '& .button__content': {\n display: 'flex',\n alignItems: 'center',\n },\n '& .alarms': { paddingTop: '$5' },\n '& .collapsible_content': {\n backgroundColor: '$neutral100',\n },\n '& .collapsible_root': {\n backgroundColor: '$neutral200',\n },\n});\n\nexport const alarmsStyles = css({\n paddingTop: '$5',\n});\n\nexport const ConfirmButton = styled('div', {\n display: 'flex',\n});\n\nexport const StyledTextField = styled(TextField, {\n backgroundColor: '$neutral100',\n padding: '$0 $15 $15 $15',\n});\n\nexport const Wallets = styled('div', { overflow: 'visible', width: '100%' });\n\nexport const CustomDestinationButton = styled('div', {\n width: '100%',\n borderRadius: '$sm',\n display: 'flex',\n padding: '$15',\n justifyContent: 'space-between',\n alignItems: 'center',\n $$color: '$colors$neutral100',\n [`.${darkTheme} &`]: {\n $$color: '$colors$neutral300',\n },\n backgroundColor: '$$color',\n\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", "import 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 { i18n } from '@lingui/core';\nimport {\n Button,\n Divider,\n Image,\n MessageBox,\n SelectableWallet,\n Typography,\n WalletState,\n} from '@rango-dev/ui';\nimport React, { useEffect, useState } from 'react';\n\nimport { useWallets } from '../..';\nimport { WIDGET_UI_ID } from '../../constants';\nimport { useWalletList } from '../../hooks/useWalletList';\nimport {\n TIME_TO_CLOSE_MODAL,\n TIME_TO_IGNORE_MODAL,\n} from '../../pages/WalletsPage';\nimport { useAppStore } from '../../store/AppStore';\nimport { useUiStore } from '../../store/ui';\nimport { useWalletsStore } from '../../store/wallets';\nimport { getBlockchainDisplayNameFor } from '../../utils/meta';\nimport {\n getAddress,\n getConciseAddress,\n isExperimentalChain,\n} from '../../utils/wallets';\nimport { WatermarkedModal } from '../common/WatermarkedModal';\nimport { WalletModal } from '../WalletModal';\n\nimport { ShowMoreWallets } from './ConfirmWallets.styles';\nimport {\n LogoContainer,\n Spinner,\n WalletImageContainer,\n} from './WalletList.styles';\n\nconst ACCOUNT_ADDRESS_MAX_CHARACTERS = 7;\nexport function WalletList(props: PropTypes) {\n const { chain, isSelected, selectWallet, limit, onShowMore } = props;\n const { config } = useAppStore();\n const isActiveTab = useUiStore.use.isActiveTab();\n\n const connectedWallets = useWalletsStore.use.connectedWallets();\n const { blockchains } = useAppStore();\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' | 'rejected' | null>(null);\n const { suggestAndConnect } = useWallets();\n let modalTimerId: ReturnType<typeof setTimeout> | null = null;\n const { list, error, handleClick, disconnectConnectingWallets } =\n useWalletList({\n config,\n chain,\n onBeforeConnect: (type) => {\n modalTimerId = setTimeout(() => {\n setOpenWalletStateModal(type);\n }, TIME_TO_IGNORE_MODAL);\n },\n onConnect: () => {\n if (modalTimerId) {\n clearTimeout(modalTimerId);\n }\n setTimeout(() => {\n setOpenWalletStateModal('');\n }, TIME_TO_CLOSE_MODAL);\n },\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 try {\n await suggestAndConnect(wallet.walletType, wallet.chain);\n setAddingExperimentalChainStatus('completed');\n } catch (e) {\n setAddingExperimentalChainStatus('rejected');\n }\n };\n\n useEffect(() => {\n setSortedList((sortedList) => {\n const selectedWalletIndex = list.findIndex((wallet) =>\n isSelected(wallet.type, chain)\n );\n\n if (shouldShowMoreWallets && selectedWalletIndex > 1) {\n return [list[selectedWalletIndex]].concat(\n list.filter((_, index) => index !== selectedWalletIndex)\n );\n }\n return sortedList.map(\n (sortedItem) =>\n list.find((listItem) => listItem.type === sortedItem.type) ??\n sortedItem\n );\n });\n }, [JSON.stringify(list)]);\n\n const modalContainer = document.getElementById(\n WIDGET_UI_ID.SWAP_BOX_ID\n ) as HTMLDivElement;\n\n useEffect(() => {\n let timeout: ReturnType<typeof setTimeout> | null = null;\n if (\n addingExperimentalChainStatus === 'completed' ||\n addingExperimentalChainStatus === 'rejected'\n ) {\n timeout = setTimeout(\n () => setAddingExperimentalChainStatus(null),\n TIME_TO_CLOSE_MODAL\n );\n }\n\n return () => {\n if (timeout) {\n clearTimeout(timeout);\n }\n };\n }, [addingExperimentalChainStatus]);\n\n const handleCloseWalletModal = () => {\n disconnectConnectingWallets();\n setOpenWalletStateModal('');\n };\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\n ? getConciseAddress(address, ACCOUNT_ADDRESS_MAX_CHARACTERS)\n : '';\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 ? i18n.t({\n id: 'Add {chain} chain',\n values: { chain },\n })\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 <React.Fragment key={`${wallet.title}_${blockchainDisplayName}`}>\n <WalletModal\n open={openWalletStateModal === wallet.type}\n onClose={handleCloseWalletModal}\n image={wallet.image}\n state={wallet.state}\n error={error}\n />\n {!!experimentalChainWallet && (\n <WatermarkedModal\n open={!!experimentalChainWallet && showExperimentalChainModal}\n container={modalContainer}\n onClose={() => {\n setExperimentalChainWallet(null);\n }}>\n <MessageBox\n title={i18n.t({\n id: 'Add {blockchainDisplayName} Chain',\n values: { blockchainDisplayName },\n })}\n type=\"warning\"\n description={i18n.t({\n id: 'You should connect a {blockchainDisplayName} supported wallet or choose a different {blockchainDisplayName} address',\n values: { blockchainDisplayName },\n })}>\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 {i18n.t('Confirm')}\n </Button>\n </MessageBox>\n </WatermarkedModal>\n )}\n {addingExperimentalChainStatus && (\n <WatermarkedModal\n open={!!addingExperimentalChainStatus}\n onClose={setAddingExperimentalChainStatus.bind(null, null)}\n container={modalContainer}>\n {addingExperimentalChainStatus === 'in-progress' && (\n <MessageBox\n type=\"loading\"\n title={i18n.t({\n id: 'Add {blockchainDisplayName} Chain',\n values: { blockchainDisplayName },\n })}\n description={i18n.t({\n id: 'You should connect a {blockchainDisplayName} supported wallet or choose a different {blockchainDisplayName} address',\n values: { blockchainDisplayName },\n })}\n icon={\n <LogoContainer>\n <WalletImageContainer>\n <Image src={wallet.image} size={45} />\n </WalletImageContainer>\n <Spinner />\n </LogoContainer>\n }\n />\n )}\n\n {addingExperimentalChainStatus === 'completed' && (\n <MessageBox\n type=\"success\"\n title={i18n.t({\n id: '{blockchainDisplayName} Chain Added',\n values: { blockchainDisplayName },\n })}\n description={i18n.t({\n id: '{blockchainDisplayName} is added to your wallet, you can use it to swap.',\n values: { blockchainDisplayName },\n })}\n />\n )}\n\n {addingExperimentalChainStatus === 'rejected' && (\n <MessageBox\n type=\"error\"\n title={i18n.t('Request Rejected')}\n description={i18n.t({\n id: \"You've rejected adding {blockchainDisplayName} chain to your wallet.\",\n values: { blockchainDisplayName },\n })}\n />\n )}\n\n <Divider direction=\"vertical\" size={32} />\n </WatermarkedModal>\n )}\n <SelectableWallet\n key={wallet.type}\n description={connectedWalletDescription}\n onClick={onClick}\n selected={isSelected(wallet.type, chain)}\n disabled={!isActiveTab}\n {...wallet}\n />\n </React.Fragment>\n );\n })}\n {shouldShowMoreWallets && (\n <ShowMoreWallets selected={false} onClick={onShowMore}>\n <Typography variant=\"label\" size=\"medium\">\n {i18n.t('Show more wallets')}\n <Typography variant=\"label\" size=\"medium\" color=\"$primary\">\n +{numberOfSupportedWallets - (limit ?? 0)}\n </Typography>\n </Typography>\n </ShowMoreWallets>\n )}\n </>\n );\n}\n", "import type { WidgetConfig } from '../types';\nimport type { WalletInfo } from '@rango-dev/ui';\nimport type { BlockchainMeta } from 'rango-sdk';\n\nimport { WalletState } from '@rango-dev/ui';\nimport { useWallets } from '@rango-dev/wallets-react';\nimport {\n KEPLR_COMPATIBLE_WALLETS,\n type WalletType,\n WalletTypes,\n} from '@rango-dev/wallets-shared';\nimport { useCallback, useEffect, useState } from 'react';\n\nimport { useAppStore } from '../store/AppStore';\nimport { useWalletsStore } from '../store/wallets';\nimport { configWalletsToWalletName } from '../utils/providers';\nimport {\n hashWalletsState,\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 = useAppStore().blockchains();\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 (!config?.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 = useCallback(() => {\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 }, [hashWalletsState(wallets)]);\n\n useEffect(() => {\n return () => {\n disconnectConnectingWallets();\n };\n }, []);\n\n /*\n * Atm, we only support default injected wallet for the EVM\n * so we show default wallet when there is no other evm wallet installed\n * but we have ethereum injected\n */\n const shouldShowDefaultInjectedWallet = (wallets: WalletInfo[]) => {\n const isEvmWalletInstalledExceptDefault = wallets.filter(\n (wallet) =>\n wallet.state != WalletState.NOT_INSTALLED &&\n ![WalletTypes.DEFAULT, WalletTypes.WALLET_CONNECT_2].includes(\n wallet.type as WalletTypes\n ) &&\n getWalletInfo(wallet.type).supportedChains.filter(\n (blockchain) => blockchain.type == 'EVM'\n ).length > 0\n );\n return isEvmWalletInstalledExceptDefault.length == 0;\n };\n\n const shouldExcludeWallet = (\n walletType: string,\n chain: string,\n blockchains: BlockchainMeta[]\n ) => {\n return (\n (isExperimentalChain(blockchains, chain) &&\n isExperimentalChainNotAdded(walletType) &&\n !KEPLR_COMPATIBLE_WALLETS.includes(walletType)) ||\n (walletType == WalletTypes.DEFAULT &&\n !shouldShowDefaultInjectedWallet(wallets))\n );\n };\n\n return {\n list: sortedWallets.filter(\n (wallet) => !shouldExcludeWallet(wallet.type, chain ?? '', blockchains)\n ),\n error,\n handleClick,\n disconnectConnectingWallets,\n };\n}\n", "import type { WalletType } from '@rango-dev/wallets-shared';\n\nimport { i18n } from '@lingui/core';\nimport { styled, Typography, Wallet, WalletState } from '@rango-dev/ui';\nimport React, { useState } from 'react';\n\nimport { Layout, PageContainer } from '../components/Layout';\nimport { WalletModal } from '../components/WalletModal';\nimport { useWalletList } from '../hooks/useWalletList';\nimport { useAppStore } from '../store/AppStore';\nimport { useUiStore } from '../store/ui';\nimport { getContainer } from '../utils/common';\n\nconst ListContainer = styled('div', {\n display: 'flex',\n justifyContent: 'space-evenly',\n alignItems: 'center',\n gap: '$10',\n flexWrap: 'wrap',\n paddingTop: '$5',\n height: '100%',\n});\n\nconst Container = styled(PageContainer, {\n textAlign: 'center',\n});\n\nexport const TIME_TO_CLOSE_MODAL = 3_000;\nexport const TIME_TO_IGNORE_MODAL = 300;\n\nexport function WalletsPage() {\n const { config, fetchStatus: fetchMetaStatus } = useAppStore();\n const [openModal, setOpenModal] = useState(false);\n const [selectedWalletType, setSelectedWalletType] = useState<WalletType>('');\n let modalTimerId: ReturnType<typeof setTimeout> | null = null;\n const isActiveTab = useUiStore.use.isActiveTab();\n\n const { list, handleClick, error, disconnectConnectingWallets } =\n useWalletList({\n config,\n onBeforeConnect: (type) => {\n modalTimerId = setTimeout(() => {\n setOpenModal(true);\n setSelectedWalletType(type);\n }, TIME_TO_IGNORE_MODAL);\n },\n onConnect: () => {\n if (modalTimerId) {\n clearTimeout(modalTimerId);\n }\n setTimeout(() => {\n setOpenModal(false);\n }, TIME_TO_CLOSE_MODAL);\n },\n });\n\n const handleCloseWalletModal = () => {\n disconnectConnectingWallets();\n setOpenModal(false);\n };\n\n const selectedWallet = list.find(\n (wallet) => wallet.type === selectedWalletType\n );\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 }}>\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 <Wallet\n key={key}\n {...wallet}\n container={getContainer()}\n onClick={(type) => {\n void handleClick(type);\n }}\n isLoading={fetchMetaStatus === 'loading'}\n disabled={!isActiveTab}\n />\n );\n })}\n <WalletModal\n open={!!openModal}\n onClose={handleCloseWalletModal}\n image={selectedWalletImage}\n state={selectedWalletState}\n error={error}\n />\n </ListContainer>\n </Container>\n </Layout>\n );\n}\n", "import type { PropTypes } from './Layout.types';\nimport type { PendingSwap } from 'rango-types';\nimport type { PropsWithChildren } from 'react';\n\nimport { useManager } from '@rango-dev/queue-manager-react';\nimport { BottomLogo, Divider, Header } from '@rango-dev/ui';\nimport React, { useEffect, useRef } from 'react';\n\nimport { WIDGET_UI_ID } from '../../constants';\nimport { useIframe } from '../../hooks/useIframe';\nimport { isAppLoadedIntoIframe } from '../../hooks/useIframe/useIframe.helpers';\nimport { useNavigateBack } from '../../hooks/useNavigateBack';\nimport { useTheme } from '../../hooks/useTheme';\nimport { useAppStore } from '../../store/AppStore';\nimport { tabManager, useUiStore } from '../../store/ui';\nimport { useWalletsStore } from '../../store/wallets';\nimport { getContainer } from '../../utils/common';\nimport { getPendingSwaps } from '../../utils/queue';\nimport { isFeatureHidden } from '../../utils/settings';\nimport { ActivateTabAlert } from '../common/ActivateTabAlert';\nimport { ActivateTabModal } from '../common/ActivateTabModal';\nimport { BackButton, CancelButton, WalletButton } from '../HeaderButtons';\n\nimport { onScrollContentAttachStatusToContainer } from './Layout.helpers';\nimport { Container, Content, Footer, LayoutContainer } from './Layout.styles';\n\nfunction Layout(props: PropsWithChildren<PropTypes>) {\n const { connectHeightObserver, disconnectHeightObserver } = useIframe();\n const { children, header, footer, height = 'fixed' } = props;\n const connectedWallets = useWalletsStore.use.connectedWallets();\n const {\n config: { features, theme },\n } = useAppStore();\n const { watermark } = useUiStore();\n\n const hasWatermark = watermark === 'FULL';\n const { activeTheme } = useTheme(theme || {});\n\n const isConnectWalletHidden = isFeatureHidden(\n 'connectWalletButton',\n features\n );\n\n const {\n isActiveTab,\n tabManagerInitiated,\n showActivateTabModal,\n setShowActivateTabModal,\n activateCurrentTab,\n } = useUiStore();\n const navigateBack = useNavigateBack();\n const { manager } = useManager();\n const pendingSwaps: PendingSwap[] = getPendingSwaps(manager).map(\n ({ swap }) => swap\n );\n const hasRunningSwap = pendingSwaps.some((swap) => swap.status === 'running');\n\n const onActivateTab = () =>\n activateCurrentTab(tabManager.forceClaim, hasRunningSwap);\n\n const onConnectWallet = () => {\n header.onWallet?.();\n };\n\n const showBackButton =\n typeof header.hasBackButton === 'undefined' || header.hasBackButton;\n\n const scrollViewRef = useRef<HTMLDivElement>(null);\n const containerRef = useRef<HTMLDivElement>(null);\n\n useEffect(() => {\n const isIframe = isAppLoadedIntoIframe();\n\n // This feature only will be available in an iframe context.\n if (isIframe && containerRef.current) {\n connectHeightObserver(containerRef.current);\n }\n\n return () => {\n disconnectHeightObserver();\n };\n }, []);\n\n useEffect(() => {\n scrollViewRef.current?.addEventListener(\n 'scroll',\n onScrollContentAttachStatusToContainer\n );\n return () => {\n scrollViewRef.current?.removeEventListener(\n 'scroll',\n onScrollContentAttachStatusToContainer\n );\n };\n }, []);\n\n return (\n <Container\n height={height}\n id={WIDGET_UI_ID.SWAP_BOX_ID}\n className={`${activeTheme()} ${LayoutContainer()}`}\n ref={containerRef}>\n <Header\n prefix={\n <>\n {showBackButton && (\n <BackButton\n onClick={() => {\n navigateBack();\n // As an example, used in routes page to add a custom logic when navigating back to the home page.\n header.onBack && header.onBack();\n }}\n />\n )}\n </>\n }\n title={header.title}\n suffix={\n <>\n {header.suffix}\n {header.onWallet && !isConnectWalletHidden && (\n <WalletButton\n container={getContainer()}\n onClick={onConnectWallet}\n isConnected={!!connectedWallets?.length}\n />\n )}\n {header.onCancel && <CancelButton onClick={header.onCancel} />}\n </>\n }\n />\n <Content ref={scrollViewRef}>{children}</Content>\n <ActivateTabModal\n open={showActivateTabModal}\n onClose={() => setShowActivateTabModal(false)}\n onConfirm={onActivateTab}\n />\n\n <Footer>\n <div className=\"footer__content\">\n {tabManagerInitiated && !isActiveTab && (\n <div className=\"footer__alert\">\n <ActivateTabAlert onActivateTab={onActivateTab} />\n <Divider size={10} />\n </div>\n )}\n {footer}\n </div>\n\n <Divider size={12} />\n\n <div\n className={`footer__logo ${\n hasWatermark ? 'logo__show' : 'logo__hidden'\n }`}>\n <BottomLogo />\n </div>\n </Footer>\n </Container>\n );\n}\nexport { Layout };\n", "import type { Messages } from './useIframe.types';\n\nimport { useRef } from 'react';\n\nimport { useAppStore } from '../../store/AppStore';\n\nimport { isAppLoadedIntoIframe } from './useIframe.helpers';\n\ninterface UseIframe {\n send: (message: Messages) => void;\n connectHeightObserver: (element: HTMLElement) => void;\n disconnectHeightObserver: () => void;\n}\n\nfunction useIframe(): UseIframe {\n const heightObserver = useRef<ResizeObserver | null>(null);\n const { iframe } = useAppStore();\n const isMessagePassingAvailable = isAppLoadedIntoIframe() && iframe.clientUrl;\n\n const send = (message: Messages) => {\n if (isMessagePassingAvailable) {\n window.top?.postMessage(message, iframe.clientUrl!);\n }\n };\n\n const connectHeightObserver = (element: HTMLElement) => {\n heightObserver.current = new ResizeObserver((entries) => {\n for (const entry of entries) {\n send({\n type: 'widget_height',\n data: {\n height: entry.contentRect.height,\n },\n });\n }\n });\n\n heightObserver.current.observe(element);\n };\n\n const disconnectHeightObserver = () => {\n if (heightObserver.current) {\n heightObserver.current.disconnect();\n heightObserver.current = null;\n }\n };\n\n return {\n send,\n connectHeightObserver,\n disconnectHeightObserver,\n };\n}\n\nexport { useIframe };\n", "export function isAppLoadedIntoIframe() {\n return window.self !== window.top;\n}\n", "import { useNavigate } from 'react-router-dom';\n\nexport function useNavigateBack(): () => void {\n const navigate = useNavigate();\n return () => navigate(-1);\n}\n", "/* eslint-disable @typescript-eslint/no-magic-numbers */\nimport {\n createTheme,\n darkTheme as defaultDarkTheme,\n lightTheme as defaultLightTheme,\n} from '@rango-dev/ui';\nimport { useEffect, useState } from 'react';\n\nimport { useAppStore } from '../store/AppStore';\nimport { type WidgetTheme } from '../types';\nimport {\n DEFAULT_FONT_FAMILY,\n DEFAULT_PRIMARY_RADIUS,\n DEFAULT_SECONDARY_RADIUS,\n} from '../utils/configs';\nimport { customizedThemeTokens } from '../utils/ui';\n\nexport function useTheme(props: WidgetTheme) {\n const {\n colors,\n fontFamily = DEFAULT_FONT_FAMILY,\n borderRadius = DEFAULT_PRIMARY_RADIUS,\n secondaryBorderRadius = DEFAULT_SECONDARY_RADIUS,\n mode = 'auto',\n } = props;\n\n const [OSTheme, setOSTheme] = useState('light');\n\n const { setTheme, theme } = useAppStore();\n\n const { dark, light } = customizedThemeTokens(colors);\n\n const baseTheme = createTheme({\n radii: {\n primary: `${borderRadius}px`,\n secondary: `${secondaryBorderRadius}px`,\n },\n fonts: {\n widget: fontFamily,\n },\n });\n const lightThemeClasses = [baseTheme.className, defaultLightTheme.className];\n const darkThemeClasses = [baseTheme.className, defaultDarkTheme.className];\n\n /*\n * If theme has been customized, we will push the customized theme to override the default themes.\n * To be overridden, it should be last thing that has been pushed.\n */\n if (light) {\n const customizedLightTheme = createTheme(light.id, light.tokens);\n lightThemeClasses.push(customizedLightTheme.className);\n }\n if (dark) {\n const customizedDarkTheme = createTheme(dark.id, dark.tokens);\n darkThemeClasses.push(customizedDarkTheme.className);\n }\n\n useEffect(() => {\n const switchThemeListener = (event: MediaQueryListEvent) => {\n if (event.matches) {\n setOSTheme('dark');\n } else {\n setOSTheme('light');\n }\n };\n\n if (\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', switchThemeListener);\n return () => {\n window\n .matchMedia('(prefers-color-scheme: dark)')\n .removeEventListener('change', switchThemeListener);\n };\n }, []);\n\n useEffect(() => {\n if (mode !== 'auto') {\n setTheme(mode);\n }\n }, [mode]);\n\n const getActiveTheme = () => {\n const lightClassNames = lightThemeClasses.join(' ');\n const darkClassNames = darkThemeClasses.join(' ');\n if (theme === 'auto') {\n return OSTheme === 'dark' ? darkClassNames : lightClassNames;\n }\n return theme === 'dark' ? darkClassNames : lightClassNames;\n };\n\n return { activeTheme: getActiveTheme };\n}\n", "/* eslint-disable @typescript-eslint/no-magic-numbers */\nimport type { WidgetTheme } from '../types';\nimport type { createTheme } from '@rango-dev/ui';\n\nimport {\n theme as baseThemeTokens,\n darkColors as defaultDarkColors,\n} from '@rango-dev/ui';\nimport React from 'react';\n\nimport { generateColors } from '../utils/colors';\nimport { toHash } from '../utils/hash';\n\nimport { THEME_CLASS_NAME_PREFIX } from './configs';\n\ninterface CustomizedThemeValues {\n id: string;\n tokens: Parameters<typeof createTheme>[0];\n}\n\ninterface CustomizedTheme {\n light: undefined | CustomizedThemeValues;\n dark: undefined | CustomizedThemeValues;\n}\n\nexport function customizedThemeTokens(\n colors: WidgetTheme['colors']\n): CustomizedTheme {\n const baseColors = baseThemeTokens.colors;\n\n const darkColorsWithDefaults = generateColors(\n {\n ...baseColors,\n ...defaultDarkColors,\n },\n true,\n colors?.dark\n );\n const lightColorsWithDefaults = generateColors(\n baseColors,\n false,\n colors?.light\n );\n const hasDefaultDarkColors = Object.keys(darkColorsWithDefaults).length > 0;\n const hasDefaultLightColors = Object.keys(lightColorsWithDefaults).length > 0;\n\n let light: CustomizedTheme['light'] = undefined;\n let dark: CustomizedTheme['dark'] = undefined;\n\n if (hasDefaultLightColors) {\n const tokens = { colors: lightColorsWithDefaults };\n const id = `${THEME_CLASS_NAME_PREFIX}-light-${toHash(tokens)}`;\n light = {\n id,\n tokens,\n };\n }\n if (hasDefaultDarkColors) {\n const tokens = {\n colors: darkColorsWithDefaults,\n };\n const id = `${THEME_CLASS_NAME_PREFIX}-dark-${toHash(tokens)}`;\n dark = {\n id,\n tokens,\n };\n }\n\n return {\n light,\n dark,\n };\n}\n\nexport function joinList(\n list: { element: React.JSX.Element; key: string }[],\n divider: React.JSX.Element\n) {\n if (list.length <= 1) {\n return list.map(({ element, key }) => React.cloneElement(element, { key }));\n }\n\n const output: React.JSX.Element[] = [];\n list.forEach((item, index) => {\n const { element, key } = item;\n output.push(React.cloneElement(element, { key }));\n if (index < list.length - 1) {\n const key = `divider-${index}`;\n output.push(React.cloneElement(divider, { key }));\n }\n });\n\n return output;\n}\n", "import type { WidgetColors, WidgetColorsKeys } from '../types';\n\nexport function generateShades(\n baseColor: string,\n prefix: string,\n reverse?: boolean\n): { [key: string]: string } {\n const BASE_SHADE_INDEX = 100;\n const NUMBER_OF_COLORS = 9;\n const SHADING_INCREMENT_MAX = 10; // For bright colors\n const SHADING_INCREMENT_MIN = 6; // For dark colors\n\n const HALF_NUMBER_OF_COLORS = 4;\n\n const shadeIncrements: number[] = [];\n let increment = 90;\n for (let i = 0; i < NUMBER_OF_COLORS; i++) {\n shadeIncrements.push(increment);\n if (i + 1 === HALF_NUMBER_OF_COLORS) {\n increment = 0;\n } else {\n increment -=\n i >= HALF_NUMBER_OF_COLORS\n ? SHADING_INCREMENT_MIN\n : SHADING_INCREMENT_MAX;\n }\n }\n\n // If 'reverse' is true, that means the color should be from dark to light\n const decrementAmounts = reverse\n ? shadeIncrements.slice().reverse()\n : shadeIncrements;\n\n const shades: { [key: string]: string } = {};\n\n // Generate shades\n for (let i = 0; i < NUMBER_OF_COLORS; i++) {\n const shadeIndex = BASE_SHADE_INDEX + i * BASE_SHADE_INDEX;\n const decrementAmount = decrementAmounts[i];\n\n const shade: { [key: string]: string } = {\n [`${prefix}${shadeIndex}`]: generateShade(baseColor, decrementAmount),\n };\n Object.assign(shades, shade);\n }\n\n return { ...shades, [prefix]: baseColor };\n}\n\nexport function generateShade(\n baseColor: string,\n decrementAmount: number\n): string {\n const [r, g, b] = convertToRGB(baseColor);\n return `#${clamp(r + decrementAmount)}${clamp(g + decrementAmount)}${clamp(\n b + decrementAmount\n )}`;\n}\n\nexport function convertToRGB(baseColor: string): number[] {\n const COLOR_SLICE_START = 1;\n const COLOR_SLICE_END = 3;\n const BASE_COLOR_LENGTH = 7;\n\n // Convert the base color to RGB components\n const r: number = parseInt(\n baseColor.slice(COLOR_SLICE_START, COLOR_SLICE_END),\n 16\n );\n const g: number = parseInt(\n baseColor.slice(COLOR_SLICE_END, COLOR_SLICE_END + 2),\n 16\n );\n const b: number = parseInt(\n baseColor.slice(COLOR_SLICE_END + 2, BASE_COLOR_LENGTH),\n 16\n );\n\n return [r, g, b];\n}\n\n// Function to clamp color component to valid range [0, 255] and convert to hex\nfunction clamp(color: number): string {\n const MAX_COLOR_VALUE = 255;\n const HEX_BASE = 16;\n const HEX_LENGTH = -2;\n return (\n '0' + Math.max(0, Math.min(MAX_COLOR_VALUE, color)).toString(HEX_BASE)\n )\n .slice(HEX_LENGTH)\n .toUpperCase();\n}\n\nexport function isBright(baseColor: string) {\n const BRIGHTNESS_THRESHOLD = 188;\n const RED_COEFFICIENT = 299;\n const GREEN_COEFFICIENT = 587;\n const BLUE_COEFFICIENT = 114;\n const BRIGHTNESS_DIVISOR = 1000;\n\n const [r, g, b] = convertToRGB(baseColor);\n const brightness =\n (r * RED_COEFFICIENT + g * GREEN_COEFFICIENT + b * BLUE_COEFFICIENT) /\n BRIGHTNESS_DIVISOR;\n if (brightness > BRIGHTNESS_THRESHOLD) {\n return true;\n }\n return false;\n}\n\nexport const generateColors = (\n mainColors: { [x: string]: string },\n reverseNeutralRange: boolean,\n colors?: WidgetColors\n) => {\n if (!colors || !Object.entries(colors).length) {\n return {};\n }\n let changeColors = false;\n let listOfColors = { ...mainColors };\n for (const colorKey in colors) {\n const color = colors[colorKey as WidgetColorsKeys];\n\n if (!!color && color !== mainColors[colorKey]) {\n changeColors = true;\n if (colorKey === 'background' || colorKey === 'foreground') {\n listOfColors = {\n ...listOfColors,\n [colorKey]: color,\n };\n } else {\n const reverse = colorKey === 'neutral' && reverseNeutralRange;\n listOfColors = {\n ...listOfColors,\n ...generateShades(color, colorKey, reverse),\n };\n }\n }\n }\n return changeColors ? listOfColors : {};\n};\n", "/* eslint-disable @typescript-eslint/no-magic-numbers */\n// Original Code: https://github.com/stitchesjs/stitches/blob/canary/packages/core/src/convert/toHash.js\n\nconst toAlphabeticChar = (code: number) =>\n String.fromCharCode(code + (code > 25 ? 39 : 97));\n\nconst toAlphabeticName = (code: number) => {\n let name = '';\n let x;\n\n for (x = Math.abs(code); x > 52; x = (x / 52) | 0) {\n name = toAlphabeticChar(x % 52) + name;\n }\n\n return toAlphabeticChar(x % 52) + name;\n};\n\nconst toPhash = (h: number, x: string) => {\n let i = x.length;\n while (i) {\n h = (h * 33) ^ x.charCodeAt(--i);\n }\n return h;\n};\n\nexport const toHash = (value: object) =>\n toAlphabeticName(toPhash(5381, JSON.stringify(value)) >>> 0);\n", "import type { Manager } from '@rango-dev/queue-manager-core';\nimport type {\n PendingSwapWithQueueID,\n SwapStorage,\n} from '@rango-dev/queue-manager-rango-preset';\n\nexport const getPendingSwaps = (manager: Manager | undefined) => {\n const result: PendingSwapWithQueueID[] = [];\n\n manager?.getAll().forEach((q, id) => {\n const storage = q.list.getStorage() as SwapStorage;\n\n if (storage?.swapDetails) {\n result.push({\n id,\n swap: storage?.swapDetails,\n });\n }\n });\n\n return result.sort(\n (a, b) => Number(b.swap.creationTime) - Number(a.swap.creationTime)\n );\n};\n", "import type { PropTypes } from './ActivateTabAlert.types';\n\nimport { i18n } from '@lingui/core';\nimport { Alert, Button } from '@rango-dev/ui';\nimport React from 'react';\n\nexport function ActivateTabAlert(props: PropTypes) {\n return (\n <Alert\n action={\n <Button\n onClick={props.onActivateTab}\n variant=\"contained\"\n size=\"xxsmall\"\n type=\"warning\">\n {i18n.t('Activate this tab')}\n </Button>\n }\n type=\"warning\"\n variant=\"alarm\"\n title={i18n.t('Another tab is open and handles transactions.')}\n />\n );\n}\n", "import type { PropTypes } from './ActivateTabModal.types';\n\nimport { i18n } from '@lingui/core';\nimport { Button, Divider, MessageBox } from '@rango-dev/ui';\nimport React from 'react';\n\nimport { getContainer } from '../../../utils/common';\nimport { WatermarkedModal } from '../WatermarkedModal';\n\nexport function ActivateTabModal(props: PropTypes) {\n const { open, onClose, onConfirm } = props;\n\n return (\n <WatermarkedModal\n open={open}\n dismissible\n onClose={onClose}\n container={getContainer()}>\n <MessageBox\n title={i18n.t('Activate current tab')}\n type=\"warning\"\n description={i18n.t(\n 'Currently, some transactions are running and being handled by other browser tab. If you activate this tab, all transactions that are already in the transaction sign step will expire.'\n )}>\n <Divider size={20} />\n <Button\n variant=\"contained\"\n size=\"large\"\n type=\"primary\"\n fullWidth\n onClick={onConfirm}>\n {i18n.t('Confirm')}\n </Button>\n </MessageBox>\n </WatermarkedModal>\n );\n}\n", "import type { PropTypes } from './HeaderButtons.types';\n\nimport { ChevronLeftIcon } from '@rango-dev/ui';\nimport React from 'react';\n\nimport { HeaderButton } from './HeaderButtons.styles';\n\nfunction BackButton(props: PropTypes) {\n return (\n <HeaderButton variant=\"ghost\" size=\"small\" onClick={props.onClick}>\n <ChevronLeftIcon color=\"black\" size={16} />\n </HeaderButton>\n );\n}\n\nexport { BackButton };\n", "import { css, darkTheme, IconButton, styled } from '@rango-dev/ui';\n\nexport const HeaderButton = styled(IconButton, {\n width: '$24',\n position: 'relative',\n padding: '0',\n overflow: 'unset',\n '&:hover': {\n backgroundColor: '$info100',\n [`.${darkTheme} &`]: {\n backgroundColor: '$neutral',\n },\n },\n});\n\nexport const ConnectedIcon = styled('div', {\n position: 'absolute',\n background: '$secondary500',\n [`.${darkTheme} &`]: {\n $$color: '$colors$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 minWidth: '$40',\n button: {\n padding: 0,\n },\n});\n\nexport const NotificationsBadgeContainer = styled('div', {\n position: 'absolute',\n width: '14px',\n height: '14px',\n display: 'flex',\n justifyContent: 'center',\n alignItems: 'center',\n borderRadius: '7px',\n top: '$0',\n right: '$0',\n variants: {\n isSever: {\n true: {\n backgroundColor: '$error500',\n },\n false: {\n backgroundColor: '$secondary500',\n },\n },\n },\n});\n\nexport const ProgressIcon = styled('div', {\n padding: '$2',\n variants: {\n isRefetched: {\n true: {\n transform: `rotate(360deg)`,\n transition: 'transform 1s ease-in-out',\n },\n },\n },\n});\n\nexport const InProgressTransactionBadgeContainer = styled('div', {\n position: 'absolute',\n right: '$4',\n top: '$4',\n backgroundColor: '$background',\n borderRadius: '100%',\n});\n\nexport const rowStyles = css({\n display: 'flex',\n flexDirection: 'row',\n justifyContent: 'center',\n alignItems: 'center',\n});\n\nexport const WalletImageContainer = styled('div', {\n borderRadius: '100%',\n border: '1.5px transparent solid',\n '&:not(:first-child)': {\n marginLeft: '-$6',\n },\n img: {\n borderRadius: '100%',\n },\n});\n", "import type { PropTypes } from './HeaderButtons.types';\n\nimport { i18n } from '@lingui/core';\nimport { Button, Typography } from '@rango-dev/ui';\nimport React from 'react';\n\nimport { SuffixContainer } from './HeaderButtons.styles';\n\nfunction CancelButton(props: PropTypes) {\n return (\n <SuffixContainer>\n <Button 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 { Image, Tooltip, WalletIcon } from '@rango-dev/ui';\nimport React from 'react';\n\nimport { useWalletList } from '../../hooks/useWalletList';\n\nimport {\n ConnectedIcon,\n HeaderButton,\n rowStyles,\n WalletImageContainer,\n} from './HeaderButtons.styles';\n\nfunction WalletButton(props: PropTypes) {\n const { list } = useWalletList({});\n const connectedWallets = list.filter(\n (wallet) => wallet.state === 'connected'\n );\n const content = !connectedWallets.length ? (\n i18n.t('Connect Wallet')\n ) : (\n <div className={rowStyles()}>\n {connectedWallets.map((wallet) => (\n <WalletImageContainer key={wallet.title}>\n <Image src={wallet.image} size={14} />\n </WalletImageContainer>\n ))}\n </div>\n );\n\n return (\n <Tooltip container={props.container} side=\"bottom\" content={content}>\n <HeaderButton 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 { HeaderButtonsPropTypes } from './HeaderButtons.types';\n\nimport { i18n } from '@lingui/core';\nimport {\n NotificationsIcon,\n Popover,\n SettingsIcon,\n Tooltip,\n TransactionIcon,\n} from '@rango-dev/ui';\nimport React from 'react';\n\nimport { useAppStore } from '../../store/AppStore';\nimport { getContainer } from '../../utils/common';\nimport { isFeatureHidden } from '../../utils/settings';\nimport { NotificationContent } from '../NotificationContent';\n\nimport { HeaderButton } from './HeaderButtons.styles';\nimport InProgressTransactionBadge from './InProgressTransactionBadge';\nimport { RefreshButton } from './RefreshButton';\nimport { UnreadNotificationsBadge } from './UnreadNotificationsBadge';\n\nexport function HeaderButtons(props: HeaderButtonsPropTypes) {\n const {\n onClickRefresh,\n onClickHistory,\n onClickSettings,\n hidden = [],\n } = props;\n\n const {\n config: { features },\n } = useAppStore();\n\n const isNotificationsHidden =\n isFeatureHidden('notification', features) ||\n hidden.includes('notifications');\n\n return (\n <>\n {!hidden.includes('refresh') && (\n <Tooltip\n container={getContainer()}\n side=\"top\"\n content={i18n.t('Refresh')}>\n <RefreshButton onClick={onClickRefresh} />\n </Tooltip>\n )}\n\n {!isNotificationsHidden && (\n <Popover\n align=\"end\"\n alignOffset={-88}\n collisionPadding={{ right: 20, left: 20 }}\n container={getContainer()}\n content={<NotificationContent />}>\n <div>\n <Tooltip\n container={getContainer()}\n side=\"top\"\n content={i18n.t('Notifications')}>\n <HeaderButton size=\"small\" variant=\"ghost\">\n <NotificationsIcon size={18} color=\"black\" />\n <UnreadNotificationsBadge />\n </HeaderButton>\n </Tooltip>\n </div>\n </Popover>\n )}\n {!hidden.includes('settings') && (\n <Tooltip\n container={getContainer()}\n side=\"top\"\n content={i18n.t('Settings')}>\n <HeaderButton size=\"small\" variant=\"ghost\" onClick={onClickSettings}>\n <SettingsIcon size={18} color=\"black\" />\n </HeaderButton>\n </Tooltip>\n )}\n {!hidden.includes('history') && (\n <Tooltip\n container={getContainer()}\n side=\"top\"\n content={i18n.t('Transactions History')}>\n <HeaderButton size=\"small\" variant=\"ghost\" onClick={onClickHistory}>\n <TransactionIcon size={18} color=\"black\" />\n <InProgressTransactionBadge />\n </HeaderButton>\n </Tooltip>\n )}\n </>\n );\n}\n", "import type { Notification } from '../../types/notification';\n\nimport { i18n } from '@lingui/core';\nimport { EventSeverity } from '@rango-dev/queue-manager-rango-preset';\nimport {\n ChainToken,\n ChevronRightIcon,\n Divider,\n Typography,\n} from '@rango-dev/ui';\nimport React from 'react';\nimport { useNavigate } from 'react-router-dom';\n\nimport { navigationRoutes } from '../../constants/navigationRoutes';\nimport { useAppStore } from '../../store/AppStore';\nimport { useNotificationStore } from '../../store/notification';\nimport { areTokensEqual } from '../../utils/wallets';\n\nimport {\n Container,\n Images,\n List,\n ListItem,\n} from './NotificationContent.styles';\nimport { NotificationNotFound } from './NotificationNotFound';\n\nconst MAX_NOTIFICATIONS_DISPLAYED = 4;\n\nexport function NotificationContent() {\n const navigate = useNavigate();\n\n const { getUnreadNotifications } = useNotificationStore();\n\n const notifications: Notification[] = getUnreadNotifications();\n const blockchains = useAppStore().blockchains();\n const tokens = useAppStore().tokens();\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 navigate(`${navigationRoutes.swaps}/${requestId}`);\n };\n\n return (\n <Container>\n {sortedNotification.length ? (\n <List>\n {sortedNotification.map((notificationItem, index) => {\n const { route, requestId, event } = notificationItem;\n const fromToken = tokens.find((tokenItem) =>\n areTokensEqual(tokenItem, route.from)\n );\n\n const fromBlockchain = blockchains.find(\n (blockchainItem) => blockchainItem.name === route.from.blockchain\n );\n\n const toToken = tokens.find((tokenItem) =>\n areTokensEqual(tokenItem, route.to)\n );\n\n const toBlockchain = blockchains.find(\n (blockchainItem) => blockchainItem.name === route.to.blockchain\n );\n\n return (\n <React.Fragment key={requestId}>\n {index > 0 && <Divider size={4} />}\n <ListItem\n onClick={() => handleOnClick(requestId)}\n actionRequired={\n event.messageSeverity === EventSeverity.WARNING\n }\n title={\n <Typography\n variant=\"body\"\n size=\"small\"\n color={\n event.messageSeverity === EventSeverity.WARNING\n ? '$foreground'\n : '$neutral700'\n }>\n {i18n.t(event.message)}\n </Typography>\n }\n id={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 </React.Fragment>\n );\n })}\n </List>\n ) : (\n <NotificationNotFound />\n )}\n </Container>\n );\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 address: fromStep.fromSymbolAddress,\n symbol: fromStep.fromSymbol,\n },\n to: {\n blockchain: toStep.toBlockchain,\n address: toStep.toSymbolAddress,\n symbol: toStep.toSymbol,\n },\n },\n };\n\n const excludedList = get().notifications.filter(\n (notificationItem) => notificationItem.requestId !== route.requestId\n );\n\n set(() => ({\n notifications: [...excludedList, notification],\n }));\n },\n 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 { darkTheme, ListItemButton, styled } from '@rango-dev/ui';\n\nexport const Container = styled('div', {\n padding: '$10',\n width: '350px',\n maxWidth: '90vw',\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 ListItem = styled(ListItemButton, {\n variants: {\n actionRequired: {\n true: {\n backgroundColor: '$error300',\n [`.${darkTheme} &`]: {\n backgroundColor: '$error600',\n },\n },\n },\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=\"neutral700\">\n {i18n.t('There are no notifications.')}\n </Typography>\n </NotFoundContainer>\n );\n}\n", "import type { PendingSwap } from 'rango-types';\n\nimport { useManager } from '@rango-dev/queue-manager-react';\nimport { InProgressIcon } from '@rango-dev/ui';\nimport React from 'react';\n\nimport { getPendingSwaps } from '../../utils/queue';\n\nimport { InProgressTransactionBadgeContainer } from './HeaderButtons.styles';\n\nconst InProgressTransactionBadge = () => {\n const { manager } = useManager();\n const list: PendingSwap[] = getPendingSwaps(manager).map(({ swap }) => swap);\n\n if (!list.find((swap) => swap.status === 'running')) {\n return null;\n }\n\n return (\n <InProgressTransactionBadgeContainer>\n <InProgressIcon color=\"info\" size={6} />\n </InProgressTransactionBadgeContainer>\n );\n};\n\nexport default InProgressTransactionBadge;\n", "import { RefreshProgressButton } from '@rango-dev/ui';\nimport React, { useEffect, useState } from 'react';\n\nimport { HeaderButton, ProgressIcon } from './HeaderButtons.styles';\n\nconst REFRESH_INTERVAL = 1000;\nconst MAX_ELAPSED_TIME = 60;\nconst MAX_PERCENTAGE = 100;\n\nfunction RefreshButton({ onClick }: { onClick: (() => void) | undefined }) {\n const [elapsedTime, setElapsedTime] = useState(0);\n const [isRefetched, setIsRefetched] = useState(false);\n\n const handleVisibilityChange = (interval?: number) => {\n if (document.hidden && interval) {\n // Tab is inactive, clear the interval\n clearTimeout(interval);\n }\n };\n\n useEffect(() => {\n let interval: number | undefined;\n if (onClick) {\n interval = window.setInterval(() => {\n setElapsedTime((prevTime) => prevTime + 1);\n\n if (elapsedTime === MAX_ELAPSED_TIME) {\n handleRefreshClick();\n }\n }, REFRESH_INTERVAL);\n } else {\n clearTimeout(interval);\n }\n\n document.addEventListener('visibilitychange', () =>\n handleVisibilityChange(interval)\n );\n\n return () => {\n document.removeEventListener('visibilitychange', () =>\n handleVisibilityChange(interval)\n );\n if (interval) {\n clearInterval(interval);\n }\n };\n }, [elapsedTime, onClick]);\n\n const clearTimeout = (interval?: number) => {\n if (interval) {\n clearInterval(interval);\n }\n setElapsedTime(0);\n };\n\n const handleRefreshClick = () => {\n onClick?.();\n setElapsedTime(0);\n setIsRefetched(true);\n };\n\n return (\n <HeaderButton\n variant=\"ghost\"\n size=\"small\"\n style={{ paddingTop: 0, paddingBottom: 0 }}\n onClick={handleRefreshClick}\n disabled={!onClick}>\n <ProgressIcon\n onTransitionEnd={() => setIsRefetched(false)}\n isRefetched={isRefetched}>\n <RefreshProgressButton\n size={22}\n color={!onClick ? 'gray' : 'black'}\n progress={(elapsedTime / MAX_ELAPSED_TIME) * MAX_PERCENTAGE}\n />\n </ProgressIcon>\n </HeaderButton>\n );\n}\n\nexport { RefreshButton };\n", "import { EventSeverity } from '@rango-dev/queue-manager-rango-preset';\nimport { Typography } from '@rango-dev/ui';\nimport React from 'react';\n\nimport { useNotificationStore } from '../../store/notification';\n\nimport { NotificationsBadgeContainer } from './HeaderButtons.styles';\n\nexport function UnreadNotificationsBadge() {\n const { getUnreadNotifications } = useNotificationStore();\n\n const notificationsList = getUnreadNotifications();\n\n const notificationsCount = notificationsList.length;\n\n const hasSeverNotification = !!notificationsList.find(\n (notificationItem) =>\n notificationItem.event.messageSeverity === EventSeverity.WARNING\n );\n\n return notificationsCount ? (\n <NotificationsBadgeContainer isSever={hasSeverNotification}>\n <Typography variant=\"body\" size=\"xsmall\" color=\"$background\">\n {notificationsCount}\n </Typography>\n </NotificationsBadgeContainer>\n ) : null;\n}\n", "import { getContainer } from '../../utils/common';\n\nexport function onScrollContentAttachStatusToContainer(e: Event) {\n const contentElement = e.target as HTMLElement | null;\n\n if (contentElement) {\n const fromTop = contentElement.scrollTop;\n const container = getContainer();\n\n if (fromTop > 1) {\n container.classList.add('rng-scrolled');\n } else {\n container.classList.remove('rng-scrolled');\n }\n }\n}\n", "import { css, styled } from '@rango-dev/ui';\n\nconst WIDGET_HEIGHT = '700px';\n\nexport const LayoutContainer = css({\n borderRadius: '$primary',\n display: 'flex',\n flexDirection: 'column',\n overflow: 'hidden',\n boxShadow: '15px 15px 15px 0px rgba(0, 0, 0, 0.05)',\n});\n\nexport const Container = styled('div', {\n position: 'relative',\n width: '100vw',\n minWidth: '300px',\n maxWidth: '390px',\n backgroundColor: '$background',\n variants: {\n height: {\n auto: {\n height: 'auto',\n maxHeight: WIDGET_HEIGHT,\n },\n fixed: {\n height: WIDGET_HEIGHT,\n },\n },\n },\n});\n\nexport const Content = styled('div', {\n position: 'relative',\n overflow: 'hidden',\n flexGrow: 1,\n display: 'flex',\n flexDirection: 'column',\n padding: 0,\n overflowY: 'auto',\n});\n\nexport const Footer = styled('div', {\n padding: '0 $20 $10',\n '& .footer__alert': {\n paddingTop: '$10',\n },\n '& .footer__logo': {\n opacity: 0,\n transition: 'opacity 1s ease-in-out',\n '&.logo__show': {\n opacity: 1,\n },\n '&.logo__hidden': {\n visibility: 'hidden',\n },\n },\n});\n", "import { styled } from '@rango-dev/ui';\n\nconst CONTENT_PADDING = '$20 $20 $10 $20';\n\nconst ScrollableArea = styled('div', {\n padding: CONTENT_PADDING,\n overflowY: 'auto',\n flexGrow: 1,\n});\n\nexport { ScrollableArea, CONTENT_PADDING };\n", "import { styled } from '@rango-dev/ui';\n\nconst PageContainer = styled('div', {\n display: 'flex',\n flexDirection: 'column',\n padding: '20px 20px 10px',\n flexGrow: 1,\n\n variants: {\n view: {\n true: {\n flexGrow: 1,\n overflow: 'hidden',\n },\n },\n compact: {\n true: {\n padding: 0,\n },\n },\n },\n});\n\nexport { PageContainer };\n", "import type { PropTypes } from './WalletModal.types';\n\nimport { Divider } from '@rango-dev/ui';\nimport React from 'react';\n\nimport { WIDGET_UI_ID } from '../../constants';\nimport { WatermarkedModal } from '../common/WatermarkedModal';\n\nimport { ModalContent } from './WalletModalContent';\n\nexport function WalletModal(props: PropTypes) {\n const { open, onClose, ...otherProps } = props;\n\n return (\n <WatermarkedModal\n open={open}\n onClose={onClose}\n container={\n document.getElementById(WIDGET_UI_ID.SWAP_BOX_ID) || document.body\n }>\n <ModalContent {...otherProps} />\n <Divider direction=\"vertical\" size={32} />\n </WatermarkedModal>\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 { keyframes, styled } from '@rango-dev/ui';\n\nexport const LogoContainer = styled('div', {\n position: 'relative',\n});\n\nconst SpinAnimation = keyframes({\n '0%': {\n transform: 'rotate(0deg)',\n },\n '100%': {\n transform: 'rotate(360deg)',\n },\n});\n\nexport const Spinner = styled('div', {\n position: 'absolute',\n border: '2px solid rgba(0, 0, 0, 0.1)',\n borderTop: '2px solid $info500',\n borderRadius: '$lg',\n width: '$45',\n height: '$45',\n animation: `${SpinAnimation} 1s linear infinite`,\n top: 0,\n bottom: 0,\n right: 0,\n left: 0,\n});\n\nexport const WalletImageContainer = styled('div', {\n '& img': {\n borderRadius: '50%',\n },\n});\n", "import type { PropTypes } from './QuoteWarningsAndErrors.types';\n\nimport { i18n } from '@lingui/core';\nimport { Alert, Button, InfoIcon } from '@rango-dev/ui';\nimport React from 'react';\n\nimport { QuoteErrorType, QuoteWarningType } from '../../types';\nimport { NoResult } from '../NoResult';\n\nimport { HighValueLossWarningModal } from './HighValueLossWarningModal';\nimport { makeAlerts } from './QuoteWarningsAndErrors.helpers';\nimport { Action, Alerts } from './QuoteWarningsAndErrors.styles';\nimport { SlippageWarningModal } from './SlippageWariningModal';\nimport { UnknownPriceWarningModal } from './UnknownPriceWarningModal';\n\nexport function QuoteWarningsAndErrors(props: PropTypes) {\n const {\n warning,\n error,\n showWarningModal,\n confirmationDisabled,\n refetchQuote,\n onOpenWarningModal,\n onCloseWarningModal,\n onConfirmWarningModal,\n onChangeSettings,\n } = props;\n\n const warningModalHandlers = {\n confirmationDisabled,\n open: showWarningModal,\n onClose: onCloseWarningModal,\n onConfirm: onConfirmWarningModal,\n };\n\n const showNoResultMessage =\n error?.type === QuoteErrorType.NO_RESULT ||\n error?.type === QuoteErrorType.REQUEST_FAILED;\n\n const alertInfo = makeAlerts(\n warning,\n error?.type === QuoteErrorType.BRIDGE_LIMIT ||\n error?.type === QuoteErrorType.INSUFFICIENT_SLIPPAGE\n ? error\n : null\n );\n\n const showAlerts = !!alertInfo;\n\n return (\n <>\n {showNoResultMessage && <NoResult error={error} fetch={refetchQuote} />}\n\n {showAlerts && (\n <Alerts>\n <Alert\n title={alertInfo.title}\n type={alertInfo.alertType}\n variant=\"alarm\"\n {...(alertInfo.action === 'show-info' && {\n action: (\n <Action onClick={onOpenWarningModal}>\n <InfoIcon size={12} color=\"gray\" />\n </Action>\n ),\n })}\n {...(alertInfo.action === 'change-settings' && {\n action: (\n <Button\n size=\"xxsmall\"\n type={alertInfo.alertType}\n onClick={onChangeSettings}>\n {i18n.t('Change')}\n </Button>\n ),\n })}\n />\n </Alerts>\n )}\n\n {warning && (\n <>\n {warning.type === QuoteWarningType.HIGH_VALUE_LOSS && (\n <HighValueLossWarningModal\n {...warningModalHandlers}\n warning={warning}\n />\n )}\n\n {(warning.type === QuoteWarningType.HIGH_SLIPPAGE ||\n warning.type === QuoteWarningType.INSUFFICIENT_SLIPPAGE) && (\n <SlippageWarningModal {...warningModalHandlers} warning={warning} />\n )}\n\n {warning.type === QuoteWarningType.UNKNOWN_PRICE && (\n <UnknownPriceWarningModal\n {...warningModalHandlers}\n warning={warning}\n />\n )}\n </>\n )}\n </>\n );\n}\n", "import type { PropTypes } from './NoResult.types';\n\nimport {\n Alert,\n Button,\n Divider,\n NoRouteIcon,\n RefreshIcon,\n Typography,\n} from '@rango-dev/ui';\nimport React from 'react';\n\nimport { errorMessages } from '../../constants/errors';\nimport { useAppStore } from '../../store/AppStore';\n\nimport {\n makeInfo,\n NoRouteIconSize,\n NoRouteTitleSize,\n} from './NoResult.helpers';\nimport {\n Container,\n ErrorDescription,\n Footer,\n PrefixIcon,\n} from './NoResult.styles';\n\nexport function NoResult(props: PropTypes) {\n const { fetch, error, size = 'small' } = props;\n const disabledLiquiditySources = useAppStore().getDisabledLiquiditySources();\n const toggleAllLiquiditySources = useAppStore().toggleAllLiquiditySources;\n\n const swappers = useAppStore().swappers();\n const info = makeInfo(\n error,\n disabledLiquiditySources,\n () => toggleAllLiquiditySources(swappers, true),\n fetch\n );\n\n return (\n <Container>\n <NoRouteIcon size={NoRouteIconSize[size]} color=\"gray\" />\n <Divider size={4} />\n <Typography variant=\"title\" size={NoRouteTitleSize[size]}>\n {errorMessages().noResultError.title}\n </Typography>\n {size === 'large' && <Divider size={4} />}\n {!!info.description && (\n <ErrorDescription size={size}>\n <Typography\n variant=\"body\"\n size=\"small\"\n align=\"center\"\n color=\"neutral700\">\n {info.description}\n </Typography>\n </ErrorDescription>\n )}\n <Divider size={size === 'large' ? '24' : '4'} />\n {!!info.alert && (\n <Footer size={size}>\n <Alert\n type={info.alert.type}\n title={info.alert.text}\n titleAlign={'left'}\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 type { Info } from './NoResult.types';\n\nimport { i18n } from '@lingui/core';\n\nimport { errorMessages } from '../../constants/errors';\nimport {\n type NoResultError,\n QuoteErrorType,\n type QuoteRequestFailed,\n} from '../../types';\n\nconst SMALL_NO_ROUTE__ICON_SIZE = 24;\nconst LARGE_NO_ROUTE_ICON_SIZE = 60;\n\nexport function makeInfo(\n error: NoResultError | QuoteRequestFailed | null,\n disabledLiquiditySources: string[],\n toggleAllLiquiditySources: (shouldReset: boolean) => void,\n refetchQuote: () => void\n): Info {\n if (error?.type === QuoteErrorType.REQUEST_FAILED) {\n return {\n alert: {\n type: 'warning',\n text: errorMessages().genericServerError,\n action: {\n onClick: refetchQuote,\n title: i18n.t('Retry'),\n },\n },\n description: '',\n };\n } else if (disabledLiquiditySources.length) {\n return {\n alert: {\n type: 'warning',\n text: errorMessages().liquiditySourcesError.title,\n action: {\n onClick: () => toggleAllLiquiditySources(true),\n title: i18n.t('Reset'),\n },\n },\n description: errorMessages().liquiditySourcesError.description,\n };\n } else if (\n error?.type === QuoteErrorType.NO_RESULT &&\n error.diagnosisMessage\n ) {\n return {\n alert: {\n type: 'error',\n text: error.diagnosisMessage,\n action: null,\n },\n description: '',\n };\n }\n return {\n alert: null,\n description: errorMessages().noResultError.description,\n };\n}\n\nexport enum NoRouteIconSize {\n small = SMALL_NO_ROUTE__ICON_SIZE,\n large = LARGE_NO_ROUTE_ICON_SIZE,\n}\n\nexport enum NoRouteTitleSize {\n small = 'small',\n large = 'medium',\n}\n", "import { styled } from '@rango-dev/ui';\n\nexport const Container = styled('div', {\n display: 'flex',\n flexDirection: 'column',\n alignItems: 'center',\n});\n\nexport const ErrorDescription = styled('div', {\n variants: {\n size: {\n small: {},\n large: {\n maxWidth: '316px',\n },\n },\n },\n});\n\nexport const Footer = styled('div', {\n variants: {\n size: {\n small: {\n width: '100%',\n },\n large: {},\n },\n },\n});\n\nexport const PrefixIcon = styled('div', {\n padding: '$6 $0',\n});\n", "import type { HighValueLossWarning } from '../../types';\n\nimport { i18n } from '@lingui/core';\nimport {\n Button,\n Divider,\n MessageBox,\n Typography,\n WarningIcon,\n} from '@rango-dev/ui';\nimport React from 'react';\n\nimport { errorMessages } from '../../constants/errors';\nimport {\n GAS_FEE_MAX_DECIMALS,\n GAS_FEE_MIN_DECIMALS,\n PERCENTAGE_CHANGE_MAX_DECIMALS,\n PERCENTAGE_CHANGE_MIN_DECIMALS,\n USD_VALUE_MAX_DECIMALS,\n USD_VALUE_MIN_DECIMALS,\n} from '../../constants/routing';\nimport { getContainer } from '../../utils/common';\nimport { numberToString } from '../../utils/numbers';\nimport { WatermarkedModal } from '../common/WatermarkedModal';\n\nimport { QuoteErrorsModalItem } from './QuoteErrorsModalItem';\nimport { Flex } from './QuoteWarningsAndErrors.styles';\n\ntype Props = {\n open: boolean;\n confirmationDisabled: boolean;\n onClose: () => void;\n onConfirm: () => void;\n warning: HighValueLossWarning;\n};\n\nexport function HighValueLossWarningModal(props: Props) {\n const { open, onClose, onConfirm, warning, confirmationDisabled } = props;\n const type = warning.warningLevel === 'high' ? 'error' : 'warning';\n\n const highValueLossData = [\n {\n title: i18n.t('Swapping'),\n value: numberToString(\n warning.inputUsdValue,\n USD_VALUE_MIN_DECIMALS,\n USD_VALUE_MAX_DECIMALS\n ),\n },\n {\n title: i18n.t('Gas cost'),\n value: numberToString(\n warning.totalFee,\n GAS_FEE_MIN_DECIMALS,\n GAS_FEE_MAX_DECIMALS\n ),\n },\n {\n title: i18n.t('Receiving'),\n value: numberToString(\n warning.outputUsdValue,\n USD_VALUE_MIN_DECIMALS,\n USD_VALUE_MAX_DECIMALS\n ),\n },\n {\n title: i18n.t('Price impact'),\n value: numberToString(\n warning.priceImpact,\n PERCENTAGE_CHANGE_MIN_DECIMALS,\n PERCENTAGE_CHANGE_MAX_DECIMALS\n ),\n valueColor: `${type}500`,\n },\n ];\n\n return (\n <WatermarkedModal\n footer={\n <Button\n type=\"primary\"\n size=\"large\"\n prefix={<WarningIcon />}\n fullWidth\n disabled={confirmationDisabled}\n onClick={onConfirm}>\n {errorMessages().highValueLossError.confirmMessage}\n </Button>\n }\n open={open}\n onClose={onClose}\n container={getContainer()}>\n <MessageBox\n type={type}\n title={errorMessages().highValueLossError.impactTitle}\n description={errorMessages().highValueLossError.description}\n />\n\n <Flex>\n <Divider size={20} />\n <Typography size=\"small\" variant=\"title\">\n {i18n.t('Details')}\n </Typography>\n <Flex>\n {highValueLossData.map((item, index) => {\n const key = index;\n return <QuoteErrorsModalItem key={key} {...item} />;\n })}\n </Flex>\n </Flex>\n </WatermarkedModal>\n );\n}\n", "import type { ModalContentData } from './QuoteWarningsAndErrors.types';\n\nimport { Typography } from '@rango-dev/ui';\nimport React from 'react';\n\nimport { Item } from './QuoteWarningsAndErrors.styles';\n\nexport function QuoteErrorsModalItem(props: ModalContentData) {\n const { title, value, valueColor } = props;\n\n return (\n <Item>\n <Typography size=\"medium\" variant=\"label\" className=\"_title\">\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 { darkTheme, styled } from '@rango-dev/ui';\n\nexport const Alerts = styled('div', {\n width: '100%',\n});\n\nexport const Flex = styled('div', {\n display: 'flex',\n flexDirection: 'column',\n alignItems: 'flex-start',\n gap: 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 '._title': {\n $$color: '$colors$neutral600',\n [`.${darkTheme} &`]: {\n $$color: '$colors$neutral700',\n },\n color: '$$color',\n },\n});\n\nexport const Action = styled('div', {\n padding: '$2',\n alignSelf: 'flex-start',\n cursor: 'pointer',\n});\n", "import type {\n BridgeLimitError,\n InsufficientSlippageError,\n QuoteWarning,\n} from '../../types';\n\nimport { i18n } from '@lingui/core';\n\nimport { errorMessages } from '../../constants/errors';\nimport { QuoteErrorType, QuoteWarningType } from '../../types';\nimport { getPriceImpactLevel } from '../../utils/quote';\n\ntype AlertInfo = {\n alertType: 'error' | 'warning';\n title: string;\n action: 'show-info' | 'change-settings' | null;\n};\n\nexport function makeAlerts(\n warning: QuoteWarning | null,\n error: BridgeLimitError | InsufficientSlippageError | null\n): AlertInfo | null {\n const alertInfo: AlertInfo = {\n alertType: 'warning',\n title: '',\n action: null,\n };\n if (error) {\n alertInfo.alertType = 'error';\n if (error.type === QuoteErrorType.BRIDGE_LIMIT) {\n alertInfo.title = error.recommendation;\n }\n\n if (error.type === QuoteErrorType.INSUFFICIENT_SLIPPAGE) {\n alertInfo.title = i18n.t({\n id: 'You need to increase slippage to at least {minRequiredSlippage} for this route.',\n values: {\n minRequiredSlippage: error.minRequiredSlippage,\n },\n });\n alertInfo.action = 'change-settings';\n }\n\n return alertInfo;\n }\n if (warning) {\n if (warning.type === QuoteWarningType.HIGH_VALUE_LOSS) {\n const warningLevel = getPriceImpactLevel(warning.priceImpact);\n if (warningLevel === 'high') {\n alertInfo.alertType = 'error';\n }\n alertInfo.action = 'show-info';\n alertInfo.title = errorMessages().highValueLossError.title;\n }\n if (warning.type === QuoteWarningType.UNKNOWN_PRICE) {\n alertInfo.title = errorMessages().unknownPriceError.title;\n }\n if (warning.type === QuoteWarningType.INSUFFICIENT_SLIPPAGE) {\n alertInfo.title = i18n.t({\n id: 'We recommend you to increase slippage to at least {minRequiredSlippage} for this route.',\n values: {\n minRequiredSlippage: warning.minRequiredSlippage,\n },\n });\n alertInfo.action = 'change-settings';\n }\n if (warning.type === QuoteWarningType.HIGH_SLIPPAGE) {\n alertInfo.title = i18n.t('Caution, your slippage is high.');\n }\n return alertInfo;\n }\n return null;\n}\n", "import type {\n HighSlippageWarning,\n InsufficientSlippageWarning,\n} from '../../types';\n\nimport { i18n } from '@lingui/core';\nimport { Button, Divider, MessageBox, Typography } from '@rango-dev/ui';\nimport React from 'react';\nimport { useNavigate } from 'react-router-dom';\n\nimport { navigationRoutes } from '../../constants/navigationRoutes';\nimport { useAppStore } from '../../store/AppStore';\nimport { QuoteWarningType } from '../../types';\nimport { getContainer } from '../../utils/common';\nimport { WatermarkedModal } from '../common/WatermarkedModal';\n\ntype PropsTypes = {\n open: boolean;\n confirmationDisabled: boolean;\n onClose: () => void;\n onConfirm: () => void;\n warning: InsufficientSlippageWarning | HighSlippageWarning;\n};\n\nexport function SlippageWarningModal(props: PropsTypes) {\n const { customSlippage, slippage } = useAppStore();\n const { open, onClose, onConfirm, warning, confirmationDisabled } = props;\n const navigate = useNavigate();\n const userSlippage = customSlippage ?? slippage;\n\n return (\n <WatermarkedModal\n anchor=\"bottom\"\n open={open}\n prefix={\n <Button\n size=\"small\"\n variant=\"ghost\"\n onClick={() => navigate('../' + navigationRoutes.settings)}>\n <Typography variant=\"label\" size=\"medium\" color=\"$neutral900\">\n {i18n.t('Change settings')}\n </Typography>\n </Button>\n }\n container={getContainer()}\n onClose={onClose}>\n <MessageBox\n type=\"warning\"\n title={\n warning.type === QuoteWarningType.HIGH_SLIPPAGE\n ? i18n.t('High slippage')\n : i18n.t('Low slippage')\n }\n description={\n warning.type === QuoteWarningType.HIGH_SLIPPAGE\n ? i18n.t({\n id: ' Caution, your slippage is high (={userSlippage}). Your trade may be front run.',\n values: { userSlippage },\n })\n : i18n.t({\n id: 'We recommend you to increase slippage to at least {minRequiredSlippage} for this route.',\n values: {\n minRequiredSlippage: warning.minRequiredSlippage,\n },\n })\n }>\n <Divider size={18} />\n <Divider size={32} />\n <Button\n size=\"large\"\n type=\"primary\"\n variant=\"contained\"\n fullWidth\n disabled={confirmationDisabled}\n onClick={onConfirm}>\n {i18n.t('Confirm anyway')}\n </Button>\n </MessageBox>\n </WatermarkedModal>\n );\n}\n", "import type { UnknownPriceWarning } from '../../types';\n\nimport { Button, MessageBox, WarningIcon } from '@rango-dev/ui';\nimport React from 'react';\n\nimport { errorMessages } from '../../constants/errors';\nimport { getContainer } from '../../utils/common';\nimport { WatermarkedModal } from '../common/WatermarkedModal';\n\ntype Props = {\n open: boolean;\n confirmationDisabled: boolean;\n onClose: () => void;\n onConfirm: () => void;\n warning: UnknownPriceWarning;\n};\n\nexport function UnknownPriceWarningModal(props: Props) {\n const { open, onClose, onConfirm, confirmationDisabled } = props;\n return (\n <WatermarkedModal\n footer={\n <Button\n type=\"primary\"\n size=\"large\"\n prefix={<WarningIcon />}\n fullWidth\n disabled={confirmationDisabled}\n onClick={onConfirm}>\n {errorMessages().unknownPriceError.confirmMessage}\n </Button>\n }\n open={open}\n onClose={onClose}\n container={getContainer()}>\n <MessageBox\n type=\"warning\"\n title={errorMessages().unknownPriceError.impactTitle}\n description={errorMessages().unknownPriceError.description}\n />\n </WatermarkedModal>\n );\n}\n", "import type { PropTypes } from './QuoteInfo.types';\n\nimport BigNumber from 'bignumber.js';\nimport React from 'react';\n\nimport { Quote } from '../../components/Quote';\nimport { QuoteSkeleton } from '../../components/QuoteSkeleton';\nimport { useQuoteStore } from '../../store/quote';\nimport { QuoteErrorType } from '../../types';\nimport { getQuoteToTokenUsdPrice } from '../../utils/quote';\nimport { calcOutputUsdValue } from '../../utils/swap';\n\nimport { QuoteContainer } from './QuoteInfo.styles';\n\nexport function QuoteInfo(props: PropTypes) {\n const {\n quote,\n type,\n loading,\n error,\n warning,\n expanded = false,\n tagHidden,\n onClick,\n showModalFee,\n selected,\n onClickAllRoutes,\n fullExpandedMode = false,\n } = props;\n const { inputAmount, inputUsdValue, toToken } = useQuoteStore();\n\n const outputAmount = !!quote?.outputAmount\n ? new BigNumber(quote?.outputAmount)\n : null;\n const outputUsdValue = !!quote?.outputAmount\n ? calcOutputUsdValue(\n quote?.outputAmount,\n getQuoteToTokenUsdPrice(quote) || toToken?.usdPrice\n )\n : null;\n\n const noResult =\n error &&\n (error.type === QuoteErrorType.NO_RESULT ||\n error.type === QuoteErrorType.REQUEST_FAILED);\n\n const showQuote = !noResult && quote && !loading;\n\n if (loading) {\n return (\n <QuoteContainer>\n <QuoteSkeleton tagHidden={tagHidden} type={type} expanded={expanded} />\n </QuoteContainer>\n );\n }\n\n return showQuote ? (\n <QuoteContainer onClick={() => onClick?.(quote)}>\n <Quote\n quote={quote}\n error={error}\n showModalFee={showModalFee}\n warning={warning}\n tagHidden={tagHidden}\n selected={selected}\n type={type}\n expanded={expanded}\n onClickAllRoutes={onClickAllRoutes}\n fullExpandedMode={fullExpandedMode}\n input={{\n value: inputAmount,\n usdValue: inputUsdValue?.toString() ?? '',\n }}\n output={{\n value: outputAmount?.toString() ?? '',\n usdValue: outputUsdValue?.toString() ?? '',\n }}\n />\n </QuoteContainer>\n ) : null;\n}\n", "import type { QuoteProps } from './Quote.types';\nimport type { Step } from '@rango-dev/ui';\nimport type { SwapResult } from 'rango-sdk';\n\nimport { i18n } from '@lingui/core';\nimport {\n Alert,\n Divider,\n FullExpandedQuote,\n InfoIcon,\n QuoteTag,\n StepDetails,\n TokenAmount,\n Tooltip,\n Typography,\n} from '@rango-dev/ui';\nimport BigNumber from 'bignumber.js';\nimport React, { useRef, useState } from 'react';\n\nimport { GAS_FEE_MAX } from '../../constants/quote';\nimport {\n GAS_FEE_MAX_DECIMALS,\n GAS_FEE_MIN_DECIMALS,\n PERCENTAGE_CHANGE_MAX_DECIMALS,\n PERCENTAGE_CHANGE_MIN_DECIMALS,\n TOKEN_AMOUNT_MAX_DECIMALS,\n TOKEN_AMOUNT_MIN_DECIMALS,\n USD_VALUE_MAX_DECIMALS,\n USD_VALUE_MIN_DECIMALS,\n} from '../../constants/routing';\nimport {\n FooterAlert,\n FooterStepAlarm,\n} from '../../containers/QuoteInfo/QuoteInfo.styles';\nimport { useAppStore } from '../../store/AppStore';\nimport { QuoteErrorType, QuoteWarningType } from '../../types';\nimport { getContainer, getExpanded } from '../../utils/common';\nimport {\n getBlockchainShortNameFor,\n getSwapperDisplayName,\n} from '../../utils/meta';\nimport {\n formatTooltipNumbers,\n numberToString,\n secondsToString,\n totalArrivalTime,\n} from '../../utils/numbers';\nimport {\n getPriceImpact,\n getPriceImpactLevel,\n sortTags,\n} from '../../utils/quote';\nimport { getTotalFeeInUsd } from '../../utils/swap';\n\nimport {\n AllRoutesButton,\n BasicInfoOutput,\n basicInfoStyles,\n ContainerInfoOutput,\n Content,\n FrameIcon,\n HorizontalSeparator,\n Line,\n QuoteContainer,\n stepsDetailsStyles,\n SummaryContainer,\n summaryHeaderStyles,\n summaryStyles,\n TagContainer,\n} from './Quote.styles';\nimport { QuoteCostDetails } from './QuoteCostDetails';\nimport { QuoteSummary } from './QuoteSummary';\nimport { QuoteTrigger } from './QuoteTrigger';\n\nexport function Quote(props: QuoteProps) {\n const {\n quote,\n input,\n output,\n error,\n warning,\n type,\n selected = false,\n tagHidden = true,\n showModalFee = true,\n onClickAllRoutes,\n fullExpandedMode = false,\n } = props;\n const blockchains = useAppStore().blockchains();\n const tokens = useAppStore().tokens();\n const swappers = useAppStore().swappers();\n const [expanded, setExpanded] = useState(props.expanded);\n const quoteRef = useRef<HTMLButtonElement | null>(null);\n const roundedInput = numberToString(\n input.value,\n TOKEN_AMOUNT_MIN_DECIMALS,\n TOKEN_AMOUNT_MAX_DECIMALS\n );\n const roundedOutput = numberToString(\n output.value,\n TOKEN_AMOUNT_MIN_DECIMALS,\n TOKEN_AMOUNT_MAX_DECIMALS\n );\n const roundedOutputUsdValue = output.usdValue\n ? numberToString(\n output.usdValue,\n USD_VALUE_MIN_DECIMALS,\n USD_VALUE_MAX_DECIMALS\n )\n : '';\n const priceImpact = getPriceImpact(input.usdValue, output.usdValue ?? null);\n const percentageChange = numberToString(\n priceImpact,\n PERCENTAGE_CHANGE_MIN_DECIMALS,\n PERCENTAGE_CHANGE_MAX_DECIMALS\n );\n const priceImpactWarningLevel = getPriceImpactLevel(priceImpact ?? 0);\n\n const getQuoteSteps = (swaps: SwapResult[]): Step[] => {\n return swaps.map((swap, index) => {\n let stepState: 'error' | 'warning' | undefined = undefined;\n const stepHasError =\n (error?.type === QuoteErrorType.BRIDGE_LIMIT &&\n error.swap.swapperId === swap.swapperId) ||\n (error?.type === QuoteErrorType.INSUFFICIENT_SLIPPAGE &&\n error.recommendedSlippages?.has(index));\n const stepHasWarning =\n warning?.type === QuoteWarningType.INSUFFICIENT_SLIPPAGE &&\n warning.recommendedSlippages?.has(index);\n\n if (stepHasError) {\n stepState = 'error';\n } else if (stepHasWarning) {\n stepState = 'warning';\n }\n\n let alertTitle = stepHasError\n ? i18n.t('Slippage Error')\n : i18n.t('Slippage Warning');\n\n if (error?.type === QuoteErrorType.BRIDGE_LIMIT) {\n alertTitle = error?.recommendation;\n }\n\n return {\n swapper: {\n displayName: getSwapperDisplayName(swap.swapperId, swappers),\n image: swap.swapperLogo,\n },\n from: {\n token: { displayName: swap.from.symbol, image: swap.from.logo },\n chain: {\n displayName: getBlockchainShortNameFor(\n swap.from.blockchain,\n blockchains\n ),\n image: swap.from.blockchainLogo,\n },\n price: {\n value:\n index === 0\n ? numberToString(\n input.value,\n TOKEN_AMOUNT_MIN_DECIMALS,\n TOKEN_AMOUNT_MAX_DECIMALS\n )\n : numberToString(\n swap.fromAmount,\n TOKEN_AMOUNT_MIN_DECIMALS,\n TOKEN_AMOUNT_MAX_DECIMALS\n ),\n usdValue: numberToString(\n (swap.from.usdPrice ?? 0) * parseFloat(swap.fromAmount),\n USD_VALUE_MIN_DECIMALS,\n USD_VALUE_MAX_DECIMALS\n ),\n realValue: formatTooltipNumbers(\n index === 0 ? input.value : swap.fromAmount\n ),\n realUsdValue: formatTooltipNumbers(\n new BigNumber(swap.from.usdPrice ?? 0).multipliedBy(\n swap.fromAmount\n )\n ),\n },\n },\n to: {\n token: { displayName: swap.to.symbol, image: swap.to.logo },\n chain: {\n displayName: getBlockchainShortNameFor(\n swap.to.blockchain,\n blockchains\n ),\n image: swap.to.blockchainLogo,\n },\n price: {\n value: numberToString(\n swap.toAmount,\n TOKEN_AMOUNT_MIN_DECIMALS,\n TOKEN_AMOUNT_MAX_DECIMALS\n ),\n usdValue: numberToString(\n (swap.to.usdPrice ?? 0) * parseFloat(swap.toAmount),\n USD_VALUE_MIN_DECIMALS,\n USD_VALUE_MAX_DECIMALS\n ),\n realValue: formatTooltipNumbers(swap.toAmount),\n realUsdValue: formatTooltipNumbers(\n new BigNumber(swap.to.usdPrice ?? 0).multipliedBy(swap.toAmount)\n ),\n },\n },\n state: stepState,\n alerts:\n stepHasError || stepHasWarning ? (\n <FooterStepAlarm>\n <Alert\n variant=\"alarm\"\n type={stepHasError ? 'error' : 'warning'}\n title={alertTitle}\n footer={\n <FooterAlert>\n {error?.type === QuoteErrorType.BRIDGE_LIMIT && (\n <>\n <Typography\n size=\"xsmall\"\n variant=\"body\"\n color=\"neutral900\">\n {error.fromAmountRangeError}\n </Typography>\n <Divider direction=\"horizontal\" size={8} />\n <Typography\n size=\"xsmall\"\n variant=\"body\"\n color=\"neutral900\">\n |\n </Typography>\n <Divider direction=\"horizontal\" size={8} />\n <Typography\n size=\"xsmall\"\n variant=\"body\"\n color=\"neutral900\">\n {i18n.t({\n id: 'Yours: {amount} {symbol}',\n values: {\n amount: numberToString(\n swap.fromAmount,\n TOKEN_AMOUNT_MIN_DECIMALS,\n TOKEN_AMOUNT_MAX_DECIMALS\n ),\n symbol: swap?.from.symbol,\n },\n })}\n </Typography>\n </>\n )}\n {(error?.type === QuoteErrorType.INSUFFICIENT_SLIPPAGE ||\n warning?.type ===\n QuoteWarningType.INSUFFICIENT_SLIPPAGE) && (\n <Typography\n size=\"xsmall\"\n variant=\"body\"\n color=\"neutral900\">\n {i18n.t({\n id: 'Minimum required slippage is {minRequiredSlippage}',\n values: {\n ...(error?.type ===\n QuoteErrorType.INSUFFICIENT_SLIPPAGE && {\n minRequiredSlippage:\n error.recommendedSlippages?.get(index),\n }),\n ...(warning?.type ===\n QuoteWarningType.INSUFFICIENT_SLIPPAGE && {\n minRequiredSlippage:\n warning.recommendedSlippages?.get(index),\n }),\n },\n })}\n </Typography>\n )}\n </FooterAlert>\n }\n />\n </FooterStepAlarm>\n ) : undefined,\n };\n });\n };\n const steps = getQuoteSteps(quote?.swaps ?? []);\n\n const numberOfSteps = steps.length;\n const container = getContainer();\n const sortedQuoteTags = sortTags(props.quote.tags || []);\n const showAllRoutesButton = !!onClickAllRoutes;\n const totalTime = secondsToString(totalArrivalTime(quote?.swaps));\n const totalFee = getTotalFeeInUsd(quote?.swaps ?? [], tokens);\n const fee = numberToString(\n totalFee,\n GAS_FEE_MIN_DECIMALS,\n GAS_FEE_MAX_DECIMALS\n );\n\n const feeWarning = totalFee.gte(new BigNumber(GAS_FEE_MAX));\n\n return fullExpandedMode ? (\n <FullExpandedQuote\n selected={selected}\n fee={fee}\n time={totalTime}\n tooltipContainer={getExpanded()}\n steps={steps}\n tags={sortedQuoteTags}\n feeWarning={feeWarning}\n percentageChange={percentageChange}\n warningLevel={priceImpactWarningLevel}\n outputPrice={{\n value: roundedOutput,\n usdValue: roundedOutputUsdValue,\n realValue: formatTooltipNumbers(output.value),\n realUsdValue: formatTooltipNumbers(output.usdValue),\n }}\n />\n ) : (\n <SummaryContainer\n selected={selected}\n listItem={type === 'list-item'}\n basic={type === 'basic'}>\n <div className={summaryStyles()}>\n {!tagHidden && sortedQuoteTags.length ? (\n <>\n <TagContainer>\n {sortedQuoteTags.map((tag, index) => {\n const key = `${tag.value}_${index}`;\n return (\n <React.Fragment key={key}>\n <QuoteTag label={tag.label} value={tag.value} />\n <Divider size={4} direction=\"horizontal\" />\n </React.Fragment>\n );\n })}\n </TagContainer>\n <Line />\n {!showAllRoutesButton && <Divider size={4} />}\n </>\n ) : null}\n <div id=\"portal-root\" className={summaryHeaderStyles()}>\n <QuoteCostDetails\n quote={quote}\n time={totalTime}\n fee={fee}\n feeWarning={feeWarning}\n showModalFee={showModalFee}\n steps={numberOfSteps}\n />\n\n {showAllRoutesButton && (\n <AllRoutesButton\n onClick={(e) => {\n e.stopPropagation();\n onClickAllRoutes();\n }}\n size=\"xxsmall\"\n type=\"secondary\"\n variant=\"default\">\n <Typography color=\"secondary\" variant=\"label\" size=\"medium\">\n {i18n.t('See All Routes')}\n </Typography>\n </AllRoutesButton>\n )}\n </div>\n {type === 'basic' && (\n <div className={basicInfoStyles()}>\n <FrameIcon>\n <InfoIcon size={12} color=\"gray\" />\n </FrameIcon>\n <ContainerInfoOutput>\n <BasicInfoOutput size=\"small\" variant=\"body\">\n {`${roundedInput} ${steps[0].from.token.displayName} = `}\n </BasicInfoOutput>\n <Tooltip\n content={formatTooltipNumbers(output.value)}\n container={container}\n open={!output.value ? false : undefined}>\n <BasicInfoOutput size=\"small\" variant=\"body\">\n \n {`${roundedOutput} ${\n steps[steps.length - 1].to.token.displayName\n }`}\n </BasicInfoOutput>\n </Tooltip>\n </ContainerInfoOutput>\n <Tooltip\n content={formatTooltipNumbers(output.usdValue)}\n container={container}\n style={{\n display: 'flex',\n }}>\n <Typography\n color=\"$neutral600\"\n ml={2}\n size=\"xsmall\"\n variant=\"body\">\n {`($${roundedOutputUsdValue})`}\n </Typography>\n </Tooltip>\n </div>\n )}\n {type === 'list-item' && (\n <TokenAmount\n tooltipContainer={container}\n type=\"output\"\n direction=\"vertical\"\n price={{\n value: roundedOutput,\n usdValue: roundedOutputUsdValue,\n realValue: formatTooltipNumbers(output.value),\n realUsdValue: formatTooltipNumbers(output.usdValue),\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 percentageChange={percentageChange}\n warningLevel={priceImpactWarningLevel}\n />\n )}\n {type === 'swap-preview' && (\n <>\n <QuoteSummary\n from={steps[0].from}\n to={steps[numberOfSteps - 1].to}\n percentageChange={percentageChange}\n warningLevel={priceImpactWarningLevel}\n />\n <Divider size={4} />\n </>\n )}\n </div>\n <QuoteContainer\n selected={selected}\n listItem={type === 'list-item'}\n open={expanded}\n className=\"quote_container\"\n onOpenChange={setExpanded}>\n <QuoteTrigger\n type={type}\n quoteRef={quoteRef}\n selected={selected}\n setExpanded={setExpanded}\n expanded={expanded}\n steps={steps}\n />\n <Content open={expanded}>\n <HorizontalSeparator />\n <div className={stepsDetailsStyles()}>\n {steps.map((step, index) => {\n const key = `item-${index}`;\n return (\n <StepDetails\n type=\"quote-details\"\n key={key}\n tooltipContainer={container}\n step={step}\n hasSeparator={index !== steps.length - 1}\n state={step.state}\n />\n );\n })}\n </div>\n </Content>\n </QuoteContainer>\n </SummaryContainer>\n );\n}\n", "import { styled } from '@rango-dev/ui';\n\nexport const QuoteContainer = styled('div', {\n width: '100%',\n '& .position-top__skeleton': {\n paddingTop: '$10',\n },\n});\nexport const FooterStepAlarm = styled('div', {\n paddingBottom: '$15',\n});\n\nexport const FooterAlert = styled('div', {\n width: '100%',\n display: 'flex',\n});\n", "import * as Collapsible from '@radix-ui/react-collapsible';\nimport {\n Button,\n css,\n darkTheme,\n Image,\n styled,\n Typography,\n} from '@rango-dev/ui';\n\nimport { CollapsibleContent } from '../CustomCollapsible/CustomCollapsible.styles';\n\nexport const EXPANDABLE_QUOTE_TRANSITION_DURATION = 300;\n\nexport const QuoteContainer = styled(Collapsible.Root, {\n display: 'flex',\n flexDirection: 'column',\n alignItems: 'start',\n overflowX: 'auto',\n overflowY: 'hidden',\n width: '100%',\n borderRadius: '$xm',\n variants: {\n selected: {\n true: {},\n false: {\n $$color: '$colors$neutral400',\n [`.${darkTheme} &`]: {\n $$color: '$colors$neutral200',\n },\n backgroundColor: '$$color',\n },\n },\n listItem: {\n true: {\n $$color: '$colors$neutral400',\n [`.${darkTheme} &`]: {\n $$color: '$colors$neutral200',\n },\n backgroundColor: '$$color',\n },\n false: {},\n },\n },\n\n compoundVariants: [\n {\n listItem: false,\n selected: true,\n css: {\n $$color: '$colors$info300',\n [`.${darkTheme} &`]: {\n $$color: '$colors$secondary800',\n },\n backgroundColor: '$$color',\n },\n },\n ],\n});\n\nexport const stepsDetailsStyles = css({\n padding: '$10 $15',\n});\nexport const AllRoutesButton = styled(Button, {\n backgroundColor: 'transparent',\n border: '1px solid $secondary',\n});\nexport const SummaryContainer = styled('div', {\n borderRadius: '$xm',\n display: 'flex',\n flexDirection: 'column',\n alignItems: 'start',\n justifyContent: 'space-between',\n color: '$foreground',\n boxSizing: 'border-box',\n position: 'relative',\n variants: {\n selected: {\n true: {},\n false: {\n $$color: '$colors$neutral200',\n [`.${darkTheme} &`]: {\n $$color: '$colors$neutral500',\n },\n backgroundColor: '$$color',\n },\n },\n basic: { true: { borderTopRightRadius: '0', borderTopLeftRadius: '0' } },\n listItem: {\n true: {\n $$color: '$colors$neutral200',\n [`.${darkTheme} &`]: {\n $$color: '$colors$neutral500',\n },\n backgroundColor: '$$color',\n '&:hover': {\n '& .quote_container': {\n '& button': {\n backgroundColor: '$neutral500',\n [`.${darkTheme} &`]: {\n backgroundColor: '$neutral200',\n },\n },\n backgroundColor: '$neutral500',\n [`.${darkTheme} &`]: {\n backgroundColor: '$neutral200',\n },\n },\n backgroundColor: '$neutral300',\n [`.${darkTheme} &`]: {\n backgroundColor: '$neutral400',\n },\n },\n cursor: 'pointer',\n },\n false: {},\n },\n },\n\n compoundVariants: [\n {\n listItem: true,\n selected: true,\n css: {\n outline: '1px solid $secondary',\n },\n },\n {\n listItem: false,\n selected: true,\n css: {\n $$color: '$colors$info100',\n [`.${darkTheme} &`]: {\n $$color: '$colors$secondary600',\n },\n backgroundColor: '$$color',\n '&:hover': {\n backgroundColor: '$$color',\n },\n },\n },\n {\n listItem: true,\n selected: false,\n css: {\n cursor: 'pointer',\n '&:hover': {\n backgroundColor: '$neutral300',\n [`.${darkTheme} &`]: {\n backgroundColor: '$neutral400',\n },\n },\n },\n },\n ],\n});\n\nexport const summaryStyles = css({\n width: '100%',\n padding: '$15 $15 $10 $15',\n});\n\nexport const summaryHeaderStyles = css({\n display: 'flex',\n flexDirection: 'row',\n justifyContent: 'space-between',\n alignItems: 'center',\n paddingBottom: '$10',\n position: 'relative',\n});\n\nexport const rowStyles = css({\n display: 'flex',\n flexDirection: 'row',\n justifyContent: 'center',\n alignItems: 'center',\n '.blockchainImage': {\n marginLeft: '-$8',\n },\n});\nexport const basicInfoStyles = css({\n display: 'flex',\n alignItems: 'center',\n '.usd-value': {\n $$color: '$colors$neutral600',\n [`.${darkTheme} &`]: {\n $$color: '$colors$neutral700',\n },\n color: '$$color',\n },\n});\n\nexport const Trigger = styled(Collapsible.Trigger, {\n display: 'flex',\n width: '100%',\n justifyContent: 'space-between',\n alignItems: 'center',\n height: '$36',\n padding: '$10 $15',\n boxSizing: 'border-box',\n cursor: 'pointer',\n border: 'none',\n outline: 'none',\n backgroundColor: 'transparent',\n variants: {\n error: {\n true: {\n [`& ${Image}`]: {\n border: '1px $warning500 solid',\n borderRadius: '100%',\n },\n },\n false: {\n [`& ${Image}`]: {\n border: '1px transparent solid',\n borderRadius: '100%',\n },\n },\n },\n selected: {\n true: {},\n false: {\n $$color: '$colors$neutral400',\n [`.${darkTheme} &`]: {\n $$color: '$colors$neutral200',\n },\n backgroundColor: '$$color',\n },\n },\n listItem: {\n true: {\n $$color: '$colors$neutral400',\n [`.${darkTheme} &`]: {\n $$color: '$colors$neutral200',\n },\n backgroundColor: '$$color',\n },\n false: {},\n },\n },\n\n compoundVariants: [\n {\n listItem: false,\n selected: true,\n css: {\n $$color: '$colors$info300',\n [`.${darkTheme} &`]: {\n $$color: '$colors$secondary800',\n },\n backgroundColor: '$$color',\n },\n },\n ],\n '.blockchains_section': {\n display: 'none',\n },\n '@xs': {\n '.blockchains_section': {\n display: 'block',\n },\n },\n});\n\nexport const ImageContainer = styled('div', {\n width: '18px',\n height: '18px',\n borderRadius: '100%',\n display: 'flex',\n justifyContent: 'center',\n alignItems: 'center',\n border: '1.5px transparent solid',\n img: {\n borderRadius: '100%',\n },\n variants: {\n state: {\n error: {\n borderColor: '$error500',\n },\n warning: { borderColor: '$warning500' },\n },\n },\n});\n\nexport const Content = styled(CollapsibleContent, {\n width: '100%',\n background: 'inherit',\n});\n\nexport const IconContainer = styled('div', {\n display: 'flex',\n justifyContent: 'center',\n alignItems: 'center',\n padding: '$2',\n transition: `all ${EXPANDABLE_QUOTE_TRANSITION_DURATION}ms ease`,\n variants: {\n orientation: {\n down: {\n transform: 'rotate(0)',\n },\n up: {\n transform: 'rotate(180deg)',\n },\n },\n },\n});\n\nexport const Separator = styled('div', {\n height: '$12',\n marginLeft: '$10',\n marginRight: '$10',\n borderLeft: '1px solid $foreground',\n});\n\nexport const HorizontalSeparator = styled('div', {\n display: 'flex',\n justifyContent: 'center',\n margin: '0 $15',\n borderTop: '1px solid',\n $$color: '$colors$neutral300',\n [`.${darkTheme} &`]: {\n $$color: '$colors$neutral400',\n },\n borderColor: '$$color',\n});\n\nexport const FrameIcon = styled('div', {\n width: '$16',\n height: '$16',\n justifyContent: 'center',\n alignItems: 'center',\n display: 'flex',\n});\n\nexport const BasicInfoOutput = styled(Typography, {\n overflow: 'hidden',\n textOverflow: 'ellipsis',\n letterSpacing: 0.4,\n});\n\nexport const ContainerInfoOutput = styled('div', {\n display: 'flex',\n flexWrap: 'wrap',\n});\n\nexport const MoreStep = styled('div', {\n width: '18px',\n height: '18px',\n borderRadius: '100%',\n backgroundColor: '$background',\n cursor: 'default',\n display: 'flex',\n justifyContent: 'center',\n alignItems: 'center',\n border: '1.5px transparent solid',\n variants: {\n state: {\n error: {\n borderColor: '$error500',\n },\n warning: { borderColor: '$warning500' },\n },\n },\n});\n\nexport const TagContainer = styled('div', {\n display: 'flex',\n});\n\nexport const Line = styled('div', {\n width: '100%',\n borderTopWidth: '1px',\n borderTopStyle: 'solid',\n borderTopColor: '$neutral',\n margin: '$5 0',\n [`.${darkTheme} &`]: {\n borderTopColor: '$neutral800',\n },\n});\n", "import type { QuoteCostDetailsProps } from './Quote.types';\nimport type { NameOfFees } from '../../constants/quote';\nimport type BigNumber from 'bignumber.js';\n\nimport { i18n } from '@lingui/core';\nimport {\n ChevronDownIcon,\n CloseIcon,\n Divider,\n IconButton,\n QuoteCost,\n Tooltip,\n Typography,\n} from '@rango-dev/ui';\nimport React, { useState } from 'react';\n\nimport { NAME_OF_FEES } from '../../constants/quote';\nimport {\n GAS_FEE_MAX_DECIMALS,\n GAS_FEE_MIN_DECIMALS,\n USD_VALUE_MAX_DECIMALS,\n USD_VALUE_MIN_DECIMALS,\n} from '../../constants/routing';\nimport { getContainer } from '../../utils/common';\nimport { formatTooltipNumbers, numberToString } from '../../utils/numbers';\nimport { getFeesGroup, getTotalFeesInUsd, getUsdFee } from '../../utils/swap';\nimport { WatermarkedModal } from '../common/WatermarkedModal';\nimport { CustomCollapsible } from '../CustomCollapsible/CustomCollapsible';\nimport { ExpandedIcon } from '../CustomCollapsible/CustomCollapsible.styles';\n\nimport {\n FeeSection,\n Line,\n ModalContainer,\n ModalHeader,\n trigger,\n} from './QuoteCostDetails.styles';\n\nconst NonPayableFee = (props: { fee: BigNumber; label: string }) => {\n return !props.fee.isZero() ? (\n <FeeSection>\n <Typography variant=\"label\" size=\"medium\" color=\"neutral600\">\n {props.label}\n </Typography>\n <Typography variant=\"label\" size=\"medium\">\n $\n {numberToString(\n props.fee,\n USD_VALUE_MIN_DECIMALS,\n USD_VALUE_MAX_DECIMALS\n )}\n </Typography>\n </FeeSection>\n ) : null;\n};\n\nexport function QuoteCostDetails(props: QuoteCostDetailsProps) {\n const [open, setOpen] = useState<boolean>(false);\n const [openCollapse, setOpenCollapse] = useState<boolean>(false);\n const { steps, quote, fee, time, feeWarning, showModalFee } = props;\n const swaps = quote?.swaps ?? [];\n const container = getContainer();\n\n const feesGroup = getFeesGroup(swaps);\n\n return (\n <>\n <QuoteCost\n onClickFee={\n showModalFee\n ? (e) => {\n e.stopPropagation();\n setOpen(!open);\n }\n : undefined\n }\n fee={fee}\n feeWarning={feeWarning}\n time={time}\n steps={steps}\n tooltipGas={showModalFee ? i18n.t('View more info') : undefined}\n tooltipContainer={container}\n />\n\n <WatermarkedModal\n container={container}\n open={open}\n header={\n <ModalHeader>\n <Typography variant=\"title\" size=\"medium\">\n {i18n.t('Gas & Fee Explanation')}\n </Typography>\n\n <IconButton onClick={() => setOpen(false)} variant=\"ghost\">\n <CloseIcon color=\"gray\" size={14} />\n </IconButton>\n </ModalHeader>\n }\n onClose={() => {\n setOpen(false);\n }}>\n <ModalContainer>\n <Typography variant=\"title\" size=\"small\">\n {i18n.t('Details')}\n </Typography>\n <Divider size={10} />\n {Object.entries(feesGroup.payable).flatMap(\n ([payableFeesKey, feeArray]) =>\n feeArray.map((fee, index) => {\n const key = `payable-fee-${index}`;\n const usdValue = getUsdFee(fee);\n return (\n <FeeSection key={key}>\n <Typography\n variant=\"label\"\n size=\"medium\"\n color=\"neutral600\">\n {NAME_OF_FEES[payableFeesKey as NameOfFees]}\n </Typography>\n <Tooltip\n content={formatTooltipNumbers(fee.amount)}\n container={container}>\n <Typography variant=\"label\" size=\"medium\">\n {numberToString(\n fee.amount,\n GAS_FEE_MIN_DECIMALS,\n GAS_FEE_MAX_DECIMALS\n )}{' '}\n {fee.asset.symbol} ($\n {numberToString(\n usdValue,\n USD_VALUE_MIN_DECIMALS,\n USD_VALUE_MAX_DECIMALS\n )}\n )\n </Typography>\n </Tooltip>\n </FeeSection>\n );\n })\n )}\n\n <FeeSection className=\"total_payable_fee\">\n <Typography variant=\"label\" size=\"medium\">\n {i18n.t('Total Payable Fee')}\n </Typography>\n <Typography variant=\"label\" size=\"medium\">\n $\n {numberToString(\n fee,\n USD_VALUE_MIN_DECIMALS,\n USD_VALUE_MAX_DECIMALS\n )}\n </Typography>\n </FeeSection>\n <Line />\n {Object.keys(feesGroup.nonePayable).length && (\n <CustomCollapsible\n triggerAnchor=\"bottom\"\n onClickTrigger={() => setOpenCollapse((prev) => !prev)}\n trigger={\n <div className={trigger()}>\n <Typography size=\"small\" variant=\"body\" color=\"neutral700\">\n {openCollapse\n ? i18n.t('Hide non-payable fees')\n : i18n.t('Show non-payable fees')}\n </Typography>\n <Divider size={4} direction=\"horizontal\" />\n <ExpandedIcon orientation={openCollapse ? 'up' : 'down'}>\n <ChevronDownIcon size={12} color=\"gray\" />\n </ExpandedIcon>\n </div>\n }\n open={openCollapse}>\n <Typography size=\"small\" variant=\"title\">\n {i18n.t('Description')}\n </Typography>\n <Divider size={4} />\n <Typography size=\"small\" variant=\"body\" color=\"neutral700\">\n {i18n.t(`The following fees are considered in the transaction output and\n you won\u2019t need to pay extra gas for them.`)}\n </Typography>\n <Divider size={10} />\n {Object.entries(feesGroup.nonePayable).map(\n ([nonPayableFeesKey, fees], index) => {\n const totalFeeInUsd = getTotalFeesInUsd(fees);\n const label = NAME_OF_FEES[nonPayableFeesKey as NameOfFees];\n const key = `non-payable-fee-${index}`;\n return (\n <NonPayableFee\n key={key}\n fee={totalFeeInUsd}\n label={label}\n />\n );\n }\n )}\n\n <Line />\n </CustomCollapsible>\n )}\n </ModalContainer>\n </WatermarkedModal>\n </>\n );\n}\n", "import { css, styled } from '@rango-dev/ui';\n\nexport const FeeSection = styled('div', {\n display: 'flex',\n justifyContent: 'space-between',\n alignItems: 'center',\n padding: '$5 0',\n '&.total_payable_fee': {\n padding: '$12 0',\n },\n});\n\nexport const Line = styled('div', {\n width: '100%',\n borderTop: '1px solid $neutral300',\n margin: '$10 0',\n});\n\nexport const ModalContainer = styled('div', {\n padding: '$20 0',\n display: 'flex',\n flexDirection: 'column',\n '& .collapsible_trigger': {\n display: 'flex',\n alignItems: 'center',\n },\n});\n\nexport const ModalHeader = styled('div', {\n padding: '$20 $20 $10',\n textAlign: 'center',\n position: 'relative',\n '._icon-button': {\n position: 'absolute',\n zIndex: 10,\n top: '$16',\n right: '$16',\n },\n});\nexport const trigger = css({\n display: 'flex',\n flexDirection: 'row',\n alignItems: 'center',\n padding: '$5',\n '&:hover': {\n '& ._typography, & svg': {\n color: '$secondary',\n },\n },\n});\n", "import type { PriceImpactWarningLevel, Step } from '@rango-dev/ui';\n\nimport { i18n } from '@lingui/core';\nimport { TokenAmount } from '@rango-dev/ui';\nimport React from 'react';\n\nimport { getContainer } from '../../utils/common';\n\nimport { Container, separatorStyles } from './QuoteSummary.styles';\n\ntype PropTypes = {\n from: Step['from'];\n to: Step['to'];\n percentageChange?: string | null;\n warningLevel: PriceImpactWarningLevel;\n};\n\nexport function QuoteSummary(props: PropTypes) {\n const { from, to, percentageChange, warningLevel } = props;\n\n return (\n <Container>\n <TokenAmount\n direction=\"horizontal\"\n label={i18n.t('Swap input')}\n type=\"input\"\n tooltipContainer={getContainer()}\n price={{\n value: from.price.value,\n usdValue: from.price.usdValue,\n realValue: from.price.realValue,\n realUsdValue: from.price.realUsdValue,\n }}\n token={{\n displayName: from.token.displayName,\n image: from.token.image,\n }}\n chain={{ image: from.chain.image }}\n />\n <div className={separatorStyles()} />\n <TokenAmount\n direction=\"horizontal\"\n tooltipContainer={getContainer()}\n label={i18n.t('Estimated output')}\n type=\"output\"\n price={{\n value: to.price.value,\n usdValue: to.price.usdValue,\n realValue: to.price.realValue,\n realUsdValue: to.price.realUsdValue,\n }}\n token={{\n displayName: to.token.displayName,\n image: to.token.image,\n }}\n chain={{ image: to.chain.image }}\n percentageChange={percentageChange}\n warningLevel={warningLevel}\n />\n </Container>\n );\n}\n", "import { css, styled } from '@rango-dev/ui';\n\nexport const Container = styled('div', {\n position: 'relative',\n display: 'flex',\n flexDirection: 'column',\n width: '100%',\n});\n\nexport const separatorStyles = css({\n height: '14px',\n marginLeft: '14px',\n position: 'absolute',\n borderLeft: '1px solid $foreground',\n top: '42%',\n});\n", "import type { QuoteTriggerImagesProps, QuoteTriggerProps } from './Quote.types';\n\nimport { i18n } from '@lingui/core';\nimport {\n ChevronDownIcon,\n ChevronRightIcon,\n Divider,\n Image,\n Tooltip,\n Typography,\n} from '@rango-dev/ui';\nimport React from 'react';\n\nimport useScreenDetect from '../../hooks/useScreenDetect';\nimport { getContainer } from '../../utils/common';\nimport { getUniqueBlockchains } from '../../utils/quote';\n\nimport {\n IconContainer,\n ImageContainer,\n MoreStep,\n rowStyles,\n Trigger,\n} from './Quote.styles';\n\nconst MAX_STEPS = 4;\nconst MAX_BLOCKCHAINS = 6;\n\nconst ImageComponent = (props: QuoteTriggerImagesProps) => {\n const tooltipContainer = getContainer();\n const { content, src, className, open, state } = props;\n return (\n <Tooltip\n container={tooltipContainer}\n side=\"bottom\"\n sideOffset={4}\n open={open}\n content={content}>\n <ImageContainer className={className} state={state}>\n <Image src={src} size={16} />\n </ImageContainer>\n </Tooltip>\n );\n};\n\nexport function QuoteTrigger(props: QuoteTriggerProps) {\n const { quoteRef, selected, setExpanded, steps, expanded, type } = props;\n const tooltipContainer = getContainer();\n const numberOfSteps = steps.length;\n const blockchains = getUniqueBlockchains(steps);\n const { isTablet, isMobile } = useScreenDetect();\n\n return (\n <Trigger\n listItem={type === 'list-item'}\n ref={(ref) => (quoteRef.current = ref)}\n selected={selected}\n onClick={(e) => {\n e.stopPropagation();\n setExpanded((prevState) => !prevState);\n }}>\n <div className={rowStyles()}>\n <Typography variant=\"body\" size=\"xsmall\">\n {i18n.t('Via:')}\n </Typography>\n <Divider direction=\"horizontal\" size={4} />\n {steps.map((step, index) => {\n const key = `item-${index}`;\n const arrow = (\n <IconContainer>\n <ChevronRightIcon size={12} color=\"black\" />\n </IconContainer>\n );\n\n return isMobile || isTablet ? (\n <React.Fragment key={key}>\n <ImageComponent\n content={step.swapper.displayName}\n src={step.swapper.image}\n state={step.state}\n />\n {index !== numberOfSteps - 1 && <>{arrow}</>}\n </React.Fragment>\n ) : (\n <React.Fragment key={key}>\n {numberOfSteps <= MAX_STEPS ||\n (numberOfSteps > MAX_STEPS && index < MAX_STEPS - 1) ? (\n <>\n <ImageComponent\n content={step.swapper.displayName}\n src={step.swapper.image}\n state={step.state}\n />\n {index !== numberOfSteps - 1 && <>{arrow}</>}\n </>\n ) : (\n index === MAX_STEPS - 1 && (\n <Tooltip\n container={tooltipContainer}\n side=\"bottom\"\n align=\"right\"\n sideOffset={4}\n content={\n <div className={rowStyles()}>\n {arrow}\n {steps.map((step, i) => {\n const key = `image-${i}`;\n return (\n i >= index && (\n <React.Fragment key={key}>\n <ImageComponent\n content={step.swapper.displayName}\n src={step.swapper.image}\n state={step.state}\n open={false}\n />\n {i !== numberOfSteps - 1 && <>{arrow}</>}\n </React.Fragment>\n )\n );\n })}\n </div>\n }>\n <MoreStep\n state={\n steps.find(\n (step, i) =>\n i >= index &&\n (step.state === 'error' || step.state === 'warning')\n )?.state\n }>\n <Typography size=\"xsmall\" variant=\"body\">\n +{numberOfSteps - index}\n </Typography>\n </MoreStep>\n </Tooltip>\n )\n )}\n </React.Fragment>\n );\n })}\n </div>\n <div className={rowStyles()}>\n <div className=\"blockchains_section\">\n <div className={rowStyles()}>\n <Typography variant=\"body\" size=\"xsmall\">\n {i18n.t('Chains:')}\n </Typography>\n <Divider direction=\"horizontal\" size={4} />\n {blockchains.map((blockchain, index) => (\n <React.Fragment key={blockchain.displayName}>\n {blockchains.length <= MAX_BLOCKCHAINS ||\n (blockchains.length > MAX_BLOCKCHAINS &&\n index < MAX_BLOCKCHAINS - 1) ? (\n <ImageComponent\n content={''}\n src={blockchain.image}\n open={false}\n className={index !== 0 ? 'blockchainImage' : ''}\n />\n ) : (\n index === MAX_BLOCKCHAINS - 1 && (\n <Tooltip\n container={tooltipContainer}\n side=\"bottom\"\n align=\"right\"\n sideOffset={4}\n content={\n <div className={rowStyles()}>\n {blockchains.map(\n (chain, i) =>\n i >= index && (\n <ImageComponent\n key={chain.displayName}\n content={''}\n src={chain.image}\n open={false}\n className={i > index ? 'blockchainImage' : ''}\n />\n )\n )}\n </div>\n }>\n <MoreStep className={'blockchainImage'}>\n <Typography size=\"xsmall\" variant=\"body\">\n +{blockchains.length - index}\n </Typography>\n </MoreStep>\n </Tooltip>\n )\n )}\n </React.Fragment>\n ))}\n\n <Divider direction=\"horizontal\" size={32} />\n </div>\n </div>\n\n <IconContainer orientation={expanded ? 'up' : 'down'}>\n <ChevronDownIcon size={12} color=\"black\" />\n </IconContainer>\n </div>\n </Trigger>\n );\n}\n", "import { useEffect, useState } from 'react';\n\n/*\n * mobile: screen <= 480\n * tablet: screen > 480 and screen <= 768\n * notebook: screen > 768 & screen <= 1024\n * large: screen > 1024 & screen <= 1200\n * extra large: screen > 1200\n */\n\nconst MIN_TABLET_WIDTH = 480;\nconst MIN_NOTEBOOK_WIDTH = 768;\nconst MIN_LARGE_SCREEN_WIDTH = 1024;\nconst MIN_EXTRA_LARGE_SCREEN_WIDTH = 1200;\n\nconst useScreenDetect = () => {\n const [isMobile, setIsMobile] = useState(false);\n const [isTablet, setIsTablet] = useState(false);\n const [isNotebook, setIsNotebook] = useState(false);\n const [isLargeScreen, setIsLargeScreen] = useState(false);\n const [isExtraLargeScreen, setIsExtraLargeScreen] = useState(false);\n\n const handleResize = () => {\n setIsMobile(window.innerWidth <= MIN_TABLET_WIDTH);\n setIsTablet(\n window.innerWidth > MIN_TABLET_WIDTH &&\n window.innerWidth <= MIN_NOTEBOOK_WIDTH\n );\n setIsNotebook(\n window.innerWidth > MIN_NOTEBOOK_WIDTH &&\n window.innerWidth <= MIN_LARGE_SCREEN_WIDTH\n );\n setIsLargeScreen(\n window.innerWidth > MIN_LARGE_SCREEN_WIDTH &&\n window.innerWidth <= MIN_EXTRA_LARGE_SCREEN_WIDTH\n );\n setIsExtraLargeScreen(window.innerWidth > MIN_EXTRA_LARGE_SCREEN_WIDTH);\n };\n\n useEffect(() => {\n handleResize(); // Initial check\n window.addEventListener('resize', handleResize);\n return () => window.removeEventListener('resize', handleResize);\n }, []);\n\n return { isMobile, isTablet, isNotebook, isLargeScreen, isExtraLargeScreen };\n};\n\nexport default useScreenDetect;\n", "import type { PropTypes } from './QuoteSkeleton.types';\n\nimport { Divider, Skeleton } from '@rango-dev/ui';\nimport React from 'react';\n\nimport { Chains, Container, Steps } from './QuoteSkeleton.styles';\nimport { QuoteSummarySkeleton } from './QuoteSummarySkeleton';\nimport { StepSkeleton } from './StepSkeleton';\n\nexport function QuoteSkeleton(props: PropTypes) {\n const { type, expanded, tagHidden = false } = props;\n\n return (\n <Container rounded={type !== 'basic'}>\n <QuoteSummarySkeleton type={type} tagHidden={tagHidden} />\n <Chains>\n <Skeleton height={15} variant=\"rounded\" />\n </Chains>\n\n {expanded && (\n <Steps>\n <Divider size={20} />\n <StepSkeleton />\n <StepSkeleton />\n <StepSkeleton separator={false} />\n </Steps>\n )}\n </Container>\n );\n}\n", "import { darkTheme, styled } from '@rango-dev/ui';\n\nexport const Container = styled('div', {\n $$color: '$colors$neutral100',\n [`.${darkTheme} &`]: {\n $$color: '$colors$neutral300',\n },\n backgroundColor: '$$color',\n borderBottomLeftRadius: '$xm',\n borderBottomRightRadius: '$xm',\n padding: '$15 ',\n variants: {\n rounded: {\n true: {\n borderRadius: '$xm',\n },\n },\n },\n});\n\nexport const Chains = styled('div', {\n paddingTop: '$2',\n});\n\nexport const Steps = styled('div', {\n paddingLeft: '$8',\n});\n\nexport const StepSeparator = styled('div', {\n borderLeft: '1px dashed $foreground',\n minHeight: ' 0',\n margin: '0px 11.5px',\n alignSelf: 'stretch',\n variants: {\n hideSeparator: {\n true: {\n minHeight: 'unset',\n height: '0',\n },\n },\n },\n});\n", "import type { PropTypes } from './QuoteSummarySkeleton.types';\n\nimport { ChainToken, Divider, Skeleton } from '@rango-dev/ui';\nimport React from 'react';\n\nimport { Line } from '../Quote/Quote.styles';\n\nimport {\n BasicSummary,\n FlexContent,\n Output,\n OutputTokenInfo,\n QuoteSummary,\n QuoteSummarySeparator,\n RowStyle,\n SwapPreview,\n TokenAmount,\n TokenAmountLabel,\n} from './QuoteSummarySkeleton.styles';\n\nexport function QuoteSummarySkeleton(props: PropTypes) {\n const { type, tagHidden = true } = props;\n const quotePreview = (\n <QuoteSummary>\n <TokenAmount>\n <ChainToken loading size=\"medium\" chainImage=\"\" tokenImage=\"\" />\n <Divider size={8} direction=\"horizontal\" />\n <TokenAmountLabel>\n <Skeleton height={10} width={60} variant=\"rounded\" />\n <Divider size={4} />\n <Skeleton height={15} variant=\"rounded\" />\n </TokenAmountLabel>\n </TokenAmount>\n <Skeleton height={12} width={64} variant=\"rounded\" />\n </QuoteSummary>\n );\n const showAllRoutesSkeleton = type === 'basic' && !tagHidden;\n\n return (\n <div>\n {!tagHidden && (\n <>\n <FlexContent>\n <Skeleton width={65} height={14} variant=\"rounded\" />\n <Divider size={4} direction=\"horizontal\" />\n <Skeleton width={65} height={14} variant=\"rounded\" />\n <Divider size={4} direction=\"horizontal\" />\n <Skeleton width={65} height={14} variant=\"rounded\" />\n </FlexContent>\n <Line />\n {!showAllRoutesSkeleton && <Divider size={4} />}\n </>\n )}\n <div className={RowStyle()}>\n <FlexContent>\n <Skeleton width={60} height={10} variant=\"rounded\" />\n <Divider size={4} direction=\"horizontal\" />\n <Skeleton width={60} height={10} variant=\"rounded\" />\n <Divider size={4} direction=\"horizontal\" />\n <Skeleton width={60} height={10} variant=\"rounded\" />\n </FlexContent>\n {showAllRoutesSkeleton && (\n <Skeleton width={100} height={22} variant=\"rounded\" />\n )}\n </div>\n\n {type === 'basic' && (\n <BasicSummary>\n <Skeleton height={15} width={148} variant=\"rounded\" />\n </BasicSummary>\n )}\n {type === 'list-item' && (\n <Output>\n <OutputTokenInfo>\n <ChainToken loading size=\"medium\" chainImage=\"\" tokenImage=\"\" />\n <Divider direction=\"horizontal\" size={4} />\n <Skeleton height={15} width={150} variant=\"rounded\" />\n </OutputTokenInfo>\n <Divider size={10} />\n <Skeleton height={10} width={184} variant=\"rounded\" />\n </Output>\n )}\n {type === 'swap-preview' && (\n <>\n <Divider size={4} />\n <SwapPreview>\n {quotePreview}\n <QuoteSummarySeparator />\n {quotePreview}\n </SwapPreview>\n </>\n )}\n </div>\n );\n}\n", "import { css, styled } from '@rango-dev/ui';\n\nexport const FlexContent = styled('div', {\n display: 'flex',\n});\n\nexport const BasicSummary = styled('div', {\n padding: '$10 $0 $20',\n});\n\nexport const Output = styled('div', {\n padding: '$12 $0 $20 $0',\n display: 'flex',\n flexDirection: 'column',\n});\n\nexport const OutputTokenInfo = styled('div', {\n display: 'flex',\n justifyContent: 'start',\n alignItems: 'center',\n});\n\nexport const QuoteSummary = styled('div', {\n display: 'flex',\n justifyContent: 'space-between',\n alignItems: 'end',\n});\n\nexport const QuoteSummarySeparator = styled('div', {\n height: '$28',\n marginLeft: '13px',\n borderLeft: '1px solid $neutral700',\n});\n\nexport const TokenAmount = styled('div', {\n width: '65%',\n display: 'flex',\n justifyContent: 'start',\n});\n\nexport const TokenAmountLabel = styled('div', {\n display: 'flex',\n flexDirection: 'column',\n alignItems: 'start',\n flexGrow: 1,\n maxWidth: '148px',\n});\n\nexport const SwapPreview = styled('div', { padding: '$15 $0 $15 $0' });\n\nexport const RowStyle = css({\n display: 'flex',\n justifyContent: 'space-between',\n alignItems: 'center',\n});\n", "import type { PropTypes } from './StepSkeleton.types';\n\nimport { ChainToken, Divider, NextIcon, Skeleton } from '@rango-dev/ui';\nimport React from 'react';\n\nimport { StepSeparator } from './QuoteSkeleton.styles';\nimport {\n StepContent,\n StepIconContainer,\n StepTitle,\n StepTokenInfo,\n StepTokens,\n} from './StepSkeleton.styles';\n\nexport function StepSkeleton(props: PropTypes) {\n const { separator = true } = props;\n return (\n <>\n <StepTitle>\n <Skeleton height={22} width={22} variant=\"circular\" />\n <Divider direction=\"horizontal\" size={8} />\n <Skeleton height={15} width={148} variant=\"rounded\" />\n </StepTitle>\n <StepContent>\n <StepSeparator hideSeparator={!separator} />\n <StepTokens>\n <StepTokenInfo>\n <ChainToken size=\"small\" loading chainImage=\"\" tokenImage=\"\" />\n <Divider direction=\"horizontal\" size={8} />\n <Skeleton height={12} variant=\"rounded\" />\n </StepTokenInfo>\n <StepIconContainer>\n <NextIcon color=\"gray\" size={16} />\n </StepIconContainer>\n <StepTokenInfo>\n <ChainToken size=\"small\" loading chainImage=\"\" tokenImage=\"\" />\n <Divider direction=\"horizontal\" size={8} />\n <Skeleton height={12} variant=\"rounded\" />\n </StepTokenInfo>\n </StepTokens>\n </StepContent>\n </>\n );\n}\n", "import { styled } from '@rango-dev/ui';\n\nexport const StepContent = styled('div', {\n display: 'flex',\n alignItems: 'start',\n});\n\nexport const StepTokens = styled('div', {\n flexGrow: 1,\n paddingTop: '$5',\n paddingBottom: '$10',\n display: 'flex',\n alignItems: 'center',\n});\n\nexport const StepTokenInfo = styled('div', {\n display: 'flex',\n alignItems: 'center',\n flexGrow: 1,\n});\n\nexport const StepIconContainer = styled('div', {\n margin: '$0 $2',\n padding: '$4',\n display: 'flex',\n justifyContent: 'center',\n alignItems: 'center',\n});\n\nexport const StepTitle = styled('div', {\n display: 'flex',\n alignItems: 'center',\n});\n", "import type { ConfirmSwap, Params } from './useConfirmSwap.types';\nimport type { PendingSwapSettings, SelectedQuote } from '../../types';\nimport type { ConfirmRouteRequest } from 'rango-sdk';\n\nimport { calculatePendingSwap } from '@rango-dev/queue-manager-rango-preset';\nimport { useEffect } from 'react';\n\nimport { useAppStore } from '../../store/AppStore';\nimport { useQuoteStore } from '../../store/quote';\nimport { getWalletsForNewSwap } from '../../utils/swap';\nimport { useFetchConfirmQuote } from '../useFetchConfirmQuote';\n\nimport {\n generateWarnings,\n handleQuoteErrors,\n throwErrorIfResponseIsNotValid,\n} from './useConfirmSwap.helpers';\n\nexport function useConfirmSwap(): ConfirmSwap {\n const {\n fromToken,\n toToken,\n inputAmount,\n setSelectedQuote,\n selectedQuote: initialQuote,\n customDestination: customDestinationFromStore,\n setQuoteWarningsConfirmed,\n resetAlerts,\n } = useQuoteStore();\n\n const { slippage, customSlippage } = useAppStore();\n const disabledLiquiditySources = useAppStore().getDisabledLiquiditySources();\n const blockchains = useAppStore().blockchains();\n const tokens = useAppStore().tokens();\n\n const userSlippage = customSlippage || slippage;\n\n const { fetch: fetchQuote, cancelFetch, loading } = useFetchConfirmQuote();\n\n useEffect(() => cancelFetch, []);\n\n const fetch: ConfirmSwap['fetch'] = async (params: Params) => {\n const selectedWallets = params.selectedWallets;\n const customDestination =\n params?.customDestination ?? customDestinationFromStore;\n\n if (!fromToken || !toToken || !inputAmount) {\n return {\n quote: null,\n swap: null,\n error: null,\n warnings: null,\n };\n }\n\n const wallets = selectedWallets.reduce(\n (acc: Record<string, string>, item) => {\n acc[item.chain] = item.address;\n return acc;\n },\n {}\n );\n const requestBody: ConfirmRouteRequest = {\n requestId: initialQuote?.requestId || '',\n selectedWallets: wallets,\n destination: customDestination || undefined,\n };\n\n try {\n return await fetchQuote(requestBody).then((response) => {\n const { result } = response;\n\n throwErrorIfResponseIsNotValid({\n diagnosisMessages: result.diagnosisMessages,\n requestId: result.requestId,\n swaps: result.result?.swaps,\n });\n\n const currentQuote: SelectedQuote = {\n outputAmount: result.result?.outputAmount,\n requestId: result.requestId,\n resultType: result.result?.resultType,\n swaps: result.result?.swaps || [],\n validationStatus: result.validationStatus,\n requestAmount: result.requestAmount,\n };\n setSelectedQuote(currentQuote);\n const swapSettings: PendingSwapSettings = {\n slippage: userSlippage.toString(),\n disabledSwappersGroups: disabledLiquiditySources,\n };\n const swap = calculatePendingSwap(\n inputAmount.toString(),\n result,\n getWalletsForNewSwap(selectedWallets),\n swapSettings,\n false,\n { blockchains, tokens }\n );\n\n const confirmSwapWarnings = generateWarnings(\n initialQuote ?? undefined,\n currentQuote,\n {\n fromToken,\n toToken,\n meta: { blockchains, tokens },\n selectedWallets,\n userSlippage,\n }\n );\n if (confirmSwapWarnings.quoteUpdate) {\n setQuoteWarningsConfirmed(false);\n }\n resetAlerts();\n\n return {\n quote: currentQuote,\n swap,\n error: null,\n warnings: confirmSwapWarnings,\n };\n });\n } catch (error: any) {\n const confirmSwapResult = handleQuoteErrors(error);\n return confirmSwapResult;\n }\n };\n\n return {\n loading,\n fetch,\n cancelFetch,\n };\n}\n", "import type { RequestOptions } from 'rango-sdk';\n\nimport { useRef, useState } from 'react';\n\ntype UseFetchOptions<TRequest, TResponse> = {\n request: (\n requestBody: TRequest,\n options?: RequestOptions\n ) => Promise<TResponse>;\n};\nexport type UseFetchResult<TRequest, TResponse> = {\n fetch: (requestBody: TRequest) => Promise<TResponse>;\n cancelFetch: () => void;\n loading: boolean;\n};\n\nexport function useFetch<TRequest, TResponse>({\n request,\n}: UseFetchOptions<TRequest, TResponse>): UseFetchResult<TRequest, TResponse> {\n const [loading, setLoading] = useState(false);\n const abortController = useRef<AbortController | null>(null);\n\n const cancelFetch = () => abortController.current?.abort();\n\n const fetch: UseFetchResult<TRequest, TResponse>['fetch'] = async (\n requestBody\n ) => {\n cancelFetch();\n abortController.current = new AbortController();\n\n setLoading(true);\n try {\n const res = await request(requestBody, {\n signal: abortController.current.signal,\n });\n\n abortController.current = null;\n return res;\n // eslint-disable-next-line no-useless-catch\n } catch (error) {\n throw error;\n } finally {\n setLoading(false);\n }\n };\n\n return { fetch, loading, cancelFetch };\n}\n", "import type { UseFetchResult } from './useFetch';\nimport type { ConfirmRouteRequest, ConfirmRouteResponse } from 'rango-sdk';\n\nimport { httpService } from '../services/httpService';\n\nimport { useFetch } from './useFetch';\n\nexport function useFetchConfirmQuote(): UseFetchResult<\n ConfirmRouteRequest,\n ConfirmRouteResponse\n> {\n const { fetch, loading, cancelFetch } = useFetch<\n ConfirmRouteRequest,\n ConfirmRouteResponse\n >({\n request: async (requestBody, options) =>\n await httpService().confirmRouteRequest(requestBody, options),\n });\n\n return { fetch, loading, cancelFetch };\n}\n", "import type { ConfirmSwapFetchResult } from './useConfirmSwap.types';\nimport type {\n ConfirmSwapWarnings,\n QuoteErrorResponse,\n QuoteResponse,\n SelectedQuote,\n Wallet,\n} from '../../types';\nimport type { BlockchainMeta, SwapResult, Token } from 'rango-sdk';\n\nimport { errorMessages } from '../../constants/errors';\nimport { QuoteErrorType, QuoteUpdateType } from '../../types';\nimport { numberToString } from '../../utils/numbers';\nimport {\n generateQuoteWarnings,\n getPriceImpact,\n isNumberOfSwapsChanged,\n isQuoteChanged,\n isQuoteInternalCoinsUpdated,\n isQuoteSwappersUpdated,\n} from '../../utils/quote';\nimport {\n checkSlippageErrors,\n generateBalanceWarnings,\n getLimitErrorMessage,\n getMinRequiredSlippage,\n getQuoteOutputAmount,\n hasLimitError,\n isOutputAmountChangedALot,\n} from '../../utils/swap';\n\n/**\n * A request can be successful but in body of the response, it can be some case which is considered as failed.\n */\nexport function throwErrorIfResponseIsNotValid(response: QuoteResponse) {\n if (!response.swaps) {\n throw new Error(errorMessages().noResultError.title, {\n cause: {\n type: QuoteErrorType.NO_RESULT,\n diagnosisMessage: response.diagnosisMessages?.[0],\n },\n });\n }\n const quoteError = getQuoteError(response.swaps);\n if (quoteError) {\n throw new Error(quoteError.message, {\n cause: quoteError.options,\n });\n }\n}\n\nexport function getQuoteError(swaps: SwapResult[]): QuoteErrorResponse | null {\n const limitError = hasLimitError(swaps);\n if (limitError) {\n const { swap, recommendation, fromAmountRangeError } =\n getLimitErrorMessage(swaps);\n return {\n message: 'bridge limit error',\n options: {\n type: QuoteErrorType.BRIDGE_LIMIT,\n swap,\n recommendation,\n fromAmountRangeError,\n },\n };\n }\n\n const recommendedSlippages = checkSlippageErrors(swaps);\n\n if (recommendedSlippages) {\n const minRequiredSlippage = getMinRequiredSlippage(swaps);\n return {\n message: '',\n options: {\n type: QuoteErrorType.INSUFFICIENT_SLIPPAGE,\n recommendedSlippages,\n minRequiredSlippage,\n },\n };\n }\n return null;\n}\n\nexport function generateWarnings(\n previousQuote: SelectedQuote | undefined,\n currentQuote: SelectedQuote,\n params: {\n fromToken: Token;\n toToken: Token;\n meta: { blockchains: BlockchainMeta[]; tokens: Token[] };\n selectedWallets: Wallet[];\n userSlippage: number;\n }\n): ConfirmSwapWarnings {\n let quoteChanged = false;\n if (previousQuote) {\n quoteChanged = isQuoteChanged(previousQuote, currentQuote);\n }\n const output: ConfirmSwapWarnings = {\n quote: null,\n quoteUpdate: null,\n balance: null,\n };\n\n const quoteWarning = generateQuoteWarnings(currentQuote, {\n fromToken: params.fromToken,\n toToken: params.toToken,\n tokens: params.meta.tokens,\n userSlippage: params.userSlippage,\n });\n\n if (quoteWarning) {\n output.quote = quoteWarning;\n }\n\n if (previousQuote && quoteChanged) {\n if (isOutputAmountChangedALot(previousQuote, currentQuote)) {\n output.quoteUpdate = {\n type: QuoteUpdateType.QUOTE_AND_OUTPUT_AMOUNT_UPDATED,\n newOutputAmount: numberToString(getQuoteOutputAmount(currentQuote)),\n percentageChange: numberToString(\n getPriceImpact(\n getQuoteOutputAmount(previousQuote) ?? '',\n getQuoteOutputAmount(currentQuote) ?? ''\n ),\n null,\n 2\n ),\n };\n } else if (isNumberOfSwapsChanged(previousQuote, currentQuote)) {\n output.quoteUpdate = {\n type: QuoteUpdateType.QUOTE_UPDATED,\n };\n } else if (isQuoteSwappersUpdated(previousQuote, currentQuote)) {\n output.quoteUpdate = {\n type: QuoteUpdateType.QUOTE_SWAPPERS_UPDATED,\n };\n } else if (isQuoteInternalCoinsUpdated(previousQuote, currentQuote)) {\n output.quoteUpdate = {\n type: QuoteUpdateType.QUOTE_COINS_UPDATED,\n };\n }\n }\n\n const balanceWarnings = generateBalanceWarnings(\n currentQuote,\n params.selectedWallets,\n params.meta.blockchains\n );\n\n const enoughBalance = balanceWarnings.length === 0;\n\n if (!enoughBalance) {\n output.balance = {\n messages: balanceWarnings,\n };\n }\n\n return output;\n}\n\nexport function handleQuoteErrors(error: any): ConfirmSwapFetchResult {\n if (error?.code === 'ERR_CANCELED') {\n return {\n swap: null,\n error: {\n type: QuoteErrorType.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: QuoteErrorType.REQUEST_FAILED,\n },\n warnings: null,\n };\n}\n", "import type { PendingSwap, 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 { HistoryGroupedList } from '../components/HistoryGroupedList';\nimport { NotFoundContainer } from '../components/HistoryGroupedList/HistoryGroupedList.styles';\nimport { Layout, PageContainer } from '../components/Layout';\nimport { SearchInput } from '../components/SearchInput';\nimport { groupSwapsByDate } from '../utils/date';\nimport { containsText } from '../utils/numbers';\nimport { getPendingSwaps } from '../utils/queue';\n\nconst HistoryGroupedListContainer = 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 navigate = useNavigate();\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 title: i18n.t('History'),\n }}>\n <PageContainer>\n <SearchInput\n setValue={setSearchedFor}\n fullWidth\n variant=\"contained\"\n placeholder={i18n.t('Search Transaction')}\n autoFocus\n onChange={searchHandler}\n value={searchedFor}\n />\n <Divider size=\"16\" />\n <HistoryGroupedListContainer>\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 <HistoryGroupedList\n list={filteredList}\n onSwapClick={navigate}\n groupBy={groupSwapsByDate}\n isLoading={loading}\n />\n )}\n </HistoryGroupedListContainer>\n </PageContainer>\n </Layout>\n );\n}\n", "import type { PropTypes } from './HistoryGroupedList.types';\n\nimport { i18n } from '@lingui/core';\nimport {\n Divider,\n GroupedVirtualizedList,\n Skeleton,\n SwapListItem,\n Typography,\n} from '@rango-dev/ui';\nimport React, { useCallback, useEffect, useRef, useState } from 'react';\n\nimport {\n TOKEN_AMOUNT_MAX_DECIMALS,\n TOKEN_AMOUNT_MIN_DECIMALS,\n} from '../../constants/routing';\nimport { getContainer } from '../../utils/common';\nimport { formatTooltipNumbers, numberToString } from '../../utils/numbers';\n\nimport { calculateGroupsSoFar } from './HistoryGroupedList.helpers';\nimport {\n Group,\n groupStyles,\n SwapItemContainer,\n SwapList,\n Time,\n} from './HistoryGroupedList.styles';\n\nconst ITEMS_PER_PAGE = 10;\n\nexport function HistoryGroupedList(props: PropTypes) {\n const { list, onSwapClick, groupBy, isLoading } = props;\n const [currentGroupCounts, setCurrentGroupCounts] = useState<number[]>([]);\n const loadedItems = useRef(0);\n const { swaps, groupCounts, groups } = groupBy(list);\n\n const calculateGroups = useCallback(calculateGroupsSoFar, []);\n\n const loadMore = useCallback(() => {\n const remainedItems = list.length - loadedItems.current;\n if (remainedItems) {\n loadedItems.current += Math.min(remainedItems, ITEMS_PER_PAGE);\n setCurrentGroupCounts(calculateGroups(groupCounts, loadedItems.current));\n }\n }, [list.length]);\n\n useEffect(() => {\n if (!isLoading) {\n loadMore();\n }\n }, [isLoading, loadMore]);\n\n if (isLoading) {\n // The number of items presented in each group.\n const swaps = [1, 2];\n const loadingGroups = [swaps, swaps];\n return (\n <>\n {loadingGroups.map((group, index) => {\n const key = index;\n return (\n <Group key={key}>\n <Time>\n <Skeleton variant=\"text\" width={60} size=\"small\" />\n <Divider size={16} />\n </Time>\n <Divider size={4} />\n <SwapList>\n {group.map((_, index) => {\n const key = index;\n return <SwapListItem isLoading={true} key={key} />;\n })}\n </SwapList>\n </Group>\n );\n })}\n </>\n );\n }\n\n return (\n <GroupedVirtualizedList\n endReached={() => {\n if (loadedItems.current < list.length) {\n loadMore();\n }\n }}\n groupCounts={currentGroupCounts}\n groupContent={(index) => {\n return (\n <Group>\n <Time>\n <Typography\n variant=\"label\"\n size=\"medium\"\n className={groupStyles()}>\n {groups[index]}\n </Typography>\n </Time>\n </Group>\n );\n }}\n itemContent={(index, groupIndex) => {\n const swap = swaps[index];\n if (!swap) {\n return null;\n }\n const firstStep = swap.steps[0];\n const lastStep = swap.steps[swap.steps.length - 1];\n return (\n <SwapItemContainer key={swap.requestId}>\n <SwapListItem\n requestId={swap.requestId}\n creationTime={swap.creationTime}\n status={swap.status}\n onClick={onSwapClick}\n tooltipContainer={getContainer()}\n onlyShowTime={groups[groupIndex] === i18n.t('Today')}\n swapTokenData={{\n from: {\n token: {\n image: firstStep.fromLogo,\n displayName: firstStep.fromSymbol,\n },\n blockchain: {\n image: firstStep.fromBlockchainLogo || '',\n },\n amount: numberToString(\n swap.inputAmount,\n TOKEN_AMOUNT_MIN_DECIMALS,\n TOKEN_AMOUNT_MAX_DECIMALS\n ),\n realAmount: formatTooltipNumbers(swap.inputAmount),\n },\n to: {\n token: {\n image: lastStep.toLogo,\n displayName: lastStep.toSymbol,\n },\n blockchain: {\n image: lastStep.toBlockchainLogo || '',\n },\n amount: numberToString(\n lastStep.outputAmount ||\n lastStep.expectedOutputAmountHumanReadable ||\n '',\n TOKEN_AMOUNT_MIN_DECIMALS,\n TOKEN_AMOUNT_MAX_DECIMALS\n ),\n realAmount: formatTooltipNumbers(\n lastStep.outputAmount ||\n lastStep.expectedOutputAmountHumanReadable\n ),\n },\n }}\n />\n </SwapItemContainer>\n );\n }}\n />\n );\n}\n", "/*\n * The calculateGroupsSoFar Slices the total groups into the groups which contain the items so far.\n * For example, if you have [10, 10, 10, 10] groups in total,\n * slicing them to 23 will result in [10, 10, 3] :\n * https://virtuoso.dev/grouped-with-load-on-demand/\n */\nexport function calculateGroupsSoFar(totalGroups: number[], count: number) {\n const groups: number[] = [];\n let index = 0;\n do {\n const group = totalGroups[index];\n groups.push(Math.min(group, count));\n count -= group;\n index++;\n } while (count > 0 && index <= totalGroups.length);\n return groups;\n}\n", "import { css, darkTheme, styled } from '@rango-dev/ui';\n\nexport const groupStyles = css();\n\nexport const SwapItemContainer = styled('div', {\n display: 'flex',\n justifyContent: 'center',\n alignItems: 'center',\n padding: '$5',\n});\n\nexport const Group = styled('div', {\n width: '100%',\n display: 'flex',\n flexDirection: 'column',\n backgroundColor: '$background',\n padding: '$10 $5 0 $5',\n [`& .${groupStyles}`]: {\n $$color: '$colors$neutral600',\n [`.${darkTheme} &`]: {\n $$color: '$colors$neutral700',\n },\n color: '$$color',\n },\n});\n\nexport const Time = styled('div', {\n display: 'flex',\n justifyContent: 'flex-start',\n padding: '$2',\n});\n\nexport const SwapList = styled('div', {\n gap: '$10',\n display: 'flex',\n flexDirection: 'column',\n});\n\nexport const NotFoundContainer = styled('div', {\n height: '100%',\n display: 'flex',\n justifyContent: 'center',\n alignItems: 'center',\n});\n", "import type { 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 { GroupBy } from '../components/HistoryGroupedList/HistoryGroupedList.types';\nimport type { PendingSwap } from 'rango-types';\n\nimport { i18n } from '@lingui/core';\nimport dayjs from 'dayjs';\n\nexport const groupSwapsByDate: GroupBy = (swaps) => {\n const output: Map<\n string,\n {\n title: string;\n swaps: PendingSwap[];\n }\n > = new Map([\n [\n 'today',\n {\n title: i18n.t('Today'),\n swaps: [],\n },\n ],\n [\n 'week',\n {\n title: i18n.t('This week'),\n swaps: [],\n },\n ],\n [\n 'month',\n {\n title: i18n.t('This month'),\n swaps: [],\n },\n ],\n [\n 'year',\n {\n title: i18n.t('This year'),\n swaps: [],\n },\n ],\n ]);\n\n function addYearsToOutput(key: string, swap: PendingSwap) {\n if (!output.has(key)) {\n output.set(key, {\n title: key,\n swaps: [],\n });\n }\n output.get(key)?.swaps.push(swap);\n }\n\n const now = dayjs();\n swaps.forEach((swap) => {\n const time = Number(swap.creationTime);\n const swapDate = dayjs(time);\n if (now.isSame(swapDate, 'day')) {\n output.get('today')?.swaps.push(swap);\n } else if (now.isSame(swapDate, 'week')) {\n output.get('week')?.swaps.push(swap);\n } else if (now.isSame(swapDate, 'month')) {\n output.get('month')?.swaps.push(swap);\n } else if (now.isSame(swapDate, 'year')) {\n output.get('year')?.swaps.push(swap);\n } else {\n const year = new Date(time).getFullYear().toString();\n addYearsToOutput(year, swap);\n }\n });\n\n const groupedSwaps = Array.from(output.values()).filter(\n (item) => item.swaps.length > 0\n );\n const items = groupedSwaps.flatMap((group) => group.swaps);\n const groupCounts = groupedSwaps.map((group) => group.swaps.length);\n const groups = groupedSwaps.map((group) => group.title);\n\n return { swaps: items, groupCounts, groups };\n};\n", "import type { SelectedQuote } from '../types';\n\nimport { i18n } from '@lingui/core';\nimport { Button, Divider, styled, WarningIcon } from '@rango-dev/ui';\nimport React, { useEffect, useState } from 'react';\nimport { useNavigate } from 'react-router-dom';\n\nimport { HeaderButtons } from '../components/HeaderButtons';\nimport { Layout, PageContainer } from '../components/Layout';\nimport { QuoteWarningsAndErrors } from '../components/QuoteWarningsAndErrors';\nimport { navigationRoutes } from '../constants/navigationRoutes';\nimport { ExpandedQuotes } from '../containers/ExpandedQuotes';\nimport { Inputs } from '../containers/Inputs';\nimport { QuoteInfo } from '../containers/QuoteInfo';\nimport useScreenDetect from '../hooks/useScreenDetect';\nimport { useSwapInput } from '../hooks/useSwapInput';\nimport { useAppStore } from '../store/AppStore';\nimport { useQuoteStore } from '../store/quote';\nimport { useUiStore } from '../store/ui';\nimport { useWalletsStore } from '../store/wallets';\nimport { isVariantExpandable } from '../utils/configs';\nimport { getSwapButtonState, isTokensIdentical } from '../utils/swap';\n\nconst MainContainer = styled('div', {\n display: 'grid',\n gridTemplateColumns: 'auto auto',\n alignItems: 'flex-start',\n maxHeight: 700,\n '& .footer__alert': {\n paddingTop: '0',\n },\n});\nexport const TIME_TO_NAVIGATE_ANOTHER_PAGE = 300;\n\nexport function Home() {\n const navigate = useNavigate();\n const {\n fromToken,\n toToken,\n inputAmount,\n selectedQuote,\n refetchQuote,\n error: quoteError,\n warning: quoteWarning,\n quotes,\n setSelectedQuote,\n resetQuoteWallets,\n setQuoteWarningsConfirmed,\n updateQuotePartialState,\n } = useQuoteStore();\n const [isVisibleExpanded, setIsVisibleExpanded] = useState<boolean>(false);\n const { isLargeScreen, isExtraLargeScreen } = useScreenDetect();\n\n const { fetch: fetchQuote, loading } = useSwapInput({ refetchQuote });\n const { config, fetchStatus: fetchMetaStatus } = useAppStore();\n\n const { connectedWallets } = useWalletsStore();\n const { isActiveTab } = useUiStore();\n const [showQuoteWarningModal, setShowQuoteWarningModal] = useState(false);\n\n const needsToWarnEthOnPath = false;\n\n const swapButtonState = getSwapButtonState({\n fetchMetaStatus,\n fetchingQuote: loading,\n inputAmount,\n quote: selectedQuote,\n anyWalletConnected: connectedWallets.length > 0,\n error: quoteError,\n warning: quoteWarning,\n needsToWarnEthOnPath,\n });\n\n const isExpandable = isVariantExpandable(\n isLargeScreen,\n isExtraLargeScreen,\n config?.variant\n );\n\n const hasInputs =\n !!inputAmount &&\n !!fromToken &&\n !!toToken &&\n inputAmount !== '0' &&\n !isTokensIdentical(fromToken, toToken);\n\n const fetchingQuote = hasInputs && fetchMetaStatus === 'success' && loading;\n\n const hasValidQuotes =\n !isExpandable || (isExpandable && quotes?.results.length);\n const hasWarningOrError = quoteWarning || quoteError;\n const showMessages = hasValidQuotes && hasWarningOrError;\n\n useEffect(() => {\n resetQuoteWallets();\n updateQuotePartialState('refetchQuote', true);\n }, []);\n\n useEffect(() => {\n setIsVisibleExpanded(hasInputs);\n }, [hasInputs]);\n\n const onClickRefresh =\n (!!selectedQuote || quoteError) && !showQuoteWarningModal\n ? fetchQuote\n : undefined;\n\n const onHandleNavigation = (route: string) => {\n if (isExpandable && isVisibleExpanded) {\n setIsVisibleExpanded(false);\n setTimeout(() => {\n navigate(route);\n }, TIME_TO_NAVIGATE_ANOTHER_PAGE);\n } else {\n navigate(route);\n }\n };\n\n const onClickOnQuote = (quote: SelectedQuote) => {\n if (selectedQuote?.requestId !== quote.requestId) {\n setShowQuoteWarningModal(false);\n setSelectedQuote(quote);\n }\n };\n\n return (\n <MainContainer>\n <Layout\n height=\"auto\"\n footer={\n <Button\n type=\"primary\"\n size=\"large\"\n disabled={swapButtonState.disabled || !isActiveTab}\n prefix={\n swapButtonState.action === 'confirm-warning' && <WarningIcon />\n }\n fullWidth\n onClick={() => {\n if (swapButtonState.action === 'connect-wallet') {\n onHandleNavigation(navigationRoutes.wallets);\n } else if (swapButtonState.action === 'confirm-warning') {\n setShowQuoteWarningModal(true);\n } else {\n onHandleNavigation(navigationRoutes.confirmSwap);\n }\n }}>\n {swapButtonState.title}\n </Button>\n }\n header={{\n onWallet: () => {\n onHandleNavigation(navigationRoutes.wallets);\n },\n hasBackButton: false,\n title: config.title || i18n.t('Swap'),\n suffix: (\n <HeaderButtons\n hidden={isExpandable ? ['refresh'] : undefined}\n onClickRefresh={onClickRefresh}\n onClickHistory={() => onHandleNavigation(navigationRoutes.swaps)}\n onClickSettings={() => {\n onHandleNavigation(navigationRoutes.settings);\n }}\n />\n ),\n }}>\n <PageContainer>\n <Inputs\n fetchingQuote={fetchingQuote}\n fetchMetaStatus={fetchMetaStatus}\n onClickToken={(mode) => {\n onHandleNavigation(\n mode === 'from'\n ? navigationRoutes.fromSwap\n : navigationRoutes.toSwap\n );\n }}\n />\n <Divider size=\"2\" />\n {!isExpandable ? (\n <QuoteInfo\n quote={selectedQuote}\n loading={fetchingQuote}\n error={quoteError}\n tagHidden={false}\n warning={quoteWarning}\n type=\"basic\"\n onClickAllRoutes={\n !!quotes && quotes.results.length > 1\n ? () => {\n updateQuotePartialState('refetchQuote', false);\n onHandleNavigation(navigationRoutes.routes);\n }\n : undefined\n }\n />\n ) : null}\n\n {showMessages ? (\n <>\n <Divider size=\"10\" />\n <QuoteWarningsAndErrors\n warning={quoteWarning}\n error={quoteError}\n refetchQuote={fetchQuote}\n showWarningModal={showQuoteWarningModal}\n confirmationDisabled={!isActiveTab}\n onOpenWarningModal={() => setShowQuoteWarningModal(true)}\n onCloseWarningModal={() => setShowQuoteWarningModal(false)}\n onConfirmWarningModal={() => {\n setShowQuoteWarningModal(false);\n setQuoteWarningsConfirmed(true);\n onHandleNavigation(navigationRoutes.confirmSwap);\n }}\n onChangeSettings={() =>\n onHandleNavigation(navigationRoutes.settings)\n }\n />\n </>\n ) : null}\n </PageContainer>\n </Layout>\n {isExpandable ? (\n <ExpandedQuotes\n loading={fetchingQuote}\n onClickOnQuote={onClickOnQuote}\n fetch={fetchQuote}\n onClickRefresh={onClickRefresh}\n isVisible={isVisibleExpanded}\n />\n ) : null}\n </MainContainer>\n );\n}\n", "import type { PropTypes } from './ExpandedQuotes.types';\n\nimport { i18n } from '@lingui/core';\nimport { Header } from '@rango-dev/ui';\nimport React, { useEffect, useState } from 'react';\n\nimport { HeaderButtons } from '../../components/HeaderButtons';\nimport { LayoutContainer } from '../../components/Layout/Layout.styles';\nimport { Quotes } from '../../components/Quotes';\nimport { SelectStrategy } from '../../components/Quotes/SelectStrategy';\nimport { WIDGET_UI_ID } from '../../constants';\nimport { useAppStore } from '../../store/AppStore';\nimport { getExpanded } from '../../utils/common';\n\nimport { Container, Content } from './ExpandedQuotes.styles';\n\nexport const TIME_TO_CLOSE_OPEN_EXPANDED = 100;\n\nexport function ExpandedQuotes(props: PropTypes) {\n const { fetch, loading, onClickOnQuote, onClickRefresh, isVisible } = props;\n const [isDelayedVisible, setIsDelayedVisible] = useState(false);\n const containerClass = isDelayedVisible ? '' : 'is-hidden';\n const { config } = useAppStore();\n const fullExpandedMode = config?.variant === 'full-expanded';\n\n useEffect(() => {\n let timeout: ReturnType<typeof setTimeout> | null = null;\n\n if (isVisible) {\n timeout = setTimeout(() => {\n setIsDelayedVisible(true);\n }, TIME_TO_CLOSE_OPEN_EXPANDED);\n } else {\n setIsDelayedVisible(false);\n if (timeout) {\n clearTimeout(timeout);\n }\n }\n\n return () => {\n if (timeout) {\n clearTimeout(timeout);\n }\n };\n }, [isVisible]);\n\n return (\n <Container\n expandMode={config?.variant === 'full-expanded' ? 'full' : 'default'}\n className={`${containerClass} ${LayoutContainer()}`}\n id={WIDGET_UI_ID.EXPANDED_BOX_ID}>\n <Header\n title={i18n.t('Routes')}\n suffix={\n <>\n <SelectStrategy container={getExpanded()} />\n <HeaderButtons\n onClickRefresh={onClickRefresh}\n hidden={['history', 'notifications', 'settings']}\n />\n </>\n }\n />\n <Content>\n <Quotes\n showModalFee={false}\n fetch={fetch}\n hasSort={false}\n loading={loading}\n onClickOnQuote={onClickOnQuote}\n fullExpandedMode={fullExpandedMode}\n />\n </Content>\n </Container>\n );\n}\n", "import type { PropTypes } from './Quotes.types';\nimport type { MultiRouteSimulationResult } from 'rango-sdk';\n\nimport { i18n } from '@lingui/core';\nimport { Divider, FullExpandedQuote, Typography } from '@rango-dev/ui';\nimport React from 'react';\n\nimport { QuoteInfo } from '../../containers/QuoteInfo';\nimport { getQuoteError } from '../../hooks/useConfirmSwap/useConfirmSwap.helpers';\nimport { useAppStore } from '../../store/AppStore';\nimport { useQuoteStore } from '../../store/quote';\nimport { QuoteErrorType, type SelectedQuote } from '../../types';\nimport { getContainer } from '../../utils/common';\nimport { generateQuoteWarnings, sortQuotesBy } from '../../utils/quote';\nimport { NoResult } from '../NoResult';\nimport { QuoteSkeleton } from '../QuoteSkeleton';\n\nimport { ErrorsContainer, StrategyContent } from './Quotes.styles';\nimport { SelectStrategy } from './SelectStrategy';\n\nconst ITEM_SKELETON_COUNT = 3;\nexport function Quotes(props: PropTypes) {\n const {\n loading,\n onClickOnQuote,\n fetch,\n showModalFee,\n hasSort = true,\n fullExpandedMode = false,\n } = props;\n const {\n selectedQuote,\n quotes,\n updateQuotePartialState,\n fromToken,\n toToken,\n sortStrategy,\n error,\n } = useQuoteStore();\n const { slippage, customSlippage } = useAppStore();\n const tokens = useAppStore().tokens();\n const hasQuotes = !!quotes && quotes.results.length;\n const userSlippage = customSlippage ?? slippage;\n const getQuoteWarning = (quote: MultiRouteSimulationResult) => {\n if (!fromToken || !toToken || !quotes) {\n return null;\n }\n const mergedQuote: SelectedQuote = {\n requestAmount: quotes.requestAmount, // Assuming quotes is an array\n ...quote,\n };\n\n return generateQuoteWarnings(mergedQuote, {\n fromToken,\n toToken,\n userSlippage,\n tokens,\n });\n };\n const showNoResultMessage =\n error?.type === QuoteErrorType.NO_RESULT ||\n error?.type === QuoteErrorType.REQUEST_FAILED;\n\n const sortQuotes = quotes?.results\n ? sortQuotesBy(sortStrategy, quotes?.results)\n : [];\n\n return (\n <>\n {loading &&\n Array.from({ length: ITEM_SKELETON_COUNT }, (_, index) => (\n <React.Fragment key={index}>\n {fullExpandedMode ? (\n <FullExpandedQuote loading />\n ) : (\n <QuoteSkeleton\n tagHidden={false}\n type=\"list-item\"\n expanded={false}\n />\n )}\n {index !== ITEM_SKELETON_COUNT - 1 && <Divider size={16} />}\n </React.Fragment>\n ))}\n\n {!loading && (\n <>\n {hasSort && (\n <>\n <StrategyContent>\n <Typography size=\"xmedium\" variant=\"title\">\n {i18n.t('Sort by')}\n </Typography>\n <SelectStrategy container={getContainer()} />\n </StrategyContent>\n <Divider size=\"10\" />\n </>\n )}\n {hasQuotes\n ? sortQuotes.map((quote, index) => {\n const quoteWarning = getQuoteWarning(quote);\n const quoteError = getQuoteError(quote.swaps);\n const lastIndex = sortQuotes.length - 1 === index;\n\n return (\n <React.Fragment key={quote.requestId}>\n <QuoteInfo\n showModalFee={showModalFee}\n selected={selectedQuote?.requestId === quote.requestId}\n tagHidden={false}\n quote={{ ...quote, requestAmount: quotes.requestAmount }}\n loading={loading}\n error={quoteError?.options || null}\n warning={quoteWarning}\n fullExpandedMode={fullExpandedMode}\n onClick={(quote) => {\n if (!quoteError) {\n updateQuotePartialState('warning', quoteWarning);\n }\n updateQuotePartialState(\n 'error',\n quoteError?.options || null\n );\n onClickOnQuote(quote);\n }}\n type=\"list-item\"\n />\n {!lastIndex && <Divider size={16} />}\n </React.Fragment>\n );\n })\n : showNoResultMessage && (\n <ErrorsContainer>\n <NoResult\n size={fullExpandedMode ? 'large' : 'small'}\n error={error}\n fetch={fetch}\n />\n </ErrorsContainer>\n )}\n </>\n )}\n </>\n );\n}\n", "import { styled } from '@rango-dev/ui';\n\nexport const ErrorsContainer = styled('div', {\n display: 'flex',\n justifyContent: 'center',\n flexDirection: 'column',\n height: '100%',\n});\n\nexport const StrategyContent = styled('div', {\n display: 'flex',\n justifyContent: 'space-between',\n alignItems: 'center',\n});\n\nexport const SelectContainer = styled('div', {\n width: '146px',\n});\n", "import { Select } from '@rango-dev/ui';\nimport React from 'react';\n\nimport { ROUTE_STRATEGY } from '../../constants/quote';\nimport { useQuoteStore } from '../../store/quote';\n\nimport { SelectContainer } from './Quotes.styles';\n\nexport function SelectStrategy(props: { container: HTMLElement }) {\n const { updateQuotePartialState, sortStrategy } = useQuoteStore();\n\n return (\n <SelectContainer>\n <Select\n container={props.container}\n options={ROUTE_STRATEGY}\n value={sortStrategy}\n handleItemClick={(item) => {\n updateQuotePartialState('sortStrategy', item.value);\n }}\n variant=\"filled\"\n />\n </SelectContainer>\n );\n}\n", "import { darkTheme, styled } from '@rango-dev/ui';\n\nexport const Container = styled('div', {\n transition: 'width 0.2s, opacity 0.2s, margin-left 0.2s',\n height: '700px',\n width: '390px',\n opacity: 1,\n marginLeft: '$16',\n backgroundColor: '$neutral100',\n [`.${darkTheme} &`]: {\n backgroundColor: '$neutral300',\n },\n\n variants: {\n expandMode: {\n default: {\n width: '390px',\n },\n full: {\n width: '719px',\n },\n },\n },\n\n '&.is-hidden': {\n width: 0,\n height: 0,\n opacity: 0,\n marginLeft: 0,\n },\n});\n\nexport const Content = styled('div', {\n position: 'relative',\n overflow: 'hidden',\n padding: '$20',\n flexGrow: 1,\n display: 'flex',\n flexDirection: 'column',\n overflowY: 'auto',\n borderRadius: '$primary',\n backgroundColor: '$background',\n});\n", "import type { PropTypes } from './Inputs.types';\n\nimport { i18n } from '@lingui/core';\nimport { SwapInput } from '@rango-dev/ui';\nimport React from 'react';\n\nimport { SwitchFromAndToButton } from '../../components/SwitchFromAndTo';\nimport { errorMessages } from '../../constants/errors';\nimport {\n PERCENTAGE_CHANGE_MAX_DECIMALS,\n PERCENTAGE_CHANGE_MIN_DECIMALS,\n TOKEN_AMOUNT_MAX_DECIMALS,\n TOKEN_AMOUNT_MIN_DECIMALS,\n USD_VALUE_MAX_DECIMALS,\n USD_VALUE_MIN_DECIMALS,\n} from '../../constants/routing';\nimport { useQuoteStore } from '../../store/quote';\nimport { useWalletsStore } from '../../store/wallets';\nimport { getContainer } from '../../utils/common';\nimport { formatTooltipNumbers, numberToString } from '../../utils/numbers';\nimport { getPriceImpact, getPriceImpactLevel } from '../../utils/quote';\nimport { canComputePriceImpact } from '../../utils/swap';\nimport { formatBalance, isFetchingBalance } from '../../utils/wallets';\n\nimport { Container, FromContainer } from './Inputs.styles';\n\nexport function Inputs(props: PropTypes) {\n const { fetchingQuote, fetchMetaStatus, onClickToken } = props;\n const {\n fromToken,\n fromBlockchain,\n toToken,\n toBlockchain,\n setInputAmount,\n inputAmount,\n inputUsdValue,\n outputAmount,\n outputUsdValue,\n selectedQuote,\n } = useQuoteStore();\n const { connectedWallets, getBalanceFor } = useWalletsStore();\n\n const fromTokenBalance = fromToken ? getBalanceFor(fromToken) : null;\n\n const fromTokenFormattedBalance =\n formatBalance(fromTokenBalance)?.amount ?? '0';\n\n const tokenBalanceReal =\n !!fromBlockchain && !!fromToken\n ? numberToString(fromTokenBalance?.amount, fromTokenBalance?.decimals)\n : '0';\n\n const fetchingBalance =\n !!fromBlockchain &&\n isFetchingBalance(connectedWallets, fromBlockchain.name);\n\n const priceImpactInputCanNotBeComputed = !canComputePriceImpact(\n selectedQuote,\n inputAmount,\n inputUsdValue\n );\n\n const priceImpactOutputCanNotBeComputed = !canComputePriceImpact(\n selectedQuote,\n inputAmount,\n outputUsdValue\n );\n\n const percentageChange =\n !inputUsdValue || !outputUsdValue || !outputUsdValue.gt(0)\n ? null\n : getPriceImpact(inputUsdValue.toString(), outputUsdValue.toString());\n return (\n <Container>\n <FromContainer>\n <SwapInput\n label={i18n.t('From')}\n mode=\"From\"\n onInputChange={setInputAmount}\n balance={fromTokenFormattedBalance}\n chain={{\n displayName: fromBlockchain?.displayName || '',\n image: fromBlockchain?.logo || '',\n }}\n token={{\n displayName: fromToken?.symbol || '',\n image: fromToken?.image || '',\n }}\n onClickToken={() => onClickToken('from')}\n price={{\n value: inputAmount,\n usdValue: priceImpactInputCanNotBeComputed\n ? undefined\n : numberToString(\n inputUsdValue,\n USD_VALUE_MIN_DECIMALS,\n USD_VALUE_MAX_DECIMALS\n ),\n realUsdValue: priceImpactInputCanNotBeComputed\n ? undefined\n : formatTooltipNumbers(inputUsdValue),\n error: priceImpactInputCanNotBeComputed\n ? errorMessages().unknownPriceError.impactTitle\n : undefined,\n }}\n disabled={fetchMetaStatus === 'failed'}\n loading={fetchMetaStatus === 'loading'}\n loadingBalance={fetchingBalance}\n tooltipContainer={getContainer()}\n onSelectMaxBalance={() => {\n if (fromTokenFormattedBalance !== '0') {\n setInputAmount(tokenBalanceReal.split(',').join(''));\n }\n }}\n />\n <SwitchFromAndToButton />\n </FromContainer>\n <SwapInput\n sharpBottomStyle={!!selectedQuote || fetchingQuote}\n label={i18n.t('To')}\n mode=\"To\"\n fetchingQuote={fetchingQuote}\n chain={{\n displayName: toBlockchain?.displayName || '',\n image: toBlockchain?.logo || '',\n }}\n token={{\n displayName: toToken?.symbol || '',\n image: toToken?.image || '',\n }}\n percentageChange={numberToString(\n getPriceImpact(inputUsdValue, outputUsdValue),\n PERCENTAGE_CHANGE_MIN_DECIMALS,\n PERCENTAGE_CHANGE_MAX_DECIMALS\n )}\n warningLevel={getPriceImpactLevel(percentageChange ?? 0)}\n price={{\n value: numberToString(\n outputAmount,\n TOKEN_AMOUNT_MIN_DECIMALS,\n TOKEN_AMOUNT_MAX_DECIMALS\n ),\n usdValue: priceImpactOutputCanNotBeComputed\n ? undefined\n : numberToString(\n outputUsdValue,\n USD_VALUE_MIN_DECIMALS,\n USD_VALUE_MAX_DECIMALS\n ),\n realValue: formatTooltipNumbers(outputAmount),\n realUsdValue: priceImpactOutputCanNotBeComputed\n ? undefined\n : formatTooltipNumbers(outputUsdValue),\n error: priceImpactOutputCanNotBeComputed\n ? errorMessages().unknownPriceError.impactTitle\n : undefined,\n }}\n onClickToken={() => onClickToken('to')}\n disabled={fetchMetaStatus === 'failed'}\n loading={fetchMetaStatus === 'loading'}\n tooltipContainer={getContainer()}\n />\n </Container>\n );\n}\n", "import { ReverseIcon, styled } from '@rango-dev/ui';\nimport React from 'react';\n\nimport { useQuoteStore } from '../store/quote';\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 = useQuoteStore.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 { styled } from '@rango-dev/ui';\n\nexport const Container = styled('div', {\n display: 'flex',\n flexDirection: 'column',\n gap: '$5',\n alignSelf: 'stretch',\n});\n\nexport const FromContainer = styled('div', {\n position: 'relative',\n});\n", "import type { Token } from 'rango-sdk';\n\nimport { useCallback, useEffect, useState } from 'react';\n\nimport { useAppStore } from '../store/AppStore';\nimport { useQuoteStore } from '../store/quote';\nimport { useWalletsStore } from '../store/wallets';\nimport { QuoteErrorType } from '../types';\nimport { debounce } from '../utils/common';\nimport { isPositiveNumber } from '../utils/numbers';\nimport {\n generateQuoteWarnings,\n getDefaultQuote,\n sortQuotesBy,\n} from '../utils/quote';\nimport { isFeatureEnabled } from '../utils/settings';\nimport { createQuoteRequestBody } from '../utils/swap';\nimport { areTokensEqual } from '../utils/wallets';\n\nimport {\n handleQuoteErrors,\n throwErrorIfResponseIsNotValid,\n} from './useConfirmSwap/useConfirmSwap.helpers';\nimport { useFetchAllQuotes } from './useFetchAllQuotes';\n\nconst DEBOUNCE_DELAY = 600;\nconst FIRST_INDEX = 0;\n\ntype FetchQuoteParams = Omit<\n Parameters<typeof createQuoteRequestBody>[typeof FIRST_INDEX],\n 'fromToken' | 'toToken'\n> & { fromToken: Token | null; toToken: Token | null };\n\ntype UseSwapInput = {\n fetch: (shouldChangeSelectedQuote?: boolean) => void;\n loading: boolean;\n};\ntype UseSwapInputProps = {\n refetchQuote: boolean;\n};\n/**\n * a hook for fetching quote based on from and to input values\n * we use this hook in home page\n */\nexport function useSwapInput({\n refetchQuote,\n}: UseSwapInputProps): UseSwapInput {\n const { fetch: fetchQuote, cancelFetch } = useFetchAllQuotes();\n const {\n excludeLiquiditySources: configExcludeLiquiditySources,\n features,\n enableCentralizedSwappers,\n } = useAppStore().config;\n const connectedWallets = useWalletsStore.use.connectedWallets();\n\n const tokens = useAppStore().tokens();\n const {\n fromToken,\n toToken,\n inputAmount,\n inputUsdValue,\n selectedQuote,\n sortStrategy,\n resetQuote,\n error,\n warning,\n setSelectedQuote,\n updateQuotePartialState,\n } = useQuoteStore();\n const {\n slippage,\n customSlippage,\n affiliatePercent,\n affiliateRef,\n affiliateWallets,\n fetchStatus,\n } = useAppStore();\n const liquiditySources = useAppStore().getLiquiditySources();\n const disabledLiquiditySources = useAppStore().getDisabledLiquiditySources();\n const excludeLiquiditySources = useAppStore().excludeLiquiditySources();\n\n const [loading, setLoading] = useState(true);\n const userSlippage = customSlippage ?? slippage;\n const tokensValueInvalid = !fromToken || !toToken;\n const shouldSkipRequest =\n tokensValueInvalid ||\n areTokensEqual(fromToken, toToken) ||\n !isPositiveNumber(inputAmount);\n\n const resetState = (loading: boolean) => {\n setLoading(loading);\n };\n\n const fetch = (params: FetchQuoteParams) => {\n const {\n fromToken,\n toToken,\n inputAmount,\n liquiditySources,\n excludeLiquiditySources,\n disabledLiquiditySources,\n slippage,\n affiliateRef,\n affiliatePercent,\n affiliateWallets,\n } = params;\n\n if (!loading) {\n resetState(true);\n }\n if (!shouldSkipRequest && fromToken && toToken) {\n resetQuote();\n const requestBody = createQuoteRequestBody({\n fromToken,\n toToken,\n inputAmount,\n liquiditySources: liquiditySources,\n excludeLiquiditySources,\n disabledLiquiditySources,\n wallets: connectedWallets,\n slippage,\n affiliateRef,\n affiliatePercent,\n affiliateWallets,\n enableCentralizedSwappers,\n });\n if (isFeatureEnabled('experimentalRoute', features)) {\n requestBody.experimental = true;\n }\n fetchQuote(requestBody)\n .then((res) => {\n const sortQuotes = sortQuotesBy(sortStrategy, res.results);\n const quote = getDefaultQuote(\n selectedQuote,\n sortQuotes,\n res.requestAmount\n );\n\n setLoading(false);\n updateQuotePartialState('quotes', res);\n setSelectedQuote(quote);\n\n throwErrorIfResponseIsNotValid({\n diagnosisMessages: res.diagnosisMessages,\n requestId: quote?.requestId || '',\n swaps: quote?.swaps,\n });\n\n const quoteWarning =\n quote &&\n generateQuoteWarnings(quote, {\n fromToken,\n toToken,\n userSlippage,\n tokens,\n });\n updateQuotePartialState('warning', quoteWarning);\n })\n .catch((error) => {\n const { error: quoteError } = handleQuoteErrors(error);\n if (\n quoteError?.type === QuoteErrorType.NO_RESULT ||\n quoteError?.type === QuoteErrorType.REQUEST_FAILED\n ) {\n resetQuote();\n }\n if (quoteError?.type !== QuoteErrorType.REQUEST_CANCELED) {\n updateQuotePartialState('error', quoteError);\n setLoading(false);\n }\n });\n }\n };\n\n const debouncedFetch = useCallback(\n debounce((params: FetchQuoteParams) => {\n if (!shouldSkipRequest) {\n fetch(params);\n }\n }, DEBOUNCE_DELAY),\n [shouldSkipRequest]\n );\n\n useEffect(() => {\n if (!refetchQuote) {\n setLoading(false);\n return;\n }\n if (fetchStatus !== 'success') {\n return;\n }\n if (shouldSkipRequest) {\n setLoading(false);\n if (selectedQuote || error || warning) {\n resetQuote();\n }\n return;\n }\n if (!isPositiveNumber(inputAmount) || inputUsdValue?.eq(0)) {\n resetState(false);\n cancelFetch();\n return;\n }\n\n resetQuote();\n resetState(true);\n debouncedFetch({\n inputAmount,\n fromToken,\n toToken,\n liquiditySources,\n excludeLiquiditySources,\n disabledLiquiditySources,\n slippage: userSlippage,\n affiliateRef,\n affiliatePercent,\n affiliateWallets,\n });\n return cancelFetch;\n }, [\n fetchStatus,\n inputAmount,\n fromToken?.symbol,\n fromToken?.address,\n fromToken?.blockchain,\n toToken?.symbol,\n toToken?.address,\n toToken?.blockchain,\n shouldSkipRequest,\n liquiditySources?.length,\n configExcludeLiquiditySources,\n disabledLiquiditySources.length,\n userSlippage,\n affiliateRef,\n affiliatePercent,\n JSON.stringify(affiliateWallets),\n ]);\n\n return {\n fetch: () =>\n fetch({\n inputAmount,\n fromToken,\n toToken,\n liquiditySources,\n excludeLiquiditySources,\n disabledLiquiditySources,\n slippage: userSlippage,\n affiliateRef,\n affiliatePercent,\n affiliateWallets,\n }),\n loading,\n };\n}\n", "import type { UseFetchResult } from './useFetch';\nimport type { BestRouteRequest, MultiRouteResponse } from 'rango-sdk';\n\nimport { httpService } from '../services/httpService';\n\nimport { useFetch } from './useFetch';\n\nexport function useFetchAllQuotes(): UseFetchResult<\n BestRouteRequest,\n MultiRouteResponse\n> {\n const { fetch, loading, cancelFetch } = useFetch<\n BestRouteRequest,\n MultiRouteResponse\n >({\n request: async (requestBody, options) =>\n await httpService().getAllRoutes(requestBody, options),\n });\n\n return { fetch, loading, cancelFetch };\n}\n", "import { i18n } from '@lingui/core';\nimport {\n List,\n ListItemButton,\n Radio,\n RadioRoot,\n Typography,\n} from '@rango-dev/ui';\nimport React from 'react';\n\nimport { Layout, PageContainer } from '../components/Layout';\nimport { useLanguage } from '../hooks/useLanguage';\n\nexport function LanguagePage() {\n const { activeLanguage, changeLanguage, languages } = useLanguage();\n\n const languageList = languages.map((languageItem) => {\n const { local, label, SVGFlag } = languageItem;\n return {\n id: local,\n value: local,\n title: (\n <Typography variant=\"title\" size=\"xmedium\">\n {label}\n </Typography>\n ),\n onClick: () => changeLanguage(languageItem.local),\n end: <Radio value={local} />,\n start: <SVGFlag />,\n };\n });\n\n return (\n <Layout\n header={{\n title: i18n.t('Language'),\n }}>\n <PageContainer>\n <RadioRoot value={activeLanguage}>\n <List\n type={\n <ListItemButton\n title={i18n.t('language')}\n id=\"_\"\n onClick={() => console.log()}\n />\n }\n items={languageList}\n />\n </RadioRoot>\n </PageContainer>\n </Layout>\n );\n}\n", "import type { LanguageItem } from '../constants/languages';\n\nimport { type Language } from '@rango-dev/ui';\n\nimport { DEFAULT_LANGUAGE, LANGUAGES } from '../constants/languages';\nimport { useAppStore } from '../store/AppStore';\n\ninterface UseLanguage {\n languages: LanguageItem[];\n defaultLanguage: Language;\n activeLanguage: Language;\n changeLanguage: (language?: Language | null) => void;\n resetLanguage: () => void;\n}\n\nexport function useLanguage(): UseLanguage {\n const { setLanguage, language, config } = useAppStore();\n const languages = LANGUAGES;\n const defaultLanguage = config?.language || DEFAULT_LANGUAGE;\n\n return {\n activeLanguage: language || defaultLanguage,\n languages,\n defaultLanguage,\n changeLanguage: (language) => setLanguage(language || DEFAULT_LANGUAGE),\n resetLanguage: () => setLanguage(null),\n };\n}\n", "import type { UniqueSwappersGroupType } from '../utils/settings';\nimport type { SwapperType } from 'rango-sdk';\n\nimport { i18n } from '@lingui/core';\nimport {\n Button,\n Checkbox,\n Image,\n ListItemButton,\n NotFound,\n Typography,\n} from '@rango-dev/ui';\nimport React, { useState } from 'react';\n\nimport { Layout, PageContainer } from '../components/Layout';\nimport { LoadingLiquiditySourceList } from '../components/LoadingLiquiditySourceList';\nimport { SearchInput } from '../components/SearchInput';\nimport {\n LiquiditySourceList,\n LiquiditySourceSuffix,\n NotFoundContainer,\n} from '../components/SettingsContainer';\nimport { useAppStore } from '../store/AppStore';\nimport { containsText } from '../utils/numbers';\nimport { getUniqueSwappersGroups } from '../utils/settings';\n\ninterface PropTypes {\n sourceType: 'Exchanges' | 'Bridges';\n}\n\nexport function LiquiditySourcePage({ sourceType }: PropTypes) {\n const fetchStatus = useAppStore().fetchStatus;\n const swappers = useAppStore().swappers();\n const disabledLiquiditySources = useAppStore().getDisabledLiquiditySources();\n const [searchedFor, setSearchedFor] = useState<string>('');\n const toggleLiquiditySource = useAppStore().toggleLiquiditySource;\n const campaignMode = useAppStore().isInCampaignMode();\n const supportedUniqueSwappersGroups: Array<UniqueSwappersGroupType> =\n getUniqueSwappersGroups(swappers, disabledLiquiditySources);\n\n const types = { Exchanges: i18n.t('Exchanges'), Bridges: i18n.t('Bridges') };\n const validTypes: Array<SwapperType> = [];\n if (sourceType === 'Exchanges') {\n validTypes.push('DEX');\n }\n if (sourceType === 'Bridges') {\n validTypes.push('BRIDGE', 'AGGREGATOR', 'OFF_CHAIN');\n }\n\n const liquiditySources = supportedUniqueSwappersGroups.filter((uniqueItem) =>\n validTypes.includes(uniqueItem.type)\n );\n\n const hasSelectAll =\n liquiditySources.length ===\n liquiditySources.filter((sourceItem) => sourceItem.selected).length;\n\n const toggleAllSources = () => {\n liquiditySources.forEach((sourceItem) => {\n if (hasSelectAll) {\n toggleLiquiditySource(sourceItem.groupTitle);\n } else {\n if (!sourceItem.selected) {\n toggleLiquiditySource(sourceItem.groupTitle);\n }\n }\n });\n };\n\n const list = liquiditySources.map((sourceItem) => {\n const { selected, groupTitle, logo } = sourceItem;\n return {\n start: <Image src={logo} size={22} type=\"circular\" />,\n onClick: () => {\n if (!campaignMode) {\n toggleLiquiditySource(groupTitle);\n }\n },\n end: <Checkbox checked={selected} disabled={campaignMode} />,\n title: (\n <Typography variant=\"title\" size=\"xmedium\">\n {i18n.t(groupTitle)}\n </Typography>\n ),\n ...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 title: i18n.t(sourceType),\n suffix: (\n <LiquiditySourceSuffix>\n <Button variant=\"ghost\" size=\"xsmall\" onClick={toggleAllSources}>\n {hasSelectAll ? i18n.t('Deselect all') : i18n.t('Select all')}\n </Button>\n </LiquiditySourceSuffix>\n ),\n }}>\n <PageContainer view>\n <SearchInput\n value={searchedFor}\n setValue={setSearchedFor}\n fullWidth\n color=\"light\"\n variant=\"contained\"\n placeholder={i18n.t('Search {sourceType}', {\n sourceType: types[sourceType],\n })}\n onChange={searchHandler}\n />\n {fetchStatus === 'loading' && <LoadingLiquiditySourceList />}\n\n {!filteredList.length && !!searchedFor ? (\n <NotFoundContainer>\n <NotFound\n title={i18n.t('No results found')}\n description={i18n.t('Try using different keywords')}\n />\n </NotFoundContainer>\n ) : (\n fetchStatus === 'success' && (\n <LiquiditySourceList disabled={campaignMode}>\n {filteredList.map((sourceItem) => {\n const { groupTitle, ...otherProps } = sourceItem;\n\n return (\n <React.Fragment key={sourceItem.id}>\n <ListItemButton\n style={{ height: '61px' }}\n {...otherProps}\n selected={false}\n hasDivider\n />\n </React.Fragment>\n );\n })}\n </LiquiditySourceList>\n )\n )}\n </PageContainer>\n </Layout>\n );\n}\n", "import { Checkbox, Skeleton } from '@rango-dev/ui';\nimport React from 'react';\n\nimport { LiquiditySourceList } from '../SettingsContainer';\n\nimport { CustomListItem } from './LoadingLiquiditySourceList.styles';\n\nconst ITEM_SKELETON_COUNT = 30;\nexport function LoadingLiquiditySourceList() {\n return (\n <LiquiditySourceList>\n {Array.from(Array(ITEM_SKELETON_COUNT), (_, index) => (\n <CustomListItem\n hasDivider\n key={index}\n start={<Skeleton variant=\"circular\" width={35} height={35} />}\n title={<Skeleton variant=\"text\" size=\"large\" width={90} />}\n end={<Checkbox checked={false} />}\n />\n ))}\n </LiquiditySourceList>\n );\n}\n", "import { styled } from '@rango-dev/ui';\n\nexport const LiquiditySourceList = styled('ul', {\n padding: '$15 $5 0',\n margin: 0,\n listStyle: 'none',\n height: '100%',\n overflowY: 'auto',\n variants: {\n disabled: {\n true: {\n pointerEvents: 'none',\n },\n },\n },\n});\n\nexport const LiquiditySourceSuffix = styled('div', {\n width: 80,\n display: 'flex',\n justifyContent: 'flex-end',\n});\n\nexport const NotFoundContainer = styled('div', {\n display: 'flex',\n flexDirection: 'column',\n alignItems: 'center',\n justifyContent: 'center',\n height: '100%',\n});\n", "import { ListItem, styled } from '@rango-dev/ui';\n\nexport const CustomListItem = styled(ListItem, {\n height: 61,\n});\n", "import type { SelectedQuote } from '../types';\n\nimport { i18n } from '@lingui/core';\nimport React from 'react';\nimport { useNavigate } from 'react-router-dom';\n\nimport { HeaderButtons } from '../components/HeaderButtons';\nimport { Layout, PageContainer } from '../components/Layout';\nimport { Quotes } from '../components/Quotes';\nimport { navigationRoutes } from '../constants/navigationRoutes';\nimport { useNavigateBack } from '../hooks/useNavigateBack';\nimport { useSwapInput } from '../hooks/useSwapInput';\nimport { useQuoteStore } from '../store/quote';\n\nexport function RoutesPage() {\n const navigate = useNavigate();\n const navigateBack = useNavigateBack();\n\n const {\n selectedQuote,\n refetchQuote,\n setSelectedQuote,\n updateQuotePartialState,\n error: quoteError,\n } = useQuoteStore();\n\n const { fetch: fetchQuote, loading: fetchingQuote } = useSwapInput({\n refetchQuote,\n });\n\n const onClickOnQuote = (quote: SelectedQuote) => {\n setSelectedQuote(quote);\n updateQuotePartialState('refetchQuote', false);\n navigateBack();\n };\n\n const settings_url = `../${navigationRoutes.settings}`;\n const wallets_url = `../${navigationRoutes.wallets}`;\n return (\n <Layout\n header={{\n onWallet: () => {\n navigate(wallets_url);\n },\n onBack: () => {\n updateQuotePartialState('refetchQuote', false);\n },\n title: i18n.t('Routes'),\n suffix: (\n <HeaderButtons\n onClickRefresh={\n !!selectedQuote || quoteError ? fetchQuote : undefined\n }\n hidden={['notifications', 'history']}\n onClickSettings={() => navigate(settings_url)}\n />\n ),\n }}>\n <PageContainer>\n <Quotes\n fetch={fetchQuote}\n loading={fetchingQuote}\n onClickOnQuote={onClickOnQuote}\n />\n </PageContainer>\n </Layout>\n );\n}\n", "import { i18n } from '@lingui/core';\nimport {\n Divider,\n getCountCategories,\n SelectableCategoryList,\n} from '@rango-dev/ui';\nimport React, { useState } from 'react';\n\nimport { BlockchainList } from '../components/BlockchainList';\nimport { Layout, PageContainer } from '../components/Layout';\nimport { SearchInput } from '../components/SearchInput';\nimport { useNavigateBack } from '../hooks/useNavigateBack';\nimport { useAppStore } from '../store/AppStore';\nimport { useQuoteStore } from '../store/quote';\n\ninterface PropTypes {\n type: 'source' | 'destination';\n}\n\nexport function SelectBlockchainPage(props: PropTypes) {\n const { type } = props;\n const navigateBack = useNavigateBack();\n const [searchedFor, setSearchedFor] = useState<string>('');\n const [blockchainCategory, setBlockchainCategory] = useState<string>('ALL');\n const setToBlockchain = useQuoteStore.use.setToBlockchain();\n const setFromBlockchain = useQuoteStore.use.setFromBlockchain();\n const fetchStatus = useAppStore().fetchStatus;\n\n const blockchains = useAppStore().blockchains({\n type,\n });\n\n const countActiveCategories = getCountCategories(blockchains);\n\n const showCategory = countActiveCategories !== 1;\n\n return (\n <Layout\n header={{\n title: i18n.t(`Select Blockchain`),\n }}>\n <PageContainer view>\n {showCategory && (\n <>\n <SelectableCategoryList\n setCategory={setBlockchainCategory}\n category={blockchainCategory}\n blockchains={blockchains}\n isLoading={fetchStatus === 'loading'}\n />\n <Divider size={24} />\n </>\n )}\n\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 === 'source') {\n setFromBlockchain(blockchain);\n } else {\n setToBlockchain(blockchain);\n }\n navigateBack();\n }}\n />\n </PageContainer>\n </Layout>\n );\n}\n", "import type { PropTypes } from './BlockchainList.types';\nimport type { BlockchainMeta } from 'rango-sdk';\n\nimport { i18n } from '@lingui/core';\nimport {\n Divider,\n Image,\n ListItemButton,\n NotFound,\n Typography,\n} from '@rango-dev/ui';\nimport React, { useEffect, useState } from 'react';\n\nimport { useAppStore } from '../../store/AppStore';\n\nimport { filterBlockchains } from './BlockchainList.helpers';\nimport { 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 { fetchStatus } = useAppStore();\n\n useEffect(() => {\n setBlockchains([\n ...filterBlockchains(list, searchedFor, blockchainCategory),\n ]);\n }, [list, searchedFor, blockchainCategory]);\n\n const renderList = () => {\n if (!blockchains.length && !!searchedFor) {\n return (\n <>\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 as=\"ul\" 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 {fetchStatus === 'loading' && <LoadingBlockchainList />}\n {fetchStatus === 'success' && renderList()}\n </Container>\n );\n}\n", "import { BlockchainCategories } from '@rango-dev/ui';\nimport { type BlockchainMeta, TransactionType } from 'rango-sdk';\n\nimport { containsText } from '../../utils/common';\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", "import { ImageContainer, styled } from '@rango-dev/ui';\n\nimport { ScrollableArea } from '../Layout';\n\nexport const Container = styled('div', {\n display: 'flex',\n flexDirection: 'column',\n overflow: 'hidden',\n});\n\nexport const List = styled(ScrollableArea, {\n padding: 0,\n margin: 0,\n listStyle: 'none',\n\n [`& ${ImageContainer}`]: {\n borderRadius: '$xm',\n overflow: 'hidden',\n },\n});\n", "import { ListItem, Skeleton } from '@rango-dev/ui';\nimport React from 'react';\n\nimport { List } from './BlockchainList.styles';\n\nconst ITEM_SKELETON_COUNT = 20;\nexport function LoadingBlockchainList() {\n return (\n <List>\n {Array.from(Array(ITEM_SKELETON_COUNT), (e) => (\n <ListItem\n key={e}\n hasDivider\n start={<Skeleton variant=\"circular\" width={35} height={35} />}\n title={<Skeleton variant=\"text\" size=\"large\" width={90} />}\n />\n ))}\n </List>\n );\n}\n", "import type { BlockchainMeta, Token } from 'rango-sdk';\n\nimport { i18n } from '@lingui/core';\nimport { Divider } from '@rango-dev/ui';\nimport React, { useState } from 'react';\nimport { useNavigate } from 'react-router-dom';\n\nimport { BlockchainsSection } from '../components/BlockchainsSection';\nimport { Layout, PageContainer } from '../components/Layout';\nimport { SearchInput } from '../components/SearchInput';\nimport { TokenList } from '../components/TokenList/TokenList';\nimport { navigationRoutes } from '../constants/navigationRoutes';\nimport { useNavigateBack } from '../hooks/useNavigateBack';\nimport { useAppStore } from '../store/AppStore';\nimport { useQuoteStore } from '../store/quote';\nimport { useWalletsStore } from '../store/wallets';\nimport { sortTokens } from '../utils/wallets';\n\ninterface PropTypes {\n type: 'source' | 'destination';\n}\n\nexport function SelectSwapItemsPage(props: PropTypes) {\n const { type } = props;\n const navigate = useNavigate();\n const navigateBack = useNavigateBack();\n const {\n fromBlockchain,\n toBlockchain,\n setFromToken,\n setToToken,\n setFromBlockchain,\n setToBlockchain,\n } = useQuoteStore();\n const getBalanceFor = useWalletsStore.use.getBalanceFor();\n const [searchedFor, setSearchedFor] = useState<string>('');\n const { isTokenPinned } = useAppStore();\n\n const selectedBlockchain = type === 'source' ? fromBlockchain : toBlockchain;\n const selectedBlockchainName = selectedBlockchain?.name ?? '';\n\n // Tokens & Blockchains list\n const blockchains = useAppStore().blockchains({\n type,\n });\n const tokens = useAppStore().tokens({\n type,\n blockchain: selectedBlockchainName,\n searchFor: searchedFor,\n });\n\n const checkIsTokenPinned = (token: Token) => isTokenPinned(token, type);\n\n const tokensList = sortTokens(tokens, getBalanceFor, checkIsTokenPinned);\n\n const updateBlockchain = (blockchain: BlockchainMeta) => {\n if (type === 'source') {\n setFromBlockchain(blockchain);\n } else {\n setToBlockchain(blockchain);\n }\n };\n\n const updateToken = (token: Token) => {\n if (type === 'source') {\n setFromToken({ token, meta: { blockchains, tokens } });\n } else {\n setToToken({ token, meta: { blockchains, tokens } });\n }\n };\n const types = {\n source: i18n.t('Source'),\n destination: i18n.t('Destination'),\n };\n\n return (\n <Layout\n header={{\n title: i18n.t('Swap {type}', { type: types[type] }),\n }}>\n <PageContainer>\n <BlockchainsSection\n blockchains={blockchains}\n type={type == 'source' ? 'from' : 'to'}\n blockchain={type === 'source' ? fromBlockchain : toBlockchain}\n onMoreClick={() => navigate(navigationRoutes.blockchains)}\n onChange={(blockchain) => {\n updateBlockchain(blockchain);\n }}\n />\n <Divider size={24} />\n <SearchInput\n value={searchedFor}\n 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={tokensList}\n selectedBlockchain={selectedBlockchainName}\n searchedFor={searchedFor}\n type={type}\n onChange={(token) => {\n updateToken(token);\n\n const tokenBlockchain = blockchains.find(\n (chain) => token.blockchain === chain.name\n );\n if (tokenBlockchain) {\n updateBlockchain(tokenBlockchain);\n }\n\n navigateBack();\n }}\n />\n </PageContainer>\n </Layout>\n );\n}\n", "/* eslint-disable @typescript-eslint/no-magic-numbers */\nimport type { PropTypes } from './BlockchainsSection.types';\n\nimport { i18n } from '@lingui/core';\nimport {\n BlockchainsChip,\n Divider,\n Image,\n Skeleton,\n Tooltip,\n Typography,\n} from '@rango-dev/ui';\nimport React from 'react';\n\nimport { BLOCKCHAIN_LIST_SIZE } from '../../constants/configs';\nimport { usePrepareBlockchainList } from '../../hooks/usePrepareBlockchainList';\nimport { useAppStore } from '../../store/AppStore';\nimport { useQuoteStore } from '../../store/quote';\nimport { getContainer } from '../../utils/common';\n\nimport { Blockchains } from './BlockchainsSection.styles';\n\nconst NUMBER_OF_LOADING = 12;\n\nexport function BlockchainsSection(props: PropTypes) {\n const { blockchains, type, blockchain, onChange, onMoreClick } = props;\n const blockchainsList = usePrepareBlockchainList(blockchains, {\n limit: BLOCKCHAIN_LIST_SIZE,\n selected: blockchain?.name,\n });\n\n const { fetchStatus } = useAppStore();\n const resetToBlockchain = useQuoteStore.use.resetToBlockchain();\n const resetFromBlockchain = useQuoteStore.use.resetFromBlockchain();\n const hasMoreItemsInList = blockchainsList.more.length > 0;\n /**\n * When only one item is left on list, we will not show the `More` button and will show the item itself instead.\n */\n const onlyOneItemInList = blockchainsList.more.length === 1;\n const showMoreButton = !onlyOneItemInList && hasMoreItemsInList;\n\n return (\n <>\n <Divider size={12} />\n <Typography variant=\"label\" size=\"large\">\n {i18n.t('Select Blockchain')}\n </Typography>\n <Divider size={12} />\n <Blockchains>\n {fetchStatus === 'loading' &&\n Array.from(Array(NUMBER_OF_LOADING), (e) => (\n <Skeleton key={e} variant=\"rounded\" height={50} />\n ))}\n {fetchStatus === '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 {blockchainsList.list.map((item) => (\n <Tooltip\n key={item.name}\n content={item.shortName}\n side=\"bottom\"\n sideOffset={2}\n container={getContainer()}>\n <BlockchainsChip\n key={item.name}\n selected={!!blockchain && blockchain.name === item.name}\n onClick={() => onChange(item)}>\n <Image src={item.logo} size={30} />\n </BlockchainsChip>\n </Tooltip>\n ))}\n\n {onlyOneItemInList ? (\n <BlockchainsChip\n key={blockchainsList.more[0].name}\n selected={\n !!blockchain &&\n blockchain.name === blockchainsList.more[0].name\n }\n onClick={() => onChange(blockchainsList.more[0])}>\n <Image src={blockchainsList.more[0].logo} size={30} />\n </BlockchainsChip>\n ) : null}\n\n {showMoreButton ? (\n <BlockchainsChip onClick={onMoreClick} key=\"more-blockchains\">\n <Typography variant=\"body\" size=\"xsmall\" color=\"secondary500\">\n {i18n._('More +{count}', {\n count: blockchainsList.more.length,\n })}\n </Typography>\n </BlockchainsChip>\n ) : null}\n </>\n )}\n </Blockchains>\n </>\n );\n}\n", "import type {\n PrepareListOptions,\n UsePrepareList,\n} from './usePrepareBlockchainList.types';\nimport type { BlockchainMeta } from 'rango-sdk';\n\nimport { useEffect } from 'react';\n\nimport { useAppStore } from '../../store/AppStore';\n\nimport { isInVisibleList, prepare } from './usePrepareBlockchainList.helpers';\n\n/**\n *\n * UI needs some specific logics like limiting the list and sorting,\n * this function is getting the raw blockchains list and return a list for showing in UI.\n *\n */\nexport function usePrepareBlockchainList(\n blockchains: BlockchainMeta[],\n options?: PrepareListOptions\n): UsePrepareList {\n const { preferredBlockchains, addPreferredBlockchain } = useAppStore();\n\n useEffect(() => {\n if (options?.selected) {\n const output = prepare(blockchains, preferredBlockchains, options);\n\n /**\n * We only add a new blockchain to preferred when it's not in the main list\n * In this way we can guarantee we will be able to regenerate the same list always.\n * And also it helps us to avoid jumping for the last item of the main list (e.g. tenth item of our list).\n */\n if (!isInVisibleList(options.selected, output)) {\n addPreferredBlockchain(options?.selected);\n }\n }\n }, [options?.selected]);\n\n const output = prepare(blockchains, preferredBlockchains, options);\n\n return {\n list: output.list,\n more: output.more,\n history: [],\n };\n}\n", "export const MOST_USED_BLOCKCHAINS = ['ETH', 'COSMOS', 'OSMOSIS'];\n", "import type {\n PrepareListOptions,\n PrepareOutput,\n} from './usePrepareBlockchainList.types';\nimport type { BlockchainMeta } from 'rango-sdk';\n\nimport { MOST_USED_BLOCKCHAINS } from './usePrepareBlockchainList.constants';\n\nexport function prepare(\n blockchains: BlockchainMeta[],\n preferredBlockchains: string[],\n options?: PrepareListOptions\n): PrepareOutput {\n /*\n * TODO:\n * We copying the `blockchains` which can causes performance penalties but we should because we are mutating the original object.\n * A better way to solve the problem maybe is using new JS features like Use toSpliced() but\n * we can not use it right now because we need to upgrade our toolings first.\n */\n const list: BlockchainMeta[] = JSON.parse(JSON.stringify(blockchains));\n let more: BlockchainMeta[] = [];\n\n list.sort(sortByMostUsedBlockchains);\n\n // Checking `limit` has set and it should be more than of the list items.\n if (!!options?.limit && blockchains.length > options.limit) {\n const start = options.limit;\n let preferredBlockchainsWithoutMainList = preferredBlockchains;\n\n if (preferredBlockchains.length <= options.limit) {\n /**\n *\n * if we want to show 10 items (aka `options.limit`)\n * and have these items as our preferred list: [x,y,z]\n * and these as our main list: [A, B, C, D, E, F, G, H, I, J]\n * the final list will be like this: [...preferred, ...mainList].\n *\n * Since we have a limit (e.g. 10) on our list (preferred + mainList),\n * we only should check those items from main list that will be in final list.\n *\n * finalListWithoutLimit = [x,y,z, A, B, C, D, E, F, G, H, I, J]\n * finalListWithLimit = [x,y,z, A, B, C, D, E, F, G]\n *\n * As you can see, [H, I, J] will not be in our list.\n *\n * The following code only check preffred blockchain\n * shouldn't be in first 7 of 10 items in main list. (Since, the last 3 items will not be in the final list and we should check those.)\n */\n const howManyItemsShouldBeCheckedFromMainList =\n options.limit - preferredBlockchains.length;\n\n for (let i = 0; i <= howManyItemsShouldBeCheckedFromMainList; i++) {\n const blockchain = list[i];\n\n preferredBlockchainsWithoutMainList =\n preferredBlockchainsWithoutMainList.filter((preferredBlockchain) => {\n return blockchain.name !== preferredBlockchain;\n });\n }\n }\n\n list.sort(\n generateSortByPreferredBlockchainsFor(preferredBlockchainsWithoutMainList)\n );\n\n /*\n * Splice will modify the original list and returns the deleted items\n * We use the deleted items as `more`\n */\n more = list.splice(start);\n }\n return {\n list,\n more,\n };\n}\n\n/** There is a hardcoded list of blockchains that we want to show them first in the list. */\nexport function sortByMostUsedBlockchains(\n a: BlockchainMeta,\n b: BlockchainMeta\n) {\n const mostUsed = MOST_USED_BLOCKCHAINS;\n const aIndexInMostUsed = mostUsed.findIndex((token) => token === a.name);\n const bIndexInMostUsed = mostUsed.findIndex((token) => token === b.name);\n const aIsMostUsed = aIndexInMostUsed > -1;\n const bIsMostUsed = bIndexInMostUsed > -1;\n\n if (aIsMostUsed && bIsMostUsed) {\n return aIndexInMostUsed > bIndexInMostUsed ? 1 : -1;\n }\n\n if (aIsMostUsed) {\n return -1;\n }\n\n if (bIsMostUsed) {\n return 1;\n }\n\n return 0;\n}\n\nexport function generateSortByPreferredBlockchainsFor(\n preferredBlockchains: string[]\n) {\n return function sortByPreferred(a: BlockchainMeta, b: BlockchainMeta) {\n const aIndexInPreferred = preferredBlockchains.findIndex(\n (blockchain) => blockchain === a.name\n );\n const bIndexInPreferred = preferredBlockchains.findIndex(\n (blockchain) => blockchain === b.name\n );\n\n const aIsPreferred = aIndexInPreferred > -1;\n const bIsPreferred = bIndexInPreferred > -1;\n\n if (aIsPreferred && bIsPreferred) {\n return aIndexInPreferred > bIndexInPreferred ? 1 : -1;\n }\n\n if (preferredBlockchains.includes(a.name)) {\n return -1;\n }\n if (preferredBlockchains.includes(b.name)) {\n return 1;\n }\n\n return 0;\n };\n}\n\nexport function isInVisibleList(\n blockchain: string,\n prepareOutput: PrepareOutput\n): boolean {\n return !!prepareOutput.list.find((item) => item.name === blockchain);\n}\n", "import { styled } from '@rango-dev/ui';\n\nexport const Blockchains = styled('div', {\n display: 'grid',\n gap: '$10',\n gridTemplateColumns: 'repeat(6, minmax(0, 1fr))',\n});\n", "/* eslint-disable @typescript-eslint/no-magic-numbers */\nimport type { PropTypes, RenderDescProps } from './TokenList.types';\nimport type { Token } from 'rango-sdk';\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, { useEffect, useState } from 'react';\n\nimport { useAppStore } from '../../store/AppStore';\nimport { useWalletsStore } from '../../store/wallets';\nimport { generateShade, isBright } from '../../utils/colors';\nimport { formatBalance } from '../../utils/wallets';\n\nimport { LoadingTokenList } from './LoadingTokenList';\nimport {\n BalanceContainer,\n Container,\n descriptionStyles,\n End,\n ImageSection,\n List,\n Pin,\n Tag,\n TagTitle,\n Title,\n tokenAddressStyles,\n TokenBalance,\n tokenNameStyles,\n tokenTitleStyles,\n tokenWithoutNameStyles,\n usdValueStyles,\n} from './TokenList.styles';\n\nconst PAGE_SIZE = 20;\n\nconst renderDesc = (props: RenderDescProps) => {\n const { address, name, url, token, customCssForTag, customCssForTagTitle } =\n props;\n const length = address.length;\n\n return (\n <div className={descriptionStyles()}>\n {name ? (\n <div className={tokenNameStyles()}>{name}</div>\n ) : (\n <Title className={tokenTitleStyles()}>\n <Typography variant=\"title\" size=\"xmedium\">\n {token.symbol}\n </Typography>\n <Divider direction=\"horizontal\" size={4} />\n <Tag css={customCssForTag}>\n <TagTitle variant=\"body\" size=\"xsmall\" css={customCssForTagTitle}>\n {token.blockchain}\n </TagTitle>\n </Tag>\n </Title>\n )}\n\n {!!address && (\n <div\n className={`${tokenAddressStyles()} ${\n !name && tokenWithoutNameStyles()\n }`}>\n <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 <Divider size={4} direction=\"horizontal\" />\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<Token[]>(list);\n const fetchStatus = useAppStore().fetchStatus;\n const blockchains = useAppStore().blockchains();\n const [hasNextPage, setHasNextPage] = useState<boolean>(true);\n const { getBalanceFor, loading: loadingWallet } = useWalletsStore();\n const { isTokenPinned } = useAppStore();\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 endReached={hasNextPage ? loadNextPage : undefined}\n itemContent={(index) => {\n const token = tokens[index];\n const tokenBalance = formatBalance(getBalanceFor(token));\n const address = token.address || '';\n const blockchain = blockchains.find(\n (blockchain) => blockchain.name === token.blockchain\n );\n const lightShade = generateShade(\n blockchain?.color || '',\n isBright(blockchain?.color || '') ? 5 : 125\n );\n const darkShade = generateShade(blockchain?.color || '', -100);\n\n const customCssForTag = {\n $$color: lightShade,\n [`.${darkTheme} &`]: {\n $$color: darkShade,\n },\n backgroundColor: '$$color',\n };\n\n const customCssForTagTitle = {\n $$color: darkShade,\n [`.${darkTheme} &`]: {\n $$color: lightShade,\n },\n color: '$$color',\n };\n\n return (\n <div\n style={{\n paddingRight: 5,\n }}>\n <ListItemButton\n style={{\n width: '100%',\n overflow: 'hidden',\n }}\n tab-index={index}\n key={`${token.symbol}${token.address}`}\n id={`${token.symbol}${token.address}`}\n hasDivider\n onClick={() => onChange(tokens[index])}\n start={\n <ImageSection>\n <Image src={token.image} size={30} />\n {isTokenPinned(token, props.type) && (\n <Pin>\n <PinIcon size={12} color=\"gray\" />\n </Pin>\n )}\n </ImageSection>\n }\n title={\n blockchain?.type === 'COSMOS' ||\n !!token.name ||\n (!token.name && !address) ? (\n <Title>\n <Typography variant=\"title\" size=\"xmedium\">\n {token.symbol}\n </Typography>\n <Divider direction=\"horizontal\" size={4} />\n <Tag css={customCssForTag}>\n <TagTitle\n variant=\"body\"\n size=\"xsmall\"\n css={customCssForTagTitle}>\n {token.blockchain}\n </TagTitle>\n </Tag>\n </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: token.name,\n url: blockchain.info.addressUrl\n .split('{wallet}')\n .join(address),\n })\n : token.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 tokenBalance && (\n <BalanceContainer>\n <TokenBalance variant=\"title\" size=\"small\">\n {tokenBalance.amount}\n </TokenBalance>\n <div />\n {tokenBalance.usdValue && (\n <Typography\n variant=\"body\"\n className={usdValueStyles()}\n size=\"xsmall\">\n {`$${tokenBalance.usdValue}`}\n </Typography>\n )}\n </BalanceContainer>\n )\n )\n }\n />\n </div>\n );\n }}\n totalCount={tokens.length}\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 {fetchStatus === 'loading' && <LoadingTokenList size={PAGE_SIZE} />}\n {fetchStatus === 'success' && <List as=\"ul\">{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 {\n css,\n darkTheme,\n ImageContainer,\n styled,\n Typography,\n} from '@rango-dev/ui';\n\nexport const tokenNameStyles = css({\n position: 'absolute',\n transform: 'none',\n transition: 'transform 225ms cubic-bezier(0, 0, 0.2, 1) 0ms',\n textOverflow: 'ellipsis',\n whiteSpace: 'nowrap',\n maxWidth: 100,\n overflow: 'hidden',\n});\nexport const descriptionStyles = css({\n position: 'relative',\n height: 12,\n width: '30%',\n maxWidth: '150px',\n});\nexport const tokenTitleStyles = css({\n position: 'absolute',\n transform: 'none',\n transition: 'transform 225ms cubic-bezier(0, 0, 0.2, 1) 0ms',\n bottom: '-8px',\n});\nexport const tokenAddressStyles = css({\n transform: 'translateY(12px)',\n visibility: 'hidden',\n '& a': {\n display: 'flex',\n justifyContent: 'center',\n alignItems: 'center',\n fontSize: '$12',\n lineHeight: '$16',\n $$color: '$colors$neutral600',\n [`.${darkTheme} &`]: {\n $$color: '$colors$neutral700',\n },\n color: '$$color',\n textDecoration: 'none',\n },\n});\nexport const tokenWithoutNameStyles = css({});\nexport const usdValueStyles = css();\n\nexport const Container = styled('div', {\n display: 'flex',\n flexDirection: 'column',\n flexGrow: 1,\n overflow: 'hidden',\n});\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\n '& li': {\n alignItems: 'none',\n\n '&:hover': {\n [`& .${descriptionStyles}`]: {\n [`& .${tokenAddressStyles}`]: {\n position: 'absolute',\n transform: 'none',\n transition: 'transform 225ms cubic-bezier(0, 0, 0.2, 1) 0ms',\n visibility: 'visible',\n },\n\n [`& .${tokenWithoutNameStyles}`]: {\n bottom: '-15px',\n },\n [`& .${tokenNameStyles}`]: {\n position: 'absolute',\n transform: 'translateY(-12px)',\n visibility: 'hidden',\n },\n [`& .${tokenTitleStyles}`]: {\n position: 'absolute',\n transform: 'translateY(-12px)',\n bottom: '-10px',\n },\n },\n },\n },\n});\n\nexport const Tag = styled('div', {\n paddingLeft: '$5',\n paddingRight: '$5',\n borderRadius: '$md',\n display: 'flex',\n alignItems: 'center',\n});\n\nexport const TagTitle = styled(Typography, {});\n\nexport const BalanceContainer = styled('div', {\n textAlign: 'right',\n width: '100%',\n overflow: 'hidden',\n textOverflow: 'ellipsis',\n whiteSpace: 'nowrap',\n [`& .${usdValueStyles}`]: {\n $$color: '$colors$neutral600',\n [`.${darkTheme} &`]: {\n $$color: '$colors$neutral700',\n },\n color: '$$color',\n },\n});\n\nexport const End = styled('div', {\n display: 'flex',\n alignItems: 'end',\n flexDirection: 'column',\n});\n\nexport const Description = styled('div', {\n display: 'flex',\n alignItems: 'center',\n});\nexport const ImageSection = styled('div', {\n position: 'relative',\n [`& ${ImageContainer}`]: {\n borderRadius: '$xm',\n overflow: 'hidden',\n },\n});\nexport const Pin = styled('div', {\n position: 'absolute',\n backgroundColor: '$neutral100',\n padding: '$4',\n borderRadius: '50%',\n bottom: -6,\n right: -6,\n});\n\nexport const TokenBalance = styled(Typography, {\n width: '100%',\n overflow: 'hidden',\n textOverflow: 'ellipsis',\n whiteSpace: 'nowrap',\n});\n", "import { i18n } from '@lingui/core';\nimport { Alert, Button, styled } from '@rango-dev/ui';\nimport React from 'react';\nimport { useInRouterContext, useSearchParams } from 'react-router-dom';\n\nimport { Layout, PageContainer } from '../components/Layout';\nimport { Slippage } from '../components/Slippage';\nimport { SearchParams } from '../constants/searchParams';\nimport { SettingsLists } from '../containers/Settings/Lists';\nimport { useAppStore } from '../store/AppStore';\n\nconst ResetAction = styled('div', {\n paddingLeft: '$8',\n});\n\nexport function SettingsPage() {\n const { isInCampaignMode, updateCampaignMode } = useAppStore();\n const campaignMode = isInCampaignMode();\n\n const [, setSearchParams] = useSearchParams();\n const isRouterInContext = useInRouterContext();\n\n const onClick = () => {\n if (isRouterInContext && campaignMode) {\n setSearchParams(\n (prev) => {\n prev.delete(SearchParams.LIQUIDITY_SOURCES);\n return prev;\n },\n { replace: true }\n );\n updateCampaignMode('liquiditySources', undefined);\n }\n };\n return (\n <Layout\n header={{\n title: i18n.t('Settings'),\n }}>\n <PageContainer>\n {campaignMode && (\n <Alert\n type=\"info\"\n variant=\"alarm\"\n title={i18n.t(\n \"Currently, you're in campaign mode with restrictions on liquidity sources. Would you like to switch out of this mode and make use of all available liquidity sources?\"\n )}\n action={\n <ResetAction>\n <Button type=\"secondary\" size=\"small\" onClick={onClick}>\n {i18n.t('Reset')}\n </Button>\n </ResetAction>\n }\n />\n )}\n <Slippage />\n <SettingsLists />\n </PageContainer>\n </Layout>\n );\n}\n", "import { i18n } from '@lingui/core';\nimport {\n 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 { useAppStore } from '../../store/AppStore';\nimport { getContainer } from '../../utils/common';\n\nimport {\n BaseContainer,\n Head,\n SlippageChip,\n SlippageChipsContainer,\n} from './Slippage.styles';\nimport { SlippageTooltipContent } from './SlippageTooltipContent';\n\nexport function Slippage() {\n const { slippage, setSlippage, customSlippage, setCustomSlippage } =\n useAppStore();\n\n 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 sideOffset={4}\n content={<SlippageTooltipContent />}>\n <InfoIcon color=\"gray\" />\n </Tooltip>\n </Head>\n <SlippageChipsContainer>\n {SLIPPAGES.map((slippageItem, index) => {\n const key = `slippage-${index}`;\n return (\n <SlippageChip\n 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 );\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 value = event.target.value;\n const parsedValue = parseFloat(value);\n if (parsedValue >= MIN_SLIPPGAE && parsedValue <= MAX_SLIPPAGE) {\n setCustomSlippage(parsedValue);\n } else {\n setCustomSlippage(null);\n }\n }}\n suffix={\n customSlippage && (\n <Typography variant=\"body\" size=\"small\">\n %\n </Typography>\n )\n }\n placeholder={i18n.t('Custom')}\n />\n </SlippageChipsContainer>\n </BaseContainer>\n );\n}\n", "import { Chip, styled, TextField } from '@rango-dev/ui';\n\nexport const BaseContainer = styled('div', {\n paddingTop: '$5',\n padding: '$10 $5',\n});\n\nexport const SlippageChipsContainer = styled('div', {\n display: 'flex',\n flexWrap: 'wrap',\n gap: '$10',\n [`& ${TextField}`]: {\n flex: '1 1 0',\n maxWidth: '127px',\n minWidth: '85px',\n },\n});\n\nexport const Head = styled('div', {\n display: 'flex',\n justifyContent: 'start',\n alignItems: 'center',\n paddingBottom: '$10',\n});\n\nexport const SlippageTooltipContainer = styled('div', {\n maxWidth: '280px',\n padding: '$10',\n});\n\nexport const SlippageChip = styled(Chip, {\n width: '61px',\n flexShrink: 0,\n});\n", "import { i18n } from '@lingui/core';\nimport { Typography } from '@rango-dev/ui';\nimport React from 'react';\n\nimport { SlippageTooltipContainer } from './Slippage.styles';\n\nexport function SlippageTooltipContent() {\n return (\n <SlippageTooltipContainer>\n <Typography variant=\"label\" size=\"medium\" color=\"neutral700\">\n {i18n.t(\n 'Your transaction will be reverted if the price changes unfavorably by more than this percentage'\n )}\n <br />\n <br />\n <b>{i18n.t('Warning')}</b>:\n {i18n.t(\n 'This setting is applied per step (e.g. 1Inch, Thorchain, etc) which means only the step will be reverted, not the whole transaction.'\n )}\n </Typography>\n </SlippageTooltipContainer>\n );\n}\n", "import type { ThemeMode } from '../../store/slices/settings';\nimport type { ListPropTypes, SvgIconProps } from '@rango-dev/ui';\n\nimport { i18n } from '@lingui/core';\nimport {\n AutoThemeIcon,\n BridgeIcon,\n ChevronRightIcon,\n DarkModeIcon,\n Divider,\n DoneIcon,\n ExchangeIcon,\n InfoIcon,\n LanguageIcon,\n LightModeIcon,\n List,\n ListItem,\n ListItemButton,\n Skeleton,\n styled,\n Switch,\n Tabs,\n Tooltip,\n Typography,\n} from '@rango-dev/ui';\nimport React from 'react';\nimport { useNavigate } from 'react-router-dom';\n\nimport { SlippageTooltipContainer as TooltipContainer } from '../../components/Slippage/Slippage.styles';\nimport { navigationRoutes } from '../../constants/navigationRoutes';\nimport { ThemeModeEnum } from '../../constants/settings';\nimport { useAppStore } from '../../store/AppStore';\nimport { getContainer } from '../../utils/common';\nimport { getUniqueSwappersGroups, isFeatureHidden } from '../../utils/settings';\n\nconst ThemeSection = styled('div', {\n width: '202px',\n height: '$40',\n});\n\nconst themesList = [\n {\n id: ThemeModeEnum.LIGHT,\n icon: <LightModeIcon color=\"black\" size={16} />,\n tooltip: (\n <Typography size=\"xsmall\" variant=\"body\">\n {i18n.t('Light')}\n </Typography>\n ),\n },\n {\n id: ThemeModeEnum.DARK,\n icon: <DarkModeIcon color=\"black\" size={14} />,\n tooltip: (\n <Typography size=\"xsmall\" variant=\"body\">\n {i18n.t('Dark')}\n </Typography>\n ),\n },\n {\n id: ThemeModeEnum.AUTO,\n icon: <AutoThemeIcon color=\"black\" size={16} />,\n tooltip: (\n <Typography size=\"xsmall\" variant=\"body\">\n {i18n.t('Auto')}\n </Typography>\n ),\n },\n];\n\nconst getThemeIcon = (theme: ThemeMode) => {\n const iconProps: SvgIconProps = { color: 'gray', size: 14 };\n\n switch (theme) {\n case 'auto':\n return <AutoThemeIcon {...iconProps} />;\n case 'dark':\n return <DarkModeIcon {...iconProps} />;\n default:\n return <LightModeIcon {...iconProps} />;\n }\n};\n\nexport function SettingsLists() {\n const navigate = useNavigate();\n const { theme: themeConfig } = useAppStore().config;\n const { setTheme, theme } = useAppStore();\n\n const fetchStatus = useAppStore().fetchStatus;\n const swappers = useAppStore().swappers();\n const disabledLiquiditySources = useAppStore().getDisabledLiquiditySources();\n const {\n config: { features },\n } = useAppStore();\n const isThemeHidden = isFeatureHidden('theme', features);\n const isLiquidityHidden = isFeatureHidden('liquiditySource', features);\n const isLanguageHidden = isFeatureHidden('language', features);\n\n const infiniteApprove = useAppStore().infiniteApprove;\n const toggleInfiniteApprove = useAppStore().toggleInfiniteApprove;\n\n const supportedUniqueSwappersGroups = getUniqueSwappersGroups(\n swappers,\n disabledLiquiditySources\n );\n\n const bridgeSources = supportedUniqueSwappersGroups.filter((uniqueItem) =>\n ['BRIDGE', 'AGGREGATOR', 'OFF_CHAIN'].includes(uniqueItem.type)\n );\n\n const totalBridgeSources = bridgeSources.length;\n const totalSelectedBridgeSources = bridgeSources.filter(\n (uniqueItem) => uniqueItem.selected\n ).length;\n\n const exchangeSources = supportedUniqueSwappersGroups.filter(\n (uniqueItem) => uniqueItem.type === 'DEX'\n );\n\n const totalExchangeSources = exchangeSources.length;\n const totalSelectedExchangeSources = exchangeSources.filter(\n (uniqueItem) => uniqueItem.selected\n ).length;\n\n const handleEndItem = (totalSelected: number, total: number) => {\n switch (fetchStatus) {\n case 'loading':\n return <Skeleton variant=\"text\" size=\"medium\" width={50} />;\n case 'failed':\n return (\n <Typography variant=\"body\" size=\"medium\" color=\"$error500\">\n {i18n.t('Loading failed')}\n </Typography>\n );\n default:\n return (\n <Typography variant=\"body\" size=\"medium\">\n {`${totalSelected} / ${total}`}\n </Typography>\n );\n }\n };\n\n const bridgeItem = {\n id: '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 start: <BridgeIcon color=\"gray\" size={14} />,\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 start: <ExchangeIcon color=\"gray\" size={14} />,\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 start: <LanguageIcon color=\"gray\" size={14} />,\n end: <ChevronRightIcon color=\"gray\" />,\n onClick: () => navigate(navigationRoutes.languages),\n };\n\n const infiniteApprovalItem = {\n id: 'infinite-approval-item',\n title: (\n <>\n <Typography variant=\"title\" size=\"xmedium\">\n {i18n.t('Infinite approval')}\n </Typography>\n <Divider direction=\"horizontal\" size={4} />\n <Tooltip\n side=\"top\"\n sideOffset={4}\n container={getContainer()}\n content={\n <TooltipContainer>\n <Typography variant=\"label\" size=\"medium\" color=\"neutral700\">\n {i18n.t(\n \"Enabling the 'Infinite approval' mode grants unrestricted access to smart contracts of DEXes/Bridges, allowing them to utilize the approved token amount without limitations.\"\n )}\n </Typography>\n </TooltipContainer>\n }>\n <InfoIcon color=\"gray\" />\n </Tooltip>\n </>\n ),\n start: <DoneIcon color=\"gray\" size={14} />,\n end: <Switch checked={infiniteApprove} />,\n onClick: toggleInfiniteApprove,\n };\n\n const themeItem = {\n id: 'theme-item',\n type: <ListItem />,\n title: (\n <Typography variant=\"title\" size=\"xmedium\">\n {i18n.t('Theme')}\n </Typography>\n ),\n end: (\n <ThemeSection>\n <Tabs\n container={getContainer()}\n items={themesList}\n value={theme}\n onChange={(item) => setTheme(item.id as ThemeMode)}\n type=\"primary\"\n borderRadius=\"small\"\n />\n </ThemeSection>\n ),\n start: getThemeIcon(theme),\n };\n\n const settingItems: ListPropTypes['items'] = isLiquidityHidden\n ? []\n : [bridgeItem, exchangeItem];\n\n if (!isLanguageHidden) {\n settingItems.push(languageItem);\n }\n settingItems.push(infiniteApprovalItem);\n\n if (!themeConfig?.singleTheme && !isThemeHidden) {\n settingItems.push(themeItem);\n }\n\n return (\n <List\n type={<ListItemButton hasDivider id=\"_\" onClick={() => console.log()} />}\n items={settingItems}\n />\n );\n}\n", "import { i18n } from '@lingui/core';\nimport { cancelSwap } from '@rango-dev/queue-manager-rango-preset';\nimport { useManager } from '@rango-dev/queue-manager-react';\nimport { Alert } from '@rango-dev/ui';\nimport React from 'react';\nimport { useParams } from 'react-router-dom';\n\nimport { SwapDetails } from '../components/SwapDetails';\nimport { SwapDetailsPlaceholder } from '../components/SwapDetails/SwapDetails.Placeholder';\nimport { useNavigateBack } from '../hooks/useNavigateBack';\nimport { useAppStore } from '../store/AppStore';\nimport { getPendingSwaps } from '../utils/queue';\n\nexport function SwapDetailsPage() {\n const { manager, state } = useManager();\n const loading = !state.loadedFromPersistor;\n const pendingSwaps = getPendingSwaps(manager);\n const { requestId } = useParams<{ requestId: string }>();\n const navigateBack = useNavigateBack();\n const { fetchStatus: fetchMetaStatus } = useAppStore();\n\n if (!requestId) {\n return (\n <Alert\n containerStyles={{ margin: '20px' }}\n type=\"error\"\n title={i18n.t(\n 'The request ID is necessary to display the swap details.'\n )}\n />\n );\n }\n\n const showSkeleton = loading || fetchMetaStatus === 'loading';\n\n const selectedSwap = requestId\n ? pendingSwaps.find(({ swap }) => swap.requestId === requestId)\n : undefined;\n\n const onCancel = () => {\n if (selectedSwap?.id) {\n const swap = manager?.get(selectedSwap.id);\n if (swap) {\n cancelSwap(swap);\n }\n }\n };\n\n const onDelete = async () => {\n if (selectedSwap?.id) {\n try {\n manager?.deleteQueue(selectedSwap.id);\n navigateBack();\n } catch (e) {\n console.log(e);\n }\n }\n };\n const swap = selectedSwap?.swap;\n\n if (!swap || showSkeleton) {\n return (\n <SwapDetailsPlaceholder\n requestId={requestId}\n showSkeleton={showSkeleton}\n />\n );\n }\n\n return (\n <SwapDetails\n swap={swap}\n requestId={requestId}\n onCancel={onCancel}\n onDelete={onDelete}\n />\n );\n}\n", "import type { SwapDetailsProps } from './SwapDetails.types';\nimport type { ModalState } from '../SwapDetailsModal';\n\nimport { i18n } from '@lingui/core';\nimport {\n getCurrentBlockchainOfOrNull,\n getCurrentStep,\n getRelatedWalletOrNull,\n} from '@rango-dev/queue-manager-rango-preset';\nimport {\n Button,\n CopyIcon,\n Divider,\n IconButton,\n LinkIcon,\n QuoteCost,\n StepDetails,\n Typography,\n useCopyToClipboard,\n} from '@rango-dev/ui';\nimport { useWallets } from '@rango-dev/wallets-react';\nimport BigNumber from 'bignumber.js';\nimport { PendingSwapNetworkStatus } from 'rango-types';\nimport React, { useEffect, useRef, useState } from 'react';\nimport { useNavigate } from 'react-router-dom';\n\nimport { SCANNER_BASE_URL } from '../../constants';\nimport {\n GAS_FEE_MAX_DECIMALS,\n GAS_FEE_MIN_DECIMALS,\n PERCENTAGE_CHANGE_MAX_DECIMALS,\n PERCENTAGE_CHANGE_MIN_DECIMALS,\n TOKEN_AMOUNT_MAX_DECIMALS,\n TOKEN_AMOUNT_MIN_DECIMALS,\n USD_VALUE_MAX_DECIMALS,\n USD_VALUE_MIN_DECIMALS,\n} from '../../constants/routing';\nimport { useAppStore } from '../../store/AppStore';\nimport { useNotificationStore } from '../../store/notification';\nimport { useQuoteStore } from '../../store/quote';\nimport { useUiStore } from '../../store/ui';\nimport { getContainer } from '../../utils/common';\nimport {\n formatTooltipNumbers,\n numberToString,\n secondsToString,\n totalArrivalTime,\n} from '../../utils/numbers';\nimport { getPriceImpact, getPriceImpactLevel } from '../../utils/quote';\nimport {\n getLastConvertedTokenInFailedSwap,\n getSwapMessages,\n shouldRetrySwap,\n} from '../../utils/swap';\nimport { getSwapDate } from '../../utils/time';\nimport { getConciseAddress } from '../../utils/wallets';\nimport { SuffixContainer } from '../HeaderButtons/HeaderButtons.styles';\nimport { Layout, PageContainer } from '../Layout';\nimport { QuoteSummary } from '../Quote';\nimport {\n SwapDetailsCompleteModal,\n SwapDetailsModal,\n} from '../SwapDetailsModal';\n\nimport { getSteps, getStepState, RESET_INTERVAL } from './SwapDetails.helpers';\nimport {\n HeaderDetails,\n outputStyles,\n requestIdStyles,\n rowStyles,\n StepsList,\n StyledLink,\n titleStepsStyles,\n} 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 blockchains = useAppStore().blockchains();\n const swappers = useAppStore().swappers();\n const tokens = useAppStore().tokens();\n const retry = useQuoteStore.use.retry();\n const isActiveTab = useUiStore.use.isActiveTab();\n const navigate = useNavigate();\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\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, swap.requestId]);\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 blockchains: blockchains,\n swappers,\n });\n const numberOfSteps = steps.length;\n const [firstStep, lastStep] = [swap.steps[0], swap.steps[numberOfSteps - 1]];\n const outputAmount =\n lastStep.outputAmount || lastStep.expectedOutputAmountHumanReadable;\n\n const totalFee = swap.steps.reduce(\n (totalFee, steps) => totalFee + parseFloat(steps.feeInUsd || ''),\n 0\n );\n\n const diagnosisUrl = swap.steps.find(\n (step) => step.diagnosisUrl\n )?.diagnosisUrl;\n\n const outputUsdValue = numberToString(\n parseFloat(\n numberToString(\n outputAmount,\n TOKEN_AMOUNT_MIN_DECIMALS,\n TOKEN_AMOUNT_MAX_DECIMALS\n )\n ) * (lastStep.toUsdPrice || 0),\n USD_VALUE_MIN_DECIMALS,\n USD_VALUE_MAX_DECIMALS\n );\n\n const inputUsdValue = numberToString(\n parseFloat(swap.inputAmount) * (firstStep.fromUsdPrice || 0),\n USD_VALUE_MIN_DECIMALS,\n USD_VALUE_MAX_DECIMALS\n );\n\n const realOutputUsdValue = outputAmount\n ? formatTooltipNumbers(\n new BigNumber(outputAmount).multipliedBy(lastStep.toUsdPrice || 0)\n )\n : '';\n\n const realInputUsdValue = formatTooltipNumbers(\n new BigNumber(swap.inputAmount).multipliedBy(firstStep.fromUsdPrice || 0)\n );\n\n const percentageChange = getPriceImpact(inputUsdValue, outputUsdValue);\n\n const completeModalDesc =\n swap.status === 'success'\n ? i18n.t({\n id: 'You have received {amount} {token} in {conciseAddress} wallet on {chain} chain.',\n values: {\n amount: numberToString(\n outputAmount,\n TOKEN_AMOUNT_MIN_DECIMALS,\n TOKEN_AMOUNT_MAX_DECIMALS\n ),\n token: steps[numberOfSteps - 1].to.token.displayName,\n conciseAddress: getConciseAddress(\n swap.wallets[steps[numberOfSteps - 1].to.chain.displayName]\n ?.address || ''\n ),\n chain: steps[numberOfSteps - 1].to.chain.displayName,\n },\n })\n : `${i18n.t('Transaction was not sent.')} ${\n lastConvertedTokenInFailedSwap\n ? i18n.t({\n id: '{amount} {symbol} on {blockchain} remain in your wallet',\n values: {\n amount: lastConvertedTokenInFailedSwap.outputAmount,\n symbol: lastConvertedTokenInFailedSwap.symbol,\n blockchain: lastConvertedTokenInFailedSwap.blockchain,\n },\n })\n : ''\n }`;\n\n return (\n <Layout\n header={{\n title: i18n.t('Swap and Bridge'),\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, { blockchains: blockchains, tokens: tokens });\n setTimeout(() => {\n const home = '../../';\n navigate(home);\n }, 0);\n }}>\n {i18n.t('Try again')}\n </Button>\n )\n }>\n <PageContainer compact view>\n <HeaderDetails>\n <div className={rowStyles()}>\n <Typography variant=\"label\" size=\"large\" color=\"neutral700\">\n {`${i18n.t('Request ID')}:`}\n </Typography>\n <div className={requestIdStyles()}>\n <Typography variant=\"label\" size=\"small\" color=\"neutral700\">\n {requestId}\n </Typography>\n <IconButton\n variant=\"ghost\"\n onClick={handleCopy.bind(null, requestId || '')}>\n <CopyIcon size={16} color=\"gray\" />\n </IconButton>\n <StyledLink\n target=\"_blank\"\n href={`${SCANNER_BASE_URL}/swap/${requestId}`}>\n <LinkIcon size={16} />\n </StyledLink>\n </div>\n </div>\n <div className={rowStyles()}>\n <Typography variant=\"label\" size=\"large\" color=\"neutral700\">\n {`${i18n.t(swap.finishTime ? 'Finished at' : 'Created at')}:`}\n </Typography>\n <Typography variant=\"label\" size=\"small\" color=\"neutral700\">\n {swapDate}\n </Typography>\n </div>\n </HeaderDetails>\n\n <div className={outputStyles()}>\n <QuoteCost\n fee={numberToString(\n String(totalFee),\n GAS_FEE_MIN_DECIMALS,\n GAS_FEE_MAX_DECIMALS\n )}\n time={secondsToString(totalArrivalTime(swap.steps))}\n steps={numberOfSteps}\n />\n <QuoteSummary\n from={{\n price: {\n value: numberToString(\n swap.inputAmount,\n TOKEN_AMOUNT_MIN_DECIMALS,\n TOKEN_AMOUNT_MAX_DECIMALS\n ),\n usdValue: inputUsdValue,\n realUsdValue: realInputUsdValue,\n realValue: swap.inputAmount,\n },\n token: {\n displayName: steps[0].from.token.displayName,\n image: steps[0].from.token.image,\n },\n chain: {\n image: steps[0].from.chain.image,\n displayName: steps[0].from.chain.displayName,\n },\n }}\n to={{\n price: {\n value: numberToString(\n outputAmount,\n TOKEN_AMOUNT_MIN_DECIMALS,\n TOKEN_AMOUNT_MAX_DECIMALS\n ),\n usdValue: outputUsdValue,\n realUsdValue: realOutputUsdValue,\n realValue: outputAmount,\n },\n token: {\n displayName: 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(percentageChange ?? 0)}\n />\n </div>\n <div className={titleStepsStyles()}>\n <Typography variant=\"title\" size=\"small\">\n {i18n.t('Swaps steps')}\n </Typography>\n </div>\n <Divider size={8} />\n <StepsList 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=\"swap-progress\"\n ref={listRef}\n state={state}\n hasSeparator={index !== 0}\n tabIndex={key}\n isFocused={isFocused}\n tooltipContainer={getContainer()}\n />\n );\n })}\n </StepsList>\n </PageContainer>\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 walletButtonDisabled={!isActiveTab}\n />\n <SwapDetailsCompleteModal\n open={!!showCompletedModal}\n diagnosisUrl={diagnosisUrl}\n onClose={() => setShowCompletedModal(null)}\n status={swap.status === 'success' ? 'success' : 'failed'}\n priceValue={numberToString(\n outputAmount,\n TOKEN_AMOUNT_MIN_DECIMALS,\n TOKEN_AMOUNT_MAX_DECIMALS\n )}\n usdValue={outputUsdValue}\n realUsdValue={realOutputUsdValue}\n realValue={formatTooltipNumbers(outputAmount)}\n percentageChange={numberToString(\n percentageChange,\n PERCENTAGE_CHANGE_MIN_DECIMALS,\n PERCENTAGE_CHANGE_MAX_DECIMALS\n )}\n token={{\n displayName: steps[numberOfSteps - 1].to.token.displayName,\n image: steps[numberOfSteps - 1].to.token.image,\n }}\n chain={{ image: steps[numberOfSteps - 1].to.chain.image }}\n description={completeModalDesc}\n />\n </Layout>\n );\n}\n", "import type { PendingSwap } from 'rango-types';\n\nimport { i18n } from '@lingui/core';\n\nconst daysOfWeek = [\n i18n.t('Sunday'),\n i18n.t('Monday'),\n i18n.t('Tuesday'),\n i18n.t('Wednesday'),\n i18n.t('Thursday'),\n i18n.t('Friday'),\n i18n.t('Saturday'),\n];\n\nexport function timeSince(millisecond: number) {\n const date = new Date(millisecond);\n const day = date.getDate();\n const month = date.toLocaleString('default', { month: 'long' });\n const year = date.getFullYear();\n const isToday = date.getDay() === new Date().getDay();\n const formattedDate = isToday\n ? i18n.t('Today')\n : `${daysOfWeek[date.getDay()]} ${day} ${month} ${year}`;\n\n return `${formattedDate}, ${new Date(millisecond).toLocaleTimeString()}`;\n}\n\nexport function getSwapDate(pendingSwap: PendingSwap) {\n const time = pendingSwap.finishTime\n ? timeSince(parseInt(pendingSwap.finishTime))\n : timeSince(parseInt(pendingSwap.creationTime));\n return time;\n}\n", "import type { ModalPropTypes } from './SwapDetailsModal.types';\n\nimport { PendingSwapNetworkStatus } from 'rango-types';\nimport React from 'react';\n\nimport { WIDGET_UI_ID } from '../../constants';\nimport { WatermarkedModal } from '../common/WatermarkedModal';\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 {\n state,\n onClose,\n onDelete,\n onCancel,\n currentStepWallet,\n message,\n walletButtonDisabled,\n } = props;\n\n const showWalletStateContent =\n state === PendingSwapNetworkStatus.WaitingForNetworkChange ||\n state === PendingSwapNetworkStatus.WaitingForConnectingWallet ||\n state === PendingSwapNetworkStatus.NetworkChanged;\n\n return (\n <WatermarkedModal\n open={!!state}\n onClose={onClose}\n container={\n document.getElementById(WIDGET_UI_ID.SWAP_BOX_ID) || document.body\n }>\n {showWalletStateContent && (\n <WalletStateContent\n type={modalNetworkValues[state].type}\n title={modalNetworkValues[state].title}\n currentStepWallet={currentStepWallet}\n message={message}\n walletButtonDisabled={walletButtonDisabled}\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 </WatermarkedModal>\n );\n}\n", "import type { CancelContentProps } from './SwapDetailsModal.types';\n\nimport { i18n } from '@lingui/core';\nimport { Button, Divider, MessageBox } from '@rango-dev/ui';\nimport React from 'react';\n\nexport const CancelContent = ({ onCancel, onClose }: CancelContentProps) => {\n return (\n <>\n <Divider size={20} />\n <MessageBox\n type=\"error\"\n title={i18n.t('Cancel Swap')}\n description={i18n.t('Are you sure you want to cancel this swap?')}\n />\n <Divider size={32} />\n <Button\n variant=\"contained\"\n type=\"primary\"\n size=\"large\"\n onClick={onCancel}>\n {i18n.t('Yes, Cancel it')}\n </Button>\n <Divider size={12} />\n <Button variant=\"outlined\" type=\"primary\" size=\"large\" onClick={onClose}>\n {i18n.t('No, Continue')}\n </Button>\n </>\n );\n};\n", "import type { DeleteContentProps } from './SwapDetailsModal.types';\n\nimport { i18n } from '@lingui/core';\nimport { Button, Divider, MessageBox, Typography } from '@rango-dev/ui';\nimport React from 'react';\n\nexport const DeleteContent = ({ onDelete, onClose }: DeleteContentProps) => {\n return (\n <>\n <Divider size={20} />\n <MessageBox\n type=\"error\"\n title={i18n.t('Delete Transaction')}\n description={i18n.t('Are you sure you want to delete this swap?')}\n />\n <Divider size={32} />\n <Button\n variant=\"contained\"\n type=\"primary\"\n size=\"large\"\n onClick={onDelete}>\n {i18n.t('Yes, Delete it')}\n </Button>\n <Divider size={12} />\n <Button 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-types';\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 } from '@rango-dev/ui';\nimport { useWallets } from '@rango-dev/wallets-react';\nimport React from 'react';\n\nimport { getContainer } from '../../utils/common';\nimport { mapStatusToWalletState } from '../../utils/wallets';\n\nimport { WalletContainer } from './SwapDetailsModal.styles';\n\nexport const WalletStateContent = (props: WalletStateContentProps) => {\n const {\n type,\n title,\n currentStepWallet,\n message,\n showWalletButton,\n walletButtonDisabled,\n } = props;\n const { connect, getWalletInfo, state } = useWallets();\n const walletType = currentStepWallet?.walletType;\n const walletState = walletType\n ? mapStatusToWalletState(state(walletType))\n : null;\n const walletInfo = walletType ? getWalletInfo(walletType) : null;\n const shouldShowWallet =\n showWalletButton && !!walletType && !!walletState && !!walletInfo;\n return (\n <>\n <MessageBox type={type} title={title} description={message} />\n {shouldShowWallet && (\n <WalletContainer>\n <Wallet\n container={getContainer()}\n title={walletInfo.name}\n image={walletInfo.img}\n type={walletType}\n state={walletState}\n link={walletInfo.installLink}\n disabled={walletButtonDisabled}\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 TokenAmount,\n Typography,\n} from '@rango-dev/ui';\nimport React from 'react';\nimport { useNavigate } from 'react-router-dom';\n\nimport { WIDGET_UI_ID } from '../../constants';\nimport { getContainer } from '../../utils/common';\nimport { WatermarkedModal } from '../common/WatermarkedModal';\n\nexport function SwapDetailsCompleteModal(props: CompleteModalPropTypes) {\n const {\n open,\n onClose,\n status,\n priceValue,\n usdValue,\n realUsdValue,\n realValue,\n token,\n chain,\n percentageChange,\n description,\n diagnosisUrl,\n } = props;\n const navigate = useNavigate();\n\n return (\n <WatermarkedModal\n open={open}\n onClose={onClose}\n container={\n document.getElementById(WIDGET_UI_ID.SWAP_BOX_ID) || document.body\n }>\n {status === 'success' ? (\n <MessageBox type=\"success\" title={i18n.t('Swap Successful')}>\n <TokenAmount\n direction=\"vertical\"\n tooltipContainer={getContainer()}\n type=\"output\"\n centerAlign={true}\n price={{\n value: priceValue,\n usdValue,\n realUsdValue,\n realValue,\n }}\n token={token}\n chain={chain}\n percentageChange={percentageChange}\n />\n <Divider size={12} />\n <Typography\n variant=\"body\"\n size=\"medium\"\n color=\"neutral700\"\n align=\"center\">\n {description}\n </Typography>\n </MessageBox>\n ) : (\n <MessageBox\n type=\"error\"\n title={i18n.t('Transaction Failed')}\n description={description}\n />\n )}\n <Divider size={32} />\n {status === 'success' && (\n <Button\n variant=\"contained\"\n type=\"primary\"\n size=\"large\"\n onClick={() => {\n const home = '../../';\n navigate(home);\n }}>\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 {i18n.t('Diagnosis')}\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 </WatermarkedModal>\n );\n}\n", "import type { GetStep } from '../SwapDetailsAlerts';\nimport type { Step, StepDetailsProps } from '@rango-dev/ui';\nimport type { PendingSwapStep } from 'rango-types';\n\nimport React from 'react';\n\nimport {\n TOKEN_AMOUNT_MAX_DECIMALS,\n TOKEN_AMOUNT_MIN_DECIMALS,\n} from '../../constants/routing';\nimport {\n getBlockchainShortNameFor,\n getSwapperDisplayName,\n} from '../../utils/meta';\nimport { numberToString } from '../../utils/numbers';\nimport { isNetworkStatusInWarningState } from '../../utils/swap';\nimport { SwapDetailsAlerts } from '../SwapDetailsAlerts';\n\nexport const RESET_INTERVAL = 2_000;\nexport const SECONDS = 60;\n\nexport const getSteps = ({\n swap,\n blockchains,\n swappers,\n ...args\n}: GetStep): Step[] => {\n const hasAlreadyProceededToSign = swap.hasAlreadyProceededToSign !== false;\n return swap.steps.map((step, index) => {\n const amountToConvert =\n index === 0\n ? swap.inputAmount\n : swap.steps[index - 1].outputAmount ||\n swap.steps[index - 1].expectedOutputAmountHumanReadable;\n return {\n from: {\n token: { displayName: step.fromSymbol, image: step.fromLogo ?? '' },\n chain: {\n displayName:\n getBlockchainShortNameFor(step.fromBlockchain, blockchains) ?? '',\n image: step.fromBlockchainLogo ?? '',\n },\n price: {\n value: numberToString(\n amountToConvert,\n TOKEN_AMOUNT_MIN_DECIMALS,\n TOKEN_AMOUNT_MAX_DECIMALS\n ),\n realValue: amountToConvert,\n },\n },\n to: {\n token: { displayName: step.toSymbol, image: step.toLogo },\n chain: {\n displayName:\n getBlockchainShortNameFor(step.toBlockchain, blockchains) ?? '',\n image: step.toBlockchainLogo ?? '',\n },\n price: {\n value: numberToString(\n step.outputAmount || step.expectedOutputAmountHumanReadable,\n TOKEN_AMOUNT_MIN_DECIMALS,\n TOKEN_AMOUNT_MAX_DECIMALS\n ),\n realValue:\n step.outputAmount || step.expectedOutputAmountHumanReadable,\n },\n },\n swapper: {\n displayName: getSwapperDisplayName(step.swapperId, swappers),\n image: step.swapperLogo ?? '',\n type: step.swapperType,\n },\n internalSwaps: step.internalSwaps\n ? step.internalSwaps.map((internalSwap) => {\n return {\n from: {\n blockchain:\n getBlockchainShortNameFor(\n internalSwap.fromBlockchain,\n blockchains\n ) ?? '',\n },\n to: {\n blockchain:\n getBlockchainShortNameFor(\n internalSwap.toBlockchain,\n blockchains\n ) ?? '',\n },\n swapper: {\n displayName: getSwapperDisplayName(\n internalSwap.swapperId,\n swappers\n ),\n image: internalSwap.swapperLogo ?? '',\n type: internalSwap.swapperType,\n },\n };\n })\n : [],\n alerts: (\n <SwapDetailsAlerts\n step={step}\n hasAlreadyProceededToSign={hasAlreadyProceededToSign}\n {...args}\n />\n ),\n };\n });\n};\n\nexport function getStepState(step: PendingSwapStep): StepDetailsProps['state'] {\n if (\n isNetworkStatusInWarningState(step) &&\n step.status !== 'failed' &&\n step.status !== 'success'\n ) {\n return 'warning';\n }\n\n switch (step.status) {\n case 'created':\n return 'default';\n case 'approved':\n case 'waitingForApproval':\n case 'running':\n return 'in-progress';\n case 'failed':\n return 'error';\n case 'success':\n return 'completed';\n }\n}\n", "import type { SwapAlertsProps } from './SwapDetailsAlerts.types';\n\nimport { i18n } from '@lingui/core';\nimport { Alert, IconButton, LinkIcon } from '@rango-dev/ui';\nimport React, { Fragment } from 'react';\n\nimport { isNetworkStatusInWarningState } from '../../utils/swap';\n\nimport { FailedAlert } from './SwapDetailsAlerts.Failed';\nimport { Alerts } from './SwapDetailsAlerts.styles';\nimport { WarningAlert } from './SwapDetailsAlerts.Warning';\n\nexport function SwapDetailsAlerts(props: SwapAlertsProps) {\n const {\n 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 const waitingProgress =\n (inProgress && !hasAlreadyProceededToSign) ||\n (waitingForApproval && !step.explorerUrl?.length);\n\n return (\n <Alerts>\n {step.explorerUrl?.map((explorerUrl, index, urls) => {\n const key = index + explorerUrl.url;\n const lastUrl = index === urls.length - 1;\n const loading =\n ((lastUrl && inProgress) || waitingForApproval) && !waitingProgress;\n const error = lastUrl && step.status === 'failed';\n\n return (\n <Fragment key={key}>\n <Alert\n type={\n lastUrl\n ? (loading && 'loading') || (error && 'error') || 'success'\n : 'success'\n }\n title={\n !explorerUrl.description\n ? i18n.t('View transaction')\n : `${explorerUrl.description} Tx`\n }\n action={\n explorerUrl.url && (\n <IconButton\n variant=\"ghost\"\n size=\"xsmall\"\n onClick={() => window.open(explorerUrl.url, '_blank')}>\n <LinkIcon size={12} />\n </IconButton>\n )\n }\n />\n </Fragment>\n );\n })}\n {waitingProgress && <Alert type=\"loading\" title={message.shortMessage} />}\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 { Alert, Button } from '@rango-dev/ui';\nimport { PendingSwapNetworkStatus } from 'rango-types';\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 { css, darkTheme, styled } from '@rango-dev/ui';\n\nimport { ScrollableArea } from '../Layout';\n\nexport const Container = styled('div', {\n display: 'flex',\n flexDirection: 'column',\n flexGrow: 1,\n overflow: 'hidden',\n});\n\nexport const HeaderDetails = styled('div', {\n width: '100%',\n});\n\nexport const StepsList = styled(ScrollableArea, {\n padding: '$0 $20 $20 $20',\n});\n\nexport const Alerts = styled('div', {\n display: 'flex',\n flexDirection: 'column',\n gap: '$10',\n});\n\nexport const PlaceholderContainer = styled('div', {\n height: '450px',\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n});\n\nexport const LoaderContainer = styled('div', {\n display: 'flex',\n justifyContent: 'center',\n width: '100%',\n paddingTop: '33%',\n flex: 1,\n});\n\nexport const rowStyles = css({\n display: 'flex',\n width: '100%',\n justifyContent: 'space-between',\n alignItems: 'center',\n padding: '$10 $20',\n borderBottom: '1px solid',\n $$color: '$colors$neutral300',\n [`.${darkTheme} &`]: {\n $$color: '$colors$neutral400',\n },\n borderColor: '$$color',\n color: '$neutral500',\n});\n\nexport const datePlaceholderStyles = css({\n padding: '$5 0',\n});\n\nexport const requestIdStyles = css({\n display: 'flex',\n justifyContent: 'center',\n alignItems: 'center',\n height: '$24',\n});\n\nexport const outputStyles = css({\n display: 'flex',\n width: '100%',\n padding: '$15 $20 $20',\n flexDirection: 'column',\n alignItems: 'start',\n});\n\nexport const titleStepsStyles = css({\n width: '100%',\n padding: '0 $20 $10',\n});\n\nexport const StyledLink = styled('a', {\n fontSize: '$16',\n fontWeight: '$400',\n color: '$neutral700',\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n});\n", "import type { SwapDetailsPlaceholderPropTypes } from './SwapDetails.types';\n\nimport { i18n } from '@lingui/core';\nimport { Divider, NotFound, Skeleton, Typography } from '@rango-dev/ui';\nimport React from 'react';\n\nimport { SuffixContainer } from '../HeaderButtons/HeaderButtons.styles';\nimport { Layout } from '../Layout';\nimport { LoadingSwapDetails } from '../LoadingSwapDetails';\n\nimport {\n Container,\n datePlaceholderStyles,\n HeaderDetails,\n PlaceholderContainer,\n requestIdStyles,\n rowStyles,\n} from './SwapDetails.styles';\n\nexport function SwapDetailsPlaceholder(props: SwapDetailsPlaceholderPropTypes) {\n const { requestId, showSkeleton } = props;\n return (\n <Layout\n header={{\n title: i18n.t('Swap and Bridge'),\n suffix: <SuffixContainer />,\n }}>\n {showSkeleton && (\n <Container>\n <HeaderDetails>\n <div className={rowStyles()}>\n <Typography variant=\"label\" size=\"large\" color=\"neutral700\">\n {`${i18n.t('Request ID')}:`}\n </Typography>\n <div className={requestIdStyles()}>\n <Typography variant=\"label\" size=\"small\" color=\"neutral700\">\n <Skeleton width={60} height={10} variant=\"rounded\" />\n </Typography>\n <Divider direction=\"horizontal\" size={4} />\n <Skeleton width={16} height={16} variant=\"rectangular\" />\n <Divider direction=\"horizontal\" size={4} />\n <Skeleton width={16} height={16} variant=\"rectangular\" />\n </div>\n </div>\n <div className={rowStyles()}>\n <Typography\n className={datePlaceholderStyles()}\n variant=\"label\"\n size=\"large\"\n color=\"neutral700\">\n <Skeleton width={60} height={10} variant=\"rounded\" />\n </Typography>\n <Typography variant=\"label\" size=\"small\" color=\"neutral700\">\n <Skeleton width={60} height={10} variant=\"rounded\" />\n </Typography>\n </div>\n </HeaderDetails>\n <LoadingSwapDetails />\n </Container>\n )}\n {!showSkeleton && (\n <PlaceholderContainer>\n <NotFound\n title={i18n.t('Not found')}\n description={i18n.t({\n id: 'Swap with request ID = {requestId} not found.',\n values: { requestId },\n })}\n />\n </PlaceholderContainer>\n )}\n </Layout>\n );\n}\n", "import { i18n } from '@lingui/core';\nimport { Divider, Skeleton, Typography } from '@rango-dev/ui';\nimport React from 'react';\n\nimport { QuoteSummarySkeleton, StepSkeleton } from '../QuoteSkeleton';\n\nimport {\n Container,\n extraInfoStyles,\n StepContainer,\n StepSeparator,\n} from './LoadingSwapDetails.styles';\n\nexport function LoadingSwapDetails() {\n return (\n <Container>\n <QuoteSummarySkeleton type=\"swap-preview\" />\n <div className=\"swaps-steps\">\n <Typography variant=\"title\" size=\"small\">\n {i18n.t('Swaps steps')}\n </Typography>\n </div>\n\n <>\n <StepContainer>\n <StepSkeleton separator={false} />\n <div className={extraInfoStyles()}>\n <Divider direction=\"horizontal\" size={20} />\n <Skeleton height={22} variant=\"rectangular\" />\n </div>\n </StepContainer>\n <StepSeparator />\n <StepContainer>\n <StepSkeleton separator={false} />\n </StepContainer>\n <StepSeparator />\n <StepContainer>\n <StepSkeleton separator={false} />\n </StepContainer>\n <StepSeparator />\n <StepContainer>\n <StepSkeleton separator={false} />\n </StepContainer>\n </>\n </Container>\n );\n}\n", "import { css, styled } from '@rango-dev/ui';\n\nexport const Container = styled('div', {\n width: '100%',\n height: '100%',\n padding: '$10 $20',\n});\n\nexport const StepContainer = styled('div', {\n backgroundColor: '$neutral100',\n borderRadius: '$xm',\n padding: '$10 $15',\n});\n\nexport const StepSeparator = styled('div', {\n width: '0px',\n height: '$20',\n borderLeft: '1px dashed $neutral700',\n marginLeft: '25px',\n});\n\nexport const quoteSummaryItemStyles = css({\n display: 'flex',\n justifyContent: 'space-between',\n alignItems: 'center',\n});\n\nexport const tokenAmountStyles = css({\n display: 'flex',\n justifyContent: 'space-between',\n alignItems: 'center',\n});\n\nexport const costStyles = css({\n paddingTop: '$15',\n display: 'flex',\n});\n\nexport const quoteSummaryStyles = css({\n padding: '$15 $0',\n});\n\nexport const quoteSummarySeparatorStyles = css({\n width: '0px',\n height: '$16',\n borderLeft: '1px solid $neutral400',\n marginLeft: '13px',\n});\n\nexport const swapsStepsStyles = css({\n paddingBottom: '$10',\n});\n\nexport const stepTitleStyles = css({\n display: 'flex',\n justifyContent: 'start',\n alignItems: 'center',\n});\n\nexport const stepTokensStyles = css({\n paddingTop: '$5',\n display: 'flex',\n alignItems: 'center',\n});\n\nexport const stepInfoStyles = css({\n display: 'flex',\n alignItems: 'center',\n});\n\nexport const stepIconStyles = css({\n padding: '$4 $6',\n display: 'flex',\n justifyContent: 'center',\n alignItems: 'center',\n});\n\nexport const extraInfoStyles = css({\n display: 'flex',\n paddingTop: '$10',\n paddingBottom: '$5',\n});\n", "import {\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 { useAppStore } from '../store/AppStore';\nimport { useNotificationStore } from '../store/notification';\nimport { useWalletsStore } from '../store/wallets';\n\nexport function WidgetEvents() {\n const tokens = useAppStore().tokens();\n const connectedWallets = useWalletsStore.use.connectedWallets();\n const getWalletsDetails = useWalletsStore.use.getWalletsDetails();\n const setNotification = useNotificationStore.use.setNotification();\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], tokens);\n toAccount && getWalletsDetails([toAccount], tokens);\n }\n\n setNotification(event, route);\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 { 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 { useUiStore } from '../store/ui';\nimport { getConfig } from '../utils/configs';\n\nexport type Watermark = 'NONE' | 'FULL';\n\ntype ConfigResponse = {\n config: {\n watermark: Watermark;\n };\n};\n\ninterface UseFetchApiConfig {\n fetchApiConfig: () => Promise<void>;\n}\n\nexport function useFetchApiConfig(): UseFetchApiConfig {\n const { setWatermark } = useUiStore();\n\n const fetchApiConfig: UseFetchApiConfig['fetchApiConfig'] = async () => {\n const response = await fetch(\n `${getConfig('BASE_URL')}/meta/dapp/config?apiKey=${getConfig('API_KEY')}`\n );\n\n if (!response.ok) {\n throw new Error(`Request failed with status: ${response.status} `);\n }\n\n const data: ConfigResponse = await response.json();\n\n setWatermark(data.config.watermark);\n };\n return { fetchApiConfig };\n}\n", "import { styled } from '@rango-dev/ui';\n\nexport const MainContainer = styled('div', {\n fontFamily: '$widget',\n boxSizing: 'border-box',\n textAlign: 'left',\n '& *, *::before, *::after': {\n boxSizing: 'inherit',\n },\n '& *:focus-visible': {\n outlineColor: '$info500',\n transition: 'none',\n },\n '& ul, ol, li': { listStyleType: 'none' },\n});\n", "import type { PropTypes } from './WidgetProvider.types';\nimport type { PropsWithChildren } from 'react';\n\nimport React, { useMemo } from 'react';\n\nimport { DEFAULT_BASE_URL, RANGO_PUBLIC_API_KEY } from '../../constants';\nimport QueueManager from '../../QueueManager';\nimport { initConfig } from '../../utils/configs';\nimport { WidgetWallets } from '../Wallets';\nimport { WidgetInfo } from '../WidgetInfo';\n\nexport function WidgetProvider(props: PropsWithChildren<PropTypes>) {\n const { onUpdateState, config } = props;\n\n useMemo(() => {\n initConfig({\n API_KEY: config?.apiKey || RANGO_PUBLIC_API_KEY,\n BASE_URL: config?.apiUrl || DEFAULT_BASE_URL,\n });\n }, [config.apiKey, config.apiUrl]);\n\n return (\n <WidgetWallets config={config} onUpdateState={onUpdateState}>\n <QueueManager apiKey={config.apiKey}>\n <WidgetInfo>{props.children}</WidgetInfo>\n </QueueManager>\n </WidgetWallets>\n );\n}\n", "import type { SwapQueueContext } from '@rango-dev/queue-manager-rango-preset';\nimport type { Network, WalletType } from '@rango-dev/wallets-shared';\nimport type { PropsWithChildren } from 'react';\n\nimport {\n checkWaitingForNetworkChange,\n makeQueueDefinition,\n} from '@rango-dev/queue-manager-rango-preset';\nimport { Provider as ManagerProvider } from '@rango-dev/queue-manager-react';\nimport { useWallets } from '@rango-dev/wallets-react';\nimport { convertEvmBlockchainMetaToEvmChainInfo } from '@rango-dev/wallets-shared';\nimport { isEvmBlockchain } from 'rango-types';\nimport React, { useMemo } from 'react';\n\nimport { useAppStore } from './store/AppStore';\nimport { useUiStore } from './store/ui';\nimport { useWalletsStore } from './store/wallets';\nimport { getConfig } from './utils/configs';\nimport { walletAndSupportedChainsNames } from './utils/wallets';\n\nfunction QueueManager(props: PropsWithChildren<{ apiKey?: string }>) {\n const {\n providers,\n getSigners,\n state,\n connect,\n canSwitchNetworkTo,\n getWalletInfo,\n } = useWallets();\n\n const swapQueueDef = useMemo(() => {\n return makeQueueDefinition({\n API_KEY: props.apiKey || getConfig('API_KEY'),\n BASE_URL: getConfig('BASE_URL'),\n });\n }, [props.apiKey]);\n\n const blockchains = useAppStore().blockchains();\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 = async (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 wallets,\n providers: allProviders,\n switchNetwork,\n canSwitchNetworkTo,\n connect,\n state,\n isMobileWallet,\n };\n\n const isActiveTab = useUiStore.use.isActiveTab();\n\n return (\n <ManagerProvider\n queuesDefs={[swapQueueDef]}\n context={context}\n onPersistedDataLoaded={(manager) => {\n checkWaitingForNetworkChange(manager);\n }}\n isPaused={!isActiveTab}>\n {props.children}\n </ManagerProvider>\n );\n}\n\nexport default QueueManager;\n", "import type { WidgetInfoContextInterface } from './WidgetInfo.types';\n\nimport { useManager } from '@rango-dev/queue-manager-react';\nimport React, { createContext, useContext } from 'react';\n\nimport { useLanguage } from '../../hooks/useLanguage';\nimport { useAppStore } from '../../store/AppStore';\nimport { useNotificationStore } from '../../store/notification';\nimport { useQuoteStore } from '../../store/quote';\nimport { tabManager, useUiStore } from '../../store/ui';\nimport { useWalletsStore } from '../../store/wallets';\nimport { calculateWalletUsdValue } from '../../utils/wallets';\n\nimport { WidgetHistory } from './WidgetInfo.helpers';\n\nexport const WidgetInfoContext = createContext<\n WidgetInfoContextInterface | undefined\n>(undefined);\n\nexport function WidgetInfo(props: React.PropsWithChildren) {\n const { manager } = useManager();\n const isActiveTab = useUiStore.use.isActiveTab();\n const retrySwap = useQuoteStore.use.retry();\n const history = new WidgetHistory(manager, { retrySwap });\n const details = useWalletsStore.use.connectedWallets();\n const isLoading = useWalletsStore.use.loading();\n const totalBalance = calculateWalletUsdValue(details);\n const refetch = useWalletsStore.use.getWalletsDetails();\n const blockchains = useAppStore().blockchains();\n const tokens = useAppStore().tokens();\n const swappers = useAppStore().swappers();\n const loadingStatus = useAppStore().fetchStatus;\n const resetLanguage = useLanguage().resetLanguage;\n const notifications = useNotificationStore().getUnreadNotifications();\n\n // eslint-disable-next-line react/jsx-no-constructed-context-values\n const value: WidgetInfoContextInterface = {\n isActiveTab,\n setCurrentTabAsActive: tabManager.forceClaim,\n history,\n wallets: {\n isLoading,\n details,\n totalBalance,\n refetch,\n },\n meta: {\n blockchains,\n tokens,\n swappers,\n loadingStatus,\n },\n resetLanguage,\n notifications: {\n list: notifications,\n },\n };\n\n return (\n <WidgetInfoContext.Provider value={value}>\n {props.children}\n </WidgetInfoContext.Provider>\n );\n}\n\nexport function useWidget(): WidgetInfoContextInterface {\n const context = useContext(WidgetInfoContext);\n if (!context) {\n throw new Error(\n 'useWidget can only be used within the WidgetProvider component'\n );\n }\n return context;\n}\n", "import type { Meta } from '../../store/quote';\nimport type { Manager } from '@rango-dev/queue-manager-core';\nimport type { PendingSwap } from 'rango-types/lib';\n\nimport {\n cancelSwap,\n getCurrentBlockchainOfOrNull,\n getCurrentStep,\n getRelatedWalletOrNull,\n} from '@rango-dev/queue-manager-rango-preset';\n\nimport { getPendingSwaps } from '../../utils/queue';\n\ninterface WidgetHistoryActions {\n retrySwap: (pendingSwap: PendingSwap, meta: Meta) => void;\n}\n\nexport class WidgetHistory {\n private manager: Manager | undefined;\n private actions: WidgetHistoryActions;\n\n constructor(manager: Manager | undefined, actions: WidgetHistoryActions) {\n this.manager = manager;\n this.actions = actions;\n }\n\n public getAllSwaps() {\n return getPendingSwaps(this.manager);\n }\n\n public getCurrentStep(swap: PendingSwap) {\n return this.getCurrentStepInfo(swap).step;\n }\n\n public getCurrentStepWallet(swap: PendingSwap) {\n return this.getCurrentStepInfo(swap).wallet;\n }\n\n public getCurrentStepNetwork(swap: PendingSwap) {\n return this.getCurrentStepInfo(swap).network;\n }\n\n public retry(swap: PendingSwap, meta: Meta) {\n return this.actions.retrySwap(swap, meta);\n }\n\n public cancel(id: string) {\n const queue = this.manager?.get(id);\n if (queue) {\n cancelSwap(queue);\n }\n }\n\n private getCurrentStepInfo(swap: PendingSwap) {\n const currentStep = getCurrentStep(swap);\n return {\n step: currentStep,\n wallet: currentStep ? getRelatedWalletOrNull(swap, currentStep) : null,\n network: currentStep\n ? getCurrentBlockchainOfOrNull(swap, currentStep)\n : null,\n };\n }\n}\n"],
|
|
5
|
-
"mappings": "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",
|
|
6
|
-
"names": ["EventSeverity", "MainEvents", "RouteEventType", "StepEventType", "StepExecutionBlockedEventStatus", "StepExecutionEventStatus", "useWidgetEvents", "readAccountAddress", "useWallets", "WalletEvents", "Networks", "WalletTypes", "PendingSwapNetworkStatus", "UI_ID", "RANGO_PUBLIC_API_KEY", "DEFAULT_BASE_URL", "SCANNER_BASE_URL", "WIDGET_UI_ID", "Events", "Provider", "isEvmBlockchain", "React", "createContext", "useEffect", "useRef", "useEffect", "create", "subscribeWithSelector", "RangoClient", "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", "formatTooltipNumbers", "number", "numberToString", "mapStatusToWalletState", "state", "WalletStatus", "__name", "mapWalletTypesToWalletInfo", "getState", "getWalletInfo", "list", "chain", "wallet", "EXCLUDED_WALLETS", "supportedChains", "isContractWallet", "installed", "network", "supportedChain", "type", "name", "image", "installLink", "detectInstallLink", "walletAndSupportedChainsNames", "supportedBlockchains", "blockchainMeta", "prepareAccountsForWalletStore", "accounts", "evmBasedChains", "supportedChainNames", "result", "addAccount", "address", "account", "newAccount", "readAccountAddress", "hasLimitation", "isSupported", "isUnknown", "Networks", "isUnknownAndEvmBased", "isEvmAddress", "getRequiredChains", "quote", "wallets", "swap", "currentStepFromBlockchain", "currentStepToBlockchain", "internalSwap", "internalStepFromBlockchain", "internalStepToBlockchain", "isAccountAndWalletMatched", "connectedWallet", "makeBalanceFor", "retrievedBalance", "tokens", "balances", "tokenBalance", "BigNumber", "getUsdPrice", "resetConnectedWalletState", "calculateWalletUsdValue", "uniqueAccountAddresses", "modifiedWalletBlockchains", "acc", "current", "i", "modifiedWalletBlockchain", "accountAddress", "total", "numberToString", "b", "a", "ZERO", "numberWithThousandSeparator", "number", "parts", "blockchain", "symbol", "allTokens", "t", "isExperimentalChain", "blockchains", "cosmosExperimentalChainInfo", "getCosmosExperimentalChainInfo", "isCosmosBlockchain", "formatBalance", "balance", "numberToString", "__name", "sortTokensByBalance", "token1Balance", "token2Balance", "sortTokensByPinnedToken", "token1", "token2", "isTokenPinned", "isToken1Pinned", "isToken2Pinned", "sortTokens", "tokens", "getBalanceFor", "isTokenPin", "areTokensEqual", "tokenA", "tokenB", "sortWalletsBasedOnConnectionState", "wallets", "a", "b", "WalletStatus", "getConciseAddress", "address", "maxChars", "ellipsisLength", "start", "end", "getAddress", "chain", "connectedWallets", "walletType", "connectedWallet", "createTokenHash", "token", "makeTokensBalance", "wallet", "balances", "currentBalance", "BigNumber", "ZERO", "tokenHash", "prevBalance", "isFetchingBalance", "blockchain", "hashWalletsState", "walletsInfo", "w", "configs", "RANGO_PUBLIC_API_KEY", "getConfig", "name", "__name", "initConfig", "nextConfigs", "clonedConfigs", "configs", "__name", "DEFAULT_PRIMARY_RADIUS", "DEFAULT_SECONDARY_RADIUS", "DEFAULT_FONT_FAMILY", "THEME_CLASS_NAME_PREFIX", "isTokenExcludedInConfig", "token", "tokensConfig", "result", "asset", "areTokensEqual", "isExcluded", "isBlockchainExcludedInConfig", "blockchain", "blockchainsConfig", "isVariantExpandable", "isLargeScreen", "isExtraLargeScreen", "variant", "rango", "httpService", "__name", "RangoClient", "getConfig", "createSelectors", "__name", "_store", "store", "k", "s", "selectors_default", "useWalletsStore", "selectors_default", "create", "subscribeWithSelector", "set", "get", "accounts", "tokens", "getWalletsDetails", "state", "wallet", "account", "shouldMarkWalletAsSelected", "connectedWallet", "walletType", "selectedWallets", "selectedWallet", "connectedWallets", "makeTokensBalance", "wallets", "walletSelected", "walletNotSelected", "shouldRetry", "isAccountAndWalletMatched", "data", "address", "chain", "retrievedBalance", "httpService", "matchedAccount", "retrievedBalanceAccount", "balance", "makeBalanceFor", "resetConnectedWalletState", "token", "balances", "tokenHash", "createTokenHash", "allProviders", "matchAndGenerateProviders", "providers", "options", "all", "allProviders", "selectedProviders", "requestedProvider", "result", "provider", "__name", "configWalletsToWalletName", "config", "useWalletProviders", "providers", "options", "clearConnectedWallet", "useWalletsStore", "generateProviders", "matchAndGenerateProviders", "useEffect", "__name", "React", "createContext", "useContext", "useEffect", "useRef", "create", "persist", "DEFAULT_CONFIG", "DEFAULT_IFRAME_CONFIGS", "DEFAULT_CAMPAIGN_MODE", "createConfigSlice", "__name", "initialData", "set", "get", "config", "campaignMode", "disabledLiquiditySources", "nextConfig", "currentConfig", "name", "value", "currentCampaignMode", "currentIframeConfig", "removeDuplicateFrom", "array", "__name", "areEqual", "array1", "array2", "v", "i", "debounce", "fn", "time", "timeoutId", "wrapper", "args", "containsText", "text", "searchText", "getContainer", "WIDGET_UI_ID", "getExpanded", "getUniqueSwappersGroups", "swappers", "disabledLiquiditySources", "supportedSwappers", "swapper", "uniqueSupportedSwappersGroups", "removeDuplicateFrom", "uniqueGroupItem", "swapperItem", "isSupportedSwapper", "supportedItem", "swapperTypeItem", "__name", "sortLiquiditySourcesByGroupTitle", "a", "b", "isFeatureHidden", "feature", "features", "isFeatureEnabled", "createDataSlice", "__name", "set", "get", "options", "blockchainsFromState", "config", "supportedBlockchainsFromConfig", "blockchain", "tokensFromState", "supportedTokensConfig", "blockchains", "token", "isTokenExcludedInConfig", "containsText", "a", "b", "type", "pinnedToken", "areTokensEqual", "campaignMode", "campaignModeLiquiditySource", "liquiditySources", "excludeLiquiditySources", "swapper", "swapperGroupIncludedInLiquiditySources", "sortLiquiditySourcesByGroupTitle", "enableCentralizedSwappers", "response", "httpService", "tokens", "popularTokens", "swappers", "blockchainsWithAtLeastOneToken", "error", "English", "French", "Japanese", "Portuguese", "Spanish", "LANGUAGES", "DEFAULT_LANGUAGE", "SLIPPAGES", "DEFAULT_SLIPPAGE", "HIGH_SLIPPAGE", "MAX_SLIPPAGE", "MIN_SLIPPGAE", "createSettingsSlice", "__name", "set", "get", "DEFAULT_SLIPPAGE", "blockchain", "currentPreferredBlockchains", "preferredBlockchain", "index", "isSameBlockchain", "isInVisibleList", "nextPreferredBlockchains", "slippage", "customSlippage", "affiliateRef", "affiliatePercent", "affiliateWallets", "swappers", "shouldReset", "state", "swappersGroup", "removeDuplicateFrom", "swapper", "name", "liquiditySource", "theme", "language", "nextConfig", "features", "isThemeHidden", "isFeatureHidden", "isLanguageHidden", "isLiquidityHidden", "DEFAULT_LANGUAGE", "createAppStore", "initialData", "create", "persist", "a", "createDataSlice", "createSettingsSlice", "createConfigSlice", "state", "__name", "AppStoreContext", "createContext", "useAppStore", "store", "useContext", "useEffect", "__name", "AppStoreProvider", "props", "appStoreRef", "useRef", "createAppStore", "React", "create", "CHANNEL_NAME", "TabManager", "__name", "events", "CHANNEL_NAME", "message", "pingAt", "isPingSentBefore", "event", "name", "resolve", "nextActiveTab", "useUiStore", "selectors_default", "create", "set", "get", "setCurrentTabAsActive", "hasRunningSwaps", "showActivateTabModal", "flag", "watermark", "tabManager", "TabManager", "WidgetContext", "createContext", "Main", "props", "updateConfig", "updateSettings", "fetchMeta", "useAppStore", "blockchains", "tokens", "walletOptions", "providers", "useWalletProviders", "connectWallet", "disconnectWallet", "useWalletsStore", "onConnectWalletHandler", "useRef", "useEffect", "evmBasedChainNames", "isEvmBlockchain", "chain", "onUpdateState", "__name", "type", "event", "value", "state", "meta", "Events", "supportedChainNames", "walletAndSupportedChainsNames", "data", "prepareAccountsForWalletStore", "key", "isActiveTab", "useUiStore", "React", "handler", "Provider", "WidgetWallets", "config", "otherProps", "AppStoreProvider", "React", "useEffect", "I18nManager", "React", "useContext", "useEffect", "useState", "useQueueManager", "useWallets", "isEvmBlockchain", "React", "Fragment", "MemoryRouter", "useInRouterContext", "useWallets", "useEffect", "useRef", "useForceAutoConnect", "connect", "state", "useWallets", "initiated", "useRef", "fetchStatus", "useAppStore", "walletType", "walletState", "useEffect", "__name", "AppRouter", "children", "props", "Router", "useInRouterContext", "Fragment", "MemoryRouter", "blockchains", "useAppStore", "canSwitchNetworkTo", "useWallets", "useForceAutoConnect", "evmChains", "isEvmBlockchain", "useQueueManager", "React", "__name", "React", "useRoutes", "navigationRoutes", "useEffect", "useRef", "BigNumber", "create", "subscribeWithSelector", "getLastSuccessfulStep", "BigNumber", "i18n", "NAME_OF_FEES", "ROUTE_STRATEGY", "HIGH_PRIORITY_TAGS", "GAS_FEE_MAX", "QuoteWarningType", "getBlockchainDisplayNameFor", "blockchainName", "blockchains", "blockchain", "__name", "getBlockchainShortNameFor", "getSwapperDisplayName", "swapperId", "swappers", "swapper", "findToken", "tokens", "token", "areTokensEqual", "findBlockchain", "name", "i18n", "BigNumber", "PendingSwapNetworkStatus", "getRequiredWallets", "swaps", "wallets", "swap", "currentStepFromBlockchain", "currentStepToBlockchain", "lastAddedWallet", "__name", "isValidAddress", "chain", "address", "i18n", "errorMessages", "__name", "i18n", "getQuoteErrorMessage", "error", "i18n", "swapButtonTitles", "__name", "i18n", "hasHighValueLoss", "inputUsdValue", "priceImpact", "BigNumber", "__name", "hasLimitError", "swaps", "swap", "minimum", "maximum", "getLimitErrorMessage", "isExclusive", "fromAmountRangeError", "recommendation", "i18n", "numberToString", "errorMessages", "getSwapButtonState", "params", "fetchMetaStatus", "anyWalletConnected", "fetchingQuote", "inputAmount", "quote", "warning", "error", "needsToWarnEthOnPath", "swapButtonTitles", "canComputePriceImpact", "usdValue", "ZERO", "requiredWallets", "wallets", "currentStepFromBlockchain", "currentStepToBlockchain", "lastAddedWallet", "getUsdPrice", "blockchain", "symbol", "address", "allTokens", "t", "getUsdFeeOfStep", "step", "totalFeeInUsd", "i", "fee", "unitPrice", "getTotalFeeInUsd", "totalFee", "getUsdFee", "getTotalFeesInUsd", "fees", "getFeesGroup", "result", "name", "feeGroup", "checkSlippageErrors", "swaps", "recommendedSlippages", "swap", "index", "__name", "checkSlippageWarnings", "quote", "userSlippage", "getMinRequiredSlippage", "slippage", "s", "a", "b", "hasProperSlippage", "minRequiredSlippage", "createQuoteRequestBody", "params", "fromToken", "toToken", "inputAmount", "wallets", "selectedWallets", "disabledLiquiditySources", "liquiditySources", "excludeLiquiditySources", "slippage", "affiliateRef", "affiliatePercent", "affiliateWallets", "destination", "enableCentralizedSwappers", "selectedWalletsMap", "selectedWallet", "connectedWallets", "wallet", "liquiditySource", "__name", "getWalletsForNewSwap", "getQuoteOutputAmount", "quote", "getPercentageChange", "input", "output", "BigNumber", "isOutputAmountChangedALot", "oldQuote", "newQuote", "oldOutputAmount", "newOutputAmount", "percentageChange", "getPriceImpact", "generateBalanceWarnings", "blockchains", "fee", "requiredWallets", "getRequiredChains", "selectedWallet1", "selectedWallet2", "getRequiredBalanceOfWallet", "asset", "symbol", "currentAmount", "numberToString", "requiredAmount", "reason", "i18n", "getBlockchainShortNameFor", "calcOutputUsdValue", "outputAmount", "tokenPrice", "ZERO", "isNetworkStatusInWarningState", "pendingSwapStep", "PendingSwapNetworkStatus", "getSwapMessages", "pendingSwap", "currentStep", "textForRemove", "message", "detailedMessage", "isRpc", "getLastConvertedTokenInFailedSwap", "resultToken", "lastSuccessStep", "step", "shouldRetrySwap", "confirmSwapDisabled", "fetching", "showCustomDestination", "customDestination", "lastStepToBlockchain", "chain", "isValidAddress", "isTokensIdentical", "tokenA", "tokenB", "getQuoteToTokenUsdPrice", "quote", "swaps", "__name", "isNumberOfSwapsChanged", "quoteA", "quoteB", "quoteASwaps", "quoteBSwaps", "isQuoteSwappersUpdated", "quoteASwappers", "swap", "quoteBSwappers", "areEqual", "isQuoteInternalCoinsUpdated", "quoteAInternalCoins", "quoteBInternalCoins", "isQuoteChanged", "getRequiredBalanceOfWallet", "selectedWallet", "fee", "relatedFeeStatus", "item", "wallet", "__name", "getPriceImpactLevel", "priceImpact", "warningLevel", "createRetryQuote", "pendingSwap", "blockchains", "tokens", "firstStep", "lastStep", "lastSuccessfulStep", "getLastSuccessfulStep", "toToken", "fromBlockchainMeta", "findBlockchain", "toBlockchainMeta", "fromTokenMeta", "findToken", "toTokenMeta", "inputAmount", "__name", "generateQuoteWarnings", "quote", "params", "fromToken", "userSlippage", "inputUsdValue", "getUsdValue", "outputUsdValue", "priceImpact", "getPriceImpact", "hasHighValueLoss", "totalFee", "getTotalFeeInUsd", "warningLevel", "getPriceImpactLevel", "minRequiredSlippage", "getMinRequiredSlippage", "highSlippage", "HIGH_SLIPPAGE", "hasProperSlippage", "checkSlippageWarnings", "outputUsdValueIsInvalid", "percentageChange", "getPercentageChange", "getUniqueBlockchains", "steps", "set", "result", "step", "sortQuotesBy", "strategy", "quotes", "quote1", "quote2", "getScore", "route", "score", "quote1Score", "quote2Score", "lowerQuoteId1", "lowerQuoteId2", "getDefaultQuote", "currentQuote", "requestAmount", "currentQuoteSwapperIds", "swap", "matchedQuote", "quoteSwapperIds", "swapperId", "sortTags", "tags", "customSort", "a", "b", "indexA", "HIGH_PRIORITY_TAGS", "indexB", "getUsdValue", "__name", "token", "amount", "BigNumber", "ZERO", "useQuoteStore", "selectors_default", "create", "subscribeWithSelector", "set", "key", "value", "state", "quote", "outputAmount", "outputUsdValue", "isPositiveNumber", "calcOutputUsdValue", "getQuoteToTokenUsdPrice", "chain", "params", "blockchain", "pendingSwap", "meta", "tokens", "blockchains", "fromBlockchain", "fromToken", "toBlockchain", "toToken", "inputAmount", "createRetryQuote", "flag", "wallets", "address", "useSyncStoresWithConfig", "setInputAmount", "setToToken", "setToBlockchain", "setFromBlockchain", "setFromToken", "fromToken", "toToken", "fromBlockchain", "toBlockchain", "useQuoteStore", "config", "useAppStore", "fetchMetaStatus", "blockchains", "tokens", "setAffiliateRef", "setAffiliatePercent", "setAffiliateWallets", "fromTokensConfig", "fromBlockchainsConfig", "toTokensConfig", "toBlockchainsConfig", "prevConfigFromToken", "useRef", "prevConfigToToken", "prevConfigFromBlockchain", "prevConfigToBlockchain", "useEffect", "chain", "token", "t", "areTokensEqual", "isTokenExcludedInConfig", "isBlockchainExcludedInConfig", "__name", "useEffect", "useRef", "useInRouterContext", "useLocation", "useSearchParams", "searchParamToToken", "tokens", "searchParam", "chain", "token", "symbolAndAddress", "__name", "tokenToSearchParam", "useSyncUrlAndStore", "location", "useLocation", "searchParams", "setSearchParams", "useSearchParams", "fromBlockchain", "toBlockchain", "fromToken", "toToken", "inputAmount", "setFromBlockchain", "setToBlockchain", "setFromToken", "setToToken", "setInputAmount", "useQuoteStore", "fetchMetaStatus", "useAppStore", "blockchains", "tokens", "isInRouterContext", "useInRouterContext", "updateIframe", "updateCampaignMode", "campaignMode", "liquiditySourcesParamsRef", "useRef", "getUrlSearchParams", "__name", "fromAmount", "autoConnect", "clientUrl", "liquiditySources", "updateUrlSearchParams", "property", "useEffect", "tokenToSearchParam", "blockchain", "searchParamToToken", "i18n", "useManager", "Alert", "Button", "css", "Divider", "IconButton", "SettingsIcon", "styled", "Tooltip", "Typography", "WalletIcon", "React", "useEffect", "useLayoutEffect", "useRef", "useState", "flushSync", "useLocation", "useNavigate", "i18n", "Alert", "BalanceErrors", "Button", "ChevronDownIcon", "ChevronLeftIcon", "Divider", "MessageBox", "Typography", "WalletIcon", "React", "useEffect", "useState", "useNavigate", "i18n", "getQuoteUpdateWarningMessage", "warning", "i18n", "__name", "Modal", "React", "WatermarkedModal", "props", "watermark", "useUiStore", "React", "Modal", "__name", "React", "useRef", "Collapsible", "keyframes", "styled", "EXPANDABLE_TRANSITION_DURATION", "slideDown", "slideUp", "CollapsibleRoot", "Trigger", "CollapsibleContent", "ExpandedIcon", "CustomCollapsible", "props", "open", "hasSelected", "onOpenChange", "children", "onClickTrigger", "trigger", "triggerAnchor", "ref", "useRef", "React", "CollapsibleRoot", "Trigger", "CollapsibleContent", "__name", "css", "darkTheme", "IconButton", "styled", "TextField", "Title", "ListContainer", "WalletButton", "ShowMoreWallets", "ShowMoreHeader", "NavigateBack", "WalletsContainer", "walletsListStyles", "CustomDestination", "alarmsStyles", "ConfirmButton", "StyledTextField", "Wallets", "CustomDestinationButton", "i18n", "Button", "Divider", "Image", "MessageBox", "SelectableWallet", "Typography", "WalletState", "React", "useEffect", "useState", "WalletState", "useWallets", "KEPLR_COMPATIBLE_WALLETS", "WalletTypes", "useCallback", "useEffect", "useState", "ALL_SUPPORTED_WALLETS", "WalletTypes", "useWalletList", "params", "config", "chain", "onBeforeConnect", "onConnect", "state", "disconnect", "getWalletInfo", "connect", "useWallets", "connectedWallets", "useWalletsStore", "blockchains", "useAppStore", "listAvailableWalletTypes", "configWalletsToWalletName", "wallets", "mapWalletTypesToWalletInfo", "sortedWallets", "sortWalletsBasedOnConnectionState", "error", "setError", "useState", "isExperimentalChainNotAdded", "__name", "walletType", "connectedWallet", "handleClick", "type", "wallet", "atLeastOneWalletIsConnected", "w", "WalletState", "e", "disconnectConnectingWallets", "useCallback", "connectingWallets", "hashWalletsState", "useEffect", "shouldShowDefaultInjectedWallet", "blockchain", "shouldExcludeWallet", "isExperimentalChain", "KEPLR_COMPATIBLE_WALLETS", "i18n", "styled", "Typography", "Wallet", "WalletState", "React", "useState", "useManager", "BottomLogo", "Divider", "Header", "React", "useEffect", "useRef", "useRef", "isAppLoadedIntoIframe", "__name", "useIframe", "heightObserver", "useRef", "iframe", "useAppStore", "isMessagePassingAvailable", "isAppLoadedIntoIframe", "send", "__name", "message", "element", "entries", "entry", "useNavigate", "useNavigateBack", "navigate", "useNavigate", "__name", "createTheme", "defaultDarkTheme", "defaultLightTheme", "useEffect", "useState", "baseThemeTokens", "defaultDarkColors", "React", "generateShades", "baseColor", "prefix", "reverse", "shadeIncrements", "increment", "i", "decrementAmounts", "shades", "shadeIndex", "decrementAmount", "shade", "generateShade", "__name", "r", "g", "b", "convertToRGB", "clamp", "color", "isBright", "generateColors", "mainColors", "reverseNeutralRange", "colors", "changeColors", "listOfColors", "colorKey", "toAlphabeticChar", "__name", "code", "toAlphabeticName", "name", "x", "toPhash", "h", "i", "toHash", "value", "customizedThemeTokens", "colors", "baseColors", "baseThemeTokens", "darkColorsWithDefaults", "generateColors", "defaultDarkColors", "lightColorsWithDefaults", "hasDefaultDarkColors", "hasDefaultLightColors", "light", "dark", "tokens", "THEME_CLASS_NAME_PREFIX", "toHash", "__name", "joinList", "list", "divider", "element", "key", "React", "output", "item", "index", "useTheme", "props", "colors", "fontFamily", "DEFAULT_FONT_FAMILY", "borderRadius", "DEFAULT_PRIMARY_RADIUS", "secondaryBorderRadius", "DEFAULT_SECONDARY_RADIUS", "mode", "OSTheme", "setOSTheme", "useState", "setTheme", "theme", "useAppStore", "dark", "light", "customizedThemeTokens", "baseTheme", "createTheme", "lightThemeClasses", "defaultLightTheme", "darkThemeClasses", "defaultDarkTheme", "customizedLightTheme", "customizedDarkTheme", "useEffect", "switchThemeListener", "__name", "event", "lightClassNames", "darkClassNames", "getPendingSwaps", "__name", "manager", "result", "q", "id", "storage", "a", "b", "i18n", "Alert", "Button", "React", "ActivateTabAlert", "props", "React", "Alert", "Button", "i18n", "__name", "i18n", "Button", "Divider", "MessageBox", "React", "ActivateTabModal", "props", "open", "onClose", "onConfirm", "React", "WatermarkedModal", "getContainer", "MessageBox", "i18n", "Divider", "Button", "__name", "ChevronLeftIcon", "React", "css", "darkTheme", "IconButton", "styled", "HeaderButton", "ConnectedIcon", "SuffixContainer", "NotificationsBadgeContainer", "ProgressIcon", "InProgressTransactionBadgeContainer", "rowStyles", "WalletImageContainer", "BackButton", "props", "React", "HeaderButton", "ChevronLeftIcon", "__name", "i18n", "Button", "Typography", "React", "CancelButton", "props", "React", "SuffixContainer", "Button", "Typography", "i18n", "__name", "i18n", "Image", "Tooltip", "WalletIcon", "React", "WalletButton", "props", "list", "useWalletList", "connectedWallets", "wallet", "content", "React", "rowStyles", "WalletImageContainer", "Image", "i18n", "Tooltip", "HeaderButton", "ConnectedIcon", "WalletIcon", "__name", "i18n", "NotificationsIcon", "Popover", "SettingsIcon", "Tooltip", "TransactionIcon", "React", "i18n", "EventSeverity", "ChainToken", "ChevronRightIcon", "Divider", "Typography", "React", "useNavigate", "create", "persist", "subscribeWithSelector", "useNotificationStore", "selectors_default", "create", "persist", "subscribeWithSelector", "set", "get", "event", "route", "fromStep", "toStep", "notification", "excludedList", "notificationItem", "requestId", "state", "darkTheme", "ListItemButton", "styled", "Container", "List", "ListItem", "Images", "NotFoundContainer", "i18n", "Divider", "NoNotificationIcon", "Typography", "React", "NotificationNotFound", "React", "NotFoundContainer", "NoNotificationIcon", "Divider", "Typography", "i18n", "__name", "MAX_NOTIFICATIONS_DISPLAYED", "NotificationContent", "navigate", "useNavigate", "getUnreadNotifications", "useNotificationStore", "notifications", "blockchains", "useAppStore", "tokens", "sortedNotification", "a", "b", "handleOnClick", "__name", "requestId", "navigationRoutes", "React", "Container", "List", "notificationItem", "index", "route", "event", "fromToken", "tokenItem", "areTokensEqual", "fromBlockchain", "blockchainItem", "toToken", "toBlockchain", "Divider", "ListItem", "EventSeverity", "Typography", "i18n", "Images", "ChainToken", "ChevronRightIcon", "NotificationNotFound", "useManager", "InProgressIcon", "React", "InProgressTransactionBadge", "__name", "manager", "useManager", "getPendingSwaps", "swap", "React", "InProgressTransactionBadgeContainer", "InProgressIcon", "InProgressTransactionBadge_default", "RefreshProgressButton", "React", "useEffect", "useState", "REFRESH_INTERVAL", "MAX_ELAPSED_TIME", "MAX_PERCENTAGE", "RefreshButton", "onClick", "elapsedTime", "setElapsedTime", "useState", "isRefetched", "setIsRefetched", "handleVisibilityChange", "__name", "interval", "clearTimeout", "useEffect", "prevTime", "handleRefreshClick", "React", "HeaderButton", "ProgressIcon", "RefreshProgressButton", "EventSeverity", "Typography", "React", "UnreadNotificationsBadge", "getUnreadNotifications", "useNotificationStore", "notificationsList", "notificationsCount", "hasSeverNotification", "notificationItem", "EventSeverity", "React", "NotificationsBadgeContainer", "Typography", "__name", "HeaderButtons", "props", "onClickRefresh", "onClickHistory", "onClickSettings", "hidden", "features", "useAppStore", "isNotificationsHidden", "isFeatureHidden", "React", "Tooltip", "getContainer", "i18n", "RefreshButton", "Popover", "NotificationContent", "HeaderButton", "NotificationsIcon", "UnreadNotificationsBadge", "SettingsIcon", "TransactionIcon", "InProgressTransactionBadge_default", "__name", "onScrollContentAttachStatusToContainer", "e", "contentElement", "fromTop", "container", "getContainer", "__name", "css", "styled", "WIDGET_HEIGHT", "LayoutContainer", "Container", "Content", "Footer", "Layout", "props", "connectHeightObserver", "disconnectHeightObserver", "useIframe", "children", "header", "footer", "height", "connectedWallets", "useWalletsStore", "features", "theme", "useAppStore", "watermark", "useUiStore", "hasWatermark", "activeTheme", "useTheme", "isConnectWalletHidden", "isFeatureHidden", "isActiveTab", "tabManagerInitiated", "showActivateTabModal", "setShowActivateTabModal", "activateCurrentTab", "navigateBack", "useNavigateBack", "manager", "useManager", "hasRunningSwap", "getPendingSwaps", "swap", "onActivateTab", "__name", "tabManager", "onConnectWallet", "showBackButton", "scrollViewRef", "useRef", "containerRef", "useEffect", "isAppLoadedIntoIframe", "onScrollContentAttachStatusToContainer", "React", "Container", "WIDGET_UI_ID", "LayoutContainer", "Header", "BackButton", "WalletButton", "getContainer", "CancelButton", "Content", "ActivateTabModal", "Footer", "ActivateTabAlert", "Divider", "BottomLogo", "styled", "CONTENT_PADDING", "ScrollableArea", "styled", "PageContainer", "Divider", "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", "WatermarkedModal", "WIDGET_UI_ID", "ModalContent", "Divider", "__name", "ListContainer", "styled", "Container", "PageContainer", "TIME_TO_CLOSE_MODAL", "TIME_TO_IGNORE_MODAL", "WalletsPage", "config", "fetchMetaStatus", "useAppStore", "openModal", "setOpenModal", "useState", "selectedWalletType", "setSelectedWalletType", "modalTimerId", "isActiveTab", "useUiStore", "list", "handleClick", "error", "disconnectConnectingWallets", "useWalletList", "type", "handleCloseWalletModal", "__name", "selectedWallet", "wallet", "selectedWalletImage", "selectedWalletState", "WalletState", "React", "Layout", "i18n", "Typography", "index", "key", "Wallet", "getContainer", "WalletModal", "keyframes", "styled", "LogoContainer", "SpinAnimation", "Spinner", "WalletImageContainer", "ACCOUNT_ADDRESS_MAX_CHARACTERS", "WalletList", "props", "chain", "isSelected", "selectWallet", "limit", "onShowMore", "config", "useAppStore", "isActiveTab", "useUiStore", "connectedWallets", "useWalletsStore", "blockchains", "openWalletStateModal", "setOpenWalletStateModal", "useState", "experimentalChainWallet", "setExperimentalChainWallet", "showExperimentalChainModal", "setShowExperimentalChainModal", "addingExperimentalChainStatus", "setAddingExperimentalChainStatus", "suggestAndConnect", "useWallets", "modalTimerId", "list", "error", "handleClick", "disconnectConnectingWallets", "useWalletList", "type", "TIME_TO_IGNORE_MODAL", "TIME_TO_CLOSE_MODAL", "sortedList", "setSortedList", "numberOfSupportedWallets", "shouldShowMoreWallets", "addExperimentalChain", "__name", "wallet", "useEffect", "selectedWalletIndex", "_", "index", "sortedItem", "listItem", "modalContainer", "WIDGET_UI_ID", "timeout", "handleCloseWalletModal", "React", "address", "getAddress", "conciseAddress", "getConciseAddress", "experimentalChain", "isExperimentalChain", "experimentalChainNotAdded", "connectedWallet", "couldAddExperimentalChain", "WalletState", "connectedWalletDescription", "i18n", "onClick", "blockchainDisplayName", "getBlockchainDisplayNameFor", "WalletModal", "WatermarkedModal", "MessageBox", "Divider", "Button", "LogoContainer", "WalletImageContainer", "Image", "Spinner", "SelectableWallet", "ShowMoreWallets", "Typography", "NUMBER_OF_WALLETS_TO_DISPLAY", "ConfirmWalletsModal", "props", "open", "onClose", "onCancel", "onCheckBalance", "loading", "config", "useAppStore", "blockchains", "selectedQuote", "selectQuoteWallets", "quoteWalletsConfirmed", "setQuoteWalletConfirmed", "customDestination", "setCustomDestination", "useQuoteStore", "connectedWallets", "selectWallets", "useWalletsStore", "showMoreWalletFor", "setShowMoreWalletFor", "useState", "balanceWarnings", "setBalanceWarnings", "error", "setError", "quoteWarning", "setQuoteWarning", "showCustomDestination", "setShowCustomDestination", "requiredWallets", "getRequiredWallets", "lastStepToBlockchain", "blockchain", "isWalletRequiredFor", "__name", "swap", "getInitialSelectableWallets", "connectedWallet", "selectableWallets", "setSelectableWallets", "lastStepToBlockchainMeta", "chain", "isInsufficientBalanceModalOpen", "isSelected", "walletType", "selectableWallet", "isAddressMatched", "isValidAddress", "resetCustomDestination", "anyWalletSelected", "onChange", "wallet", "onConfirmBalance", "lastSelectedWallets", "onConfirmWallets", "selectedWallets", "result", "warnings", "getQuoteErrorMessage", "useEffect", "modalContainer", "WIDGET_UI_ID", "navigate", "useNavigate", "React", "WatermarkedModal", "ConfirmButton", "Button", "confirmSwapDisabled", "i18n", "ShowMoreHeader", "NavigateBack", "ChevronLeftIcon", "Typography", "getBlockchainShortNameFor", "MessageBox", "BalanceErrors", "WalletsContainer", "walletsListStyles", "WalletList", "Alert", "Divider", "getQuoteUpdateWarningMessage", "Wallets", "requiredWallet", "index", "key", "isLastWallet", "Title", "ListContainer", "CustomDestination", "CustomCollapsible", "checked", "CustomDestinationButton", "WalletIcon", "ExpandedIcon", "ChevronDownIcon", "prev", "StyledTextField", "e", "value", "alarmsStyles", "i18n", "Alert", "Button", "InfoIcon", "React", "Alert", "Button", "Divider", "NoRouteIcon", "RefreshIcon", "Typography", "React", "i18n", "SMALL_NO_ROUTE__ICON_SIZE", "LARGE_NO_ROUTE_ICON_SIZE", "makeInfo", "error", "disabledLiquiditySources", "toggleAllLiquiditySources", "refetchQuote", "errorMessages", "i18n", "__name", "NoRouteIconSize", "NoRouteTitleSize", "styled", "Container", "ErrorDescription", "Footer", "PrefixIcon", "NoResult", "props", "fetch", "error", "size", "disabledLiquiditySources", "useAppStore", "toggleAllLiquiditySources", "swappers", "info", "makeInfo", "React", "Container", "NoRouteIcon", "NoRouteIconSize", "Divider", "Typography", "NoRouteTitleSize", "errorMessages", "ErrorDescription", "Footer", "Alert", "Button", "PrefixIcon", "RefreshIcon", "__name", "i18n", "Button", "Divider", "MessageBox", "Typography", "WarningIcon", "React", "Typography", "React", "darkTheme", "styled", "Alerts", "Flex", "Item", "Action", "QuoteErrorsModalItem", "props", "title", "value", "valueColor", "React", "Item", "Typography", "__name", "HighValueLossWarningModal", "props", "open", "onClose", "onConfirm", "warning", "confirmationDisabled", "type", "highValueLossData", "i18n", "numberToString", "React", "WatermarkedModal", "Button", "WarningIcon", "errorMessages", "getContainer", "MessageBox", "Flex", "Divider", "Typography", "item", "index", "QuoteErrorsModalItem", "__name", "i18n", "makeAlerts", "warning", "error", "alertInfo", "i18n", "getPriceImpactLevel", "errorMessages", "__name", "i18n", "Button", "Divider", "MessageBox", "Typography", "React", "useNavigate", "SlippageWarningModal", "props", "customSlippage", "slippage", "useAppStore", "open", "onClose", "onConfirm", "warning", "confirmationDisabled", "navigate", "useNavigate", "userSlippage", "React", "WatermarkedModal", "Button", "navigationRoutes", "Typography", "i18n", "getContainer", "MessageBox", "Divider", "__name", "Button", "MessageBox", "WarningIcon", "React", "UnknownPriceWarningModal", "props", "open", "onClose", "onConfirm", "confirmationDisabled", "React", "WatermarkedModal", "Button", "WarningIcon", "errorMessages", "getContainer", "MessageBox", "__name", "QuoteWarningsAndErrors", "props", "warning", "error", "showWarningModal", "confirmationDisabled", "refetchQuote", "onOpenWarningModal", "onCloseWarningModal", "onConfirmWarningModal", "onChangeSettings", "warningModalHandlers", "showNoResultMessage", "alertInfo", "makeAlerts", "React", "NoResult", "Alerts", "Alert", "Action", "InfoIcon", "Button", "i18n", "HighValueLossWarningModal", "SlippageWarningModal", "UnknownPriceWarningModal", "__name", "BigNumber", "React", "i18n", "Alert", "Divider", "FullExpandedQuote", "InfoIcon", "QuoteTag", "StepDetails", "TokenAmount", "Tooltip", "Typography", "BigNumber", "React", "useRef", "useState", "styled", "QuoteContainer", "FooterStepAlarm", "FooterAlert", "Collapsible", "Button", "css", "darkTheme", "Image", "styled", "Typography", "EXPANDABLE_QUOTE_TRANSITION_DURATION", "QuoteContainer", "styled", "darkTheme", "stepsDetailsStyles", "css", "AllRoutesButton", "Button", "SummaryContainer", "summaryStyles", "summaryHeaderStyles", "rowStyles", "basicInfoStyles", "Trigger", "Image", "ImageContainer", "Content", "CollapsibleContent", "IconContainer", "Separator", "HorizontalSeparator", "FrameIcon", "BasicInfoOutput", "Typography", "ContainerInfoOutput", "MoreStep", "TagContainer", "Line", "i18n", "ChevronDownIcon", "CloseIcon", "Divider", "IconButton", "QuoteCost", "Tooltip", "Typography", "React", "useState", "css", "styled", "FeeSection", "Line", "ModalContainer", "ModalHeader", "trigger", "NonPayableFee", "__name", "props", "React", "FeeSection", "Typography", "numberToString", "QuoteCostDetails", "open", "setOpen", "useState", "openCollapse", "setOpenCollapse", "steps", "quote", "fee", "time", "feeWarning", "showModalFee", "swaps", "container", "getContainer", "feesGroup", "getFeesGroup", "QuoteCost", "e", "i18n", "WatermarkedModal", "ModalHeader", "IconButton", "CloseIcon", "ModalContainer", "Divider", "payableFeesKey", "feeArray", "index", "key", "usdValue", "getUsdFee", "NAME_OF_FEES", "Tooltip", "formatTooltipNumbers", "Line", "CustomCollapsible", "prev", "trigger", "ExpandedIcon", "ChevronDownIcon", "nonPayableFeesKey", "fees", "totalFeeInUsd", "getTotalFeesInUsd", "label", "i18n", "TokenAmount", "React", "css", "styled", "Container", "separatorStyles", "QuoteSummary", "props", "from", "to", "percentageChange", "warningLevel", "React", "Container", "TokenAmount", "i18n", "getContainer", "separatorStyles", "__name", "i18n", "ChevronDownIcon", "ChevronRightIcon", "Divider", "Image", "Tooltip", "Typography", "React", "useEffect", "useState", "MIN_TABLET_WIDTH", "MIN_NOTEBOOK_WIDTH", "MIN_LARGE_SCREEN_WIDTH", "MIN_EXTRA_LARGE_SCREEN_WIDTH", "useScreenDetect", "__name", "isMobile", "setIsMobile", "useState", "isTablet", "setIsTablet", "isNotebook", "setIsNotebook", "isLargeScreen", "setIsLargeScreen", "isExtraLargeScreen", "setIsExtraLargeScreen", "handleResize", "useEffect", "useScreenDetect_default", "MAX_STEPS", "MAX_BLOCKCHAINS", "ImageComponent", "__name", "props", "tooltipContainer", "getContainer", "content", "src", "className", "open", "state", "React", "Tooltip", "ImageContainer", "Image", "QuoteTrigger", "quoteRef", "selected", "setExpanded", "steps", "expanded", "type", "numberOfSteps", "blockchains", "getUniqueBlockchains", "isTablet", "isMobile", "useScreenDetect_default", "Trigger", "ref", "e", "prevState", "rowStyles", "Typography", "i18n", "Divider", "step", "index", "key", "arrow", "IconContainer", "ChevronRightIcon", "i", "MoreStep", "blockchain", "chain", "ChevronDownIcon", "Quote", "props", "quote", "input", "output", "error", "warning", "type", "selected", "tagHidden", "showModalFee", "onClickAllRoutes", "fullExpandedMode", "blockchains", "useAppStore", "tokens", "swappers", "expanded", "setExpanded", "useState", "quoteRef", "useRef", "roundedInput", "numberToString", "roundedOutput", "roundedOutputUsdValue", "priceImpact", "getPriceImpact", "percentageChange", "priceImpactWarningLevel", "getPriceImpactLevel", "steps", "__name", "swaps", "swap", "index", "stepState", "stepHasError", "stepHasWarning", "alertTitle", "i18n", "getSwapperDisplayName", "getBlockchainShortNameFor", "formatTooltipNumbers", "BigNumber", "React", "FooterStepAlarm", "Alert", "FooterAlert", "Typography", "Divider", "numberOfSteps", "container", "getContainer", "sortedQuoteTags", "sortTags", "showAllRoutesButton", "totalTime", "secondsToString", "totalArrivalTime", "totalFee", "getTotalFeeInUsd", "fee", "feeWarning", "GAS_FEE_MAX", "FullExpandedQuote", "getExpanded", "SummaryContainer", "summaryStyles", "TagContainer", "tag", "key", "QuoteTag", "Line", "summaryHeaderStyles", "QuoteCostDetails", "AllRoutesButton", "e", "basicInfoStyles", "FrameIcon", "InfoIcon", "ContainerInfoOutput", "BasicInfoOutput", "Tooltip", "TokenAmount", "QuoteSummary", "QuoteContainer", "QuoteTrigger", "Content", "HorizontalSeparator", "stepsDetailsStyles", "step", "StepDetails", "Divider", "Skeleton", "React", "darkTheme", "styled", "Container", "Chains", "Steps", "StepSeparator", "ChainToken", "Divider", "Skeleton", "React", "css", "styled", "FlexContent", "BasicSummary", "Output", "OutputTokenInfo", "QuoteSummary", "QuoteSummarySeparator", "TokenAmount", "TokenAmountLabel", "SwapPreview", "RowStyle", "QuoteSummarySkeleton", "props", "type", "tagHidden", "quotePreview", "React", "QuoteSummary", "TokenAmount", "ChainToken", "Divider", "TokenAmountLabel", "Skeleton", "showAllRoutesSkeleton", "FlexContent", "Line", "RowStyle", "BasicSummary", "Output", "OutputTokenInfo", "SwapPreview", "QuoteSummarySeparator", "__name", "ChainToken", "Divider", "NextIcon", "Skeleton", "React", "styled", "StepContent", "StepTokens", "StepTokenInfo", "StepIconContainer", "StepTitle", "StepSkeleton", "props", "separator", "React", "StepTitle", "Skeleton", "Divider", "StepContent", "StepSeparator", "StepTokens", "StepTokenInfo", "ChainToken", "StepIconContainer", "NextIcon", "__name", "QuoteSkeleton", "props", "type", "expanded", "tagHidden", "React", "Container", "QuoteSummarySkeleton", "Chains", "Skeleton", "Steps", "Divider", "StepSkeleton", "__name", "QuoteInfo", "props", "quote", "type", "loading", "error", "warning", "expanded", "tagHidden", "onClick", "showModalFee", "selected", "onClickAllRoutes", "fullExpandedMode", "inputAmount", "inputUsdValue", "toToken", "useQuoteStore", "outputAmount", "BigNumber", "outputUsdValue", "calcOutputUsdValue", "getQuoteToTokenUsdPrice", "showQuote", "React", "QuoteContainer", "QuoteSkeleton", "Quote", "__name", "calculatePendingSwap", "useEffect", "useRef", "useState", "useFetch", "request", "loading", "setLoading", "useState", "abortController", "useRef", "cancelFetch", "__name", "requestBody", "res", "error", "useFetchConfirmQuote", "fetch", "loading", "cancelFetch", "useFetch", "requestBody", "options", "httpService", "__name", "throwErrorIfResponseIsNotValid", "response", "errorMessages", "quoteError", "getQuoteError", "__name", "swaps", "hasLimitError", "swap", "recommendation", "fromAmountRangeError", "getLimitErrorMessage", "recommendedSlippages", "checkSlippageErrors", "minRequiredSlippage", "getMinRequiredSlippage", "generateWarnings", "previousQuote", "currentQuote", "params", "quoteChanged", "isQuoteChanged", "output", "quoteWarning", "generateQuoteWarnings", "isOutputAmountChangedALot", "numberToString", "getQuoteOutputAmount", "getPriceImpact", "isNumberOfSwapsChanged", "isQuoteSwappersUpdated", "isQuoteInternalCoinsUpdated", "balanceWarnings", "generateBalanceWarnings", "handleQuoteErrors", "error", "useConfirmSwap", "fromToken", "toToken", "inputAmount", "setSelectedQuote", "initialQuote", "customDestinationFromStore", "setQuoteWarningsConfirmed", "resetAlerts", "useQuoteStore", "slippage", "customSlippage", "useAppStore", "disabledLiquiditySources", "blockchains", "tokens", "userSlippage", "fetchQuote", "cancelFetch", "loading", "useFetchConfirmQuote", "useEffect", "__name", "params", "selectedWallets", "customDestination", "wallets", "acc", "item", "requestBody", "response", "result", "throwErrorIfResponseIsNotValid", "currentQuote", "swapSettings", "swap", "calculatePendingSwap", "getWalletsForNewSwap", "confirmSwapWarnings", "generateWarnings", "error", "handleQuoteErrors", "Buttons", "styled", "IconButton", "confirmBtnStyles", "css", "iconStyles", "descriptionStyles", "ConfirmSwapPage", "selectedQuote", "setInputAmount", "selectedWallets", "quoteWalletsConfirmed", "setQuoteWalletConfirmed", "customDestination", "quoteWarningsConfirmed", "useQuoteStore", "navigate", "useNavigate", "location", "useLocation", "dbErrorMessage", "setDbErrorMessage", "useState", "connectedWallets", "useWalletsStore", "showWalletsOnInit", "showWallets", "setShowWallets", "isActiveTab", "useUiStore", "disabledLiquiditySources", "useAppStore", "prevDisabledLiquiditySources", "useRef", "manager", "useManager", "confirmSwap", "fetchingConfirmationQuote", "cancelFetch", "useConfirmSwap", "confirmSwapResult", "setConfirmSwapResult", "showQuoteWarningModal", "setShowQuoteWarningModal", "onConfirmSwap", "__name", "result", "addNewSwap", "swap_url", "navigationRoutes", "e", "onConfirm", "onStartConfirmSwap", "onRefresh", "res", "error", "useEffect", "quoteChanged", "QuoteWarningType", "selectedWalletDisconnected", "selectedWallet", "connectedWallet", "quoteWalletsChanged", "requiredWallets", "getRequiredWallets", "lastStepToBlockchain", "swap", "requiredWallet", "flushSync", "useLayoutEffect", "quoteWarning", "quoteError", "alerts", "React", "Alert", "getQuoteUpdateWarningMessage", "settings_url", "QuoteWarningsAndErrors", "Layout", "i18n", "wallets_url", "Tooltip", "getContainer", "HeaderButton", "SettingsIcon", "Button", "WalletIcon", "ConfirmWalletsModal", "PageContainer", "Typography", "RefreshButton", "Divider", "joinList", "alert", "index", "QuoteInfo", "i18n", "useManager", "Divider", "NotFound", "styled", "React", "useState", "useNavigate", "i18n", "Divider", "GroupedVirtualizedList", "Skeleton", "SwapListItem", "Typography", "React", "useCallback", "useEffect", "useRef", "useState", "calculateGroupsSoFar", "totalGroups", "count", "groups", "index", "group", "__name", "css", "darkTheme", "styled", "groupStyles", "SwapItemContainer", "Group", "Time", "SwapList", "NotFoundContainer", "ITEMS_PER_PAGE", "HistoryGroupedList", "props", "list", "onSwapClick", "groupBy", "isLoading", "currentGroupCounts", "setCurrentGroupCounts", "useState", "loadedItems", "useRef", "swaps", "groupCounts", "groups", "calculateGroups", "useCallback", "calculateGroupsSoFar", "loadMore", "remainedItems", "useEffect", "React", "group", "index", "Group", "Time", "Skeleton", "Divider", "SwapList", "_", "SwapListItem", "GroupedVirtualizedList", "Typography", "groupStyles", "groupIndex", "swap", "firstStep", "lastStep", "SwapItemContainer", "getContainer", "i18n", "numberToString", "formatTooltipNumbers", "__name", "CloseIcon", "IconButton", "SearchIcon", "TextField", "React", "styled", "IconWrapper", "SearchInput", "props", "variant", "fullWidth", "color", "size", "onChange", "value", "setValue", "inputAttributes", "React", "TextField", "IconWrapper", "SearchIcon", "IconButton", "CloseIcon", "__name", "i18n", "dayjs", "groupSwapsByDate", "__name", "swaps", "output", "i18n", "addYearsToOutput", "key", "swap", "now", "dayjs", "time", "swapDate", "year", "groupedSwaps", "item", "items", "group", "groupCounts", "groups", "HistoryGroupedListContainer", "styled", "isStepContainsText", "__name", "steps", "value", "step", "containsText", "HistoryPage", "navigate", "useNavigate", "manager", "state", "useManager", "list", "getPendingSwaps", "swap", "searchedFor", "setSearchedFor", "useState", "loading", "searchHandler", "event", "filteredList", "isEmpty", "React", "Layout", "i18n", "PageContainer", "SearchInput", "Divider", "NotFoundContainer", "NotFound", "HistoryGroupedList", "groupSwapsByDate", "i18n", "Button", "Divider", "styled", "WarningIcon", "React", "useEffect", "useState", "useNavigate", "i18n", "Header", "React", "useEffect", "useState", "i18n", "Divider", "FullExpandedQuote", "Typography", "React", "styled", "ErrorsContainer", "StrategyContent", "SelectContainer", "Select", "React", "SelectStrategy", "props", "updateQuotePartialState", "sortStrategy", "useQuoteStore", "React", "SelectContainer", "Select", "ROUTE_STRATEGY", "item", "__name", "ITEM_SKELETON_COUNT", "Quotes", "props", "loading", "onClickOnQuote", "fetch", "showModalFee", "hasSort", "fullExpandedMode", "selectedQuote", "quotes", "updateQuotePartialState", "fromToken", "toToken", "sortStrategy", "error", "useQuoteStore", "slippage", "customSlippage", "useAppStore", "tokens", "hasQuotes", "userSlippage", "getQuoteWarning", "__name", "quote", "mergedQuote", "generateQuoteWarnings", "showNoResultMessage", "sortQuotes", "sortQuotesBy", "React", "_", "index", "FullExpandedQuote", "QuoteSkeleton", "Divider", "StrategyContent", "Typography", "i18n", "SelectStrategy", "getContainer", "quoteWarning", "quoteError", "getQuoteError", "lastIndex", "QuoteInfo", "ErrorsContainer", "NoResult", "darkTheme", "styled", "Container", "Content", "TIME_TO_CLOSE_OPEN_EXPANDED", "ExpandedQuotes", "props", "fetch", "loading", "onClickOnQuote", "onClickRefresh", "isVisible", "isDelayedVisible", "setIsDelayedVisible", "useState", "containerClass", "config", "useAppStore", "fullExpandedMode", "useEffect", "timeout", "React", "Container", "LayoutContainer", "WIDGET_UI_ID", "Header", "i18n", "SelectStrategy", "getExpanded", "HeaderButtons", "Content", "Quotes", "__name", "i18n", "SwapInput", "React", "ReverseIcon", "styled", "React", "SwitchButtonContainer", "styled", "StyledButton", "SwitchFromAndToButton", "switchFromAndTo", "useQuoteStore", "React", "ReverseIcon", "__name", "styled", "Container", "FromContainer", "Inputs", "props", "fetchingQuote", "fetchMetaStatus", "onClickToken", "fromToken", "fromBlockchain", "toToken", "toBlockchain", "setInputAmount", "inputAmount", "inputUsdValue", "outputAmount", "outputUsdValue", "selectedQuote", "useQuoteStore", "connectedWallets", "getBalanceFor", "useWalletsStore", "fromTokenBalance", "fromTokenFormattedBalance", "formatBalance", "tokenBalanceReal", "numberToString", "fetchingBalance", "isFetchingBalance", "priceImpactInputCanNotBeComputed", "canComputePriceImpact", "priceImpactOutputCanNotBeComputed", "percentageChange", "getPriceImpact", "React", "Container", "FromContainer", "SwapInput", "i18n", "formatTooltipNumbers", "errorMessages", "getContainer", "SwitchFromAndToButton", "getPriceImpactLevel", "__name", "useCallback", "useEffect", "useState", "useFetchAllQuotes", "fetch", "loading", "cancelFetch", "useFetch", "requestBody", "options", "httpService", "__name", "DEBOUNCE_DELAY", "useSwapInput", "refetchQuote", "fetchQuote", "cancelFetch", "useFetchAllQuotes", "configExcludeLiquiditySources", "features", "enableCentralizedSwappers", "useAppStore", "connectedWallets", "useWalletsStore", "tokens", "fromToken", "toToken", "inputAmount", "inputUsdValue", "selectedQuote", "sortStrategy", "resetQuote", "error", "warning", "setSelectedQuote", "updateQuotePartialState", "useQuoteStore", "slippage", "customSlippage", "affiliatePercent", "affiliateRef", "affiliateWallets", "fetchStatus", "liquiditySources", "disabledLiquiditySources", "excludeLiquiditySources", "loading", "setLoading", "useState", "userSlippage", "shouldSkipRequest", "areTokensEqual", "isPositiveNumber", "resetState", "__name", "fetch", "params", "requestBody", "createQuoteRequestBody", "isFeatureEnabled", "res", "sortQuotes", "sortQuotesBy", "quote", "getDefaultQuote", "throwErrorIfResponseIsNotValid", "quoteWarning", "generateQuoteWarnings", "quoteError", "handleQuoteErrors", "debouncedFetch", "useCallback", "debounce", "DEBOUNCE_DELAY", "useEffect", "MainContainer", "styled", "TIME_TO_NAVIGATE_ANOTHER_PAGE", "Home", "navigate", "useNavigate", "fromToken", "toToken", "inputAmount", "selectedQuote", "refetchQuote", "quoteError", "quoteWarning", "quotes", "setSelectedQuote", "resetQuoteWallets", "setQuoteWarningsConfirmed", "updateQuotePartialState", "useQuoteStore", "isVisibleExpanded", "setIsVisibleExpanded", "useState", "isLargeScreen", "isExtraLargeScreen", "useScreenDetect_default", "fetchQuote", "loading", "useSwapInput", "config", "fetchMetaStatus", "useAppStore", "connectedWallets", "useWalletsStore", "isActiveTab", "useUiStore", "showQuoteWarningModal", "setShowQuoteWarningModal", "swapButtonState", "getSwapButtonState", "isExpandable", "isVariantExpandable", "hasInputs", "isTokensIdentical", "fetchingQuote", "showMessages", "useEffect", "onClickRefresh", "onHandleNavigation", "__name", "route", "onClickOnQuote", "quote", "React", "Layout", "Button", "WarningIcon", "navigationRoutes", "i18n", "HeaderButtons", "PageContainer", "Inputs", "mode", "Divider", "QuoteInfo", "QuoteWarningsAndErrors", "ExpandedQuotes", "i18n", "List", "ListItemButton", "Radio", "RadioRoot", "Typography", "React", "useLanguage", "setLanguage", "language", "config", "useAppStore", "languages", "LANGUAGES", "defaultLanguage", "DEFAULT_LANGUAGE", "__name", "LanguagePage", "activeLanguage", "changeLanguage", "languages", "useLanguage", "languageList", "languageItem", "local", "label", "SVGFlag", "React", "Typography", "Radio", "Layout", "i18n", "PageContainer", "RadioRoot", "List", "ListItemButton", "__name", "i18n", "Button", "Checkbox", "Image", "ListItemButton", "NotFound", "Typography", "React", "useState", "Checkbox", "Skeleton", "React", "styled", "LiquiditySourceList", "LiquiditySourceSuffix", "NotFoundContainer", "ListItem", "styled", "CustomListItem", "ITEM_SKELETON_COUNT", "LoadingLiquiditySourceList", "React", "LiquiditySourceList", "_", "index", "CustomListItem", "Skeleton", "Checkbox", "__name", "LiquiditySourcePage", "sourceType", "fetchStatus", "useAppStore", "swappers", "disabledLiquiditySources", "searchedFor", "setSearchedFor", "useState", "toggleLiquiditySource", "campaignMode", "supportedUniqueSwappersGroups", "getUniqueSwappersGroups", "types", "i18n", "validTypes", "liquiditySources", "uniqueItem", "hasSelectAll", "sourceItem", "toggleAllSources", "__name", "list", "selected", "groupTitle", "logo", "React", "Image", "Checkbox", "Typography", "searchHandler", "event", "value", "filteredList", "containsText", "Layout", "LiquiditySourceSuffix", "Button", "PageContainer", "SearchInput", "LoadingLiquiditySourceList", "NotFoundContainer", "NotFound", "LiquiditySourceList", "otherProps", "ListItemButton", "i18n", "React", "useNavigate", "RoutesPage", "navigate", "useNavigate", "navigateBack", "useNavigateBack", "selectedQuote", "refetchQuote", "setSelectedQuote", "updateQuotePartialState", "quoteError", "useQuoteStore", "fetchQuote", "fetchingQuote", "useSwapInput", "onClickOnQuote", "__name", "quote", "settings_url", "navigationRoutes", "wallets_url", "React", "Layout", "i18n", "HeaderButtons", "PageContainer", "Quotes", "i18n", "Divider", "getCountCategories", "SelectableCategoryList", "React", "useState", "i18n", "Divider", "Image", "ListItemButton", "NotFound", "Typography", "React", "useEffect", "useState", "BlockchainCategories", "TransactionType", "filterByType", "__name", "blockchain", "type", "BlockchainCategories", "TransactionType", "filterBlockchains", "list", "searchedFor", "blockchainType", "containsText", "ImageContainer", "styled", "Container", "styled", "List", "ScrollableArea", "ImageContainer", "ListItem", "Skeleton", "React", "ITEM_SKELETON_COUNT", "LoadingBlockchainList", "React", "List", "e", "ListItem", "Skeleton", "__name", "BlockchainList", "props", "list", "searchedFor", "onChange", "blockchainCategory", "blockchains", "setBlockchains", "useState", "fetchStatus", "useAppStore", "useEffect", "filterBlockchains", "renderList", "__name", "React", "Divider", "NotFound", "i18n", "List", "item", "ListItemButton", "Image", "Typography", "Container", "LoadingBlockchainList", "SelectBlockchainPage", "props", "type", "navigateBack", "useNavigateBack", "searchedFor", "setSearchedFor", "useState", "blockchainCategory", "setBlockchainCategory", "setToBlockchain", "useQuoteStore", "setFromBlockchain", "fetchStatus", "useAppStore", "blockchains", "showCategory", "getCountCategories", "React", "Layout", "i18n", "PageContainer", "SelectableCategoryList", "Divider", "SearchInput", "event", "BlockchainList", "blockchain", "__name", "i18n", "Divider", "React", "useState", "useNavigate", "i18n", "BlockchainsChip", "Divider", "Image", "Skeleton", "Tooltip", "Typography", "React", "useEffect", "MOST_USED_BLOCKCHAINS", "prepare", "blockchains", "preferredBlockchains", "options", "list", "more", "sortByMostUsedBlockchains", "start", "preferredBlockchainsWithoutMainList", "howManyItemsShouldBeCheckedFromMainList", "i", "blockchain", "preferredBlockchain", "generateSortByPreferredBlockchainsFor", "__name", "a", "b", "mostUsed", "MOST_USED_BLOCKCHAINS", "aIndexInMostUsed", "token", "bIndexInMostUsed", "aIsMostUsed", "bIsMostUsed", "aIndexInPreferred", "bIndexInPreferred", "aIsPreferred", "bIsPreferred", "isInVisibleList", "prepareOutput", "item", "usePrepareBlockchainList", "blockchains", "options", "preferredBlockchains", "addPreferredBlockchain", "useAppStore", "useEffect", "output", "prepare", "isInVisibleList", "__name", "styled", "Blockchains", "NUMBER_OF_LOADING", "BlockchainsSection", "props", "blockchains", "type", "blockchain", "onChange", "onMoreClick", "blockchainsList", "usePrepareBlockchainList", "fetchStatus", "useAppStore", "resetToBlockchain", "useQuoteStore", "resetFromBlockchain", "hasMoreItemsInList", "onlyOneItemInList", "showMoreButton", "React", "Divider", "Typography", "i18n", "Blockchains", "e", "Skeleton", "BlockchainsChip", "item", "Tooltip", "getContainer", "Image", "__name", "i18n", "darkTheme", "Divider", "ExternalLinkIcon", "Image", "ListItemButton", "NotFound", "PinIcon", "Skeleton", "Typography", "VirtualizedList", "React", "useEffect", "useState", "Divider", "ListItem", "Skeleton", "React", "css", "darkTheme", "ImageContainer", "styled", "Typography", "tokenNameStyles", "descriptionStyles", "tokenTitleStyles", "tokenAddressStyles", "tokenWithoutNameStyles", "usdValueStyles", "Container", "Title", "List", "Tag", "TagTitle", "BalanceContainer", "End", "Description", "ImageSection", "Pin", "TokenBalance", "LoadingTokenList", "props", "React", "List", "ListItem", "Skeleton", "End", "Divider", "__name", "PAGE_SIZE", "renderDesc", "__name", "props", "address", "name", "url", "token", "customCssForTag", "customCssForTagTitle", "length", "React", "descriptionStyles", "tokenNameStyles", "Title", "tokenTitleStyles", "Typography", "Divider", "Tag", "TagTitle", "tokenAddressStyles", "tokenWithoutNameStyles", "e", "ExternalLinkIcon", "TokenList", "list", "searchedFor", "onChange", "selectedBlockchain", "tokens", "setTokens", "useState", "fetchStatus", "useAppStore", "blockchains", "hasNextPage", "setHasNextPage", "getBalanceFor", "loadingWallet", "useWalletsStore", "isTokenPinned", "loadNextPage", "useEffect", "renderList", "NotFound", "i18n", "VirtualizedList", "index", "tokenBalance", "formatBalance", "blockchain", "lightShade", "generateShade", "isBright", "darkShade", "darkTheme", "ListItemButton", "ImageSection", "Image", "Pin", "PinIcon", "End", "Skeleton", "BalanceContainer", "TokenBalance", "usdValueStyles", "Container", "LoadingTokenList", "List", "SelectSwapItemsPage", "props", "type", "navigate", "useNavigate", "navigateBack", "useNavigateBack", "fromBlockchain", "toBlockchain", "setFromToken", "setToToken", "setFromBlockchain", "setToBlockchain", "useQuoteStore", "getBalanceFor", "useWalletsStore", "searchedFor", "setSearchedFor", "useState", "isTokenPinned", "useAppStore", "selectedBlockchainName", "blockchains", "tokens", "tokensList", "sortTokens", "__name", "token", "updateBlockchain", "blockchain", "updateToken", "types", "i18n", "React", "Layout", "PageContainer", "BlockchainsSection", "navigationRoutes", "Divider", "SearchInput", "event", "TokenList", "tokenBlockchain", "chain", "i18n", "Alert", "Button", "styled", "React", "useInRouterContext", "useSearchParams", "i18n", "Divider", "InfoIcon", "TextField", "Tooltip", "Typography", "React", "Chip", "styled", "TextField", "BaseContainer", "SlippageChipsContainer", "Head", "SlippageTooltipContainer", "SlippageChip", "i18n", "Typography", "React", "SlippageTooltipContent", "React", "SlippageTooltipContainer", "Typography", "i18n", "__name", "Slippage", "slippage", "setSlippage", "customSlippage", "setCustomSlippage", "useAppStore", "React", "BaseContainer", "Head", "Typography", "i18n", "Divider", "Tooltip", "getContainer", "SlippageTooltipContent", "InfoIcon", "SlippageChipsContainer", "SLIPPAGES", "slippageItem", "index", "key", "SlippageChip", "TextField", "event", "value", "parsedValue", "MIN_SLIPPGAE", "MAX_SLIPPAGE", "__name", "i18n", "AutoThemeIcon", "BridgeIcon", "ChevronRightIcon", "DarkModeIcon", "Divider", "DoneIcon", "ExchangeIcon", "InfoIcon", "LanguageIcon", "LightModeIcon", "List", "ListItem", "ListItemButton", "Skeleton", "styled", "Switch", "Tabs", "Tooltip", "Typography", "React", "useNavigate", "ThemeSection", "styled", "themesList", "React", "LightModeIcon", "Typography", "i18n", "DarkModeIcon", "AutoThemeIcon", "getThemeIcon", "__name", "theme", "iconProps", "SettingsLists", "navigate", "useNavigate", "themeConfig", "useAppStore", "setTheme", "fetchStatus", "swappers", "disabledLiquiditySources", "features", "isThemeHidden", "isFeatureHidden", "isLiquidityHidden", "isLanguageHidden", "infiniteApprove", "toggleInfiniteApprove", "supportedUniqueSwappersGroups", "getUniqueSwappersGroups", "bridgeSources", "uniqueItem", "totalBridgeSources", "totalSelectedBridgeSources", "exchangeSources", "totalExchangeSources", "totalSelectedExchangeSources", "handleEndItem", "totalSelected", "total", "Skeleton", "bridgeItem", "Divider", "ChevronRightIcon", "navigationRoutes", "BridgeIcon", "exchangeItem", "ExchangeIcon", "languageItem", "LanguageIcon", "infiniteApprovalItem", "Tooltip", "getContainer", "SlippageTooltipContainer", "InfoIcon", "DoneIcon", "Switch", "themeItem", "ListItem", "Tabs", "item", "settingItems", "List", "ListItemButton", "ResetAction", "styled", "SettingsPage", "isInCampaignMode", "updateCampaignMode", "useAppStore", "campaignMode", "setSearchParams", "useSearchParams", "isRouterInContext", "useInRouterContext", "onClick", "__name", "prev", "React", "Layout", "i18n", "PageContainer", "Alert", "Button", "Slippage", "SettingsLists", "i18n", "cancelSwap", "useManager", "Alert", "React", "useParams", "i18n", "getCurrentBlockchainOfOrNull", "getCurrentStep", "getRelatedWalletOrNull", "Button", "CopyIcon", "Divider", "IconButton", "LinkIcon", "QuoteCost", "StepDetails", "Typography", "useCopyToClipboard", "useWallets", "BigNumber", "PendingSwapNetworkStatus", "React", "useEffect", "useRef", "useState", "useNavigate", "i18n", "daysOfWeek", "i18n", "timeSince", "millisecond", "date", "day", "month", "year", "__name", "getSwapDate", "pendingSwap", "PendingSwapNetworkStatus", "React", "i18n", "Button", "Divider", "MessageBox", "React", "CancelContent", "__name", "onCancel", "onClose", "React", "Divider", "MessageBox", "i18n", "Button", "i18n", "Button", "Divider", "MessageBox", "Typography", "React", "DeleteContent", "__name", "onDelete", "onClose", "React", "Divider", "MessageBox", "i18n", "Button", "Typography", "i18n", "PendingSwapNetworkStatus", "modalNetworkValues", "MessageBox", "Wallet", "useWallets", "React", "styled", "WalletContainer", "WalletStateContent", "__name", "props", "type", "title", "currentStepWallet", "message", "showWalletButton", "walletButtonDisabled", "connect", "getWalletInfo", "state", "useWallets", "walletType", "walletState", "mapStatusToWalletState", "walletInfo", "React", "MessageBox", "WalletContainer", "Wallet", "getContainer", "SwapDetailsModal", "props", "state", "onClose", "onDelete", "onCancel", "currentStepWallet", "message", "walletButtonDisabled", "showWalletStateContent", "PendingSwapNetworkStatus", "React", "WatermarkedModal", "WIDGET_UI_ID", "WalletStateContent", "modalNetworkValues", "DeleteContent", "CancelContent", "__name", "i18n", "Button", "Divider", "MessageBox", "TokenAmount", "Typography", "React", "useNavigate", "SwapDetailsCompleteModal", "props", "open", "onClose", "status", "priceValue", "usdValue", "realUsdValue", "realValue", "token", "chain", "percentageChange", "description", "diagnosisUrl", "navigate", "useNavigate", "React", "WatermarkedModal", "WIDGET_UI_ID", "MessageBox", "i18n", "TokenAmount", "getContainer", "Divider", "Typography", "Button", "__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", "Alert", "Button", "PendingSwapNetworkStatus", "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", "waitingProgress", "React", "Alerts", "explorerUrl", "index", "urls", "key", "lastUrl", "loading", "error", "Fragment", "Alert", "i18n", "IconButton", "LinkIcon", "WarningAlert", "FailedAlert", "__name", "RESET_INTERVAL", "getSteps", "__name", "swap", "blockchains", "swappers", "args", "hasAlreadyProceededToSign", "step", "index", "amountToConvert", "getBlockchainShortNameFor", "numberToString", "getSwapperDisplayName", "internalSwap", "React", "SwapDetailsAlerts", "getStepState", "isNetworkStatusInWarningState", "css", "darkTheme", "styled", "Container", "styled", "HeaderDetails", "StepsList", "ScrollableArea", "Alerts", "PlaceholderContainer", "LoaderContainer", "rowStyles", "css", "darkTheme", "datePlaceholderStyles", "requestIdStyles", "outputStyles", "titleStepsStyles", "StyledLink", "SwapDetails", "props", "swap", "requestId", "onDelete", "onCancelProps", "canSwitchNetworkTo", "connect", "getWalletInfo", "useWallets", "blockchains", "useAppStore", "swappers", "tokens", "retry", "useQuoteStore", "isActiveTab", "useUiStore", "navigate", "useNavigate", "_", "handleCopy", "useCopyToClipboard", "RESET_INTERVAL", "listRef", "useRef", "modalState", "setModalState", "useState", "showCompletedModal", "setShowCompletedModal", "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", "diagnosisUrl", "step", "outputUsdValue", "numberToString", "inputUsdValue", "realOutputUsdValue", "formatTooltipNumbers", "BigNumber", "realInputUsdValue", "percentageChange", "getPriceImpact", "completeModalDesc", "i18n", "getConciseAddress", "React", "Layout", "SuffixContainer", "Button", "Typography", "PageContainer", "HeaderDetails", "rowStyles", "requestIdStyles", "IconButton", "CopyIcon", "StyledLink", "SCANNER_BASE_URL", "LinkIcon", "outputStyles", "QuoteCost", "secondsToString", "totalArrivalTime", "QuoteSummary", "getPriceImpactLevel", "titleStepsStyles", "Divider", "StepsList", "index", "key", "state", "getStepState", "isFocused", "StepDetails", "getContainer", "SwapDetailsModal", "SwapDetailsCompleteModal", "i18n", "Divider", "NotFound", "Skeleton", "Typography", "React", "i18n", "Divider", "Skeleton", "Typography", "React", "css", "styled", "Container", "StepContainer", "StepSeparator", "quoteSummaryItemStyles", "tokenAmountStyles", "costStyles", "quoteSummaryStyles", "quoteSummarySeparatorStyles", "swapsStepsStyles", "stepTitleStyles", "stepTokensStyles", "stepInfoStyles", "stepIconStyles", "extraInfoStyles", "LoadingSwapDetails", "React", "Container", "QuoteSummarySkeleton", "Typography", "i18n", "StepContainer", "StepSkeleton", "extraInfoStyles", "Divider", "Skeleton", "StepSeparator", "__name", "SwapDetailsPlaceholder", "props", "requestId", "showSkeleton", "React", "Layout", "i18n", "SuffixContainer", "Container", "HeaderDetails", "rowStyles", "Typography", "requestIdStyles", "Skeleton", "Divider", "datePlaceholderStyles", "LoadingSwapDetails", "PlaceholderContainer", "NotFound", "__name", "SwapDetailsPage", "manager", "state", "useManager", "loading", "pendingSwaps", "getPendingSwaps", "requestId", "useParams", "navigateBack", "useNavigateBack", "fetchMetaStatus", "useAppStore", "React", "Alert", "i18n", "showSkeleton", "selectedSwap", "swap", "onCancel", "__name", "cancelSwap", "onDelete", "e", "SwapDetailsPlaceholder", "SwapDetails", "AppRoutes", "useSyncStoresWithConfig", "useSyncUrlAndStore", "useRoutes", "navigationRoutes", "React", "Home", "RoutesPage", "SelectSwapItemsPage", "SelectBlockchainPage", "SettingsPage", "LanguagePage", "LiquiditySourcePage", "HistoryPage", "SwapDetailsPage", "WalletsPage", "ConfirmSwapPage", "__name", "isApprovalTX", "MainEvents", "RouteEventType", "StepEventType", "StepExecutionEventStatus", "useEvents", "useEffect", "WidgetEvents", "tokens", "useAppStore", "connectedWallets", "useWalletsStore", "getWalletsDetails", "setNotification", "useNotificationStore", "widgetEvents", "useEvents", "useEffect", "MainEvents", "widgetEvent", "event", "step", "route", "StepEventType", "StepExecutionEventStatus", "isApprovalTX", "fromAccount", "account", "toAccount", "wallet", "RouteEventType", "__name", "globalCss", "globalFont", "__name", "globalCss", "useFetchApiConfig", "setWatermark", "useUiStore", "__name", "response", "getConfig", "data", "styled", "MainContainer", "Main", "globalFont", "config", "useAppStore", "activeTheme", "useTheme", "activeLanguage", "useLanguage", "lastConnectedWalletWithNetwork", "setLastConnectedWalletWithNetwork", "useState", "disconnectedWallet", "setDisconnectedWallet", "widgetContext", "useContext", "WidgetContext", "fetchApiConfig", "useFetchApiConfig", "useEffect", "useNotificationStore", "React", "I18nManager", "MainContainer", "WidgetEvents", "AppRouter", "AppRoutes", "__name", "React", "useMemo", "checkWaitingForNetworkChange", "makeQueueDefinition", "ManagerProvider", "useWallets", "convertEvmBlockchainMetaToEvmChainInfo", "isEvmBlockchain", "React", "useMemo", "QueueManager", "props", "providers", "getSigners", "state", "connect", "canSwitchNetworkTo", "getWalletInfo", "useWallets", "swapQueueDef", "useMemo", "makeQueueDefinition", "getConfig", "blockchains", "useAppStore", "wallets", "useWalletsStore", "wallet", "switchNetwork", "__name", "network", "isMobileWallet", "walletType", "allBlockchains", "blockchain", "blockchainsObj", "evmBasedChains", "isEvmBlockchain", "getSupportedChainNames", "type", "supportedChains", "walletAndSupportedChainsNames", "allProviders", "context", "convertEvmBlockchainMetaToEvmChainInfo", "isActiveTab", "useUiStore", "React", "ManagerProvider", "manager", "checkWaitingForNetworkChange", "QueueManager_default", "useManager", "React", "createContext", "useContext", "cancelSwap", "getCurrentBlockchainOfOrNull", "getCurrentStep", "getRelatedWalletOrNull", "WidgetHistory", "__name", "manager", "actions", "getPendingSwaps", "swap", "meta", "id", "queue", "cancelSwap", "currentStep", "getCurrentStep", "getRelatedWalletOrNull", "getCurrentBlockchainOfOrNull", "WidgetInfoContext", "createContext", "WidgetInfo", "props", "manager", "useManager", "isActiveTab", "useUiStore", "retrySwap", "useQuoteStore", "history", "WidgetHistory", "details", "useWalletsStore", "isLoading", "totalBalance", "calculateWalletUsdValue", "refetch", "blockchains", "useAppStore", "tokens", "swappers", "loadingStatus", "resetLanguage", "useLanguage", "notifications", "useNotificationStore", "value", "tabManager", "React", "__name", "useWidget", "context", "useContext", "WidgetProvider", "props", "onUpdateState", "config", "useMemo", "initConfig", "RANGO_PUBLIC_API_KEY", "DEFAULT_BASE_URL", "React", "WidgetWallets", "QueueManager_default", "WidgetInfo", "__name", "Widget", "props", "useEffect", "tabManager", "React", "Main", "WidgetProvider", "DEFAULT_CONFIG", "__name"]
|
|
3
|
+
"sources": ["../src/index.ts", "../src/constants/index.ts", "../src/containers/Wallets/Wallets.tsx", "../src/hooks/useWalletProviders.ts", "../src/store/wallets.ts", "../src/services/httpService.ts", "../src/utils/wallets.ts", "../src/constants/numbers.ts", "../src/constants/wallets.ts", "../src/utils/numbers.ts", "../src/utils/configs.ts", "../src/store/selectors.ts", "../src/utils/providers.ts", "../src/store/AppStore.tsx", "../src/store/app.ts", "../src/store/slices/config.ts", "../src/utils/common.ts", "../src/utils/meta.ts", "../src/utils/settings.ts", "../src/store/slices/data.ts", "../src/constants/languages.ts", "../src/constants/swapSettings.ts", "../src/store/slices/settings.ts", "../src/store/ui.ts", "../src/libs/tabManager/tabManager.constants.ts", "../src/libs/tabManager/tabManager.ts", "../src/containers/Widget/Widget.tsx", "../src/containers/App/App.tsx", "../src/components/AppRouter.tsx", "../src/hooks/useForceAutoConnect.ts", "../src/components/AppRoutes.tsx", "../src/constants/navigationRoutes.ts", "../src/hooks/useSyncStoresWithConfig.ts", "../src/store/quote.ts", "../src/utils/quote.ts", "../src/constants/quote.ts", "../src/types/quote.ts", "../src/utils/swap.ts", "../src/components/ConfirmWalletsModal/ConfirmWallets.helpers.ts", "../src/constants/errors.ts", "../src/constants/messages.ts", "../src/hooks/useSyncUrlAndStore/useSyncUrlAndStore.ts", "../src/hooks/useSyncUrlAndStore/useSyncUrlAndStore.helpers.ts", "../src/pages/ConfirmSwapPage.tsx", "../src/components/ConfirmWalletsModal/ConfirmWalletsModal.tsx", "../src/constants/warnings.ts", "../src/components/common/WatermarkedModal/WatermarkedModal.tsx", "../src/components/CustomCollapsible/CustomCollapsible.tsx", "../src/components/CustomCollapsible/CustomCollapsible.styles.ts", "../src/components/ConfirmWalletsModal/ConfirmWallets.styles.ts", "../src/components/ConfirmWalletsModal/WalletList.tsx", "../src/hooks/useWalletList.ts", "../src/pages/WalletsPage.tsx", "../src/components/Layout/Layout.tsx", "../src/hooks/useIframe/useIframe.ts", "../src/hooks/useIframe/useIframe.helpers.ts", "../src/hooks/useNavigateBack.ts", "../src/hooks/useTheme.ts", "../src/utils/ui.ts", "../src/utils/colors.ts", "../src/utils/hash.ts", "../src/utils/queue.ts", "../src/components/common/ActivateTabAlert/ActivateTabAlert.tsx", "../src/components/common/ActivateTabModal/ActivateTabModal.tsx", "../src/components/HeaderButtons/BackButton.tsx", "../src/components/HeaderButtons/HeaderButtons.styles.ts", "../src/components/HeaderButtons/CancelButton.tsx", "../src/components/HeaderButtons/WalletButton.tsx", "../src/components/HeaderButtons/HeaderButtons.tsx", "../src/components/NotificationContent/NotificationContent.tsx", "../src/store/notification.ts", "../src/components/NotificationContent/NotificationContent.styles.ts", "../src/components/NotificationContent/NotificationNotFound.tsx", "../src/components/HeaderButtons/InProgressTransactionBadge.tsx", "../src/components/HeaderButtons/RefreshButton.tsx", "../src/components/HeaderButtons/UnreadNotificationsBadge.tsx", "../src/components/Layout/Layout.helpers.ts", "../src/components/Layout/Layout.styles.ts", "../src/components/Layout/ScrollableArea.tsx", "../src/components/Layout/PageContainer.tsx", "../src/components/WalletModal/WalletModal.tsx", "../src/components/WalletModal/WalletModalContent.tsx", "../src/components/WalletModal/WalletModalContent.styles.ts", "../src/components/ConfirmWalletsModal/WalletList.styles.ts", "../src/components/QuoteWarningsAndErrors/QuoteWarningsAndErrors.tsx", "../src/components/NoResult/NoResult.tsx", "../src/components/NoResult/NoResult.helpers.ts", "../src/components/NoResult/NoResult.styles.ts", "../src/components/QuoteWarningsAndErrors/HighValueLossWarningModal.tsx", "../src/components/QuoteWarningsAndErrors/QuoteErrorsModalItem.tsx", "../src/components/QuoteWarningsAndErrors/QuoteWarningsAndErrors.styles.ts", "../src/components/QuoteWarningsAndErrors/QuoteWarningsAndErrors.helpers.ts", "../src/components/QuoteWarningsAndErrors/SlippageWariningModal.tsx", "../src/components/QuoteWarningsAndErrors/UnknownPriceWarningModal.tsx", "../src/containers/QuoteInfo/QuoteInfo.tsx", "../src/components/Quote/Quote.tsx", "../src/containers/QuoteInfo/QuoteInfo.styles.ts", "../src/components/Quote/Quote.styles.ts", "../src/components/Quote/QuoteCostDetails.tsx", "../src/components/Quote/QuoteCostDetails.styles.ts", "../src/components/Quote/QuoteSummary.tsx", "../src/components/Quote/QuoteSummary.styles.ts", "../src/components/Quote/QuoteTrigger.tsx", "../src/hooks/useScreenDetect.ts", "../src/components/QuoteSkeleton/QuoteSkeleton.tsx", "../src/components/QuoteSkeleton/QuoteSkeleton.styles.ts", "../src/components/QuoteSkeleton/QuoteSummarySkeleton.tsx", "../src/components/QuoteSkeleton/QuoteSummarySkeleton.styles.ts", "../src/components/QuoteSkeleton/StepSkeleton.tsx", "../src/components/QuoteSkeleton/StepSkeleton.styles.ts", "../src/hooks/useConfirmSwap/useConfirmSwap.ts", "../src/hooks/useFetch.ts", "../src/hooks/useFetchConfirmQuote.ts", "../src/hooks/useConfirmSwap/useConfirmSwap.helpers.ts", "../src/pages/HistoryPage.tsx", "../src/components/HistoryGroupedList/HistoryGroupedList.tsx", "../src/components/HistoryGroupedList/HistoryGroupedList.helpers.ts", "../src/components/HistoryGroupedList/HistoryGroupedList.styles.ts", "../src/components/SearchInput/SearchInput.tsx", "../src/components/SearchInput/SearchInput.styles.ts", "../src/utils/date.ts", "../src/pages/Home.tsx", "../src/containers/ExpandedQuotes/ExpandedQuotes.tsx", "../src/components/Quotes/Quotes.tsx", "../src/components/Quotes/Quotes.styles.ts", "../src/components/Quotes/SelectStrategy.tsx", "../src/containers/ExpandedQuotes/ExpandedQuotes.styles.ts", "../src/containers/Inputs/Inputs.tsx", "../src/components/SwitchFromAndTo.tsx", "../src/containers/Inputs/Inputs.styles.ts", "../src/hooks/useSwapInput.ts", "../src/hooks/useFetchAllQuotes.ts", "../src/pages/LanguagePage.tsx", "../src/hooks/useLanguage.ts", "../src/pages/LiquiditySourcePage.tsx", "../src/components/LoadingLiquiditySourceList/LoadingLiquiditySourceList.tsx", "../src/components/SettingsContainer/SettingsContainer.style.ts", "../src/components/LoadingLiquiditySourceList/LoadingLiquiditySourceList.styles.ts", "../src/pages/Routes.tsx", "../src/pages/SelectBlockchainPage.tsx", "../src/components/BlockchainList/BlockchainList.tsx", "../src/components/BlockchainList/BlockchainList.helpers.ts", "../src/components/BlockchainList/BlockchainList.styles.ts", "../src/components/BlockchainList/LoadingBlockchainList.tsx", "../src/pages/SelectSwapItemsPage.tsx", "../src/components/BlockchainsSection/BlockchainsSection.tsx", "../src/hooks/usePrepareBlockchainList/usePrepareBlockchainList.ts", "../src/hooks/usePrepareBlockchainList/usePrepareBlockchainList.constants.ts", "../src/hooks/usePrepareBlockchainList/usePrepareBlockchainList.helpers.ts", "../src/components/BlockchainsSection/BlockchainsSection.styles.ts", "../src/components/TokenList/TokenList.tsx", "../src/components/TokenList/LoadingTokenList.tsx", "../src/components/TokenList/TokenList.styles.ts", "../src/pages/SettingsPage.tsx", "../src/components/Slippage/Slippage.tsx", "../src/components/Slippage/Slippage.styles.ts", "../src/components/Slippage/SlippageTooltipContent.tsx", "../src/containers/Settings/Lists.tsx", "../src/pages/SwapDetailsPage.tsx", "../src/components/SwapDetails/SwapDetails.tsx", "../src/utils/time.ts", "../src/components/SwapDetailsModal/SwapDetailsModal.tsx", "../src/components/SwapDetailsModal/SwapDetailsModal.Cancel.tsx", "../src/components/SwapDetailsModal/SwapDetailsModal.Delete.tsx", "../src/components/SwapDetailsModal/SwapDetailsModal.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/WidgetEvents.tsx", "../src/globalStyles.ts", "../src/hooks/useFetchApiConfig.ts", "../src/containers/App/App.styles.ts", "../src/containers/WidgetProvider/WidgetProvider.tsx", "../src/QueueManager.tsx", "../src/containers/WidgetInfo/WidgetInfo.tsx", "../src/containers/WidgetInfo/WidgetInfo.helpers.ts"],
|
|
4
|
+
"sourcesContent": ["import type { WidgetProps } from './containers/Widget';\nimport type { ConnectedWallet } from './store/wallets';\nimport type {\n BlockchainAndTokenConfig,\n Tokens,\n WidgetColors,\n WidgetColorsKeys,\n WidgetConfig,\n WidgetTheme,\n WidgetVariant,\n} from './types';\nimport type {\n PendingSwapWithQueueID,\n Route,\n RouteEvent,\n RouteExecutionEvents,\n RouteFailedEvent,\n RouteStartedEvent,\n RouteSucceededEvent,\n Step,\n StepApprovalTxSucceededEvent,\n StepCheckStatusEvent,\n StepEvent,\n StepFailedEvent,\n StepOutputRevealedEvent,\n StepStartedEvent,\n StepSucceededEvent,\n StepTxExecutionBlockedEvent,\n StepTxExecutionUpdatedEvent,\n} from '@rango-dev/queue-manager-rango-preset';\nimport type {\n EventHandler as HandleWalletsUpdate,\n ProviderInterface,\n} from '@rango-dev/wallets-react';\nimport type {\n WalletInfo,\n WalletState,\n WalletType,\n} from '@rango-dev/wallets-shared';\nimport type { PendingSwap, PendingSwapStep } from 'rango-types';\n\nimport {\n EventSeverity,\n MainEvents,\n RouteEventType,\n StepEventType,\n StepExecutionBlockedEventStatus,\n StepExecutionEventStatus,\n useEvents as useWidgetEvents,\n} from '@rango-dev/queue-manager-rango-preset';\nimport {\n readAccountAddress,\n useWallets,\n Events as WalletEvents,\n} from '@rango-dev/wallets-react';\nimport { Networks, WalletTypes } from '@rango-dev/wallets-shared';\nimport { PendingSwapNetworkStatus } from 'rango-types';\n\nimport { WIDGET_UI_ID as UI_ID } from './constants';\nimport { WidgetWallets } from './containers/Wallets';\nimport { Widget } from './containers/Widget';\nimport { useWidget } from './containers/WidgetInfo';\nimport { WidgetProvider } from './containers/WidgetProvider';\nimport { customizedThemeTokens } from './utils/ui';\n\nexport type {\n WidgetConfig,\n WalletType,\n WidgetTheme,\n WidgetColors,\n WidgetColorsKeys,\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 ConnectedWallet,\n Tokens,\n WidgetVariant,\n};\nexport {\n Widget,\n /**\n * @deprecated Use `WidgetProvider` instead. This component will be removed in future versions.\n */\n WidgetWallets,\n WidgetProvider,\n useWidget,\n useWallets,\n useWidgetEvents,\n customizedThemeTokens,\n MainEvents,\n RouteEventType,\n StepEventType,\n StepExecutionEventStatus,\n StepExecutionBlockedEventStatus,\n UI_ID,\n};\n\n// Internal type exports for Rango\nexport type {\n WalletState,\n WalletInfo,\n PendingSwap,\n PendingSwapWithQueueID,\n PendingSwapStep,\n RouteExecutionEvents,\n};\n\n// Internal function and enum exports for Rango\nexport {\n readAccountAddress,\n Networks,\n WalletEvents,\n WalletTypes,\n PendingSwapNetworkStatus,\n EventSeverity,\n};\n", "import { UI_ID } from '@rango-dev/ui';\n\nexport const RANGO_PUBLIC_API_KEY = 'c6381a79-2817-4602-83bf-6a641a409e32';\nexport const DEFAULT_BASE_URL = 'https://api.rango.exchange';\nexport const SCANNER_BASE_URL = 'https://scan.rango.exchange';\n\nexport const WIDGET_UI_ID = {\n SWAP_BOX_ID: 'rango-swap-box',\n EXPANDED_BOX_ID: 'rango-expanded-box',\n ...UI_ID,\n};\n", "import type {\n OnConnectHandler,\n PropTypes,\n WidgetContextInterface,\n} from './Wallets.types';\nimport type { ProvidersOptions } from '../../utils/providers';\nimport type { EventHandler } from '@rango-dev/wallets-react';\nimport type { PropsWithChildren } from 'react';\n\nimport { Events, Provider } from '@rango-dev/wallets-react';\nimport { type Network } from '@rango-dev/wallets-shared';\nimport { isEvmBlockchain } from 'rango-sdk';\nimport React, { createContext, useEffect, useRef } from 'react';\n\nimport { useWalletProviders } from '../../hooks/useWalletProviders';\nimport { AppStoreProvider, useAppStore } from '../../store/AppStore';\nimport { useUiStore } from '../../store/ui';\nimport { useWalletsStore } from '../../store/wallets';\nimport {\n prepareAccountsForWalletStore,\n walletAndSupportedChainsNames,\n} from '../../utils/wallets';\n\nexport const WidgetContext = createContext<WidgetContextInterface>({\n onConnectWallet: () => {\n return;\n },\n});\n\nfunction Main(props: PropsWithChildren<PropTypes>) {\n const { updateConfig, updateSettings, fetch: fetchMeta } = useAppStore();\n const blockchains = useAppStore().blockchains();\n const tokens = useAppStore().tokens();\n const walletOptions: ProvidersOptions = {\n walletConnectProjectId: props.config?.walletConnectProjectId,\n };\n const { providers } = useWalletProviders(props.config.wallets, walletOptions);\n const { connectWallet, disconnectWallet } = useWalletsStore();\n const onConnectWalletHandler = useRef<OnConnectHandler>();\n\n useEffect(() => {\n void fetchMeta().catch(console.log);\n }, []);\n\n useEffect(() => {\n if (props.config) {\n updateConfig(props.config);\n updateSettings(props.config);\n }\n }, [props.config]);\n\n const evmBasedChainNames = blockchains\n .filter(isEvmBlockchain)\n .map((chain) => chain.name);\n\n const onUpdateState: EventHandler = (type, event, value, state, meta) => {\n if (event === Events.ACCOUNTS) {\n if (value) {\n const supportedChainNames: Network[] | null =\n walletAndSupportedChainsNames(meta.supportedBlockchains);\n const data = prepareAccountsForWalletStore(\n type,\n value,\n evmBasedChainNames,\n supportedChainNames,\n meta.isContractWallet\n );\n if (data.length) {\n connectWallet(data, tokens);\n }\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, meta);\n }\n };\n const isActiveTab = useUiStore.use.isActiveTab();\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={!!isActiveTab}>\n {props.children}\n </Provider>\n </WidgetContext.Provider>\n );\n}\n\nexport function WidgetWallets(props: PropsWithChildren<PropTypes>) {\n const { config, ...otherProps } = props;\n return (\n <AppStoreProvider config={config}>\n <Main {...otherProps} config={config} />\n </AppStoreProvider>\n );\n}\n", "import type { WidgetConfig } from '../types';\nimport type { ProvidersOptions } from '../utils/providers';\nimport type { ProviderInterface } from '@rango-dev/wallets-react';\n\nimport { useEffect } from 'react';\n\nimport { useWalletsStore } from '../store/wallets';\nimport { matchAndGenerateProviders } 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?.length]);\n\n return {\n providers: generateProviders,\n };\n}\n", "import type { Balance, TokensBalance, Wallet } from '../types';\nimport type { WalletType } from '@rango-dev/wallets-shared';\nimport type { Token } from 'rango-sdk';\n\nimport { create } from 'zustand';\nimport { subscribeWithSelector } from 'zustand/middleware';\n\nimport { httpService } from '../services/httpService';\nimport {\n createTokenHash,\n isAccountAndWalletMatched,\n makeBalanceFor,\n makeTokensBalance,\n resetConnectedWalletState,\n} from '../utils/wallets';\n\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}\ninterface WalletsStore {\n connectedWallets: ConnectedWallet[];\n balances: TokensBalance;\n loading: boolean;\n connectWallet: (accounts: Wallet[], tokens: Token[]) => void;\n disconnectWallet: (walletType: WalletType) => void;\n selectWallets: (wallets: { walletType: string; chain: string }[]) => void;\n clearConnectedWallet: () => void;\n getWalletsDetails: (\n accounts: Wallet[],\n tokens: Token[],\n shouldRetry?: boolean\n ) => void;\n getBalanceFor: (token: Token) => Balance | null;\n}\n\nexport const useWalletsStore = createSelectors(\n create<WalletsStore>()(\n subscribeWithSelector((set, get) => ({\n connectedWallets: [],\n balances: {},\n loading: false,\n connectWallet: (accounts, tokens) => {\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, tokens);\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\n const 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 const balances = makeTokensBalance(connectedWallets);\n\n return {\n balances,\n connectedWallets,\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, tokens, shouldRetry = true) => {\n const getWalletsDetails = get().getWalletsDetails;\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 const 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], tokens, false);\n }\n return matchedAccount && retrievedBalanceAccount\n ? {\n ...connectedWallet,\n explorerUrl: retrievedBalanceAccount.explorerUrl,\n balances: makeBalanceFor(\n retrievedBalanceAccount,\n tokens\n ),\n loading: false,\n }\n : connectedWallet;\n }\n );\n\n const balances = makeTokensBalance(connectedWallets);\n\n return {\n loading: false,\n balances,\n connectedWallets,\n };\n });\n } else {\n throw new Error('Wallet not found');\n }\n } catch (error) {\n set((state) => {\n const connectedWallets = state.connectedWallets.map((balance) => {\n return accounts.find((account) =>\n isAccountAndWalletMatched(account, balance)\n )\n ? resetConnectedWalletState(balance)\n : balance;\n });\n\n const balances = makeTokensBalance(connectedWallets);\n\n return {\n loading: false,\n balances,\n connectedWallets,\n };\n });\n }\n },\n getBalanceFor: (token) => {\n const { balances } = get();\n const tokenHash = createTokenHash(token);\n const balance = balances[tokenHash];\n return balance ?? null;\n },\n }))\n )\n);\n", "import { RangoClient } from 'rango-sdk';\n\nimport { getConfig } from '../utils/configs';\n\nlet rango: RangoClient | undefined = undefined;\n\nexport const httpService = () => {\n if (rango) {\n return rango;\n }\n rango = new RangoClient(getConfig('API_KEY'), getConfig('BASE_URL'));\n return rango;\n};\n", "import type { ConnectedWallet, TokenBalance } from '../store/wallets';\nimport type {\n Balance,\n SelectedQuote,\n TokenHash,\n TokensBalance,\n Wallet,\n} from '../types';\nimport type { WalletInfo as ModalWalletInfo } from '@rango-dev/ui';\nimport type {\n Asset,\n Network,\n WalletInfo,\n WalletState,\n WalletType,\n WalletTypes,\n} from '@rango-dev/wallets-shared';\nimport type { BlockchainMeta, Token, WalletDetail } 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 {\n BALANCE_MAX_DECIMALS,\n BALANCE_MIN_DECIMALS,\n USD_VALUE_MAX_DECIMALS,\n USD_VALUE_MIN_DECIMALS,\n} from '../constants/routing';\nimport { EXCLUDED_WALLETS } from '../constants/wallets';\n\nimport { 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 const { supportedChains, isContractWallet } = getWalletInfo(wallet);\n const { installed, network } = getState(wallet);\n const filterContractWallets =\n isContractWallet && (!installed || (!!chain && network !== chain));\n if (filterContractWallets) {\n return false;\n }\n if (chain) {\n return !!supportedChains.find(\n (supportedChain) => supportedChain.name === chain\n );\n }\n return true;\n })\n .map((type) => {\n const { 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 isContractWallet: boolean\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 if (isContractWallet) {\n /*\n * for contract wallets like Safe wallet, we should add only account for the\n * current connected blockchain not all of the supported blockchains\n */\n addAccount(network, address.toLowerCase());\n } else {\n /*\n * all evm chains are not supported in wallets, so we are adding\n * only to those that are supported by wallet.\n */\n const evmChainsSupportedByWallet = supportedBlockchains.filter(\n (chain) => evmBasedChains.includes(chain)\n );\n\n evmChainsSupportedByWallet.forEach((network) => {\n /*\n * EVM addresses are not case sensitive.\n * Some wallets like Binance-chain return some letters in uppercase which produces bugs in our wallet state.\n */\n addAccount(network, address.toLowerCase());\n });\n }\n } else {\n addAccount(network, address);\n }\n });\n\n return result;\n}\n\nexport function getRequiredChains(quote: SelectedQuote | null) {\n const wallets: string[] = [];\n\n quote?.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 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 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 formatBalance(balance: Balance | null): Balance | null {\n const formattedBalance: Balance | null = balance\n ? {\n ...balance,\n amount: numberToString(\n balance.amount,\n BALANCE_MIN_DECIMALS,\n BALANCE_MAX_DECIMALS\n ),\n usdValue: numberToString(\n balance.usdValue,\n USD_VALUE_MIN_DECIMALS,\n USD_VALUE_MAX_DECIMALS\n ),\n }\n : null;\n\n return formattedBalance;\n}\n\nexport function compareTokenBalance(\n token1Balance: Balance | null,\n token2Balance: Balance | null\n): number {\n if (token1Balance?.usdValue || token2Balance?.usdValue) {\n return (\n parseFloat(token2Balance?.usdValue || '0') -\n parseFloat(token1Balance?.usdValue || '0')\n );\n }\n\n if (token1Balance?.amount || token2Balance?.amount) {\n return (\n parseFloat(token2Balance?.amount || '0') -\n parseFloat(token1Balance?.amount || '0')\n );\n }\n\n return 0;\n}\n\nexport function areTokensEqual(\n tokenA: Pick<Token, 'blockchain' | 'symbol' | 'address'> | null,\n tokenB: Pick<Token, 'blockchain' | 'symbol' | 'address'> | null\n) {\n return (\n tokenA?.blockchain === tokenB?.blockchain &&\n tokenA?.symbol === tokenB?.symbol &&\n tokenA?.address === tokenB?.address\n );\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\nexport function createTokenHash(token: Asset): TokenHash {\n return `${token.blockchain}-${token.symbol}-${token.address ?? ''}`;\n}\n\nexport function makeTokensBalance(connectedWallets: ConnectedWallet[]) {\n return connectedWallets\n .flatMap((wallet) => wallet.balances)\n .reduce((balances: TokensBalance, balance) => {\n const currentBalance = {\n amount: balance?.amount ?? '',\n decimals: balance?.decimal ?? 0,\n usdValue: balance?.usdPrice\n ? new BigNumber(balance?.usdPrice ?? ZERO)\n .multipliedBy(balance?.amount)\n .toString()\n : '',\n };\n\n const tokenHash = balance\n ? createTokenHash({\n symbol: balance.symbol,\n blockchain: balance.chain,\n address: balance.address,\n })\n : null;\n\n const prevBalance = tokenHash ? balances[tokenHash] : null;\n\n const shouldUpdateBalance =\n tokenHash &&\n (!prevBalance ||\n (prevBalance && prevBalance.amount < currentBalance.amount));\n\n if (shouldUpdateBalance) {\n balances[tokenHash] = currentBalance;\n }\n\n return balances;\n }, {});\n}\n\nexport const isFetchingBalance = (\n connectedWallets: ConnectedWallet[],\n blockchain: string\n) =>\n !!connectedWallets.find(\n (wallet) => wallet.chain === blockchain && wallet.loading\n );\n\nexport function hashWalletsState(walletsInfo: ModalWalletInfo[]) {\n return walletsInfo.map((w) => w.state).join('-');\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\nimport { TOOLTIP_DECIMALS } from '../constants/routing';\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 | number | null | undefined,\n minDecimals: number | null = null,\n maxDecimals: number | null = null\n): string => {\n if (number === null || number === undefined) {\n return '';\n }\n if (number === '') {\n return '';\n }\n const n = new BigNumber(number);\n const roundingMode = 1;\n let maxI = 1000;\n for (let i = 0; i < 60; i++) {\n if (new BigNumber(n.toFixed(i, roundingMode)).eq(n)) {\n maxI = i;\n break;\n }\n }\n\n if (n.gte(10000)) {\n return n.toFormat(0, roundingMode);\n }\n if (n.gte(1000)) {\n return n.toFormat(\n Math.min(\n maxI,\n Math.min(maxDecimals || 100, Math.max(minDecimals || 0, 1))\n ),\n roundingMode\n );\n }\n if (n.gte(100)) {\n return n.toFormat(\n Math.min(\n maxI,\n Math.min(maxDecimals || 100, Math.max(minDecimals || 0, 1))\n ),\n roundingMode\n );\n }\n if (n.gte(1)) {\n return n.toFormat(\n Math.min(\n maxI,\n Math.min(maxDecimals || 100, Math.max(minDecimals || 0, 2))\n ),\n roundingMode\n );\n }\n if (n.gte(0.01)) {\n return n.toFormat(\n Math.min(\n maxI,\n Math.min(maxDecimals || 100, Math.max(minDecimals || 0, 4))\n ),\n roundingMode\n );\n }\n for (let i = minDecimals || 4; i < 17; i++) {\n if (n.gte(Math.pow(10, -i))) {\n return n.toFormat(\n Math.min(\n maxI,\n Math.min(maxDecimals || 100, Math.max(minDecimals || 0, i))\n ),\n roundingMode\n );\n }\n }\n if (n.isEqualTo(0)) {\n return '0';\n }\n\n return n.toFormat(\n Math.min(maxI, Math.min(maxDecimals || 100, Math.max(minDecimals || 0, 8))),\n roundingMode\n );\n};\n\nexport const uint8ArrayToHex = (buffer: Uint8Array): string => {\n // buffer is an ArrayBuffer\n // eslint-disable-next-line @typescript-eslint/ban-ts-comment\n // @ts-ignore\n return [...buffer].map((x) => x.toString(16).padStart(2, '0')).join('');\n};\n\nexport const totalArrivalTime = (\n data: { estimatedTimeInSeconds: number | null }[] | undefined\n) => data?.reduce((a, b) => a + (b.estimatedTimeInSeconds ?? 0), 0) || 0;\n\nexport const rawFees = (data: BestRouteResponse): string =>\n (\n data?.result?.swaps?.flatMap((s) =>\n s.fee.map((f) => ({ swapperId: s.swapperId, fee: f }))\n ) || []\n )\n .reduce((partialSum, a) => partialSum + parseFloat(a.fee.amount), 0)\n .toFixed(3);\n\nexport const containsText = (text: string, searchText: string) =>\n text.toLowerCase().indexOf(searchText.toLowerCase()) > -1;\n\nexport const isPositiveNumber = (text?: string) =>\n !!text && parseFloat(text) > 0;\n10;\n\nexport function formatTooltipNumbers(\n number: BigNumber | string | number | null | undefined\n) {\n return numberToString(number, TOOLTIP_DECIMALS, TOOLTIP_DECIMALS).replace(\n /(?:\\.0*|(\\.\\d+?)0*)$/,\n '$1'\n );\n}\n", "import type { Tokens, WidgetVariant } from '../types';\nimport type { Asset, BlockchainMeta, Token } from 'rango-sdk';\n\nimport { RANGO_PUBLIC_API_KEY } from '../constants';\n\nimport { areTokensEqual } from './wallets';\n\nexport interface Configs {\n API_KEY: string;\n BASE_URL?: string;\n}\n\ntype TokensConfig =\n | Asset[]\n | {\n [blockchain: string]: Tokens;\n };\n\nlet configs: Configs = {\n API_KEY: RANGO_PUBLIC_API_KEY,\n};\n\nexport function getConfig(name: keyof Configs) {\n return configs[name] || '';\n}\n\nexport function setConfig(name: keyof Configs, value: any) {\n configs[name] = value;\n\n return value;\n}\n\n/**\n * Getting new configs from params and reset the value of global `configs` with provided param.\n */\nexport function initConfig(nextConfigs: Configs) {\n let clonedConfigs;\n if (typeof structuredClone === 'function') {\n clonedConfigs = structuredClone(nextConfigs);\n } else {\n clonedConfigs = JSON.parse(JSON.stringify(nextConfigs));\n }\n configs = clonedConfigs;\n return configs;\n}\n\nexport const DEFAULT_PRIMARY_RADIUS = 20;\nexport const DEFAULT_SECONDARY_RADIUS = 25;\nexport const DEFAULT_FONT_FAMILY = 'Roboto';\n\nexport const THEME_CLASS_NAME_PREFIX = `theme-widget`;\n\nexport const isTokenExcludedInConfig = (\n token: Token | null,\n tokensConfig?: TokensConfig\n) => {\n let result = false;\n if (tokensConfig && token) {\n if (Array.isArray(tokensConfig)) {\n result = !tokensConfig.some((asset) => areTokensEqual(asset, token));\n } else if (!Array.isArray(tokensConfig) && tokensConfig[token.blockchain]) {\n result = tokensConfig[token.blockchain].tokens.some((asset) =>\n areTokensEqual(asset, token)\n );\n const isExcluded = tokensConfig[token.blockchain].isExcluded;\n return (!isExcluded && !result) || (isExcluded && result);\n }\n }\n return result;\n};\n\nexport const isBlockchainExcludedInConfig = (\n blockchain: BlockchainMeta | null,\n blockchainsConfig?: string[]\n) => {\n return (\n blockchain &&\n blockchainsConfig &&\n !blockchainsConfig.includes(blockchain.name)\n );\n};\n\nexport const isVariantExpandable = (\n isLargeScreen: boolean,\n isExtraLargeScreen: boolean,\n variant?: WidgetVariant\n) => {\n return (\n (variant === 'expanded' && (isLargeScreen || isExtraLargeScreen)) ||\n (variant === 'full-expanded' && isExtraLargeScreen)\n );\n};\n", "import { 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 { WidgetConfig } from '../types';\nimport type { ProviderInterface } from '@rango-dev/wallets-react';\n\nimport { allProviders } from '@rango-dev/provider-all';\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 /*\n * There are two types of provider we get, the first one is only passing the wallet name\n * then we will match the wallet name with our providers (@rango-dev/provider-*).\n * The second way is passing a custom provider which implemented ProviderInterface.\n */\n if (typeof 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 { PropsWithChildren } from 'react';\n\nimport React, { createContext, useContext, useEffect, useRef } from 'react';\n\nimport { createAppStore } from './app';\n\ntype AppStore = ReturnType<typeof createAppStore>;\ntype AppStoreProviderProps = PropsWithChildren<{ config?: WidgetConfig }>;\n\nexport const AppStoreContext = createContext<AppStore | null>(null);\n\nexport function useAppStore() {\n const store = useContext(AppStoreContext);\n\n useEffect(() => {\n if (store && !store.persist.hasHydrated()) {\n void store.persist.rehydrate();\n }\n }, []);\n\n if (!store) {\n throw new Error('Missing AppStoreContext.Provider in the tree');\n }\n\n return store();\n}\n\nexport function AppStoreProvider(props: AppStoreProviderProps) {\n const appStoreRef = useRef<AppStore>();\n\n if (!appStoreRef.current) {\n appStoreRef.current = createAppStore(props.config);\n }\n\n return (\n <AppStoreContext.Provider value={appStoreRef.current}>\n {props.children}\n </AppStoreContext.Provider>\n );\n}\n", "import type { ConfigSlice } from './slices/config';\nimport type { DataSlice } from './slices/data';\nimport type { SettingsSlice } from './slices/settings';\nimport type { WidgetConfig } from '../types';\nimport type { StateCreator } from 'zustand';\n\nimport { create } from 'zustand';\nimport { persist } from 'zustand/middleware';\n\nimport { createConfigSlice } from './slices/config';\nimport { createDataSlice } from './slices/data';\nimport { createSettingsSlice } from './slices/settings';\n\nexport type StateCreatorWithInitialData<\n T extends Partial<WidgetConfig>,\n R extends Partial<AppStoreState>,\n V extends Partial<AppStoreState>\n> = (\n initialData: T | undefined,\n ...rest: Parameters<StateCreator<R, [], [], V>>\n) => ReturnType<StateCreator<R, [], [], V>>;\n\nexport type AppStoreState = DataSlice & ConfigSlice & SettingsSlice;\n\nexport function createAppStore(initialData?: WidgetConfig) {\n return create<AppStoreState>()(\n persist(\n (...a) => ({\n ...createDataSlice(...a),\n ...createSettingsSlice(...a),\n ...createConfigSlice(initialData, ...a),\n }),\n {\n name: 'user-settings',\n skipHydration: true,\n partialize: (state) => {\n return {\n theme: state.theme,\n language: state.language,\n affiliatePercent: state.affiliatePercent,\n affiliateRef: state.affiliateRef,\n affiliateWallets: state.affiliateWallets,\n slippage: state.slippage,\n customSlippage: state.customSlippage,\n infiniteApprove: state.infiniteApprove,\n preferredBlockchains: state.preferredBlockchains,\n disabledLiquiditySources: state.disabledLiquiditySources,\n };\n },\n }\n )\n );\n}\n", "import type { SettingsSlice } from './settings';\nimport type { WidgetConfig } from '../../types';\nimport type { StateCreatorWithInitialData } from '../app';\n\nexport const DEFAULT_CONFIG: WidgetConfig = {\n apiKey: '',\n title: undefined,\n multiWallets: true,\n excludeLiquiditySources: true,\n customDestination: true,\n};\n\ninterface IframeConfigs {\n clientUrl?: string;\n}\n\ninterface CampaignMode {\n liquiditySources?: string[];\n}\n\nconst DEFAULT_IFRAME_CONFIGS: IframeConfigs = {\n clientUrl: undefined,\n};\n\nconst DEFAULT_CAMPAIGN_MODE: CampaignMode = {\n liquiditySources: undefined,\n};\n\nexport interface ConfigSlice {\n // What user can set directly.\n config: WidgetConfig;\n campaignMode: CampaignMode;\n isInCampaignMode: () => boolean;\n getLiquiditySources: () => string[];\n getDisabledLiquiditySources: () => string[];\n excludeLiquiditySources: () => boolean;\n updateConfig: (config: WidgetConfig) => void;\n updateCampaignMode: <K extends keyof CampaignMode>(\n name: K,\n value: CampaignMode[K]\n ) => void;\n // What we are setting based on environments.\n iframe: { clientUrl?: string };\n updateIframe: <K extends keyof IframeConfigs>(\n name: K,\n value: IframeConfigs[K]\n ) => void;\n}\n\nexport const createConfigSlice: StateCreatorWithInitialData<\n WidgetConfig,\n ConfigSlice & SettingsSlice,\n ConfigSlice\n> = (initialData, set, get) => {\n return {\n config: { ...DEFAULT_CONFIG, ...initialData },\n iframe: DEFAULT_IFRAME_CONFIGS,\n campaignMode: DEFAULT_CAMPAIGN_MODE,\n getLiquiditySources: () => {\n const { config, campaignMode } = get();\n return campaignMode.liquiditySources?.length\n ? campaignMode.liquiditySources\n : config.liquiditySources ?? [];\n },\n getDisabledLiquiditySources: () => {\n const { disabledLiquiditySources, campaignMode } = get();\n return campaignMode.liquiditySources?.length\n ? []\n : disabledLiquiditySources;\n },\n excludeLiquiditySources: () => {\n const { config, campaignMode } = get();\n return campaignMode.liquiditySources?.length\n ? false\n : !!config.excludeLiquiditySources;\n },\n isInCampaignMode: () => {\n const { campaignMode } = get();\n return !!campaignMode.liquiditySources?.length;\n },\n\n // Actions\n updateConfig: (nextConfig: WidgetConfig) => {\n const currentConfig = get().config;\n\n set({\n config: {\n ...currentConfig,\n ...nextConfig,\n },\n });\n },\n\n updateCampaignMode: (name, value) => {\n const currentCampaignMode = get().campaignMode;\n\n set({\n campaignMode: {\n ...currentCampaignMode,\n [name]: value,\n },\n });\n },\n\n updateIframe: (name, value) => {\n const currentIframeConfig = get().iframe;\n\n set({\n iframe: {\n ...currentIframeConfig,\n [name]: value,\n },\n });\n },\n };\n};\n", "import type { Token } from 'rango-sdk';\n\nimport { WIDGET_UI_ID } from '../constants';\nimport {\n MIN_LENGTH_SYMBOL_CONTAINS,\n MIN_LENGTH_SYMBOL_START_WITH,\n MIN_LENGTH_TOKEN_ADDRESS_CONTAINS,\n MIN_LENGTH_TOKEN_NAME_CONTAINS,\n MIN_LENGTH_TOKEN_NAME_EXACT_MATCH,\n} from '../constants/searchFor';\n\nexport function removeDuplicateFrom<T>(array: T[]): T[] {\n return Array.from(new Set(array));\n}\n\nexport function areEqual(\n array1: (number | string)[],\n array2: (number | string)[]\n) {\n return (\n array1.length === array2.length && array1.every((v, i) => v === array2[i])\n );\n}\n// 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 function exactText(text: string, searchText: string): boolean {\n return text.toLowerCase() === searchText.toLowerCase();\n}\n\nexport function startWithText(text: string, searchText: string): boolean {\n return text.toLowerCase().startsWith(searchText.toLowerCase());\n}\n\nexport const getContainer = () =>\n document.getElementById(WIDGET_UI_ID.SWAP_BOX_ID) as HTMLElement;\n\nexport const getExpanded = () =>\n document.getElementById(WIDGET_UI_ID.EXPANDED_BOX_ID) as HTMLElement;\n\nfunction compareExactMatchText(\n searchFor: string,\n textA: string | null,\n textB: string | null\n) {\n const exactMatchA = !!textA && exactText(textA, searchFor);\n const exactMatchB = !!textB && exactText(textB, searchFor);\n if (exactMatchA !== exactMatchB) {\n return exactMatchA ? -1 : 1;\n }\n\n return 0;\n}\n\nfunction compareContainsText(\n searchFor: string,\n textA: string | null,\n textB: string | null\n) {\n const textContainsA = !!textA && containsText(textA, searchFor);\n const textContainsB = !!textB && containsText(textB, searchFor);\n if (textContainsA !== textContainsB) {\n return textContainsA ? -1 : 1;\n }\n\n // If both texts contains the searched term, The shorter one has priority\n if (textContainsA && textContainsB && textA?.length !== textB?.length) {\n return textA?.length - textB?.length;\n }\n\n return 0;\n}\n\nfunction compareStartWithText(\n searchFor: string,\n textA: string | null,\n textB: string | null\n) {\n const textStartWithA = !!textA && startWithText(textA, searchFor);\n const textStartWithB = !!textB && startWithText(textB, searchFor);\n if (textStartWithA !== textStartWithB) {\n return textStartWithA ? -1 : 1;\n }\n\n // If both texts start with the searched term, The shorter one has priority\n if (textStartWithA && textStartWithB && textA?.length !== textB?.length) {\n return textA?.length - textB?.length;\n }\n\n return 0;\n}\n\nexport function compareWithSearchFor(\n tokenA: Token,\n tokenB: Token,\n searchFor?: string\n): number {\n if (!searchFor) {\n return 0;\n }\n\n // 1: Check the order to exact match the symbol\n const symbolExactMatchCompare = compareExactMatchText(\n searchFor,\n tokenA.symbol,\n tokenB.symbol\n );\n if (symbolExactMatchCompare) {\n return symbolExactMatchCompare;\n }\n\n // 2: Check the order to exact match the token name\n if (searchFor.length >= MIN_LENGTH_TOKEN_NAME_EXACT_MATCH) {\n const tokenNameExactMatchCompare = compareExactMatchText(\n searchFor,\n tokenA.name,\n tokenB.name\n );\n if (tokenNameExactMatchCompare) {\n return tokenNameExactMatchCompare;\n }\n }\n\n // 3: Check symbol start with searchFor\n if (searchFor.length >= MIN_LENGTH_SYMBOL_START_WITH) {\n const symbolStartWithCompare = compareStartWithText(\n searchFor,\n tokenA.symbol,\n tokenB.symbol\n );\n\n if (symbolStartWithCompare) {\n return symbolStartWithCompare;\n }\n }\n\n // 4: Check symbol Contains searchFor\n if (searchFor.length >= MIN_LENGTH_SYMBOL_CONTAINS) {\n const symbolContainsCompare = compareContainsText(\n searchFor,\n tokenA.symbol,\n tokenB.symbol\n );\n\n if (symbolContainsCompare) {\n return symbolContainsCompare;\n }\n }\n\n // 5: Check token name start with searchFor\n if (searchFor.length >= MIN_LENGTH_TOKEN_NAME_CONTAINS) {\n const tokenNameStartWithCompare = compareStartWithText(\n searchFor,\n tokenA.name,\n tokenB.name\n );\n\n if (tokenNameStartWithCompare) {\n return tokenNameStartWithCompare;\n }\n }\n\n // 6: Check token name Contains searchFor\n if (searchFor.length >= MIN_LENGTH_TOKEN_NAME_CONTAINS) {\n const tokenNameContainsCompare = compareContainsText(\n searchFor,\n tokenA.name,\n tokenB.name\n );\n\n if (tokenNameContainsCompare !== 0) {\n return tokenNameContainsCompare;\n }\n }\n\n // 7: Check address start with searchFor\n if (searchFor.length >= MIN_LENGTH_TOKEN_ADDRESS_CONTAINS) {\n const addressStartWithCompare = compareStartWithText(\n searchFor,\n tokenA.address,\n tokenB.address\n );\n\n if (addressStartWithCompare) {\n return addressStartWithCompare;\n }\n }\n\n // 8: Check address Contains searchFor\n if (searchFor.length >= MIN_LENGTH_TOKEN_ADDRESS_CONTAINS) {\n const addressContainCompare = compareContainsText(\n searchFor,\n tokenA.address,\n tokenB.address\n );\n\n if (addressContainCompare !== 0) {\n return addressContainCompare;\n }\n }\n\n return 0;\n}\n", "import type { Asset, BlockchainMeta, SwapperMeta, Token } from 'rango-sdk';\n\nimport { areTokensEqual } from './wallets';\n\nexport function getBlockchainDisplayNameFor(\n blockchainName: string,\n blockchains: BlockchainMeta[]\n): string | undefined {\n return blockchains.find((blockchain) => blockchain.name === blockchainName)\n ?.displayName;\n}\nexport function getBlockchainShortNameFor(\n blockchainName: string,\n blockchains: BlockchainMeta[]\n): string | undefined {\n return blockchains.find((blockchain) => blockchain.name === blockchainName)\n ?.shortName;\n}\n\nexport function getSwapperDisplayName(\n swapperId: string,\n swappers: SwapperMeta[]\n) {\n return swappers.find((swapper) => swapper.id === swapperId)?.swapperGroup;\n}\n\nexport function findToken(t: Asset, tokens: Token[]) {\n return tokens.find((token) => areTokensEqual(token, t)) ?? null;\n}\n\nexport function findBlockchain(name: string, blockchains: BlockchainMeta[]) {\n return blockchains.find((blockchain) => blockchain.name === name) ?? null;\n}\n\nexport function isTokenNative(\n token: Token,\n blockchain: BlockchainMeta | undefined\n) {\n if (!blockchain || !token) {\n return false;\n }\n\n for (const feeAsset of blockchain.feeAssets) {\n if (\n token?.blockchain === feeAsset?.blockchain &&\n token?.symbol === feeAsset?.symbol &&\n token?.address === feeAsset?.address\n ) {\n return true;\n }\n }\n\n return false;\n}\n", "import type { Features } from '../types';\nimport type { SwapperMeta, SwapperType } from 'rango-sdk';\n\nimport { removeDuplicateFrom } from './common';\n\nexport type UniqueSwappersGroupType = {\n id: string;\n groupTitle: string;\n logo: string;\n type: SwapperType;\n selected: boolean;\n};\n\nexport function getUniqueSwappersGroups(\n swappers: SwapperMeta[],\n disabledLiquiditySources: string[]\n): UniqueSwappersGroupType[] {\n const supportedSwappers = swappers.map((swapper) => swapper.swapperGroup);\n\n const uniqueSupportedSwappersGroups: Array<UniqueSwappersGroupType> = [];\n\n const uniqueGroup = removeDuplicateFrom(swappers.map((s) => s.swapperGroup));\n\n uniqueGroup.map((uniqueGroupItem) => {\n const swapperItem = swappers.find(\n (swapper) => swapper.swapperGroup === uniqueGroupItem\n );\n\n if (swapperItem) {\n let isSupportedSwapper = true;\n if (supportedSwappers) {\n isSupportedSwapper = supportedSwappers.some(\n (supportedItem) => supportedItem === swapperItem.swapperGroup\n );\n }\n\n if (isSupportedSwapper) {\n swapperItem.types.map((swapperTypeItem) => {\n uniqueSupportedSwappersGroups.push({\n id: swapperItem.swapperGroup,\n groupTitle: swapperItem.swapperGroup,\n logo: swapperItem.logo,\n type: swapperTypeItem,\n selected: !disabledLiquiditySources.includes(\n swapperItem.swapperGroup\n ),\n });\n });\n }\n }\n });\n\n return uniqueSupportedSwappersGroups;\n}\n\nexport function sortLiquiditySourcesByGroupTitle(\n a: SwapperMeta,\n b: SwapperMeta\n) {\n if (a.swapperGroup < b.swapperGroup) {\n return -1;\n }\n\n if (a.swapperGroup > b.swapperGroup) {\n return 1;\n }\n\n return 0;\n}\n\nexport function isFeatureHidden(feature: keyof Features, features?: Features) {\n return features?.[feature] === 'hidden';\n}\n\nexport function isFeatureEnabled(feature: keyof Features, features?: Features) {\n return features?.[feature] === 'enabled';\n}\n", "// We keep all the received data from server in this slice\n\nimport type { ConfigSlice } from './config';\nimport type { Balance } from '../../types';\nimport type { BlockchainMeta, SwapperMeta, Token } from 'rango-sdk';\nimport type { StateCreator } from 'zustand';\n\nimport { httpService as sdk } from '../../services/httpService';\nimport { compareWithSearchFor, containsText } from '../../utils/common';\nimport { isTokenExcludedInConfig } from '../../utils/configs';\nimport { isTokenNative } from '../../utils/meta';\nimport { sortLiquiditySourcesByGroupTitle } from '../../utils/settings';\nimport { areTokensEqual, compareTokenBalance } from '../../utils/wallets';\n\ntype BlockchainOptions = {\n type?: 'source' | 'destination';\n};\n\ntype TokenOptions = {\n type: 'source' | 'destination';\n // filter by an specific blockchain\n blockchain?: string;\n searchFor?: string;\n getBalanceFor?: (token: Token) => Balance | null;\n};\n\nexport type FetchStatus = 'loading' | 'success' | 'failed';\nexport interface DataSlice {\n _blockchainsMapByName: Map<string, BlockchainMeta>;\n _tokens: Token[];\n _popularTokens: Token[];\n _swappers: SwapperMeta[];\n fetchStatus: FetchStatus;\n blockchains: (options?: BlockchainOptions) => BlockchainMeta[];\n tokens: (options?: TokenOptions) => Token[];\n swappers: () => SwapperMeta[];\n isTokenPinned: (token: Token, type: 'source' | 'destination') => boolean;\n fetch: () => Promise<void>;\n}\n\nexport const createDataSlice: StateCreator<\n DataSlice & ConfigSlice,\n [],\n [],\n DataSlice\n> = (set, get) => ({\n // State\n _blockchainsMapByName: new Map<string, BlockchainMeta>(),\n _tokens: [],\n _popularTokens: [],\n _swappers: [],\n fetchStatus: 'loading',\n // Selectors\n blockchains: (options) => {\n const blockchainsMapByName = get()._blockchainsMapByName;\n const blockchainsFromState = Array.from(\n blockchainsMapByName?.values() || []\n );\n\n if (!options || !options?.type) {\n return blockchainsFromState;\n }\n\n const config = get().config;\n const supportedBlockchainsFromConfig =\n (options.type === 'source'\n ? config.from?.blockchains\n : config.to?.blockchains) ?? [];\n\n const list = blockchainsFromState.filter((blockchain) => {\n if (\n supportedBlockchainsFromConfig.length > 0 &&\n !supportedBlockchainsFromConfig.includes(blockchain.name)\n ) {\n return false;\n }\n\n return true;\n });\n\n return list;\n },\n tokens: (options) => {\n const tokensFromState = get()._tokens;\n const blockchainsMapByName = get()._blockchainsMapByName;\n\n if (!options || !options?.type) {\n return tokensFromState;\n }\n\n const config = get().config;\n const supportedTokensConfig =\n (options.type === 'source' ? config.from?.tokens : config.to?.tokens) ??\n {};\n const blockchains = get().blockchains({\n type: options.type,\n });\n\n const list = tokensFromState\n .filter((token) => {\n if (\n supportedTokensConfig &&\n isTokenExcludedInConfig(token, supportedTokensConfig)\n ) {\n return false;\n }\n\n // If a specific blockchain has passed, we only keep that blockchain's tokens.\n if (!!options.blockchain && token.blockchain !== options.blockchain) {\n return false;\n }\n\n // Check only available blockchains\n if (\n !blockchains.some((blockchain) => {\n return blockchain.name === token.blockchain;\n })\n ) {\n return false;\n }\n\n // Search functionality\n if (options.searchFor) {\n if (\n containsText(token.symbol, options.searchFor) ||\n containsText(token.address || '', options.searchFor) ||\n containsText(token.name || '', options.searchFor)\n ) {\n return true;\n }\n\n return false;\n }\n\n return true;\n })\n .sort((tokenA, tokenB) => {\n //1. sort by pinned tokens\n const isToken1Pinned = get().isTokenPinned(tokenA, options.type);\n const isToken2Pinned = get().isTokenPinned(tokenB, options.type);\n if (isToken1Pinned !== isToken2Pinned) {\n return isToken1Pinned ? -1 : 1;\n }\n\n //2. sort by balance\n if (options.getBalanceFor) {\n const token1Balance = options.getBalanceFor(tokenA);\n const token2Balance = options.getBalanceFor(tokenB);\n const balanceCompare = compareTokenBalance(\n token1Balance,\n token2Balance\n );\n if (balanceCompare !== 0) {\n return balanceCompare;\n }\n }\n\n //3. sort by token popularity\n if (tokenA.isPopular !== tokenB.isPopular) {\n return tokenA.isPopular ? -1 : 1;\n }\n\n //4. sort by search phrase\n if (options.searchFor) {\n const symbolSearchForCompare = compareWithSearchFor(\n tokenA,\n tokenB,\n options.searchFor\n );\n if (symbolSearchForCompare) {\n return symbolSearchForCompare;\n }\n }\n\n const blockChainA = blockchainsMapByName.get(tokenA.blockchain);\n const blockChainB = blockchainsMapByName.get(tokenB.blockchain);\n\n //5. sort by native token\n const isNativeTokenA = isTokenNative(tokenA, blockChainA);\n const isNativeTokenB = isTokenNative(tokenB, blockChainB);\n if (isNativeTokenA !== isNativeTokenB) {\n return isNativeTokenA ? -1 : 1;\n }\n\n //6. sort by token isSecondary\n if (tokenA.isSecondaryCoin !== tokenB.isSecondaryCoin) {\n return tokenA.isSecondaryCoin ? 1 : -1;\n }\n\n //7. sort by blockchain order\n if (!!blockChainA && !!blockChainB) {\n return blockChainA.sort - blockChainB.sort;\n }\n\n return 0;\n });\n\n return list;\n },\n isTokenPinned: (token, type) => {\n const pinnedTokens =\n type === 'source'\n ? get().config.from?.pinnedTokens\n : get().config.to?.pinnedTokens;\n const pinned = !!pinnedTokens?.some((pinnedToken) =>\n areTokensEqual(pinnedToken, token)\n );\n return pinned;\n },\n swappers: () => {\n const { config, campaignMode } = get();\n\n const campaignModeLiquiditySource = campaignMode.liquiditySources?.length\n ? campaignMode.liquiditySources\n : null;\n\n const liquiditySources =\n campaignModeLiquiditySource ?? config.liquiditySources;\n\n const excludeLiquiditySources = campaignModeLiquiditySource\n ? false\n : config.excludeLiquiditySources;\n\n /*\n * If the excludeLiquiditySources flag is set to true, we return all swappers that are not included in the config.\n * Otherwise, we return all swappers that are included in the config.\n */\n const swappers = get()._swappers.filter((swapper) => {\n const swapperGroupIncludedInLiquiditySources = liquiditySources?.includes(\n swapper.swapperGroup\n );\n\n const shouldExcludeLiquiditySources =\n excludeLiquiditySources ||\n !liquiditySources ||\n liquiditySources.length === 0;\n\n return shouldExcludeLiquiditySources\n ? !swapperGroupIncludedInLiquiditySources\n : swapperGroupIncludedInLiquiditySources;\n });\n\n const sortedSwappers = swappers.sort(sortLiquiditySourcesByGroupTitle);\n\n return sortedSwappers;\n },\n // Actions\n fetch: async () => {\n try {\n const { enableCentralizedSwappers } = get().config;\n const response = await sdk().getAllMetadata({\n enableCentralizedSwappers,\n });\n\n set({ fetchStatus: 'success' });\n const blockchainsMapByName: Map<string, BlockchainMeta> = new Map<\n string,\n BlockchainMeta\n >();\n\n const tokens: Token[] = [];\n const popularTokens: Token[] = response.popularTokens;\n const swappers: SwapperMeta[] = response.swappers;\n\n const blockchainsWithAtLeastOneToken = new Set();\n\n response.tokens.forEach((token) => {\n blockchainsWithAtLeastOneToken.add(token.blockchain);\n\n tokens.push(token);\n });\n\n const sortedBlockchain = response.blockchains.sort(\n (a, b) => a.sort - b.sort\n );\n\n sortedBlockchain.forEach((blockchain) => {\n if (\n blockchain.enabled &&\n blockchainsWithAtLeastOneToken.has(blockchain.name)\n ) {\n blockchainsMapByName.set(blockchain.name, blockchain);\n }\n });\n\n set({\n _blockchainsMapByName: blockchainsMapByName,\n _tokens: tokens,\n _popularTokens: popularTokens,\n _swappers: swappers,\n });\n } catch (error) {\n set({ fetchStatus: 'failed' });\n throw error;\n }\n },\n});\n", "import type { FlagPropTypes, Language } from '@rango-dev/ui';\n\nimport {\n Chinese,\n English,\n Finland,\n French,\n German,\n Greece,\n Italian,\n Japanese,\n Netherlands,\n Poland,\n Portuguese,\n Russian,\n Spanish,\n Swedish,\n Ukrainian,\n} from '@rango-dev/ui';\n\nexport type LanguageItem = {\n title: string;\n label: string;\n local: Language;\n SVGFlag: React.ComponentType<FlagPropTypes>;\n};\n\nexport const LANGUAGES: LanguageItem[] = [\n { title: 'English', label: 'English', local: 'en', SVGFlag: English },\n { title: 'Spanish', label: 'Espa\u00F1ol', local: 'es', SVGFlag: Spanish },\n { title: 'French', label: 'Fran\u00E7ais', local: 'fr', SVGFlag: French },\n { title: 'Japanese', label: '\u65E5\u672C\u8A9E', local: 'ja', SVGFlag: Japanese },\n { title: 'Portuguese', label: 'Portugu\u00EAs', local: 'pt', SVGFlag: Portuguese },\n { title: 'Chinese', label: '\u4E2D\u56FD\u4EBA', local: 'zh', SVGFlag: Chinese },\n { title: 'Russian', label: '\u0420\u0443\u0441\u0441\u043A\u0438\u0439', local: 'ru', SVGFlag: Russian },\n { title: 'German', label: 'Deutsch', local: 'de', SVGFlag: German },\n { title: 'Ukrainian', label: '\u0423\u043A\u0440\u0430\u0457\u043D\u0456', local: 'uk', SVGFlag: Ukrainian },\n { title: 'Swedish', label: 'svenska', local: 'sv', SVGFlag: Swedish },\n { title: 'Finnish', label: 'Suomalainen', local: 'fi', SVGFlag: Finland },\n { title: 'Dutch', label: 'Nederlands', local: 'nl', SVGFlag: Netherlands },\n { title: 'Greek', label: 'Grieks', local: 'el', SVGFlag: Greece },\n { title: 'Italian', label: 'Italiana', local: 'it', SVGFlag: Italian },\n { title: 'Polish', label: 'Polski', local: 'pl', SVGFlag: Poland },\n];\n\nexport const DEFAULT_LANGUAGE = 'en';\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 { ConfigSlice } from './config';\nimport type { WidgetConfig } from '../../types';\nimport type { SwapperMeta } from 'rango-sdk';\nimport type { StateCreator } from 'zustand';\n\nimport { type Language } from '@rango-dev/ui';\n\nimport { BLOCKCHAIN_LIST_SIZE } from '../../constants/configs';\nimport { DEFAULT_LANGUAGE } from '../../constants/languages';\nimport { DEFAULT_SLIPPAGE } from '../../constants/swapSettings';\nimport { removeDuplicateFrom } from '../../utils/common';\nimport { isFeatureHidden } from '../../utils/settings';\n\nexport type ThemeMode = 'auto' | 'dark' | 'light';\n\nexport interface SettingsSlice {\n theme: ThemeMode;\n language: Language | null;\n disabledLiquiditySources: string[];\n /** Keeping a history of blockchains that user has selected (in Swap process) */\n preferredBlockchains: string[];\n slippage: number;\n customSlippage: number | null;\n infiniteApprove: boolean;\n affiliateRef: string | null;\n affiliatePercent: number | null;\n affiliateWallets: { [key: string]: string } | null;\n\n setSlippage: (slippage: number) => void;\n setCustomSlippage: (customSlippage: number | null) => void;\n toggleInfiniteApprove: () => void;\n toggleLiquiditySource: (name: string) => void;\n setTheme: (theme: ThemeMode) => void;\n setLanguage: (language: Language | null) => void;\n toggleAllLiquiditySources: (\n swappers: SwapperMeta[],\n shouldReset?: boolean\n ) => void;\n setAffiliateRef: (affiliateRef: string | null) => void;\n setAffiliatePercent: (affiliatePercent: number | null) => void;\n setAffiliateWallets: (\n affiliateWallets: { [key: string]: string } | null\n ) => void;\n addPreferredBlockchain: (blockchain: string) => void;\n updateSettings: (config: WidgetConfig) => void;\n}\n\nexport const createSettingsSlice: StateCreator<\n SettingsSlice & ConfigSlice,\n [],\n [],\n SettingsSlice\n> = (set, get) => ({\n disabledLiquiditySources: [],\n theme: 'auto',\n language: null,\n preferredBlockchains: [],\n slippage: DEFAULT_SLIPPAGE,\n customSlippage: null,\n infiniteApprove: false,\n affiliateRef: null,\n affiliatePercent: null,\n affiliateWallets: null,\n\n addPreferredBlockchain: (blockchain) => {\n const currentPreferredBlockchains = get().preferredBlockchains;\n\n const noNeedToDoAnything = currentPreferredBlockchains.find(\n (preferredBlockchain, index) => {\n const isSameBlockchain = preferredBlockchain === blockchain;\n const isInVisibleList = index <= BLOCKCHAIN_LIST_SIZE - 1;\n\n return isSameBlockchain && isInVisibleList;\n }\n );\n\n if (noNeedToDoAnything) {\n return;\n }\n\n const nextPreferredBlockchains: string[] =\n currentPreferredBlockchains.filter((preferredBlockchain) => {\n const isSameBlockchain = preferredBlockchain === blockchain;\n\n return !isSameBlockchain;\n });\n\n set(() => ({\n preferredBlockchains: [blockchain, ...nextPreferredBlockchains],\n }));\n },\n setSlippage: (slippage) =>\n set(() => ({\n slippage: slippage,\n })),\n setCustomSlippage: (customSlippage) =>\n set(() => ({\n customSlippage: customSlippage,\n })),\n setAffiliateRef: (affiliateRef) =>\n set(() => ({\n affiliateRef,\n })),\n setAffiliatePercent: (affiliatePercent) =>\n set(() => ({\n affiliatePercent,\n })),\n\n setAffiliateWallets: (affiliateWallets) =>\n set(() => ({\n affiliateWallets,\n })),\n toggleAllLiquiditySources: (swappers, shouldReset) =>\n set((state) => {\n if (shouldReset) {\n return { disabledLiquiditySources: [] };\n }\n const swappersGroup = removeDuplicateFrom(\n swappers.map((swapper) => swapper.swapperGroup)\n );\n\n if (swappersGroup.length === state.disabledLiquiditySources.length) {\n return { disabledLiquiditySources: [] };\n }\n\n return {\n disabledLiquiditySources: swappersGroup,\n };\n }),\n toggleInfiniteApprove: () =>\n set((state) => ({\n infiniteApprove: !state.infiniteApprove,\n })),\n toggleLiquiditySource: (name) =>\n set((state) => {\n if (state.disabledLiquiditySources.includes(name)) {\n return {\n disabledLiquiditySources: state.disabledLiquiditySources.filter(\n (liquiditySource) => liquiditySource != name\n ),\n };\n }\n return {\n disabledLiquiditySources: state.disabledLiquiditySources.concat(name),\n };\n }),\n setTheme: (theme) =>\n set(() => ({\n theme,\n })),\n setLanguage: (language) =>\n set(() => ({\n language,\n })),\n updateSettings: (nextConfig: WidgetConfig) => {\n const { features } = nextConfig;\n\n const isThemeHidden = isFeatureHidden('theme', features);\n const isLanguageHidden = isFeatureHidden('language', features);\n const isLiquidityHidden = isFeatureHidden('liquiditySource', features);\n\n set({\n ...(isThemeHidden && { theme: nextConfig.theme?.mode || 'auto' }),\n ...(isLanguageHidden && {\n language: nextConfig.language || DEFAULT_LANGUAGE,\n }),\n ...(isLiquidityHidden && {\n disabledLiquiditySources: nextConfig.liquiditySources || [],\n }),\n });\n },\n});\n", "import type { Watermark } from '../hooks/useFetchApiConfig';\nimport type { TabManagerInterface } from '../libs/tabManager';\n\nimport { create } from 'zustand';\n\nimport { TabManager } from '../libs/tabManager';\n\nimport createSelectors from './selectors';\n\ninterface UiState {\n isActiveTab: boolean;\n tabManagerInitiated: boolean;\n showActivateTabModal: boolean;\n watermark: Watermark;\n activateCurrentTab: (\n setCurrentTabAsActive: () => void,\n hasRunningSwaps: boolean\n ) => void;\n setShowActivateTabModal: (flag: boolean) => void;\n setWatermark: (watermark: Watermark) => void;\n}\n\nexport const useUiStore = createSelectors(\n create<UiState>()((set, get) => ({\n isActiveTab: false,\n tabManagerInitiated: false,\n showActivateTabModal: false,\n watermark: 'NONE',\n fetchingApiConfig: false,\n activateCurrentTab: (setCurrentTabAsActive, hasRunningSwaps) => {\n const { showActivateTabModal } = get();\n\n if (!showActivateTabModal && hasRunningSwaps) {\n set({ showActivateTabModal: true });\n } else if (showActivateTabModal || !hasRunningSwaps) {\n setCurrentTabAsActive();\n }\n },\n setShowActivateTabModal: (flag) => {\n set({ showActivateTabModal: flag });\n },\n setWatermark: (watermark) => {\n set({ watermark });\n },\n }))\n);\n\nexport const tabManager: TabManagerInterface = new TabManager({\n onInit: () => useUiStore.setState({ tabManagerInitiated: true }),\n onClaim: () =>\n useUiStore.setState({ isActiveTab: true, showActivateTabModal: false }),\n onRelease: () => useUiStore.setState({ isActiveTab: false }),\n});\n", "export const TIMEOUT = 300;\nexport const MAXIMUM_TAB_ID = 100_000;\nexport const CHANNEL_NAME = 'rango-widget';\n", "import type {\n Events,\n ID,\n Message,\n TabManagerInterface,\n} from './tabManager.types';\n\nimport { CHANNEL_NAME, MAXIMUM_TAB_ID, TIMEOUT } from './tabManager.constants';\n\nexport class TabManager implements TabManagerInterface {\n private tabId: ID;\n private state: 'not-initiated' | 'not-claimed' | 'claimed' = 'not-initiated';\n private lastTryClaim: number | undefined;\n private events: Events = {};\n private channel: BroadcastChannel;\n\n constructor(events: Events) {\n this.channel = new BroadcastChannel(CHANNEL_NAME);\n this.tabId = Math.trunc(Math.random() * MAXIMUM_TAB_ID);\n this.events = events;\n }\n\n init = () => {\n this.initEvents();\n void this.tryClaim();\n };\n\n /**\n * This is applicable when a user in an inactive tab seeks to activate that tab.\n */\n forceClaim = () => {\n if (!this.isClaimed()) {\n const message: Message = { name: 'force-claim', candidateId: this.tabId };\n this.channel.postMessage(message);\n setTimeout(() => {\n if (!this.isClaimed()) {\n this.claim();\n }\n }, TIMEOUT);\n }\n };\n\n isClaimed = () => {\n return this.state === 'claimed';\n };\n\n /**\n * remove event listeners\n */\n destroy = () => {\n this.channel.removeEventListener('message', this.handleMessageEvent);\n document.removeEventListener(\n 'visibilitychange',\n this.handleVisibilityChange\n );\n document.removeEventListener('resume', this.handleResume);\n };\n\n /**\n * Reacting to messages and window events to claim.\n */\n private initEvents() {\n this.channel.addEventListener('message', this.handleMessageEvent);\n\n document.addEventListener('visibilitychange', this.handleVisibilityChange);\n\n /**\n * The \"resume\" event is currently supported only in certain browsers.\n * It is triggered when a previously frozen tab is unfrozen and resumes execution.\n * To avoid having multiple active tabs,\n * if the current tab is active after the \"resume\" event,\n * we send a signal to other tabs to verify if any of them currently claim to be active.\n * If this is the case, we deactivate the current tab.\n * https://developer.chrome.com/docs/web-platform/page-lifecycle-api\n */\n document.addEventListener('resume', this.handleResume);\n }\n\n /**\n * Runs after a `ping` message and checks if current tab is claimed the tabs,\n * if yes, it responds with `pong`, If not, it doesn't do anything.\n *\n * Note 1: If we receive a `ping` message,\n * it means a tab is trying to claim tabs directly, usually it's the active tab.\n *\n * Note 2: If multiple tabs are opening at once, all of them are broadcasting `ping`\n * and eventually all of them will `claim` the queue after the TIMEOUT.\n * For avoiding this, we will accepts the oldest broadcasted ping. (`isPingSentBefore`)\n */\n private claimedByCurrentTab(pingAt: number) {\n const isPingSentBefore = this.lastTryClaim && this.lastTryClaim < pingAt;\n\n if (this.isClaimed() || isPingSentBefore) {\n const message: Message = {\n name: 'pong',\n };\n this.channel.postMessage(message);\n return;\n }\n }\n\n private handleMessageEvent = (event: MessageEvent<Message>) => {\n const name = event.data.name;\n\n switch (name) {\n case 'ping':\n this.claimedByCurrentTab(event.data.pingAt);\n break;\n\n case 'pong':\n this.alreadyClaimedByAnotherTab();\n break;\n\n case 'force-claim':\n this.forceRelease(event.data.candidateId);\n break;\n\n case 'force-release':\n if (this.tabId === event.data.candidateId) {\n this.claim();\n }\n break;\n\n default:\n throw new Error(`${name} is not supported.`);\n }\n };\n\n private handleVisibilityChange = async () => {\n if (document.visibilityState === 'visible') {\n await this.tryClaim();\n }\n };\n\n private handleResume = async () => {\n if (this.isClaimed()) {\n await this.tryClaim();\n if (!this.isClaimed()) {\n this.events.onRelease?.();\n }\n }\n };\n /**\n * Runs after receiving `pong` message, which means one of tabs already claimed the tabs.\n */\n private alreadyClaimedByAnotherTab() {\n this.resetLastCheck();\n }\n\n /**\n * Try to send a `ping` message to know if the tabs `claimed` or not.\n * On constructing instance, or whenever page is active we will try.\n */\n private async tryClaim() {\n /**\n * Try to ask from possible other running tabs.\n */\n this.setLastCheck();\n return new Promise<void>((resolve) => {\n setTimeout(() => {\n this.check();\n resolve();\n }, TIMEOUT);\n });\n }\n\n /**\n * If `lastCheck` is exist, it means there is no other tabs which `claimed` the tabs.\n * And we mark the current tab as `claimed`\n */\n private check() {\n if (this.state === 'not-initiated') {\n this.events.onInit?.();\n }\n /**\n *it means we didn't get any response from other tabs, this tab can claim.\n */\n if (this.lastTryClaim) {\n this.claim();\n this.resetLastCheck();\n } else {\n this.state = 'not-claimed';\n }\n }\n\n private claim() {\n this.state = 'claimed';\n this.events.onClaim?.();\n }\n\n /**\n * Setting current time as `lastCheck` and broadcast a `ping` message event.\n */\n private setLastCheck() {\n this.lastTryClaim = Date.now();\n const message: Message = {\n name: 'ping',\n pingAt: this.lastTryClaim,\n };\n this.channel.postMessage(message);\n }\n\n private resetLastCheck() {\n this.lastTryClaim = undefined;\n }\n\n /**\n * Upon receipt of a \"force-claim\" message,\n * the presently active tab is expected to deactivate itself and initiate any attached callback associated with this event.\n */\n private forceRelease(nextActiveTab: ID) {\n if (this.isClaimed()) {\n this.state = 'not-claimed';\n\n this.events.onRelease?.();\n\n const message: Message = {\n name: 'force-release',\n candidateId: nextActiveTab,\n };\n\n this.channel.postMessage(message);\n }\n }\n}\n", "import type { WidgetProps } from './Widget.types';\nimport type { PropsWithChildren } from 'react';\n\nimport React, { useEffect } from 'react';\n\nimport { DEFAULT_CONFIG } from '../../store/slices/config';\nimport { tabManager } from '../../store/ui';\nimport { Main } from '../App';\nimport { WidgetProvider } from '../WidgetProvider';\n\nexport function Widget(props: PropsWithChildren<WidgetProps>) {\n useEffect(() => {\n tabManager.init();\n return tabManager.destroy;\n }, []);\n\n if (!props.config?.externalWallets) {\n return (\n <WidgetProvider config={props.config ?? DEFAULT_CONFIG}>\n <Main />\n </WidgetProvider>\n );\n }\n return <Main />;\n}\n", "import type { WalletType } from '@rango-dev/wallets-shared';\n\nimport { I18nManager } from '@rango-dev/ui';\nimport React, { useContext, useEffect, useState } from 'react';\n\nimport { AppRouter } from '../../components/AppRouter';\nimport { AppRoutes } from '../../components/AppRoutes';\nimport { WidgetEvents } from '../../components/WidgetEvents';\nimport { globalFont } from '../../globalStyles';\nimport { useFetchApiConfig } from '../../hooks/useFetchApiConfig';\nimport { useLanguage } from '../../hooks/useLanguage';\nimport { useTheme } from '../../hooks/useTheme';\nimport { useAppStore } from '../../store/AppStore';\nimport { useNotificationStore } from '../../store/notification';\nimport { WidgetContext } from '../Wallets';\n\nimport { MainContainer } from './App.styles';\n\nexport function Main() {\n globalFont();\n\n const { config } = useAppStore();\n const { activeTheme } = useTheme(config?.theme || {});\n const { activeLanguage } = useLanguage();\n const [lastConnectedWalletWithNetwork, setLastConnectedWalletWithNetwork] =\n useState<string>('');\n const [disconnectedWallet, setDisconnectedWallet] = useState<WalletType>();\n const widgetContext = useContext(WidgetContext);\n const { fetchApiConfig } = useFetchApiConfig();\n useEffect(() => {\n void useNotificationStore.persist.rehydrate();\n widgetContext.onConnectWallet(setLastConnectedWalletWithNetwork);\n void fetchApiConfig().catch(console.log);\n }, []);\n\n return (\n <I18nManager language={activeLanguage}>\n <MainContainer id=\"swap-container\" className={activeTheme()}>\n <WidgetEvents />\n <AppRouter\n lastConnectedWallet={lastConnectedWalletWithNetwork}\n disconnectedWallet={disconnectedWallet}\n clearDisconnectedWallet={() => {\n setDisconnectedWallet(undefined);\n }}>\n <AppRoutes />\n </AppRouter>\n </MainContainer>\n </I18nManager>\n );\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, { Fragment } from 'react';\nimport { MemoryRouter, useInRouterContext } from 'react-router';\n\nimport { useForceAutoConnect } from '../hooks/useForceAutoConnect';\nimport { useAppStore } from '../store/AppStore';\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 ? Fragment : MemoryRouter;\n const blockchains = useAppStore().blockchains();\n const { canSwitchNetworkTo } = useWallets();\n\n useForceAutoConnect();\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 <Router>{children}</Router>;\n}\n", "import { useWallets } from '@rango-dev/wallets-react';\nimport { useEffect, useRef } from 'react';\n\nimport { SearchParams } from '../constants/searchParams';\nimport { useAppStore } from '../store/AppStore';\n\nexport function useForceAutoConnect(): void {\n const { connect, state } = useWallets();\n const initiated = useRef<{ [key: string]: boolean }>({});\n const { fetchStatus } = useAppStore();\n const walletType =\n new URLSearchParams(location.search).get(SearchParams.AUTO_CONNECT) || '';\n const walletState = state(walletType);\n\n useEffect(() => {\n const shouldTryConnect =\n fetchStatus === 'success' &&\n walletType &&\n walletState.installed &&\n !walletState.connecting &&\n !walletState.connected;\n if (shouldTryConnect && !initiated.current[walletType]) {\n initiated.current[walletType] = true;\n void connect(walletType);\n }\n }, [walletState, fetchStatus]);\n}\n", "import React from 'react';\nimport { useRoutes } from 'react-router-dom';\n\nimport { navigationRoutes } from '../constants/navigationRoutes';\nimport { useSyncStoresWithConfig } from '../hooks/useSyncStoresWithConfig';\nimport { useSyncUrlAndStore } from '../hooks/useSyncUrlAndStore';\nimport { 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 { RoutesPage } from '../pages/Routes';\nimport { SelectBlockchainPage } from '../pages/SelectBlockchainPage';\nimport { SelectSwapItemsPage } from '../pages/SelectSwapItemsPage';\nimport { SettingsPage } from '../pages/SettingsPage';\nimport { SwapDetailsPage } from '../pages/SwapDetailsPage';\nimport { WalletsPage } from '../pages/WalletsPage';\n\nexport function AppRoutes() {\n /**\n * The configuration of the widget should initially be applied to the widget state.\n * If search parameters exist in the URL,\n * they should be applied later and take precedence over the widget configuration.\n * To achieve this, it is crucial to execute these hooks in the correct sequence.\n */\n useSyncStoresWithConfig();\n useSyncUrlAndStore();\n\n return useRoutes([\n {\n path: navigationRoutes.home,\n element: <Home />,\n },\n {\n path: navigationRoutes.routes,\n element: <RoutesPage />,\n },\n {\n path: navigationRoutes.fromSwap,\n children: [\n {\n index: true,\n element: <SelectSwapItemsPage type=\"source\" />,\n },\n {\n path: navigationRoutes.blockchains,\n element: <SelectBlockchainPage type=\"source\" />,\n },\n ],\n },\n {\n path: navigationRoutes.toSwap,\n children: [\n {\n index: true,\n element: <SelectSwapItemsPage type=\"destination\" />,\n },\n {\n path: navigationRoutes.blockchains,\n element: <SelectBlockchainPage type=\"destination\" />,\n },\n ],\n },\n {\n path: navigationRoutes.settings,\n children: [\n {\n index: true,\n element: <SettingsPage />,\n },\n {\n path: navigationRoutes.languages,\n element: <LanguagePage />,\n },\n {\n path: navigationRoutes.exchanges,\n element: <LiquiditySourcePage sourceType=\"Exchanges\" />,\n },\n {\n path: navigationRoutes.bridges,\n element: <LiquiditySourcePage sourceType=\"Bridges\" />,\n },\n ],\n },\n {\n path: navigationRoutes.swaps,\n children: [\n {\n index: true,\n element: <HistoryPage />,\n },\n {\n path: navigationRoutes.swapDetails,\n element: <SwapDetailsPage />,\n },\n ],\n },\n {\n path: navigationRoutes.wallets,\n element: <WalletsPage />,\n },\n {\n path: navigationRoutes.confirmSwap,\n element: <ConfirmSwapPage />,\n },\n ]);\n}\n", "export const navigationRoutes = {\n home: '/',\n fromSwap: 'from-swap',\n toSwap: 'to-swap',\n blockchains: 'blockchains',\n settings: 'settings',\n liquiditySources: 'liquidity-sources',\n bridges: 'bridges',\n exchanges: 'exchanges',\n languages: 'languages',\n swaps: 'swaps',\n wallets: 'wallets',\n confirmSwap: 'confirm-swap',\n swapDetails: ':requestId',\n routes: 'routes',\n};\n", "import type { Asset } from 'rango-sdk';\n\nimport { useEffect, useRef } from 'react';\n\nimport { useAppStore } from '../store/AppStore';\nimport { useQuoteStore } from '../store/quote';\nimport {\n isBlockchainExcludedInConfig,\n isTokenExcludedInConfig,\n} from '../utils/configs';\nimport { areTokensEqual } from '../utils/wallets';\n\nexport function useSyncStoresWithConfig() {\n const {\n setInputAmount,\n setToToken,\n setToBlockchain,\n setFromBlockchain,\n setFromToken,\n fromToken,\n toToken,\n fromBlockchain,\n toBlockchain,\n } = useQuoteStore();\n\n const config = useAppStore().config;\n const fetchMetaStatus = useAppStore().fetchStatus;\n const blockchains = useAppStore().blockchains();\n const tokens = useAppStore().tokens();\n\n const { setAffiliateRef, setAffiliatePercent, setAffiliateWallets } =\n useAppStore();\n\n const fromTokensConfig = config?.from?.tokens;\n const fromBlockchainsConfig = config?.from?.blockchains;\n const toTokensConfig = config?.to?.tokens;\n const toBlockchainsConfig = config?.to?.blockchains;\n const prevConfigFromToken = useRef<Asset | undefined>(undefined);\n const prevConfigToToken = useRef<Asset | undefined>(undefined);\n const prevConfigFromBlockchain = useRef<string | undefined>(undefined);\n const prevConfigToBlockchain = useRef<string | undefined>(undefined);\n\n useEffect(() => {\n setInputAmount(config?.amount?.toString() || '');\n }, [config?.amount]);\n\n useEffect(() => {\n if (fetchMetaStatus === 'success') {\n const chain = blockchains.find(\n (chain) => chain.name === config?.from?.blockchain\n );\n const token = tokens.find((t) =>\n areTokensEqual(t, config?.from?.token || null)\n );\n\n if (chain || (!chain && prevConfigFromBlockchain.current)) {\n setFromBlockchain(chain ?? null);\n }\n\n if (token) {\n setFromToken({ token, meta: { blockchains, tokens } });\n } else if (!token && prevConfigFromToken.current) {\n setFromToken({ token: null });\n }\n\n prevConfigFromBlockchain.current = config?.from?.blockchain;\n prevConfigFromToken.current = config?.from?.token;\n }\n }, [\n config?.from?.token?.symbol,\n config?.from?.token?.address,\n config?.from?.token?.blockchain,\n config?.from?.blockchain,\n fetchMetaStatus,\n ]);\n\n useEffect(() => {\n if (isTokenExcludedInConfig(fromToken, fromTokensConfig)) {\n setFromToken({ token: null });\n }\n\n if (isBlockchainExcludedInConfig(fromBlockchain, fromBlockchainsConfig)) {\n setFromBlockchain(null);\n }\n }, [fromTokensConfig, fromBlockchainsConfig]);\n\n useEffect(() => {\n if (isTokenExcludedInConfig(toToken, toTokensConfig)) {\n setFromToken({ token: null });\n }\n if (isBlockchainExcludedInConfig(toBlockchain, toBlockchainsConfig)) {\n setToBlockchain(null);\n }\n }, [toTokensConfig, toBlockchainsConfig]);\n\n useEffect(() => {\n if (fetchMetaStatus === 'success') {\n const chain = blockchains.find(\n (chain) => chain.name === config?.to?.blockchain\n );\n const token = tokens.find((t) =>\n areTokensEqual(t, config?.to?.token || null)\n );\n\n if (chain || (!chain && prevConfigToBlockchain.current)) {\n setToBlockchain(chain ?? null);\n }\n\n if (token) {\n setToToken({ token, meta: { blockchains, tokens } });\n } else if (!token && prevConfigToToken.current) {\n setToToken({ token: null });\n }\n\n prevConfigToBlockchain.current = config?.to?.blockchain;\n prevConfigToToken.current = config?.to?.token;\n }\n }, [\n config?.to?.token?.symbol,\n config?.to?.token?.address,\n config?.to?.token?.blockchain,\n config?.to?.blockchain,\n fetchMetaStatus,\n ]);\n\n useEffect(() => {\n setAffiliateRef(config?.affiliate?.ref ?? null);\n setAffiliatePercent(config?.affiliate?.percent ?? null);\n setAffiliateWallets(config?.affiliate?.wallets ?? null);\n }, [\n config?.affiliate?.ref,\n config?.affiliate?.percent,\n config?.affiliate?.wallets,\n ]);\n}\n", "import type { QuoteError, QuoteWarning, SelectedQuote, Wallet } from '../types';\nimport type {\n BlockchainMeta,\n MetaResponse,\n MultiRouteResponse,\n PreferenceType,\n Token,\n} from 'rango-sdk';\nimport type { PendingSwap } from 'rango-types';\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 { createRetryQuote, getQuoteToTokenUsdPrice } from '../utils/quote';\nimport { calcOutputUsdValue } from '../utils/swap';\n\nimport createSelectors from './selectors';\n\nexport const getUsdValue = (\n token: Token | null,\n amount: string\n): BigNumber | null =>\n token?.usdPrice\n ? new BigNumber(amount || ZERO).multipliedBy(token?.usdPrice || 0)\n : null;\n\nexport type Meta = Pick<MetaResponse, 'blockchains' | 'tokens'>;\n\nexport type SetTokenParams = { token: Token; meta: Meta } | { token: null };\n\ntype SomeQuoteState = {\n quotes: MultiRouteResponse | null;\n sortStrategy: PreferenceType;\n refetchQuote: boolean;\n error: QuoteError | null;\n warning: QuoteWarning | null;\n};\n\nexport interface QuoteState {\n fromBlockchain: BlockchainMeta | null;\n toBlockchain: BlockchainMeta | null;\n inputAmount: string;\n inputUsdValue: BigNumber | null;\n outputAmount: BigNumber | null;\n outputUsdValue: BigNumber | null;\n fromToken: Token | null;\n sortStrategy: PreferenceType;\n toToken: Token | null;\n quoteWalletsConfirmed: boolean;\n selectedWallets: Wallet[];\n quoteWarningsConfirmed: boolean;\n refetchQuote: boolean;\n selectedQuote: SelectedQuote | null;\n quotes: MultiRouteResponse | null;\n customDestination: string | null;\n error: QuoteError | null;\n warning: QuoteWarning | null;\n resetQuote: () => void;\n resetAlerts: () => void;\n\n resetToBlockchain: () => void;\n resetFromBlockchain: () => void;\n setFromBlockchain: (chain: BlockchainMeta | null) => void;\n setToBlockchain: (chian: BlockchainMeta | null) => void;\n setFromToken: (params: SetTokenParams) => void;\n setToToken: (params: SetTokenParams) => void;\n updateQuotePartialState: <K extends keyof SomeQuoteState>(\n key: K,\n value: SomeQuoteState[K]\n ) => void;\n setInputAmount: (amount: string) => void;\n setSelectedQuote: (quote: SelectedQuote | null) => void;\n retry: (pendingSwap: PendingSwap, meta: Meta) => void;\n switchFromAndTo: () => void;\n setQuoteWalletConfirmed: (flag: boolean) => void;\n setSelectedWallets: (wallets: Wallet[]) => void;\n setCustomDestination: (address: string | null) => void;\n resetQuoteWallets: () => void;\n setQuoteWarningsConfirmed: (flag: boolean) => void;\n}\n\nexport const useQuoteStore = createSelectors(\n create<QuoteState>()(\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 refetchQuote: true,\n sortStrategy: 'SMART',\n selectedQuote: null,\n quotes: null,\n error: null,\n warning: null,\n quoteWalletsConfirmed: false,\n selectedWallets: [],\n customDestination: null,\n quoteWarningsConfirmed: false,\n updateQuotePartialState: (key, value) =>\n set((state) => ({\n ...state,\n [key]: value,\n })),\n setSelectedQuote: (quote) =>\n set((state) => {\n let outputAmount: BigNumber | null = null;\n let outputUsdValue: BigNumber = ZERO;\n if (!isPositiveNumber(state.inputAmount)) {\n return {};\n }\n if (!!quote) {\n outputAmount = !!quote?.outputAmount\n ? new BigNumber(quote?.outputAmount)\n : null;\n outputUsdValue = calcOutputUsdValue(\n quote?.outputAmount,\n getQuoteToTokenUsdPrice(quote) || state.toToken?.usdPrice\n );\n }\n return {\n selectedQuote: quote,\n ...(!!quote && {\n outputAmount,\n outputUsdValue,\n }),\n };\n }),\n resetAlerts: () =>\n set(() => ({\n error: null,\n warning: null,\n })),\n resetQuote: () =>\n set(() => ({\n selectedQuote: null,\n outputAmount: null,\n outputUsdValue: new BigNumber(0),\n quotes: null,\n refetchQuote: true,\n error: null,\n warning: null,\n })),\n setFromBlockchain: (chain) => {\n set((state) => {\n if (state.fromBlockchain?.name === chain?.name) {\n return {};\n }\n\n return {\n fromBlockchain: chain,\n ...(state.fromToken && {\n selectedQuote: null,\n fromToken: null,\n outputAmount: null,\n outputUsdValue: null,\n }),\n };\n });\n },\n setFromToken: (params) => {\n return set((state) => ({\n fromToken: params.token,\n ...(params.token && {\n fromBlockchain:\n params.meta.blockchains.find(\n (blockchain) => blockchain.name === params.token.blockchain\n ) ?? null,\n }),\n ...(!!state.inputAmount && {\n inputUsdValue: getUsdValue(params.token, state.inputAmount),\n }),\n }));\n },\n setToBlockchain: (chain) => {\n set((state) => {\n if (state.toBlockchain?.name === chain?.name) {\n return {};\n }\n\n return {\n toBlockchain: chain,\n ...(state.toToken && {\n selectedQuote: null,\n toToken: null,\n outputAmount: null,\n outputUsdValue: null,\n }),\n };\n });\n },\n setToToken: (params) => {\n return set(() => ({\n toToken: params.token,\n ...(params.token && {\n toBlockchain:\n params.meta.blockchains.find(\n (blockchain) => blockchain.name === params.token.blockchain\n ) ?? null,\n }),\n }));\n },\n setInputAmount: (amount) => {\n set((state) => ({\n inputAmount: amount,\n ...(!amount && {\n outputAmount: new BigNumber(0),\n outputUsdValue: new BigNumber(0),\n selectedQuote: null,\n }),\n ...(!!state.fromToken && {\n inputUsdValue: getUsdValue(state.fromToken, amount),\n }),\n }));\n },\n retry: (pendingSwap, meta) => {\n const { tokens, blockchains } = meta;\n const {\n fromBlockchain,\n fromToken,\n toBlockchain,\n toToken,\n inputAmount,\n } = createRetryQuote(pendingSwap, blockchains, tokens);\n set({\n fromBlockchain,\n fromToken,\n inputAmount,\n outputAmount: null,\n inputUsdValue: getUsdValue(fromToken ?? null, inputAmount),\n outputUsdValue: new BigNumber(0),\n toBlockchain,\n toToken,\n selectedQuote: null,\n });\n },\n switchFromAndTo: () =>\n set((state) => ({\n fromBlockchain: state.toBlockchain,\n fromToken: state.toToken,\n toBlockchain: state.fromBlockchain,\n toToken: state.fromToken,\n inputAmount: state.outputAmount?.toString() || '',\n inputUsdValue: getUsdValue(\n state.toToken,\n state.outputAmount?.toString() || ''\n ),\n })),\n resetFromBlockchain: () =>\n set(() => ({\n fromToken: null,\n fromBlockchain: null,\n outputAmount: null,\n outputUsdValue: null,\n selectedQuote: null,\n })),\n resetToBlockchain: () =>\n set(() => ({\n toToken: null,\n toBlockchain: null,\n outputAmount: null,\n outputUsdValue: null,\n selectedQuote: null,\n })),\n setQuoteWalletConfirmed: (flag) =>\n set({\n quoteWalletsConfirmed: flag,\n }),\n setSelectedWallets: (wallets) => set({ selectedWallets: wallets }),\n setCustomDestination: (address) => set({ customDestination: address }),\n resetQuoteWallets: () =>\n set({\n quoteWalletsConfirmed: false,\n selectedWallets: [],\n customDestination: null,\n }),\n setQuoteWarningsConfirmed: (flag) =>\n set({ quoteWarningsConfirmed: flag }),\n }))\n )\n);\n", "/* eslint-disable @typescript-eslint/no-magic-numbers */\nimport type { QuoteWarning, SelectedQuote, Wallet } from '../types';\nimport type {\n PriceImpactWarningLevel,\n SimulationAssetAndAmount,\n SimulationValidationStatus,\n Step,\n} from '@rango-dev/ui';\nimport type {\n Asset,\n BlockchainMeta,\n MultiRouteResponse,\n MultiRouteSimulationResult,\n PreferenceType,\n RouteTag,\n Token,\n} from 'rango-sdk';\nimport type { PendingSwap } from 'rango-types';\n\nimport { getLastSuccessfulStep } from '@rango-dev/queue-manager-rango-preset';\nimport BigNumber from 'bignumber.js';\n\nimport { HIGH_PRIORITY_TAGS } from '../constants/quote';\nimport { HIGHT_PRICE_IMPACT, LOW_PRICE_IMPACT } from '../constants/routing';\nimport { HIGH_SLIPPAGE } from '../constants/swapSettings';\nimport { getUsdValue } from '../store/quote';\nimport { QuoteWarningType } from '../types';\n\nimport { areEqual } from './common';\nimport { findBlockchain, findToken } from './meta';\nimport {\n checkSlippageWarnings,\n getMinRequiredSlippage,\n getPercentageChange,\n getTotalFeeInUsd,\n hasHighValueLoss,\n hasProperSlippage,\n} from './swap';\n\nexport function getQuoteToTokenUsdPrice(\n quote: SelectedQuote | null\n): number | null | undefined {\n const swaps = quote?.swaps || [];\n return swaps[swaps.length - 1].to.usdPrice;\n}\n\nexport function isNumberOfSwapsChanged(\n quoteA: SelectedQuote,\n quoteB: SelectedQuote\n) {\n const quoteASwaps = quoteA?.swaps || [];\n const quoteBSwaps = quoteB?.swaps || [];\n return quoteASwaps.length !== quoteBSwaps.length;\n}\n\nexport function isQuoteSwappersUpdated(\n quoteA: SelectedQuote,\n quoteB: SelectedQuote\n) {\n const quoteASwappers = quoteA?.swaps.map((swap) => swap.swapperId) || [];\n const quoteBSwappers = quoteB?.swaps.map((swap) => swap.swapperId) || [];\n return !areEqual(quoteASwappers, quoteBSwappers);\n}\n\nexport function isQuoteInternalCoinsUpdated(\n quoteA: SelectedQuote,\n quoteB: SelectedQuote\n) {\n const quoteAInternalCoins = quoteA?.swaps.map((swap) => swap.to.symbol) || [];\n const quoteBInternalCoins = quoteB?.swaps.map((swap) => swap.to.symbol) || [];\n return !areEqual(quoteAInternalCoins, quoteBInternalCoins);\n}\n\nexport function isQuoteChanged(\n quoteA: SelectedQuote,\n quoteB: SelectedQuote\n): boolean {\n return (\n isNumberOfSwapsChanged(quoteA, quoteB) ||\n isQuoteSwappersUpdated(quoteA, quoteB) ||\n isQuoteInternalCoinsUpdated(quoteA, quoteB)\n );\n}\n\nexport function outToRatioHasWarning(\n fromUsdValue: BigNumber | null,\n outToInRatio: BigNumber | 0\n) {\n return (\n (parseInt(outToInRatio?.toFixed(2) || '0') <= -10 &&\n (fromUsdValue === null || fromUsdValue.gte(new BigNumber(200)))) ||\n (parseInt(outToInRatio?.toFixed(2) || '0') <= -5 &&\n (fromUsdValue === null || fromUsdValue.gte(new BigNumber(1000))))\n );\n}\n\nexport function getRequiredBalanceOfWallet(\n selectedWallet: Wallet,\n fee: SimulationValidationStatus[] | null\n): SimulationAssetAndAmount[] | null {\n if (fee === null) {\n return null;\n }\n const relatedFeeStatus = fee\n ?.find((item) => item.blockchain === selectedWallet.chain)\n ?.wallets.find(\n (wallet) =>\n wallet.address?.toLowerCase() === selectedWallet.address.toLowerCase()\n );\n if (!relatedFeeStatus) {\n return null;\n }\n return relatedFeeStatus.requiredAssets;\n}\n\nexport function getPriceImpactLevel(\n priceImpact: number\n): PriceImpactWarningLevel {\n let warningLevel: PriceImpactWarningLevel = undefined;\n if (priceImpact <= LOW_PRICE_IMPACT && priceImpact > HIGHT_PRICE_IMPACT) {\n warningLevel = 'low';\n } else if (priceImpact <= HIGHT_PRICE_IMPACT) {\n warningLevel = 'high';\n }\n\n return warningLevel;\n}\n\nexport function findCommonTokens<T extends Asset[], R extends Asset[]>(\n listA: T,\n listB: R\n) {\n const 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\nexport function createRetryQuote(\n pendingSwap: PendingSwap,\n blockchains: BlockchainMeta[],\n tokens: Token[]\n): {\n fromBlockchain: BlockchainMeta | null;\n fromToken: Token | null;\n toBlockchain: BlockchainMeta | null;\n toToken: Token | null;\n inputAmount: string;\n} {\n const firstStep = pendingSwap.steps[0];\n const lastStep = pendingSwap.steps[pendingSwap.steps.length - 1];\n const lastSuccessfulStep = getLastSuccessfulStep(pendingSwap.steps);\n\n const toToken = {\n blockchain: lastStep.toBlockchain,\n symbol: lastStep.toSymbol,\n address: lastStep.toSymbolAddress,\n };\n\n const fromBlockchainMeta = findBlockchain(\n lastSuccessfulStep\n ? lastSuccessfulStep.toBlockchain\n : firstStep.fromBlockchain,\n blockchains\n );\n const toBlockchainMeta = findBlockchain(lastStep.toBlockchain, blockchains);\n const fromTokenMeta = findToken(\n lastSuccessfulStep\n ? {\n blockchain: fromBlockchainMeta?.name ?? '',\n symbol: lastSuccessfulStep.toSymbol,\n address: lastSuccessfulStep.toSymbolAddress,\n }\n : {\n blockchain: fromBlockchainMeta?.name ?? '',\n symbol: firstStep.fromSymbol,\n address: firstStep.fromSymbolAddress,\n },\n tokens\n );\n const toTokenMeta = findToken(toToken, tokens);\n const inputAmount = lastSuccessfulStep\n ? lastSuccessfulStep.outputAmount ?? ''\n : pendingSwap.inputAmount;\n\n return {\n fromBlockchain: fromBlockchainMeta,\n fromToken: fromTokenMeta,\n toBlockchain: toBlockchainMeta,\n toToken: toTokenMeta,\n inputAmount,\n };\n}\n\nexport function generateQuoteWarnings(\n quote: SelectedQuote,\n params: {\n fromToken: Token;\n toToken: Token;\n tokens: Token[];\n userSlippage: number;\n }\n): QuoteWarning | null {\n const { fromToken, toToken, tokens, userSlippage } = params;\n const inputUsdValue = getUsdValue(fromToken, quote.requestAmount);\n const outputUsdValue = getUsdValue(toToken, quote?.outputAmount ?? '');\n\n if (!!quote && inputUsdValue && outputUsdValue) {\n const priceImpact = getPriceImpact(\n inputUsdValue.toString(),\n outputUsdValue.toString()\n );\n const highValueLoss =\n !!priceImpact && hasHighValueLoss(inputUsdValue, priceImpact);\n\n if (highValueLoss) {\n const totalFee = getTotalFeeInUsd(quote?.swaps, tokens);\n const warningLevel = getPriceImpactLevel(priceImpact);\n return {\n type: QuoteWarningType.HIGH_VALUE_LOSS,\n inputUsdValue,\n outputUsdValue,\n priceImpact,\n totalFee,\n warningLevel,\n };\n }\n } else if (quote && (!inputUsdValue || !outputUsdValue)) {\n return { type: QuoteWarningType.UNKNOWN_PRICE };\n }\n\n const minRequiredSlippage = getMinRequiredSlippage(quote.swaps);\n const highSlippage = userSlippage > HIGH_SLIPPAGE;\n\n if (!hasProperSlippage(params.userSlippage.toString(), minRequiredSlippage)) {\n return {\n type: QuoteWarningType.INSUFFICIENT_SLIPPAGE,\n recommendedSlippages: checkSlippageWarnings(quote, userSlippage),\n minRequiredSlippage: minRequiredSlippage,\n };\n } else if (\n highSlippage &&\n parseFloat(minRequiredSlippage ?? '0') < userSlippage\n ) {\n return {\n type: QuoteWarningType.HIGH_SLIPPAGE,\n slippage: userSlippage.toString(),\n };\n }\n\n return null;\n}\n\nexport function getPriceImpact(\n inputUsdValue: BigNumber | string | null,\n outputUsdValue: BigNumber | string | null\n): number | null {\n const outputUsdValueIsInvalid =\n typeof outputUsdValue === 'string'\n ? parseFloat(outputUsdValue) <= 0\n : !outputUsdValue?.gt(0);\n const percentageChange =\n !inputUsdValue || !outputUsdValue || outputUsdValueIsInvalid\n ? null\n : getPercentageChange(\n inputUsdValue.toString(),\n outputUsdValue.toString()\n );\n\n return percentageChange && percentageChange < 0 ? percentageChange : null;\n}\n\nexport const getUniqueBlockchains = (steps: Step[]) => {\n const set = new Set();\n const result: { displayName: string; image: string }[] = [];\n steps.forEach((step) => {\n if (!set.has(step.from.chain.displayName)) {\n set.add(step.from.chain.displayName);\n result.push(step.from.chain);\n }\n if (!set.has(step.to.chain.displayName)) {\n set.add(step.to.chain.displayName);\n result.push(step.to.chain);\n }\n });\n\n return result;\n};\n\nexport const sortQuotesBy = (\n strategy: PreferenceType,\n quotes: MultiRouteResponse['results']\n): MultiRouteResponse['results'] => {\n return quotes.sort((quote1, quote2) => {\n const getScore = (route: MultiRouteSimulationResult) =>\n route.scores?.find((score) => score.preferenceType === strategy)?.score ??\n 0;\n\n const quote1Score = getScore(quote1);\n const quote2Score = getScore(quote2);\n\n if (quote1Score !== quote2Score) {\n return quote2Score - quote1Score;\n }\n\n const lowerQuoteId1 = quote1.requestId.toLowerCase();\n const lowerQuoteId2 = quote2.requestId.toLowerCase();\n\n return lowerQuoteId1.localeCompare(lowerQuoteId2);\n });\n};\n\nexport const getDefaultQuote = (\n currentQuote: SelectedQuote | null,\n quotes: MultiRouteSimulationResult[],\n requestAmount: string\n): SelectedQuote | null => {\n if (!quotes.length) {\n return null;\n }\n if (!currentQuote) {\n // Handle the case where currentQuote is null\n return {\n requestAmount: requestAmount,\n ...quotes[0], // Return the first quote from the quotes array\n };\n }\n // Create a set of swapperIds from the currentQuote swaps\n const currentQuoteSwapperIds = new Set(\n currentQuote.swaps.map((swap) => swap.swapperId)\n );\n\n // Find a quote that matches the currentQuote's swapperIds\n const matchedQuote = quotes.find((quote) => {\n // Create a set of swapperIds from the quote swaps\n const quoteSwapperIds = new Set(quote.swaps.map((swap) => swap.swapperId));\n\n // Check if all swapperIds from the currentQuote are present in the quoteSwapperIds\n return Array.from(currentQuoteSwapperIds).every((swapperId) =>\n quoteSwapperIds.has(swapperId)\n );\n });\n\n // Return the matchedQuote if found, otherwise return the first quote from the quotes array\n return {\n requestAmount: requestAmount,\n ...(matchedQuote || quotes[0]),\n };\n};\n\nexport const sortTags = (tags: RouteTag[]): RouteTag[] => {\n const customSort = (a: RouteTag, b: RouteTag) => {\n const indexA = HIGH_PRIORITY_TAGS.indexOf(a.value);\n const indexB = HIGH_PRIORITY_TAGS.indexOf(b.value);\n\n if (indexA !== -1 && indexB !== -1) {\n return indexA - indexB;\n }\n\n if (indexA !== -1) {\n return -1;\n } else if (indexB !== -1) {\n return 1;\n }\n\n return 0;\n };\n\n return tags.sort(customSort);\n};\n", "import type { PreferenceType, SwapFee, TagValue } from 'rango-sdk';\n\nimport { i18n } from '@lingui/core';\n\nexport type NameOfFees =\n | 'Swapper Fee'\n | 'Affiliate Fee'\n | 'Outbound network fee'\n | 'Rango Fee'\n | 'Network Fee';\n\nexport const NAME_OF_FEES: Record<NameOfFees, string> = {\n 'Network Fee': i18n.t('Network Fee'),\n 'Swapper Fee': i18n.t('Protocol Fee'),\n 'Affiliate Fee': i18n.t('Affiliate Fee'),\n 'Outbound network fee': i18n.t('Outbound Fee'),\n 'Rango Fee': i18n.t('Rango Fee'),\n};\n\nexport type FeesGroup = {\n payable: { [key in NameOfFees]?: SwapFee[] };\n nonePayable: { [key in NameOfFees]?: SwapFee[] };\n};\n\nexport const ROUTE_STRATEGY: { value: PreferenceType; label: string }[] = [\n {\n value: 'SMART',\n label: i18n.t('Smart Routing'),\n },\n {\n value: 'FEE',\n label: i18n.t('Lowest Fee'),\n },\n {\n value: 'SPEED',\n label: i18n.t('Fastest Transfer'),\n },\n {\n value: 'NET_OUTPUT',\n label: i18n.t('Maximum Return'),\n },\n {\n value: 'PRICE',\n label: i18n.t('Maximum Output'),\n },\n];\n\nexport const HIGH_PRIORITY_TAGS: TagValue[] = [\n 'RECOMMENDED',\n 'CENTRALIZED',\n 'LOWEST_FEE',\n 'FASTEST',\n 'HIGH_IMPACT',\n];\n\nexport const GAS_FEE_MAX = 30;\n", "/* eslint-disable @typescript-eslint/prefer-enum-initializers */\n\nimport type { PriceImpactWarningLevel } from '@rango-dev/ui';\nimport type BigNumber from 'bignumber.js';\nimport type {\n BlockchainValidationStatus,\n RouteTag,\n RoutingResultType,\n SwapResult,\n} from 'rango-sdk';\n\nexport enum QuoteErrorType {\n NO_RESULT,\n REQUEST_FAILED,\n REQUEST_CANCELED,\n BRIDGE_LIMIT,\n INSUFFICIENT_SLIPPAGE,\n}\n\nexport type NoResultError = {\n type: QuoteErrorType.NO_RESULT;\n diagnosisMessage?: string;\n};\n\nexport type BridgeLimitError = {\n type: QuoteErrorType.BRIDGE_LIMIT;\n swap: SwapResult;\n recommendation: string;\n fromAmountRangeError: string;\n};\n\nexport type InsufficientSlippageError = {\n type: QuoteErrorType.INSUFFICIENT_SLIPPAGE;\n recommendedSlippages: RecommendedSlippages | null;\n minRequiredSlippage: string | null;\n};\n\nexport type QuoteRequestFailed = { type: QuoteErrorType.REQUEST_FAILED };\nexport type QuoteRequestCanceled = { type: QuoteErrorType.REQUEST_CANCELED };\n\nexport type QuoteError =\n | NoResultError\n | BridgeLimitError\n | InsufficientSlippageError\n | QuoteRequestFailed\n | QuoteRequestCanceled;\n\nexport enum QuoteWarningType {\n HIGH_VALUE_LOSS,\n UNKNOWN_PRICE,\n INSUFFICIENT_SLIPPAGE,\n HIGH_SLIPPAGE,\n}\n\nexport enum QuoteUpdateType {\n QUOTE_UPDATED,\n QUOTE_SWAPPERS_UPDATED,\n QUOTE_COINS_UPDATED,\n QUOTE_AND_OUTPUT_AMOUNT_UPDATED,\n QUOTE_UPDATED_WITH_HIGH_VALUE_LOSS,\n}\n\nexport type QuoteUpdateWarning =\n | {\n type: QuoteUpdateType.QUOTE_AND_OUTPUT_AMOUNT_UPDATED;\n newOutputAmount: string;\n percentageChange: string;\n }\n | {\n type: Exclude<\n QuoteUpdateType,\n QuoteUpdateType.QUOTE_AND_OUTPUT_AMOUNT_UPDATED\n >;\n };\n\nexport type RecommendedSlippages = Map<number, string>;\n\nexport type InsufficientSlippageWarning = {\n type: QuoteWarningType.INSUFFICIENT_SLIPPAGE;\n recommendedSlippages: RecommendedSlippages | null;\n minRequiredSlippage: string | null;\n};\n\nexport type HighSlippageWarning = {\n type: QuoteWarningType.HIGH_SLIPPAGE;\n slippage: string | null;\n};\n\nexport type HighValueLossWarning = {\n type: QuoteWarningType.HIGH_VALUE_LOSS;\n warningLevel: PriceImpactWarningLevel;\n inputUsdValue: BigNumber;\n outputUsdValue: BigNumber;\n totalFee: BigNumber;\n priceImpact: number;\n};\n\nexport type UnknownPriceWarning = {\n type: QuoteWarningType.UNKNOWN_PRICE;\n};\n\nexport type QuoteWarning =\n | HighValueLossWarning\n | InsufficientSlippageWarning\n | HighSlippageWarning\n | UnknownPriceWarning;\n\nexport type ConfirmSwapWarnings = {\n quote: QuoteWarning | null;\n quoteUpdate: QuoteUpdateWarning | null;\n balance: { messages: string[] } | null;\n};\n\nexport type QuoteResponse = {\n requestId: string;\n swaps?: SwapResult[];\n diagnosisMessages: string[] | null;\n};\n\nexport type SelectedQuote = {\n swaps: SwapResult[];\n requestId: string;\n outputAmount?: string;\n resultType?: RoutingResultType;\n tags?: RouteTag[];\n validationStatus: BlockchainValidationStatus[] | null;\n requestAmount: string;\n};\n\nexport type QuoteErrorResponse = {\n message: string;\n options: QuoteError;\n};\n", "/* eslint-disable @typescript-eslint/no-magic-numbers */\nimport type { FeesGroup, NameOfFees } from '../constants/quote';\nimport type { FetchStatus } from '../store/slices/data';\nimport type { ConnectedWallet } from '../store/wallets';\nimport type {\n ConvertedToken,\n QuoteError,\n QuoteWarning,\n RecommendedSlippages,\n SelectedQuote,\n SwapButtonState,\n Wallet,\n} from '../types';\nimport type { WalletType } from '@rango-dev/wallets-shared';\nimport type {\n BestRouteRequest,\n BlockchainMeta,\n RecommendedSlippage,\n SwapFee,\n SwapResult,\n Token,\n} from 'rango-sdk';\nimport type { PendingSwap, PendingSwapStep } from 'rango-types';\n\nimport { i18n } from '@lingui/core';\nimport BigNumber from 'bignumber.js';\nimport { PendingSwapNetworkStatus } from 'rango-types';\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';\n\nimport { getBlockchainShortNameFor } from './meta';\nimport { numberToString } from './numbers';\nimport { getPriceImpact, getRequiredBalanceOfWallet } from './quote';\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\n .div(inputUsdValue)\n .minus(1)\n .multipliedBy(100)\n .toNumber();\n}\n\nexport function hasHighValueLoss(\n inputUsdValue: BigNumber | null,\n priceImpact: number\n): boolean {\n return (\n ((parseInt(priceImpact.toFixed(2) || '0') <= -10 &&\n inputUsdValue?.gte(new BigNumber(400))) ||\n (parseInt(priceImpact.toFixed(2) || '0') <= -5 &&\n inputUsdValue?.gte(new BigNumber(1000)))) ??\n false\n );\n}\n\nexport function hasLimitError(swaps: SwapResult[]): boolean {\n return (\n (swaps || []).filter((swap) => {\n const minimum = !!swap.fromAmountMinValue\n ? new BigNumber(swap.fromAmountMinValue)\n : null;\n const maximum = !!swap.fromAmountMaxValue\n ? new BigNumber(swap.fromAmountMaxValue)\n : null;\n const isExclusive = swap.fromAmountRestrictionType === 'EXCLUSIVE';\n if (isExclusive) {\n return minimum?.gte(swap.fromAmount) || maximum?.lte(swap.fromAmount);\n }\n return minimum?.gt(swap.fromAmount) || maximum?.lt(swap.fromAmount);\n }).length > 0\n );\n}\n\nexport function getLimitErrorMessage(swaps: SwapResult[]): {\n swap: SwapResult;\n fromAmountRangeError: string;\n recommendation: string;\n} {\n const swap = (swaps || []).filter((swap) => {\n const minimum = !!swap.fromAmountMinValue\n ? new BigNumber(swap.fromAmountMinValue)\n : null;\n const maximum = !!swap.fromAmountMaxValue\n ? new BigNumber(swap.fromAmountMaxValue)\n : null;\n const isExclusive = swap.fromAmountRestrictionType === 'EXCLUSIVE';\n if (isExclusive) {\n return minimum?.gte(swap.fromAmount) || maximum?.lte(swap.fromAmount);\n }\n return minimum?.gt(swap.fromAmount) || maximum?.lt(swap.fromAmount);\n })[0];\n\n const minimum = !!swap.fromAmountMinValue\n ? new BigNumber(swap.fromAmountMinValue)\n : null;\n const maximum = !!swap.fromAmountMaxValue\n ? new BigNumber(swap.fromAmountMaxValue)\n : null;\n const isExclusive = swap.fromAmountRestrictionType === 'EXCLUSIVE';\n\n let fromAmountRangeError = '';\n let recommendation = '';\n if (!isExclusive && !!minimum && minimum.gt(swap.fromAmount)) {\n fromAmountRangeError = i18n.t({\n id: 'Required: >= {min} {symbol}',\n values: {\n min: numberToString(\n minimum,\n TOKEN_AMOUNT_MIN_DECIMALS,\n TOKEN_AMOUNT_MAX_DECIMALS\n ),\n symbol: swap.from.symbol,\n },\n });\n recommendation = errorMessages().bridgeLimitErrors.increaseAmount;\n } else if (isExclusive && !!minimum && minimum.gte(swap.fromAmount)) {\n fromAmountRangeError = i18n.t({\n id: 'Required: > {min} {symbol}',\n values: {\n min: numberToString(\n minimum,\n TOKEN_AMOUNT_MIN_DECIMALS,\n TOKEN_AMOUNT_MAX_DECIMALS\n ),\n symbol: swap.from.symbol,\n },\n });\n recommendation = errorMessages().bridgeLimitErrors.increaseAmount;\n }\n\n if (!isExclusive && !!maximum && maximum.lt(swap.fromAmount)) {\n fromAmountRangeError = i18n.t({\n id: 'Required: <= {max} {symbol}',\n values: {\n max: numberToString(\n maximum,\n TOKEN_AMOUNT_MIN_DECIMALS,\n TOKEN_AMOUNT_MAX_DECIMALS\n ),\n symbol: swap.from.symbol,\n },\n });\n recommendation = errorMessages().bridgeLimitErrors.decreaseAmount;\n } else if (isExclusive && !!maximum && maximum.lte(swap.fromAmount)) {\n fromAmountRangeError = i18n.t({\n id: 'Required: < {max} {symbol}',\n values: {\n max: numberToString(\n maximum,\n TOKEN_AMOUNT_MIN_DECIMALS,\n TOKEN_AMOUNT_MAX_DECIMALS\n ),\n symbol: swap.from.symbol,\n },\n });\n recommendation = errorMessages().bridgeLimitErrors.decreaseAmount;\n }\n\n return { swap, fromAmountRangeError, recommendation };\n}\n\nexport function getSwapButtonState(params: {\n fetchMetaStatus: FetchStatus;\n anyWalletConnected: boolean;\n fetchingQuote: boolean;\n inputAmount: string;\n quote: SelectedQuote | null;\n warning: QuoteWarning | null;\n error: QuoteError | null;\n needsToWarnEthOnPath: boolean;\n}): SwapButtonState {\n const {\n fetchMetaStatus,\n anyWalletConnected,\n fetchingQuote,\n inputAmount,\n quote,\n warning,\n error,\n needsToWarnEthOnPath,\n } = params;\n if (fetchMetaStatus !== 'success') {\n return {\n title: swapButtonTitles().connectWallet,\n action: 'connect-wallet',\n disabled: true,\n };\n }\n if (!anyWalletConnected) {\n return {\n title: swapButtonTitles().connectWallet,\n action: 'connect-wallet',\n disabled: false,\n };\n }\n if (fetchingQuote || !quote || error || !inputAmount || inputAmount === '0') {\n return {\n title: swapButtonTitles().swap,\n action: 'confirm-swap',\n disabled: true,\n };\n } else if (warning) {\n return {\n title: swapButtonTitles().swapAnyway,\n action: 'confirm-warning',\n disabled: false,\n };\n } else if (needsToWarnEthOnPath) {\n return {\n title: swapButtonTitles().ethWarning,\n action: 'confirm-warning',\n disabled: false,\n };\n }\n return {\n title: swapButtonTitles().swap,\n action: 'confirm-swap',\n disabled: false,\n };\n}\n\nexport function canComputePriceImpact(\n quote: SelectedQuote | null,\n inputAmount: string,\n usdValue: BigNumber | null\n) {\n return !(\n (!usdValue || usdValue.lte(ZERO)) &&\n !!quote &&\n !!inputAmount &&\n inputAmount !== '0' &&\n parseFloat(inputAmount || '0') !== 0 &&\n !!quote\n );\n}\n\nexport function requiredWallets(quote: SelectedQuote | null) {\n const wallets: string[] = [];\n\n quote?.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 swaps: SwapResult[],\n allTokens: Token[]\n): BigNumber {\n return swaps.reduce(\n (totalFee: BigNumber, step) =>\n totalFee.plus(getUsdFeeOfStep(step, allTokens)),\n ZERO\n );\n}\n\nexport function getUsdFee(fee: SwapFee): BigNumber {\n let totalFeeInUsd = ZERO;\n totalFeeInUsd = totalFeeInUsd.plus(\n new BigNumber(fee.amount).multipliedBy(fee.price || 0)\n );\n\n return totalFeeInUsd;\n}\n\nexport function getTotalFeesInUsd(fees: SwapFee[]): BigNumber {\n return fees.reduce(\n (totalFee: BigNumber, fee) => totalFee.plus(getUsdFee(fee)),\n ZERO\n );\n}\nexport function getFeesGroup(swaps: SwapResult[]): FeesGroup {\n return swaps.reduce(\n (result, swap) => {\n for (const fee of swap.fee) {\n const name = fee.name as NameOfFees;\n const feeGroup =\n fee.expenseType !== 'DECREASE_FROM_OUTPUT'\n ? result.payable\n : result.nonePayable;\n\n feeGroup[name] = [...(feeGroup[name] || []), fee];\n }\n return result;\n },\n { payable: {}, nonePayable: {} } as FeesGroup\n );\n}\n\nexport function hasHighFee(totalFeeInUsd: BigNumber | null) {\n if (!totalFeeInUsd) {\n return false;\n }\n return !totalFeeInUsd.lt(new BigNumber(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 checkSlippageErrors(\n swaps: SwapResult[]\n): RecommendedSlippages | null {\n const recommendedSlippages: RecommendedSlippages = new Map();\n swaps.forEach((swap, index) => {\n if (swap.recommendedSlippage?.error) {\n recommendedSlippages.set(index, swap.recommendedSlippage.slippage);\n }\n });\n if (recommendedSlippages.size > 0) {\n return recommendedSlippages;\n }\n return null;\n}\n\nexport function checkSlippageWarnings(\n quote: SelectedQuote,\n userSlippage: number\n): RecommendedSlippages | null {\n const recommendedSlippages: RecommendedSlippages = new Map();\n quote?.swaps.forEach((swap, index) => {\n if (\n swap.recommendedSlippage?.slippage &&\n parseFloat(swap.recommendedSlippage.slippage) > userSlippage\n ) {\n recommendedSlippages.set(index, swap.recommendedSlippage.slippage);\n }\n });\n if (recommendedSlippages.size > 0) {\n return recommendedSlippages;\n }\n return null;\n}\n\nexport function getMinRequiredSlippage(swaps: SwapResult[]): string | null {\n const slippages = swaps.map((slippage) => slippage.recommendedSlippage);\n return (\n slippages\n ?.map((s) => s?.slippage || '0')\n ?.filter((s) => parseFloat(s) > 0)\n ?.sort((a, b) => parseFloat(b) - parseFloat(a))\n ?.find(() => true) || null\n );\n}\n\nexport function hasProperSlippage(\n userSlippage: string,\n minRequiredSlippage: string | null\n) {\n if (!minRequiredSlippage) {\n return true;\n }\n return parseFloat(userSlippage) >= parseFloat(minRequiredSlippage);\n}\n\nexport function hasEnoughBalance(\n quote: SelectedQuote,\n selectedWallets: Wallet[]\n) {\n const fee = quote.validationStatus;\n\n if (fee === null || fee.length === 0) {\n return true;\n }\n\n for (const wallet of selectedWallets) {\n const requiredAssets = getRequiredBalanceOfWallet(wallet, fee);\n if (!requiredAssets) {\n continue;\n }\n\n const enoughBalanceInWallet = requiredAssets\n .map((asset) => asset.ok)\n .reduce((previous, current) => previous && current);\n if (!enoughBalanceInWallet) {\n return false;\n }\n }\n\n return true;\n}\n\nexport function hasEnoughBalanceAndProperSlippage(\n quote: SelectedQuote,\n selectedWallets: Wallet[],\n userSlippage: string,\n minRequiredSlippage: string | null\n): boolean {\n return (\n hasEnoughBalance(quote, selectedWallets) &&\n hasProperSlippage(userSlippage, minRequiredSlippage)\n );\n}\n\nexport function createQuoteRequestBody(params: {\n fromToken: Token;\n toToken: Token;\n inputAmount: string;\n wallets?: ConnectedWallet[];\n selectedWallets?: Wallet[];\n liquiditySources?: string[];\n excludeLiquiditySources?: boolean;\n disabledLiquiditySources: string[];\n slippage: number;\n affiliateRef: string | null;\n affiliatePercent: number | null;\n affiliateWallets: { [key: string]: string } | null;\n destination?: string;\n enableCentralizedSwappers?: boolean;\n}): BestRouteRequest {\n const {\n fromToken,\n toToken,\n inputAmount,\n wallets,\n selectedWallets,\n disabledLiquiditySources,\n liquiditySources,\n excludeLiquiditySources,\n slippage,\n affiliateRef,\n affiliatePercent,\n affiliateWallets,\n destination,\n enableCentralizedSwappers,\n } = params;\n const selectedWalletsMap = selectedWallets?.reduce(\n (\n selectedWalletsMap: BestRouteRequest['selectedWallets'],\n selectedWallet\n ) => (\n (selectedWalletsMap[selectedWallet.chain] = selectedWallet.address),\n selectedWalletsMap\n ),\n {}\n );\n\n const connectedWallets: BestRouteRequest['connectedWallets'] = [];\n\n wallets?.forEach((wallet) => {\n connectedWallets.push({\n blockchain: wallet.chain,\n addresses: [wallet.address],\n });\n });\n // eslint-disable-next-line @typescript-eslint/ban-ts-comment\n // @ts-ignore\n const requestBody: BestRouteRequest = {\n amount: inputAmount.toString(),\n affiliateRef: affiliateRef ?? undefined,\n affiliatePercent: affiliatePercent ?? undefined,\n affiliateWallets: affiliateWallets ?? undefined,\n from: {\n address: fromToken.address,\n blockchain: fromToken.blockchain,\n symbol: fromToken.symbol,\n },\n to: {\n address: toToken.address,\n blockchain: toToken.blockchain,\n symbol: toToken.symbol,\n },\n connectedWallets,\n selectedWallets: selectedWalletsMap ?? {},\n slippage: slippage.toString(),\n ...(destination && { destination: destination }),\n ...(excludeLiquiditySources && {\n swapperGroups: disabledLiquiditySources.concat(liquiditySources ?? []),\n swappersGroupsExclude: true,\n }),\n ...(!excludeLiquiditySources && {\n swapperGroups: liquiditySources?.filter(\n (liquiditySource) => !disabledLiquiditySources.includes(liquiditySource)\n ),\n swappersGroupsExclude: false,\n }),\n enableCentralizedSwappers,\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 getQuoteOutputAmount(quote: SelectedQuote) {\n return quote?.outputAmount || null;\n}\n\nexport function getPercentageChange(input: string, output: string) {\n return new BigNumber(output)\n .div(new BigNumber(input))\n .minus(1)\n .multipliedBy(100)\n .toNumber();\n}\n\nexport function isOutputAmountChangedALot(\n oldQuote: SelectedQuote,\n newQuote: SelectedQuote\n) {\n const oldOutputAmount = getQuoteOutputAmount(oldQuote);\n const newOutputAmount = getQuoteOutputAmount(newQuote);\n if (!oldOutputAmount || !newOutputAmount) {\n return false;\n }\n const percentageChange = getPriceImpact(oldOutputAmount, newOutputAmount);\n if (!percentageChange) {\n return true;\n }\n\n return percentageChange <= -1;\n}\n\nexport function generateBalanceWarnings(\n quote: SelectedQuote,\n selectedWallets: Wallet[],\n blockchains: BlockchainMeta[]\n) {\n const fee = quote.validationStatus;\n const requiredWallets = getRequiredChains(quote);\n const walletsSortedByRequiredWallets = selectedWallets.sort(\n (selectedWallet1, selectedWallet2) =>\n requiredWallets.indexOf(selectedWallet1.chain) -\n requiredWallets.indexOf(selectedWallet2.chain)\n );\n\n return walletsSortedByRequiredWallets\n .flatMap((wallet) => getRequiredBalanceOfWallet(wallet, fee) || [])\n .filter((asset) => !asset.ok)\n .map((asset) => {\n const symbol = asset.asset.symbol;\n const currentAmount = numberToString(\n new BigNumber(asset.currentAmount.amount).shiftedBy(\n -asset.currentAmount.decimals\n ),\n BALANCE_MIN_DECIMALS,\n BALANCE_MAX_DECIMALS\n );\n const requiredAmount = numberToString(\n new BigNumber(asset.requiredAmount.amount).shiftedBy(\n -asset.requiredAmount.decimals\n ),\n BALANCE_MIN_DECIMALS,\n BALANCE_MAX_DECIMALS\n );\n let reason = '';\n if (asset.reason === 'FEE') {\n reason = i18n.t(' for network fee');\n }\n if (asset.reason === 'INPUT_ASSET') {\n reason = i18n.t(' for swap');\n }\n if (asset.reason === 'FEE_AND_INPUT_ASSET') {\n reason = i18n.t(' for input and network fee');\n }\n const warningMessage = i18n.t({\n id: `Needs \u2248 {requiredAmount} {symbol}{reason}, but you have {currentAmount} {symbol} in your {blockchain} wallet.`,\n values: {\n requiredAmount,\n symbol,\n reason,\n currentAmount,\n blockchain: getBlockchainShortNameFor(\n asset.asset.blockchain,\n blockchains\n ),\n },\n });\n return warningMessage;\n });\n}\n\nexport function 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 || i18n.t('Waiting for connecting wallet');\n break;\n case PendingSwapNetworkStatus.WaitingForQueue:\n message =\n message || i18n.t('Waiting for other running tasks to be finished');\n break;\n case PendingSwapNetworkStatus.WaitingForNetworkChange:\n message = message || i18n.t('Waiting for changing wallet network');\n break;\n 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}\n\nexport function confirmSwapDisabled(\n fetching: boolean,\n showCustomDestination: boolean,\n customDestination: string | null,\n quote: SelectedQuote | null,\n selectedWallets: { walletType: string; chain: string }[],\n lastStepToBlockchain?: BlockchainMeta\n) {\n return (\n fetching ||\n (!showCustomDestination &&\n !requiredWallets(quote).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\nexport function isTokensIdentical(tokenA: Token, tokenB: Token) {\n return (\n tokenA.blockchain === tokenB.blockchain &&\n tokenA.symbol === tokenB.symbol &&\n tokenA.address === tokenB.address\n );\n}\n", "import type { BlockchainMeta, SwapResult } from 'rango-sdk';\n\nexport function getRequiredWallets(swaps: SwapResult[] | null): string[] {\n const wallets: string[] = [];\n\n 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 { QuoteError } from '../types';\n\nimport { i18n } from '@lingui/core';\n\nimport { QuoteErrorType } from '../types';\n\nexport const errorMessages = () => {\n return {\n genericServerError: i18n.t('Failed Network, Please retry your swap.'),\n liquiditySourcesError: {\n title: i18n.t('Please reset your liquidity sources.'),\n description: i18n.t(\n 'You have limited the liquidity sources and this might result in Rango finding no routes. Please consider resetting your liquidity sources.'\n ),\n },\n noResultError: {\n title: i18n.t('No Routes Found.'),\n description: i18n.t(\n \"Reasons why Rango couldn't find a route: low liquidity on token, very low input amount or no routes available for the selected input/output token combination.\"\n ),\n },\n bridgeLimitErrors: {\n increaseAmount: i18n.t(\n 'Bridge Limit Error: Please increase your amount.'\n ),\n decreaseAmount: i18n.t(\n 'Bridge Limit Error: Please decrease your amount.'\n ),\n },\n highValueLossError: {\n impactTitle: i18n.t('High Price Impact'),\n title: i18n.t('Price impact is too high!'),\n description: i18n.t(\n 'The price impact is significantly higher than the allowed amount. If you are sure, continue, otherwise, change the swap.'\n ),\n confirmMessage: i18n.t('Confirm high price impact'),\n },\n quoteUpdatedWithHighValueLoss: {\n title: i18n.t(\n 'Route updated and price impact is too high, try again later!'\n ),\n },\n unknownPriceError: {\n impactTitle: i18n.t('USD Price Unknown'),\n title: i18n.t('USD Price Unknown, Cannot calculate Price Impact.'),\n description: i18n.t(\n 'USD Price Unknown, Cannot calculate Price Impact. The price impact may be higher than usual. Are you sure to continue the Swap?'\n ),\n confirmMessage: i18n.t('Confirm USD Price Unknown'),\n },\n };\n};\n\nexport function getQuoteErrorMessage(error: QuoteError) {\n switch (error.type) {\n case QuoteErrorType.NO_RESULT:\n return error.diagnosisMessage ?? errorMessages().noResultError.title;\n case QuoteErrorType.REQUEST_FAILED:\n return errorMessages().genericServerError;\n default:\n return '';\n }\n}\n", "import { i18n } from '@lingui/core';\n\nexport const swapButtonTitles = () => {\n return {\n connectWallet: i18n.t('Connect Wallet'),\n swap: i18n.t('Swap'),\n swapAnyway: i18n.t('Swap anyway'),\n ethWarning: i18n.t('The route goes through Ethereum. Continue?'),\n };\n};\n", "import { useEffect, useRef } from 'react';\nimport {\n useInRouterContext,\n useLocation,\n useSearchParams,\n} from 'react-router-dom';\n\nimport { SearchParams } from '../../constants/searchParams';\nimport { useAppStore } from '../../store/AppStore';\nimport { useQuoteStore } from '../../store/quote';\n\nimport {\n searchParamToToken,\n tokenToSearchParam,\n} from './useSyncUrlAndStore.helpers';\n\nexport function useSyncUrlAndStore() {\n const location = useLocation();\n const [searchParams, setSearchParams] = useSearchParams();\n const {\n fromBlockchain,\n toBlockchain,\n fromToken,\n toToken,\n inputAmount,\n setFromBlockchain,\n setToBlockchain,\n setFromToken,\n setToToken,\n setInputAmount,\n } = useQuoteStore();\n const fetchMetaStatus = useAppStore().fetchStatus;\n const blockchains = useAppStore().blockchains();\n const tokens = useAppStore().tokens();\n const isInRouterContext = useInRouterContext();\n const { updateIframe, updateCampaignMode } = useAppStore();\n const campaignMode = useAppStore().isInCampaignMode();\n const liquiditySourcesParamsRef = useRef<string>();\n\n const getUrlSearchParams = () => {\n const fromAmount = searchParams.get(SearchParams.FROM_AMOUNT);\n const fromBlockchain = searchParams.get(SearchParams.FROM_BLOCKCHAIN);\n const fromToken = searchParams.get(SearchParams.FROM_TOKEN);\n const toBlockchain = searchParams.get(SearchParams.TO_BLOCKCHAIN);\n const toToken = searchParams.get(SearchParams.TO_TOKEN);\n const autoConnect = searchParams.get(SearchParams.AUTO_CONNECT);\n const clientUrl = searchParams.get(SearchParams.CLIENT_URL);\n const liquiditySources = searchParams.get(SearchParams.LIQUIDITY_SOURCES);\n\n return {\n fromAmount,\n fromBlockchain,\n fromToken,\n toBlockchain,\n toToken,\n autoConnect,\n clientUrl,\n liquiditySources,\n };\n };\n\n const updateUrlSearchParams = (\n searchParams: Record<string, string | undefined>\n ) => {\n for (const property in searchParams) {\n if (!searchParams[property]) {\n delete searchParams[property];\n }\n }\n setSearchParams(searchParams as Record<string, string>, { replace: true });\n };\n\n useEffect(() => {\n const { autoConnect, clientUrl } = getUrlSearchParams();\n if (isInRouterContext && fetchMetaStatus === 'success') {\n updateUrlSearchParams({\n [SearchParams.FROM_BLOCKCHAIN]: fromBlockchain?.name,\n [SearchParams.FROM_TOKEN]: tokenToSearchParam(fromToken),\n [SearchParams.TO_BLOCKCHAIN]: toBlockchain?.name,\n [SearchParams.TO_TOKEN]: tokenToSearchParam(toToken),\n [SearchParams.FROM_AMOUNT]: inputAmount,\n [SearchParams.AUTO_CONNECT]: autoConnect ?? undefined,\n [SearchParams.CLIENT_URL]: clientUrl ?? undefined,\n [SearchParams.LIQUIDITY_SOURCES]: campaignMode\n ? liquiditySourcesParamsRef.current\n : undefined,\n });\n }\n }, [\n location.pathname,\n inputAmount,\n fromBlockchain,\n fromToken,\n toBlockchain,\n toToken,\n campaignMode,\n ]);\n\n useEffect(() => {\n if (!isInRouterContext) {\n return;\n }\n\n const searchParams = getUrlSearchParams();\n\n if (!liquiditySourcesParamsRef.current && searchParams.liquiditySources) {\n liquiditySourcesParamsRef.current = searchParams.liquiditySources;\n }\n\n if (searchParams.fromAmount) {\n setInputAmount(searchParams.fromAmount);\n }\n\n if (fetchMetaStatus === 'success') {\n const fromBlockchain = blockchains.find(\n (blockchain) => blockchain.name === searchParams.fromBlockchain\n );\n const fromToken = searchParamToToken(\n tokens,\n searchParams.fromToken,\n fromBlockchain ?? null\n );\n const toBlockchain = blockchains.find(\n (blockchain) => blockchain.name === searchParams.toBlockchain\n );\n const toToken = searchParamToToken(\n tokens,\n searchParams.toToken,\n toBlockchain ?? null\n );\n\n if (!!fromBlockchain) {\n setFromBlockchain(fromBlockchain);\n if (!!fromToken) {\n setFromToken({\n token: fromToken,\n meta: {\n blockchains: blockchains,\n tokens: tokens,\n },\n });\n }\n }\n\n if (!!toBlockchain) {\n setToBlockchain(toBlockchain);\n if (!!toToken) {\n setToToken({\n token: toToken,\n meta: { blockchains: blockchains, tokens: tokens },\n });\n }\n }\n }\n }, [fetchMetaStatus]);\n\n useEffect(() => {\n const { clientUrl, liquiditySources } = getUrlSearchParams();\n // We run this only once, because if the app is embedded into an iframe, the data in url for iframe will not change.\n updateIframe('clientUrl', clientUrl || undefined);\n\n updateCampaignMode(\n 'liquiditySources',\n liquiditySources?.split(',') ?? undefined\n );\n }, []);\n}\n", "import type { BlockchainMeta, Token } from 'rango-sdk';\n\nexport function searchParamToToken(\n tokens: Token[],\n searchParam: 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 = searchParam?.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 tokenToSearchParam(token: Token | null): string | undefined {\n if (token) {\n return `${token.symbol}${token.address ? `--${token.address}` : ''}`;\n }\n return undefined;\n}\n", "/* eslint-disable @typescript-eslint/no-magic-numbers */\nimport type {\n ConfirmSwap,\n ConfirmSwapFetchResult,\n} from '../hooks/useConfirmSwap/useConfirmSwap.types';\n\nimport { i18n } from '@lingui/core';\nimport { useManager } from '@rango-dev/queue-manager-react';\nimport {\n Alert,\n Button,\n css,\n Divider,\n IconButton,\n SettingsIcon,\n styled,\n Tooltip,\n Typography,\n WalletIcon,\n} from '@rango-dev/ui';\nimport React, { useEffect, useLayoutEffect, useRef, useState } from 'react';\nimport { flushSync } from 'react-dom';\nimport { useLocation, useNavigate } from 'react-router-dom';\n\nimport { getRequiredWallets } from '../components/ConfirmWalletsModal/ConfirmWallets.helpers';\nimport { ConfirmWalletsModal } from '../components/ConfirmWalletsModal/ConfirmWalletsModal';\nimport { HeaderButton } from '../components/HeaderButtons/HeaderButtons.styles';\nimport { RefreshButton } from '../components/HeaderButtons/RefreshButton';\nimport { Layout, PageContainer } from '../components/Layout';\nimport { QuoteWarningsAndErrors } from '../components/QuoteWarningsAndErrors';\nimport { navigationRoutes } from '../constants/navigationRoutes';\nimport { getQuoteUpdateWarningMessage } from '../constants/warnings';\nimport { QuoteInfo } from '../containers/QuoteInfo';\nimport { useConfirmSwap } from '../hooks/useConfirmSwap';\nimport { useAppStore } from '../store/AppStore';\nimport { useQuoteStore } from '../store/quote';\nimport { useUiStore } from '../store/ui';\nimport { useWalletsStore } from '../store/wallets';\nimport { QuoteWarningType } from '../types';\nimport { getContainer } from '../utils/common';\nimport { joinList } from '../utils/ui';\n\nconst Buttons = styled('div', {\n width: '100%',\n display: 'flex',\n justifyContent: 'space-between',\n [`& ${IconButton}`]: {\n width: '$48',\n height: '$48',\n },\n});\n\nconst confirmBtnStyles = css({\n flexGrow: 1,\n paddingRight: '$10',\n});\n\nconst iconStyles = css({\n width: '$24',\n height: '$24',\n display: 'flex',\n justifyContent: 'center',\n alignItems: 'center',\n});\n\nconst descriptionStyles = css({\n display: 'flex',\n justifyContent: 'space-between',\n alignItems: 'center',\n});\n\nexport function ConfirmSwapPage() {\n //TODO: move component's logics to a custom hook\n const {\n selectedQuote,\n setInputAmount,\n selectedWallets,\n quoteWalletsConfirmed,\n setQuoteWalletConfirmed,\n customDestination,\n quoteWarningsConfirmed,\n } = useQuoteStore();\n const navigate = useNavigate();\n const location = useLocation();\n const [dbErrorMessage, setDbErrorMessage] = useState<string>('');\n\n const { connectedWallets } = useWalletsStore();\n const showWalletsOnInit = !quoteWalletsConfirmed;\n const [showWallets, setShowWallets] = useState(false);\n const { isActiveTab } = useUiStore();\n const disabledLiquiditySources = useAppStore().getDisabledLiquiditySources();\n const prevDisabledLiquiditySources = useRef(disabledLiquiditySources);\n const { manager } = useManager();\n const {\n fetch: confirmSwap,\n loading: fetchingConfirmationQuote,\n cancelFetch,\n } = useConfirmSwap();\n const [confirmSwapResult, setConfirmSwapResult] =\n useState<ConfirmSwapFetchResult>({\n swap: null,\n error: null,\n warnings: null,\n });\n const [showQuoteWarningModal, setShowQuoteWarningModal] = useState(false);\n\n const onConfirmSwap: ConfirmSwap['fetch'] = async ({\n selectedWallets,\n customDestination,\n }) => {\n const result = await confirmSwap?.({ selectedWallets, customDestination });\n\n setConfirmSwapResult(result);\n return result;\n };\n\n const addNewSwap = async () => {\n if (confirmSwapResult.swap && quoteWalletsConfirmed) {\n try {\n await manager?.create(\n 'swap',\n { swapDetails: confirmSwapResult.swap },\n { id: confirmSwapResult.swap.requestId }\n );\n\n const swap_url = `../${navigationRoutes.swaps}/${confirmSwapResult.swap.requestId}`;\n navigate(swap_url, {\n replace: true,\n });\n setTimeout(() => {\n setInputAmount('');\n }, 0);\n } catch (e) {\n 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?.quote && !quoteWarningsConfirmed) {\n setShowQuoteWarningModal(true);\n } else {\n await onConfirm();\n }\n };\n\n const onRefresh = async () => {\n setConfirmSwapResult({\n error: null,\n swap: null,\n warnings: null,\n });\n confirmSwap({ selectedWallets, customDestination })\n .then((res) => {\n setConfirmSwapResult(res);\n })\n .catch((error) => console.error(error));\n };\n\n useEffect(() => {\n const disabledLiquiditySourceReset =\n !!prevDisabledLiquiditySources.current.length &&\n !disabledLiquiditySources.length;\n if (disabledLiquiditySourceReset) {\n void onRefresh();\n }\n prevDisabledLiquiditySources.current = disabledLiquiditySources;\n }, [disabledLiquiditySources.length]);\n\n useEffect(() => {\n if (showWalletsOnInit) {\n cancelFetch();\n }\n }, [showWalletsOnInit]);\n\n useEffect(() => {\n if (showWalletsOnInit) {\n setShowWallets(showWalletsOnInit);\n }\n }, [showWalletsOnInit]);\n\n useEffect(() => {\n if (!showWalletsOnInit) {\n confirmSwap({ selectedWallets, customDestination })\n .then((result) => setConfirmSwapResult(result))\n .catch((error) => console.error(error));\n }\n }, []);\n\n useEffect(() => {\n const quoteChanged =\n confirmSwapResult.warnings?.quote?.type &&\n Object.values(QuoteWarningType).includes(\n confirmSwapResult.warnings?.quote?.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 quoteWalletsChanged = false;\n\n if (quoteChanged) {\n let requiredWallets = getRequiredWallets(selectedQuote?.swaps || null);\n\n const lastStepToBlockchain =\n selectedQuote?.swaps[selectedQuote.swaps.length - 1].to.blockchain;\n\n const isLastWalletRequired = !!selectedQuote?.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 quoteWalletsChanged = true;\n }\n }\n\n if (selectedQuote && (selectedWalletDisconnected || quoteWalletsChanged)) {\n queueMicrotask(() => flushSync(setShowWallets.bind(null, true)));\n setQuoteWalletConfirmed(false);\n }\n }, [\n confirmSwapResult.warnings?.quote,\n selectedWallets.length,\n connectedWallets.length,\n ]);\n\n useLayoutEffect(() => {\n if (!selectedQuote) {\n navigate(`../${location.search}`);\n }\n }, []);\n\n const quoteWarning = confirmSwapResult.warnings?.quote ?? null;\n const quoteError = confirmSwapResult.error;\n const alerts = [];\n if (dbErrorMessage) {\n alerts.push(<Alert type=\"error\" variant=\"alarm\" title={dbErrorMessage} />);\n }\n\n if (confirmSwapResult.warnings?.quoteUpdate) {\n alerts.push(\n <Alert\n variant=\"alarm\"\n type=\"warning\"\n title={\n confirmSwapResult.warnings.quoteUpdate &&\n getQuoteUpdateWarningMessage(confirmSwapResult.warnings.quoteUpdate)\n }\n />\n );\n }\n\n if (quoteWarning || quoteError) {\n const settings_url = `../${navigationRoutes.settings}`;\n alerts.push(\n <QuoteWarningsAndErrors\n warning={quoteWarning}\n error={quoteError}\n refetchQuote={onRefresh}\n showWarningModal={showQuoteWarningModal}\n confirmationDisabled={!isActiveTab}\n onOpenWarningModal={() => setShowQuoteWarningModal(true)}\n onCloseWarningModal={() => setShowQuoteWarningModal(false)}\n onConfirmWarningModal={async () => {\n setShowQuoteWarningModal(false);\n await addNewSwap();\n }}\n onChangeSettings={() => navigate(settings_url)}\n />\n );\n }\n\n return (\n <Layout\n header={{\n title: i18n.t('Confirm Swap'),\n onWallet: () => {\n const wallets_url = `../${navigationRoutes.wallets}`;\n navigate(wallets_url);\n },\n 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={confirmBtnStyles()}>\n <Button\n variant=\"contained\"\n type=\"primary\"\n size=\"large\"\n fullWidth\n loading={fetchingConfirmationQuote}\n disabled={!!confirmSwapResult.error || !isActiveTab}\n onClick={onStartConfirmSwap}>\n {i18n.t('Start Swap')}\n </Button>\n </div>\n <IconButton\n variant=\"contained\"\n type=\"primary\"\n size=\"large\"\n loading={fetchingConfirmationQuote}\n onClick={setShowWallets.bind(null, true)}>\n <WalletIcon size={24} />\n </IconButton>\n </Buttons>\n }>\n {showWallets && (\n <ConfirmWalletsModal\n open={showWallets}\n onClose={() => setShowWallets(false)}\n onCancel={cancelFetch}\n loading={fetchingConfirmationQuote}\n onCheckBalance={onConfirmSwap}\n />\n )}\n\n <PageContainer>\n <div className={descriptionStyles()}>\n <Typography variant=\"title\" size=\"small\">\n {i18n.t('You get')}\n </Typography>\n <div className={iconStyles()}>\n <RefreshButton\n onClick={\n !fetchingConfirmationQuote &&\n !showWallets &&\n !showQuoteWarningModal\n ? onRefresh\n : undefined\n }\n />\n </div>\n </div>\n <Divider size=\"12\" />\n\n {joinList(\n alerts.map((alert, index) => ({\n element: alert,\n key: `alert-${index}`,\n })),\n <Divider size={10} />\n )}\n {alerts.length > 0 ? <Divider size={10} /> : null}\n\n <QuoteInfo\n quote={selectedQuote}\n type=\"swap-preview\"\n expanded={true}\n error={confirmSwapResult.error}\n loading={fetchingConfirmationQuote}\n warning={confirmSwapResult.warnings?.quote ?? null}\n />\n </PageContainer>\n </Layout>\n );\n}\n", "import type { PropTypes } from './ConfirmWalletsModal.types';\nimport type { ConnectedWallet } from '../../store/wallets';\nimport type { ConfirmSwapWarnings, Wallet } from '../../types';\n\nimport { i18n } from '@lingui/core';\nimport {\n Alert,\n BalanceErrors,\n Button,\n ChevronDownIcon,\n ChevronLeftIcon,\n Divider,\n MessageBox,\n Typography,\n WalletIcon,\n} from '@rango-dev/ui';\nimport React, { useEffect, useState } from 'react';\nimport { useNavigate } from 'react-router-dom';\n\nimport { WIDGET_UI_ID } from '../../constants';\nimport { getQuoteErrorMessage } from '../../constants/errors';\nimport { getQuoteUpdateWarningMessage } from '../../constants/warnings';\nimport { useAppStore } from '../../store/AppStore';\nimport { useQuoteStore } from '../../store/quote';\nimport { useWalletsStore } from '../../store/wallets';\nimport { getBlockchainShortNameFor } from '../../utils/meta';\nimport { confirmSwapDisabled } from '../../utils/swap';\nimport { WatermarkedModal } from '../common/WatermarkedModal';\nimport { CustomCollapsible } from '../CustomCollapsible/CustomCollapsible';\nimport { ExpandedIcon } from '../CustomCollapsible/CustomCollapsible.styles';\n\nimport { getRequiredWallets, isValidAddress } from './ConfirmWallets.helpers';\nimport {\n alarmsStyles,\n ConfirmButton,\n CustomDestination,\n CustomDestinationButton,\n ListContainer,\n NavigateBack,\n ShowMoreHeader,\n StyledTextField,\n Title,\n Wallets,\n WalletsContainer,\n walletsListStyles,\n} from './ConfirmWallets.styles';\nimport { WalletList } from './WalletList';\n\nconst NUMBER_OF_WALLETS_TO_DISPLAY = 2;\n\nexport function ConfirmWalletsModal(props: PropTypes) {\n //TODO: move component's logics to a custom hook\n const { open, onClose, onCancel, onCheckBalance, loading } = props;\n const config = useAppStore().config;\n\n const blockchains = useAppStore().blockchains();\n const {\n selectedQuote,\n setSelectedWallets: selectQuoteWallets,\n quoteWalletsConfirmed: quoteWalletsConfirmed,\n setQuoteWalletConfirmed: setQuoteWalletConfirmed,\n customDestination,\n setCustomDestination,\n } = useQuoteStore();\n const { connectedWallets, selectWallets } = useWalletsStore();\n\n const [showMoreWalletFor, setShowMoreWalletFor] = useState('');\n const [balanceWarnings, setBalanceWarnings] = useState<string[]>([]);\n const [error, setError] = useState('');\n const [quoteWarning, setQuoteWarning] = useState<\n ConfirmSwapWarnings['quoteUpdate'] | null\n >(null);\n const [showCustomDestination, setShowCustomDestination] = useState(\n !!customDestination\n );\n\n const requiredWallets = getRequiredWallets(selectedQuote?.swaps || null);\n\n const lastStepToBlockchain = blockchains.find(\n (blockchain) =>\n blockchain.name ===\n selectedQuote?.swaps[selectedQuote?.swaps.length - 1].to.blockchain\n );\n const isWalletRequiredFor = (blockchain: string) =>\n !!selectedQuote?.swaps.find((swap) => swap.from.blockchain === blockchain);\n\n const getInitialSelectableWallets = () =>\n connectedWallets.filter((connectedWallet) => {\n return (\n connectedWallet.selected &&\n requiredWallets.includes(connectedWallet.chain)\n );\n });\n\n const [selectableWallets, setSelectableWallets] = useState<ConnectedWallet[]>(\n getInitialSelectableWallets()\n );\n const lastStepToBlockchainMeta = blockchains.find(\n (chain) => chain.name === lastStepToBlockchain?.name\n );\n\n const isInsufficientBalanceModalOpen = balanceWarnings.length > 0;\n\n const isSelected = (walletType: string, chain: string) =>\n !!selectableWallets.find(\n (selectableWallet) =>\n selectableWallet.walletType === walletType &&\n selectableWallet.chain === chain &&\n selectableWallet.selected &&\n (isWalletRequiredFor(chain) ||\n (!isWalletRequiredFor(chain) && !customDestination))\n );\n\n const isAddressMatched =\n !!customDestination &&\n showCustomDestination &&\n lastStepToBlockchainMeta &&\n !isValidAddress(lastStepToBlockchainMeta, customDestination);\n\n const resetCustomDestination = () => {\n setShowCustomDestination(false);\n setCustomDestination(null);\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 setCustomDestination(null);\n }\n setSelectableWallets((selectableWallets) =>\n selectableWallets\n .filter((selectableWallet) => selectableWallet.chain !== wallet.chain)\n .concat({ ...connectedWallet, selected: true })\n );\n };\n\n const onConfirmBalance = () => {\n const lastSelectedWallets = selectableWallets.filter(\n (wallet) => wallet.selected\n );\n selectWallets(lastSelectedWallets);\n selectQuoteWallets(lastSelectedWallets);\n setQuoteWalletConfirmed(true);\n onClose();\n };\n\n const onConfirmWallets = async () => {\n setBalanceWarnings([]);\n setError('');\n setQuoteWarning(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,\n });\n const warnings = result.warnings;\n if (warnings?.balance?.messages) {\n setBalanceWarnings(warnings.balance.messages);\n }\n if (warnings?.quoteUpdate) {\n setQuoteWarning(warnings.quoteUpdate);\n }\n if (result.error) {\n setError(getQuoteErrorMessage(result.error));\n }\n\n if (!result.error && (!warnings?.balance?.messages.length || 0 > 0)) {\n onConfirmBalance();\n } else {\n setBalanceWarnings(warnings?.balance?.messages ?? []);\n }\n };\n\n useEffect(() => {\n setSelectableWallets((selectableWallets) =>\n 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.getElementById(\n WIDGET_UI_ID.SWAP_BOX_ID\n ) as HTMLDivElement;\n\n const navigate = useNavigate();\n\n return (\n <WatermarkedModal\n open={open}\n onClose={() => {\n if (!quoteWalletsConfirmed) {\n const home = '../';\n navigate(home, { replace: true });\n }\n onClose();\n }}\n dismissible={!showMoreWalletFor}\n container={modalContainer}\n {...(!showMoreWalletFor && {\n footer: (\n <ConfirmButton>\n <Button\n loading={loading}\n disabled={confirmSwapDisabled(\n loading,\n showCustomDestination,\n customDestination,\n selectedQuote,\n selectableWallets,\n lastStepToBlockchain\n )}\n onClick={onConfirmWallets}\n variant=\"contained\"\n type=\"primary\"\n fullWidth\n size=\"large\">\n {i18n.t('Confirm')}\n </Button>\n </ConfirmButton>\n ),\n })}\n {...(showMoreWalletFor && {\n styles: { container: { padding: '$0' } },\n header: (\n <ShowMoreHeader>\n <NavigateBack\n variant=\"ghost\"\n onClick={setShowMoreWalletFor.bind(null, '')}>\n <ChevronLeftIcon size={16} />\n </NavigateBack>\n <Typography variant=\"headline\" size=\"small\">\n {i18n.t({\n id: 'Your {blockchainName} wallets',\n values: {\n blockchainName: getBlockchainShortNameFor(\n showMoreWalletFor,\n blockchains\n ),\n },\n })}\n </Typography>\n </ShowMoreHeader>\n ),\n })}\n anchor=\"center\">\n <WatermarkedModal\n open={isInsufficientBalanceModalOpen}\n onClose={setBalanceWarnings.bind(null, [])}\n container={modalContainer}>\n <MessageBox\n title={i18n.t('Insufficient account balance')}\n type=\"error\"\n description={<BalanceErrors messages={balanceWarnings ?? []} />}>\n <Button\n variant=\"outlined\"\n size=\"large\"\n type=\"primary\"\n fullWidth\n onClick={onConfirmBalance}>\n {i18n.t('Proceed anyway')}\n </Button>\n </MessageBox>\n </WatermarkedModal>\n {showMoreWalletFor && (\n <WalletsContainer>\n <div className={walletsListStyles()}>\n <WalletList\n chain={showMoreWalletFor}\n isSelected={isSelected}\n selectWallet={onChange}\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={i18n.t(error)} />\n <Divider size={12} />\n </>\n )}\n {quoteWarning && (\n <>\n <Alert\n variant=\"alarm\"\n type=\"warning\"\n title={getQuoteUpdateWarningMessage(quoteWarning)}\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 variant=\"title\" size=\"xmedium\">\n {i18n.t({\n id: 'Your {blockchainName} wallets',\n values: { blockchainName: blockchain?.shortName },\n })}\n </Typography>\n <Typography\n variant=\"label\"\n color=\"$neutral700\"\n size=\"medium\">\n {i18n.t({\n id: 'You need to connect a {blockchainName} wallet.',\n values: { blockchainName: blockchain?.shortName },\n })}\n </Typography>\n </Title>\n <Divider size={24} />\n <ListContainer>\n <WalletList\n chain={requiredWallet}\n isSelected={isSelected}\n selectWallet={onChange}\n limit={NUMBER_OF_WALLETS_TO_DISPLAY}\n onShowMore={() =>\n setShowMoreWalletFor(blockchain?.name ?? '')\n }\n />\n </ListContainer>\n {!isLastWallet && <Divider size={32} />}\n {isLastWallet && config?.customDestination && (\n <CustomDestination>\n <CustomCollapsible\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 hasSelected\n open={showCustomDestination}\n triggerAnchor=\"top\"\n trigger={\n <CustomDestinationButton>\n <div className=\"button__content\">\n <WalletIcon size={18} color=\"info\" />\n <Divider size={4} direction=\"horizontal\" />\n <Typography variant=\"label\" size=\"medium\">\n {i18n.t('Send to a different address')}\n </Typography>\n </div>\n <ExpandedIcon\n orientation={\n showCustomDestination ? 'up' : 'down'\n }>\n <ChevronDownIcon size={10} color=\"gray\" />\n </ExpandedIcon>\n </CustomDestinationButton>\n }\n onClickTrigger={() =>\n setShowCustomDestination((prev) => !prev)\n }>\n <Divider size={4} />\n <StyledTextField\n autoFocus\n placeholder={i18n.t('Your destination address')}\n value={customDestination || ''}\n onChange={(e) => {\n const value = e.target.value;\n if (!value.length) {\n setShowCustomDestination(false);\n setCustomDestination(null);\n } else {\n setCustomDestination(value.length ? value : null);\n }\n }}\n />\n </CustomCollapsible>\n\n {isAddressMatched && (\n <div className={alarmsStyles()}>\n <Alert\n variant=\"alarm\"\n type=\"error\"\n title={i18n.t({\n values: { destination: customDestination },\n id: \"Address {destination} doesn't match the blockchain address pattern.\",\n })}\n />\n </div>\n )}\n </CustomDestination>\n )}\n </div>\n );\n })}\n </Wallets>\n </>\n )}\n </WatermarkedModal>\n );\n}\n", "import type { QuoteUpdateWarning } from '../types';\n\nimport { i18n } from '@lingui/core';\n\nimport { QuoteUpdateType } from '../types';\n\nexport function getQuoteUpdateWarningMessage(warning: QuoteUpdateWarning) {\n switch (warning.type) {\n case QuoteUpdateType.QUOTE_UPDATED:\n return i18n.t('Route has been updated.');\n case QuoteUpdateType.QUOTE_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 QuoteUpdateType.QUOTE_SWAPPERS_UPDATED:\n return i18n.t('Route swappers has been updated.');\n case QuoteUpdateType.QUOTE_COINS_UPDATED:\n return i18n.t('Route internal coins has been updated.');\n default:\n return '';\n }\n}\n", "import type { ModalPropTypes } from '@rango-dev/ui';\nimport type { PropsWithChildren } from 'react';\n\nimport { Modal } from '@rango-dev/ui';\nimport React from 'react';\n\nimport { useUiStore } from '../../../store/ui';\n\nexport function WatermarkedModal(props: PropsWithChildren<ModalPropTypes>) {\n const { watermark } = useUiStore();\n\n const hasWatermark = watermark === 'FULL';\n return (\n <Modal hasWatermark={hasWatermark} {...props}>\n {props.children}\n </Modal>\n );\n}\n", "import type { PropTypes } from './CustomCollapsible.types';\nimport type { PropsWithChildren } from 'react';\n\nimport React, { useRef } from 'react';\n\nimport {\n CollapsibleContent,\n CollapsibleRoot,\n Trigger,\n} from './CustomCollapsible.styles';\n\nexport function CustomCollapsible(props: PropsWithChildren<PropTypes>) {\n const {\n open,\n hasSelected,\n onOpenChange,\n children,\n onClickTrigger,\n trigger,\n triggerAnchor,\n } = props;\n const ref = useRef<HTMLDivElement | null>(null);\n\n return (\n <CollapsibleRoot\n ref={ref}\n className=\"collapsible_root\"\n selected={hasSelected && open}\n open={open}\n onOpenChange={onOpenChange}>\n {triggerAnchor === 'top' && (\n <Trigger className=\"collapsible_trigger\" onClick={onClickTrigger}>\n {trigger}\n </Trigger>\n )}\n <CollapsibleContent className=\"collapsible_content\" open={open}>\n {children}\n </CollapsibleContent>\n {triggerAnchor === 'bottom' && (\n <Trigger className=\"collapsible_trigger\" onClick={onClickTrigger}>\n {trigger}\n </Trigger>\n )}\n </CollapsibleRoot>\n );\n}\n", "import * as Collapsible from '@radix-ui/react-collapsible';\nimport { keyframes, styled } from '@rango-dev/ui';\n\nexport const EXPANDABLE_TRANSITION_DURATION = 300;\n\nconst slideDown = keyframes({\n from: {\n height: 0,\n },\n to: {\n height: 'var(--radix-collapsible-content-height)',\n },\n});\n\nconst slideUp = keyframes({\n from: {\n height: 'var(--radix-collapsible-content-height)',\n },\n to: {\n height: 0,\n },\n});\n\nexport const CollapsibleRoot = styled(Collapsible.Root, {\n borderRadius: '$sm',\n variants: {\n selected: {\n true: {\n outlineWidth: 1,\n outlineColor: '$secondary500',\n outlineStyle: 'solid',\n },\n },\n },\n});\n\nexport const Trigger = styled(Collapsible.Trigger, {\n padding: '$0',\n border: 'none',\n outline: 'none',\n width: '100%',\n backgroundColor: 'transparent',\n fontFamily: 'inherit',\n cursor: 'pointer',\n});\n\nexport const CollapsibleContent = styled(Collapsible.Content, {\n overflow: 'hidden',\n variants: {\n open: {\n true: {\n animation: `${slideDown} ${EXPANDABLE_TRANSITION_DURATION}ms ease-out`,\n },\n false: {\n animation: `${slideUp} ${EXPANDABLE_TRANSITION_DURATION}ms ease-out`,\n },\n },\n },\n});\n\nexport const ExpandedIcon = styled('div', {\n transition: `all ${EXPANDABLE_TRANSITION_DURATION}ms ease`,\n display: 'flex',\n alignItems: 'center',\n variants: {\n orientation: {\n down: {\n transform: 'rotate(0)',\n },\n up: {\n transform: 'rotate(180deg)',\n },\n },\n },\n});\n", "import { css, darkTheme, IconButton, styled, TextField } from '@rango-dev/ui';\n\nexport const Title = styled('div', {\n display: 'flex',\n flexDirection: 'column',\n justifyContent: 'center',\n alignItems: 'center',\n});\n\nexport const ListContainer = styled('div', {\n display: 'flex',\n justifyContent: 'space-evenly',\n alignItems: 'center',\n gap: '$10',\n flexWrap: 'wrap',\n paddingTop: '$5',\n height: '100%',\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});\n\nexport const ShowMoreWallets = styled(WalletButton, {\n alignSelf: 'stretch',\n minHeight: '93px',\n});\nexport const ShowMoreHeader = styled('div', {\n padding: '$20 $20 $15 $20',\n display: 'flex',\n justifyContent: 'center',\n alignItems: 'center',\n backgroundColor: '$neutral200',\n position: 'relative',\n width: '100%',\n});\n\nexport const NavigateBack = styled(IconButton, {\n position: 'absolute',\n left: '$20',\n});\n\nexport const WalletsContainer = styled('div', {\n paddingTop: '$20',\n});\n\nexport const walletsListStyles = css({\n display: 'flex',\n justifyContent: 'space-evenly',\n alignItems: 'center',\n gap: '$10',\n flexWrap: 'wrap',\n paddingTop: '$5',\n height: '100%',\n});\n\nexport const CustomDestination = styled('div', {\n padding: '$10 $0',\n '& .button__content': {\n display: 'flex',\n alignItems: 'center',\n },\n '& .alarms': { paddingTop: '$5' },\n '& .collapsible_content': {\n backgroundColor: '$neutral100',\n },\n '& .collapsible_root': {\n backgroundColor: '$neutral200',\n },\n});\n\nexport const alarmsStyles = css({\n paddingTop: '$5',\n});\n\nexport const ConfirmButton = styled('div', {\n display: 'flex',\n});\n\nexport const StyledTextField = styled(TextField, {\n backgroundColor: '$neutral100',\n padding: '$0 $15 $15 $15',\n});\n\nexport const Wallets = styled('div', { overflow: 'visible', width: '100%' });\n\nexport const CustomDestinationButton = styled('div', {\n width: '100%',\n borderRadius: '$sm',\n display: 'flex',\n padding: '$15',\n justifyContent: 'space-between',\n alignItems: 'center',\n $$color: '$colors$neutral100',\n [`.${darkTheme} &`]: {\n $$color: '$colors$neutral300',\n },\n backgroundColor: '$$color',\n\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", "import 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 { i18n } from '@lingui/core';\nimport {\n Button,\n Divider,\n Image,\n MessageBox,\n SelectableWallet,\n Typography,\n WalletState,\n} from '@rango-dev/ui';\nimport React, { useEffect, useState } from 'react';\n\nimport { useWallets } from '../..';\nimport { WIDGET_UI_ID } from '../../constants';\nimport { useWalletList } from '../../hooks/useWalletList';\nimport {\n TIME_TO_CLOSE_MODAL,\n TIME_TO_IGNORE_MODAL,\n} from '../../pages/WalletsPage';\nimport { useAppStore } from '../../store/AppStore';\nimport { useUiStore } from '../../store/ui';\nimport { useWalletsStore } from '../../store/wallets';\nimport { getBlockchainDisplayNameFor } from '../../utils/meta';\nimport {\n getAddress,\n getConciseAddress,\n isExperimentalChain,\n} from '../../utils/wallets';\nimport { WatermarkedModal } from '../common/WatermarkedModal';\nimport { WalletModal } from '../WalletModal';\n\nimport { ShowMoreWallets } from './ConfirmWallets.styles';\nimport {\n LogoContainer,\n Spinner,\n WalletImageContainer,\n} from './WalletList.styles';\n\nconst ACCOUNT_ADDRESS_MAX_CHARACTERS = 7;\nexport function WalletList(props: PropTypes) {\n const { chain, isSelected, selectWallet, limit, onShowMore } = props;\n const { config } = useAppStore();\n const isActiveTab = useUiStore.use.isActiveTab();\n\n const connectedWallets = useWalletsStore.use.connectedWallets();\n const { blockchains } = useAppStore();\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' | 'rejected' | null>(null);\n const { suggestAndConnect } = useWallets();\n let modalTimerId: ReturnType<typeof setTimeout> | null = null;\n const { list, error, handleClick, disconnectConnectingWallets } =\n useWalletList({\n config,\n chain,\n onBeforeConnect: (type) => {\n modalTimerId = setTimeout(() => {\n setOpenWalletStateModal(type);\n }, TIME_TO_IGNORE_MODAL);\n },\n onConnect: () => {\n if (modalTimerId) {\n clearTimeout(modalTimerId);\n }\n setTimeout(() => {\n setOpenWalletStateModal('');\n }, TIME_TO_CLOSE_MODAL);\n },\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 try {\n await suggestAndConnect(wallet.walletType, wallet.chain);\n setAddingExperimentalChainStatus('completed');\n } catch (e) {\n setAddingExperimentalChainStatus('rejected');\n }\n };\n\n useEffect(() => {\n setSortedList((sortedList) => {\n const selectedWalletIndex = list.findIndex((wallet) =>\n isSelected(wallet.type, chain)\n );\n\n if (shouldShowMoreWallets && selectedWalletIndex > 1) {\n return [list[selectedWalletIndex]].concat(\n list.filter((_, index) => index !== selectedWalletIndex)\n );\n }\n return sortedList.map(\n (sortedItem) =>\n list.find((listItem) => listItem.type === sortedItem.type) ??\n sortedItem\n );\n });\n }, [JSON.stringify(list)]);\n\n const modalContainer = document.getElementById(\n WIDGET_UI_ID.SWAP_BOX_ID\n ) as HTMLDivElement;\n\n useEffect(() => {\n let timeout: ReturnType<typeof setTimeout> | null = null;\n if (\n addingExperimentalChainStatus === 'completed' ||\n addingExperimentalChainStatus === 'rejected'\n ) {\n timeout = setTimeout(\n () => setAddingExperimentalChainStatus(null),\n TIME_TO_CLOSE_MODAL\n );\n }\n\n return () => {\n if (timeout) {\n clearTimeout(timeout);\n }\n };\n }, [addingExperimentalChainStatus]);\n\n const handleCloseWalletModal = () => {\n disconnectConnectingWallets();\n setOpenWalletStateModal('');\n };\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\n ? getConciseAddress(address, ACCOUNT_ADDRESS_MAX_CHARACTERS)\n : '';\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 ? i18n.t({\n id: 'Add {chain} chain',\n values: { chain },\n })\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 <React.Fragment key={`${wallet.title}_${blockchainDisplayName}`}>\n <WalletModal\n open={openWalletStateModal === wallet.type}\n onClose={handleCloseWalletModal}\n image={wallet.image}\n state={wallet.state}\n error={error}\n />\n {!!experimentalChainWallet && (\n <WatermarkedModal\n open={!!experimentalChainWallet && showExperimentalChainModal}\n container={modalContainer}\n onClose={() => {\n setExperimentalChainWallet(null);\n }}>\n <MessageBox\n title={i18n.t({\n id: 'Add {blockchainDisplayName} Chain',\n values: { blockchainDisplayName },\n })}\n type=\"warning\"\n description={i18n.t({\n id: 'You should connect a {blockchainDisplayName} supported wallet or choose a different {blockchainDisplayName} address',\n values: { blockchainDisplayName },\n })}>\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 {i18n.t('Confirm')}\n </Button>\n </MessageBox>\n </WatermarkedModal>\n )}\n {addingExperimentalChainStatus && (\n <WatermarkedModal\n open={!!addingExperimentalChainStatus}\n onClose={setAddingExperimentalChainStatus.bind(null, null)}\n container={modalContainer}>\n {addingExperimentalChainStatus === 'in-progress' && (\n <MessageBox\n type=\"loading\"\n title={i18n.t({\n id: 'Add {blockchainDisplayName} Chain',\n values: { blockchainDisplayName },\n })}\n description={i18n.t({\n id: 'You should connect a {blockchainDisplayName} supported wallet or choose a different {blockchainDisplayName} address',\n values: { blockchainDisplayName },\n })}\n icon={\n <LogoContainer>\n <WalletImageContainer>\n <Image src={wallet.image} size={45} />\n </WalletImageContainer>\n <Spinner />\n </LogoContainer>\n }\n />\n )}\n\n {addingExperimentalChainStatus === 'completed' && (\n <MessageBox\n type=\"success\"\n title={i18n.t({\n id: '{blockchainDisplayName} Chain Added',\n values: { blockchainDisplayName },\n })}\n description={i18n.t({\n id: '{blockchainDisplayName} is added to your wallet, you can use it to swap.',\n values: { blockchainDisplayName },\n })}\n />\n )}\n\n {addingExperimentalChainStatus === 'rejected' && (\n <MessageBox\n type=\"error\"\n title={i18n.t('Request Rejected')}\n description={i18n.t({\n id: \"You've rejected adding {blockchainDisplayName} chain to your wallet.\",\n values: { blockchainDisplayName },\n })}\n />\n )}\n\n <Divider direction=\"vertical\" size={32} />\n </WatermarkedModal>\n )}\n <SelectableWallet\n key={wallet.type}\n description={connectedWalletDescription}\n onClick={onClick}\n selected={isSelected(wallet.type, chain)}\n disabled={!isActiveTab}\n {...wallet}\n />\n </React.Fragment>\n );\n })}\n {shouldShowMoreWallets && (\n <ShowMoreWallets selected={false} onClick={onShowMore}>\n <Typography variant=\"label\" size=\"medium\">\n {i18n.t('Show more wallets')}\n <Typography variant=\"label\" size=\"medium\" color=\"$primary\">\n +{numberOfSupportedWallets - (limit ?? 0)}\n </Typography>\n </Typography>\n </ShowMoreWallets>\n )}\n </>\n );\n}\n", "import type { WidgetConfig } from '../types';\nimport type { WalletInfo } from '@rango-dev/ui';\nimport type { BlockchainMeta } from 'rango-sdk';\n\nimport { WalletState } from '@rango-dev/ui';\nimport { useWallets } from '@rango-dev/wallets-react';\nimport {\n KEPLR_COMPATIBLE_WALLETS,\n type WalletType,\n WalletTypes,\n} from '@rango-dev/wallets-shared';\nimport { useCallback, useEffect, useState } from 'react';\n\nimport { useAppStore } from '../store/AppStore';\nimport { useWalletsStore } from '../store/wallets';\nimport { configWalletsToWalletName } from '../utils/providers';\nimport {\n hashWalletsState,\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 = useAppStore().blockchains();\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 (!config?.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 = useCallback(() => {\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 }, [hashWalletsState(wallets)]);\n\n useEffect(() => {\n return () => {\n disconnectConnectingWallets();\n };\n }, []);\n\n /*\n * Atm, we only support default injected wallet for the EVM\n * so we show default wallet when there is no other evm wallet installed\n * but we have ethereum injected\n */\n const shouldShowDefaultInjectedWallet = (wallets: WalletInfo[]) => {\n const isEvmWalletInstalledExceptDefault = wallets.filter(\n (wallet) =>\n wallet.state != WalletState.NOT_INSTALLED &&\n ![WalletTypes.DEFAULT, WalletTypes.WALLET_CONNECT_2].includes(\n wallet.type as WalletTypes\n ) &&\n getWalletInfo(wallet.type).supportedChains.filter(\n (blockchain) => blockchain.type == 'EVM'\n ).length > 0\n );\n return isEvmWalletInstalledExceptDefault.length == 0;\n };\n\n const shouldExcludeWallet = (\n walletType: string,\n chain: string,\n blockchains: BlockchainMeta[]\n ) => {\n return (\n (isExperimentalChain(blockchains, chain) &&\n isExperimentalChainNotAdded(walletType) &&\n !KEPLR_COMPATIBLE_WALLETS.includes(walletType)) ||\n (walletType == WalletTypes.DEFAULT &&\n !shouldShowDefaultInjectedWallet(wallets))\n );\n };\n\n return {\n list: sortedWallets.filter(\n (wallet) => !shouldExcludeWallet(wallet.type, chain ?? '', blockchains)\n ),\n error,\n handleClick,\n disconnectConnectingWallets,\n };\n}\n", "import type { WalletType } from '@rango-dev/wallets-shared';\n\nimport { i18n } from '@lingui/core';\nimport { styled, Typography, Wallet, WalletState } from '@rango-dev/ui';\nimport React, { useState } from 'react';\n\nimport { Layout, PageContainer } from '../components/Layout';\nimport { WalletModal } from '../components/WalletModal';\nimport { useWalletList } from '../hooks/useWalletList';\nimport { useAppStore } from '../store/AppStore';\nimport { useUiStore } from '../store/ui';\nimport { getContainer } from '../utils/common';\n\nconst ListContainer = styled('div', {\n display: 'flex',\n justifyContent: 'space-evenly',\n alignItems: 'center',\n gap: '$10',\n flexWrap: 'wrap',\n paddingTop: '$5',\n height: '100%',\n});\n\nconst Container = styled(PageContainer, {\n textAlign: 'center',\n});\n\nexport const TIME_TO_CLOSE_MODAL = 3_000;\nexport const TIME_TO_IGNORE_MODAL = 300;\n\nexport function WalletsPage() {\n const { config, fetchStatus: fetchMetaStatus } = useAppStore();\n const [openModal, setOpenModal] = useState(false);\n const [selectedWalletType, setSelectedWalletType] = useState<WalletType>('');\n let modalTimerId: ReturnType<typeof setTimeout> | null = null;\n const isActiveTab = useUiStore.use.isActiveTab();\n\n const { list, handleClick, error, disconnectConnectingWallets } =\n useWalletList({\n config,\n onBeforeConnect: (type) => {\n modalTimerId = setTimeout(() => {\n setOpenModal(true);\n setSelectedWalletType(type);\n }, TIME_TO_IGNORE_MODAL);\n },\n onConnect: () => {\n if (modalTimerId) {\n clearTimeout(modalTimerId);\n }\n setTimeout(() => {\n setOpenModal(false);\n }, TIME_TO_CLOSE_MODAL);\n },\n });\n\n const handleCloseWalletModal = () => {\n disconnectConnectingWallets();\n setOpenModal(false);\n };\n\n const selectedWallet = list.find(\n (wallet) => wallet.type === selectedWalletType\n );\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 }}>\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 <Wallet\n key={key}\n {...wallet}\n container={getContainer()}\n onClick={(type) => {\n void handleClick(type);\n }}\n isLoading={fetchMetaStatus === 'loading'}\n disabled={!isActiveTab}\n />\n );\n })}\n <WalletModal\n open={!!openModal}\n onClose={handleCloseWalletModal}\n image={selectedWalletImage}\n state={selectedWalletState}\n error={error}\n />\n </ListContainer>\n </Container>\n </Layout>\n );\n}\n", "import type { PropTypes } from './Layout.types';\nimport type { PendingSwap } from 'rango-types';\nimport type { PropsWithChildren } from 'react';\n\nimport { useManager } from '@rango-dev/queue-manager-react';\nimport { BottomLogo, Divider, Header } from '@rango-dev/ui';\nimport React, { useEffect, useRef } from 'react';\n\nimport { WIDGET_UI_ID } from '../../constants';\nimport { useIframe } from '../../hooks/useIframe';\nimport { isAppLoadedIntoIframe } from '../../hooks/useIframe/useIframe.helpers';\nimport { useNavigateBack } from '../../hooks/useNavigateBack';\nimport { useTheme } from '../../hooks/useTheme';\nimport { useAppStore } from '../../store/AppStore';\nimport { tabManager, useUiStore } from '../../store/ui';\nimport { useWalletsStore } from '../../store/wallets';\nimport { getContainer } from '../../utils/common';\nimport { getPendingSwaps } from '../../utils/queue';\nimport { isFeatureHidden } from '../../utils/settings';\nimport { ActivateTabAlert } from '../common/ActivateTabAlert';\nimport { ActivateTabModal } from '../common/ActivateTabModal';\nimport { BackButton, CancelButton, WalletButton } from '../HeaderButtons';\n\nimport { onScrollContentAttachStatusToContainer } from './Layout.helpers';\nimport { Container, Content, Footer, LayoutContainer } from './Layout.styles';\n\nfunction Layout(props: PropsWithChildren<PropTypes>) {\n const { connectHeightObserver, disconnectHeightObserver } = useIframe();\n const { children, header, footer, height = 'fixed' } = props;\n const connectedWallets = useWalletsStore.use.connectedWallets();\n const {\n config: { features, theme },\n } = useAppStore();\n const { watermark } = useUiStore();\n\n const hasWatermark = watermark === 'FULL';\n const { activeTheme } = useTheme(theme || {});\n\n const isConnectWalletHidden = isFeatureHidden(\n 'connectWalletButton',\n features\n );\n\n const {\n isActiveTab,\n tabManagerInitiated,\n showActivateTabModal,\n setShowActivateTabModal,\n activateCurrentTab,\n } = useUiStore();\n const navigateBack = useNavigateBack();\n const { manager } = useManager();\n const pendingSwaps: PendingSwap[] = getPendingSwaps(manager).map(\n ({ swap }) => swap\n );\n const hasRunningSwap = pendingSwaps.some((swap) => swap.status === 'running');\n\n const onActivateTab = () =>\n activateCurrentTab(tabManager.forceClaim, hasRunningSwap);\n\n const onConnectWallet = () => {\n header.onWallet?.();\n };\n\n const showBackButton =\n typeof header.hasBackButton === 'undefined' || header.hasBackButton;\n\n const scrollViewRef = useRef<HTMLDivElement>(null);\n const containerRef = useRef<HTMLDivElement>(null);\n\n useEffect(() => {\n const isIframe = isAppLoadedIntoIframe();\n\n // This feature only will be available in an iframe context.\n if (isIframe && containerRef.current) {\n connectHeightObserver(containerRef.current);\n }\n\n return () => {\n disconnectHeightObserver();\n };\n }, []);\n\n useEffect(() => {\n scrollViewRef.current?.addEventListener(\n 'scroll',\n onScrollContentAttachStatusToContainer\n );\n return () => {\n scrollViewRef.current?.removeEventListener(\n 'scroll',\n onScrollContentAttachStatusToContainer\n );\n };\n }, []);\n\n return (\n <Container\n height={height}\n id={WIDGET_UI_ID.SWAP_BOX_ID}\n className={`${activeTheme()} ${LayoutContainer()}`}\n ref={containerRef}>\n <Header\n prefix={\n <>\n {showBackButton && (\n <BackButton\n onClick={() => {\n navigateBack();\n // As an example, used in routes page to add a custom logic when navigating back to the home page.\n header.onBack && header.onBack();\n }}\n />\n )}\n </>\n }\n title={header.title}\n suffix={\n <>\n {header.suffix}\n {header.onWallet && !isConnectWalletHidden && (\n <WalletButton\n container={getContainer()}\n onClick={onConnectWallet}\n isConnected={!!connectedWallets?.length}\n />\n )}\n {header.onCancel && <CancelButton onClick={header.onCancel} />}\n </>\n }\n />\n <Content ref={scrollViewRef}>{children}</Content>\n <ActivateTabModal\n open={showActivateTabModal}\n onClose={() => setShowActivateTabModal(false)}\n onConfirm={onActivateTab}\n />\n\n <Footer>\n <div className=\"footer__content\">\n {tabManagerInitiated && !isActiveTab && (\n <div className=\"footer__alert\">\n <ActivateTabAlert onActivateTab={onActivateTab} />\n <Divider size={10} />\n </div>\n )}\n {footer}\n </div>\n\n <Divider size={12} />\n\n <div\n className={`footer__logo ${\n hasWatermark ? 'logo__show' : 'logo__hidden'\n }`}>\n <BottomLogo />\n </div>\n </Footer>\n </Container>\n );\n}\nexport { Layout };\n", "import type { Messages } from './useIframe.types';\n\nimport { useRef } from 'react';\n\nimport { useAppStore } from '../../store/AppStore';\n\nimport { isAppLoadedIntoIframe } from './useIframe.helpers';\n\ninterface UseIframe {\n send: (message: Messages) => void;\n connectHeightObserver: (element: HTMLElement) => void;\n disconnectHeightObserver: () => void;\n}\n\nfunction useIframe(): UseIframe {\n const heightObserver = useRef<ResizeObserver | null>(null);\n const { iframe } = useAppStore();\n const isMessagePassingAvailable = isAppLoadedIntoIframe() && iframe.clientUrl;\n\n const send = (message: Messages) => {\n if (isMessagePassingAvailable) {\n window.top?.postMessage(message, iframe.clientUrl!);\n }\n };\n\n const connectHeightObserver = (element: HTMLElement) => {\n heightObserver.current = new ResizeObserver((entries) => {\n for (const entry of entries) {\n send({\n type: 'widget_height',\n data: {\n height: entry.contentRect.height,\n },\n });\n }\n });\n\n heightObserver.current.observe(element);\n };\n\n const disconnectHeightObserver = () => {\n if (heightObserver.current) {\n heightObserver.current.disconnect();\n heightObserver.current = null;\n }\n };\n\n return {\n send,\n connectHeightObserver,\n disconnectHeightObserver,\n };\n}\n\nexport { useIframe };\n", "export function isAppLoadedIntoIframe() {\n return window.self !== window.top;\n}\n", "import { useNavigate } from 'react-router-dom';\n\nexport function useNavigateBack(): () => void {\n const navigate = useNavigate();\n return () => navigate(-1);\n}\n", "/* eslint-disable @typescript-eslint/no-magic-numbers */\nimport {\n createTheme,\n darkTheme as defaultDarkTheme,\n lightTheme as defaultLightTheme,\n} from '@rango-dev/ui';\nimport { useEffect, useState } from 'react';\n\nimport { useAppStore } from '../store/AppStore';\nimport { type WidgetTheme } from '../types';\nimport {\n DEFAULT_FONT_FAMILY,\n DEFAULT_PRIMARY_RADIUS,\n DEFAULT_SECONDARY_RADIUS,\n} from '../utils/configs';\nimport { customizedThemeTokens } from '../utils/ui';\n\nexport function useTheme(props: WidgetTheme) {\n const {\n colors,\n fontFamily = DEFAULT_FONT_FAMILY,\n borderRadius = DEFAULT_PRIMARY_RADIUS,\n secondaryBorderRadius = DEFAULT_SECONDARY_RADIUS,\n mode = 'auto',\n } = props;\n\n const [OSTheme, setOSTheme] = useState('light');\n\n const { setTheme, theme } = useAppStore();\n\n const { dark, light } = customizedThemeTokens(colors);\n\n const baseTheme = createTheme({\n radii: {\n primary: `${borderRadius}px`,\n secondary: `${secondaryBorderRadius}px`,\n },\n fonts: {\n widget: fontFamily,\n },\n });\n const lightThemeClasses = [baseTheme.className, defaultLightTheme.className];\n const darkThemeClasses = [baseTheme.className, defaultDarkTheme.className];\n\n /*\n * If theme has been customized, we will push the customized theme to override the default themes.\n * To be overridden, it should be last thing that has been pushed.\n */\n if (light) {\n const customizedLightTheme = createTheme(light.id, light.tokens);\n lightThemeClasses.push(customizedLightTheme.className);\n }\n if (dark) {\n const customizedDarkTheme = createTheme(dark.id, dark.tokens);\n darkThemeClasses.push(customizedDarkTheme.className);\n }\n\n useEffect(() => {\n const switchThemeListener = (event: MediaQueryListEvent) => {\n if (event.matches) {\n setOSTheme('dark');\n } else {\n setOSTheme('light');\n }\n };\n\n if (\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', switchThemeListener);\n return () => {\n window\n .matchMedia('(prefers-color-scheme: dark)')\n .removeEventListener('change', switchThemeListener);\n };\n }, []);\n\n useEffect(() => {\n if (mode !== 'auto') {\n setTheme(mode);\n }\n }, [mode]);\n\n const getActiveTheme = () => {\n const lightClassNames = lightThemeClasses.join(' ');\n const darkClassNames = darkThemeClasses.join(' ');\n if (theme === 'auto') {\n return OSTheme === 'dark' ? darkClassNames : lightClassNames;\n }\n return theme === 'dark' ? darkClassNames : lightClassNames;\n };\n\n return { activeTheme: getActiveTheme };\n}\n", "/* eslint-disable @typescript-eslint/no-magic-numbers */\nimport type { WidgetTheme } from '../types';\nimport type { createTheme } from '@rango-dev/ui';\n\nimport {\n theme as baseThemeTokens,\n darkColors as defaultDarkColors,\n} from '@rango-dev/ui';\nimport React from 'react';\n\nimport { generateColors } from '../utils/colors';\nimport { toHash } from '../utils/hash';\n\nimport { THEME_CLASS_NAME_PREFIX } from './configs';\n\ninterface CustomizedThemeValues {\n id: string;\n tokens: Parameters<typeof createTheme>[0];\n}\n\ninterface CustomizedTheme {\n light: undefined | CustomizedThemeValues;\n dark: undefined | CustomizedThemeValues;\n}\n\nexport function customizedThemeTokens(\n colors: WidgetTheme['colors']\n): CustomizedTheme {\n const baseColors = baseThemeTokens.colors;\n\n const darkColorsWithDefaults = generateColors(\n {\n ...baseColors,\n ...defaultDarkColors,\n },\n true,\n colors?.dark\n );\n const lightColorsWithDefaults = generateColors(\n baseColors,\n false,\n colors?.light\n );\n const hasDefaultDarkColors = Object.keys(darkColorsWithDefaults).length > 0;\n const hasDefaultLightColors = Object.keys(lightColorsWithDefaults).length > 0;\n\n let light: CustomizedTheme['light'] = undefined;\n let dark: CustomizedTheme['dark'] = undefined;\n\n if (hasDefaultLightColors) {\n const tokens = { colors: lightColorsWithDefaults };\n const id = `${THEME_CLASS_NAME_PREFIX}-light-${toHash(tokens)}`;\n light = {\n id,\n tokens,\n };\n }\n if (hasDefaultDarkColors) {\n const tokens = {\n colors: darkColorsWithDefaults,\n };\n const id = `${THEME_CLASS_NAME_PREFIX}-dark-${toHash(tokens)}`;\n dark = {\n id,\n tokens,\n };\n }\n\n return {\n light,\n dark,\n };\n}\n\nexport function joinList(\n list: { element: React.JSX.Element; key: string }[],\n divider: React.JSX.Element\n) {\n if (list.length <= 1) {\n return list.map(({ element, key }) => React.cloneElement(element, { key }));\n }\n\n const output: React.JSX.Element[] = [];\n list.forEach((item, index) => {\n const { element, key } = item;\n output.push(React.cloneElement(element, { key }));\n if (index < list.length - 1) {\n const key = `divider-${index}`;\n output.push(React.cloneElement(divider, { key }));\n }\n });\n\n return output;\n}\n", "import type { WidgetColors, WidgetColorsKeys } from '../types';\n\nexport function generateShades(\n baseColor: string,\n prefix: string,\n reverse?: boolean\n): { [key: string]: string } {\n const BASE_SHADE_INDEX = 100;\n const NUMBER_OF_COLORS = 9;\n const SHADING_INCREMENT_MAX = 10; // For bright colors\n const SHADING_INCREMENT_MIN = 6; // For dark colors\n\n const HALF_NUMBER_OF_COLORS = 4;\n\n const shadeIncrements: number[] = [];\n let increment = 90;\n for (let i = 0; i < NUMBER_OF_COLORS; i++) {\n shadeIncrements.push(increment);\n if (i + 1 === HALF_NUMBER_OF_COLORS) {\n increment = 0;\n } else {\n increment -=\n i >= HALF_NUMBER_OF_COLORS\n ? SHADING_INCREMENT_MIN\n : SHADING_INCREMENT_MAX;\n }\n }\n\n // If 'reverse' is true, that means the color should be from dark to light\n const decrementAmounts = reverse\n ? shadeIncrements.slice().reverse()\n : shadeIncrements;\n\n const shades: { [key: string]: string } = {};\n\n // Generate shades\n for (let i = 0; i < NUMBER_OF_COLORS; i++) {\n const shadeIndex = BASE_SHADE_INDEX + i * BASE_SHADE_INDEX;\n const decrementAmount = decrementAmounts[i];\n\n const shade: { [key: string]: string } = {\n [`${prefix}${shadeIndex}`]: generateShade(baseColor, decrementAmount),\n };\n Object.assign(shades, shade);\n }\n\n return { ...shades, [prefix]: baseColor };\n}\n\nexport function generateShade(\n baseColor: string,\n decrementAmount: number\n): string {\n const [r, g, b] = convertToRGB(baseColor);\n return `#${clamp(r + decrementAmount)}${clamp(g + decrementAmount)}${clamp(\n b + decrementAmount\n )}`;\n}\n\nexport function convertToRGB(baseColor: string): number[] {\n const COLOR_SLICE_START = 1;\n const COLOR_SLICE_END = 3;\n const BASE_COLOR_LENGTH = 7;\n\n // Convert the base color to RGB components\n const r: number = parseInt(\n baseColor.slice(COLOR_SLICE_START, COLOR_SLICE_END),\n 16\n );\n const g: number = parseInt(\n baseColor.slice(COLOR_SLICE_END, COLOR_SLICE_END + 2),\n 16\n );\n const b: number = parseInt(\n baseColor.slice(COLOR_SLICE_END + 2, BASE_COLOR_LENGTH),\n 16\n );\n\n return [r, g, b];\n}\n\n// Function to clamp color component to valid range [0, 255] and convert to hex\nfunction clamp(color: number): string {\n const MAX_COLOR_VALUE = 255;\n const HEX_BASE = 16;\n const HEX_LENGTH = -2;\n return (\n '0' + Math.max(0, Math.min(MAX_COLOR_VALUE, color)).toString(HEX_BASE)\n )\n .slice(HEX_LENGTH)\n .toUpperCase();\n}\n\nexport function isBright(baseColor: string) {\n const BRIGHTNESS_THRESHOLD = 188;\n const RED_COEFFICIENT = 299;\n const GREEN_COEFFICIENT = 587;\n const BLUE_COEFFICIENT = 114;\n const BRIGHTNESS_DIVISOR = 1000;\n\n const [r, g, b] = convertToRGB(baseColor);\n const brightness =\n (r * RED_COEFFICIENT + g * GREEN_COEFFICIENT + b * BLUE_COEFFICIENT) /\n BRIGHTNESS_DIVISOR;\n if (brightness > BRIGHTNESS_THRESHOLD) {\n return true;\n }\n return false;\n}\n\nexport const generateColors = (\n mainColors: { [x: string]: string },\n reverseNeutralRange: boolean,\n colors?: WidgetColors\n) => {\n if (!colors || !Object.entries(colors).length) {\n return {};\n }\n let changeColors = false;\n let listOfColors = { ...mainColors };\n for (const colorKey in colors) {\n const color = colors[colorKey as WidgetColorsKeys];\n\n if (!!color && color !== mainColors[colorKey]) {\n changeColors = true;\n if (colorKey === 'background' || colorKey === 'foreground') {\n listOfColors = {\n ...listOfColors,\n [colorKey]: color,\n };\n } else {\n const reverse = colorKey === 'neutral' && reverseNeutralRange;\n listOfColors = {\n ...listOfColors,\n ...generateShades(color, colorKey, reverse),\n };\n }\n }\n }\n return changeColors ? listOfColors : {};\n};\n", "/* eslint-disable @typescript-eslint/no-magic-numbers */\n// Original Code: https://github.com/stitchesjs/stitches/blob/canary/packages/core/src/convert/toHash.js\n\nconst toAlphabeticChar = (code: number) =>\n String.fromCharCode(code + (code > 25 ? 39 : 97));\n\nconst toAlphabeticName = (code: number) => {\n let name = '';\n let x;\n\n for (x = Math.abs(code); x > 52; x = (x / 52) | 0) {\n name = toAlphabeticChar(x % 52) + name;\n }\n\n return toAlphabeticChar(x % 52) + name;\n};\n\nconst toPhash = (h: number, x: string) => {\n let i = x.length;\n while (i) {\n h = (h * 33) ^ x.charCodeAt(--i);\n }\n return h;\n};\n\nexport const toHash = (value: object) =>\n toAlphabeticName(toPhash(5381, JSON.stringify(value)) >>> 0);\n", "import type { Manager } from '@rango-dev/queue-manager-core';\nimport type {\n PendingSwapWithQueueID,\n SwapStorage,\n} from '@rango-dev/queue-manager-rango-preset';\n\nexport const getPendingSwaps = (manager: Manager | undefined) => {\n const result: PendingSwapWithQueueID[] = [];\n\n manager?.getAll().forEach((q, id) => {\n const storage = q.list.getStorage() as SwapStorage;\n\n if (storage?.swapDetails) {\n result.push({\n id,\n swap: storage?.swapDetails,\n });\n }\n });\n\n return result.sort(\n (a, b) => Number(b.swap.creationTime) - Number(a.swap.creationTime)\n );\n};\n", "import type { PropTypes } from './ActivateTabAlert.types';\n\nimport { i18n } from '@lingui/core';\nimport { Alert, Button } from '@rango-dev/ui';\nimport React from 'react';\n\nexport function ActivateTabAlert(props: PropTypes) {\n return (\n <Alert\n action={\n <Button\n onClick={props.onActivateTab}\n variant=\"contained\"\n size=\"xxsmall\"\n type=\"warning\">\n {i18n.t('Activate this tab')}\n </Button>\n }\n type=\"warning\"\n variant=\"alarm\"\n title={i18n.t('Another tab is open and handles transactions.')}\n />\n );\n}\n", "import type { PropTypes } from './ActivateTabModal.types';\n\nimport { i18n } from '@lingui/core';\nimport { Button, Divider, MessageBox } from '@rango-dev/ui';\nimport React from 'react';\n\nimport { getContainer } from '../../../utils/common';\nimport { WatermarkedModal } from '../WatermarkedModal';\n\nexport function ActivateTabModal(props: PropTypes) {\n const { open, onClose, onConfirm } = props;\n\n return (\n <WatermarkedModal\n open={open}\n dismissible\n onClose={onClose}\n container={getContainer()}>\n <MessageBox\n title={i18n.t('Activate current tab')}\n type=\"warning\"\n description={i18n.t(\n 'Currently, some transactions are running and being handled by other browser tab. If you activate this tab, all transactions that are already in the transaction sign step will expire.'\n )}>\n <Divider size={20} />\n <Button\n variant=\"contained\"\n size=\"large\"\n type=\"primary\"\n fullWidth\n onClick={onConfirm}>\n {i18n.t('Confirm')}\n </Button>\n </MessageBox>\n </WatermarkedModal>\n );\n}\n", "import type { PropTypes } from './HeaderButtons.types';\n\nimport { ChevronLeftIcon } from '@rango-dev/ui';\nimport React from 'react';\n\nimport { HeaderButton } from './HeaderButtons.styles';\n\nfunction BackButton(props: PropTypes) {\n return (\n <HeaderButton variant=\"ghost\" size=\"small\" onClick={props.onClick}>\n <ChevronLeftIcon color=\"black\" size={16} />\n </HeaderButton>\n );\n}\n\nexport { BackButton };\n", "import { css, darkTheme, IconButton, styled } from '@rango-dev/ui';\n\nexport const HeaderButton = styled(IconButton, {\n width: '$24',\n position: 'relative',\n padding: '0',\n overflow: 'unset',\n '&:hover': {\n backgroundColor: '$info100',\n [`.${darkTheme} &`]: {\n backgroundColor: '$neutral',\n },\n },\n});\n\nexport const ConnectedIcon = styled('div', {\n position: 'absolute',\n background: '$secondary500',\n [`.${darkTheme} &`]: {\n $$color: '$colors$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 minWidth: '$40',\n button: {\n padding: 0,\n },\n});\n\nexport const NotificationsBadgeContainer = styled('div', {\n position: 'absolute',\n width: '14px',\n height: '14px',\n display: 'flex',\n justifyContent: 'center',\n alignItems: 'center',\n borderRadius: '7px',\n top: '$0',\n right: '$0',\n variants: {\n isSever: {\n true: {\n backgroundColor: '$error500',\n },\n false: {\n backgroundColor: '$secondary500',\n },\n },\n },\n});\n\nexport const ProgressIcon = styled('div', {\n padding: '$2',\n variants: {\n isRefetched: {\n true: {\n transform: `rotate(360deg)`,\n transition: 'transform 1s ease-in-out',\n },\n },\n },\n});\n\nexport const InProgressTransactionBadgeContainer = styled('div', {\n position: 'absolute',\n right: '$4',\n top: '$4',\n backgroundColor: '$background',\n borderRadius: '100%',\n});\n\nexport const rowStyles = css({\n display: 'flex',\n flexDirection: 'row',\n justifyContent: 'center',\n alignItems: 'center',\n});\n\nexport const WalletImageContainer = styled('div', {\n borderRadius: '100%',\n border: '1.5px transparent solid',\n '&:not(:first-child)': {\n marginLeft: '-$6',\n },\n img: {\n borderRadius: '100%',\n },\n});\n", "import type { PropTypes } from './HeaderButtons.types';\n\nimport { i18n } from '@lingui/core';\nimport { Button, Typography } from '@rango-dev/ui';\nimport React from 'react';\n\nimport { SuffixContainer } from './HeaderButtons.styles';\n\nfunction CancelButton(props: PropTypes) {\n return (\n <SuffixContainer>\n <Button 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 { Image, Tooltip, WalletIcon } from '@rango-dev/ui';\nimport React from 'react';\n\nimport { useWalletList } from '../../hooks/useWalletList';\n\nimport {\n ConnectedIcon,\n HeaderButton,\n rowStyles,\n WalletImageContainer,\n} from './HeaderButtons.styles';\n\nfunction WalletButton(props: PropTypes) {\n const { list } = useWalletList({});\n const connectedWallets = list.filter(\n (wallet) => wallet.state === 'connected'\n );\n const content = !connectedWallets.length ? (\n i18n.t('Connect Wallet')\n ) : (\n <div className={rowStyles()}>\n {connectedWallets.map((wallet) => (\n <WalletImageContainer key={wallet.title}>\n <Image src={wallet.image} size={14} />\n </WalletImageContainer>\n ))}\n </div>\n );\n\n return (\n <Tooltip container={props.container} side=\"bottom\" content={content}>\n <HeaderButton 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 { HeaderButtonsPropTypes } from './HeaderButtons.types';\n\nimport { i18n } from '@lingui/core';\nimport {\n NotificationsIcon,\n Popover,\n SettingsIcon,\n Tooltip,\n TransactionIcon,\n} from '@rango-dev/ui';\nimport React from 'react';\n\nimport { useAppStore } from '../../store/AppStore';\nimport { getContainer } from '../../utils/common';\nimport { isFeatureHidden } from '../../utils/settings';\nimport { NotificationContent } from '../NotificationContent';\n\nimport { HeaderButton } from './HeaderButtons.styles';\nimport InProgressTransactionBadge from './InProgressTransactionBadge';\nimport { RefreshButton } from './RefreshButton';\nimport { UnreadNotificationsBadge } from './UnreadNotificationsBadge';\n\nexport function HeaderButtons(props: HeaderButtonsPropTypes) {\n const {\n onClickRefresh,\n onClickHistory,\n onClickSettings,\n hidden = [],\n } = props;\n\n const {\n config: { features },\n } = useAppStore();\n\n const isNotificationsHidden =\n isFeatureHidden('notification', features) ||\n hidden.includes('notifications');\n\n return (\n <>\n {!hidden.includes('refresh') && (\n <Tooltip\n container={getContainer()}\n side=\"top\"\n content={i18n.t('Refresh')}>\n <RefreshButton onClick={onClickRefresh} />\n </Tooltip>\n )}\n\n {!isNotificationsHidden && (\n <Popover\n align=\"end\"\n alignOffset={-88}\n collisionPadding={{ right: 20, left: 20 }}\n container={getContainer()}\n content={<NotificationContent />}>\n <div>\n <Tooltip\n container={getContainer()}\n side=\"top\"\n content={i18n.t('Notifications')}>\n <HeaderButton size=\"small\" variant=\"ghost\">\n <NotificationsIcon size={18} color=\"black\" />\n <UnreadNotificationsBadge />\n </HeaderButton>\n </Tooltip>\n </div>\n </Popover>\n )}\n {!hidden.includes('settings') && (\n <Tooltip\n container={getContainer()}\n side=\"top\"\n content={i18n.t('Settings')}>\n <HeaderButton size=\"small\" variant=\"ghost\" onClick={onClickSettings}>\n <SettingsIcon size={18} color=\"black\" />\n </HeaderButton>\n </Tooltip>\n )}\n {!hidden.includes('history') && (\n <Tooltip\n container={getContainer()}\n side=\"top\"\n content={i18n.t('Transactions History')}>\n <HeaderButton size=\"small\" variant=\"ghost\" onClick={onClickHistory}>\n <TransactionIcon size={18} color=\"black\" />\n <InProgressTransactionBadge />\n </HeaderButton>\n </Tooltip>\n )}\n </>\n );\n}\n", "import type { Notification } from '../../types/notification';\n\nimport { i18n } from '@lingui/core';\nimport { EventSeverity } from '@rango-dev/queue-manager-rango-preset';\nimport {\n ChainToken,\n ChevronRightIcon,\n Divider,\n Typography,\n} from '@rango-dev/ui';\nimport React from 'react';\nimport { useNavigate } from 'react-router-dom';\n\nimport { navigationRoutes } from '../../constants/navigationRoutes';\nimport { useAppStore } from '../../store/AppStore';\nimport { useNotificationStore } from '../../store/notification';\nimport { areTokensEqual } from '../../utils/wallets';\n\nimport {\n Container,\n Images,\n List,\n ListItem,\n} from './NotificationContent.styles';\nimport { NotificationNotFound } from './NotificationNotFound';\n\nconst MAX_NOTIFICATIONS_DISPLAYED = 4;\n\nexport function NotificationContent() {\n const navigate = useNavigate();\n\n const { getUnreadNotifications } = useNotificationStore();\n\n const notifications: Notification[] = getUnreadNotifications();\n const blockchains = useAppStore().blockchains();\n const tokens = useAppStore().tokens();\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 navigate(`${navigationRoutes.swaps}/${requestId}`);\n };\n\n return (\n <Container>\n {sortedNotification.length ? (\n <List>\n {sortedNotification.map((notificationItem, index) => {\n const { route, requestId, event } = notificationItem;\n const fromToken = tokens.find((tokenItem) =>\n areTokensEqual(tokenItem, route.from)\n );\n\n const fromBlockchain = blockchains.find(\n (blockchainItem) => blockchainItem.name === route.from.blockchain\n );\n\n const toToken = tokens.find((tokenItem) =>\n areTokensEqual(tokenItem, route.to)\n );\n\n const toBlockchain = blockchains.find(\n (blockchainItem) => blockchainItem.name === route.to.blockchain\n );\n\n return (\n <React.Fragment key={requestId}>\n {index > 0 && <Divider size={4} />}\n <ListItem\n onClick={() => handleOnClick(requestId)}\n actionRequired={\n event.messageSeverity === EventSeverity.WARNING\n }\n title={\n <Typography\n variant=\"body\"\n size=\"small\"\n color={\n event.messageSeverity === EventSeverity.WARNING\n ? '$foreground'\n : '$neutral700'\n }>\n {i18n.t(event.message)}\n </Typography>\n }\n id={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 </React.Fragment>\n );\n })}\n </List>\n ) : (\n <NotificationNotFound />\n )}\n </Container>\n );\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 address: fromStep.fromSymbolAddress,\n symbol: fromStep.fromSymbol,\n },\n to: {\n blockchain: toStep.toBlockchain,\n address: toStep.toSymbolAddress,\n symbol: toStep.toSymbol,\n },\n },\n };\n\n const excludedList = get().notifications.filter(\n (notificationItem) => notificationItem.requestId !== route.requestId\n );\n\n set(() => ({\n notifications: [...excludedList, notification],\n }));\n },\n 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 { darkTheme, ListItemButton, styled } from '@rango-dev/ui';\n\nexport const Container = styled('div', {\n padding: '$10',\n width: '350px',\n maxWidth: '90vw',\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 ListItem = styled(ListItemButton, {\n variants: {\n actionRequired: {\n true: {\n backgroundColor: '$error300',\n [`.${darkTheme} &`]: {\n backgroundColor: '$error600',\n },\n },\n },\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=\"neutral700\">\n {i18n.t('There are no notifications.')}\n </Typography>\n </NotFoundContainer>\n );\n}\n", "import type { PendingSwap } from 'rango-types';\n\nimport { useManager } from '@rango-dev/queue-manager-react';\nimport { InProgressIcon } from '@rango-dev/ui';\nimport React from 'react';\n\nimport { getPendingSwaps } from '../../utils/queue';\n\nimport { InProgressTransactionBadgeContainer } from './HeaderButtons.styles';\n\nconst InProgressTransactionBadge = () => {\n const { manager } = useManager();\n const list: PendingSwap[] = getPendingSwaps(manager).map(({ swap }) => swap);\n\n if (!list.find((swap) => swap.status === 'running')) {\n return null;\n }\n\n return (\n <InProgressTransactionBadgeContainer>\n <InProgressIcon color=\"info\" size={6} />\n </InProgressTransactionBadgeContainer>\n );\n};\n\nexport default InProgressTransactionBadge;\n", "import { RefreshProgressButton } from '@rango-dev/ui';\nimport React, { useEffect, useState } from 'react';\n\nimport { HeaderButton, ProgressIcon } from './HeaderButtons.styles';\n\nconst REFRESH_INTERVAL = 1000;\nconst MAX_ELAPSED_TIME = 60;\nconst MAX_PERCENTAGE = 100;\n\nfunction RefreshButton({ onClick }: { onClick: (() => void) | undefined }) {\n const [elapsedTime, setElapsedTime] = useState(0);\n const [isRefetched, setIsRefetched] = useState(false);\n\n const handleVisibilityChange = (interval?: number) => {\n if (document.hidden && interval) {\n // Tab is inactive, clear the interval\n clearTimeout(interval);\n }\n };\n\n useEffect(() => {\n let interval: number | undefined;\n if (onClick) {\n interval = window.setInterval(() => {\n setElapsedTime((prevTime) => prevTime + 1);\n\n if (elapsedTime === MAX_ELAPSED_TIME) {\n handleRefreshClick();\n }\n }, REFRESH_INTERVAL);\n } else {\n clearTimeout(interval);\n }\n\n document.addEventListener('visibilitychange', () =>\n handleVisibilityChange(interval)\n );\n\n return () => {\n document.removeEventListener('visibilitychange', () =>\n handleVisibilityChange(interval)\n );\n if (interval) {\n clearInterval(interval);\n }\n };\n }, [elapsedTime, onClick]);\n\n const clearTimeout = (interval?: number) => {\n if (interval) {\n clearInterval(interval);\n }\n setElapsedTime(0);\n };\n\n const handleRefreshClick = () => {\n onClick?.();\n setElapsedTime(0);\n setIsRefetched(true);\n };\n\n return (\n <HeaderButton\n variant=\"ghost\"\n size=\"small\"\n style={{ paddingTop: 0, paddingBottom: 0 }}\n onClick={handleRefreshClick}\n disabled={!onClick}>\n <ProgressIcon\n onTransitionEnd={() => setIsRefetched(false)}\n isRefetched={isRefetched}>\n <RefreshProgressButton\n size={22}\n color={!onClick ? 'gray' : 'black'}\n progress={(elapsedTime / MAX_ELAPSED_TIME) * MAX_PERCENTAGE}\n />\n </ProgressIcon>\n </HeaderButton>\n );\n}\n\nexport { RefreshButton };\n", "import { EventSeverity } from '@rango-dev/queue-manager-rango-preset';\nimport { Typography } from '@rango-dev/ui';\nimport React from 'react';\n\nimport { useNotificationStore } from '../../store/notification';\n\nimport { NotificationsBadgeContainer } from './HeaderButtons.styles';\n\nexport function UnreadNotificationsBadge() {\n const { getUnreadNotifications } = useNotificationStore();\n\n const notificationsList = getUnreadNotifications();\n\n const notificationsCount = notificationsList.length;\n\n const hasSeverNotification = !!notificationsList.find(\n (notificationItem) =>\n notificationItem.event.messageSeverity === EventSeverity.WARNING\n );\n\n return notificationsCount ? (\n <NotificationsBadgeContainer isSever={hasSeverNotification}>\n <Typography variant=\"body\" size=\"xsmall\" color=\"$background\">\n {notificationsCount}\n </Typography>\n </NotificationsBadgeContainer>\n ) : null;\n}\n", "import { getContainer } from '../../utils/common';\n\nexport function onScrollContentAttachStatusToContainer(e: Event) {\n const contentElement = e.target as HTMLElement | null;\n\n if (contentElement) {\n const fromTop = contentElement.scrollTop;\n const container = getContainer();\n\n if (fromTop > 1) {\n container.classList.add('rng-scrolled');\n } else {\n container.classList.remove('rng-scrolled');\n }\n }\n}\n", "import { css, styled } from '@rango-dev/ui';\n\nconst WIDGET_HEIGHT = '700px';\n\nexport const LayoutContainer = css({\n borderRadius: '$primary',\n display: 'flex',\n flexDirection: 'column',\n overflow: 'hidden',\n boxShadow: '15px 15px 15px 0px rgba(0, 0, 0, 0.05)',\n});\n\nexport const Container = styled('div', {\n position: 'relative',\n width: '100vw',\n minWidth: '300px',\n maxWidth: '390px',\n backgroundColor: '$background',\n variants: {\n height: {\n auto: {\n height: 'auto',\n maxHeight: WIDGET_HEIGHT,\n },\n fixed: {\n height: WIDGET_HEIGHT,\n },\n },\n },\n});\n\nexport const Content = styled('div', {\n position: 'relative',\n overflow: 'hidden',\n flexGrow: 1,\n display: 'flex',\n flexDirection: 'column',\n padding: 0,\n overflowY: 'auto',\n});\n\nexport const Footer = styled('div', {\n padding: '0 $20 $10',\n '& .footer__alert': {\n paddingTop: '$10',\n },\n '& .footer__logo': {\n opacity: 0,\n transition: 'opacity 1s ease-in-out',\n '&.logo__show': {\n opacity: 1,\n },\n '&.logo__hidden': {\n visibility: 'hidden',\n },\n },\n});\n", "import { styled } from '@rango-dev/ui';\n\nconst CONTENT_PADDING = '$20 $20 $10 $20';\n\nconst ScrollableArea = styled('div', {\n padding: CONTENT_PADDING,\n overflowY: 'auto',\n flexGrow: 1,\n});\n\nexport { ScrollableArea, CONTENT_PADDING };\n", "import { styled } from '@rango-dev/ui';\n\nconst PageContainer = styled('div', {\n display: 'flex',\n flexDirection: 'column',\n padding: '20px 20px 10px',\n flexGrow: 1,\n\n variants: {\n view: {\n true: {\n flexGrow: 1,\n overflow: 'hidden',\n },\n },\n compact: {\n true: {\n padding: 0,\n },\n },\n },\n});\n\nexport { PageContainer };\n", "import type { PropTypes } from './WalletModal.types';\n\nimport { Divider } from '@rango-dev/ui';\nimport React from 'react';\n\nimport { WIDGET_UI_ID } from '../../constants';\nimport { WatermarkedModal } from '../common/WatermarkedModal';\n\nimport { ModalContent } from './WalletModalContent';\n\nexport function WalletModal(props: PropTypes) {\n const { open, onClose, ...otherProps } = props;\n\n return (\n <WatermarkedModal\n open={open}\n onClose={onClose}\n container={\n document.getElementById(WIDGET_UI_ID.SWAP_BOX_ID) || document.body\n }>\n <ModalContent {...otherProps} />\n <Divider direction=\"vertical\" size={32} />\n </WatermarkedModal>\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 { keyframes, styled } from '@rango-dev/ui';\n\nexport const LogoContainer = styled('div', {\n position: 'relative',\n});\n\nconst SpinAnimation = keyframes({\n '0%': {\n transform: 'rotate(0deg)',\n },\n '100%': {\n transform: 'rotate(360deg)',\n },\n});\n\nexport const Spinner = styled('div', {\n position: 'absolute',\n border: '2px solid rgba(0, 0, 0, 0.1)',\n borderTop: '2px solid $info500',\n borderRadius: '$lg',\n width: '$45',\n height: '$45',\n animation: `${SpinAnimation} 1s linear infinite`,\n top: 0,\n bottom: 0,\n right: 0,\n left: 0,\n});\n\nexport const WalletImageContainer = styled('div', {\n '& img': {\n borderRadius: '50%',\n },\n});\n", "import type { PropTypes } from './QuoteWarningsAndErrors.types';\n\nimport { i18n } from '@lingui/core';\nimport { Alert, Button, InfoIcon } from '@rango-dev/ui';\nimport React from 'react';\n\nimport { QuoteErrorType, QuoteWarningType } from '../../types';\nimport { NoResult } from '../NoResult';\n\nimport { HighValueLossWarningModal } from './HighValueLossWarningModal';\nimport { makeAlerts } from './QuoteWarningsAndErrors.helpers';\nimport { Action, Alerts } from './QuoteWarningsAndErrors.styles';\nimport { SlippageWarningModal } from './SlippageWariningModal';\nimport { UnknownPriceWarningModal } from './UnknownPriceWarningModal';\n\nexport function QuoteWarningsAndErrors(props: PropTypes) {\n const {\n warning,\n error,\n showWarningModal,\n confirmationDisabled,\n refetchQuote,\n onOpenWarningModal,\n onCloseWarningModal,\n onConfirmWarningModal,\n onChangeSettings,\n } = props;\n\n const warningModalHandlers = {\n confirmationDisabled,\n open: showWarningModal,\n onClose: onCloseWarningModal,\n onConfirm: onConfirmWarningModal,\n };\n\n const showNoResultMessage =\n error?.type === QuoteErrorType.NO_RESULT ||\n error?.type === QuoteErrorType.REQUEST_FAILED;\n\n const alertInfo = makeAlerts(\n warning,\n error?.type === QuoteErrorType.BRIDGE_LIMIT ||\n error?.type === QuoteErrorType.INSUFFICIENT_SLIPPAGE\n ? error\n : null\n );\n\n const showAlerts = !!alertInfo;\n\n return (\n <>\n {showNoResultMessage && <NoResult error={error} fetch={refetchQuote} />}\n\n {showAlerts && (\n <Alerts>\n <Alert\n title={alertInfo.title}\n type={alertInfo.alertType}\n variant=\"alarm\"\n {...(alertInfo.action === 'show-info' && {\n action: (\n <Action onClick={onOpenWarningModal}>\n <InfoIcon size={12} color=\"gray\" />\n </Action>\n ),\n })}\n {...(alertInfo.action === 'change-settings' && {\n action: (\n <Button\n size=\"xxsmall\"\n type={alertInfo.alertType}\n onClick={onChangeSettings}>\n {i18n.t('Change')}\n </Button>\n ),\n })}\n />\n </Alerts>\n )}\n\n {warning && (\n <>\n {warning.type === QuoteWarningType.HIGH_VALUE_LOSS && (\n <HighValueLossWarningModal\n {...warningModalHandlers}\n warning={warning}\n />\n )}\n\n {(warning.type === QuoteWarningType.HIGH_SLIPPAGE ||\n warning.type === QuoteWarningType.INSUFFICIENT_SLIPPAGE) && (\n <SlippageWarningModal {...warningModalHandlers} warning={warning} />\n )}\n\n {warning.type === QuoteWarningType.UNKNOWN_PRICE && (\n <UnknownPriceWarningModal\n {...warningModalHandlers}\n warning={warning}\n />\n )}\n </>\n )}\n </>\n );\n}\n", "import type { PropTypes } from './NoResult.types';\n\nimport {\n Alert,\n Button,\n Divider,\n NoRouteIcon,\n RefreshIcon,\n Typography,\n} from '@rango-dev/ui';\nimport React from 'react';\n\nimport { errorMessages } from '../../constants/errors';\nimport { useAppStore } from '../../store/AppStore';\n\nimport {\n makeInfo,\n NoRouteIconSize,\n NoRouteTitleSize,\n} from './NoResult.helpers';\nimport {\n Container,\n ErrorDescription,\n Footer,\n PrefixIcon,\n} from './NoResult.styles';\n\nexport function NoResult(props: PropTypes) {\n const { fetch, error, size = 'small' } = props;\n const disabledLiquiditySources = useAppStore().getDisabledLiquiditySources();\n const toggleAllLiquiditySources = useAppStore().toggleAllLiquiditySources;\n\n const swappers = useAppStore().swappers();\n const info = makeInfo(\n error,\n disabledLiquiditySources,\n () => toggleAllLiquiditySources(swappers, true),\n fetch\n );\n\n return (\n <Container>\n <NoRouteIcon size={NoRouteIconSize[size]} color=\"gray\" />\n <Divider size={4} />\n <Typography variant=\"title\" size={NoRouteTitleSize[size]}>\n {errorMessages().noResultError.title}\n </Typography>\n {size === 'large' && <Divider size={4} />}\n {!!info.description && (\n <ErrorDescription size={size}>\n <Typography\n variant=\"body\"\n size=\"small\"\n align=\"center\"\n color=\"neutral700\">\n {info.description}\n </Typography>\n </ErrorDescription>\n )}\n <Divider size={size === 'large' ? '24' : '4'} />\n {!!info.alert && (\n <Footer size={size}>\n <Alert\n type={info.alert.type}\n title={info.alert.text}\n titleAlign={'left'}\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 type { Info } from './NoResult.types';\n\nimport { i18n } from '@lingui/core';\n\nimport { errorMessages } from '../../constants/errors';\nimport {\n type NoResultError,\n QuoteErrorType,\n type QuoteRequestFailed,\n} from '../../types';\n\nconst SMALL_NO_ROUTE__ICON_SIZE = 24;\nconst LARGE_NO_ROUTE_ICON_SIZE = 60;\n\nexport function makeInfo(\n error: NoResultError | QuoteRequestFailed | null,\n disabledLiquiditySources: string[],\n toggleAllLiquiditySources: (shouldReset: boolean) => void,\n refetchQuote: () => void\n): Info {\n if (error?.type === QuoteErrorType.REQUEST_FAILED) {\n return {\n alert: {\n type: 'warning',\n text: errorMessages().genericServerError,\n action: {\n onClick: refetchQuote,\n title: i18n.t('Retry'),\n },\n },\n description: '',\n };\n } else if (disabledLiquiditySources.length) {\n return {\n alert: {\n type: 'warning',\n text: errorMessages().liquiditySourcesError.title,\n action: {\n onClick: () => toggleAllLiquiditySources(true),\n title: i18n.t('Reset'),\n },\n },\n description: errorMessages().liquiditySourcesError.description,\n };\n } else if (\n error?.type === QuoteErrorType.NO_RESULT &&\n error.diagnosisMessage\n ) {\n return {\n alert: {\n type: 'error',\n text: error.diagnosisMessage,\n action: null,\n },\n description: '',\n };\n }\n return {\n alert: null,\n description: errorMessages().noResultError.description,\n };\n}\n\nexport enum NoRouteIconSize {\n small = SMALL_NO_ROUTE__ICON_SIZE,\n large = LARGE_NO_ROUTE_ICON_SIZE,\n}\n\nexport enum NoRouteTitleSize {\n small = 'small',\n large = 'medium',\n}\n", "import { styled } from '@rango-dev/ui';\n\nexport const Container = styled('div', {\n display: 'flex',\n flexDirection: 'column',\n alignItems: 'center',\n});\n\nexport const ErrorDescription = styled('div', {\n variants: {\n size: {\n small: {},\n large: {\n maxWidth: '316px',\n },\n },\n },\n});\n\nexport const Footer = styled('div', {\n variants: {\n size: {\n small: {\n width: '100%',\n },\n large: {},\n },\n },\n});\n\nexport const PrefixIcon = styled('div', {\n padding: '$6 $0',\n});\n", "import type { HighValueLossWarning } from '../../types';\n\nimport { i18n } from '@lingui/core';\nimport {\n Button,\n Divider,\n MessageBox,\n Typography,\n WarningIcon,\n} from '@rango-dev/ui';\nimport React from 'react';\n\nimport { errorMessages } from '../../constants/errors';\nimport {\n GAS_FEE_MAX_DECIMALS,\n GAS_FEE_MIN_DECIMALS,\n PERCENTAGE_CHANGE_MAX_DECIMALS,\n PERCENTAGE_CHANGE_MIN_DECIMALS,\n USD_VALUE_MAX_DECIMALS,\n USD_VALUE_MIN_DECIMALS,\n} from '../../constants/routing';\nimport { getContainer } from '../../utils/common';\nimport { numberToString } from '../../utils/numbers';\nimport { WatermarkedModal } from '../common/WatermarkedModal';\n\nimport { QuoteErrorsModalItem } from './QuoteErrorsModalItem';\nimport { Flex } from './QuoteWarningsAndErrors.styles';\n\ntype Props = {\n open: boolean;\n confirmationDisabled: boolean;\n onClose: () => void;\n onConfirm: () => void;\n warning: HighValueLossWarning;\n};\n\nexport function HighValueLossWarningModal(props: Props) {\n const { open, onClose, onConfirm, warning, confirmationDisabled } = props;\n const type = warning.warningLevel === 'high' ? 'error' : 'warning';\n\n const highValueLossData = [\n {\n title: i18n.t('Swapping'),\n value: numberToString(\n warning.inputUsdValue,\n USD_VALUE_MIN_DECIMALS,\n USD_VALUE_MAX_DECIMALS\n ),\n },\n {\n title: i18n.t('Gas cost'),\n value: numberToString(\n warning.totalFee,\n GAS_FEE_MIN_DECIMALS,\n GAS_FEE_MAX_DECIMALS\n ),\n },\n {\n title: i18n.t('Receiving'),\n value: numberToString(\n warning.outputUsdValue,\n USD_VALUE_MIN_DECIMALS,\n USD_VALUE_MAX_DECIMALS\n ),\n },\n {\n title: i18n.t('Price impact'),\n value: numberToString(\n warning.priceImpact,\n PERCENTAGE_CHANGE_MIN_DECIMALS,\n PERCENTAGE_CHANGE_MAX_DECIMALS\n ),\n valueColor: `${type}500`,\n },\n ];\n\n return (\n <WatermarkedModal\n footer={\n <Button\n type=\"primary\"\n size=\"large\"\n prefix={<WarningIcon />}\n fullWidth\n disabled={confirmationDisabled}\n onClick={onConfirm}>\n {errorMessages().highValueLossError.confirmMessage}\n </Button>\n }\n open={open}\n onClose={onClose}\n container={getContainer()}>\n <MessageBox\n type={type}\n title={errorMessages().highValueLossError.impactTitle}\n description={errorMessages().highValueLossError.description}\n />\n\n <Flex>\n <Divider size={20} />\n <Typography size=\"small\" variant=\"title\">\n {i18n.t('Details')}\n </Typography>\n <Flex>\n {highValueLossData.map((item, index) => {\n const key = index;\n return <QuoteErrorsModalItem key={key} {...item} />;\n })}\n </Flex>\n </Flex>\n </WatermarkedModal>\n );\n}\n", "import type { ModalContentData } from './QuoteWarningsAndErrors.types';\n\nimport { Typography } from '@rango-dev/ui';\nimport React from 'react';\n\nimport { Item } from './QuoteWarningsAndErrors.styles';\n\nexport function QuoteErrorsModalItem(props: ModalContentData) {\n const { title, value, valueColor } = props;\n\n return (\n <Item>\n <Typography size=\"medium\" variant=\"label\" className=\"_title\">\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 { darkTheme, styled } from '@rango-dev/ui';\n\nexport const Alerts = styled('div', {\n width: '100%',\n});\n\nexport const Flex = styled('div', {\n display: 'flex',\n flexDirection: 'column',\n alignItems: 'flex-start',\n gap: 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 '._title': {\n $$color: '$colors$neutral600',\n [`.${darkTheme} &`]: {\n $$color: '$colors$neutral700',\n },\n color: '$$color',\n },\n});\n\nexport const Action = styled('div', {\n padding: '$2',\n alignSelf: 'flex-start',\n cursor: 'pointer',\n});\n", "import type {\n BridgeLimitError,\n InsufficientSlippageError,\n QuoteWarning,\n} from '../../types';\n\nimport { i18n } from '@lingui/core';\n\nimport { errorMessages } from '../../constants/errors';\nimport { QuoteErrorType, QuoteWarningType } from '../../types';\nimport { getPriceImpactLevel } from '../../utils/quote';\n\ntype AlertInfo = {\n alertType: 'error' | 'warning';\n title: string;\n action: 'show-info' | 'change-settings' | null;\n};\n\nexport function makeAlerts(\n warning: QuoteWarning | null,\n error: BridgeLimitError | InsufficientSlippageError | null\n): AlertInfo | null {\n const alertInfo: AlertInfo = {\n alertType: 'warning',\n title: '',\n action: null,\n };\n if (error) {\n alertInfo.alertType = 'error';\n if (error.type === QuoteErrorType.BRIDGE_LIMIT) {\n alertInfo.title = error.recommendation;\n }\n\n if (error.type === QuoteErrorType.INSUFFICIENT_SLIPPAGE) {\n alertInfo.title = i18n.t({\n id: 'You need to increase slippage to at least {minRequiredSlippage} for this route.',\n values: {\n minRequiredSlippage: error.minRequiredSlippage,\n },\n });\n alertInfo.action = 'change-settings';\n }\n\n return alertInfo;\n }\n if (warning) {\n if (warning.type === QuoteWarningType.HIGH_VALUE_LOSS) {\n const warningLevel = getPriceImpactLevel(warning.priceImpact);\n if (warningLevel === 'high') {\n alertInfo.alertType = 'error';\n }\n alertInfo.action = 'show-info';\n alertInfo.title = errorMessages().highValueLossError.title;\n }\n if (warning.type === QuoteWarningType.UNKNOWN_PRICE) {\n alertInfo.title = errorMessages().unknownPriceError.title;\n }\n if (warning.type === QuoteWarningType.INSUFFICIENT_SLIPPAGE) {\n alertInfo.title = i18n.t({\n id: 'We recommend you to increase slippage to at least {minRequiredSlippage} for this route.',\n values: {\n minRequiredSlippage: warning.minRequiredSlippage,\n },\n });\n alertInfo.action = 'change-settings';\n }\n if (warning.type === QuoteWarningType.HIGH_SLIPPAGE) {\n alertInfo.title = i18n.t('Caution, your slippage is high.');\n }\n return alertInfo;\n }\n return null;\n}\n", "import type {\n HighSlippageWarning,\n InsufficientSlippageWarning,\n} from '../../types';\n\nimport { i18n } from '@lingui/core';\nimport { Button, Divider, MessageBox, Typography } from '@rango-dev/ui';\nimport React from 'react';\nimport { useNavigate } from 'react-router-dom';\n\nimport { navigationRoutes } from '../../constants/navigationRoutes';\nimport { useAppStore } from '../../store/AppStore';\nimport { QuoteWarningType } from '../../types';\nimport { getContainer } from '../../utils/common';\nimport { WatermarkedModal } from '../common/WatermarkedModal';\n\ntype PropsTypes = {\n open: boolean;\n confirmationDisabled: boolean;\n onClose: () => void;\n onConfirm: () => void;\n warning: InsufficientSlippageWarning | HighSlippageWarning;\n};\n\nexport function SlippageWarningModal(props: PropsTypes) {\n const { customSlippage, slippage } = useAppStore();\n const { open, onClose, onConfirm, warning, confirmationDisabled } = props;\n const navigate = useNavigate();\n const userSlippage = customSlippage ?? slippage;\n\n return (\n <WatermarkedModal\n anchor=\"bottom\"\n open={open}\n prefix={\n <Button\n size=\"small\"\n variant=\"ghost\"\n onClick={() => navigate('../' + navigationRoutes.settings)}>\n <Typography variant=\"label\" size=\"medium\" color=\"$neutral900\">\n {i18n.t('Change settings')}\n </Typography>\n </Button>\n }\n container={getContainer()}\n onClose={onClose}>\n <MessageBox\n type=\"warning\"\n title={\n warning.type === QuoteWarningType.HIGH_SLIPPAGE\n ? i18n.t('High slippage')\n : i18n.t('Low slippage')\n }\n description={\n warning.type === QuoteWarningType.HIGH_SLIPPAGE\n ? i18n.t({\n id: ' Caution, your slippage is high (={userSlippage}). Your trade may be front run.',\n values: { userSlippage },\n })\n : i18n.t({\n id: 'We recommend you to increase slippage to at least {minRequiredSlippage} for this route.',\n values: {\n minRequiredSlippage: warning.minRequiredSlippage,\n },\n })\n }>\n <Divider size={18} />\n <Divider size={32} />\n <Button\n size=\"large\"\n type=\"primary\"\n variant=\"contained\"\n fullWidth\n disabled={confirmationDisabled}\n onClick={onConfirm}>\n {i18n.t('Confirm anyway')}\n </Button>\n </MessageBox>\n </WatermarkedModal>\n );\n}\n", "import type { UnknownPriceWarning } from '../../types';\n\nimport { Button, MessageBox, WarningIcon } from '@rango-dev/ui';\nimport React from 'react';\n\nimport { errorMessages } from '../../constants/errors';\nimport { getContainer } from '../../utils/common';\nimport { WatermarkedModal } from '../common/WatermarkedModal';\n\ntype Props = {\n open: boolean;\n confirmationDisabled: boolean;\n onClose: () => void;\n onConfirm: () => void;\n warning: UnknownPriceWarning;\n};\n\nexport function UnknownPriceWarningModal(props: Props) {\n const { open, onClose, onConfirm, confirmationDisabled } = props;\n return (\n <WatermarkedModal\n footer={\n <Button\n type=\"primary\"\n size=\"large\"\n prefix={<WarningIcon />}\n fullWidth\n disabled={confirmationDisabled}\n onClick={onConfirm}>\n {errorMessages().unknownPriceError.confirmMessage}\n </Button>\n }\n open={open}\n onClose={onClose}\n container={getContainer()}>\n <MessageBox\n type=\"warning\"\n title={errorMessages().unknownPriceError.impactTitle}\n description={errorMessages().unknownPriceError.description}\n />\n </WatermarkedModal>\n );\n}\n", "import type { PropTypes } from './QuoteInfo.types';\n\nimport BigNumber from 'bignumber.js';\nimport React from 'react';\n\nimport { Quote } from '../../components/Quote';\nimport { QuoteSkeleton } from '../../components/QuoteSkeleton';\nimport { useQuoteStore } from '../../store/quote';\nimport { QuoteErrorType } from '../../types';\nimport { getQuoteToTokenUsdPrice } from '../../utils/quote';\nimport { calcOutputUsdValue } from '../../utils/swap';\n\nimport { QuoteContainer } from './QuoteInfo.styles';\n\nexport function QuoteInfo(props: PropTypes) {\n const {\n quote,\n type,\n loading,\n error,\n warning,\n expanded = false,\n tagHidden,\n onClick,\n showModalFee,\n selected,\n onClickAllRoutes,\n fullExpandedMode = false,\n } = props;\n const { inputAmount, inputUsdValue, toToken } = useQuoteStore();\n\n const outputAmount = !!quote?.outputAmount\n ? new BigNumber(quote?.outputAmount)\n : null;\n const outputUsdValue = !!quote?.outputAmount\n ? calcOutputUsdValue(\n quote?.outputAmount,\n getQuoteToTokenUsdPrice(quote) || toToken?.usdPrice\n )\n : null;\n\n const noResult =\n error &&\n (error.type === QuoteErrorType.NO_RESULT ||\n error.type === QuoteErrorType.REQUEST_FAILED);\n\n const showQuote = !noResult && quote && !loading;\n\n if (loading) {\n return (\n <QuoteContainer>\n <QuoteSkeleton tagHidden={tagHidden} type={type} expanded={expanded} />\n </QuoteContainer>\n );\n }\n\n return showQuote ? (\n <QuoteContainer onClick={() => onClick?.(quote)}>\n <Quote\n quote={quote}\n error={error}\n showModalFee={showModalFee}\n warning={warning}\n tagHidden={tagHidden}\n selected={selected}\n type={type}\n expanded={expanded}\n onClickAllRoutes={onClickAllRoutes}\n fullExpandedMode={fullExpandedMode}\n input={{\n value: inputAmount,\n usdValue: inputUsdValue?.toString() ?? '',\n }}\n output={{\n value: outputAmount?.toString() ?? '',\n usdValue: outputUsdValue?.toString() ?? '',\n }}\n />\n </QuoteContainer>\n ) : null;\n}\n", "import type { QuoteProps } from './Quote.types';\nimport type { Step } from '@rango-dev/ui';\nimport type { SwapResult } from 'rango-sdk';\n\nimport { i18n } from '@lingui/core';\nimport {\n Alert,\n Divider,\n FullExpandedQuote,\n InfoIcon,\n QuoteTag,\n StepDetails,\n TokenAmount,\n Tooltip,\n Typography,\n} from '@rango-dev/ui';\nimport BigNumber from 'bignumber.js';\nimport React, { useRef, useState } from 'react';\n\nimport { GAS_FEE_MAX } from '../../constants/quote';\nimport {\n GAS_FEE_MAX_DECIMALS,\n GAS_FEE_MIN_DECIMALS,\n PERCENTAGE_CHANGE_MAX_DECIMALS,\n PERCENTAGE_CHANGE_MIN_DECIMALS,\n TOKEN_AMOUNT_MAX_DECIMALS,\n TOKEN_AMOUNT_MIN_DECIMALS,\n USD_VALUE_MAX_DECIMALS,\n USD_VALUE_MIN_DECIMALS,\n} from '../../constants/routing';\nimport {\n FooterAlert,\n FooterStepAlarm,\n} from '../../containers/QuoteInfo/QuoteInfo.styles';\nimport { useAppStore } from '../../store/AppStore';\nimport { QuoteErrorType, QuoteWarningType } from '../../types';\nimport { getContainer, getExpanded } from '../../utils/common';\nimport {\n getBlockchainShortNameFor,\n getSwapperDisplayName,\n} from '../../utils/meta';\nimport {\n formatTooltipNumbers,\n numberToString,\n secondsToString,\n totalArrivalTime,\n} from '../../utils/numbers';\nimport {\n getPriceImpact,\n getPriceImpactLevel,\n sortTags,\n} from '../../utils/quote';\nimport { getTotalFeeInUsd } from '../../utils/swap';\n\nimport {\n AllRoutesButton,\n BasicInfoOutput,\n basicInfoStyles,\n ContainerInfoOutput,\n Content,\n FrameIcon,\n HorizontalSeparator,\n Line,\n QuoteContainer,\n stepsDetailsStyles,\n SummaryContainer,\n summaryHeaderStyles,\n summaryStyles,\n TagContainer,\n} from './Quote.styles';\nimport { QuoteCostDetails } from './QuoteCostDetails';\nimport { QuoteSummary } from './QuoteSummary';\nimport { QuoteTrigger } from './QuoteTrigger';\n\nexport function Quote(props: QuoteProps) {\n const {\n quote,\n input,\n output,\n error,\n warning,\n type,\n selected = false,\n tagHidden = true,\n showModalFee = true,\n onClickAllRoutes,\n fullExpandedMode = false,\n } = props;\n const blockchains = useAppStore().blockchains();\n const tokens = useAppStore().tokens();\n const swappers = useAppStore().swappers();\n const [expanded, setExpanded] = useState(props.expanded);\n const quoteRef = useRef<HTMLButtonElement | null>(null);\n const roundedInput = numberToString(\n input.value,\n TOKEN_AMOUNT_MIN_DECIMALS,\n TOKEN_AMOUNT_MAX_DECIMALS\n );\n const roundedOutput = numberToString(\n output.value,\n TOKEN_AMOUNT_MIN_DECIMALS,\n TOKEN_AMOUNT_MAX_DECIMALS\n );\n const roundedOutputUsdValue = output.usdValue\n ? numberToString(\n output.usdValue,\n USD_VALUE_MIN_DECIMALS,\n USD_VALUE_MAX_DECIMALS\n )\n : '';\n const priceImpact = getPriceImpact(input.usdValue, output.usdValue ?? null);\n const percentageChange = numberToString(\n priceImpact,\n PERCENTAGE_CHANGE_MIN_DECIMALS,\n PERCENTAGE_CHANGE_MAX_DECIMALS\n );\n const priceImpactWarningLevel = getPriceImpactLevel(priceImpact ?? 0);\n\n const getQuoteSteps = (swaps: SwapResult[]): Step[] => {\n return swaps.map((swap, index) => {\n let stepState: 'error' | 'warning' | undefined = undefined;\n const stepHasError =\n (error?.type === QuoteErrorType.BRIDGE_LIMIT &&\n error.swap.swapperId === swap.swapperId) ||\n (error?.type === QuoteErrorType.INSUFFICIENT_SLIPPAGE &&\n error.recommendedSlippages?.has(index));\n const stepHasWarning =\n warning?.type === QuoteWarningType.INSUFFICIENT_SLIPPAGE &&\n warning.recommendedSlippages?.has(index);\n\n if (stepHasError) {\n stepState = 'error';\n } else if (stepHasWarning) {\n stepState = 'warning';\n }\n\n let alertTitle = stepHasError\n ? i18n.t('Slippage Error')\n : i18n.t('Slippage Warning');\n\n if (error?.type === QuoteErrorType.BRIDGE_LIMIT) {\n alertTitle = error?.recommendation;\n }\n\n return {\n swapper: {\n displayName: getSwapperDisplayName(swap.swapperId, swappers),\n image: swap.swapperLogo,\n },\n from: {\n token: { displayName: swap.from.symbol, image: swap.from.logo },\n chain: {\n displayName: getBlockchainShortNameFor(\n swap.from.blockchain,\n blockchains\n ),\n image: swap.from.blockchainLogo,\n },\n price: {\n value:\n index === 0\n ? numberToString(\n input.value,\n TOKEN_AMOUNT_MIN_DECIMALS,\n TOKEN_AMOUNT_MAX_DECIMALS\n )\n : numberToString(\n swap.fromAmount,\n TOKEN_AMOUNT_MIN_DECIMALS,\n TOKEN_AMOUNT_MAX_DECIMALS\n ),\n usdValue: numberToString(\n (swap.from.usdPrice ?? 0) * parseFloat(swap.fromAmount),\n USD_VALUE_MIN_DECIMALS,\n USD_VALUE_MAX_DECIMALS\n ),\n realValue: formatTooltipNumbers(\n index === 0 ? input.value : swap.fromAmount\n ),\n realUsdValue: formatTooltipNumbers(\n new BigNumber(swap.from.usdPrice ?? 0).multipliedBy(\n swap.fromAmount\n )\n ),\n },\n },\n to: {\n token: { displayName: swap.to.symbol, image: swap.to.logo },\n chain: {\n displayName: getBlockchainShortNameFor(\n swap.to.blockchain,\n blockchains\n ),\n image: swap.to.blockchainLogo,\n },\n price: {\n value: numberToString(\n swap.toAmount,\n TOKEN_AMOUNT_MIN_DECIMALS,\n TOKEN_AMOUNT_MAX_DECIMALS\n ),\n usdValue: numberToString(\n (swap.to.usdPrice ?? 0) * parseFloat(swap.toAmount),\n USD_VALUE_MIN_DECIMALS,\n USD_VALUE_MAX_DECIMALS\n ),\n realValue: formatTooltipNumbers(swap.toAmount),\n realUsdValue: formatTooltipNumbers(\n new BigNumber(swap.to.usdPrice ?? 0).multipliedBy(swap.toAmount)\n ),\n },\n },\n state: stepState,\n alerts:\n stepHasError || stepHasWarning ? (\n <FooterStepAlarm>\n <Alert\n variant=\"alarm\"\n type={stepHasError ? 'error' : 'warning'}\n title={alertTitle}\n footer={\n <FooterAlert>\n {error?.type === QuoteErrorType.BRIDGE_LIMIT && (\n <>\n <Typography\n size=\"xsmall\"\n variant=\"body\"\n color=\"neutral900\">\n {error.fromAmountRangeError}\n </Typography>\n <Divider direction=\"horizontal\" size={8} />\n <Typography\n size=\"xsmall\"\n variant=\"body\"\n color=\"neutral900\">\n |\n </Typography>\n <Divider direction=\"horizontal\" size={8} />\n <Typography\n size=\"xsmall\"\n variant=\"body\"\n color=\"neutral900\">\n {i18n.t({\n id: 'Yours: {amount} {symbol}',\n values: {\n amount: numberToString(\n swap.fromAmount,\n TOKEN_AMOUNT_MIN_DECIMALS,\n TOKEN_AMOUNT_MAX_DECIMALS\n ),\n symbol: swap?.from.symbol,\n },\n })}\n </Typography>\n </>\n )}\n {(error?.type === QuoteErrorType.INSUFFICIENT_SLIPPAGE ||\n warning?.type ===\n QuoteWarningType.INSUFFICIENT_SLIPPAGE) && (\n <Typography\n size=\"xsmall\"\n variant=\"body\"\n color=\"neutral900\">\n {i18n.t({\n id: 'Minimum required slippage is {minRequiredSlippage}',\n values: {\n ...(error?.type ===\n QuoteErrorType.INSUFFICIENT_SLIPPAGE && {\n minRequiredSlippage:\n error.recommendedSlippages?.get(index),\n }),\n ...(warning?.type ===\n QuoteWarningType.INSUFFICIENT_SLIPPAGE && {\n minRequiredSlippage:\n warning.recommendedSlippages?.get(index),\n }),\n },\n })}\n </Typography>\n )}\n </FooterAlert>\n }\n />\n </FooterStepAlarm>\n ) : undefined,\n };\n });\n };\n const steps = getQuoteSteps(quote?.swaps ?? []);\n\n const numberOfSteps = steps.length;\n const container = getContainer();\n const sortedQuoteTags = sortTags(props.quote.tags || []);\n const showAllRoutesButton = !!onClickAllRoutes;\n const totalTime = secondsToString(totalArrivalTime(quote?.swaps));\n const totalFee = getTotalFeeInUsd(quote?.swaps ?? [], tokens);\n const fee = numberToString(\n totalFee,\n GAS_FEE_MIN_DECIMALS,\n GAS_FEE_MAX_DECIMALS\n );\n\n const feeWarning = totalFee.gte(new BigNumber(GAS_FEE_MAX));\n\n return fullExpandedMode ? (\n <FullExpandedQuote\n selected={selected}\n fee={fee}\n time={totalTime}\n tooltipContainer={getExpanded()}\n steps={steps}\n tags={sortedQuoteTags}\n feeWarning={feeWarning}\n percentageChange={percentageChange}\n warningLevel={priceImpactWarningLevel}\n outputPrice={{\n value: roundedOutput,\n usdValue: roundedOutputUsdValue,\n realValue: formatTooltipNumbers(output.value),\n realUsdValue: formatTooltipNumbers(output.usdValue),\n }}\n />\n ) : (\n <SummaryContainer\n selected={selected}\n listItem={type === 'list-item'}\n basic={type === 'basic'}>\n <div className={summaryStyles()}>\n {!tagHidden && sortedQuoteTags.length ? (\n <>\n <TagContainer>\n {sortedQuoteTags.map((tag, index) => {\n const key = `${tag.value}_${index}`;\n return (\n <React.Fragment key={key}>\n <QuoteTag label={tag.label} value={tag.value} />\n <Divider size={4} direction=\"horizontal\" />\n </React.Fragment>\n );\n })}\n </TagContainer>\n <Line />\n {!showAllRoutesButton && <Divider size={4} />}\n </>\n ) : null}\n <div id=\"portal-root\" className={summaryHeaderStyles()}>\n <QuoteCostDetails\n quote={quote}\n time={totalTime}\n fee={fee}\n feeWarning={feeWarning}\n showModalFee={showModalFee}\n steps={numberOfSteps}\n />\n\n {showAllRoutesButton && (\n <AllRoutesButton\n onClick={(e) => {\n e.stopPropagation();\n onClickAllRoutes();\n }}\n size=\"xxsmall\"\n type=\"secondary\"\n variant=\"default\">\n <Typography color=\"secondary\" variant=\"label\" size=\"medium\">\n {i18n.t('See All Routes')}\n </Typography>\n </AllRoutesButton>\n )}\n </div>\n {type === 'basic' && (\n <div className={basicInfoStyles()}>\n <FrameIcon>\n <InfoIcon size={12} color=\"gray\" />\n </FrameIcon>\n <ContainerInfoOutput>\n <BasicInfoOutput size=\"small\" variant=\"body\">\n {`${roundedInput} ${steps[0].from.token.displayName} = `}\n </BasicInfoOutput>\n <Tooltip\n content={formatTooltipNumbers(output.value)}\n container={container}\n open={!output.value ? false : undefined}>\n <BasicInfoOutput size=\"small\" variant=\"body\">\n \n {`${roundedOutput} ${\n steps[steps.length - 1].to.token.displayName\n }`}\n </BasicInfoOutput>\n </Tooltip>\n </ContainerInfoOutput>\n <Tooltip\n content={formatTooltipNumbers(output.usdValue)}\n container={container}\n style={{\n display: 'flex',\n }}>\n <Typography\n color=\"$neutral600\"\n ml={2}\n size=\"xsmall\"\n variant=\"body\">\n {`($${roundedOutputUsdValue})`}\n </Typography>\n </Tooltip>\n </div>\n )}\n {type === 'list-item' && (\n <TokenAmount\n tooltipContainer={container}\n type=\"output\"\n direction=\"vertical\"\n price={{\n value: roundedOutput,\n usdValue: roundedOutputUsdValue,\n realValue: formatTooltipNumbers(output.value),\n realUsdValue: formatTooltipNumbers(output.usdValue),\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 percentageChange={percentageChange}\n warningLevel={priceImpactWarningLevel}\n />\n )}\n {type === 'swap-preview' && (\n <>\n <QuoteSummary\n from={steps[0].from}\n to={steps[numberOfSteps - 1].to}\n percentageChange={percentageChange}\n warningLevel={priceImpactWarningLevel}\n />\n <Divider size={4} />\n </>\n )}\n </div>\n <QuoteContainer\n selected={selected}\n listItem={type === 'list-item'}\n open={expanded}\n className=\"quote_container\"\n onOpenChange={setExpanded}>\n <QuoteTrigger\n type={type}\n quoteRef={quoteRef}\n selected={selected}\n setExpanded={setExpanded}\n expanded={expanded}\n steps={steps}\n />\n <Content open={expanded}>\n <HorizontalSeparator />\n <div className={stepsDetailsStyles()}>\n {steps.map((step, index) => {\n const key = `item-${index}`;\n return (\n <StepDetails\n type=\"quote-details\"\n key={key}\n tooltipContainer={container}\n step={step}\n hasSeparator={index !== steps.length - 1}\n state={step.state}\n />\n );\n })}\n </div>\n </Content>\n </QuoteContainer>\n </SummaryContainer>\n );\n}\n", "import { styled } from '@rango-dev/ui';\n\nexport const QuoteContainer = styled('div', {\n width: '100%',\n '& .position-top__skeleton': {\n paddingTop: '$10',\n },\n});\nexport const FooterStepAlarm = styled('div', {\n paddingBottom: '$15',\n});\n\nexport const FooterAlert = styled('div', {\n width: '100%',\n display: 'flex',\n});\n", "import * as Collapsible from '@radix-ui/react-collapsible';\nimport {\n Button,\n css,\n darkTheme,\n Image,\n styled,\n Typography,\n} from '@rango-dev/ui';\n\nimport { CollapsibleContent } from '../CustomCollapsible/CustomCollapsible.styles';\n\nexport const EXPANDABLE_QUOTE_TRANSITION_DURATION = 300;\n\nexport const QuoteContainer = styled(Collapsible.Root, {\n display: 'flex',\n flexDirection: 'column',\n alignItems: 'start',\n overflowX: 'auto',\n overflowY: 'hidden',\n width: '100%',\n borderRadius: '$xm',\n variants: {\n selected: {\n true: {},\n false: {\n $$color: '$colors$neutral400',\n [`.${darkTheme} &`]: {\n $$color: '$colors$neutral200',\n },\n backgroundColor: '$$color',\n },\n },\n listItem: {\n true: {\n $$color: '$colors$neutral400',\n [`.${darkTheme} &`]: {\n $$color: '$colors$neutral200',\n },\n backgroundColor: '$$color',\n },\n false: {},\n },\n },\n\n compoundVariants: [\n {\n listItem: false,\n selected: true,\n css: {\n $$color: '$colors$info300',\n [`.${darkTheme} &`]: {\n $$color: '$colors$secondary800',\n },\n backgroundColor: '$$color',\n },\n },\n ],\n});\n\nexport const stepsDetailsStyles = css({\n padding: '$10 $15',\n});\nexport const AllRoutesButton = styled(Button, {\n backgroundColor: 'transparent',\n border: '1px solid $secondary',\n});\nexport const SummaryContainer = styled('div', {\n borderRadius: '$xm',\n display: 'flex',\n flexDirection: 'column',\n alignItems: 'start',\n justifyContent: 'space-between',\n color: '$foreground',\n boxSizing: 'border-box',\n position: 'relative',\n variants: {\n selected: {\n true: {},\n false: {\n $$color: '$colors$neutral200',\n [`.${darkTheme} &`]: {\n $$color: '$colors$neutral500',\n },\n backgroundColor: '$$color',\n },\n },\n basic: { true: { borderTopRightRadius: '0', borderTopLeftRadius: '0' } },\n listItem: {\n true: {\n $$color: '$colors$neutral200',\n [`.${darkTheme} &`]: {\n $$color: '$colors$neutral500',\n },\n backgroundColor: '$$color',\n '&:hover': {\n '& .quote_container': {\n '& button': {\n backgroundColor: '$neutral500',\n [`.${darkTheme} &`]: {\n backgroundColor: '$neutral200',\n },\n },\n backgroundColor: '$neutral500',\n [`.${darkTheme} &`]: {\n backgroundColor: '$neutral200',\n },\n },\n backgroundColor: '$neutral300',\n [`.${darkTheme} &`]: {\n backgroundColor: '$neutral400',\n },\n },\n cursor: 'pointer',\n },\n false: {},\n },\n },\n\n compoundVariants: [\n {\n listItem: true,\n selected: true,\n css: {\n outline: '1px solid $secondary',\n },\n },\n {\n listItem: false,\n selected: true,\n css: {\n $$color: '$colors$info100',\n [`.${darkTheme} &`]: {\n $$color: '$colors$secondary600',\n },\n backgroundColor: '$$color',\n '&:hover': {\n backgroundColor: '$$color',\n },\n },\n },\n {\n listItem: true,\n selected: false,\n css: {\n cursor: 'pointer',\n '&:hover': {\n backgroundColor: '$neutral300',\n [`.${darkTheme} &`]: {\n backgroundColor: '$neutral400',\n },\n },\n },\n },\n ],\n});\n\nexport const summaryStyles = css({\n width: '100%',\n padding: '$15 $15 $10 $15',\n});\n\nexport const summaryHeaderStyles = css({\n display: 'flex',\n flexDirection: 'row',\n justifyContent: 'space-between',\n alignItems: 'center',\n paddingBottom: '$10',\n position: 'relative',\n});\n\nexport const rowStyles = css({\n display: 'flex',\n flexDirection: 'row',\n justifyContent: 'center',\n alignItems: 'center',\n '.blockchainImage': {\n marginLeft: '-$8',\n },\n});\nexport const basicInfoStyles = css({\n display: 'flex',\n alignItems: 'center',\n '.usd-value': {\n $$color: '$colors$neutral600',\n [`.${darkTheme} &`]: {\n $$color: '$colors$neutral700',\n },\n color: '$$color',\n },\n});\n\nexport const Trigger = styled(Collapsible.Trigger, {\n display: 'flex',\n width: '100%',\n justifyContent: 'space-between',\n alignItems: 'center',\n height: '$36',\n padding: '$10 $15',\n boxSizing: 'border-box',\n cursor: 'pointer',\n border: 'none',\n outline: 'none',\n backgroundColor: 'transparent',\n variants: {\n error: {\n true: {\n [`& ${Image}`]: {\n border: '1px $warning500 solid',\n borderRadius: '100%',\n },\n },\n false: {\n [`& ${Image}`]: {\n border: '1px transparent solid',\n borderRadius: '100%',\n },\n },\n },\n selected: {\n true: {},\n false: {\n $$color: '$colors$neutral400',\n [`.${darkTheme} &`]: {\n $$color: '$colors$neutral200',\n },\n backgroundColor: '$$color',\n },\n },\n listItem: {\n true: {\n $$color: '$colors$neutral400',\n [`.${darkTheme} &`]: {\n $$color: '$colors$neutral200',\n },\n backgroundColor: '$$color',\n },\n false: {},\n },\n },\n\n compoundVariants: [\n {\n listItem: false,\n selected: true,\n css: {\n $$color: '$colors$info300',\n [`.${darkTheme} &`]: {\n $$color: '$colors$secondary800',\n },\n backgroundColor: '$$color',\n },\n },\n ],\n '.blockchains_section': {\n display: 'none',\n },\n '@xs': {\n '.blockchains_section': {\n display: 'block',\n },\n },\n});\n\nexport const ImageContainer = styled('div', {\n width: '18px',\n height: '18px',\n borderRadius: '100%',\n display: 'flex',\n justifyContent: 'center',\n alignItems: 'center',\n border: '1.5px transparent solid',\n img: {\n borderRadius: '100%',\n },\n variants: {\n state: {\n error: {\n borderColor: '$error500',\n },\n warning: { borderColor: '$warning500' },\n },\n },\n});\n\nexport const Content = styled(CollapsibleContent, {\n width: '100%',\n background: 'inherit',\n});\n\nexport const IconContainer = styled('div', {\n display: 'flex',\n justifyContent: 'center',\n alignItems: 'center',\n padding: '$2',\n transition: `all ${EXPANDABLE_QUOTE_TRANSITION_DURATION}ms ease`,\n variants: {\n orientation: {\n down: {\n transform: 'rotate(0)',\n },\n up: {\n transform: 'rotate(180deg)',\n },\n },\n },\n});\n\nexport const Separator = styled('div', {\n height: '$12',\n marginLeft: '$10',\n marginRight: '$10',\n borderLeft: '1px solid $foreground',\n});\n\nexport const HorizontalSeparator = styled('div', {\n display: 'flex',\n justifyContent: 'center',\n margin: '0 $15',\n borderTop: '1px solid',\n $$color: '$colors$neutral300',\n [`.${darkTheme} &`]: {\n $$color: '$colors$neutral400',\n },\n borderColor: '$$color',\n});\n\nexport const FrameIcon = styled('div', {\n width: '$16',\n height: '$16',\n justifyContent: 'center',\n alignItems: 'center',\n display: 'flex',\n});\n\nexport const BasicInfoOutput = styled(Typography, {\n overflow: 'hidden',\n textOverflow: 'ellipsis',\n letterSpacing: 0.4,\n});\n\nexport const ContainerInfoOutput = styled('div', {\n display: 'flex',\n flexWrap: 'wrap',\n});\n\nexport const MoreStep = styled('div', {\n width: '18px',\n height: '18px',\n borderRadius: '100%',\n backgroundColor: '$background',\n cursor: 'default',\n display: 'flex',\n justifyContent: 'center',\n alignItems: 'center',\n border: '1.5px transparent solid',\n variants: {\n state: {\n error: {\n borderColor: '$error500',\n },\n warning: { borderColor: '$warning500' },\n },\n },\n});\n\nexport const TagContainer = styled('div', {\n display: 'flex',\n});\n\nexport const Line = styled('div', {\n width: '100%',\n borderTopWidth: '1px',\n borderTopStyle: 'solid',\n borderTopColor: '$neutral',\n margin: '$5 0',\n [`.${darkTheme} &`]: {\n borderTopColor: '$neutral800',\n },\n});\n", "import type { QuoteCostDetailsProps } from './Quote.types';\nimport type { NameOfFees } from '../../constants/quote';\nimport type BigNumber from 'bignumber.js';\n\nimport { i18n } from '@lingui/core';\nimport {\n ChevronDownIcon,\n CloseIcon,\n Divider,\n IconButton,\n QuoteCost,\n Tooltip,\n Typography,\n} from '@rango-dev/ui';\nimport React, { useState } from 'react';\n\nimport { NAME_OF_FEES } from '../../constants/quote';\nimport {\n GAS_FEE_MAX_DECIMALS,\n GAS_FEE_MIN_DECIMALS,\n USD_VALUE_MAX_DECIMALS,\n USD_VALUE_MIN_DECIMALS,\n} from '../../constants/routing';\nimport { getContainer } from '../../utils/common';\nimport { formatTooltipNumbers, numberToString } from '../../utils/numbers';\nimport { getFeesGroup, getTotalFeesInUsd, getUsdFee } from '../../utils/swap';\nimport { WatermarkedModal } from '../common/WatermarkedModal';\nimport { CustomCollapsible } from '../CustomCollapsible/CustomCollapsible';\nimport { ExpandedIcon } from '../CustomCollapsible/CustomCollapsible.styles';\n\nimport {\n FeeSection,\n Line,\n ModalContainer,\n ModalHeader,\n trigger,\n} from './QuoteCostDetails.styles';\n\nconst NonPayableFee = (props: { fee: BigNumber; label: string }) => {\n return !props.fee.isZero() ? (\n <FeeSection>\n <Typography variant=\"label\" size=\"medium\" color=\"neutral600\">\n {props.label}\n </Typography>\n <Typography variant=\"label\" size=\"medium\">\n $\n {numberToString(\n props.fee,\n USD_VALUE_MIN_DECIMALS,\n USD_VALUE_MAX_DECIMALS\n )}\n </Typography>\n </FeeSection>\n ) : null;\n};\n\nexport function QuoteCostDetails(props: QuoteCostDetailsProps) {\n const [open, setOpen] = useState<boolean>(false);\n const [openCollapse, setOpenCollapse] = useState<boolean>(false);\n const { steps, quote, fee, time, feeWarning, showModalFee } = props;\n const swaps = quote?.swaps ?? [];\n const container = getContainer();\n\n const feesGroup = getFeesGroup(swaps);\n\n return (\n <>\n <QuoteCost\n onClickFee={\n showModalFee\n ? (e) => {\n e.stopPropagation();\n setOpen(!open);\n }\n : undefined\n }\n fee={fee}\n feeWarning={feeWarning}\n time={time}\n steps={steps}\n tooltipGas={showModalFee ? i18n.t('View more info') : undefined}\n tooltipContainer={container}\n />\n\n <WatermarkedModal\n container={container}\n open={open}\n header={\n <ModalHeader>\n <Typography variant=\"title\" size=\"medium\">\n {i18n.t('Gas & Fee Explanation')}\n </Typography>\n\n <IconButton onClick={() => setOpen(false)} variant=\"ghost\">\n <CloseIcon color=\"gray\" size={14} />\n </IconButton>\n </ModalHeader>\n }\n onClose={() => {\n setOpen(false);\n }}>\n <ModalContainer>\n <Typography variant=\"title\" size=\"small\">\n {i18n.t('Details')}\n </Typography>\n <Divider size={10} />\n {Object.entries(feesGroup.payable).flatMap(\n ([payableFeesKey, feeArray]) =>\n feeArray.map((fee, index) => {\n const key = `payable-fee-${index}`;\n const usdValue = getUsdFee(fee);\n return (\n <FeeSection key={key}>\n <Typography\n variant=\"label\"\n size=\"medium\"\n color=\"neutral600\">\n {NAME_OF_FEES[payableFeesKey as NameOfFees]}\n </Typography>\n <Tooltip\n content={formatTooltipNumbers(fee.amount)}\n container={container}>\n <Typography variant=\"label\" size=\"medium\">\n {numberToString(\n fee.amount,\n GAS_FEE_MIN_DECIMALS,\n GAS_FEE_MAX_DECIMALS\n )}{' '}\n {fee.asset.symbol} ($\n {numberToString(\n usdValue,\n USD_VALUE_MIN_DECIMALS,\n USD_VALUE_MAX_DECIMALS\n )}\n )\n </Typography>\n </Tooltip>\n </FeeSection>\n );\n })\n )}\n\n <FeeSection className=\"total_payable_fee\">\n <Typography variant=\"label\" size=\"medium\">\n {i18n.t('Total Payable Fee')}\n </Typography>\n <Typography variant=\"label\" size=\"medium\">\n $\n {numberToString(\n fee,\n USD_VALUE_MIN_DECIMALS,\n USD_VALUE_MAX_DECIMALS\n )}\n </Typography>\n </FeeSection>\n <Line />\n {Object.keys(feesGroup.nonePayable).length && (\n <CustomCollapsible\n triggerAnchor=\"bottom\"\n onClickTrigger={() => setOpenCollapse((prev) => !prev)}\n trigger={\n <div className={trigger()}>\n <Typography size=\"small\" variant=\"body\" color=\"neutral700\">\n {openCollapse\n ? i18n.t('Hide non-payable fees')\n : i18n.t('Show non-payable fees')}\n </Typography>\n <Divider size={4} direction=\"horizontal\" />\n <ExpandedIcon orientation={openCollapse ? 'up' : 'down'}>\n <ChevronDownIcon size={12} color=\"gray\" />\n </ExpandedIcon>\n </div>\n }\n open={openCollapse}>\n <Typography size=\"small\" variant=\"title\">\n {i18n.t('Description')}\n </Typography>\n <Divider size={4} />\n <Typography size=\"small\" variant=\"body\" color=\"neutral700\">\n {i18n.t(`The following fees are considered in the transaction output and\n you won\u2019t need to pay extra gas for them.`)}\n </Typography>\n <Divider size={10} />\n {Object.entries(feesGroup.nonePayable).map(\n ([nonPayableFeesKey, fees], index) => {\n const totalFeeInUsd = getTotalFeesInUsd(fees);\n const label = NAME_OF_FEES[nonPayableFeesKey as NameOfFees];\n const key = `non-payable-fee-${index}`;\n return (\n <NonPayableFee\n key={key}\n fee={totalFeeInUsd}\n label={label}\n />\n );\n }\n )}\n\n <Line />\n </CustomCollapsible>\n )}\n </ModalContainer>\n </WatermarkedModal>\n </>\n );\n}\n", "import { css, styled } from '@rango-dev/ui';\n\nexport const FeeSection = styled('div', {\n display: 'flex',\n justifyContent: 'space-between',\n alignItems: 'center',\n padding: '$5 0',\n '&.total_payable_fee': {\n padding: '$12 0',\n },\n});\n\nexport const Line = styled('div', {\n width: '100%',\n borderTop: '1px solid $neutral300',\n margin: '$10 0',\n});\n\nexport const ModalContainer = styled('div', {\n padding: '$20 0',\n display: 'flex',\n flexDirection: 'column',\n '& .collapsible_trigger': {\n display: 'flex',\n alignItems: 'center',\n },\n});\n\nexport const ModalHeader = styled('div', {\n padding: '$20 $20 $10',\n textAlign: 'center',\n position: 'relative',\n '._icon-button': {\n position: 'absolute',\n zIndex: 10,\n top: '$16',\n right: '$16',\n },\n});\nexport const trigger = css({\n display: 'flex',\n flexDirection: 'row',\n alignItems: 'center',\n padding: '$5',\n '&:hover': {\n '& ._typography, & svg': {\n color: '$secondary',\n },\n },\n});\n", "import type { PriceImpactWarningLevel, Step } from '@rango-dev/ui';\n\nimport { i18n } from '@lingui/core';\nimport { TokenAmount } from '@rango-dev/ui';\nimport React from 'react';\n\nimport { getContainer } from '../../utils/common';\n\nimport { Container, separatorStyles } from './QuoteSummary.styles';\n\ntype PropTypes = {\n from: Step['from'];\n to: Step['to'];\n percentageChange?: string | null;\n warningLevel: PriceImpactWarningLevel;\n};\n\nexport function QuoteSummary(props: PropTypes) {\n const { from, to, percentageChange, warningLevel } = props;\n\n return (\n <Container>\n <TokenAmount\n direction=\"horizontal\"\n label={i18n.t('Swap input')}\n type=\"input\"\n tooltipContainer={getContainer()}\n price={{\n value: from.price.value,\n usdValue: from.price.usdValue,\n realValue: from.price.realValue,\n realUsdValue: from.price.realUsdValue,\n }}\n token={{\n displayName: from.token.displayName,\n image: from.token.image,\n }}\n chain={{ image: from.chain.image }}\n />\n <div className={separatorStyles()} />\n <TokenAmount\n direction=\"horizontal\"\n tooltipContainer={getContainer()}\n label={i18n.t('Estimated output')}\n type=\"output\"\n price={{\n value: to.price.value,\n usdValue: to.price.usdValue,\n realValue: to.price.realValue,\n realUsdValue: to.price.realUsdValue,\n }}\n token={{\n displayName: to.token.displayName,\n image: to.token.image,\n }}\n chain={{ image: to.chain.image }}\n percentageChange={percentageChange}\n warningLevel={warningLevel}\n />\n </Container>\n );\n}\n", "import { css, styled } from '@rango-dev/ui';\n\nexport const Container = styled('div', {\n position: 'relative',\n display: 'flex',\n flexDirection: 'column',\n width: '100%',\n});\n\nexport const separatorStyles = css({\n height: '14px',\n marginLeft: '14px',\n position: 'absolute',\n borderLeft: '1px solid $foreground',\n top: '42%',\n});\n", "import type { QuoteTriggerImagesProps, QuoteTriggerProps } from './Quote.types';\n\nimport { i18n } from '@lingui/core';\nimport {\n ChevronDownIcon,\n ChevronRightIcon,\n Divider,\n Image,\n Tooltip,\n Typography,\n} from '@rango-dev/ui';\nimport React from 'react';\n\nimport useScreenDetect from '../../hooks/useScreenDetect';\nimport { getContainer } from '../../utils/common';\nimport { getUniqueBlockchains } from '../../utils/quote';\n\nimport {\n IconContainer,\n ImageContainer,\n MoreStep,\n rowStyles,\n Trigger,\n} from './Quote.styles';\n\nconst MAX_STEPS = 4;\nconst MAX_BLOCKCHAINS = 6;\n\nconst ImageComponent = (props: QuoteTriggerImagesProps) => {\n const tooltipContainer = getContainer();\n const { content, src, className, open, state } = props;\n return (\n <Tooltip\n container={tooltipContainer}\n side=\"bottom\"\n sideOffset={4}\n open={open}\n content={content}>\n <ImageContainer className={className} state={state}>\n <Image src={src} size={16} />\n </ImageContainer>\n </Tooltip>\n );\n};\n\nexport function QuoteTrigger(props: QuoteTriggerProps) {\n const { quoteRef, selected, setExpanded, steps, expanded, type } = props;\n const tooltipContainer = getContainer();\n const numberOfSteps = steps.length;\n const blockchains = getUniqueBlockchains(steps);\n const { isTablet, isMobile } = useScreenDetect();\n\n return (\n <Trigger\n listItem={type === 'list-item'}\n ref={(ref) => (quoteRef.current = ref)}\n selected={selected}\n onClick={(e) => {\n e.stopPropagation();\n setExpanded((prevState) => !prevState);\n }}>\n <div className={rowStyles()}>\n <Typography variant=\"body\" size=\"xsmall\">\n {i18n.t('Via:')}\n </Typography>\n <Divider direction=\"horizontal\" size={4} />\n {steps.map((step, index) => {\n const key = `item-${index}`;\n const arrow = (\n <IconContainer>\n <ChevronRightIcon size={12} color=\"black\" />\n </IconContainer>\n );\n\n return isMobile || isTablet ? (\n <React.Fragment key={key}>\n <ImageComponent\n content={step.swapper.displayName}\n src={step.swapper.image}\n state={step.state}\n />\n {index !== numberOfSteps - 1 && <>{arrow}</>}\n </React.Fragment>\n ) : (\n <React.Fragment key={key}>\n {numberOfSteps <= MAX_STEPS ||\n (numberOfSteps > MAX_STEPS && index < MAX_STEPS - 1) ? (\n <>\n <ImageComponent\n content={step.swapper.displayName}\n src={step.swapper.image}\n state={step.state}\n />\n {index !== numberOfSteps - 1 && <>{arrow}</>}\n </>\n ) : (\n index === MAX_STEPS - 1 && (\n <Tooltip\n container={tooltipContainer}\n side=\"bottom\"\n align=\"right\"\n sideOffset={4}\n content={\n <div className={rowStyles()}>\n {arrow}\n {steps.map((step, i) => {\n const key = `image-${i}`;\n return (\n i >= index && (\n <React.Fragment key={key}>\n <ImageComponent\n content={step.swapper.displayName}\n src={step.swapper.image}\n state={step.state}\n open={false}\n />\n {i !== numberOfSteps - 1 && <>{arrow}</>}\n </React.Fragment>\n )\n );\n })}\n </div>\n }>\n <MoreStep\n state={\n steps.find(\n (step, i) =>\n i >= index &&\n (step.state === 'error' || step.state === 'warning')\n )?.state\n }>\n <Typography size=\"xsmall\" variant=\"body\">\n +{numberOfSteps - index}\n </Typography>\n </MoreStep>\n </Tooltip>\n )\n )}\n </React.Fragment>\n );\n })}\n </div>\n <div className={rowStyles()}>\n <div className=\"blockchains_section\">\n <div className={rowStyles()}>\n <Typography variant=\"body\" size=\"xsmall\">\n {i18n.t('Chains:')}\n </Typography>\n <Divider direction=\"horizontal\" size={4} />\n {blockchains.map((blockchain, index) => (\n <React.Fragment key={blockchain.displayName}>\n {blockchains.length <= MAX_BLOCKCHAINS ||\n (blockchains.length > MAX_BLOCKCHAINS &&\n index < MAX_BLOCKCHAINS - 1) ? (\n <ImageComponent\n content={''}\n src={blockchain.image}\n open={false}\n className={index !== 0 ? 'blockchainImage' : ''}\n />\n ) : (\n index === MAX_BLOCKCHAINS - 1 && (\n <Tooltip\n container={tooltipContainer}\n side=\"bottom\"\n align=\"right\"\n sideOffset={4}\n content={\n <div className={rowStyles()}>\n {blockchains.map(\n (chain, i) =>\n i >= index && (\n <ImageComponent\n key={chain.displayName}\n content={''}\n src={chain.image}\n open={false}\n className={i > index ? 'blockchainImage' : ''}\n />\n )\n )}\n </div>\n }>\n <MoreStep className={'blockchainImage'}>\n <Typography size=\"xsmall\" variant=\"body\">\n +{blockchains.length - index}\n </Typography>\n </MoreStep>\n </Tooltip>\n )\n )}\n </React.Fragment>\n ))}\n\n <Divider direction=\"horizontal\" size={32} />\n </div>\n </div>\n\n <IconContainer orientation={expanded ? 'up' : 'down'}>\n <ChevronDownIcon size={12} color=\"black\" />\n </IconContainer>\n </div>\n </Trigger>\n );\n}\n", "import { useEffect, useState } from 'react';\n\n/*\n * mobile: screen <= 480\n * tablet: screen > 480 and screen <= 768\n * notebook: screen > 768 & screen <= 1024\n * large: screen > 1024 & screen <= 1200\n * extra large: screen > 1200\n */\n\nconst MIN_TABLET_WIDTH = 480;\nconst MIN_NOTEBOOK_WIDTH = 768;\nconst MIN_LARGE_SCREEN_WIDTH = 1024;\nconst MIN_EXTRA_LARGE_SCREEN_WIDTH = 1200;\n\nconst useScreenDetect = () => {\n const [isMobile, setIsMobile] = useState(false);\n const [isTablet, setIsTablet] = useState(false);\n const [isNotebook, setIsNotebook] = useState(false);\n const [isLargeScreen, setIsLargeScreen] = useState(false);\n const [isExtraLargeScreen, setIsExtraLargeScreen] = useState(false);\n\n const handleResize = () => {\n setIsMobile(window.innerWidth <= MIN_TABLET_WIDTH);\n setIsTablet(\n window.innerWidth > MIN_TABLET_WIDTH &&\n window.innerWidth <= MIN_NOTEBOOK_WIDTH\n );\n setIsNotebook(\n window.innerWidth > MIN_NOTEBOOK_WIDTH &&\n window.innerWidth <= MIN_LARGE_SCREEN_WIDTH\n );\n setIsLargeScreen(\n window.innerWidth > MIN_LARGE_SCREEN_WIDTH &&\n window.innerWidth <= MIN_EXTRA_LARGE_SCREEN_WIDTH\n );\n setIsExtraLargeScreen(window.innerWidth > MIN_EXTRA_LARGE_SCREEN_WIDTH);\n };\n\n useEffect(() => {\n handleResize(); // Initial check\n window.addEventListener('resize', handleResize);\n return () => window.removeEventListener('resize', handleResize);\n }, []);\n\n return { isMobile, isTablet, isNotebook, isLargeScreen, isExtraLargeScreen };\n};\n\nexport default useScreenDetect;\n", "import type { PropTypes } from './QuoteSkeleton.types';\n\nimport { Divider, Skeleton } from '@rango-dev/ui';\nimport React from 'react';\n\nimport { Chains, Container, Steps } from './QuoteSkeleton.styles';\nimport { QuoteSummarySkeleton } from './QuoteSummarySkeleton';\nimport { StepSkeleton } from './StepSkeleton';\n\nexport function QuoteSkeleton(props: PropTypes) {\n const { type, expanded, tagHidden = false } = props;\n\n return (\n <Container rounded={type !== 'basic'}>\n <QuoteSummarySkeleton type={type} tagHidden={tagHidden} />\n <Chains>\n <Skeleton height={15} variant=\"rounded\" />\n </Chains>\n\n {expanded && (\n <Steps>\n <Divider size={20} />\n <StepSkeleton />\n <StepSkeleton />\n <StepSkeleton separator={false} />\n </Steps>\n )}\n </Container>\n );\n}\n", "import { darkTheme, styled } from '@rango-dev/ui';\n\nexport const Container = styled('div', {\n $$color: '$colors$neutral100',\n [`.${darkTheme} &`]: {\n $$color: '$colors$neutral300',\n },\n backgroundColor: '$$color',\n borderBottomLeftRadius: '$xm',\n borderBottomRightRadius: '$xm',\n padding: '$15 ',\n variants: {\n rounded: {\n true: {\n borderRadius: '$xm',\n },\n },\n },\n});\n\nexport const Chains = styled('div', {\n paddingTop: '$2',\n});\n\nexport const Steps = styled('div', {\n paddingLeft: '$8',\n});\n\nexport const StepSeparator = styled('div', {\n borderLeft: '1px dashed $foreground',\n minHeight: ' 0',\n margin: '0px 11.5px',\n alignSelf: 'stretch',\n variants: {\n hideSeparator: {\n true: {\n minHeight: 'unset',\n height: '0',\n },\n },\n },\n});\n", "import type { PropTypes } from './QuoteSummarySkeleton.types';\n\nimport { ChainToken, Divider, Skeleton } from '@rango-dev/ui';\nimport React from 'react';\n\nimport { Line } from '../Quote/Quote.styles';\n\nimport {\n BasicSummary,\n FlexContent,\n Output,\n OutputTokenInfo,\n QuoteSummary,\n QuoteSummarySeparator,\n RowStyle,\n SwapPreview,\n TokenAmount,\n TokenAmountLabel,\n} from './QuoteSummarySkeleton.styles';\n\nexport function QuoteSummarySkeleton(props: PropTypes) {\n const { type, tagHidden = true } = props;\n const quotePreview = (\n <QuoteSummary>\n <TokenAmount>\n <ChainToken loading size=\"medium\" chainImage=\"\" tokenImage=\"\" />\n <Divider size={8} direction=\"horizontal\" />\n <TokenAmountLabel>\n <Skeleton height={10} width={60} variant=\"rounded\" />\n <Divider size={4} />\n <Skeleton height={15} variant=\"rounded\" />\n </TokenAmountLabel>\n </TokenAmount>\n <Skeleton height={12} width={64} variant=\"rounded\" />\n </QuoteSummary>\n );\n const showAllRoutesSkeleton = type === 'basic' && !tagHidden;\n\n return (\n <div>\n {!tagHidden && (\n <>\n <FlexContent>\n <Skeleton width={65} height={14} variant=\"rounded\" />\n <Divider size={4} direction=\"horizontal\" />\n <Skeleton width={65} height={14} variant=\"rounded\" />\n <Divider size={4} direction=\"horizontal\" />\n <Skeleton width={65} height={14} variant=\"rounded\" />\n </FlexContent>\n <Line />\n {!showAllRoutesSkeleton && <Divider size={4} />}\n </>\n )}\n <div className={RowStyle()}>\n <FlexContent>\n <Skeleton width={60} height={10} variant=\"rounded\" />\n <Divider size={4} direction=\"horizontal\" />\n <Skeleton width={60} height={10} variant=\"rounded\" />\n <Divider size={4} direction=\"horizontal\" />\n <Skeleton width={60} height={10} variant=\"rounded\" />\n </FlexContent>\n {showAllRoutesSkeleton && (\n <Skeleton width={100} height={22} variant=\"rounded\" />\n )}\n </div>\n\n {type === 'basic' && (\n <BasicSummary>\n <Skeleton height={15} width={148} variant=\"rounded\" />\n </BasicSummary>\n )}\n {type === 'list-item' && (\n <Output>\n <OutputTokenInfo>\n <ChainToken loading size=\"medium\" chainImage=\"\" tokenImage=\"\" />\n <Divider direction=\"horizontal\" size={4} />\n <Skeleton height={15} width={150} variant=\"rounded\" />\n </OutputTokenInfo>\n <Divider size={10} />\n <Skeleton height={10} width={184} variant=\"rounded\" />\n </Output>\n )}\n {type === 'swap-preview' && (\n <>\n <Divider size={4} />\n <SwapPreview>\n {quotePreview}\n <QuoteSummarySeparator />\n {quotePreview}\n </SwapPreview>\n </>\n )}\n </div>\n );\n}\n", "import { css, styled } from '@rango-dev/ui';\n\nexport const FlexContent = styled('div', {\n display: 'flex',\n});\n\nexport const BasicSummary = styled('div', {\n padding: '$10 $0 $20',\n});\n\nexport const Output = styled('div', {\n padding: '$12 $0 $20 $0',\n display: 'flex',\n flexDirection: 'column',\n});\n\nexport const OutputTokenInfo = styled('div', {\n display: 'flex',\n justifyContent: 'start',\n alignItems: 'center',\n});\n\nexport const QuoteSummary = styled('div', {\n display: 'flex',\n justifyContent: 'space-between',\n alignItems: 'end',\n});\n\nexport const QuoteSummarySeparator = styled('div', {\n height: '$28',\n marginLeft: '13px',\n borderLeft: '1px solid $neutral700',\n});\n\nexport const TokenAmount = styled('div', {\n width: '65%',\n display: 'flex',\n justifyContent: 'start',\n});\n\nexport const TokenAmountLabel = styled('div', {\n display: 'flex',\n flexDirection: 'column',\n alignItems: 'start',\n flexGrow: 1,\n maxWidth: '148px',\n});\n\nexport const SwapPreview = styled('div', { padding: '$15 $0 $15 $0' });\n\nexport const RowStyle = css({\n display: 'flex',\n justifyContent: 'space-between',\n alignItems: 'center',\n});\n", "import type { PropTypes } from './StepSkeleton.types';\n\nimport { ChainToken, Divider, NextIcon, Skeleton } from '@rango-dev/ui';\nimport React from 'react';\n\nimport { StepSeparator } from './QuoteSkeleton.styles';\nimport {\n StepContent,\n StepIconContainer,\n StepTitle,\n StepTokenInfo,\n StepTokens,\n} from './StepSkeleton.styles';\n\nexport function StepSkeleton(props: PropTypes) {\n const { separator = true } = props;\n return (\n <>\n <StepTitle>\n <Skeleton height={22} width={22} variant=\"circular\" />\n <Divider direction=\"horizontal\" size={8} />\n <Skeleton height={15} width={148} variant=\"rounded\" />\n </StepTitle>\n <StepContent>\n <StepSeparator hideSeparator={!separator} />\n <StepTokens>\n <StepTokenInfo>\n <ChainToken size=\"small\" loading chainImage=\"\" tokenImage=\"\" />\n <Divider direction=\"horizontal\" size={8} />\n <Skeleton height={12} variant=\"rounded\" />\n </StepTokenInfo>\n <StepIconContainer>\n <NextIcon color=\"gray\" size={16} />\n </StepIconContainer>\n <StepTokenInfo>\n <ChainToken size=\"small\" loading chainImage=\"\" tokenImage=\"\" />\n <Divider direction=\"horizontal\" size={8} />\n <Skeleton height={12} variant=\"rounded\" />\n </StepTokenInfo>\n </StepTokens>\n </StepContent>\n </>\n );\n}\n", "import { styled } from '@rango-dev/ui';\n\nexport const StepContent = styled('div', {\n display: 'flex',\n alignItems: 'start',\n});\n\nexport const StepTokens = styled('div', {\n flexGrow: 1,\n paddingTop: '$5',\n paddingBottom: '$10',\n display: 'flex',\n alignItems: 'center',\n});\n\nexport const StepTokenInfo = styled('div', {\n display: 'flex',\n alignItems: 'center',\n flexGrow: 1,\n});\n\nexport const StepIconContainer = styled('div', {\n margin: '$0 $2',\n padding: '$4',\n display: 'flex',\n justifyContent: 'center',\n alignItems: 'center',\n});\n\nexport const StepTitle = styled('div', {\n display: 'flex',\n alignItems: 'center',\n});\n", "import type { ConfirmSwap, Params } from './useConfirmSwap.types';\nimport type { PendingSwapSettings, SelectedQuote } from '../../types';\nimport type { ConfirmRouteRequest } from 'rango-sdk';\n\nimport { calculatePendingSwap } from '@rango-dev/queue-manager-rango-preset';\nimport { useEffect } from 'react';\n\nimport { useAppStore } from '../../store/AppStore';\nimport { useQuoteStore } from '../../store/quote';\nimport { getWalletsForNewSwap } from '../../utils/swap';\nimport { useFetchConfirmQuote } from '../useFetchConfirmQuote';\n\nimport {\n generateWarnings,\n handleQuoteErrors,\n throwErrorIfResponseIsNotValid,\n} from './useConfirmSwap.helpers';\n\nexport function useConfirmSwap(): ConfirmSwap {\n const {\n fromToken,\n toToken,\n inputAmount,\n setSelectedQuote,\n selectedQuote: initialQuote,\n customDestination: customDestinationFromStore,\n setQuoteWarningsConfirmed,\n resetAlerts,\n } = useQuoteStore();\n\n const { slippage, customSlippage } = useAppStore();\n const disabledLiquiditySources = useAppStore().getDisabledLiquiditySources();\n const blockchains = useAppStore().blockchains();\n const tokens = useAppStore().tokens();\n\n const userSlippage = customSlippage || slippage;\n\n const { fetch: fetchQuote, cancelFetch, loading } = useFetchConfirmQuote();\n\n useEffect(() => cancelFetch, []);\n\n const fetch: ConfirmSwap['fetch'] = async (params: Params) => {\n const selectedWallets = params.selectedWallets;\n const customDestination =\n params?.customDestination ?? customDestinationFromStore;\n\n if (!fromToken || !toToken || !inputAmount) {\n return {\n quote: null,\n swap: null,\n error: null,\n warnings: null,\n };\n }\n\n const wallets = selectedWallets.reduce(\n (acc: Record<string, string>, item) => {\n acc[item.chain] = item.address;\n return acc;\n },\n {}\n );\n const requestBody: ConfirmRouteRequest = {\n requestId: initialQuote?.requestId || '',\n selectedWallets: wallets,\n destination: customDestination || undefined,\n };\n\n try {\n return await fetchQuote(requestBody).then((response) => {\n const { result } = response;\n\n throwErrorIfResponseIsNotValid({\n diagnosisMessages: result.diagnosisMessages,\n requestId: result.requestId,\n swaps: result.result?.swaps,\n });\n\n const currentQuote: SelectedQuote = {\n outputAmount: result.result?.outputAmount,\n requestId: result.requestId,\n resultType: result.result?.resultType,\n swaps: result.result?.swaps || [],\n validationStatus: result.validationStatus,\n requestAmount: result.requestAmount,\n };\n setSelectedQuote(currentQuote);\n const swapSettings: PendingSwapSettings = {\n slippage: userSlippage.toString(),\n disabledSwappersGroups: disabledLiquiditySources,\n };\n const swap = calculatePendingSwap(\n inputAmount.toString(),\n result,\n getWalletsForNewSwap(selectedWallets),\n swapSettings,\n false,\n { blockchains, tokens }\n );\n\n const confirmSwapWarnings = generateWarnings(\n initialQuote ?? undefined,\n currentQuote,\n {\n fromToken,\n toToken,\n meta: { blockchains, tokens },\n selectedWallets,\n userSlippage,\n }\n );\n if (confirmSwapWarnings.quoteUpdate) {\n setQuoteWarningsConfirmed(false);\n }\n resetAlerts();\n\n return {\n quote: currentQuote,\n swap,\n error: null,\n warnings: confirmSwapWarnings,\n };\n });\n } catch (error: any) {\n const confirmSwapResult = handleQuoteErrors(error);\n return confirmSwapResult;\n }\n };\n\n return {\n loading,\n fetch,\n cancelFetch,\n };\n}\n", "import type { RequestOptions } from 'rango-sdk';\n\nimport { useRef, useState } from 'react';\n\ntype UseFetchOptions<TRequest, TResponse> = {\n request: (\n requestBody: TRequest,\n options?: RequestOptions\n ) => Promise<TResponse>;\n};\nexport type UseFetchResult<TRequest, TResponse> = {\n fetch: (requestBody: TRequest) => Promise<TResponse>;\n cancelFetch: () => void;\n loading: boolean;\n};\n\nexport function useFetch<TRequest, TResponse>({\n request,\n}: UseFetchOptions<TRequest, TResponse>): UseFetchResult<TRequest, TResponse> {\n const [loading, setLoading] = useState(false);\n const abortController = useRef<AbortController | null>(null);\n\n const cancelFetch = () => abortController.current?.abort();\n\n const fetch: UseFetchResult<TRequest, TResponse>['fetch'] = async (\n requestBody\n ) => {\n cancelFetch();\n abortController.current = new AbortController();\n\n setLoading(true);\n try {\n const res = await request(requestBody, {\n signal: abortController.current.signal,\n });\n\n abortController.current = null;\n return res;\n // eslint-disable-next-line no-useless-catch\n } catch (error) {\n throw error;\n } finally {\n setLoading(false);\n }\n };\n\n return { fetch, loading, cancelFetch };\n}\n", "import type { UseFetchResult } from './useFetch';\nimport type { ConfirmRouteRequest, ConfirmRouteResponse } from 'rango-sdk';\n\nimport { httpService } from '../services/httpService';\n\nimport { useFetch } from './useFetch';\n\nexport function useFetchConfirmQuote(): UseFetchResult<\n ConfirmRouteRequest,\n ConfirmRouteResponse\n> {\n const { fetch, loading, cancelFetch } = useFetch<\n ConfirmRouteRequest,\n ConfirmRouteResponse\n >({\n request: async (requestBody, options) =>\n await httpService().confirmRouteRequest(requestBody, options),\n });\n\n return { fetch, loading, cancelFetch };\n}\n", "import type { ConfirmSwapFetchResult } from './useConfirmSwap.types';\nimport type {\n ConfirmSwapWarnings,\n QuoteErrorResponse,\n QuoteResponse,\n SelectedQuote,\n Wallet,\n} from '../../types';\nimport type { BlockchainMeta, SwapResult, Token } from 'rango-sdk';\n\nimport { errorMessages } from '../../constants/errors';\nimport { QuoteErrorType, QuoteUpdateType } from '../../types';\nimport { numberToString } from '../../utils/numbers';\nimport {\n generateQuoteWarnings,\n getPriceImpact,\n isNumberOfSwapsChanged,\n isQuoteChanged,\n isQuoteInternalCoinsUpdated,\n isQuoteSwappersUpdated,\n} from '../../utils/quote';\nimport {\n checkSlippageErrors,\n generateBalanceWarnings,\n getLimitErrorMessage,\n getMinRequiredSlippage,\n getQuoteOutputAmount,\n hasLimitError,\n isOutputAmountChangedALot,\n} from '../../utils/swap';\n\n/**\n * A request can be successful but in body of the response, it can be some case which is considered as failed.\n */\nexport function throwErrorIfResponseIsNotValid(response: QuoteResponse) {\n if (!response.swaps) {\n throw new Error(errorMessages().noResultError.title, {\n cause: {\n type: QuoteErrorType.NO_RESULT,\n diagnosisMessage: response.diagnosisMessages?.[0],\n },\n });\n }\n const quoteError = getQuoteError(response.swaps);\n if (quoteError) {\n throw new Error(quoteError.message, {\n cause: quoteError.options,\n });\n }\n}\n\nexport function getQuoteError(swaps: SwapResult[]): QuoteErrorResponse | null {\n const limitError = hasLimitError(swaps);\n if (limitError) {\n const { swap, recommendation, fromAmountRangeError } =\n getLimitErrorMessage(swaps);\n return {\n message: 'bridge limit error',\n options: {\n type: QuoteErrorType.BRIDGE_LIMIT,\n swap,\n recommendation,\n fromAmountRangeError,\n },\n };\n }\n\n const recommendedSlippages = checkSlippageErrors(swaps);\n\n if (recommendedSlippages) {\n const minRequiredSlippage = getMinRequiredSlippage(swaps);\n return {\n message: '',\n options: {\n type: QuoteErrorType.INSUFFICIENT_SLIPPAGE,\n recommendedSlippages,\n minRequiredSlippage,\n },\n };\n }\n return null;\n}\n\nexport function generateWarnings(\n previousQuote: SelectedQuote | undefined,\n currentQuote: SelectedQuote,\n params: {\n fromToken: Token;\n toToken: Token;\n meta: { blockchains: BlockchainMeta[]; tokens: Token[] };\n selectedWallets: Wallet[];\n userSlippage: number;\n }\n): ConfirmSwapWarnings {\n let quoteChanged = false;\n if (previousQuote) {\n quoteChanged = isQuoteChanged(previousQuote, currentQuote);\n }\n const output: ConfirmSwapWarnings = {\n quote: null,\n quoteUpdate: null,\n balance: null,\n };\n\n const quoteWarning = generateQuoteWarnings(currentQuote, {\n fromToken: params.fromToken,\n toToken: params.toToken,\n tokens: params.meta.tokens,\n userSlippage: params.userSlippage,\n });\n\n if (quoteWarning) {\n output.quote = quoteWarning;\n }\n\n if (previousQuote && quoteChanged) {\n if (isOutputAmountChangedALot(previousQuote, currentQuote)) {\n output.quoteUpdate = {\n type: QuoteUpdateType.QUOTE_AND_OUTPUT_AMOUNT_UPDATED,\n newOutputAmount: numberToString(getQuoteOutputAmount(currentQuote)),\n percentageChange: numberToString(\n getPriceImpact(\n getQuoteOutputAmount(previousQuote) ?? '',\n getQuoteOutputAmount(currentQuote) ?? ''\n ),\n null,\n 2\n ),\n };\n } else if (isNumberOfSwapsChanged(previousQuote, currentQuote)) {\n output.quoteUpdate = {\n type: QuoteUpdateType.QUOTE_UPDATED,\n };\n } else if (isQuoteSwappersUpdated(previousQuote, currentQuote)) {\n output.quoteUpdate = {\n type: QuoteUpdateType.QUOTE_SWAPPERS_UPDATED,\n };\n } else if (isQuoteInternalCoinsUpdated(previousQuote, currentQuote)) {\n output.quoteUpdate = {\n type: QuoteUpdateType.QUOTE_COINS_UPDATED,\n };\n }\n }\n\n const balanceWarnings = generateBalanceWarnings(\n currentQuote,\n params.selectedWallets,\n params.meta.blockchains\n );\n\n const enoughBalance = balanceWarnings.length === 0;\n\n if (!enoughBalance) {\n output.balance = {\n messages: balanceWarnings,\n };\n }\n\n return output;\n}\n\nexport function handleQuoteErrors(error: any): ConfirmSwapFetchResult {\n if (error?.code === 'ERR_CANCELED') {\n return {\n swap: null,\n error: {\n type: QuoteErrorType.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: QuoteErrorType.REQUEST_FAILED,\n },\n warnings: null,\n };\n}\n", "import type { PendingSwap, 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 { HistoryGroupedList } from '../components/HistoryGroupedList';\nimport { NotFoundContainer } from '../components/HistoryGroupedList/HistoryGroupedList.styles';\nimport { Layout, PageContainer } from '../components/Layout';\nimport { SearchInput } from '../components/SearchInput';\nimport { groupSwapsByDate } from '../utils/date';\nimport { containsText } from '../utils/numbers';\nimport { getPendingSwaps } from '../utils/queue';\n\nconst HistoryGroupedListContainer = 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 navigate = useNavigate();\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 title: i18n.t('History'),\n }}>\n <PageContainer>\n <SearchInput\n setValue={setSearchedFor}\n fullWidth\n variant=\"contained\"\n placeholder={i18n.t('Search Transaction')}\n autoFocus\n onChange={searchHandler}\n value={searchedFor}\n />\n <Divider size=\"16\" />\n <HistoryGroupedListContainer>\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 <HistoryGroupedList\n list={filteredList}\n onSwapClick={navigate}\n groupBy={groupSwapsByDate}\n isLoading={loading}\n />\n )}\n </HistoryGroupedListContainer>\n </PageContainer>\n </Layout>\n );\n}\n", "import type { PropTypes } from './HistoryGroupedList.types';\n\nimport { i18n } from '@lingui/core';\nimport {\n Divider,\n GroupedVirtualizedList,\n Skeleton,\n SwapListItem,\n Typography,\n} from '@rango-dev/ui';\nimport React, { useCallback, useEffect, useRef, useState } from 'react';\n\nimport {\n TOKEN_AMOUNT_MAX_DECIMALS,\n TOKEN_AMOUNT_MIN_DECIMALS,\n} from '../../constants/routing';\nimport { getContainer } from '../../utils/common';\nimport { formatTooltipNumbers, numberToString } from '../../utils/numbers';\n\nimport { calculateGroupsSoFar } from './HistoryGroupedList.helpers';\nimport {\n Group,\n groupStyles,\n SwapItemContainer,\n SwapList,\n Time,\n} from './HistoryGroupedList.styles';\n\nconst ITEMS_PER_PAGE = 10;\n\nexport function HistoryGroupedList(props: PropTypes) {\n const { list, onSwapClick, groupBy, isLoading } = props;\n const [currentGroupCounts, setCurrentGroupCounts] = useState<number[]>([]);\n const loadedItems = useRef(0);\n const { swaps, groupCounts, groups } = groupBy(list);\n\n const calculateGroups = useCallback(calculateGroupsSoFar, []);\n\n const loadMore = useCallback(() => {\n const remainedItems = list.length - loadedItems.current;\n if (remainedItems) {\n loadedItems.current += Math.min(remainedItems, ITEMS_PER_PAGE);\n setCurrentGroupCounts(calculateGroups(groupCounts, loadedItems.current));\n }\n }, [list.length]);\n\n useEffect(() => {\n if (!isLoading) {\n loadMore();\n }\n }, [isLoading, loadMore]);\n\n if (isLoading) {\n // The number of items presented in each group.\n const swaps = [1, 2];\n const loadingGroups = [swaps, swaps];\n return (\n <>\n {loadingGroups.map((group, index) => {\n const key = index;\n return (\n <Group key={key}>\n <Time>\n <Skeleton variant=\"text\" width={60} size=\"small\" />\n <Divider size={16} />\n </Time>\n <Divider size={4} />\n <SwapList>\n {group.map((_, index) => {\n const key = index;\n return <SwapListItem isLoading={true} key={key} />;\n })}\n </SwapList>\n </Group>\n );\n })}\n </>\n );\n }\n\n return (\n <GroupedVirtualizedList\n endReached={() => {\n if (loadedItems.current < list.length) {\n loadMore();\n }\n }}\n groupCounts={currentGroupCounts}\n groupContent={(index) => {\n return (\n <Group>\n <Time>\n <Typography\n variant=\"label\"\n size=\"medium\"\n className={groupStyles()}>\n {groups[index]}\n </Typography>\n </Time>\n </Group>\n );\n }}\n itemContent={(index, groupIndex) => {\n const swap = swaps[index];\n if (!swap) {\n return null;\n }\n const firstStep = swap.steps[0];\n const lastStep = swap.steps[swap.steps.length - 1];\n return (\n <SwapItemContainer key={swap.requestId}>\n <SwapListItem\n requestId={swap.requestId}\n creationTime={swap.creationTime}\n status={swap.status}\n onClick={onSwapClick}\n tooltipContainer={getContainer()}\n onlyShowTime={groups[groupIndex] === i18n.t('Today')}\n swapTokenData={{\n from: {\n token: {\n image: firstStep.fromLogo,\n displayName: firstStep.fromSymbol,\n },\n blockchain: {\n image: firstStep.fromBlockchainLogo || '',\n },\n amount: numberToString(\n swap.inputAmount,\n TOKEN_AMOUNT_MIN_DECIMALS,\n TOKEN_AMOUNT_MAX_DECIMALS\n ),\n realAmount: formatTooltipNumbers(swap.inputAmount),\n },\n to: {\n token: {\n image: lastStep.toLogo,\n displayName: lastStep.toSymbol,\n },\n blockchain: {\n image: lastStep.toBlockchainLogo || '',\n },\n amount: numberToString(\n lastStep.outputAmount ||\n lastStep.expectedOutputAmountHumanReadable ||\n '',\n TOKEN_AMOUNT_MIN_DECIMALS,\n TOKEN_AMOUNT_MAX_DECIMALS\n ),\n realAmount: formatTooltipNumbers(\n lastStep.outputAmount ||\n lastStep.expectedOutputAmountHumanReadable\n ),\n },\n }}\n />\n </SwapItemContainer>\n );\n }}\n />\n );\n}\n", "/*\n * The calculateGroupsSoFar Slices the total groups into the groups which contain the items so far.\n * For example, if you have [10, 10, 10, 10] groups in total,\n * slicing them to 23 will result in [10, 10, 3] :\n * https://virtuoso.dev/grouped-with-load-on-demand/\n */\nexport function calculateGroupsSoFar(totalGroups: number[], count: number) {\n const groups: number[] = [];\n let index = 0;\n do {\n const group = totalGroups[index];\n groups.push(Math.min(group, count));\n count -= group;\n index++;\n } while (count > 0 && index <= totalGroups.length);\n return groups;\n}\n", "import { css, darkTheme, styled } from '@rango-dev/ui';\n\nexport const groupStyles = css();\n\nexport const SwapItemContainer = styled('div', {\n display: 'flex',\n justifyContent: 'center',\n alignItems: 'center',\n padding: '$5',\n});\n\nexport const Group = styled('div', {\n width: '100%',\n display: 'flex',\n flexDirection: 'column',\n backgroundColor: '$background',\n padding: '$10 $5 0 $5',\n [`& .${groupStyles}`]: {\n $$color: '$colors$neutral600',\n [`.${darkTheme} &`]: {\n $$color: '$colors$neutral700',\n },\n color: '$$color',\n },\n});\n\nexport const Time = styled('div', {\n display: 'flex',\n justifyContent: 'flex-start',\n padding: '$2',\n});\n\nexport const SwapList = styled('div', {\n gap: '$10',\n display: 'flex',\n flexDirection: 'column',\n});\n\nexport const NotFoundContainer = styled('div', {\n height: '100%',\n display: 'flex',\n justifyContent: 'center',\n alignItems: 'center',\n});\n", "import type { 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 { GroupBy } from '../components/HistoryGroupedList/HistoryGroupedList.types';\nimport type { PendingSwap } from 'rango-types';\n\nimport { i18n } from '@lingui/core';\nimport dayjs from 'dayjs';\n\nexport const groupSwapsByDate: GroupBy = (swaps) => {\n const output: Map<\n string,\n {\n title: string;\n swaps: PendingSwap[];\n }\n > = new Map([\n [\n 'today',\n {\n title: i18n.t('Today'),\n swaps: [],\n },\n ],\n [\n 'week',\n {\n title: i18n.t('This week'),\n swaps: [],\n },\n ],\n [\n 'month',\n {\n title: i18n.t('This month'),\n swaps: [],\n },\n ],\n [\n 'year',\n {\n title: i18n.t('This year'),\n swaps: [],\n },\n ],\n ]);\n\n function addYearsToOutput(key: string, swap: PendingSwap) {\n if (!output.has(key)) {\n output.set(key, {\n title: key,\n swaps: [],\n });\n }\n output.get(key)?.swaps.push(swap);\n }\n\n const now = dayjs();\n swaps.forEach((swap) => {\n const time = Number(swap.creationTime);\n const swapDate = dayjs(time);\n if (now.isSame(swapDate, 'day')) {\n output.get('today')?.swaps.push(swap);\n } else if (now.isSame(swapDate, 'week')) {\n output.get('week')?.swaps.push(swap);\n } else if (now.isSame(swapDate, 'month')) {\n output.get('month')?.swaps.push(swap);\n } else if (now.isSame(swapDate, 'year')) {\n output.get('year')?.swaps.push(swap);\n } else {\n const year = new Date(time).getFullYear().toString();\n addYearsToOutput(year, swap);\n }\n });\n\n const groupedSwaps = Array.from(output.values()).filter(\n (item) => item.swaps.length > 0\n );\n const items = groupedSwaps.flatMap((group) => group.swaps);\n const groupCounts = groupedSwaps.map((group) => group.swaps.length);\n const groups = groupedSwaps.map((group) => group.title);\n\n return { swaps: items, groupCounts, groups };\n};\n", "import type { SelectedQuote } from '../types';\n\nimport { i18n } from '@lingui/core';\nimport { Button, Divider, styled, WarningIcon } from '@rango-dev/ui';\nimport React, { useEffect, useState } from 'react';\nimport { useNavigate } from 'react-router-dom';\n\nimport { HeaderButtons } from '../components/HeaderButtons';\nimport { Layout, PageContainer } from '../components/Layout';\nimport { QuoteWarningsAndErrors } from '../components/QuoteWarningsAndErrors';\nimport { navigationRoutes } from '../constants/navigationRoutes';\nimport { ExpandedQuotes } from '../containers/ExpandedQuotes';\nimport { Inputs } from '../containers/Inputs';\nimport { QuoteInfo } from '../containers/QuoteInfo';\nimport useScreenDetect from '../hooks/useScreenDetect';\nimport { useSwapInput } from '../hooks/useSwapInput';\nimport { useAppStore } from '../store/AppStore';\nimport { useQuoteStore } from '../store/quote';\nimport { useUiStore } from '../store/ui';\nimport { useWalletsStore } from '../store/wallets';\nimport { isVariantExpandable } from '../utils/configs';\nimport { getSwapButtonState, isTokensIdentical } from '../utils/swap';\n\nconst MainContainer = styled('div', {\n display: 'grid',\n gridTemplateColumns: 'auto auto',\n alignItems: 'flex-start',\n maxHeight: 700,\n '& .footer__alert': {\n paddingTop: '0',\n },\n});\nexport const TIME_TO_NAVIGATE_ANOTHER_PAGE = 300;\n\nexport function Home() {\n const navigate = useNavigate();\n const {\n fromToken,\n toToken,\n inputAmount,\n selectedQuote,\n refetchQuote,\n error: quoteError,\n warning: quoteWarning,\n quotes,\n setSelectedQuote,\n resetQuoteWallets,\n setQuoteWarningsConfirmed,\n updateQuotePartialState,\n } = useQuoteStore();\n const [isVisibleExpanded, setIsVisibleExpanded] = useState<boolean>(false);\n const { isLargeScreen, isExtraLargeScreen } = useScreenDetect();\n\n const { fetch: fetchQuote, loading } = useSwapInput({ refetchQuote });\n const { config, fetchStatus: fetchMetaStatus } = useAppStore();\n\n const { connectedWallets } = useWalletsStore();\n const { isActiveTab } = useUiStore();\n const [showQuoteWarningModal, setShowQuoteWarningModal] = useState(false);\n\n const needsToWarnEthOnPath = false;\n\n const swapButtonState = getSwapButtonState({\n fetchMetaStatus,\n fetchingQuote: loading,\n inputAmount,\n quote: selectedQuote,\n anyWalletConnected: connectedWallets.length > 0,\n error: quoteError,\n warning: quoteWarning,\n needsToWarnEthOnPath,\n });\n\n const isExpandable = isVariantExpandable(\n isLargeScreen,\n isExtraLargeScreen,\n config?.variant\n );\n\n const hasInputs =\n !!inputAmount &&\n !!fromToken &&\n !!toToken &&\n inputAmount !== '0' &&\n !isTokensIdentical(fromToken, toToken);\n\n const fetchingQuote = hasInputs && fetchMetaStatus === 'success' && loading;\n\n const hasValidQuotes =\n !isExpandable || (isExpandable && quotes?.results.length);\n const hasWarningOrError = quoteWarning || quoteError;\n const showMessages = hasValidQuotes && hasWarningOrError;\n\n useEffect(() => {\n resetQuoteWallets();\n updateQuotePartialState('refetchQuote', true);\n }, []);\n\n useEffect(() => {\n setIsVisibleExpanded(hasInputs);\n }, [hasInputs]);\n\n const onClickRefresh =\n (!!selectedQuote || quoteError) && !showQuoteWarningModal\n ? fetchQuote\n : undefined;\n\n const onHandleNavigation = (route: string) => {\n if (isExpandable && isVisibleExpanded) {\n setIsVisibleExpanded(false);\n setTimeout(() => {\n navigate(route);\n }, TIME_TO_NAVIGATE_ANOTHER_PAGE);\n } else {\n navigate(route);\n }\n };\n\n const onClickOnQuote = (quote: SelectedQuote) => {\n if (selectedQuote?.requestId !== quote.requestId) {\n setShowQuoteWarningModal(false);\n setSelectedQuote(quote);\n }\n };\n\n return (\n <MainContainer>\n <Layout\n height=\"auto\"\n footer={\n <Button\n type=\"primary\"\n size=\"large\"\n disabled={swapButtonState.disabled || !isActiveTab}\n prefix={\n swapButtonState.action === 'confirm-warning' && <WarningIcon />\n }\n fullWidth\n onClick={() => {\n if (swapButtonState.action === 'connect-wallet') {\n onHandleNavigation(navigationRoutes.wallets);\n } else if (swapButtonState.action === 'confirm-warning') {\n setShowQuoteWarningModal(true);\n } else {\n onHandleNavigation(navigationRoutes.confirmSwap);\n }\n }}>\n {swapButtonState.title}\n </Button>\n }\n header={{\n onWallet: () => {\n onHandleNavigation(navigationRoutes.wallets);\n },\n hasBackButton: false,\n title: config.title || i18n.t('Swap'),\n suffix: (\n <HeaderButtons\n hidden={isExpandable ? ['refresh'] : undefined}\n onClickRefresh={onClickRefresh}\n onClickHistory={() => onHandleNavigation(navigationRoutes.swaps)}\n onClickSettings={() => {\n onHandleNavigation(navigationRoutes.settings);\n }}\n />\n ),\n }}>\n <PageContainer>\n <Inputs\n fetchingQuote={fetchingQuote}\n fetchMetaStatus={fetchMetaStatus}\n onClickToken={(mode) => {\n onHandleNavigation(\n mode === 'from'\n ? navigationRoutes.fromSwap\n : navigationRoutes.toSwap\n );\n }}\n />\n <Divider size=\"2\" />\n {!isExpandable ? (\n <QuoteInfo\n quote={selectedQuote}\n loading={fetchingQuote}\n error={quoteError}\n tagHidden={false}\n warning={quoteWarning}\n type=\"basic\"\n onClickAllRoutes={\n !!quotes && quotes.results.length > 1\n ? () => {\n updateQuotePartialState('refetchQuote', false);\n onHandleNavigation(navigationRoutes.routes);\n }\n : undefined\n }\n />\n ) : null}\n\n {showMessages ? (\n <>\n <Divider size=\"10\" />\n <QuoteWarningsAndErrors\n warning={quoteWarning}\n error={quoteError}\n refetchQuote={fetchQuote}\n showWarningModal={showQuoteWarningModal}\n confirmationDisabled={!isActiveTab}\n onOpenWarningModal={() => setShowQuoteWarningModal(true)}\n onCloseWarningModal={() => setShowQuoteWarningModal(false)}\n onConfirmWarningModal={() => {\n setShowQuoteWarningModal(false);\n setQuoteWarningsConfirmed(true);\n onHandleNavigation(navigationRoutes.confirmSwap);\n }}\n onChangeSettings={() =>\n onHandleNavigation(navigationRoutes.settings)\n }\n />\n </>\n ) : null}\n </PageContainer>\n </Layout>\n {isExpandable ? (\n <ExpandedQuotes\n loading={fetchingQuote}\n onClickOnQuote={onClickOnQuote}\n fetch={fetchQuote}\n onClickRefresh={onClickRefresh}\n isVisible={isVisibleExpanded}\n />\n ) : null}\n </MainContainer>\n );\n}\n", "import type { PropTypes } from './ExpandedQuotes.types';\n\nimport { i18n } from '@lingui/core';\nimport { Header } from '@rango-dev/ui';\nimport React, { useEffect, useState } from 'react';\n\nimport { HeaderButtons } from '../../components/HeaderButtons';\nimport { LayoutContainer } from '../../components/Layout/Layout.styles';\nimport { Quotes } from '../../components/Quotes';\nimport { SelectStrategy } from '../../components/Quotes/SelectStrategy';\nimport { WIDGET_UI_ID } from '../../constants';\nimport { useAppStore } from '../../store/AppStore';\nimport { getExpanded } from '../../utils/common';\n\nimport { Container, Content } from './ExpandedQuotes.styles';\n\nexport const TIME_TO_CLOSE_OPEN_EXPANDED = 100;\n\nexport function ExpandedQuotes(props: PropTypes) {\n const { fetch, loading, onClickOnQuote, onClickRefresh, isVisible } = props;\n const [isDelayedVisible, setIsDelayedVisible] = useState(false);\n const containerClass = isDelayedVisible ? '' : 'is-hidden';\n const { config } = useAppStore();\n const fullExpandedMode = config?.variant === 'full-expanded';\n\n useEffect(() => {\n let timeout: ReturnType<typeof setTimeout> | null = null;\n\n if (isVisible) {\n timeout = setTimeout(() => {\n setIsDelayedVisible(true);\n }, TIME_TO_CLOSE_OPEN_EXPANDED);\n } else {\n setIsDelayedVisible(false);\n if (timeout) {\n clearTimeout(timeout);\n }\n }\n\n return () => {\n if (timeout) {\n clearTimeout(timeout);\n }\n };\n }, [isVisible]);\n\n return (\n <Container\n expandMode={config?.variant === 'full-expanded' ? 'full' : 'default'}\n className={`${containerClass} ${LayoutContainer()}`}\n id={WIDGET_UI_ID.EXPANDED_BOX_ID}>\n <Header\n title={i18n.t('Routes')}\n suffix={\n <>\n <SelectStrategy container={getExpanded()} />\n <HeaderButtons\n onClickRefresh={onClickRefresh}\n hidden={['history', 'notifications', 'settings']}\n />\n </>\n }\n />\n <Content>\n <Quotes\n showModalFee={false}\n fetch={fetch}\n hasSort={false}\n loading={loading}\n onClickOnQuote={onClickOnQuote}\n fullExpandedMode={fullExpandedMode}\n />\n </Content>\n </Container>\n );\n}\n", "import type { PropTypes } from './Quotes.types';\nimport type { MultiRouteSimulationResult } from 'rango-sdk';\n\nimport { i18n } from '@lingui/core';\nimport { Divider, FullExpandedQuote, Typography } from '@rango-dev/ui';\nimport React from 'react';\n\nimport { QuoteInfo } from '../../containers/QuoteInfo';\nimport { getQuoteError } from '../../hooks/useConfirmSwap/useConfirmSwap.helpers';\nimport { useAppStore } from '../../store/AppStore';\nimport { useQuoteStore } from '../../store/quote';\nimport { QuoteErrorType, type SelectedQuote } from '../../types';\nimport { getContainer } from '../../utils/common';\nimport { generateQuoteWarnings, sortQuotesBy } from '../../utils/quote';\nimport { NoResult } from '../NoResult';\nimport { QuoteSkeleton } from '../QuoteSkeleton';\n\nimport { ErrorsContainer, StrategyContent } from './Quotes.styles';\nimport { SelectStrategy } from './SelectStrategy';\n\nconst ITEM_SKELETON_COUNT = 3;\nexport function Quotes(props: PropTypes) {\n const {\n loading,\n onClickOnQuote,\n fetch,\n showModalFee,\n hasSort = true,\n fullExpandedMode = false,\n } = props;\n const {\n selectedQuote,\n quotes,\n updateQuotePartialState,\n fromToken,\n toToken,\n sortStrategy,\n error,\n } = useQuoteStore();\n const { slippage, customSlippage } = useAppStore();\n const tokens = useAppStore().tokens();\n const hasQuotes = !!quotes && quotes.results.length;\n const userSlippage = customSlippage ?? slippage;\n const getQuoteWarning = (quote: MultiRouteSimulationResult) => {\n if (!fromToken || !toToken || !quotes) {\n return null;\n }\n const mergedQuote: SelectedQuote = {\n requestAmount: quotes.requestAmount, // Assuming quotes is an array\n ...quote,\n };\n\n return generateQuoteWarnings(mergedQuote, {\n fromToken,\n toToken,\n userSlippage,\n tokens,\n });\n };\n const showNoResultMessage =\n error?.type === QuoteErrorType.NO_RESULT ||\n error?.type === QuoteErrorType.REQUEST_FAILED;\n\n const sortQuotes = quotes?.results\n ? sortQuotesBy(sortStrategy, quotes?.results)\n : [];\n\n return (\n <>\n {loading &&\n Array.from({ length: ITEM_SKELETON_COUNT }, (_, index) => (\n <React.Fragment key={index}>\n {fullExpandedMode ? (\n <FullExpandedQuote loading />\n ) : (\n <QuoteSkeleton\n tagHidden={false}\n type=\"list-item\"\n expanded={false}\n />\n )}\n {index !== ITEM_SKELETON_COUNT - 1 && <Divider size={16} />}\n </React.Fragment>\n ))}\n\n {!loading && (\n <>\n {hasSort && (\n <>\n <StrategyContent>\n <Typography size=\"xmedium\" variant=\"title\">\n {i18n.t('Sort by')}\n </Typography>\n <SelectStrategy container={getContainer()} />\n </StrategyContent>\n <Divider size=\"10\" />\n </>\n )}\n {hasQuotes\n ? sortQuotes.map((quote, index) => {\n const quoteWarning = getQuoteWarning(quote);\n const quoteError = getQuoteError(quote.swaps);\n const lastIndex = sortQuotes.length - 1 === index;\n\n return (\n <React.Fragment key={quote.requestId}>\n <QuoteInfo\n showModalFee={showModalFee}\n selected={selectedQuote?.requestId === quote.requestId}\n tagHidden={false}\n quote={{ ...quote, requestAmount: quotes.requestAmount }}\n loading={loading}\n error={quoteError?.options || null}\n warning={quoteWarning}\n fullExpandedMode={fullExpandedMode}\n onClick={(quote) => {\n if (!quoteError) {\n updateQuotePartialState('warning', quoteWarning);\n }\n updateQuotePartialState(\n 'error',\n quoteError?.options || null\n );\n onClickOnQuote(quote);\n }}\n type=\"list-item\"\n />\n {!lastIndex && <Divider size={16} />}\n </React.Fragment>\n );\n })\n : showNoResultMessage && (\n <ErrorsContainer>\n <NoResult\n size={fullExpandedMode ? 'large' : 'small'}\n error={error}\n fetch={fetch}\n />\n </ErrorsContainer>\n )}\n </>\n )}\n </>\n );\n}\n", "import { styled } from '@rango-dev/ui';\n\nexport const ErrorsContainer = styled('div', {\n display: 'flex',\n justifyContent: 'center',\n flexDirection: 'column',\n height: '100%',\n});\n\nexport const StrategyContent = styled('div', {\n display: 'flex',\n justifyContent: 'space-between',\n alignItems: 'center',\n});\n\nexport const SelectContainer = styled('div', {\n width: '146px',\n});\n", "import { Select } from '@rango-dev/ui';\nimport React from 'react';\n\nimport { ROUTE_STRATEGY } from '../../constants/quote';\nimport { useQuoteStore } from '../../store/quote';\n\nimport { SelectContainer } from './Quotes.styles';\n\nexport function SelectStrategy(props: { container: HTMLElement }) {\n const { updateQuotePartialState, sortStrategy } = useQuoteStore();\n\n return (\n <SelectContainer>\n <Select\n container={props.container}\n options={ROUTE_STRATEGY}\n value={sortStrategy}\n handleItemClick={(item) => {\n updateQuotePartialState('sortStrategy', item.value);\n }}\n variant=\"filled\"\n />\n </SelectContainer>\n );\n}\n", "import { darkTheme, styled } from '@rango-dev/ui';\n\nexport const Container = styled('div', {\n transition: 'width 0.2s, opacity 0.2s, margin-left 0.2s',\n height: '700px',\n width: '390px',\n opacity: 1,\n marginLeft: '$16',\n backgroundColor: '$neutral100',\n [`.${darkTheme} &`]: {\n backgroundColor: '$neutral300',\n },\n\n variants: {\n expandMode: {\n default: {\n width: '390px',\n },\n full: {\n width: '719px',\n },\n },\n },\n\n '&.is-hidden': {\n width: 0,\n height: 0,\n opacity: 0,\n marginLeft: 0,\n },\n});\n\nexport const Content = styled('div', {\n position: 'relative',\n overflow: 'hidden',\n padding: '$20',\n flexGrow: 1,\n display: 'flex',\n flexDirection: 'column',\n overflowY: 'auto',\n borderRadius: '$primary',\n backgroundColor: '$background',\n});\n", "import type { PropTypes } from './Inputs.types';\n\nimport { i18n } from '@lingui/core';\nimport { SwapInput } from '@rango-dev/ui';\nimport React from 'react';\n\nimport { SwitchFromAndToButton } from '../../components/SwitchFromAndTo';\nimport { errorMessages } from '../../constants/errors';\nimport {\n PERCENTAGE_CHANGE_MAX_DECIMALS,\n PERCENTAGE_CHANGE_MIN_DECIMALS,\n TOKEN_AMOUNT_MAX_DECIMALS,\n TOKEN_AMOUNT_MIN_DECIMALS,\n USD_VALUE_MAX_DECIMALS,\n USD_VALUE_MIN_DECIMALS,\n} from '../../constants/routing';\nimport { useQuoteStore } from '../../store/quote';\nimport { useWalletsStore } from '../../store/wallets';\nimport { getContainer } from '../../utils/common';\nimport { formatTooltipNumbers, numberToString } from '../../utils/numbers';\nimport { getPriceImpact, getPriceImpactLevel } from '../../utils/quote';\nimport { canComputePriceImpact } from '../../utils/swap';\nimport { formatBalance, isFetchingBalance } from '../../utils/wallets';\n\nimport { Container, FromContainer } from './Inputs.styles';\n\nexport function Inputs(props: PropTypes) {\n const { fetchingQuote, fetchMetaStatus, onClickToken } = props;\n const {\n fromToken,\n fromBlockchain,\n toToken,\n toBlockchain,\n setInputAmount,\n inputAmount,\n inputUsdValue,\n outputAmount,\n outputUsdValue,\n selectedQuote,\n } = useQuoteStore();\n const { connectedWallets, getBalanceFor } = useWalletsStore();\n\n const fromTokenBalance = fromToken ? getBalanceFor(fromToken) : null;\n\n const fromTokenFormattedBalance =\n formatBalance(fromTokenBalance)?.amount ?? '0';\n\n const tokenBalanceReal =\n !!fromBlockchain && !!fromToken\n ? numberToString(fromTokenBalance?.amount, fromTokenBalance?.decimals)\n : '0';\n\n const fetchingBalance =\n !!fromBlockchain &&\n isFetchingBalance(connectedWallets, fromBlockchain.name);\n\n const priceImpactInputCanNotBeComputed = !canComputePriceImpact(\n selectedQuote,\n inputAmount,\n inputUsdValue\n );\n\n const priceImpactOutputCanNotBeComputed = !canComputePriceImpact(\n selectedQuote,\n inputAmount,\n outputUsdValue\n );\n\n const percentageChange =\n !inputUsdValue || !outputUsdValue || !outputUsdValue.gt(0)\n ? null\n : getPriceImpact(inputUsdValue.toString(), outputUsdValue.toString());\n return (\n <Container>\n <FromContainer>\n <SwapInput\n label={i18n.t('From')}\n mode=\"From\"\n onInputChange={setInputAmount}\n balance={fromTokenFormattedBalance}\n chain={{\n displayName: fromBlockchain?.displayName || '',\n image: fromBlockchain?.logo || '',\n }}\n token={{\n displayName: fromToken?.symbol || '',\n image: fromToken?.image || '',\n }}\n onClickToken={() => onClickToken('from')}\n price={{\n value: inputAmount,\n usdValue: priceImpactInputCanNotBeComputed\n ? undefined\n : numberToString(\n inputUsdValue,\n USD_VALUE_MIN_DECIMALS,\n USD_VALUE_MAX_DECIMALS\n ),\n realUsdValue: priceImpactInputCanNotBeComputed\n ? undefined\n : formatTooltipNumbers(inputUsdValue),\n error: priceImpactInputCanNotBeComputed\n ? errorMessages().unknownPriceError.impactTitle\n : undefined,\n }}\n disabled={fetchMetaStatus === 'failed'}\n loading={fetchMetaStatus === 'loading'}\n loadingBalance={fetchingBalance}\n tooltipContainer={getContainer()}\n onSelectMaxBalance={() => {\n if (fromTokenFormattedBalance !== '0') {\n setInputAmount(tokenBalanceReal.split(',').join(''));\n }\n }}\n />\n <SwitchFromAndToButton />\n </FromContainer>\n <SwapInput\n sharpBottomStyle={!!selectedQuote || fetchingQuote}\n label={i18n.t('To')}\n mode=\"To\"\n fetchingQuote={fetchingQuote}\n chain={{\n displayName: toBlockchain?.displayName || '',\n image: toBlockchain?.logo || '',\n }}\n token={{\n displayName: toToken?.symbol || '',\n image: toToken?.image || '',\n }}\n percentageChange={numberToString(\n getPriceImpact(inputUsdValue, outputUsdValue),\n PERCENTAGE_CHANGE_MIN_DECIMALS,\n PERCENTAGE_CHANGE_MAX_DECIMALS\n )}\n warningLevel={getPriceImpactLevel(percentageChange ?? 0)}\n price={{\n value: numberToString(\n outputAmount,\n TOKEN_AMOUNT_MIN_DECIMALS,\n TOKEN_AMOUNT_MAX_DECIMALS\n ),\n usdValue: priceImpactOutputCanNotBeComputed\n ? undefined\n : numberToString(\n outputUsdValue,\n USD_VALUE_MIN_DECIMALS,\n USD_VALUE_MAX_DECIMALS\n ),\n realValue: formatTooltipNumbers(outputAmount),\n realUsdValue: priceImpactOutputCanNotBeComputed\n ? undefined\n : formatTooltipNumbers(outputUsdValue),\n error: priceImpactOutputCanNotBeComputed\n ? errorMessages().unknownPriceError.impactTitle\n : undefined,\n }}\n onClickToken={() => onClickToken('to')}\n disabled={fetchMetaStatus === 'failed'}\n loading={fetchMetaStatus === 'loading'}\n tooltipContainer={getContainer()}\n />\n </Container>\n );\n}\n", "import { ReverseIcon, styled } from '@rango-dev/ui';\nimport React from 'react';\n\nimport { useQuoteStore } from '../store/quote';\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 = useQuoteStore.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 { styled } from '@rango-dev/ui';\n\nexport const Container = styled('div', {\n display: 'flex',\n flexDirection: 'column',\n gap: '$5',\n alignSelf: 'stretch',\n});\n\nexport const FromContainer = styled('div', {\n position: 'relative',\n});\n", "import type { Token } from 'rango-sdk';\n\nimport { useCallback, useEffect, useState } from 'react';\n\nimport { useAppStore } from '../store/AppStore';\nimport { useQuoteStore } from '../store/quote';\nimport { useWalletsStore } from '../store/wallets';\nimport { QuoteErrorType } from '../types';\nimport { debounce } from '../utils/common';\nimport { isPositiveNumber } from '../utils/numbers';\nimport {\n generateQuoteWarnings,\n getDefaultQuote,\n sortQuotesBy,\n} from '../utils/quote';\nimport { isFeatureEnabled } from '../utils/settings';\nimport { createQuoteRequestBody } from '../utils/swap';\nimport { areTokensEqual } from '../utils/wallets';\n\nimport {\n handleQuoteErrors,\n throwErrorIfResponseIsNotValid,\n} from './useConfirmSwap/useConfirmSwap.helpers';\nimport { useFetchAllQuotes } from './useFetchAllQuotes';\n\nconst DEBOUNCE_DELAY = 600;\nconst FIRST_INDEX = 0;\n\ntype FetchQuoteParams = Omit<\n Parameters<typeof createQuoteRequestBody>[typeof FIRST_INDEX],\n 'fromToken' | 'toToken'\n> & { fromToken: Token | null; toToken: Token | null };\n\ntype UseSwapInput = {\n fetch: (shouldChangeSelectedQuote?: boolean) => void;\n loading: boolean;\n};\ntype UseSwapInputProps = {\n refetchQuote: boolean;\n};\n/**\n * a hook for fetching quote based on from and to input values\n * we use this hook in home page\n */\nexport function useSwapInput({\n refetchQuote,\n}: UseSwapInputProps): UseSwapInput {\n const { fetch: fetchQuote, cancelFetch } = useFetchAllQuotes();\n const {\n excludeLiquiditySources: configExcludeLiquiditySources,\n features,\n enableCentralizedSwappers,\n } = useAppStore().config;\n const connectedWallets = useWalletsStore.use.connectedWallets();\n\n const tokens = useAppStore().tokens();\n const {\n fromToken,\n toToken,\n inputAmount,\n inputUsdValue,\n selectedQuote,\n sortStrategy,\n resetQuote,\n error,\n warning,\n setSelectedQuote,\n updateQuotePartialState,\n } = useQuoteStore();\n const {\n slippage,\n customSlippage,\n affiliatePercent,\n affiliateRef,\n affiliateWallets,\n fetchStatus,\n } = useAppStore();\n const liquiditySources = useAppStore().getLiquiditySources();\n const disabledLiquiditySources = useAppStore().getDisabledLiquiditySources();\n const excludeLiquiditySources = useAppStore().excludeLiquiditySources();\n\n const [loading, setLoading] = useState(true);\n const userSlippage = customSlippage ?? slippage;\n const tokensValueInvalid = !fromToken || !toToken;\n const shouldSkipRequest =\n tokensValueInvalid ||\n areTokensEqual(fromToken, toToken) ||\n !isPositiveNumber(inputAmount);\n\n const resetState = (loading: boolean) => {\n setLoading(loading);\n };\n\n const fetch = (params: FetchQuoteParams) => {\n const {\n fromToken,\n toToken,\n inputAmount,\n liquiditySources,\n excludeLiquiditySources,\n disabledLiquiditySources,\n slippage,\n affiliateRef,\n affiliatePercent,\n affiliateWallets,\n } = params;\n\n if (!loading) {\n resetState(true);\n }\n if (!shouldSkipRequest && fromToken && toToken) {\n resetQuote();\n const requestBody = createQuoteRequestBody({\n fromToken,\n toToken,\n inputAmount,\n liquiditySources: liquiditySources,\n excludeLiquiditySources,\n disabledLiquiditySources,\n wallets: connectedWallets,\n slippage,\n affiliateRef,\n affiliatePercent,\n affiliateWallets,\n enableCentralizedSwappers,\n });\n if (isFeatureEnabled('experimentalRoute', features)) {\n requestBody.experimental = true;\n }\n fetchQuote(requestBody)\n .then((res) => {\n const sortQuotes = sortQuotesBy(sortStrategy, res.results);\n const quote = getDefaultQuote(\n selectedQuote,\n sortQuotes,\n res.requestAmount\n );\n\n setLoading(false);\n updateQuotePartialState('quotes', res);\n setSelectedQuote(quote);\n\n throwErrorIfResponseIsNotValid({\n diagnosisMessages: res.diagnosisMessages,\n requestId: quote?.requestId || '',\n swaps: quote?.swaps,\n });\n\n const quoteWarning =\n quote &&\n generateQuoteWarnings(quote, {\n fromToken,\n toToken,\n userSlippage,\n tokens,\n });\n updateQuotePartialState('warning', quoteWarning);\n })\n .catch((error) => {\n const { error: quoteError } = handleQuoteErrors(error);\n if (\n quoteError?.type === QuoteErrorType.NO_RESULT ||\n quoteError?.type === QuoteErrorType.REQUEST_FAILED\n ) {\n resetQuote();\n }\n if (quoteError?.type !== QuoteErrorType.REQUEST_CANCELED) {\n updateQuotePartialState('error', quoteError);\n setLoading(false);\n }\n });\n }\n };\n\n const debouncedFetch = useCallback(\n debounce((params: FetchQuoteParams) => {\n if (!shouldSkipRequest) {\n fetch(params);\n }\n }, DEBOUNCE_DELAY),\n [shouldSkipRequest]\n );\n\n useEffect(() => {\n if (!refetchQuote) {\n setLoading(false);\n return;\n }\n if (fetchStatus !== 'success') {\n return;\n }\n if (shouldSkipRequest) {\n setLoading(false);\n if (selectedQuote || error || warning) {\n resetQuote();\n }\n return;\n }\n if (!isPositiveNumber(inputAmount) || inputUsdValue?.eq(0)) {\n resetState(false);\n cancelFetch();\n return;\n }\n\n resetQuote();\n resetState(true);\n debouncedFetch({\n inputAmount,\n fromToken,\n toToken,\n liquiditySources,\n excludeLiquiditySources,\n disabledLiquiditySources,\n slippage: userSlippage,\n affiliateRef,\n affiliatePercent,\n affiliateWallets,\n });\n return cancelFetch;\n }, [\n fetchStatus,\n inputAmount,\n fromToken?.symbol,\n fromToken?.address,\n fromToken?.blockchain,\n toToken?.symbol,\n toToken?.address,\n toToken?.blockchain,\n shouldSkipRequest,\n liquiditySources?.length,\n configExcludeLiquiditySources,\n disabledLiquiditySources.length,\n userSlippage,\n affiliateRef,\n affiliatePercent,\n JSON.stringify(affiliateWallets),\n ]);\n\n return {\n fetch: () =>\n fetch({\n inputAmount,\n fromToken,\n toToken,\n liquiditySources,\n excludeLiquiditySources,\n disabledLiquiditySources,\n slippage: userSlippage,\n affiliateRef,\n affiliatePercent,\n affiliateWallets,\n }),\n loading,\n };\n}\n", "import type { UseFetchResult } from './useFetch';\nimport type { BestRouteRequest, MultiRouteResponse } from 'rango-sdk';\n\nimport { httpService } from '../services/httpService';\n\nimport { useFetch } from './useFetch';\n\nexport function useFetchAllQuotes(): UseFetchResult<\n BestRouteRequest,\n MultiRouteResponse\n> {\n const { fetch, loading, cancelFetch } = useFetch<\n BestRouteRequest,\n MultiRouteResponse\n >({\n request: async (requestBody, options) =>\n await httpService().getAllRoutes(requestBody, options),\n });\n\n return { fetch, loading, cancelFetch };\n}\n", "import { i18n } from '@lingui/core';\nimport {\n Alert,\n Divider,\n List,\n ListItemButton,\n Radio,\n RadioRoot,\n Typography,\n} from '@rango-dev/ui';\nimport React from 'react';\n\nimport { Layout, PageContainer } from '../components/Layout';\nimport { useLanguage } from '../hooks/useLanguage';\n\nexport function LanguagePage() {\n const { activeLanguage, changeLanguage, languages } = useLanguage();\n\n const languageList = languages.map((languageItem) => {\n const { local, label, SVGFlag } = languageItem;\n return {\n id: local,\n value: local,\n title: (\n <Typography variant=\"title\" size=\"xmedium\">\n {label}\n </Typography>\n ),\n onClick: () => changeLanguage(languageItem.local),\n end: <Radio value={local} />,\n start: <SVGFlag />,\n };\n });\n\n return (\n <Layout\n header={{\n title: i18n.t('Language'),\n }}>\n <PageContainer>\n <Alert\n type=\"warning\"\n variant=\"alarm\"\n title=\"Important Notice: Machine translations are in use\"\n />\n <Divider size={'8'} />\n <RadioRoot value={activeLanguage}>\n <List\n type={\n <ListItemButton\n title={i18n.t('language')}\n id=\"_\"\n onClick={() => console.log()}\n />\n }\n items={languageList}\n />\n </RadioRoot>\n </PageContainer>\n </Layout>\n );\n}\n", "import type { LanguageItem } from '../constants/languages';\n\nimport { type Language } from '@rango-dev/ui';\n\nimport { DEFAULT_LANGUAGE, LANGUAGES } from '../constants/languages';\nimport { useAppStore } from '../store/AppStore';\n\ninterface UseLanguage {\n languages: LanguageItem[];\n defaultLanguage: Language;\n activeLanguage: Language;\n changeLanguage: (language?: Language | null) => void;\n resetLanguage: () => void;\n}\n\nexport function useLanguage(): UseLanguage {\n const { setLanguage, language, config } = useAppStore();\n const languages = LANGUAGES;\n const defaultLanguage = config?.language || DEFAULT_LANGUAGE;\n\n return {\n activeLanguage: language || defaultLanguage,\n languages,\n defaultLanguage,\n changeLanguage: (language) => setLanguage(language || DEFAULT_LANGUAGE),\n resetLanguage: () => setLanguage(null),\n };\n}\n", "import type { UniqueSwappersGroupType } from '../utils/settings';\nimport type { SwapperType } from 'rango-sdk';\n\nimport { i18n } from '@lingui/core';\nimport {\n Button,\n Checkbox,\n Image,\n ListItemButton,\n NotFound,\n Typography,\n} from '@rango-dev/ui';\nimport React, { useState } from 'react';\n\nimport { Layout, PageContainer } from '../components/Layout';\nimport { LoadingLiquiditySourceList } from '../components/LoadingLiquiditySourceList';\nimport { SearchInput } from '../components/SearchInput';\nimport {\n LiquiditySourceList,\n LiquiditySourceSuffix,\n NotFoundContainer,\n} from '../components/SettingsContainer';\nimport { useAppStore } from '../store/AppStore';\nimport { containsText } from '../utils/numbers';\nimport { getUniqueSwappersGroups } from '../utils/settings';\n\ninterface PropTypes {\n sourceType: 'Exchanges' | 'Bridges';\n}\n\nexport function LiquiditySourcePage({ sourceType }: PropTypes) {\n const fetchStatus = useAppStore().fetchStatus;\n const swappers = useAppStore().swappers();\n const disabledLiquiditySources = useAppStore().getDisabledLiquiditySources();\n const [searchedFor, setSearchedFor] = useState<string>('');\n const toggleLiquiditySource = useAppStore().toggleLiquiditySource;\n const campaignMode = useAppStore().isInCampaignMode();\n const supportedUniqueSwappersGroups: Array<UniqueSwappersGroupType> =\n getUniqueSwappersGroups(swappers, disabledLiquiditySources);\n\n const types = { Exchanges: i18n.t('Exchanges'), Bridges: i18n.t('Bridges') };\n const validTypes: Array<SwapperType> = [];\n if (sourceType === 'Exchanges') {\n validTypes.push('DEX');\n }\n if (sourceType === 'Bridges') {\n validTypes.push('BRIDGE', 'AGGREGATOR', 'OFF_CHAIN');\n }\n\n const liquiditySources = supportedUniqueSwappersGroups.filter((uniqueItem) =>\n validTypes.includes(uniqueItem.type)\n );\n\n const hasSelectAll =\n liquiditySources.length ===\n liquiditySources.filter((sourceItem) => sourceItem.selected).length;\n\n const toggleAllSources = () => {\n liquiditySources.forEach((sourceItem) => {\n if (hasSelectAll) {\n toggleLiquiditySource(sourceItem.groupTitle);\n } else {\n if (!sourceItem.selected) {\n toggleLiquiditySource(sourceItem.groupTitle);\n }\n }\n });\n };\n\n const list = liquiditySources.map((sourceItem) => {\n const { selected, groupTitle, logo } = sourceItem;\n return {\n start: <Image src={logo} size={22} type=\"circular\" />,\n onClick: () => {\n if (!campaignMode) {\n toggleLiquiditySource(groupTitle);\n }\n },\n end: <Checkbox checked={selected} disabled={campaignMode} />,\n title: (\n <Typography variant=\"title\" size=\"xmedium\">\n {i18n.t(groupTitle)}\n </Typography>\n ),\n ...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 title: i18n.t(sourceType),\n suffix: (\n <LiquiditySourceSuffix>\n <Button variant=\"ghost\" size=\"xsmall\" onClick={toggleAllSources}>\n {hasSelectAll ? i18n.t('Deselect all') : i18n.t('Select all')}\n </Button>\n </LiquiditySourceSuffix>\n ),\n }}>\n <PageContainer view>\n <SearchInput\n value={searchedFor}\n setValue={setSearchedFor}\n fullWidth\n color=\"light\"\n variant=\"contained\"\n placeholder={i18n.t('Search {sourceType}', {\n sourceType: types[sourceType],\n })}\n onChange={searchHandler}\n />\n {fetchStatus === 'loading' && <LoadingLiquiditySourceList />}\n\n {!filteredList.length && !!searchedFor ? (\n <NotFoundContainer>\n <NotFound\n title={i18n.t('No results found')}\n description={i18n.t('Try using different keywords')}\n />\n </NotFoundContainer>\n ) : (\n fetchStatus === 'success' && (\n <LiquiditySourceList disabled={campaignMode}>\n {filteredList.map((sourceItem) => {\n const { groupTitle, ...otherProps } = sourceItem;\n\n return (\n <React.Fragment key={sourceItem.id}>\n <ListItemButton\n style={{ height: '61px' }}\n {...otherProps}\n selected={false}\n hasDivider\n />\n </React.Fragment>\n );\n })}\n </LiquiditySourceList>\n )\n )}\n </PageContainer>\n </Layout>\n );\n}\n", "import { Checkbox, Skeleton } from '@rango-dev/ui';\nimport React from 'react';\n\nimport { LiquiditySourceList } from '../SettingsContainer';\n\nimport { CustomListItem } from './LoadingLiquiditySourceList.styles';\n\nconst ITEM_SKELETON_COUNT = 30;\nexport function LoadingLiquiditySourceList() {\n return (\n <LiquiditySourceList>\n {Array.from(Array(ITEM_SKELETON_COUNT), (_, index) => (\n <CustomListItem\n hasDivider\n key={index}\n start={<Skeleton variant=\"circular\" width={35} height={35} />}\n title={<Skeleton variant=\"text\" size=\"large\" width={90} />}\n end={<Checkbox checked={false} />}\n />\n ))}\n </LiquiditySourceList>\n );\n}\n", "import { styled } from '@rango-dev/ui';\n\nexport const LiquiditySourceList = styled('ul', {\n padding: '$15 $5 0',\n margin: 0,\n listStyle: 'none',\n height: '100%',\n overflowY: 'auto',\n variants: {\n disabled: {\n true: {\n pointerEvents: 'none',\n },\n },\n },\n});\n\nexport const LiquiditySourceSuffix = styled('div', {\n width: 80,\n display: 'flex',\n justifyContent: 'flex-end',\n});\n\nexport const NotFoundContainer = styled('div', {\n display: 'flex',\n flexDirection: 'column',\n alignItems: 'center',\n justifyContent: 'center',\n height: '100%',\n});\n", "import { ListItem, styled } from '@rango-dev/ui';\n\nexport const CustomListItem = styled(ListItem, {\n height: 61,\n});\n", "import type { SelectedQuote } from '../types';\n\nimport { i18n } from '@lingui/core';\nimport React from 'react';\nimport { useNavigate } from 'react-router-dom';\n\nimport { HeaderButtons } from '../components/HeaderButtons';\nimport { Layout, PageContainer } from '../components/Layout';\nimport { Quotes } from '../components/Quotes';\nimport { navigationRoutes } from '../constants/navigationRoutes';\nimport { useNavigateBack } from '../hooks/useNavigateBack';\nimport { useSwapInput } from '../hooks/useSwapInput';\nimport { useQuoteStore } from '../store/quote';\n\nexport function RoutesPage() {\n const navigate = useNavigate();\n const navigateBack = useNavigateBack();\n\n const {\n selectedQuote,\n refetchQuote,\n setSelectedQuote,\n updateQuotePartialState,\n error: quoteError,\n } = useQuoteStore();\n\n const { fetch: fetchQuote, loading: fetchingQuote } = useSwapInput({\n refetchQuote,\n });\n\n const onClickOnQuote = (quote: SelectedQuote) => {\n setSelectedQuote(quote);\n updateQuotePartialState('refetchQuote', false);\n navigateBack();\n };\n\n const settings_url = `../${navigationRoutes.settings}`;\n const wallets_url = `../${navigationRoutes.wallets}`;\n return (\n <Layout\n header={{\n onWallet: () => {\n navigate(wallets_url);\n },\n onBack: () => {\n updateQuotePartialState('refetchQuote', false);\n },\n title: i18n.t('Routes'),\n suffix: (\n <HeaderButtons\n onClickRefresh={\n !!selectedQuote || quoteError ? fetchQuote : undefined\n }\n hidden={['notifications', 'history']}\n onClickSettings={() => navigate(settings_url)}\n />\n ),\n }}>\n <PageContainer>\n <Quotes\n fetch={fetchQuote}\n loading={fetchingQuote}\n onClickOnQuote={onClickOnQuote}\n />\n </PageContainer>\n </Layout>\n );\n}\n", "import { i18n } from '@lingui/core';\nimport {\n Divider,\n getCountCategories,\n SelectableCategoryList,\n} from '@rango-dev/ui';\nimport React, { useState } from 'react';\n\nimport { BlockchainList } from '../components/BlockchainList';\nimport { Layout, PageContainer } from '../components/Layout';\nimport { SearchInput } from '../components/SearchInput';\nimport { useNavigateBack } from '../hooks/useNavigateBack';\nimport { useAppStore } from '../store/AppStore';\nimport { useQuoteStore } from '../store/quote';\n\ninterface PropTypes {\n type: 'source' | 'destination';\n}\n\nexport function SelectBlockchainPage(props: PropTypes) {\n const { type } = props;\n const navigateBack = useNavigateBack();\n const [searchedFor, setSearchedFor] = useState<string>('');\n const [blockchainCategory, setBlockchainCategory] = useState<string>('ALL');\n const setToBlockchain = useQuoteStore.use.setToBlockchain();\n const setFromBlockchain = useQuoteStore.use.setFromBlockchain();\n const fetchStatus = useAppStore().fetchStatus;\n\n const blockchains = useAppStore().blockchains({\n type,\n });\n\n const countActiveCategories = getCountCategories(blockchains);\n\n const showCategory = countActiveCategories !== 1;\n\n return (\n <Layout\n header={{\n title: i18n.t(`Select Blockchain`),\n }}>\n <PageContainer view>\n {showCategory && (\n <>\n <SelectableCategoryList\n setCategory={setBlockchainCategory}\n category={blockchainCategory}\n blockchains={blockchains}\n isLoading={fetchStatus === 'loading'}\n />\n <Divider size={24} />\n </>\n )}\n\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 === 'source') {\n setFromBlockchain(blockchain);\n } else {\n setToBlockchain(blockchain);\n }\n navigateBack();\n }}\n />\n </PageContainer>\n </Layout>\n );\n}\n", "import type { PropTypes } from './BlockchainList.types';\nimport type { BlockchainMeta } from 'rango-sdk';\n\nimport { i18n } from '@lingui/core';\nimport {\n Divider,\n Image,\n ListItemButton,\n NotFound,\n Typography,\n} from '@rango-dev/ui';\nimport React, { useEffect, useState } from 'react';\n\nimport { useAppStore } from '../../store/AppStore';\n\nimport { filterBlockchains } from './BlockchainList.helpers';\nimport { 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 { fetchStatus } = useAppStore();\n\n useEffect(() => {\n setBlockchains([\n ...filterBlockchains(list, searchedFor, blockchainCategory),\n ]);\n }, [list, searchedFor, blockchainCategory]);\n\n const renderList = () => {\n if (!blockchains.length && !!searchedFor) {\n return (\n <>\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 as=\"ul\" 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 {fetchStatus === 'loading' && <LoadingBlockchainList />}\n {fetchStatus === 'success' && renderList()}\n </Container>\n );\n}\n", "import { BlockchainCategories } from '@rango-dev/ui';\nimport { type BlockchainMeta, TransactionType } from 'rango-sdk';\n\nimport { containsText } from '../../utils/common';\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", "import { ImageContainer, styled } from '@rango-dev/ui';\n\nimport { ScrollableArea } from '../Layout';\n\nexport const Container = styled('div', {\n display: 'flex',\n flexDirection: 'column',\n overflow: 'hidden',\n});\n\nexport const List = styled(ScrollableArea, {\n padding: 0,\n margin: 0,\n listStyle: 'none',\n\n [`& ${ImageContainer}`]: {\n borderRadius: '$xm',\n overflow: 'hidden',\n },\n});\n", "import { ListItem, Skeleton } from '@rango-dev/ui';\nimport React from 'react';\n\nimport { List } from './BlockchainList.styles';\n\nconst ITEM_SKELETON_COUNT = 20;\nexport function LoadingBlockchainList() {\n return (\n <List>\n {Array.from(Array(ITEM_SKELETON_COUNT), (e) => (\n <ListItem\n key={e}\n hasDivider\n start={<Skeleton variant=\"circular\" width={35} height={35} />}\n title={<Skeleton variant=\"text\" size=\"large\" width={90} />}\n />\n ))}\n </List>\n );\n}\n", "import type { BlockchainMeta, Token } from 'rango-sdk';\n\nimport { i18n } from '@lingui/core';\nimport { Divider } from '@rango-dev/ui';\nimport React, { useState } from 'react';\nimport { useNavigate } from 'react-router-dom';\n\nimport { BlockchainsSection } from '../components/BlockchainsSection';\nimport { Layout, PageContainer } from '../components/Layout';\nimport { SearchInput } from '../components/SearchInput';\nimport { TokenList } from '../components/TokenList/TokenList';\nimport { navigationRoutes } from '../constants/navigationRoutes';\nimport { useNavigateBack } from '../hooks/useNavigateBack';\nimport { useAppStore } from '../store/AppStore';\nimport { useQuoteStore } from '../store/quote';\nimport { useWalletsStore } from '../store/wallets';\n\ninterface PropTypes {\n type: 'source' | 'destination';\n}\n\nexport function SelectSwapItemsPage(props: PropTypes) {\n const { type } = props;\n const navigate = useNavigate();\n const navigateBack = useNavigateBack();\n const {\n fromBlockchain,\n toBlockchain,\n setFromToken,\n setToToken,\n setFromBlockchain,\n setToBlockchain,\n } = useQuoteStore();\n const getBalanceFor = useWalletsStore.use.getBalanceFor();\n const [searchedFor, setSearchedFor] = useState<string>('');\n\n const selectedBlockchain = type === 'source' ? fromBlockchain : toBlockchain;\n const selectedBlockchainName = selectedBlockchain?.name ?? '';\n\n // Tokens & Blockchains list\n const blockchains = useAppStore().blockchains({\n type,\n });\n const tokens = useAppStore().tokens({\n type,\n blockchain: selectedBlockchainName,\n searchFor: searchedFor,\n getBalanceFor: getBalanceFor,\n });\n\n const updateBlockchain = (blockchain: BlockchainMeta) => {\n if (type === 'source') {\n setFromBlockchain(blockchain);\n } else {\n setToBlockchain(blockchain);\n }\n };\n\n const updateToken = (token: Token) => {\n if (type === 'source') {\n setFromToken({ token, meta: { blockchains, tokens } });\n } else {\n setToToken({ token, meta: { blockchains, tokens } });\n }\n };\n const types = {\n source: i18n.t('Source'),\n destination: i18n.t('Destination'),\n };\n\n return (\n <Layout\n header={{\n title: i18n.t('Swap {type}', { type: types[type] }),\n }}>\n <PageContainer>\n <BlockchainsSection\n blockchains={blockchains}\n type={type == 'source' ? 'from' : 'to'}\n blockchain={type === 'source' ? fromBlockchain : toBlockchain}\n onMoreClick={() => navigate(navigationRoutes.blockchains)}\n onChange={(blockchain) => {\n updateBlockchain(blockchain);\n }}\n />\n <Divider size={24} />\n <SearchInput\n value={searchedFor}\n 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={tokens}\n selectedBlockchain={selectedBlockchainName}\n searchedFor={searchedFor}\n type={type}\n onChange={(token) => {\n updateToken(token);\n\n const tokenBlockchain = blockchains.find(\n (chain) => token.blockchain === chain.name\n );\n if (tokenBlockchain) {\n updateBlockchain(tokenBlockchain);\n }\n\n navigateBack();\n }}\n />\n </PageContainer>\n </Layout>\n );\n}\n", "/* eslint-disable @typescript-eslint/no-magic-numbers */\nimport type { PropTypes } from './BlockchainsSection.types';\n\nimport { i18n } from '@lingui/core';\nimport {\n BlockchainsChip,\n Divider,\n Image,\n Skeleton,\n Tooltip,\n Typography,\n} from '@rango-dev/ui';\nimport React from 'react';\n\nimport { BLOCKCHAIN_LIST_SIZE } from '../../constants/configs';\nimport { usePrepareBlockchainList } from '../../hooks/usePrepareBlockchainList';\nimport { useAppStore } from '../../store/AppStore';\nimport { useQuoteStore } from '../../store/quote';\nimport { getContainer } from '../../utils/common';\n\nimport { Blockchains } from './BlockchainsSection.styles';\n\nconst NUMBER_OF_LOADING = 12;\n\nexport function BlockchainsSection(props: PropTypes) {\n const { blockchains, type, blockchain, onChange, onMoreClick } = props;\n const blockchainsList = usePrepareBlockchainList(blockchains, {\n limit: BLOCKCHAIN_LIST_SIZE,\n selected: blockchain?.name,\n });\n\n const { fetchStatus } = useAppStore();\n const resetToBlockchain = useQuoteStore.use.resetToBlockchain();\n const resetFromBlockchain = useQuoteStore.use.resetFromBlockchain();\n const hasMoreItemsInList = blockchainsList.more.length > 0;\n /**\n * When only one item is left on list, we will not show the `More` button and will show the item itself instead.\n */\n const onlyOneItemInList = blockchainsList.more.length === 1;\n const showMoreButton = !onlyOneItemInList && hasMoreItemsInList;\n\n return (\n <>\n <Divider size={12} />\n <Typography variant=\"label\" size=\"large\">\n {i18n.t('Select Blockchain')}\n </Typography>\n <Divider size={12} />\n <Blockchains>\n {fetchStatus === 'loading' &&\n Array.from(Array(NUMBER_OF_LOADING), (e) => (\n <Skeleton key={e} variant=\"rounded\" height={50} />\n ))}\n {fetchStatus === '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 {blockchainsList.list.map((item) => (\n <Tooltip\n key={item.name}\n content={item.shortName}\n side=\"bottom\"\n sideOffset={2}\n container={getContainer()}>\n <BlockchainsChip\n key={item.name}\n selected={!!blockchain && blockchain.name === item.name}\n onClick={() => onChange(item)}>\n <Image src={item.logo} size={30} />\n </BlockchainsChip>\n </Tooltip>\n ))}\n\n {onlyOneItemInList ? (\n <BlockchainsChip\n key={blockchainsList.more[0].name}\n selected={\n !!blockchain &&\n blockchain.name === blockchainsList.more[0].name\n }\n onClick={() => onChange(blockchainsList.more[0])}>\n <Image src={blockchainsList.more[0].logo} size={30} />\n </BlockchainsChip>\n ) : null}\n\n {showMoreButton ? (\n <BlockchainsChip onClick={onMoreClick} key=\"more-blockchains\">\n <Typography variant=\"body\" size=\"xsmall\" color=\"secondary500\">\n {i18n._('More +{count}', {\n count: blockchainsList.more.length,\n })}\n </Typography>\n </BlockchainsChip>\n ) : null}\n </>\n )}\n </Blockchains>\n </>\n );\n}\n", "import type {\n PrepareListOptions,\n UsePrepareList,\n} from './usePrepareBlockchainList.types';\nimport type { BlockchainMeta } from 'rango-sdk';\n\nimport { useEffect } from 'react';\n\nimport { useAppStore } from '../../store/AppStore';\n\nimport { isInVisibleList, prepare } from './usePrepareBlockchainList.helpers';\n\n/**\n *\n * UI needs some specific logics like limiting the list and sorting,\n * this function is getting the raw blockchains list and return a list for showing in UI.\n *\n */\nexport function usePrepareBlockchainList(\n blockchains: BlockchainMeta[],\n options?: PrepareListOptions\n): UsePrepareList {\n const { preferredBlockchains, addPreferredBlockchain } = useAppStore();\n\n useEffect(() => {\n if (options?.selected) {\n const output = prepare(blockchains, preferredBlockchains, options);\n\n /**\n * We only add a new blockchain to preferred when it's not in the main list\n * In this way we can guarantee we will be able to regenerate the same list always.\n * And also it helps us to avoid jumping for the last item of the main list (e.g. tenth item of our list).\n */\n if (!isInVisibleList(options.selected, output)) {\n addPreferredBlockchain(options?.selected);\n }\n }\n }, [options?.selected]);\n\n const output = prepare(blockchains, preferredBlockchains, options);\n\n return {\n list: output.list,\n more: output.more,\n history: [],\n };\n}\n", "export const MOST_USED_BLOCKCHAINS = ['ETH', 'COSMOS', 'OSMOSIS'];\n", "import type {\n PrepareListOptions,\n PrepareOutput,\n} from './usePrepareBlockchainList.types';\nimport type { BlockchainMeta } from 'rango-sdk';\n\nimport { MOST_USED_BLOCKCHAINS } from './usePrepareBlockchainList.constants';\n\nexport function prepare(\n blockchains: BlockchainMeta[],\n preferredBlockchains: string[],\n options?: PrepareListOptions\n): PrepareOutput {\n /*\n * TODO:\n * We copying the `blockchains` which can causes performance penalties but we should because we are mutating the original object.\n * A better way to solve the problem maybe is using new JS features like Use toSpliced() but\n * we can not use it right now because we need to upgrade our toolings first.\n */\n const list: BlockchainMeta[] = JSON.parse(JSON.stringify(blockchains));\n let more: BlockchainMeta[] = [];\n\n list.sort(sortByMostUsedBlockchains);\n\n // Checking `limit` has set and it should be more than of the list items.\n if (!!options?.limit && blockchains.length > options.limit) {\n const start = options.limit;\n let preferredBlockchainsWithoutMainList = preferredBlockchains;\n\n if (preferredBlockchains.length <= options.limit) {\n /**\n *\n * if we want to show 10 items (aka `options.limit`)\n * and have these items as our preferred list: [x,y,z]\n * and these as our main list: [A, B, C, D, E, F, G, H, I, J]\n * the final list will be like this: [...preferred, ...mainList].\n *\n * Since we have a limit (e.g. 10) on our list (preferred + mainList),\n * we only should check those items from main list that will be in final list.\n *\n * finalListWithoutLimit = [x,y,z, A, B, C, D, E, F, G, H, I, J]\n * finalListWithLimit = [x,y,z, A, B, C, D, E, F, G]\n *\n * As you can see, [H, I, J] will not be in our list.\n *\n * The following code only check preffred blockchain\n * shouldn't be in first 7 of 10 items in main list. (Since, the last 3 items will not be in the final list and we should check those.)\n */\n const howManyItemsShouldBeCheckedFromMainList =\n options.limit - preferredBlockchains.length;\n\n for (let i = 0; i <= howManyItemsShouldBeCheckedFromMainList; i++) {\n const blockchain = list[i];\n\n preferredBlockchainsWithoutMainList =\n preferredBlockchainsWithoutMainList.filter((preferredBlockchain) => {\n return blockchain.name !== preferredBlockchain;\n });\n }\n }\n\n list.sort(\n generateSortByPreferredBlockchainsFor(preferredBlockchainsWithoutMainList)\n );\n\n /*\n * Splice will modify the original list and returns the deleted items\n * We use the deleted items as `more`\n */\n more = list.splice(start);\n }\n return {\n list,\n more,\n };\n}\n\n/** There is a hardcoded list of blockchains that we want to show them first in the list. */\nexport function sortByMostUsedBlockchains(\n a: BlockchainMeta,\n b: BlockchainMeta\n) {\n const mostUsed = MOST_USED_BLOCKCHAINS;\n const aIndexInMostUsed = mostUsed.findIndex((token) => token === a.name);\n const bIndexInMostUsed = mostUsed.findIndex((token) => token === b.name);\n const aIsMostUsed = aIndexInMostUsed > -1;\n const bIsMostUsed = bIndexInMostUsed > -1;\n\n if (aIsMostUsed && bIsMostUsed) {\n return aIndexInMostUsed > bIndexInMostUsed ? 1 : -1;\n }\n\n if (aIsMostUsed) {\n return -1;\n }\n\n if (bIsMostUsed) {\n return 1;\n }\n\n return 0;\n}\n\nexport function generateSortByPreferredBlockchainsFor(\n preferredBlockchains: string[]\n) {\n return function sortByPreferred(a: BlockchainMeta, b: BlockchainMeta) {\n const aIndexInPreferred = preferredBlockchains.findIndex(\n (blockchain) => blockchain === a.name\n );\n const bIndexInPreferred = preferredBlockchains.findIndex(\n (blockchain) => blockchain === b.name\n );\n\n const aIsPreferred = aIndexInPreferred > -1;\n const bIsPreferred = bIndexInPreferred > -1;\n\n if (aIsPreferred && bIsPreferred) {\n return aIndexInPreferred > bIndexInPreferred ? 1 : -1;\n }\n\n if (preferredBlockchains.includes(a.name)) {\n return -1;\n }\n if (preferredBlockchains.includes(b.name)) {\n return 1;\n }\n\n return 0;\n };\n}\n\nexport function isInVisibleList(\n blockchain: string,\n prepareOutput: PrepareOutput\n): boolean {\n return !!prepareOutput.list.find((item) => item.name === blockchain);\n}\n", "import { styled } from '@rango-dev/ui';\n\nexport const Blockchains = styled('div', {\n display: 'grid',\n gap: '$10',\n gridTemplateColumns: 'repeat(6, minmax(0, 1fr))',\n});\n", "/* eslint-disable @typescript-eslint/no-magic-numbers */\nimport type { PropTypes, RenderDescProps } from './TokenList.types';\nimport type { Token } from 'rango-sdk';\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, { useEffect, useState } from 'react';\n\nimport { useAppStore } from '../../store/AppStore';\nimport { useWalletsStore } from '../../store/wallets';\nimport { generateShade, isBright } from '../../utils/colors';\nimport { formatBalance } from '../../utils/wallets';\n\nimport { LoadingTokenList } from './LoadingTokenList';\nimport {\n BalanceContainer,\n Container,\n descriptionStyles,\n End,\n ImageSection,\n List,\n Pin,\n Tag,\n TagTitle,\n Title,\n tokenAddressStyles,\n TokenBalance,\n tokenNameStyles,\n tokenTitleStyles,\n tokenWithoutNameStyles,\n usdValueStyles,\n} from './TokenList.styles';\n\nconst PAGE_SIZE = 20;\n\nconst renderDesc = (props: RenderDescProps) => {\n const { address, name, url, token, customCssForTag, customCssForTagTitle } =\n props;\n const length = address.length;\n\n return (\n <div className={descriptionStyles()}>\n {name ? (\n <div className={tokenNameStyles()}>{name}</div>\n ) : (\n <Title className={tokenTitleStyles()}>\n <Typography variant=\"title\" size=\"xmedium\">\n {token.symbol}\n </Typography>\n <Divider direction=\"horizontal\" size={4} />\n <Tag css={customCssForTag}>\n <TagTitle variant=\"body\" size=\"xsmall\" css={customCssForTagTitle}>\n {token.blockchain}\n </TagTitle>\n </Tag>\n </Title>\n )}\n\n {!!address && (\n <div\n className={`${tokenAddressStyles()} ${\n !name && tokenWithoutNameStyles()\n }`}>\n <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 <Divider size={4} direction=\"horizontal\" />\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<Token[]>(list);\n const fetchStatus = useAppStore().fetchStatus;\n const blockchains = useAppStore().blockchains();\n const [hasNextPage, setHasNextPage] = useState<boolean>(true);\n const { getBalanceFor, loading: loadingWallet } = useWalletsStore();\n const { isTokenPinned } = useAppStore();\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 endReached={hasNextPage ? loadNextPage : undefined}\n itemContent={(index) => {\n const token = tokens[index];\n const tokenBalance = formatBalance(getBalanceFor(token));\n const address = token.address || '';\n const blockchain = blockchains.find(\n (blockchain) => blockchain.name === token.blockchain\n );\n const lightShade = generateShade(\n blockchain?.color || '',\n isBright(blockchain?.color || '') ? 5 : 125\n );\n const darkShade = generateShade(blockchain?.color || '', -100);\n\n const customCssForTag = {\n $$color: lightShade,\n [`.${darkTheme} &`]: {\n $$color: darkShade,\n },\n backgroundColor: '$$color',\n };\n\n const customCssForTagTitle = {\n $$color: darkShade,\n [`.${darkTheme} &`]: {\n $$color: lightShade,\n },\n color: '$$color',\n };\n\n return (\n <div\n style={{\n paddingRight: 5,\n }}>\n <ListItemButton\n style={{\n width: '100%',\n overflow: 'hidden',\n }}\n tab-index={index}\n key={`${token.symbol}${token.address}`}\n id={`${token.symbol}${token.address}`}\n hasDivider\n onClick={() => onChange(tokens[index])}\n start={\n <ImageSection>\n <Image src={token.image} size={30} />\n {isTokenPinned(token, props.type) && (\n <Pin>\n <PinIcon size={12} color=\"gray\" />\n </Pin>\n )}\n </ImageSection>\n }\n title={\n blockchain?.type === 'COSMOS' ||\n !!token.name ||\n (!token.name && !address) ? (\n <Title>\n <Typography variant=\"title\" size=\"xmedium\">\n {token.symbol}\n </Typography>\n <Divider direction=\"horizontal\" size={4} />\n <Tag css={customCssForTag}>\n <TagTitle\n variant=\"body\"\n size=\"xsmall\"\n css={customCssForTagTitle}>\n {token.blockchain}\n </TagTitle>\n </Tag>\n </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: token.name,\n url: blockchain.info.addressUrl\n .split('{wallet}')\n .join(address),\n })\n : token.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 tokenBalance && (\n <BalanceContainer>\n <TokenBalance variant=\"title\" size=\"small\">\n {tokenBalance.amount}\n </TokenBalance>\n <div />\n {tokenBalance.usdValue && (\n <Typography\n variant=\"body\"\n className={usdValueStyles()}\n size=\"xsmall\">\n {`$${tokenBalance.usdValue}`}\n </Typography>\n )}\n </BalanceContainer>\n )\n )\n }\n />\n </div>\n );\n }}\n totalCount={tokens.length}\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 {fetchStatus === 'loading' && <LoadingTokenList size={PAGE_SIZE} />}\n {fetchStatus === 'success' && <List as=\"ul\">{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 {\n css,\n darkTheme,\n ImageContainer,\n styled,\n Typography,\n} from '@rango-dev/ui';\n\nexport const tokenNameStyles = css({\n position: 'absolute',\n transform: 'none',\n transition: 'transform 225ms cubic-bezier(0, 0, 0.2, 1) 0ms',\n textOverflow: 'ellipsis',\n whiteSpace: 'nowrap',\n maxWidth: 100,\n overflow: 'hidden',\n});\nexport const descriptionStyles = css({\n position: 'relative',\n height: 12,\n width: '30%',\n maxWidth: '150px',\n});\nexport const tokenTitleStyles = css({\n position: 'absolute',\n transform: 'none',\n transition: 'transform 225ms cubic-bezier(0, 0, 0.2, 1) 0ms',\n bottom: '-8px',\n});\nexport const tokenAddressStyles = css({\n transform: 'translateY(12px)',\n visibility: 'hidden',\n '& a': {\n display: 'flex',\n justifyContent: 'center',\n alignItems: 'center',\n fontSize: '$12',\n lineHeight: '$16',\n $$color: '$colors$neutral600',\n [`.${darkTheme} &`]: {\n $$color: '$colors$neutral700',\n },\n color: '$$color',\n textDecoration: 'none',\n },\n});\nexport const tokenWithoutNameStyles = css({});\nexport const usdValueStyles = css();\n\nexport const Container = styled('div', {\n display: 'flex',\n flexDirection: 'column',\n flexGrow: 1,\n overflow: 'hidden',\n});\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\n '& li': {\n alignItems: 'none',\n\n '&:hover': {\n [`& .${descriptionStyles}`]: {\n [`& .${tokenAddressStyles}`]: {\n position: 'absolute',\n transform: 'none',\n transition: 'transform 225ms cubic-bezier(0, 0, 0.2, 1) 0ms',\n visibility: 'visible',\n },\n\n [`& .${tokenWithoutNameStyles}`]: {\n bottom: '-15px',\n },\n [`& .${tokenNameStyles}`]: {\n position: 'absolute',\n transform: 'translateY(-12px)',\n visibility: 'hidden',\n },\n [`& .${tokenTitleStyles}`]: {\n position: 'absolute',\n transform: 'translateY(-12px)',\n bottom: '-10px',\n },\n },\n },\n },\n});\n\nexport const Tag = styled('div', {\n paddingLeft: '$5',\n paddingRight: '$5',\n borderRadius: '$md',\n display: 'flex',\n alignItems: 'center',\n});\n\nexport const TagTitle = styled(Typography, {});\n\nexport const BalanceContainer = styled('div', {\n textAlign: 'right',\n width: '100%',\n overflow: 'hidden',\n textOverflow: 'ellipsis',\n whiteSpace: 'nowrap',\n [`& .${usdValueStyles}`]: {\n $$color: '$colors$neutral600',\n [`.${darkTheme} &`]: {\n $$color: '$colors$neutral700',\n },\n color: '$$color',\n },\n});\n\nexport const End = styled('div', {\n display: 'flex',\n alignItems: 'end',\n flexDirection: 'column',\n});\n\nexport const Description = styled('div', {\n display: 'flex',\n alignItems: 'center',\n});\nexport const ImageSection = styled('div', {\n position: 'relative',\n [`& ${ImageContainer}`]: {\n borderRadius: '$xm',\n overflow: 'hidden',\n },\n});\nexport const Pin = styled('div', {\n position: 'absolute',\n backgroundColor: '$neutral100',\n padding: '$4',\n borderRadius: '50%',\n bottom: -6,\n right: -6,\n});\n\nexport const TokenBalance = styled(Typography, {\n width: '100%',\n overflow: 'hidden',\n textOverflow: 'ellipsis',\n whiteSpace: 'nowrap',\n});\n", "import { i18n } from '@lingui/core';\nimport { Alert, Button, styled } from '@rango-dev/ui';\nimport React from 'react';\nimport { useInRouterContext, useSearchParams } from 'react-router-dom';\n\nimport { Layout, PageContainer } from '../components/Layout';\nimport { Slippage } from '../components/Slippage';\nimport { SearchParams } from '../constants/searchParams';\nimport { SettingsLists } from '../containers/Settings/Lists';\nimport { useAppStore } from '../store/AppStore';\n\nconst ResetAction = styled('div', {\n paddingLeft: '$8',\n});\n\nexport function SettingsPage() {\n const { isInCampaignMode, updateCampaignMode } = useAppStore();\n const campaignMode = isInCampaignMode();\n\n const [, setSearchParams] = useSearchParams();\n const isRouterInContext = useInRouterContext();\n\n const onClick = () => {\n if (isRouterInContext && campaignMode) {\n setSearchParams(\n (prev) => {\n prev.delete(SearchParams.LIQUIDITY_SOURCES);\n return prev;\n },\n { replace: true }\n );\n updateCampaignMode('liquiditySources', undefined);\n }\n };\n return (\n <Layout\n header={{\n title: i18n.t('Settings'),\n }}>\n <PageContainer>\n {campaignMode && (\n <Alert\n type=\"info\"\n variant=\"alarm\"\n title={i18n.t(\n \"Currently, you're in campaign mode with restrictions on liquidity sources. Would you like to switch out of this mode and make use of all available liquidity sources?\"\n )}\n action={\n <ResetAction>\n <Button type=\"secondary\" size=\"small\" onClick={onClick}>\n {i18n.t('Reset')}\n </Button>\n </ResetAction>\n }\n />\n )}\n <Slippage />\n <SettingsLists />\n </PageContainer>\n </Layout>\n );\n}\n", "import { i18n } from '@lingui/core';\nimport {\n 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 { useAppStore } from '../../store/AppStore';\nimport { getContainer } from '../../utils/common';\n\nimport {\n BaseContainer,\n Head,\n SlippageChip,\n SlippageChipsContainer,\n} from './Slippage.styles';\nimport { SlippageTooltipContent } from './SlippageTooltipContent';\n\nexport function Slippage() {\n const { slippage, setSlippage, customSlippage, setCustomSlippage } =\n useAppStore();\n\n 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 sideOffset={4}\n content={<SlippageTooltipContent />}>\n <InfoIcon color=\"gray\" />\n </Tooltip>\n </Head>\n <SlippageChipsContainer>\n {SLIPPAGES.map((slippageItem, index) => {\n const key = `slippage-${index}`;\n return (\n <SlippageChip\n 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 );\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 value = event.target.value;\n const parsedValue = parseFloat(value);\n if (parsedValue >= MIN_SLIPPGAE && parsedValue <= MAX_SLIPPAGE) {\n setCustomSlippage(parsedValue);\n } else {\n setCustomSlippage(null);\n }\n }}\n suffix={\n customSlippage && (\n <Typography variant=\"body\" size=\"small\">\n %\n </Typography>\n )\n }\n placeholder={i18n.t('Custom')}\n />\n </SlippageChipsContainer>\n </BaseContainer>\n );\n}\n", "import { Chip, styled, TextField } from '@rango-dev/ui';\n\nexport const BaseContainer = styled('div', {\n paddingTop: '$5',\n padding: '$10 $5',\n});\n\nexport const SlippageChipsContainer = styled('div', {\n display: 'flex',\n flexWrap: 'wrap',\n gap: '$10',\n [`& ${TextField}`]: {\n flex: '1 1 0',\n maxWidth: '127px',\n minWidth: '85px',\n },\n});\n\nexport const Head = styled('div', {\n display: 'flex',\n justifyContent: 'start',\n alignItems: 'center',\n paddingBottom: '$10',\n});\n\nexport const SlippageTooltipContainer = styled('div', {\n maxWidth: '280px',\n padding: '$10',\n});\n\nexport const SlippageChip = styled(Chip, {\n width: '61px',\n flexShrink: 0,\n});\n", "import { i18n } from '@lingui/core';\nimport { Typography } from '@rango-dev/ui';\nimport React from 'react';\n\nimport { SlippageTooltipContainer } from './Slippage.styles';\n\nexport function SlippageTooltipContent() {\n return (\n <SlippageTooltipContainer>\n <Typography variant=\"label\" size=\"medium\" color=\"neutral700\">\n {i18n.t(\n 'Your transaction will be reverted if the price changes unfavorably by more than this percentage'\n )}\n <br />\n <br />\n <b>{i18n.t('Warning')}</b>:\n {i18n.t(\n 'This setting is applied per step (e.g. 1Inch, Thorchain, etc) which means only the step will be reverted, not the whole transaction.'\n )}\n </Typography>\n </SlippageTooltipContainer>\n );\n}\n", "import type { ThemeMode } from '../../store/slices/settings';\nimport type { ListPropTypes, SvgIconProps } from '@rango-dev/ui';\n\nimport { i18n } from '@lingui/core';\nimport {\n AutoThemeIcon,\n BridgeIcon,\n ChevronRightIcon,\n DarkModeIcon,\n Divider,\n DoneIcon,\n ExchangeIcon,\n InfoIcon,\n LanguageIcon,\n LightModeIcon,\n List,\n ListItem,\n ListItemButton,\n Skeleton,\n styled,\n Switch,\n Tabs,\n Tooltip,\n Typography,\n} from '@rango-dev/ui';\nimport React from 'react';\nimport { useNavigate } from 'react-router-dom';\n\nimport { SlippageTooltipContainer as TooltipContainer } from '../../components/Slippage/Slippage.styles';\nimport { navigationRoutes } from '../../constants/navigationRoutes';\nimport { ThemeModeEnum } from '../../constants/settings';\nimport { useAppStore } from '../../store/AppStore';\nimport { getContainer } from '../../utils/common';\nimport { getUniqueSwappersGroups, isFeatureHidden } from '../../utils/settings';\n\nconst ThemeSection = styled('div', {\n width: '202px',\n height: '$40',\n});\n\nconst themesList = [\n {\n id: ThemeModeEnum.LIGHT,\n icon: <LightModeIcon color=\"black\" size={16} />,\n tooltip: (\n <Typography size=\"xsmall\" variant=\"body\">\n {i18n.t('Light')}\n </Typography>\n ),\n },\n {\n id: ThemeModeEnum.DARK,\n icon: <DarkModeIcon color=\"black\" size={14} />,\n tooltip: (\n <Typography size=\"xsmall\" variant=\"body\">\n {i18n.t('Dark')}\n </Typography>\n ),\n },\n {\n id: ThemeModeEnum.AUTO,\n icon: <AutoThemeIcon color=\"black\" size={16} />,\n tooltip: (\n <Typography size=\"xsmall\" variant=\"body\">\n {i18n.t('Auto')}\n </Typography>\n ),\n },\n];\n\nconst getThemeIcon = (theme: ThemeMode) => {\n const iconProps: SvgIconProps = { color: 'gray', size: 14 };\n\n switch (theme) {\n case 'auto':\n return <AutoThemeIcon {...iconProps} />;\n case 'dark':\n return <DarkModeIcon {...iconProps} />;\n default:\n return <LightModeIcon {...iconProps} />;\n }\n};\n\nexport function SettingsLists() {\n const navigate = useNavigate();\n const { theme: themeConfig } = useAppStore().config;\n const { setTheme, theme } = useAppStore();\n\n const fetchStatus = useAppStore().fetchStatus;\n const swappers = useAppStore().swappers();\n const disabledLiquiditySources = useAppStore().getDisabledLiquiditySources();\n const {\n config: { features },\n } = useAppStore();\n const isThemeHidden = isFeatureHidden('theme', features);\n const isLiquidityHidden = isFeatureHidden('liquiditySource', features);\n const isLanguageHidden = isFeatureHidden('language', features);\n\n const infiniteApprove = useAppStore().infiniteApprove;\n const toggleInfiniteApprove = useAppStore().toggleInfiniteApprove;\n\n const supportedUniqueSwappersGroups = getUniqueSwappersGroups(\n swappers,\n disabledLiquiditySources\n );\n\n const bridgeSources = supportedUniqueSwappersGroups.filter((uniqueItem) =>\n ['BRIDGE', 'AGGREGATOR', 'OFF_CHAIN'].includes(uniqueItem.type)\n );\n\n const totalBridgeSources = bridgeSources.length;\n const totalSelectedBridgeSources = bridgeSources.filter(\n (uniqueItem) => uniqueItem.selected\n ).length;\n\n const exchangeSources = supportedUniqueSwappersGroups.filter(\n (uniqueItem) => uniqueItem.type === 'DEX'\n );\n\n const totalExchangeSources = exchangeSources.length;\n const totalSelectedExchangeSources = exchangeSources.filter(\n (uniqueItem) => uniqueItem.selected\n ).length;\n\n const handleEndItem = (totalSelected: number, total: number) => {\n switch (fetchStatus) {\n case 'loading':\n return <Skeleton variant=\"text\" size=\"medium\" width={50} />;\n case 'failed':\n return (\n <Typography variant=\"body\" size=\"medium\" color=\"$error500\">\n {i18n.t('Loading failed')}\n </Typography>\n );\n default:\n return (\n <Typography variant=\"body\" size=\"medium\">\n {`${totalSelected} / ${total}`}\n </Typography>\n );\n }\n };\n\n const bridgeItem = {\n id: '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 start: <BridgeIcon color=\"gray\" size={14} />,\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 start: <ExchangeIcon color=\"gray\" size={14} />,\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 start: <LanguageIcon color=\"gray\" size={14} />,\n end: <ChevronRightIcon color=\"gray\" />,\n onClick: () => navigate(navigationRoutes.languages),\n };\n\n const infiniteApprovalItem = {\n id: 'infinite-approval-item',\n title: (\n <>\n <Typography variant=\"title\" size=\"xmedium\">\n {i18n.t('Infinite approval')}\n </Typography>\n <Divider direction=\"horizontal\" size={4} />\n <Tooltip\n side=\"top\"\n sideOffset={4}\n container={getContainer()}\n content={\n <TooltipContainer>\n <Typography variant=\"label\" size=\"medium\" color=\"neutral700\">\n {i18n.t(\n \"Enabling the 'Infinite approval' mode grants unrestricted access to smart contracts of DEXes/Bridges, allowing them to utilize the approved token amount without limitations.\"\n )}\n </Typography>\n </TooltipContainer>\n }>\n <InfoIcon color=\"gray\" />\n </Tooltip>\n </>\n ),\n start: <DoneIcon color=\"gray\" size={14} />,\n end: <Switch checked={infiniteApprove} />,\n onClick: toggleInfiniteApprove,\n };\n\n const themeItem = {\n id: 'theme-item',\n type: <ListItem />,\n title: (\n <Typography variant=\"title\" size=\"xmedium\">\n {i18n.t('Theme')}\n </Typography>\n ),\n end: (\n <ThemeSection>\n <Tabs\n container={getContainer()}\n items={themesList}\n value={theme}\n onChange={(item) => setTheme(item.id as ThemeMode)}\n type=\"primary\"\n borderRadius=\"small\"\n />\n </ThemeSection>\n ),\n start: getThemeIcon(theme),\n };\n\n const settingItems: ListPropTypes['items'] = isLiquidityHidden\n ? []\n : [bridgeItem, exchangeItem];\n\n if (!isLanguageHidden) {\n settingItems.push(languageItem);\n }\n settingItems.push(infiniteApprovalItem);\n\n if (!themeConfig?.singleTheme && !isThemeHidden) {\n settingItems.push(themeItem);\n }\n\n return (\n <List\n type={<ListItemButton hasDivider id=\"_\" onClick={() => console.log()} />}\n items={settingItems}\n />\n );\n}\n", "import { i18n } from '@lingui/core';\nimport { cancelSwap } from '@rango-dev/queue-manager-rango-preset';\nimport { useManager } from '@rango-dev/queue-manager-react';\nimport { Alert } from '@rango-dev/ui';\nimport React from 'react';\nimport { useParams } from 'react-router-dom';\n\nimport { SwapDetails } from '../components/SwapDetails';\nimport { SwapDetailsPlaceholder } from '../components/SwapDetails/SwapDetails.Placeholder';\nimport { useNavigateBack } from '../hooks/useNavigateBack';\nimport { useAppStore } from '../store/AppStore';\nimport { getPendingSwaps } from '../utils/queue';\n\nexport function SwapDetailsPage() {\n const { manager, state } = useManager();\n const loading = !state.loadedFromPersistor;\n const pendingSwaps = getPendingSwaps(manager);\n const { requestId } = useParams<{ requestId: string }>();\n const navigateBack = useNavigateBack();\n const { fetchStatus: fetchMetaStatus } = useAppStore();\n\n if (!requestId) {\n return (\n <Alert\n containerStyles={{ margin: '20px' }}\n type=\"error\"\n title={i18n.t(\n 'The request ID is necessary to display the swap details.'\n )}\n />\n );\n }\n\n const showSkeleton = loading || fetchMetaStatus === 'loading';\n\n const selectedSwap = requestId\n ? pendingSwaps.find(({ swap }) => swap.requestId === requestId)\n : undefined;\n\n const onCancel = () => {\n if (selectedSwap?.id) {\n const swap = manager?.get(selectedSwap.id);\n if (swap) {\n cancelSwap(swap);\n }\n }\n };\n\n const onDelete = async () => {\n if (selectedSwap?.id) {\n try {\n manager?.deleteQueue(selectedSwap.id);\n navigateBack();\n } catch (e) {\n console.log(e);\n }\n }\n };\n const swap = selectedSwap?.swap;\n\n if (!swap || showSkeleton) {\n return (\n <SwapDetailsPlaceholder\n requestId={requestId}\n showSkeleton={showSkeleton}\n />\n );\n }\n\n return (\n <SwapDetails\n swap={swap}\n requestId={requestId}\n onCancel={onCancel}\n onDelete={onDelete}\n />\n );\n}\n", "import type { SwapDetailsProps } from './SwapDetails.types';\nimport type { ModalState } from '../SwapDetailsModal';\n\nimport { i18n } from '@lingui/core';\nimport {\n getCurrentBlockchainOfOrNull,\n getCurrentStep,\n getRelatedWalletOrNull,\n} from '@rango-dev/queue-manager-rango-preset';\nimport {\n Button,\n CopyIcon,\n Divider,\n IconButton,\n LinkIcon,\n QuoteCost,\n StepDetails,\n Typography,\n useCopyToClipboard,\n} from '@rango-dev/ui';\nimport { useWallets } from '@rango-dev/wallets-react';\nimport BigNumber from 'bignumber.js';\nimport { PendingSwapNetworkStatus } from 'rango-types';\nimport React, { useEffect, useRef, useState } from 'react';\nimport { useNavigate } from 'react-router-dom';\n\nimport { SCANNER_BASE_URL } from '../../constants';\nimport {\n GAS_FEE_MAX_DECIMALS,\n GAS_FEE_MIN_DECIMALS,\n PERCENTAGE_CHANGE_MAX_DECIMALS,\n PERCENTAGE_CHANGE_MIN_DECIMALS,\n TOKEN_AMOUNT_MAX_DECIMALS,\n TOKEN_AMOUNT_MIN_DECIMALS,\n USD_VALUE_MAX_DECIMALS,\n USD_VALUE_MIN_DECIMALS,\n} from '../../constants/routing';\nimport { useAppStore } from '../../store/AppStore';\nimport { useNotificationStore } from '../../store/notification';\nimport { useQuoteStore } from '../../store/quote';\nimport { useUiStore } from '../../store/ui';\nimport { getContainer } from '../../utils/common';\nimport {\n formatTooltipNumbers,\n numberToString,\n secondsToString,\n totalArrivalTime,\n} from '../../utils/numbers';\nimport { getPriceImpact, getPriceImpactLevel } from '../../utils/quote';\nimport {\n getLastConvertedTokenInFailedSwap,\n getSwapMessages,\n shouldRetrySwap,\n} from '../../utils/swap';\nimport { getSwapDate } from '../../utils/time';\nimport { getConciseAddress } from '../../utils/wallets';\nimport { SuffixContainer } from '../HeaderButtons/HeaderButtons.styles';\nimport { Layout, PageContainer } from '../Layout';\nimport { QuoteSummary } from '../Quote';\nimport {\n SwapDetailsCompleteModal,\n SwapDetailsModal,\n} from '../SwapDetailsModal';\n\nimport { getSteps, getStepState, RESET_INTERVAL } from './SwapDetails.helpers';\nimport {\n HeaderDetails,\n outputStyles,\n requestIdStyles,\n rowStyles,\n StepsList,\n StyledLink,\n titleStepsStyles,\n} 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 blockchains = useAppStore().blockchains();\n const swappers = useAppStore().swappers();\n const tokens = useAppStore().tokens();\n const retry = useQuoteStore.use.retry();\n const isActiveTab = useUiStore.use.isActiveTab();\n const navigate = useNavigate();\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\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, swap.requestId]);\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 blockchains: blockchains,\n swappers,\n });\n const numberOfSteps = steps.length;\n const [firstStep, lastStep] = [swap.steps[0], swap.steps[numberOfSteps - 1]];\n const outputAmount =\n lastStep.outputAmount || lastStep.expectedOutputAmountHumanReadable;\n\n const totalFee = swap.steps.reduce(\n (totalFee, steps) => totalFee + parseFloat(steps.feeInUsd || ''),\n 0\n );\n\n const diagnosisUrl = swap.steps.find(\n (step) => step.diagnosisUrl\n )?.diagnosisUrl;\n\n const outputUsdValue = numberToString(\n parseFloat(\n numberToString(\n outputAmount,\n TOKEN_AMOUNT_MIN_DECIMALS,\n TOKEN_AMOUNT_MAX_DECIMALS\n )\n ) * (lastStep.toUsdPrice || 0),\n USD_VALUE_MIN_DECIMALS,\n USD_VALUE_MAX_DECIMALS\n );\n\n const inputUsdValue = numberToString(\n parseFloat(swap.inputAmount) * (firstStep.fromUsdPrice || 0),\n USD_VALUE_MIN_DECIMALS,\n USD_VALUE_MAX_DECIMALS\n );\n\n const realOutputUsdValue = outputAmount\n ? formatTooltipNumbers(\n new BigNumber(outputAmount).multipliedBy(lastStep.toUsdPrice || 0)\n )\n : '';\n\n const realInputUsdValue = formatTooltipNumbers(\n new BigNumber(swap.inputAmount).multipliedBy(firstStep.fromUsdPrice || 0)\n );\n\n const percentageChange = getPriceImpact(inputUsdValue, outputUsdValue);\n\n const completeModalDesc =\n swap.status === 'success'\n ? i18n.t({\n id: 'You have received {amount} {token} in {conciseAddress} wallet on {chain} chain.',\n values: {\n amount: numberToString(\n outputAmount,\n TOKEN_AMOUNT_MIN_DECIMALS,\n TOKEN_AMOUNT_MAX_DECIMALS\n ),\n token: steps[numberOfSteps - 1].to.token.displayName,\n conciseAddress: getConciseAddress(\n swap.wallets[steps[numberOfSteps - 1].to.chain.displayName]\n ?.address || ''\n ),\n chain: steps[numberOfSteps - 1].to.chain.displayName,\n },\n })\n : `${i18n.t('Transaction was not sent.')} ${\n lastConvertedTokenInFailedSwap\n ? i18n.t({\n id: '{amount} {symbol} on {blockchain} remain in your wallet',\n values: {\n amount: lastConvertedTokenInFailedSwap.outputAmount,\n symbol: lastConvertedTokenInFailedSwap.symbol,\n blockchain: lastConvertedTokenInFailedSwap.blockchain,\n },\n })\n : ''\n }`;\n\n return (\n <Layout\n header={{\n title: i18n.t('Swap and Bridge'),\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, { blockchains: blockchains, tokens: tokens });\n setTimeout(() => {\n const home = '../../';\n navigate(home);\n }, 0);\n }}>\n {i18n.t('Try again')}\n </Button>\n )\n }>\n <PageContainer compact view>\n <HeaderDetails>\n <div className={rowStyles()}>\n <Typography variant=\"label\" size=\"large\" color=\"neutral700\">\n {`${i18n.t('Request ID')}:`}\n </Typography>\n <div className={requestIdStyles()}>\n <Typography variant=\"label\" size=\"small\" color=\"neutral700\">\n {requestId}\n </Typography>\n <IconButton\n variant=\"ghost\"\n onClick={handleCopy.bind(null, requestId || '')}>\n <CopyIcon size={16} color=\"gray\" />\n </IconButton>\n <StyledLink\n target=\"_blank\"\n href={`${SCANNER_BASE_URL}/swap/${requestId}`}>\n <LinkIcon size={16} />\n </StyledLink>\n </div>\n </div>\n <div className={rowStyles()}>\n <Typography variant=\"label\" size=\"large\" color=\"neutral700\">\n {`${i18n.t(swap.finishTime ? 'Finished at' : 'Created at')}:`}\n </Typography>\n <Typography variant=\"label\" size=\"small\" color=\"neutral700\">\n {swapDate}\n </Typography>\n </div>\n </HeaderDetails>\n\n <div className={outputStyles()}>\n <QuoteCost\n fee={numberToString(\n String(totalFee),\n GAS_FEE_MIN_DECIMALS,\n GAS_FEE_MAX_DECIMALS\n )}\n time={secondsToString(totalArrivalTime(swap.steps))}\n steps={numberOfSteps}\n />\n <QuoteSummary\n from={{\n price: {\n value: numberToString(\n swap.inputAmount,\n TOKEN_AMOUNT_MIN_DECIMALS,\n TOKEN_AMOUNT_MAX_DECIMALS\n ),\n usdValue: inputUsdValue,\n realUsdValue: realInputUsdValue,\n realValue: swap.inputAmount,\n },\n token: {\n displayName: steps[0].from.token.displayName,\n image: steps[0].from.token.image,\n },\n chain: {\n image: steps[0].from.chain.image,\n displayName: steps[0].from.chain.displayName,\n },\n }}\n to={{\n price: {\n value: numberToString(\n outputAmount,\n TOKEN_AMOUNT_MIN_DECIMALS,\n TOKEN_AMOUNT_MAX_DECIMALS\n ),\n usdValue: outputUsdValue,\n realUsdValue: realOutputUsdValue,\n realValue: outputAmount,\n },\n token: {\n displayName: 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(percentageChange ?? 0)}\n />\n </div>\n <div className={titleStepsStyles()}>\n <Typography variant=\"title\" size=\"small\">\n {i18n.t('Swaps steps')}\n </Typography>\n </div>\n <Divider size={8} />\n <StepsList 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=\"swap-progress\"\n ref={listRef}\n state={state}\n hasSeparator={index !== 0}\n tabIndex={key}\n isFocused={isFocused}\n tooltipContainer={getContainer()}\n />\n );\n })}\n </StepsList>\n </PageContainer>\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 walletButtonDisabled={!isActiveTab}\n />\n <SwapDetailsCompleteModal\n open={!!showCompletedModal}\n diagnosisUrl={diagnosisUrl}\n onClose={() => setShowCompletedModal(null)}\n status={swap.status === 'success' ? 'success' : 'failed'}\n priceValue={numberToString(\n outputAmount,\n TOKEN_AMOUNT_MIN_DECIMALS,\n TOKEN_AMOUNT_MAX_DECIMALS\n )}\n usdValue={outputUsdValue}\n realUsdValue={realOutputUsdValue}\n realValue={formatTooltipNumbers(outputAmount)}\n percentageChange={numberToString(\n percentageChange,\n PERCENTAGE_CHANGE_MIN_DECIMALS,\n PERCENTAGE_CHANGE_MAX_DECIMALS\n )}\n token={{\n displayName: steps[numberOfSteps - 1].to.token.displayName,\n image: steps[numberOfSteps - 1].to.token.image,\n }}\n chain={{ image: steps[numberOfSteps - 1].to.chain.image }}\n description={completeModalDesc}\n />\n </Layout>\n );\n}\n", "import type { PendingSwap } from 'rango-types';\n\nimport { i18n } from '@lingui/core';\n\nconst daysOfWeek = [\n i18n.t('Sunday'),\n i18n.t('Monday'),\n i18n.t('Tuesday'),\n i18n.t('Wednesday'),\n i18n.t('Thursday'),\n i18n.t('Friday'),\n i18n.t('Saturday'),\n];\n\nexport function timeSince(millisecond: number) {\n const date = new Date(millisecond);\n const day = date.getDate();\n const month = date.toLocaleString('default', { month: 'long' });\n const year = date.getFullYear();\n const isToday = date.getDay() === new Date().getDay();\n const formattedDate = isToday\n ? i18n.t('Today')\n : `${daysOfWeek[date.getDay()]} ${day} ${month} ${year}`;\n\n return `${formattedDate}, ${new Date(millisecond).toLocaleTimeString()}`;\n}\n\nexport function getSwapDate(pendingSwap: PendingSwap) {\n const time = pendingSwap.finishTime\n ? timeSince(parseInt(pendingSwap.finishTime))\n : timeSince(parseInt(pendingSwap.creationTime));\n return time;\n}\n", "import type { ModalPropTypes } from './SwapDetailsModal.types';\n\nimport { PendingSwapNetworkStatus } from 'rango-types';\nimport React from 'react';\n\nimport { WIDGET_UI_ID } from '../../constants';\nimport { WatermarkedModal } from '../common/WatermarkedModal';\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 {\n state,\n onClose,\n onDelete,\n onCancel,\n currentStepWallet,\n message,\n walletButtonDisabled,\n } = props;\n\n const showWalletStateContent =\n state === PendingSwapNetworkStatus.WaitingForNetworkChange ||\n state === PendingSwapNetworkStatus.WaitingForConnectingWallet ||\n state === PendingSwapNetworkStatus.NetworkChanged;\n\n return (\n <WatermarkedModal\n open={!!state}\n onClose={onClose}\n container={\n document.getElementById(WIDGET_UI_ID.SWAP_BOX_ID) || document.body\n }>\n {showWalletStateContent && (\n <WalletStateContent\n type={modalNetworkValues[state].type}\n title={modalNetworkValues[state].title}\n currentStepWallet={currentStepWallet}\n message={message}\n walletButtonDisabled={walletButtonDisabled}\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 </WatermarkedModal>\n );\n}\n", "import type { CancelContentProps } from './SwapDetailsModal.types';\n\nimport { i18n } from '@lingui/core';\nimport { Button, Divider, MessageBox } from '@rango-dev/ui';\nimport React from 'react';\n\nexport const CancelContent = ({ onCancel, onClose }: CancelContentProps) => {\n return (\n <>\n <Divider size={20} />\n <MessageBox\n type=\"error\"\n title={i18n.t('Cancel Swap')}\n description={i18n.t('Are you sure you want to cancel this swap?')}\n />\n <Divider size={32} />\n <Button\n variant=\"contained\"\n type=\"primary\"\n size=\"large\"\n onClick={onCancel}>\n {i18n.t('Yes, Cancel it')}\n </Button>\n <Divider size={12} />\n <Button variant=\"outlined\" type=\"primary\" size=\"large\" onClick={onClose}>\n {i18n.t('No, Continue')}\n </Button>\n </>\n );\n};\n", "import type { DeleteContentProps } from './SwapDetailsModal.types';\n\nimport { i18n } from '@lingui/core';\nimport { Button, Divider, MessageBox, Typography } from '@rango-dev/ui';\nimport React from 'react';\n\nexport const DeleteContent = ({ onDelete, onClose }: DeleteContentProps) => {\n return (\n <>\n <Divider size={20} />\n <MessageBox\n type=\"error\"\n title={i18n.t('Delete Transaction')}\n description={i18n.t('Are you sure you want to delete this swap?')}\n />\n <Divider size={32} />\n <Button\n variant=\"contained\"\n type=\"primary\"\n size=\"large\"\n onClick={onDelete}>\n {i18n.t('Yes, Delete it')}\n </Button>\n <Divider size={12} />\n <Button 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-types';\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 } from '@rango-dev/ui';\nimport { useWallets } from '@rango-dev/wallets-react';\nimport React from 'react';\n\nimport { getContainer } from '../../utils/common';\nimport { mapStatusToWalletState } from '../../utils/wallets';\n\nimport { WalletContainer } from './SwapDetailsModal.styles';\n\nexport const WalletStateContent = (props: WalletStateContentProps) => {\n const {\n type,\n title,\n currentStepWallet,\n message,\n showWalletButton,\n walletButtonDisabled,\n } = props;\n const { connect, getWalletInfo, state } = useWallets();\n const walletType = currentStepWallet?.walletType;\n const walletState = walletType\n ? mapStatusToWalletState(state(walletType))\n : null;\n const walletInfo = walletType ? getWalletInfo(walletType) : null;\n const shouldShowWallet =\n showWalletButton && !!walletType && !!walletState && !!walletInfo;\n return (\n <>\n <MessageBox type={type} title={title} description={message} />\n {shouldShowWallet && (\n <WalletContainer>\n <Wallet\n container={getContainer()}\n title={walletInfo.name}\n image={walletInfo.img}\n type={walletType}\n state={walletState}\n link={walletInfo.installLink}\n disabled={walletButtonDisabled}\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 TokenAmount,\n Typography,\n} from '@rango-dev/ui';\nimport React from 'react';\nimport { useNavigate } from 'react-router-dom';\n\nimport { WIDGET_UI_ID } from '../../constants';\nimport { getContainer } from '../../utils/common';\nimport { WatermarkedModal } from '../common/WatermarkedModal';\n\nexport function SwapDetailsCompleteModal(props: CompleteModalPropTypes) {\n const {\n open,\n onClose,\n status,\n priceValue,\n usdValue,\n realUsdValue,\n realValue,\n token,\n chain,\n percentageChange,\n description,\n diagnosisUrl,\n } = props;\n const navigate = useNavigate();\n\n return (\n <WatermarkedModal\n open={open}\n onClose={onClose}\n container={\n document.getElementById(WIDGET_UI_ID.SWAP_BOX_ID) || document.body\n }>\n {status === 'success' ? (\n <MessageBox type=\"success\" title={i18n.t('Swap Successful')}>\n <TokenAmount\n direction=\"vertical\"\n tooltipContainer={getContainer()}\n type=\"output\"\n centerAlign={true}\n price={{\n value: priceValue,\n usdValue,\n realUsdValue,\n realValue,\n }}\n token={token}\n chain={chain}\n percentageChange={percentageChange}\n />\n <Divider size={12} />\n <Typography\n variant=\"body\"\n size=\"medium\"\n color=\"neutral700\"\n align=\"center\">\n {description}\n </Typography>\n </MessageBox>\n ) : (\n <MessageBox\n type=\"error\"\n title={i18n.t('Transaction Failed')}\n description={description}\n />\n )}\n <Divider size={32} />\n {status === 'success' && (\n <Button\n variant=\"contained\"\n type=\"primary\"\n size=\"large\"\n onClick={() => {\n const home = '../../';\n navigate(home);\n }}>\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 {i18n.t('Diagnosis')}\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 </WatermarkedModal>\n );\n}\n", "import type { GetStep } from '../SwapDetailsAlerts';\nimport type { Step, StepDetailsProps } from '@rango-dev/ui';\nimport type { PendingSwapStep } from 'rango-types';\n\nimport React from 'react';\n\nimport {\n TOKEN_AMOUNT_MAX_DECIMALS,\n TOKEN_AMOUNT_MIN_DECIMALS,\n} from '../../constants/routing';\nimport {\n getBlockchainShortNameFor,\n getSwapperDisplayName,\n} from '../../utils/meta';\nimport { numberToString } from '../../utils/numbers';\nimport { isNetworkStatusInWarningState } from '../../utils/swap';\nimport { SwapDetailsAlerts } from '../SwapDetailsAlerts';\n\nexport const RESET_INTERVAL = 2_000;\nexport const SECONDS = 60;\n\nexport const getSteps = ({\n swap,\n blockchains,\n swappers,\n ...args\n}: GetStep): Step[] => {\n const hasAlreadyProceededToSign = swap.hasAlreadyProceededToSign !== false;\n return swap.steps.map((step, index) => {\n const amountToConvert =\n index === 0\n ? swap.inputAmount\n : swap.steps[index - 1].outputAmount ||\n swap.steps[index - 1].expectedOutputAmountHumanReadable;\n return {\n from: {\n token: { displayName: step.fromSymbol, image: step.fromLogo ?? '' },\n chain: {\n displayName:\n getBlockchainShortNameFor(step.fromBlockchain, blockchains) ?? '',\n image: step.fromBlockchainLogo ?? '',\n },\n price: {\n value: numberToString(\n amountToConvert,\n TOKEN_AMOUNT_MIN_DECIMALS,\n TOKEN_AMOUNT_MAX_DECIMALS\n ),\n realValue: amountToConvert,\n },\n },\n to: {\n token: { displayName: step.toSymbol, image: step.toLogo },\n chain: {\n displayName:\n getBlockchainShortNameFor(step.toBlockchain, blockchains) ?? '',\n image: step.toBlockchainLogo ?? '',\n },\n price: {\n value: numberToString(\n step.outputAmount || step.expectedOutputAmountHumanReadable,\n TOKEN_AMOUNT_MIN_DECIMALS,\n TOKEN_AMOUNT_MAX_DECIMALS\n ),\n realValue:\n step.outputAmount || step.expectedOutputAmountHumanReadable,\n },\n },\n swapper: {\n displayName: getSwapperDisplayName(step.swapperId, swappers),\n image: step.swapperLogo ?? '',\n type: step.swapperType,\n },\n internalSwaps: step.internalSwaps\n ? step.internalSwaps.map((internalSwap) => {\n return {\n from: {\n blockchain:\n getBlockchainShortNameFor(\n internalSwap.fromBlockchain,\n blockchains\n ) ?? '',\n },\n to: {\n blockchain:\n getBlockchainShortNameFor(\n internalSwap.toBlockchain,\n blockchains\n ) ?? '',\n },\n swapper: {\n displayName: getSwapperDisplayName(\n internalSwap.swapperId,\n swappers\n ),\n image: internalSwap.swapperLogo ?? '',\n type: internalSwap.swapperType,\n },\n };\n })\n : [],\n alerts: (\n <SwapDetailsAlerts\n step={step}\n hasAlreadyProceededToSign={hasAlreadyProceededToSign}\n {...args}\n />\n ),\n };\n });\n};\n\nexport function getStepState(step: PendingSwapStep): StepDetailsProps['state'] {\n if (\n isNetworkStatusInWarningState(step) &&\n step.status !== 'failed' &&\n step.status !== 'success'\n ) {\n return 'warning';\n }\n\n switch (step.status) {\n case 'created':\n return 'default';\n case 'approved':\n case 'waitingForApproval':\n case 'running':\n return 'in-progress';\n case 'failed':\n return 'error';\n case 'success':\n return 'completed';\n }\n}\n", "import type { SwapAlertsProps } from './SwapDetailsAlerts.types';\n\nimport { i18n } from '@lingui/core';\nimport { Alert, IconButton, LinkIcon } from '@rango-dev/ui';\nimport React, { Fragment } from 'react';\n\nimport { isNetworkStatusInWarningState } from '../../utils/swap';\n\nimport { FailedAlert } from './SwapDetailsAlerts.Failed';\nimport { Alerts } from './SwapDetailsAlerts.styles';\nimport { WarningAlert } from './SwapDetailsAlerts.Warning';\n\nexport function SwapDetailsAlerts(props: SwapAlertsProps) {\n const {\n 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 const waitingProgress =\n (inProgress && !hasAlreadyProceededToSign) ||\n (waitingForApproval && !step.explorerUrl?.length);\n\n return (\n <Alerts>\n {step.explorerUrl?.map((explorerUrl, index, urls) => {\n const key = index + explorerUrl.url;\n const lastUrl = index === urls.length - 1;\n const loading =\n ((lastUrl && inProgress) || waitingForApproval) && !waitingProgress;\n const error = lastUrl && step.status === 'failed';\n\n return (\n <Fragment key={key}>\n <Alert\n type={\n lastUrl\n ? (loading && 'loading') || (error && 'error') || 'success'\n : 'success'\n }\n title={\n !explorerUrl.description\n ? i18n.t('View transaction')\n : `${explorerUrl.description} Tx`\n }\n action={\n explorerUrl.url && (\n <IconButton\n variant=\"ghost\"\n size=\"xsmall\"\n onClick={() => window.open(explorerUrl.url, '_blank')}>\n <LinkIcon size={12} />\n </IconButton>\n )\n }\n />\n </Fragment>\n );\n })}\n {waitingProgress && <Alert type=\"loading\" title={message.shortMessage} />}\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 { Alert, Button } from '@rango-dev/ui';\nimport { PendingSwapNetworkStatus } from 'rango-types';\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 { css, darkTheme, styled } from '@rango-dev/ui';\n\nimport { ScrollableArea } from '../Layout';\n\nexport const Container = styled('div', {\n display: 'flex',\n flexDirection: 'column',\n flexGrow: 1,\n overflow: 'hidden',\n});\n\nexport const HeaderDetails = styled('div', {\n width: '100%',\n});\n\nexport const StepsList = styled(ScrollableArea, {\n padding: '$0 $20 $20 $20',\n});\n\nexport const Alerts = styled('div', {\n display: 'flex',\n flexDirection: 'column',\n gap: '$10',\n});\n\nexport const PlaceholderContainer = styled('div', {\n height: '450px',\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n});\n\nexport const LoaderContainer = styled('div', {\n display: 'flex',\n justifyContent: 'center',\n width: '100%',\n paddingTop: '33%',\n flex: 1,\n});\n\nexport const rowStyles = css({\n display: 'flex',\n width: '100%',\n justifyContent: 'space-between',\n alignItems: 'center',\n padding: '$10 $20',\n borderBottom: '1px solid',\n $$color: '$colors$neutral300',\n [`.${darkTheme} &`]: {\n $$color: '$colors$neutral400',\n },\n borderColor: '$$color',\n color: '$neutral500',\n});\n\nexport const datePlaceholderStyles = css({\n padding: '$5 0',\n});\n\nexport const requestIdStyles = css({\n display: 'flex',\n justifyContent: 'center',\n alignItems: 'center',\n height: '$24',\n});\n\nexport const outputStyles = css({\n display: 'flex',\n width: '100%',\n padding: '$15 $20 $20',\n flexDirection: 'column',\n alignItems: 'start',\n});\n\nexport const titleStepsStyles = css({\n width: '100%',\n padding: '0 $20 $10',\n});\n\nexport const StyledLink = styled('a', {\n fontSize: '$16',\n fontWeight: '$400',\n color: '$neutral700',\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n});\n", "import type { SwapDetailsPlaceholderPropTypes } from './SwapDetails.types';\n\nimport { i18n } from '@lingui/core';\nimport { Divider, NotFound, Skeleton, Typography } from '@rango-dev/ui';\nimport React from 'react';\n\nimport { SuffixContainer } from '../HeaderButtons/HeaderButtons.styles';\nimport { Layout } from '../Layout';\nimport { LoadingSwapDetails } from '../LoadingSwapDetails';\n\nimport {\n Container,\n datePlaceholderStyles,\n HeaderDetails,\n PlaceholderContainer,\n requestIdStyles,\n rowStyles,\n} from './SwapDetails.styles';\n\nexport function SwapDetailsPlaceholder(props: SwapDetailsPlaceholderPropTypes) {\n const { requestId, showSkeleton } = props;\n return (\n <Layout\n header={{\n title: i18n.t('Swap and Bridge'),\n suffix: <SuffixContainer />,\n }}>\n {showSkeleton && (\n <Container>\n <HeaderDetails>\n <div className={rowStyles()}>\n <Typography variant=\"label\" size=\"large\" color=\"neutral700\">\n {`${i18n.t('Request ID')}:`}\n </Typography>\n <div className={requestIdStyles()}>\n <Typography variant=\"label\" size=\"small\" color=\"neutral700\">\n <Skeleton width={60} height={10} variant=\"rounded\" />\n </Typography>\n <Divider direction=\"horizontal\" size={4} />\n <Skeleton width={16} height={16} variant=\"rectangular\" />\n <Divider direction=\"horizontal\" size={4} />\n <Skeleton width={16} height={16} variant=\"rectangular\" />\n </div>\n </div>\n <div className={rowStyles()}>\n <Typography\n className={datePlaceholderStyles()}\n variant=\"label\"\n size=\"large\"\n color=\"neutral700\">\n <Skeleton width={60} height={10} variant=\"rounded\" />\n </Typography>\n <Typography variant=\"label\" size=\"small\" color=\"neutral700\">\n <Skeleton width={60} height={10} variant=\"rounded\" />\n </Typography>\n </div>\n </HeaderDetails>\n <LoadingSwapDetails />\n </Container>\n )}\n {!showSkeleton && (\n <PlaceholderContainer>\n <NotFound\n title={i18n.t('Not found')}\n description={i18n.t({\n id: 'Swap with request ID = {requestId} not found.',\n values: { requestId },\n })}\n />\n </PlaceholderContainer>\n )}\n </Layout>\n );\n}\n", "import { i18n } from '@lingui/core';\nimport { Divider, Skeleton, Typography } from '@rango-dev/ui';\nimport React from 'react';\n\nimport { QuoteSummarySkeleton, StepSkeleton } from '../QuoteSkeleton';\n\nimport {\n Container,\n extraInfoStyles,\n StepContainer,\n StepSeparator,\n} from './LoadingSwapDetails.styles';\n\nexport function LoadingSwapDetails() {\n return (\n <Container>\n <QuoteSummarySkeleton type=\"swap-preview\" />\n <div className=\"swaps-steps\">\n <Typography variant=\"title\" size=\"small\">\n {i18n.t('Swaps steps')}\n </Typography>\n </div>\n\n <>\n <StepContainer>\n <StepSkeleton separator={false} />\n <div className={extraInfoStyles()}>\n <Divider direction=\"horizontal\" size={20} />\n <Skeleton height={22} variant=\"rectangular\" />\n </div>\n </StepContainer>\n <StepSeparator />\n <StepContainer>\n <StepSkeleton separator={false} />\n </StepContainer>\n <StepSeparator />\n <StepContainer>\n <StepSkeleton separator={false} />\n </StepContainer>\n <StepSeparator />\n <StepContainer>\n <StepSkeleton separator={false} />\n </StepContainer>\n </>\n </Container>\n );\n}\n", "import { css, styled } from '@rango-dev/ui';\n\nexport const Container = styled('div', {\n width: '100%',\n height: '100%',\n padding: '$10 $20',\n});\n\nexport const StepContainer = styled('div', {\n backgroundColor: '$neutral100',\n borderRadius: '$xm',\n padding: '$10 $15',\n});\n\nexport const StepSeparator = styled('div', {\n width: '0px',\n height: '$20',\n borderLeft: '1px dashed $neutral700',\n marginLeft: '25px',\n});\n\nexport const quoteSummaryItemStyles = css({\n display: 'flex',\n justifyContent: 'space-between',\n alignItems: 'center',\n});\n\nexport const tokenAmountStyles = css({\n display: 'flex',\n justifyContent: 'space-between',\n alignItems: 'center',\n});\n\nexport const costStyles = css({\n paddingTop: '$15',\n display: 'flex',\n});\n\nexport const quoteSummaryStyles = css({\n padding: '$15 $0',\n});\n\nexport const quoteSummarySeparatorStyles = css({\n width: '0px',\n height: '$16',\n borderLeft: '1px solid $neutral400',\n marginLeft: '13px',\n});\n\nexport const swapsStepsStyles = css({\n paddingBottom: '$10',\n});\n\nexport const stepTitleStyles = css({\n display: 'flex',\n justifyContent: 'start',\n alignItems: 'center',\n});\n\nexport const stepTokensStyles = css({\n paddingTop: '$5',\n display: 'flex',\n alignItems: 'center',\n});\n\nexport const stepInfoStyles = css({\n display: 'flex',\n alignItems: 'center',\n});\n\nexport const stepIconStyles = css({\n padding: '$4 $6',\n display: 'flex',\n justifyContent: 'center',\n alignItems: 'center',\n});\n\nexport const extraInfoStyles = css({\n display: 'flex',\n paddingTop: '$10',\n paddingBottom: '$5',\n});\n", "import {\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 { useAppStore } from '../store/AppStore';\nimport { useNotificationStore } from '../store/notification';\nimport { useWalletsStore } from '../store/wallets';\n\nexport function WidgetEvents() {\n const tokens = useAppStore().tokens();\n const connectedWallets = useWalletsStore.use.connectedWallets();\n const getWalletsDetails = useWalletsStore.use.getWalletsDetails();\n const setNotification = useNotificationStore.use.setNotification();\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], tokens);\n toAccount && getWalletsDetails([toAccount], tokens);\n }\n\n setNotification(event, route);\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 { 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 { useUiStore } from '../store/ui';\nimport { getConfig } from '../utils/configs';\n\nexport type Watermark = 'NONE' | 'FULL';\n\ntype ConfigResponse = {\n config: {\n watermark: Watermark;\n };\n};\n\ninterface UseFetchApiConfig {\n fetchApiConfig: () => Promise<void>;\n}\n\nexport function useFetchApiConfig(): UseFetchApiConfig {\n const { setWatermark } = useUiStore();\n\n const fetchApiConfig: UseFetchApiConfig['fetchApiConfig'] = async () => {\n const response = await fetch(\n `${getConfig('BASE_URL')}/meta/dapp/config?apiKey=${getConfig('API_KEY')}`\n );\n\n if (!response.ok) {\n throw new Error(`Request failed with status: ${response.status} `);\n }\n\n const data: ConfigResponse = await response.json();\n\n setWatermark(data.config.watermark);\n };\n return { fetchApiConfig };\n}\n", "import { styled } from '@rango-dev/ui';\n\nexport const MainContainer = styled('div', {\n fontFamily: '$widget',\n boxSizing: 'border-box',\n textAlign: 'left',\n '& *, *::before, *::after': {\n boxSizing: 'inherit',\n },\n '& *:focus-visible': {\n outlineColor: '$info500',\n transition: 'none',\n },\n '& ul, ol, li': { listStyleType: 'none' },\n});\n", "import type { PropTypes } from './WidgetProvider.types';\nimport type { PropsWithChildren } from 'react';\n\nimport React, { useMemo } from 'react';\n\nimport { DEFAULT_BASE_URL, RANGO_PUBLIC_API_KEY } from '../../constants';\nimport QueueManager from '../../QueueManager';\nimport { initConfig } from '../../utils/configs';\nimport { WidgetWallets } from '../Wallets';\nimport { WidgetInfo } from '../WidgetInfo';\n\nexport function WidgetProvider(props: PropsWithChildren<PropTypes>) {\n const { onUpdateState, config } = props;\n\n useMemo(() => {\n initConfig({\n API_KEY: config?.apiKey || RANGO_PUBLIC_API_KEY,\n BASE_URL: config?.apiUrl || DEFAULT_BASE_URL,\n });\n }, [config.apiKey, config.apiUrl]);\n\n return (\n <WidgetWallets config={config} onUpdateState={onUpdateState}>\n <QueueManager apiKey={config.apiKey}>\n <WidgetInfo>{props.children}</WidgetInfo>\n </QueueManager>\n </WidgetWallets>\n );\n}\n", "import type { SwapQueueContext } from '@rango-dev/queue-manager-rango-preset';\nimport type { Network, WalletType } from '@rango-dev/wallets-shared';\nimport type { PropsWithChildren } from 'react';\n\nimport {\n checkWaitingForNetworkChange,\n makeQueueDefinition,\n} from '@rango-dev/queue-manager-rango-preset';\nimport { Provider as ManagerProvider } from '@rango-dev/queue-manager-react';\nimport { useWallets } from '@rango-dev/wallets-react';\nimport { convertEvmBlockchainMetaToEvmChainInfo } from '@rango-dev/wallets-shared';\nimport { isEvmBlockchain } from 'rango-types';\nimport React, { useMemo } from 'react';\n\nimport { useAppStore } from './store/AppStore';\nimport { useUiStore } from './store/ui';\nimport { useWalletsStore } from './store/wallets';\nimport { getConfig } from './utils/configs';\nimport { walletAndSupportedChainsNames } from './utils/wallets';\n\nfunction QueueManager(props: PropsWithChildren<{ apiKey?: string }>) {\n const {\n providers,\n getSigners,\n state,\n connect,\n canSwitchNetworkTo,\n getWalletInfo,\n } = useWallets();\n\n const swapQueueDef = useMemo(() => {\n return makeQueueDefinition({\n API_KEY: props.apiKey || getConfig('API_KEY'),\n BASE_URL: getConfig('BASE_URL'),\n });\n }, [props.apiKey]);\n\n const blockchains = useAppStore().blockchains();\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 = async (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 wallets,\n providers: allProviders,\n switchNetwork,\n canSwitchNetworkTo,\n connect,\n state,\n isMobileWallet,\n };\n\n const isActiveTab = useUiStore.use.isActiveTab();\n\n return (\n <ManagerProvider\n queuesDefs={[swapQueueDef]}\n context={context}\n onPersistedDataLoaded={(manager) => {\n checkWaitingForNetworkChange(manager);\n }}\n isPaused={!isActiveTab}>\n {props.children}\n </ManagerProvider>\n );\n}\n\nexport default QueueManager;\n", "import type { WidgetInfoContextInterface } from './WidgetInfo.types';\n\nimport { useManager } from '@rango-dev/queue-manager-react';\nimport React, { createContext, useContext } from 'react';\n\nimport { useLanguage } from '../../hooks/useLanguage';\nimport { useAppStore } from '../../store/AppStore';\nimport { useNotificationStore } from '../../store/notification';\nimport { useQuoteStore } from '../../store/quote';\nimport { tabManager, useUiStore } from '../../store/ui';\nimport { useWalletsStore } from '../../store/wallets';\nimport { calculateWalletUsdValue } from '../../utils/wallets';\n\nimport { WidgetHistory } from './WidgetInfo.helpers';\n\nexport const WidgetInfoContext = createContext<\n WidgetInfoContextInterface | undefined\n>(undefined);\n\nexport function WidgetInfo(props: React.PropsWithChildren) {\n const { manager } = useManager();\n const isActiveTab = useUiStore.use.isActiveTab();\n const retrySwap = useQuoteStore.use.retry();\n const history = new WidgetHistory(manager, { retrySwap });\n const details = useWalletsStore.use.connectedWallets();\n const isLoading = useWalletsStore.use.loading();\n const totalBalance = calculateWalletUsdValue(details);\n const refetch = useWalletsStore.use.getWalletsDetails();\n const blockchains = useAppStore().blockchains();\n const tokens = useAppStore().tokens();\n const swappers = useAppStore().swappers();\n const loadingStatus = useAppStore().fetchStatus;\n const resetLanguage = useLanguage().resetLanguage;\n const notifications = useNotificationStore().getUnreadNotifications();\n\n // eslint-disable-next-line react/jsx-no-constructed-context-values\n const value: WidgetInfoContextInterface = {\n isActiveTab,\n setCurrentTabAsActive: tabManager.forceClaim,\n history,\n wallets: {\n isLoading,\n details,\n totalBalance,\n refetch,\n },\n meta: {\n blockchains,\n tokens,\n swappers,\n loadingStatus,\n },\n resetLanguage,\n notifications: {\n list: notifications,\n },\n };\n\n return (\n <WidgetInfoContext.Provider value={value}>\n {props.children}\n </WidgetInfoContext.Provider>\n );\n}\n\nexport function useWidget(): WidgetInfoContextInterface {\n const context = useContext(WidgetInfoContext);\n if (!context) {\n throw new Error(\n 'useWidget can only be used within the WidgetProvider component'\n );\n }\n return context;\n}\n", "import type { Meta } from '../../store/quote';\nimport type { Manager } from '@rango-dev/queue-manager-core';\nimport type { PendingSwap } from 'rango-types/lib';\n\nimport {\n cancelSwap,\n getCurrentBlockchainOfOrNull,\n getCurrentStep,\n getRelatedWalletOrNull,\n} from '@rango-dev/queue-manager-rango-preset';\n\nimport { getPendingSwaps } from '../../utils/queue';\n\ninterface WidgetHistoryActions {\n retrySwap: (pendingSwap: PendingSwap, meta: Meta) => void;\n}\n\nexport class WidgetHistory {\n private manager: Manager | undefined;\n private actions: WidgetHistoryActions;\n\n constructor(manager: Manager | undefined, actions: WidgetHistoryActions) {\n this.manager = manager;\n this.actions = actions;\n }\n\n public getAllSwaps() {\n return getPendingSwaps(this.manager);\n }\n\n public getCurrentStep(swap: PendingSwap) {\n return this.getCurrentStepInfo(swap).step;\n }\n\n public getCurrentStepWallet(swap: PendingSwap) {\n return this.getCurrentStepInfo(swap).wallet;\n }\n\n public getCurrentStepNetwork(swap: PendingSwap) {\n return this.getCurrentStepInfo(swap).network;\n }\n\n public retry(swap: PendingSwap, meta: Meta) {\n return this.actions.retrySwap(swap, meta);\n }\n\n public cancel(id: string) {\n const queue = this.manager?.get(id);\n if (queue) {\n cancelSwap(queue);\n }\n }\n\n private getCurrentStepInfo(swap: PendingSwap) {\n const currentStep = getCurrentStep(swap);\n return {\n step: currentStep,\n wallet: currentStep ? getRelatedWalletOrNull(swap, currentStep) : null,\n network: currentStep\n ? getCurrentBlockchainOfOrNull(swap, currentStep)\n : null,\n };\n }\n}\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": ["EventSeverity", "MainEvents", "RouteEventType", "StepEventType", "StepExecutionBlockedEventStatus", "StepExecutionEventStatus", "useWidgetEvents", "readAccountAddress", "useWallets", "WalletEvents", "Networks", "WalletTypes", "PendingSwapNetworkStatus", "UI_ID", "RANGO_PUBLIC_API_KEY", "DEFAULT_BASE_URL", "SCANNER_BASE_URL", "WIDGET_UI_ID", "Events", "Provider", "isEvmBlockchain", "React", "createContext", "useEffect", "useRef", "useEffect", "create", "subscribeWithSelector", "RangoClient", "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", "formatTooltipNumbers", "number", "numberToString", "mapStatusToWalletState", "state", "WalletStatus", "__name", "mapWalletTypesToWalletInfo", "getState", "getWalletInfo", "list", "chain", "wallet", "EXCLUDED_WALLETS", "supportedChains", "isContractWallet", "installed", "network", "supportedChain", "type", "name", "image", "installLink", "detectInstallLink", "walletAndSupportedChainsNames", "supportedBlockchains", "blockchainMeta", "prepareAccountsForWalletStore", "accounts", "evmBasedChains", "supportedChainNames", "result", "addAccount", "address", "account", "newAccount", "readAccountAddress", "hasLimitation", "isSupported", "isUnknown", "Networks", "isUnknownAndEvmBased", "isEvmAddress", "getRequiredChains", "quote", "wallets", "swap", "currentStepFromBlockchain", "currentStepToBlockchain", "internalSwap", "internalStepFromBlockchain", "internalStepToBlockchain", "isAccountAndWalletMatched", "connectedWallet", "makeBalanceFor", "retrievedBalance", "tokens", "balances", "tokenBalance", "BigNumber", "getUsdPrice", "resetConnectedWalletState", "calculateWalletUsdValue", "uniqueAccountAddresses", "modifiedWalletBlockchains", "acc", "current", "i", "modifiedWalletBlockchain", "accountAddress", "total", "numberToString", "b", "a", "ZERO", "numberWithThousandSeparator", "number", "parts", "blockchain", "symbol", "allTokens", "t", "isExperimentalChain", "blockchains", "cosmosExperimentalChainInfo", "getCosmosExperimentalChainInfo", "isCosmosBlockchain", "formatBalance", "balance", "numberToString", "__name", "compareTokenBalance", "token1Balance", "token2Balance", "areTokensEqual", "tokenA", "tokenB", "sortWalletsBasedOnConnectionState", "wallets", "a", "b", "WalletStatus", "getConciseAddress", "address", "maxChars", "ellipsisLength", "start", "end", "getAddress", "chain", "connectedWallets", "walletType", "connectedWallet", "createTokenHash", "token", "makeTokensBalance", "wallet", "balances", "currentBalance", "BigNumber", "ZERO", "tokenHash", "prevBalance", "isFetchingBalance", "blockchain", "hashWalletsState", "walletsInfo", "w", "configs", "RANGO_PUBLIC_API_KEY", "getConfig", "name", "__name", "initConfig", "nextConfigs", "clonedConfigs", "configs", "__name", "DEFAULT_PRIMARY_RADIUS", "DEFAULT_SECONDARY_RADIUS", "DEFAULT_FONT_FAMILY", "THEME_CLASS_NAME_PREFIX", "isTokenExcludedInConfig", "token", "tokensConfig", "result", "asset", "areTokensEqual", "isExcluded", "isBlockchainExcludedInConfig", "blockchain", "blockchainsConfig", "isVariantExpandable", "isLargeScreen", "isExtraLargeScreen", "variant", "rango", "httpService", "__name", "RangoClient", "getConfig", "createSelectors", "__name", "_store", "store", "k", "s", "selectors_default", "useWalletsStore", "selectors_default", "create", "subscribeWithSelector", "set", "get", "accounts", "tokens", "getWalletsDetails", "state", "wallet", "account", "shouldMarkWalletAsSelected", "connectedWallet", "walletType", "selectedWallets", "selectedWallet", "connectedWallets", "makeTokensBalance", "wallets", "walletSelected", "walletNotSelected", "shouldRetry", "isAccountAndWalletMatched", "data", "address", "chain", "retrievedBalance", "httpService", "matchedAccount", "retrievedBalanceAccount", "balance", "makeBalanceFor", "resetConnectedWalletState", "token", "balances", "tokenHash", "createTokenHash", "allProviders", "matchAndGenerateProviders", "providers", "options", "all", "allProviders", "selectedProviders", "requestedProvider", "result", "provider", "__name", "configWalletsToWalletName", "config", "useWalletProviders", "providers", "options", "clearConnectedWallet", "useWalletsStore", "generateProviders", "matchAndGenerateProviders", "useEffect", "__name", "React", "createContext", "useContext", "useEffect", "useRef", "create", "persist", "DEFAULT_CONFIG", "DEFAULT_IFRAME_CONFIGS", "DEFAULT_CAMPAIGN_MODE", "createConfigSlice", "__name", "initialData", "set", "get", "config", "campaignMode", "disabledLiquiditySources", "nextConfig", "currentConfig", "name", "value", "currentCampaignMode", "currentIframeConfig", "removeDuplicateFrom", "array", "__name", "areEqual", "array1", "array2", "v", "i", "debounce", "fn", "time", "timeoutId", "wrapper", "args", "containsText", "text", "searchText", "exactText", "startWithText", "getContainer", "WIDGET_UI_ID", "getExpanded", "compareExactMatchText", "searchFor", "textA", "textB", "exactMatchA", "exactMatchB", "compareContainsText", "textContainsA", "textContainsB", "compareStartWithText", "textStartWithA", "textStartWithB", "compareWithSearchFor", "tokenA", "tokenB", "symbolExactMatchCompare", "tokenNameExactMatchCompare", "symbolStartWithCompare", "symbolContainsCompare", "tokenNameStartWithCompare", "tokenNameContainsCompare", "addressStartWithCompare", "addressContainCompare", "getBlockchainDisplayNameFor", "blockchainName", "blockchains", "blockchain", "__name", "getBlockchainShortNameFor", "getSwapperDisplayName", "swapperId", "swappers", "swapper", "findToken", "tokens", "token", "areTokensEqual", "findBlockchain", "name", "isTokenNative", "feeAsset", "getUniqueSwappersGroups", "swappers", "disabledLiquiditySources", "supportedSwappers", "swapper", "uniqueSupportedSwappersGroups", "removeDuplicateFrom", "uniqueGroupItem", "swapperItem", "isSupportedSwapper", "supportedItem", "swapperTypeItem", "__name", "sortLiquiditySourcesByGroupTitle", "a", "b", "isFeatureHidden", "feature", "features", "isFeatureEnabled", "createDataSlice", "__name", "set", "get", "options", "blockchainsMapByName", "blockchainsFromState", "config", "supportedBlockchainsFromConfig", "blockchain", "tokensFromState", "supportedTokensConfig", "blockchains", "token", "isTokenExcludedInConfig", "containsText", "tokenA", "tokenB", "isToken1Pinned", "isToken2Pinned", "token1Balance", "token2Balance", "balanceCompare", "compareTokenBalance", "symbolSearchForCompare", "compareWithSearchFor", "blockChainA", "blockChainB", "isNativeTokenA", "isTokenNative", "isNativeTokenB", "type", "pinnedToken", "areTokensEqual", "campaignMode", "campaignModeLiquiditySource", "liquiditySources", "excludeLiquiditySources", "swapper", "swapperGroupIncludedInLiquiditySources", "sortLiquiditySourcesByGroupTitle", "enableCentralizedSwappers", "response", "httpService", "tokens", "popularTokens", "swappers", "blockchainsWithAtLeastOneToken", "a", "b", "error", "Chinese", "English", "Finland", "French", "German", "Greece", "Italian", "Japanese", "Netherlands", "Poland", "Portuguese", "Russian", "Spanish", "Swedish", "Ukrainian", "LANGUAGES", "DEFAULT_LANGUAGE", "SLIPPAGES", "DEFAULT_SLIPPAGE", "HIGH_SLIPPAGE", "MAX_SLIPPAGE", "MIN_SLIPPGAE", "createSettingsSlice", "__name", "set", "get", "DEFAULT_SLIPPAGE", "blockchain", "currentPreferredBlockchains", "preferredBlockchain", "index", "isSameBlockchain", "isInVisibleList", "nextPreferredBlockchains", "slippage", "customSlippage", "affiliateRef", "affiliatePercent", "affiliateWallets", "swappers", "shouldReset", "state", "swappersGroup", "removeDuplicateFrom", "swapper", "name", "liquiditySource", "theme", "language", "nextConfig", "features", "isThemeHidden", "isFeatureHidden", "isLanguageHidden", "isLiquidityHidden", "DEFAULT_LANGUAGE", "createAppStore", "initialData", "create", "persist", "a", "createDataSlice", "createSettingsSlice", "createConfigSlice", "state", "__name", "AppStoreContext", "createContext", "useAppStore", "store", "useContext", "useEffect", "__name", "AppStoreProvider", "props", "appStoreRef", "useRef", "createAppStore", "React", "create", "CHANNEL_NAME", "TabManager", "__name", "events", "CHANNEL_NAME", "message", "pingAt", "isPingSentBefore", "event", "name", "resolve", "nextActiveTab", "useUiStore", "selectors_default", "create", "set", "get", "setCurrentTabAsActive", "hasRunningSwaps", "showActivateTabModal", "flag", "watermark", "tabManager", "TabManager", "WidgetContext", "createContext", "Main", "props", "updateConfig", "updateSettings", "fetchMeta", "useAppStore", "blockchains", "tokens", "walletOptions", "providers", "useWalletProviders", "connectWallet", "disconnectWallet", "useWalletsStore", "onConnectWalletHandler", "useRef", "useEffect", "evmBasedChainNames", "isEvmBlockchain", "chain", "onUpdateState", "__name", "type", "event", "value", "state", "meta", "Events", "supportedChainNames", "walletAndSupportedChainsNames", "data", "prepareAccountsForWalletStore", "key", "isActiveTab", "useUiStore", "React", "handler", "Provider", "WidgetWallets", "config", "otherProps", "AppStoreProvider", "React", "useEffect", "I18nManager", "React", "useContext", "useEffect", "useState", "useQueueManager", "useWallets", "isEvmBlockchain", "React", "Fragment", "MemoryRouter", "useInRouterContext", "useWallets", "useEffect", "useRef", "useForceAutoConnect", "connect", "state", "useWallets", "initiated", "useRef", "fetchStatus", "useAppStore", "walletType", "walletState", "useEffect", "__name", "AppRouter", "children", "props", "Router", "useInRouterContext", "Fragment", "MemoryRouter", "blockchains", "useAppStore", "canSwitchNetworkTo", "useWallets", "useForceAutoConnect", "evmChains", "isEvmBlockchain", "useQueueManager", "React", "__name", "React", "useRoutes", "navigationRoutes", "useEffect", "useRef", "BigNumber", "create", "subscribeWithSelector", "getLastSuccessfulStep", "BigNumber", "i18n", "NAME_OF_FEES", "ROUTE_STRATEGY", "HIGH_PRIORITY_TAGS", "GAS_FEE_MAX", "QuoteWarningType", "i18n", "BigNumber", "PendingSwapNetworkStatus", "getRequiredWallets", "swaps", "wallets", "swap", "currentStepFromBlockchain", "currentStepToBlockchain", "lastAddedWallet", "__name", "isValidAddress", "chain", "address", "i18n", "errorMessages", "__name", "i18n", "getQuoteErrorMessage", "error", "i18n", "swapButtonTitles", "__name", "i18n", "hasHighValueLoss", "inputUsdValue", "priceImpact", "BigNumber", "__name", "hasLimitError", "swaps", "swap", "minimum", "maximum", "getLimitErrorMessage", "isExclusive", "fromAmountRangeError", "recommendation", "i18n", "numberToString", "errorMessages", "getSwapButtonState", "params", "fetchMetaStatus", "anyWalletConnected", "fetchingQuote", "inputAmount", "quote", "warning", "error", "needsToWarnEthOnPath", "swapButtonTitles", "canComputePriceImpact", "usdValue", "ZERO", "requiredWallets", "wallets", "currentStepFromBlockchain", "currentStepToBlockchain", "lastAddedWallet", "getUsdPrice", "blockchain", "symbol", "address", "allTokens", "t", "getUsdFeeOfStep", "step", "totalFeeInUsd", "i", "fee", "unitPrice", "getTotalFeeInUsd", "totalFee", "getUsdFee", "getTotalFeesInUsd", "fees", "getFeesGroup", "result", "name", "feeGroup", "checkSlippageErrors", "swaps", "recommendedSlippages", "swap", "index", "__name", "checkSlippageWarnings", "quote", "userSlippage", "getMinRequiredSlippage", "slippage", "s", "a", "b", "hasProperSlippage", "minRequiredSlippage", "createQuoteRequestBody", "params", "fromToken", "toToken", "inputAmount", "wallets", "selectedWallets", "disabledLiquiditySources", "liquiditySources", "excludeLiquiditySources", "slippage", "affiliateRef", "affiliatePercent", "affiliateWallets", "destination", "enableCentralizedSwappers", "selectedWalletsMap", "selectedWallet", "connectedWallets", "wallet", "liquiditySource", "__name", "getWalletsForNewSwap", "getQuoteOutputAmount", "quote", "getPercentageChange", "input", "output", "BigNumber", "isOutputAmountChangedALot", "oldQuote", "newQuote", "oldOutputAmount", "newOutputAmount", "percentageChange", "getPriceImpact", "generateBalanceWarnings", "blockchains", "fee", "requiredWallets", "getRequiredChains", "selectedWallet1", "selectedWallet2", "getRequiredBalanceOfWallet", "asset", "symbol", "currentAmount", "numberToString", "requiredAmount", "reason", "i18n", "getBlockchainShortNameFor", "calcOutputUsdValue", "outputAmount", "tokenPrice", "ZERO", "isNetworkStatusInWarningState", "pendingSwapStep", "PendingSwapNetworkStatus", "getSwapMessages", "pendingSwap", "currentStep", "textForRemove", "message", "detailedMessage", "isRpc", "getLastConvertedTokenInFailedSwap", "resultToken", "lastSuccessStep", "step", "shouldRetrySwap", "confirmSwapDisabled", "fetching", "showCustomDestination", "customDestination", "lastStepToBlockchain", "chain", "isValidAddress", "isTokensIdentical", "tokenA", "tokenB", "getQuoteToTokenUsdPrice", "quote", "swaps", "__name", "isNumberOfSwapsChanged", "quoteA", "quoteB", "quoteASwaps", "quoteBSwaps", "isQuoteSwappersUpdated", "quoteASwappers", "swap", "quoteBSwappers", "areEqual", "isQuoteInternalCoinsUpdated", "quoteAInternalCoins", "quoteBInternalCoins", "isQuoteChanged", "getRequiredBalanceOfWallet", "selectedWallet", "fee", "relatedFeeStatus", "item", "wallet", "__name", "getPriceImpactLevel", "priceImpact", "warningLevel", "createRetryQuote", "pendingSwap", "blockchains", "tokens", "firstStep", "lastStep", "lastSuccessfulStep", "getLastSuccessfulStep", "toToken", "fromBlockchainMeta", "findBlockchain", "toBlockchainMeta", "fromTokenMeta", "findToken", "toTokenMeta", "inputAmount", "__name", "generateQuoteWarnings", "quote", "params", "fromToken", "userSlippage", "inputUsdValue", "getUsdValue", "outputUsdValue", "priceImpact", "getPriceImpact", "hasHighValueLoss", "totalFee", "getTotalFeeInUsd", "warningLevel", "getPriceImpactLevel", "minRequiredSlippage", "getMinRequiredSlippage", "highSlippage", "HIGH_SLIPPAGE", "hasProperSlippage", "checkSlippageWarnings", "outputUsdValueIsInvalid", "percentageChange", "getPercentageChange", "getUniqueBlockchains", "steps", "set", "result", "step", "sortQuotesBy", "strategy", "quotes", "quote1", "quote2", "getScore", "route", "score", "quote1Score", "quote2Score", "lowerQuoteId1", "lowerQuoteId2", "getDefaultQuote", "currentQuote", "requestAmount", "currentQuoteSwapperIds", "swap", "matchedQuote", "quoteSwapperIds", "swapperId", "sortTags", "tags", "customSort", "a", "b", "indexA", "HIGH_PRIORITY_TAGS", "indexB", "getUsdValue", "__name", "token", "amount", "BigNumber", "ZERO", "useQuoteStore", "selectors_default", "create", "subscribeWithSelector", "set", "key", "value", "state", "quote", "outputAmount", "outputUsdValue", "isPositiveNumber", "calcOutputUsdValue", "getQuoteToTokenUsdPrice", "chain", "params", "blockchain", "pendingSwap", "meta", "tokens", "blockchains", "fromBlockchain", "fromToken", "toBlockchain", "toToken", "inputAmount", "createRetryQuote", "flag", "wallets", "address", "useSyncStoresWithConfig", "setInputAmount", "setToToken", "setToBlockchain", "setFromBlockchain", "setFromToken", "fromToken", "toToken", "fromBlockchain", "toBlockchain", "useQuoteStore", "config", "useAppStore", "fetchMetaStatus", "blockchains", "tokens", "setAffiliateRef", "setAffiliatePercent", "setAffiliateWallets", "fromTokensConfig", "fromBlockchainsConfig", "toTokensConfig", "toBlockchainsConfig", "prevConfigFromToken", "useRef", "prevConfigToToken", "prevConfigFromBlockchain", "prevConfigToBlockchain", "useEffect", "chain", "token", "t", "areTokensEqual", "isTokenExcludedInConfig", "isBlockchainExcludedInConfig", "__name", "useEffect", "useRef", "useInRouterContext", "useLocation", "useSearchParams", "searchParamToToken", "tokens", "searchParam", "chain", "token", "symbolAndAddress", "__name", "tokenToSearchParam", "useSyncUrlAndStore", "location", "useLocation", "searchParams", "setSearchParams", "useSearchParams", "fromBlockchain", "toBlockchain", "fromToken", "toToken", "inputAmount", "setFromBlockchain", "setToBlockchain", "setFromToken", "setToToken", "setInputAmount", "useQuoteStore", "fetchMetaStatus", "useAppStore", "blockchains", "tokens", "isInRouterContext", "useInRouterContext", "updateIframe", "updateCampaignMode", "campaignMode", "liquiditySourcesParamsRef", "useRef", "getUrlSearchParams", "__name", "fromAmount", "autoConnect", "clientUrl", "liquiditySources", "updateUrlSearchParams", "property", "useEffect", "tokenToSearchParam", "blockchain", "searchParamToToken", "i18n", "useManager", "Alert", "Button", "css", "Divider", "IconButton", "SettingsIcon", "styled", "Tooltip", "Typography", "WalletIcon", "React", "useEffect", "useLayoutEffect", "useRef", "useState", "flushSync", "useLocation", "useNavigate", "i18n", "Alert", "BalanceErrors", "Button", "ChevronDownIcon", "ChevronLeftIcon", "Divider", "MessageBox", "Typography", "WalletIcon", "React", "useEffect", "useState", "useNavigate", "i18n", "getQuoteUpdateWarningMessage", "warning", "i18n", "__name", "Modal", "React", "WatermarkedModal", "props", "watermark", "useUiStore", "React", "Modal", "__name", "React", "useRef", "Collapsible", "keyframes", "styled", "EXPANDABLE_TRANSITION_DURATION", "slideDown", "slideUp", "CollapsibleRoot", "Trigger", "CollapsibleContent", "ExpandedIcon", "CustomCollapsible", "props", "open", "hasSelected", "onOpenChange", "children", "onClickTrigger", "trigger", "triggerAnchor", "ref", "useRef", "React", "CollapsibleRoot", "Trigger", "CollapsibleContent", "__name", "css", "darkTheme", "IconButton", "styled", "TextField", "Title", "ListContainer", "WalletButton", "ShowMoreWallets", "ShowMoreHeader", "NavigateBack", "WalletsContainer", "walletsListStyles", "CustomDestination", "alarmsStyles", "ConfirmButton", "StyledTextField", "Wallets", "CustomDestinationButton", "i18n", "Button", "Divider", "Image", "MessageBox", "SelectableWallet", "Typography", "WalletState", "React", "useEffect", "useState", "WalletState", "useWallets", "KEPLR_COMPATIBLE_WALLETS", "WalletTypes", "useCallback", "useEffect", "useState", "ALL_SUPPORTED_WALLETS", "WalletTypes", "useWalletList", "params", "config", "chain", "onBeforeConnect", "onConnect", "state", "disconnect", "getWalletInfo", "connect", "useWallets", "connectedWallets", "useWalletsStore", "blockchains", "useAppStore", "listAvailableWalletTypes", "configWalletsToWalletName", "wallets", "mapWalletTypesToWalletInfo", "sortedWallets", "sortWalletsBasedOnConnectionState", "error", "setError", "useState", "isExperimentalChainNotAdded", "__name", "walletType", "connectedWallet", "handleClick", "type", "wallet", "atLeastOneWalletIsConnected", "w", "WalletState", "e", "disconnectConnectingWallets", "useCallback", "connectingWallets", "hashWalletsState", "useEffect", "shouldShowDefaultInjectedWallet", "blockchain", "shouldExcludeWallet", "isExperimentalChain", "KEPLR_COMPATIBLE_WALLETS", "i18n", "styled", "Typography", "Wallet", "WalletState", "React", "useState", "useManager", "BottomLogo", "Divider", "Header", "React", "useEffect", "useRef", "useRef", "isAppLoadedIntoIframe", "__name", "useIframe", "heightObserver", "useRef", "iframe", "useAppStore", "isMessagePassingAvailable", "isAppLoadedIntoIframe", "send", "__name", "message", "element", "entries", "entry", "useNavigate", "useNavigateBack", "navigate", "useNavigate", "__name", "createTheme", "defaultDarkTheme", "defaultLightTheme", "useEffect", "useState", "baseThemeTokens", "defaultDarkColors", "React", "generateShades", "baseColor", "prefix", "reverse", "shadeIncrements", "increment", "i", "decrementAmounts", "shades", "shadeIndex", "decrementAmount", "shade", "generateShade", "__name", "r", "g", "b", "convertToRGB", "clamp", "color", "isBright", "generateColors", "mainColors", "reverseNeutralRange", "colors", "changeColors", "listOfColors", "colorKey", "toAlphabeticChar", "__name", "code", "toAlphabeticName", "name", "x", "toPhash", "h", "i", "toHash", "value", "customizedThemeTokens", "colors", "baseColors", "baseThemeTokens", "darkColorsWithDefaults", "generateColors", "defaultDarkColors", "lightColorsWithDefaults", "hasDefaultDarkColors", "hasDefaultLightColors", "light", "dark", "tokens", "THEME_CLASS_NAME_PREFIX", "toHash", "__name", "joinList", "list", "divider", "element", "key", "React", "output", "item", "index", "useTheme", "props", "colors", "fontFamily", "DEFAULT_FONT_FAMILY", "borderRadius", "DEFAULT_PRIMARY_RADIUS", "secondaryBorderRadius", "DEFAULT_SECONDARY_RADIUS", "mode", "OSTheme", "setOSTheme", "useState", "setTheme", "theme", "useAppStore", "dark", "light", "customizedThemeTokens", "baseTheme", "createTheme", "lightThemeClasses", "defaultLightTheme", "darkThemeClasses", "defaultDarkTheme", "customizedLightTheme", "customizedDarkTheme", "useEffect", "switchThemeListener", "__name", "event", "lightClassNames", "darkClassNames", "getPendingSwaps", "__name", "manager", "result", "q", "id", "storage", "a", "b", "i18n", "Alert", "Button", "React", "ActivateTabAlert", "props", "React", "Alert", "Button", "i18n", "__name", "i18n", "Button", "Divider", "MessageBox", "React", "ActivateTabModal", "props", "open", "onClose", "onConfirm", "React", "WatermarkedModal", "getContainer", "MessageBox", "i18n", "Divider", "Button", "__name", "ChevronLeftIcon", "React", "css", "darkTheme", "IconButton", "styled", "HeaderButton", "ConnectedIcon", "SuffixContainer", "NotificationsBadgeContainer", "ProgressIcon", "InProgressTransactionBadgeContainer", "rowStyles", "WalletImageContainer", "BackButton", "props", "React", "HeaderButton", "ChevronLeftIcon", "__name", "i18n", "Button", "Typography", "React", "CancelButton", "props", "React", "SuffixContainer", "Button", "Typography", "i18n", "__name", "i18n", "Image", "Tooltip", "WalletIcon", "React", "WalletButton", "props", "list", "useWalletList", "connectedWallets", "wallet", "content", "React", "rowStyles", "WalletImageContainer", "Image", "i18n", "Tooltip", "HeaderButton", "ConnectedIcon", "WalletIcon", "__name", "i18n", "NotificationsIcon", "Popover", "SettingsIcon", "Tooltip", "TransactionIcon", "React", "i18n", "EventSeverity", "ChainToken", "ChevronRightIcon", "Divider", "Typography", "React", "useNavigate", "create", "persist", "subscribeWithSelector", "useNotificationStore", "selectors_default", "create", "persist", "subscribeWithSelector", "set", "get", "event", "route", "fromStep", "toStep", "notification", "excludedList", "notificationItem", "requestId", "state", "darkTheme", "ListItemButton", "styled", "Container", "List", "ListItem", "Images", "NotFoundContainer", "i18n", "Divider", "NoNotificationIcon", "Typography", "React", "NotificationNotFound", "React", "NotFoundContainer", "NoNotificationIcon", "Divider", "Typography", "i18n", "__name", "MAX_NOTIFICATIONS_DISPLAYED", "NotificationContent", "navigate", "useNavigate", "getUnreadNotifications", "useNotificationStore", "notifications", "blockchains", "useAppStore", "tokens", "sortedNotification", "a", "b", "handleOnClick", "__name", "requestId", "navigationRoutes", "React", "Container", "List", "notificationItem", "index", "route", "event", "fromToken", "tokenItem", "areTokensEqual", "fromBlockchain", "blockchainItem", "toToken", "toBlockchain", "Divider", "ListItem", "EventSeverity", "Typography", "i18n", "Images", "ChainToken", "ChevronRightIcon", "NotificationNotFound", "useManager", "InProgressIcon", "React", "InProgressTransactionBadge", "__name", "manager", "useManager", "getPendingSwaps", "swap", "React", "InProgressTransactionBadgeContainer", "InProgressIcon", "InProgressTransactionBadge_default", "RefreshProgressButton", "React", "useEffect", "useState", "REFRESH_INTERVAL", "MAX_ELAPSED_TIME", "MAX_PERCENTAGE", "RefreshButton", "onClick", "elapsedTime", "setElapsedTime", "useState", "isRefetched", "setIsRefetched", "handleVisibilityChange", "__name", "interval", "clearTimeout", "useEffect", "prevTime", "handleRefreshClick", "React", "HeaderButton", "ProgressIcon", "RefreshProgressButton", "EventSeverity", "Typography", "React", "UnreadNotificationsBadge", "getUnreadNotifications", "useNotificationStore", "notificationsList", "notificationsCount", "hasSeverNotification", "notificationItem", "EventSeverity", "React", "NotificationsBadgeContainer", "Typography", "__name", "HeaderButtons", "props", "onClickRefresh", "onClickHistory", "onClickSettings", "hidden", "features", "useAppStore", "isNotificationsHidden", "isFeatureHidden", "React", "Tooltip", "getContainer", "i18n", "RefreshButton", "Popover", "NotificationContent", "HeaderButton", "NotificationsIcon", "UnreadNotificationsBadge", "SettingsIcon", "TransactionIcon", "InProgressTransactionBadge_default", "__name", "onScrollContentAttachStatusToContainer", "e", "contentElement", "fromTop", "container", "getContainer", "__name", "css", "styled", "WIDGET_HEIGHT", "LayoutContainer", "Container", "Content", "Footer", "Layout", "props", "connectHeightObserver", "disconnectHeightObserver", "useIframe", "children", "header", "footer", "height", "connectedWallets", "useWalletsStore", "features", "theme", "useAppStore", "watermark", "useUiStore", "hasWatermark", "activeTheme", "useTheme", "isConnectWalletHidden", "isFeatureHidden", "isActiveTab", "tabManagerInitiated", "showActivateTabModal", "setShowActivateTabModal", "activateCurrentTab", "navigateBack", "useNavigateBack", "manager", "useManager", "hasRunningSwap", "getPendingSwaps", "swap", "onActivateTab", "__name", "tabManager", "onConnectWallet", "showBackButton", "scrollViewRef", "useRef", "containerRef", "useEffect", "isAppLoadedIntoIframe", "onScrollContentAttachStatusToContainer", "React", "Container", "WIDGET_UI_ID", "LayoutContainer", "Header", "BackButton", "WalletButton", "getContainer", "CancelButton", "Content", "ActivateTabModal", "Footer", "ActivateTabAlert", "Divider", "BottomLogo", "styled", "CONTENT_PADDING", "ScrollableArea", "styled", "PageContainer", "Divider", "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", "WatermarkedModal", "WIDGET_UI_ID", "ModalContent", "Divider", "__name", "ListContainer", "styled", "Container", "PageContainer", "TIME_TO_CLOSE_MODAL", "TIME_TO_IGNORE_MODAL", "WalletsPage", "config", "fetchMetaStatus", "useAppStore", "openModal", "setOpenModal", "useState", "selectedWalletType", "setSelectedWalletType", "modalTimerId", "isActiveTab", "useUiStore", "list", "handleClick", "error", "disconnectConnectingWallets", "useWalletList", "type", "handleCloseWalletModal", "__name", "selectedWallet", "wallet", "selectedWalletImage", "selectedWalletState", "WalletState", "React", "Layout", "i18n", "Typography", "index", "key", "Wallet", "getContainer", "WalletModal", "keyframes", "styled", "LogoContainer", "SpinAnimation", "Spinner", "WalletImageContainer", "ACCOUNT_ADDRESS_MAX_CHARACTERS", "WalletList", "props", "chain", "isSelected", "selectWallet", "limit", "onShowMore", "config", "useAppStore", "isActiveTab", "useUiStore", "connectedWallets", "useWalletsStore", "blockchains", "openWalletStateModal", "setOpenWalletStateModal", "useState", "experimentalChainWallet", "setExperimentalChainWallet", "showExperimentalChainModal", "setShowExperimentalChainModal", "addingExperimentalChainStatus", "setAddingExperimentalChainStatus", "suggestAndConnect", "useWallets", "modalTimerId", "list", "error", "handleClick", "disconnectConnectingWallets", "useWalletList", "type", "TIME_TO_IGNORE_MODAL", "TIME_TO_CLOSE_MODAL", "sortedList", "setSortedList", "numberOfSupportedWallets", "shouldShowMoreWallets", "addExperimentalChain", "__name", "wallet", "useEffect", "selectedWalletIndex", "_", "index", "sortedItem", "listItem", "modalContainer", "WIDGET_UI_ID", "timeout", "handleCloseWalletModal", "React", "address", "getAddress", "conciseAddress", "getConciseAddress", "experimentalChain", "isExperimentalChain", "experimentalChainNotAdded", "connectedWallet", "couldAddExperimentalChain", "WalletState", "connectedWalletDescription", "i18n", "onClick", "blockchainDisplayName", "getBlockchainDisplayNameFor", "WalletModal", "WatermarkedModal", "MessageBox", "Divider", "Button", "LogoContainer", "WalletImageContainer", "Image", "Spinner", "SelectableWallet", "ShowMoreWallets", "Typography", "NUMBER_OF_WALLETS_TO_DISPLAY", "ConfirmWalletsModal", "props", "open", "onClose", "onCancel", "onCheckBalance", "loading", "config", "useAppStore", "blockchains", "selectedQuote", "selectQuoteWallets", "quoteWalletsConfirmed", "setQuoteWalletConfirmed", "customDestination", "setCustomDestination", "useQuoteStore", "connectedWallets", "selectWallets", "useWalletsStore", "showMoreWalletFor", "setShowMoreWalletFor", "useState", "balanceWarnings", "setBalanceWarnings", "error", "setError", "quoteWarning", "setQuoteWarning", "showCustomDestination", "setShowCustomDestination", "requiredWallets", "getRequiredWallets", "lastStepToBlockchain", "blockchain", "isWalletRequiredFor", "__name", "swap", "getInitialSelectableWallets", "connectedWallet", "selectableWallets", "setSelectableWallets", "lastStepToBlockchainMeta", "chain", "isInsufficientBalanceModalOpen", "isSelected", "walletType", "selectableWallet", "isAddressMatched", "isValidAddress", "resetCustomDestination", "anyWalletSelected", "onChange", "wallet", "onConfirmBalance", "lastSelectedWallets", "onConfirmWallets", "selectedWallets", "result", "warnings", "getQuoteErrorMessage", "useEffect", "modalContainer", "WIDGET_UI_ID", "navigate", "useNavigate", "React", "WatermarkedModal", "ConfirmButton", "Button", "confirmSwapDisabled", "i18n", "ShowMoreHeader", "NavigateBack", "ChevronLeftIcon", "Typography", "getBlockchainShortNameFor", "MessageBox", "BalanceErrors", "WalletsContainer", "walletsListStyles", "WalletList", "Alert", "Divider", "getQuoteUpdateWarningMessage", "Wallets", "requiredWallet", "index", "key", "isLastWallet", "Title", "ListContainer", "CustomDestination", "CustomCollapsible", "checked", "CustomDestinationButton", "WalletIcon", "ExpandedIcon", "ChevronDownIcon", "prev", "StyledTextField", "e", "value", "alarmsStyles", "i18n", "Alert", "Button", "InfoIcon", "React", "Alert", "Button", "Divider", "NoRouteIcon", "RefreshIcon", "Typography", "React", "i18n", "SMALL_NO_ROUTE__ICON_SIZE", "LARGE_NO_ROUTE_ICON_SIZE", "makeInfo", "error", "disabledLiquiditySources", "toggleAllLiquiditySources", "refetchQuote", "errorMessages", "i18n", "__name", "NoRouteIconSize", "NoRouteTitleSize", "styled", "Container", "ErrorDescription", "Footer", "PrefixIcon", "NoResult", "props", "fetch", "error", "size", "disabledLiquiditySources", "useAppStore", "toggleAllLiquiditySources", "swappers", "info", "makeInfo", "React", "Container", "NoRouteIcon", "NoRouteIconSize", "Divider", "Typography", "NoRouteTitleSize", "errorMessages", "ErrorDescription", "Footer", "Alert", "Button", "PrefixIcon", "RefreshIcon", "__name", "i18n", "Button", "Divider", "MessageBox", "Typography", "WarningIcon", "React", "Typography", "React", "darkTheme", "styled", "Alerts", "Flex", "Item", "Action", "QuoteErrorsModalItem", "props", "title", "value", "valueColor", "React", "Item", "Typography", "__name", "HighValueLossWarningModal", "props", "open", "onClose", "onConfirm", "warning", "confirmationDisabled", "type", "highValueLossData", "i18n", "numberToString", "React", "WatermarkedModal", "Button", "WarningIcon", "errorMessages", "getContainer", "MessageBox", "Flex", "Divider", "Typography", "item", "index", "QuoteErrorsModalItem", "__name", "i18n", "makeAlerts", "warning", "error", "alertInfo", "i18n", "getPriceImpactLevel", "errorMessages", "__name", "i18n", "Button", "Divider", "MessageBox", "Typography", "React", "useNavigate", "SlippageWarningModal", "props", "customSlippage", "slippage", "useAppStore", "open", "onClose", "onConfirm", "warning", "confirmationDisabled", "navigate", "useNavigate", "userSlippage", "React", "WatermarkedModal", "Button", "navigationRoutes", "Typography", "i18n", "getContainer", "MessageBox", "Divider", "__name", "Button", "MessageBox", "WarningIcon", "React", "UnknownPriceWarningModal", "props", "open", "onClose", "onConfirm", "confirmationDisabled", "React", "WatermarkedModal", "Button", "WarningIcon", "errorMessages", "getContainer", "MessageBox", "__name", "QuoteWarningsAndErrors", "props", "warning", "error", "showWarningModal", "confirmationDisabled", "refetchQuote", "onOpenWarningModal", "onCloseWarningModal", "onConfirmWarningModal", "onChangeSettings", "warningModalHandlers", "showNoResultMessage", "alertInfo", "makeAlerts", "React", "NoResult", "Alerts", "Alert", "Action", "InfoIcon", "Button", "i18n", "HighValueLossWarningModal", "SlippageWarningModal", "UnknownPriceWarningModal", "__name", "BigNumber", "React", "i18n", "Alert", "Divider", "FullExpandedQuote", "InfoIcon", "QuoteTag", "StepDetails", "TokenAmount", "Tooltip", "Typography", "BigNumber", "React", "useRef", "useState", "styled", "QuoteContainer", "FooterStepAlarm", "FooterAlert", "Collapsible", "Button", "css", "darkTheme", "Image", "styled", "Typography", "EXPANDABLE_QUOTE_TRANSITION_DURATION", "QuoteContainer", "styled", "darkTheme", "stepsDetailsStyles", "css", "AllRoutesButton", "Button", "SummaryContainer", "summaryStyles", "summaryHeaderStyles", "rowStyles", "basicInfoStyles", "Trigger", "Image", "ImageContainer", "Content", "CollapsibleContent", "IconContainer", "Separator", "HorizontalSeparator", "FrameIcon", "BasicInfoOutput", "Typography", "ContainerInfoOutput", "MoreStep", "TagContainer", "Line", "i18n", "ChevronDownIcon", "CloseIcon", "Divider", "IconButton", "QuoteCost", "Tooltip", "Typography", "React", "useState", "css", "styled", "FeeSection", "Line", "ModalContainer", "ModalHeader", "trigger", "NonPayableFee", "__name", "props", "React", "FeeSection", "Typography", "numberToString", "QuoteCostDetails", "open", "setOpen", "useState", "openCollapse", "setOpenCollapse", "steps", "quote", "fee", "time", "feeWarning", "showModalFee", "swaps", "container", "getContainer", "feesGroup", "getFeesGroup", "QuoteCost", "e", "i18n", "WatermarkedModal", "ModalHeader", "IconButton", "CloseIcon", "ModalContainer", "Divider", "payableFeesKey", "feeArray", "index", "key", "usdValue", "getUsdFee", "NAME_OF_FEES", "Tooltip", "formatTooltipNumbers", "Line", "CustomCollapsible", "prev", "trigger", "ExpandedIcon", "ChevronDownIcon", "nonPayableFeesKey", "fees", "totalFeeInUsd", "getTotalFeesInUsd", "label", "i18n", "TokenAmount", "React", "css", "styled", "Container", "separatorStyles", "QuoteSummary", "props", "from", "to", "percentageChange", "warningLevel", "React", "Container", "TokenAmount", "i18n", "getContainer", "separatorStyles", "__name", "i18n", "ChevronDownIcon", "ChevronRightIcon", "Divider", "Image", "Tooltip", "Typography", "React", "useEffect", "useState", "MIN_TABLET_WIDTH", "MIN_NOTEBOOK_WIDTH", "MIN_LARGE_SCREEN_WIDTH", "MIN_EXTRA_LARGE_SCREEN_WIDTH", "useScreenDetect", "__name", "isMobile", "setIsMobile", "useState", "isTablet", "setIsTablet", "isNotebook", "setIsNotebook", "isLargeScreen", "setIsLargeScreen", "isExtraLargeScreen", "setIsExtraLargeScreen", "handleResize", "useEffect", "useScreenDetect_default", "MAX_STEPS", "MAX_BLOCKCHAINS", "ImageComponent", "__name", "props", "tooltipContainer", "getContainer", "content", "src", "className", "open", "state", "React", "Tooltip", "ImageContainer", "Image", "QuoteTrigger", "quoteRef", "selected", "setExpanded", "steps", "expanded", "type", "numberOfSteps", "blockchains", "getUniqueBlockchains", "isTablet", "isMobile", "useScreenDetect_default", "Trigger", "ref", "e", "prevState", "rowStyles", "Typography", "i18n", "Divider", "step", "index", "key", "arrow", "IconContainer", "ChevronRightIcon", "i", "MoreStep", "blockchain", "chain", "ChevronDownIcon", "Quote", "props", "quote", "input", "output", "error", "warning", "type", "selected", "tagHidden", "showModalFee", "onClickAllRoutes", "fullExpandedMode", "blockchains", "useAppStore", "tokens", "swappers", "expanded", "setExpanded", "useState", "quoteRef", "useRef", "roundedInput", "numberToString", "roundedOutput", "roundedOutputUsdValue", "priceImpact", "getPriceImpact", "percentageChange", "priceImpactWarningLevel", "getPriceImpactLevel", "steps", "__name", "swaps", "swap", "index", "stepState", "stepHasError", "stepHasWarning", "alertTitle", "i18n", "getSwapperDisplayName", "getBlockchainShortNameFor", "formatTooltipNumbers", "BigNumber", "React", "FooterStepAlarm", "Alert", "FooterAlert", "Typography", "Divider", "numberOfSteps", "container", "getContainer", "sortedQuoteTags", "sortTags", "showAllRoutesButton", "totalTime", "secondsToString", "totalArrivalTime", "totalFee", "getTotalFeeInUsd", "fee", "feeWarning", "GAS_FEE_MAX", "FullExpandedQuote", "getExpanded", "SummaryContainer", "summaryStyles", "TagContainer", "tag", "key", "QuoteTag", "Line", "summaryHeaderStyles", "QuoteCostDetails", "AllRoutesButton", "e", "basicInfoStyles", "FrameIcon", "InfoIcon", "ContainerInfoOutput", "BasicInfoOutput", "Tooltip", "TokenAmount", "QuoteSummary", "QuoteContainer", "QuoteTrigger", "Content", "HorizontalSeparator", "stepsDetailsStyles", "step", "StepDetails", "Divider", "Skeleton", "React", "darkTheme", "styled", "Container", "Chains", "Steps", "StepSeparator", "ChainToken", "Divider", "Skeleton", "React", "css", "styled", "FlexContent", "BasicSummary", "Output", "OutputTokenInfo", "QuoteSummary", "QuoteSummarySeparator", "TokenAmount", "TokenAmountLabel", "SwapPreview", "RowStyle", "QuoteSummarySkeleton", "props", "type", "tagHidden", "quotePreview", "React", "QuoteSummary", "TokenAmount", "ChainToken", "Divider", "TokenAmountLabel", "Skeleton", "showAllRoutesSkeleton", "FlexContent", "Line", "RowStyle", "BasicSummary", "Output", "OutputTokenInfo", "SwapPreview", "QuoteSummarySeparator", "__name", "ChainToken", "Divider", "NextIcon", "Skeleton", "React", "styled", "StepContent", "StepTokens", "StepTokenInfo", "StepIconContainer", "StepTitle", "StepSkeleton", "props", "separator", "React", "StepTitle", "Skeleton", "Divider", "StepContent", "StepSeparator", "StepTokens", "StepTokenInfo", "ChainToken", "StepIconContainer", "NextIcon", "__name", "QuoteSkeleton", "props", "type", "expanded", "tagHidden", "React", "Container", "QuoteSummarySkeleton", "Chains", "Skeleton", "Steps", "Divider", "StepSkeleton", "__name", "QuoteInfo", "props", "quote", "type", "loading", "error", "warning", "expanded", "tagHidden", "onClick", "showModalFee", "selected", "onClickAllRoutes", "fullExpandedMode", "inputAmount", "inputUsdValue", "toToken", "useQuoteStore", "outputAmount", "BigNumber", "outputUsdValue", "calcOutputUsdValue", "getQuoteToTokenUsdPrice", "showQuote", "React", "QuoteContainer", "QuoteSkeleton", "Quote", "__name", "calculatePendingSwap", "useEffect", "useRef", "useState", "useFetch", "request", "loading", "setLoading", "useState", "abortController", "useRef", "cancelFetch", "__name", "requestBody", "res", "error", "useFetchConfirmQuote", "fetch", "loading", "cancelFetch", "useFetch", "requestBody", "options", "httpService", "__name", "throwErrorIfResponseIsNotValid", "response", "errorMessages", "quoteError", "getQuoteError", "__name", "swaps", "hasLimitError", "swap", "recommendation", "fromAmountRangeError", "getLimitErrorMessage", "recommendedSlippages", "checkSlippageErrors", "minRequiredSlippage", "getMinRequiredSlippage", "generateWarnings", "previousQuote", "currentQuote", "params", "quoteChanged", "isQuoteChanged", "output", "quoteWarning", "generateQuoteWarnings", "isOutputAmountChangedALot", "numberToString", "getQuoteOutputAmount", "getPriceImpact", "isNumberOfSwapsChanged", "isQuoteSwappersUpdated", "isQuoteInternalCoinsUpdated", "balanceWarnings", "generateBalanceWarnings", "handleQuoteErrors", "error", "useConfirmSwap", "fromToken", "toToken", "inputAmount", "setSelectedQuote", "initialQuote", "customDestinationFromStore", "setQuoteWarningsConfirmed", "resetAlerts", "useQuoteStore", "slippage", "customSlippage", "useAppStore", "disabledLiquiditySources", "blockchains", "tokens", "userSlippage", "fetchQuote", "cancelFetch", "loading", "useFetchConfirmQuote", "useEffect", "__name", "params", "selectedWallets", "customDestination", "wallets", "acc", "item", "requestBody", "response", "result", "throwErrorIfResponseIsNotValid", "currentQuote", "swapSettings", "swap", "calculatePendingSwap", "getWalletsForNewSwap", "confirmSwapWarnings", "generateWarnings", "error", "handleQuoteErrors", "Buttons", "styled", "IconButton", "confirmBtnStyles", "css", "iconStyles", "descriptionStyles", "ConfirmSwapPage", "selectedQuote", "setInputAmount", "selectedWallets", "quoteWalletsConfirmed", "setQuoteWalletConfirmed", "customDestination", "quoteWarningsConfirmed", "useQuoteStore", "navigate", "useNavigate", "location", "useLocation", "dbErrorMessage", "setDbErrorMessage", "useState", "connectedWallets", "useWalletsStore", "showWalletsOnInit", "showWallets", "setShowWallets", "isActiveTab", "useUiStore", "disabledLiquiditySources", "useAppStore", "prevDisabledLiquiditySources", "useRef", "manager", "useManager", "confirmSwap", "fetchingConfirmationQuote", "cancelFetch", "useConfirmSwap", "confirmSwapResult", "setConfirmSwapResult", "showQuoteWarningModal", "setShowQuoteWarningModal", "onConfirmSwap", "__name", "result", "addNewSwap", "swap_url", "navigationRoutes", "e", "onConfirm", "onStartConfirmSwap", "onRefresh", "res", "error", "useEffect", "quoteChanged", "QuoteWarningType", "selectedWalletDisconnected", "selectedWallet", "connectedWallet", "quoteWalletsChanged", "requiredWallets", "getRequiredWallets", "lastStepToBlockchain", "swap", "requiredWallet", "flushSync", "useLayoutEffect", "quoteWarning", "quoteError", "alerts", "React", "Alert", "getQuoteUpdateWarningMessage", "settings_url", "QuoteWarningsAndErrors", "Layout", "i18n", "wallets_url", "Tooltip", "getContainer", "HeaderButton", "SettingsIcon", "Button", "WalletIcon", "ConfirmWalletsModal", "PageContainer", "Typography", "RefreshButton", "Divider", "joinList", "alert", "index", "QuoteInfo", "i18n", "useManager", "Divider", "NotFound", "styled", "React", "useState", "useNavigate", "i18n", "Divider", "GroupedVirtualizedList", "Skeleton", "SwapListItem", "Typography", "React", "useCallback", "useEffect", "useRef", "useState", "calculateGroupsSoFar", "totalGroups", "count", "groups", "index", "group", "__name", "css", "darkTheme", "styled", "groupStyles", "SwapItemContainer", "Group", "Time", "SwapList", "NotFoundContainer", "ITEMS_PER_PAGE", "HistoryGroupedList", "props", "list", "onSwapClick", "groupBy", "isLoading", "currentGroupCounts", "setCurrentGroupCounts", "useState", "loadedItems", "useRef", "swaps", "groupCounts", "groups", "calculateGroups", "useCallback", "calculateGroupsSoFar", "loadMore", "remainedItems", "useEffect", "React", "group", "index", "Group", "Time", "Skeleton", "Divider", "SwapList", "_", "SwapListItem", "GroupedVirtualizedList", "Typography", "groupStyles", "groupIndex", "swap", "firstStep", "lastStep", "SwapItemContainer", "getContainer", "i18n", "numberToString", "formatTooltipNumbers", "__name", "CloseIcon", "IconButton", "SearchIcon", "TextField", "React", "styled", "IconWrapper", "SearchInput", "props", "variant", "fullWidth", "color", "size", "onChange", "value", "setValue", "inputAttributes", "React", "TextField", "IconWrapper", "SearchIcon", "IconButton", "CloseIcon", "__name", "i18n", "dayjs", "groupSwapsByDate", "__name", "swaps", "output", "i18n", "addYearsToOutput", "key", "swap", "now", "dayjs", "time", "swapDate", "year", "groupedSwaps", "item", "items", "group", "groupCounts", "groups", "HistoryGroupedListContainer", "styled", "isStepContainsText", "__name", "steps", "value", "step", "containsText", "HistoryPage", "navigate", "useNavigate", "manager", "state", "useManager", "list", "getPendingSwaps", "swap", "searchedFor", "setSearchedFor", "useState", "loading", "searchHandler", "event", "filteredList", "isEmpty", "React", "Layout", "i18n", "PageContainer", "SearchInput", "Divider", "NotFoundContainer", "NotFound", "HistoryGroupedList", "groupSwapsByDate", "i18n", "Button", "Divider", "styled", "WarningIcon", "React", "useEffect", "useState", "useNavigate", "i18n", "Header", "React", "useEffect", "useState", "i18n", "Divider", "FullExpandedQuote", "Typography", "React", "styled", "ErrorsContainer", "StrategyContent", "SelectContainer", "Select", "React", "SelectStrategy", "props", "updateQuotePartialState", "sortStrategy", "useQuoteStore", "React", "SelectContainer", "Select", "ROUTE_STRATEGY", "item", "__name", "ITEM_SKELETON_COUNT", "Quotes", "props", "loading", "onClickOnQuote", "fetch", "showModalFee", "hasSort", "fullExpandedMode", "selectedQuote", "quotes", "updateQuotePartialState", "fromToken", "toToken", "sortStrategy", "error", "useQuoteStore", "slippage", "customSlippage", "useAppStore", "tokens", "hasQuotes", "userSlippage", "getQuoteWarning", "__name", "quote", "mergedQuote", "generateQuoteWarnings", "showNoResultMessage", "sortQuotes", "sortQuotesBy", "React", "_", "index", "FullExpandedQuote", "QuoteSkeleton", "Divider", "StrategyContent", "Typography", "i18n", "SelectStrategy", "getContainer", "quoteWarning", "quoteError", "getQuoteError", "lastIndex", "QuoteInfo", "ErrorsContainer", "NoResult", "darkTheme", "styled", "Container", "Content", "TIME_TO_CLOSE_OPEN_EXPANDED", "ExpandedQuotes", "props", "fetch", "loading", "onClickOnQuote", "onClickRefresh", "isVisible", "isDelayedVisible", "setIsDelayedVisible", "useState", "containerClass", "config", "useAppStore", "fullExpandedMode", "useEffect", "timeout", "React", "Container", "LayoutContainer", "WIDGET_UI_ID", "Header", "i18n", "SelectStrategy", "getExpanded", "HeaderButtons", "Content", "Quotes", "__name", "i18n", "SwapInput", "React", "ReverseIcon", "styled", "React", "SwitchButtonContainer", "styled", "StyledButton", "SwitchFromAndToButton", "switchFromAndTo", "useQuoteStore", "React", "ReverseIcon", "__name", "styled", "Container", "FromContainer", "Inputs", "props", "fetchingQuote", "fetchMetaStatus", "onClickToken", "fromToken", "fromBlockchain", "toToken", "toBlockchain", "setInputAmount", "inputAmount", "inputUsdValue", "outputAmount", "outputUsdValue", "selectedQuote", "useQuoteStore", "connectedWallets", "getBalanceFor", "useWalletsStore", "fromTokenBalance", "fromTokenFormattedBalance", "formatBalance", "tokenBalanceReal", "numberToString", "fetchingBalance", "isFetchingBalance", "priceImpactInputCanNotBeComputed", "canComputePriceImpact", "priceImpactOutputCanNotBeComputed", "percentageChange", "getPriceImpact", "React", "Container", "FromContainer", "SwapInput", "i18n", "formatTooltipNumbers", "errorMessages", "getContainer", "SwitchFromAndToButton", "getPriceImpactLevel", "__name", "useCallback", "useEffect", "useState", "useFetchAllQuotes", "fetch", "loading", "cancelFetch", "useFetch", "requestBody", "options", "httpService", "__name", "DEBOUNCE_DELAY", "useSwapInput", "refetchQuote", "fetchQuote", "cancelFetch", "useFetchAllQuotes", "configExcludeLiquiditySources", "features", "enableCentralizedSwappers", "useAppStore", "connectedWallets", "useWalletsStore", "tokens", "fromToken", "toToken", "inputAmount", "inputUsdValue", "selectedQuote", "sortStrategy", "resetQuote", "error", "warning", "setSelectedQuote", "updateQuotePartialState", "useQuoteStore", "slippage", "customSlippage", "affiliatePercent", "affiliateRef", "affiliateWallets", "fetchStatus", "liquiditySources", "disabledLiquiditySources", "excludeLiquiditySources", "loading", "setLoading", "useState", "userSlippage", "shouldSkipRequest", "areTokensEqual", "isPositiveNumber", "resetState", "__name", "fetch", "params", "requestBody", "createQuoteRequestBody", "isFeatureEnabled", "res", "sortQuotes", "sortQuotesBy", "quote", "getDefaultQuote", "throwErrorIfResponseIsNotValid", "quoteWarning", "generateQuoteWarnings", "quoteError", "handleQuoteErrors", "debouncedFetch", "useCallback", "debounce", "DEBOUNCE_DELAY", "useEffect", "MainContainer", "styled", "TIME_TO_NAVIGATE_ANOTHER_PAGE", "Home", "navigate", "useNavigate", "fromToken", "toToken", "inputAmount", "selectedQuote", "refetchQuote", "quoteError", "quoteWarning", "quotes", "setSelectedQuote", "resetQuoteWallets", "setQuoteWarningsConfirmed", "updateQuotePartialState", "useQuoteStore", "isVisibleExpanded", "setIsVisibleExpanded", "useState", "isLargeScreen", "isExtraLargeScreen", "useScreenDetect_default", "fetchQuote", "loading", "useSwapInput", "config", "fetchMetaStatus", "useAppStore", "connectedWallets", "useWalletsStore", "isActiveTab", "useUiStore", "showQuoteWarningModal", "setShowQuoteWarningModal", "swapButtonState", "getSwapButtonState", "isExpandable", "isVariantExpandable", "hasInputs", "isTokensIdentical", "fetchingQuote", "showMessages", "useEffect", "onClickRefresh", "onHandleNavigation", "__name", "route", "onClickOnQuote", "quote", "React", "Layout", "Button", "WarningIcon", "navigationRoutes", "i18n", "HeaderButtons", "PageContainer", "Inputs", "mode", "Divider", "QuoteInfo", "QuoteWarningsAndErrors", "ExpandedQuotes", "i18n", "Alert", "Divider", "List", "ListItemButton", "Radio", "RadioRoot", "Typography", "React", "useLanguage", "setLanguage", "language", "config", "useAppStore", "languages", "LANGUAGES", "defaultLanguage", "DEFAULT_LANGUAGE", "__name", "LanguagePage", "activeLanguage", "changeLanguage", "languages", "useLanguage", "languageList", "languageItem", "local", "label", "SVGFlag", "React", "Typography", "Radio", "Layout", "i18n", "PageContainer", "Alert", "Divider", "RadioRoot", "List", "ListItemButton", "__name", "i18n", "Button", "Checkbox", "Image", "ListItemButton", "NotFound", "Typography", "React", "useState", "Checkbox", "Skeleton", "React", "styled", "LiquiditySourceList", "LiquiditySourceSuffix", "NotFoundContainer", "ListItem", "styled", "CustomListItem", "ITEM_SKELETON_COUNT", "LoadingLiquiditySourceList", "React", "LiquiditySourceList", "_", "index", "CustomListItem", "Skeleton", "Checkbox", "__name", "LiquiditySourcePage", "sourceType", "fetchStatus", "useAppStore", "swappers", "disabledLiquiditySources", "searchedFor", "setSearchedFor", "useState", "toggleLiquiditySource", "campaignMode", "supportedUniqueSwappersGroups", "getUniqueSwappersGroups", "types", "i18n", "validTypes", "liquiditySources", "uniqueItem", "hasSelectAll", "sourceItem", "toggleAllSources", "__name", "list", "selected", "groupTitle", "logo", "React", "Image", "Checkbox", "Typography", "searchHandler", "event", "value", "filteredList", "containsText", "Layout", "LiquiditySourceSuffix", "Button", "PageContainer", "SearchInput", "LoadingLiquiditySourceList", "NotFoundContainer", "NotFound", "LiquiditySourceList", "otherProps", "ListItemButton", "i18n", "React", "useNavigate", "RoutesPage", "navigate", "useNavigate", "navigateBack", "useNavigateBack", "selectedQuote", "refetchQuote", "setSelectedQuote", "updateQuotePartialState", "quoteError", "useQuoteStore", "fetchQuote", "fetchingQuote", "useSwapInput", "onClickOnQuote", "__name", "quote", "settings_url", "navigationRoutes", "wallets_url", "React", "Layout", "i18n", "HeaderButtons", "PageContainer", "Quotes", "i18n", "Divider", "getCountCategories", "SelectableCategoryList", "React", "useState", "i18n", "Divider", "Image", "ListItemButton", "NotFound", "Typography", "React", "useEffect", "useState", "BlockchainCategories", "TransactionType", "filterByType", "__name", "blockchain", "type", "BlockchainCategories", "TransactionType", "filterBlockchains", "list", "searchedFor", "blockchainType", "containsText", "ImageContainer", "styled", "Container", "styled", "List", "ScrollableArea", "ImageContainer", "ListItem", "Skeleton", "React", "ITEM_SKELETON_COUNT", "LoadingBlockchainList", "React", "List", "e", "ListItem", "Skeleton", "__name", "BlockchainList", "props", "list", "searchedFor", "onChange", "blockchainCategory", "blockchains", "setBlockchains", "useState", "fetchStatus", "useAppStore", "useEffect", "filterBlockchains", "renderList", "__name", "React", "Divider", "NotFound", "i18n", "List", "item", "ListItemButton", "Image", "Typography", "Container", "LoadingBlockchainList", "SelectBlockchainPage", "props", "type", "navigateBack", "useNavigateBack", "searchedFor", "setSearchedFor", "useState", "blockchainCategory", "setBlockchainCategory", "setToBlockchain", "useQuoteStore", "setFromBlockchain", "fetchStatus", "useAppStore", "blockchains", "showCategory", "getCountCategories", "React", "Layout", "i18n", "PageContainer", "SelectableCategoryList", "Divider", "SearchInput", "event", "BlockchainList", "blockchain", "__name", "i18n", "Divider", "React", "useState", "useNavigate", "i18n", "BlockchainsChip", "Divider", "Image", "Skeleton", "Tooltip", "Typography", "React", "useEffect", "MOST_USED_BLOCKCHAINS", "prepare", "blockchains", "preferredBlockchains", "options", "list", "more", "sortByMostUsedBlockchains", "start", "preferredBlockchainsWithoutMainList", "howManyItemsShouldBeCheckedFromMainList", "i", "blockchain", "preferredBlockchain", "generateSortByPreferredBlockchainsFor", "__name", "a", "b", "mostUsed", "MOST_USED_BLOCKCHAINS", "aIndexInMostUsed", "token", "bIndexInMostUsed", "aIsMostUsed", "bIsMostUsed", "aIndexInPreferred", "bIndexInPreferred", "aIsPreferred", "bIsPreferred", "isInVisibleList", "prepareOutput", "item", "usePrepareBlockchainList", "blockchains", "options", "preferredBlockchains", "addPreferredBlockchain", "useAppStore", "useEffect", "output", "prepare", "isInVisibleList", "__name", "styled", "Blockchains", "NUMBER_OF_LOADING", "BlockchainsSection", "props", "blockchains", "type", "blockchain", "onChange", "onMoreClick", "blockchainsList", "usePrepareBlockchainList", "fetchStatus", "useAppStore", "resetToBlockchain", "useQuoteStore", "resetFromBlockchain", "hasMoreItemsInList", "onlyOneItemInList", "showMoreButton", "React", "Divider", "Typography", "i18n", "Blockchains", "e", "Skeleton", "BlockchainsChip", "item", "Tooltip", "getContainer", "Image", "__name", "i18n", "darkTheme", "Divider", "ExternalLinkIcon", "Image", "ListItemButton", "NotFound", "PinIcon", "Skeleton", "Typography", "VirtualizedList", "React", "useEffect", "useState", "Divider", "ListItem", "Skeleton", "React", "css", "darkTheme", "ImageContainer", "styled", "Typography", "tokenNameStyles", "descriptionStyles", "tokenTitleStyles", "tokenAddressStyles", "tokenWithoutNameStyles", "usdValueStyles", "Container", "Title", "List", "Tag", "TagTitle", "BalanceContainer", "End", "Description", "ImageSection", "Pin", "TokenBalance", "LoadingTokenList", "props", "React", "List", "ListItem", "Skeleton", "End", "Divider", "__name", "PAGE_SIZE", "renderDesc", "__name", "props", "address", "name", "url", "token", "customCssForTag", "customCssForTagTitle", "length", "React", "descriptionStyles", "tokenNameStyles", "Title", "tokenTitleStyles", "Typography", "Divider", "Tag", "TagTitle", "tokenAddressStyles", "tokenWithoutNameStyles", "e", "ExternalLinkIcon", "TokenList", "list", "searchedFor", "onChange", "selectedBlockchain", "tokens", "setTokens", "useState", "fetchStatus", "useAppStore", "blockchains", "hasNextPage", "setHasNextPage", "getBalanceFor", "loadingWallet", "useWalletsStore", "isTokenPinned", "loadNextPage", "useEffect", "renderList", "NotFound", "i18n", "VirtualizedList", "index", "tokenBalance", "formatBalance", "blockchain", "lightShade", "generateShade", "isBright", "darkShade", "darkTheme", "ListItemButton", "ImageSection", "Image", "Pin", "PinIcon", "End", "Skeleton", "BalanceContainer", "TokenBalance", "usdValueStyles", "Container", "LoadingTokenList", "List", "SelectSwapItemsPage", "props", "type", "navigate", "useNavigate", "navigateBack", "useNavigateBack", "fromBlockchain", "toBlockchain", "setFromToken", "setToToken", "setFromBlockchain", "setToBlockchain", "useQuoteStore", "getBalanceFor", "useWalletsStore", "searchedFor", "setSearchedFor", "useState", "selectedBlockchainName", "blockchains", "useAppStore", "tokens", "updateBlockchain", "__name", "blockchain", "updateToken", "token", "types", "i18n", "React", "Layout", "PageContainer", "BlockchainsSection", "navigationRoutes", "Divider", "SearchInput", "event", "TokenList", "tokenBlockchain", "chain", "i18n", "Alert", "Button", "styled", "React", "useInRouterContext", "useSearchParams", "i18n", "Divider", "InfoIcon", "TextField", "Tooltip", "Typography", "React", "Chip", "styled", "TextField", "BaseContainer", "SlippageChipsContainer", "Head", "SlippageTooltipContainer", "SlippageChip", "i18n", "Typography", "React", "SlippageTooltipContent", "React", "SlippageTooltipContainer", "Typography", "i18n", "__name", "Slippage", "slippage", "setSlippage", "customSlippage", "setCustomSlippage", "useAppStore", "React", "BaseContainer", "Head", "Typography", "i18n", "Divider", "Tooltip", "getContainer", "SlippageTooltipContent", "InfoIcon", "SlippageChipsContainer", "SLIPPAGES", "slippageItem", "index", "key", "SlippageChip", "TextField", "event", "value", "parsedValue", "MIN_SLIPPGAE", "MAX_SLIPPAGE", "__name", "i18n", "AutoThemeIcon", "BridgeIcon", "ChevronRightIcon", "DarkModeIcon", "Divider", "DoneIcon", "ExchangeIcon", "InfoIcon", "LanguageIcon", "LightModeIcon", "List", "ListItem", "ListItemButton", "Skeleton", "styled", "Switch", "Tabs", "Tooltip", "Typography", "React", "useNavigate", "ThemeSection", "styled", "themesList", "React", "LightModeIcon", "Typography", "i18n", "DarkModeIcon", "AutoThemeIcon", "getThemeIcon", "__name", "theme", "iconProps", "SettingsLists", "navigate", "useNavigate", "themeConfig", "useAppStore", "setTheme", "fetchStatus", "swappers", "disabledLiquiditySources", "features", "isThemeHidden", "isFeatureHidden", "isLiquidityHidden", "isLanguageHidden", "infiniteApprove", "toggleInfiniteApprove", "supportedUniqueSwappersGroups", "getUniqueSwappersGroups", "bridgeSources", "uniqueItem", "totalBridgeSources", "totalSelectedBridgeSources", "exchangeSources", "totalExchangeSources", "totalSelectedExchangeSources", "handleEndItem", "totalSelected", "total", "Skeleton", "bridgeItem", "Divider", "ChevronRightIcon", "navigationRoutes", "BridgeIcon", "exchangeItem", "ExchangeIcon", "languageItem", "LanguageIcon", "infiniteApprovalItem", "Tooltip", "getContainer", "SlippageTooltipContainer", "InfoIcon", "DoneIcon", "Switch", "themeItem", "ListItem", "Tabs", "item", "settingItems", "List", "ListItemButton", "ResetAction", "styled", "SettingsPage", "isInCampaignMode", "updateCampaignMode", "useAppStore", "campaignMode", "setSearchParams", "useSearchParams", "isRouterInContext", "useInRouterContext", "onClick", "__name", "prev", "React", "Layout", "i18n", "PageContainer", "Alert", "Button", "Slippage", "SettingsLists", "i18n", "cancelSwap", "useManager", "Alert", "React", "useParams", "i18n", "getCurrentBlockchainOfOrNull", "getCurrentStep", "getRelatedWalletOrNull", "Button", "CopyIcon", "Divider", "IconButton", "LinkIcon", "QuoteCost", "StepDetails", "Typography", "useCopyToClipboard", "useWallets", "BigNumber", "PendingSwapNetworkStatus", "React", "useEffect", "useRef", "useState", "useNavigate", "i18n", "daysOfWeek", "i18n", "timeSince", "millisecond", "date", "day", "month", "year", "__name", "getSwapDate", "pendingSwap", "PendingSwapNetworkStatus", "React", "i18n", "Button", "Divider", "MessageBox", "React", "CancelContent", "__name", "onCancel", "onClose", "React", "Divider", "MessageBox", "i18n", "Button", "i18n", "Button", "Divider", "MessageBox", "Typography", "React", "DeleteContent", "__name", "onDelete", "onClose", "React", "Divider", "MessageBox", "i18n", "Button", "Typography", "i18n", "PendingSwapNetworkStatus", "modalNetworkValues", "MessageBox", "Wallet", "useWallets", "React", "styled", "WalletContainer", "WalletStateContent", "__name", "props", "type", "title", "currentStepWallet", "message", "showWalletButton", "walletButtonDisabled", "connect", "getWalletInfo", "state", "useWallets", "walletType", "walletState", "mapStatusToWalletState", "walletInfo", "React", "MessageBox", "WalletContainer", "Wallet", "getContainer", "SwapDetailsModal", "props", "state", "onClose", "onDelete", "onCancel", "currentStepWallet", "message", "walletButtonDisabled", "showWalletStateContent", "PendingSwapNetworkStatus", "React", "WatermarkedModal", "WIDGET_UI_ID", "WalletStateContent", "modalNetworkValues", "DeleteContent", "CancelContent", "__name", "i18n", "Button", "Divider", "MessageBox", "TokenAmount", "Typography", "React", "useNavigate", "SwapDetailsCompleteModal", "props", "open", "onClose", "status", "priceValue", "usdValue", "realUsdValue", "realValue", "token", "chain", "percentageChange", "description", "diagnosisUrl", "navigate", "useNavigate", "React", "WatermarkedModal", "WIDGET_UI_ID", "MessageBox", "i18n", "TokenAmount", "getContainer", "Divider", "Typography", "Button", "__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", "Alert", "Button", "PendingSwapNetworkStatus", "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", "waitingProgress", "React", "Alerts", "explorerUrl", "index", "urls", "key", "lastUrl", "loading", "error", "Fragment", "Alert", "i18n", "IconButton", "LinkIcon", "WarningAlert", "FailedAlert", "__name", "RESET_INTERVAL", "getSteps", "__name", "swap", "blockchains", "swappers", "args", "hasAlreadyProceededToSign", "step", "index", "amountToConvert", "getBlockchainShortNameFor", "numberToString", "getSwapperDisplayName", "internalSwap", "React", "SwapDetailsAlerts", "getStepState", "isNetworkStatusInWarningState", "css", "darkTheme", "styled", "Container", "styled", "HeaderDetails", "StepsList", "ScrollableArea", "Alerts", "PlaceholderContainer", "LoaderContainer", "rowStyles", "css", "darkTheme", "datePlaceholderStyles", "requestIdStyles", "outputStyles", "titleStepsStyles", "StyledLink", "SwapDetails", "props", "swap", "requestId", "onDelete", "onCancelProps", "canSwitchNetworkTo", "connect", "getWalletInfo", "useWallets", "blockchains", "useAppStore", "swappers", "tokens", "retry", "useQuoteStore", "isActiveTab", "useUiStore", "navigate", "useNavigate", "_", "handleCopy", "useCopyToClipboard", "RESET_INTERVAL", "listRef", "useRef", "modalState", "setModalState", "useState", "showCompletedModal", "setShowCompletedModal", "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", "diagnosisUrl", "step", "outputUsdValue", "numberToString", "inputUsdValue", "realOutputUsdValue", "formatTooltipNumbers", "BigNumber", "realInputUsdValue", "percentageChange", "getPriceImpact", "completeModalDesc", "i18n", "getConciseAddress", "React", "Layout", "SuffixContainer", "Button", "Typography", "PageContainer", "HeaderDetails", "rowStyles", "requestIdStyles", "IconButton", "CopyIcon", "StyledLink", "SCANNER_BASE_URL", "LinkIcon", "outputStyles", "QuoteCost", "secondsToString", "totalArrivalTime", "QuoteSummary", "getPriceImpactLevel", "titleStepsStyles", "Divider", "StepsList", "index", "key", "state", "getStepState", "isFocused", "StepDetails", "getContainer", "SwapDetailsModal", "SwapDetailsCompleteModal", "i18n", "Divider", "NotFound", "Skeleton", "Typography", "React", "i18n", "Divider", "Skeleton", "Typography", "React", "css", "styled", "Container", "StepContainer", "StepSeparator", "quoteSummaryItemStyles", "tokenAmountStyles", "costStyles", "quoteSummaryStyles", "quoteSummarySeparatorStyles", "swapsStepsStyles", "stepTitleStyles", "stepTokensStyles", "stepInfoStyles", "stepIconStyles", "extraInfoStyles", "LoadingSwapDetails", "React", "Container", "QuoteSummarySkeleton", "Typography", "i18n", "StepContainer", "StepSkeleton", "extraInfoStyles", "Divider", "Skeleton", "StepSeparator", "__name", "SwapDetailsPlaceholder", "props", "requestId", "showSkeleton", "React", "Layout", "i18n", "SuffixContainer", "Container", "HeaderDetails", "rowStyles", "Typography", "requestIdStyles", "Skeleton", "Divider", "datePlaceholderStyles", "LoadingSwapDetails", "PlaceholderContainer", "NotFound", "__name", "SwapDetailsPage", "manager", "state", "useManager", "loading", "pendingSwaps", "getPendingSwaps", "requestId", "useParams", "navigateBack", "useNavigateBack", "fetchMetaStatus", "useAppStore", "React", "Alert", "i18n", "showSkeleton", "selectedSwap", "swap", "onCancel", "__name", "cancelSwap", "onDelete", "e", "SwapDetailsPlaceholder", "SwapDetails", "AppRoutes", "useSyncStoresWithConfig", "useSyncUrlAndStore", "useRoutes", "navigationRoutes", "React", "Home", "RoutesPage", "SelectSwapItemsPage", "SelectBlockchainPage", "SettingsPage", "LanguagePage", "LiquiditySourcePage", "HistoryPage", "SwapDetailsPage", "WalletsPage", "ConfirmSwapPage", "__name", "isApprovalTX", "MainEvents", "RouteEventType", "StepEventType", "StepExecutionEventStatus", "useEvents", "useEffect", "WidgetEvents", "tokens", "useAppStore", "connectedWallets", "useWalletsStore", "getWalletsDetails", "setNotification", "useNotificationStore", "widgetEvents", "useEvents", "useEffect", "MainEvents", "widgetEvent", "event", "step", "route", "StepEventType", "StepExecutionEventStatus", "isApprovalTX", "fromAccount", "account", "toAccount", "wallet", "RouteEventType", "__name", "globalCss", "globalFont", "__name", "globalCss", "useFetchApiConfig", "setWatermark", "useUiStore", "__name", "response", "getConfig", "data", "styled", "MainContainer", "Main", "globalFont", "config", "useAppStore", "activeTheme", "useTheme", "activeLanguage", "useLanguage", "lastConnectedWalletWithNetwork", "setLastConnectedWalletWithNetwork", "useState", "disconnectedWallet", "setDisconnectedWallet", "widgetContext", "useContext", "WidgetContext", "fetchApiConfig", "useFetchApiConfig", "useEffect", "useNotificationStore", "React", "I18nManager", "MainContainer", "WidgetEvents", "AppRouter", "AppRoutes", "__name", "React", "useMemo", "checkWaitingForNetworkChange", "makeQueueDefinition", "ManagerProvider", "useWallets", "convertEvmBlockchainMetaToEvmChainInfo", "isEvmBlockchain", "React", "useMemo", "QueueManager", "props", "providers", "getSigners", "state", "connect", "canSwitchNetworkTo", "getWalletInfo", "useWallets", "swapQueueDef", "useMemo", "makeQueueDefinition", "getConfig", "blockchains", "useAppStore", "wallets", "useWalletsStore", "wallet", "switchNetwork", "__name", "network", "isMobileWallet", "walletType", "allBlockchains", "blockchain", "blockchainsObj", "evmBasedChains", "isEvmBlockchain", "getSupportedChainNames", "type", "supportedChains", "walletAndSupportedChainsNames", "allProviders", "context", "convertEvmBlockchainMetaToEvmChainInfo", "isActiveTab", "useUiStore", "React", "ManagerProvider", "manager", "checkWaitingForNetworkChange", "QueueManager_default", "useManager", "React", "createContext", "useContext", "cancelSwap", "getCurrentBlockchainOfOrNull", "getCurrentStep", "getRelatedWalletOrNull", "WidgetHistory", "__name", "manager", "actions", "getPendingSwaps", "swap", "meta", "id", "queue", "cancelSwap", "currentStep", "getCurrentStep", "getRelatedWalletOrNull", "getCurrentBlockchainOfOrNull", "WidgetInfoContext", "createContext", "WidgetInfo", "props", "manager", "useManager", "isActiveTab", "useUiStore", "retrySwap", "useQuoteStore", "history", "WidgetHistory", "details", "useWalletsStore", "isLoading", "totalBalance", "calculateWalletUsdValue", "refetch", "blockchains", "useAppStore", "tokens", "swappers", "loadingStatus", "resetLanguage", "useLanguage", "notifications", "useNotificationStore", "value", "tabManager", "React", "__name", "useWidget", "context", "useContext", "WidgetProvider", "props", "onUpdateState", "config", "useMemo", "initConfig", "RANGO_PUBLIC_API_KEY", "DEFAULT_BASE_URL", "React", "WidgetWallets", "QueueManager_default", "WidgetInfo", "__name", "Widget", "props", "useEffect", "tabManager", "React", "Main", "WidgetProvider", "DEFAULT_CONFIG", "__name"]
|
|
7
7
|
}
|