@rango-dev/widget-embedded 0.12.1-next.1 → 0.12.1-next.2

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/index.js.map CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../src/Widget.tsx", "../src/components/AppRouter.tsx", "../src/components/UpdateUrl.tsx", "../src/store/bestRoute.ts", "../src/constants/numbers.ts", "../src/utils/routing.ts", "../src/utils/common.ts", "../src/utils/numbers.ts", "../src/store/selectors.ts", "../src/services/httpService.ts", "../src/utils/configs.ts", "../src/store/settings.ts", "../src/constants/swapSettings.ts", "../src/store/meta.ts", "../src/utils/swap.ts", "../src/utils/wallets.ts", "../src/store/wallets.ts", "../src/constants/navigationRoutes.ts", "../src/store/ui.ts", "../src/components/Layout.tsx", "../src/components/AppRoutes.tsx", "../src/pages/ConfirmSwapPage.tsx", "../src/hooks/useNavigateBack.ts", "../src/hooks/useConfirmSwap.ts", "../src/components/ConfirmSwapErrors.tsx", "../src/components/ConfirmSwapWarnings.tsx", "../src/pages/HistoryPage.tsx", "../src/utils/queue.ts", "../src/utils/date.ts", "../src/pages/Home.tsx", "../src/components/SwitchFromAndTo.tsx", "../src/constants/errors.ts", "../src/pages/LiquiditySourcesPage.tsx", "../src/pages/SelectChainPage.tsx", "../src/pages/SelectTokenPage.tsx", "../src/pages/SettingsPage.tsx", "../src/pages/WalletsPage.tsx", "../src/utils/providers.ts", "../src/pages/SwapDetailsPage.tsx", "../src/utils/time.ts", "../src/globalStyles.ts", "../src/hooks/useTheme.ts", "../src/hooks/usePrevious.ts", "../src/QueueManager.tsx", "../src/Wallets.tsx", "../src/hooks/useWalletProviders.ts", "../src/components/WidgetEvents.tsx", "../src/index.ts"],
4
- "sourcesContent": ["import { SwapContainer, styled, I18nManager } from '@rango-dev/ui';\nimport React, {\n PropsWithChildren,\n useContext,\n useEffect,\n useMemo,\n useState,\n} from 'react';\nimport { AppRouter } from './components/AppRouter';\nimport { WalletType } from '@rango-dev/wallets-shared';\nimport { Layout } from './components/Layout';\nimport { globalFont } from './globalStyles';\nimport { useTheme } from './hooks/useTheme';\nimport { WidgetConfig } from './types';\nimport QueueManager from './QueueManager';\nimport { useUiStore } from './store/ui';\nimport { navigationRoutes } from './constants/navigationRoutes';\nimport { initConfig } from './utils/configs';\nimport { WidgetContext, WidgetWallets } from './Wallets';\nimport { WidgetEvents } from './components/WidgetEvents';\nimport { useSettingsStore } from './store/settings';\n\nconst MainContainer = styled('div', {\n width: '100%',\n display: 'flex',\n justifyContent: 'center',\n alignItems: 'center',\n});\n\nexport type WidgetProps = {\n config?: WidgetConfig;\n};\n\nexport function Main(props: PropsWithChildren<WidgetProps>) {\n const { config } = props;\n globalFont(config?.theme?.fontFamily || 'Roboto');\n\n const { activeTheme } = useTheme(config?.theme || {});\n const [lastConnectedWalletWithNetwork, setLastConnectedWalletWithNetwork] =\n useState<string>('');\n const [disconnectedWallet, setDisconnectedWallet] = useState<WalletType>();\n const currentPage = useUiStore.use.currentPage();\n const widgetContext = useContext(WidgetContext);\n\n useMemo(() => {\n if (config?.apiKey) {\n initConfig({\n API_KEY: config?.apiKey,\n });\n }\n }, [config]);\n\n useEffect(() => {\n useSettingsStore.persist.rehydrate();\n widgetContext.onConnectWallet(setLastConnectedWalletWithNetwork);\n }, []);\n\n return (\n <I18nManager language={config?.language}>\n <MainContainer id=\"swap-container\" className={activeTheme}>\n <QueueManager>\n <WidgetEvents />\n <SwapContainer fixedHeight={currentPage !== navigationRoutes.home}>\n <AppRouter\n lastConnectedWallet={lastConnectedWalletWithNetwork}\n disconnectedWallet={disconnectedWallet}\n clearDisconnectedWallet={() => {\n setDisconnectedWallet(undefined);\n }}>\n <Layout config={config} />\n </AppRouter>\n </SwapContainer>\n </QueueManager>\n </MainContainer>\n </I18nManager>\n );\n}\n\nexport function Widget(props: PropsWithChildren<WidgetProps>) {\n if (!props.config?.externalWallets) {\n return (\n <WidgetWallets\n providers={props.config?.wallets}\n options={{\n walletConnectProjectId: props.config?.walletConnectProjectId,\n }}>\n <Main {...props} />\n </WidgetWallets>\n );\n }\n return <Main {...props} />;\n}\n", "import React, { Fragment, PropsWithChildren } from 'react';\nimport { MemoryRouter, useInRouterContext } from 'react-router';\nimport { useQueueManager } from '@rango-dev/queue-manager-rango-preset';\nimport { WalletType } from '@rango-dev/wallets-shared';\nimport { UpdateUrl } from './UpdateUrl';\nimport { useMetaStore } from '../store/meta';\nimport { useWallets } from '@rango-dev/wallets-react';\nimport { isEvmBlockchain } from 'rango-types';\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 } = useMetaStore.use.meta();\n const { canSwitchNetworkTo } = useWallets();\n\n const evmChains = blockchains.filter(isEvmBlockchain);\n\n useQueueManager({\n lastConnectedWallet: props.lastConnectedWallet,\n clearDisconnectedWallet: props.clearDisconnectedWallet,\n disconnectedWallet: props.disconnectedWallet,\n evmChains,\n canSwitchNetworkTo,\n });\n\n return (\n <>\n <Router>{children}</Router>\n {isRouterInContext && <UpdateUrl />}\n </>\n );\n}\n", "import { useEffect, useRef } from 'react';\nimport {\n createSearchParams,\n useLocation,\n useSearchParams,\n} from 'react-router-dom';\nimport { useBestRouteStore } from '../store/bestRoute';\nimport { useMetaStore } from '../store/meta';\nimport { SearchParams } from '../constants/searchParams';\nimport { navigationRoutes } from '../constants/navigationRoutes';\nimport { useUiStore } from '../store/ui';\nimport { searchParamsToToken } from '../utils/routing';\n\nexport function UpdateUrl() {\n const firstRender = useRef(true);\n const [searchParams, setSearchParams] = useSearchParams();\n const location = useLocation();\n const firstRenderSearchParams = useRef(location.search);\n const searchParamsRef = useRef<Record<string, string>>({});\n const fromChain = useBestRouteStore.use.fromChain();\n const toChain = useBestRouteStore.use.toChain();\n const fromToken = useBestRouteStore.use.fromToken();\n const toToken = useBestRouteStore.use.toToken();\n const setFromChain = useBestRouteStore.use.setFromChain();\n const setFromToken = useBestRouteStore.use.setFromToken();\n const setToChain = useBestRouteStore.use.setToChain();\n const setToToken = useBestRouteStore.use.setToToken();\n const inputAmount = useBestRouteStore.use.inputAmount();\n const setInputAmount = useBestRouteStore.use.setInputAmount();\n const loadingStatus = useMetaStore.use.loadingStatus();\n const { blockchains, tokens } = useMetaStore.use.meta();\n const setSelectedSwap = useUiStore.use.setSelectedSwap();\n\n useEffect(() => {\n const params: Record<string, string> = {};\n createSearchParams(firstRenderSearchParams.current).forEach(\n (value, key) => {\n params[key] = value;\n }\n );\n searchParamsRef.current = params;\n const requestId =\n location.pathname.split(navigationRoutes.swaps + '/')[1] || null;\n if (requestId) setSelectedSwap(requestId);\n }, []);\n\n useEffect(() => {\n if (!firstRender.current) {\n let fromChainString = '',\n fromTokenString = '',\n toChainString = '',\n toTokenString = '',\n fromAmount = '';\n if (loadingStatus !== 'success') {\n fromChainString = searchParamsRef.current[SearchParams.FROM_CHAIN];\n fromTokenString = searchParamsRef.current[SearchParams.FROM_TOKEN];\n toChainString = searchParamsRef.current[SearchParams.TO_CHAIN];\n toTokenString = searchParamsRef.current[SearchParams.TO_TOKEN];\n fromAmount =\n searchParamsRef.current[SearchParams.FROM_AMOUNT] || inputAmount;\n } else {\n if (location.state === 'redirect') return;\n fromChainString = fromChain?.name || '';\n fromTokenString =\n (fromToken?.symbol || '') +\n (fromToken?.address ? `--${fromToken?.address}` : '');\n toChainString = toChain?.name || '';\n toTokenString =\n (toToken?.symbol || '') +\n (toToken?.address ? `--${toToken?.address}` : '');\n fromAmount = inputAmount;\n }\n setSearchParams(\n {\n ...(fromChainString && {\n [SearchParams.FROM_CHAIN]: fromChainString,\n }),\n ...(fromTokenString && {\n [SearchParams.FROM_TOKEN]: fromTokenString,\n }),\n ...(toChainString && { [SearchParams.TO_CHAIN]: toChainString }),\n ...(toTokenString && { [SearchParams.TO_TOKEN]: toTokenString }),\n ...(fromAmount && {\n [SearchParams.FROM_AMOUNT]: fromAmount.toString(),\n }),\n },\n { replace: true }\n );\n }\n firstRender.current = false;\n }, [location.pathname, inputAmount, fromChain, fromToken, toChain, toToken]);\n\n useEffect(() => {\n if (loadingStatus === 'success') {\n const fromChainString = searchParams.get(SearchParams.FROM_CHAIN);\n const fromTokenString = searchParams.get(SearchParams.FROM_TOKEN);\n const toChainString = searchParams.get(SearchParams.TO_CHAIN);\n const toTokenString = searchParams.get(SearchParams.TO_TOKEN);\n const fromAmount = searchParams.get(SearchParams.FROM_AMOUNT);\n const fromChain = blockchains.find(\n (blockchain) => blockchain.name === fromChainString\n );\n const fromToken = searchParamsToToken(\n tokens,\n fromTokenString,\n fromChain || null\n );\n const toChain = blockchains.find(\n (blockchain) => blockchain.name === toChainString\n );\n const toToken = searchParamsToToken(\n tokens,\n toTokenString,\n toChain || null\n );\n if (!!fromChain) {\n setFromChain(fromChain);\n if (!!fromToken) setFromToken(fromToken);\n }\n if (!!toChain) {\n setToChain(toChain);\n if (!!toToken) setToToken(toToken);\n }\n if (fromAmount) setInputAmount(fromAmount);\n }\n }, [loadingStatus]);\n\n return null;\n}\n", "import { BestRouteResponse, BlockchainMeta } from 'rango-sdk';\nimport { Token } from 'rango-sdk';\nimport { create } from 'zustand';\nimport BigNumber from 'bignumber.js';\nimport { ZERO } from '../constants/numbers';\nimport {\n getBestRouteToTokenUsdPrice,\n isRouteParametersChanged,\n} from '../utils/routing';\nimport createSelectors from './selectors';\nimport { subscribeWithSelector } from 'zustand/middleware';\nimport { httpService } from '../services/httpService';\nimport { useSettingsStore } from './settings';\nimport { calcOutputUsdValue, createBestRouteRequestBody } from '../utils/swap';\nimport { useMetaStore } from './meta';\nimport {\n getDefaultToken,\n getSortedTokens,\n tokensAreEqual,\n} from '../utils/wallets';\nimport { useWalletsStore } from './wallets';\nimport { TokenWithBalance } from '../pages/SelectTokenPage';\nimport { PendingSwap } from '@rango-dev/queue-manager-rango-preset/dist/shared';\nimport { debounce } from '../utils/common';\nimport { isPositiveNumber } from '../utils/numbers';\n\nconst getUsdValue = (token: Token | null, amount: string): BigNumber | null =>\n token?.usdPrice\n ? new BigNumber(amount || ZERO).multipliedBy(token?.usdPrice || 0)\n : null;\n\nexport interface RouteState {\n fromChain: BlockchainMeta | null;\n toChain: BlockchainMeta | null;\n inputAmount: string;\n inputUsdValue: BigNumber | null;\n outputAmount: BigNumber | null;\n outputUsdValue: BigNumber | null;\n fromToken: TokenWithBalance | null;\n toToken: TokenWithBalance | null;\n loading: boolean;\n error: string;\n sourceTokens: Token[];\n destinationTokens: Token[];\n resetRoute: () => void;\n setFromChain: (\n chain: BlockchainMeta | null,\n setDefaultToken?: boolean\n ) => void;\n setToChain: (chian: BlockchainMeta | null, setDefaultToken?: boolean) => void;\n setFromToken: (token: Token | null) => void;\n setToToken: (token: Token | null) => void;\n setInputAmount: (amount: string) => void;\n bestRoute: BestRouteResponse | null;\n setBestRoute: (bestRoute: BestRouteResponse | null) => void;\n retry: (pendingSwap: PendingSwap) => void;\n switchFromAndTo: () => void;\n}\n\nexport const useBestRouteStore = createSelectors(\n create<RouteState>()(\n subscribeWithSelector((set) => ({\n fromChain: null,\n fromToken: null,\n inputAmount: '',\n outputAmount: null,\n inputUsdValue: new BigNumber(0),\n outputUsdValue: new BigNumber(0),\n toChain: null,\n toToken: null,\n bestRoute: null,\n loading: false,\n error: '',\n sourceTokens: [],\n destinationTokens: [],\n setBestRoute: (bestRoute) =>\n set((state) => {\n let outputAmount: BigNumber | null = null;\n let outputUsdValue: BigNumber = ZERO;\n if (!isPositiveNumber(state.inputAmount)) return {};\n if (!!bestRoute) {\n outputAmount = !!bestRoute.result?.outputAmount\n ? new BigNumber(bestRoute.result?.outputAmount)\n : null;\n outputUsdValue = calcOutputUsdValue(\n bestRoute.result?.outputAmount,\n getBestRouteToTokenUsdPrice(bestRoute) || state.toToken?.usdPrice\n );\n }\n return {\n bestRoute,\n ...(!!bestRoute && {\n outputAmount,\n outputUsdValue,\n }),\n };\n }),\n resetRoute: () =>\n set(() => ({\n loading: true,\n error: '',\n bestRoute: null,\n outputAmount: null,\n outputUsdValue: new BigNumber(0),\n })),\n setFromChain: (chain, setDefaultToken) => {\n set((state) => {\n if (state.fromChain?.name === chain?.name) return {};\n const tokens = useMetaStore.getState().meta.tokens;\n const connectedWallets = useWalletsStore.getState().connectedWallets;\n const sortedTokens = getSortedTokens(\n chain,\n tokens,\n connectedWallets,\n state.destinationTokens\n );\n const fromToken = getDefaultToken(sortedTokens, state.toToken);\n return {\n fromChain: chain,\n sourceTokens: sortedTokens,\n ...(setDefaultToken && {\n fromToken,\n }),\n ...(!!state.inputAmount && {\n inputUsdValue: getUsdValue(fromToken, state.inputAmount),\n }),\n };\n });\n },\n setFromToken: (token) =>\n set((state) => ({\n fromToken: token,\n ...(!!state.inputAmount && {\n inputUsdValue: getUsdValue(token, state.inputAmount),\n }),\n })),\n setToChain: (chain, setDefaultToken) => {\n set((state) => {\n if (state.toChain?.name === chain?.name) return {};\n const tokens = useMetaStore.getState().meta.tokens;\n const connectedWallets = useWalletsStore.getState().connectedWallets;\n const sortedTokens = getSortedTokens(\n chain,\n tokens,\n connectedWallets,\n state.destinationTokens\n );\n\n return {\n toChain: chain,\n destinationTokens: sortedTokens,\n ...(setDefaultToken && {\n toToken: getDefaultToken(sortedTokens, state.fromToken),\n }),\n };\n });\n },\n setToToken: (token) =>\n set(() => ({\n toToken: token,\n })),\n setInputAmount: (amount) => {\n set((state) => ({\n inputAmount: amount,\n ...(!amount && {\n outputAmount: new BigNumber(0),\n outputUsdValue: new BigNumber(0),\n bestRoute: null,\n error: '',\n }),\n ...(!!state.fromToken && {\n inputUsdValue: getUsdValue(state.fromToken, amount),\n }),\n }));\n },\n retry: (pendingSwap) => {\n const { tokens, blockchains } = useMetaStore.getState().meta;\n const connectedWallets = useWalletsStore.getState().connectedWallets;\n const failedIndex =\n pendingSwap.status === 'failed'\n ? pendingSwap.steps.findIndex((s) => s.status === 'failed')\n : null;\n\n if (failedIndex === null || failedIndex < 0) return;\n\n const firstStep = pendingSwap.steps[0];\n const lastStep = pendingSwap.steps[pendingSwap.steps.length - 1];\n const fromChain =\n blockchains.find(\n (blockchain) => blockchain.name === firstStep.fromBlockchain\n ) || null;\n const toChain =\n blockchains.find(\n (blockchain) => blockchain.name === lastStep.toBlockchain\n ) || null;\n\n const fromToken = tokens.find((token) =>\n tokensAreEqual(token, {\n blockchain: firstStep.fromBlockchain,\n symbol: firstStep.fromSymbol,\n address: firstStep.fromSymbolAddress,\n })\n );\n\n const toToken = tokens.find((token) =>\n tokensAreEqual(token, {\n blockchain: lastStep.toBlockchain,\n symbol: lastStep.toSymbol,\n address: lastStep.toSymbolAddress,\n })\n );\n const sortedSourceTokens = getSortedTokens(\n fromChain,\n tokens,\n connectedWallets,\n []\n );\n const sortedDestinationTokens = getSortedTokens(\n toChain,\n tokens,\n connectedWallets,\n []\n );\n const inputAmount = pendingSwap.inputAmount;\n set({\n fromChain,\n fromToken,\n inputAmount,\n outputAmount: null,\n inputUsdValue: getUsdValue(fromToken || null, inputAmount),\n outputUsdValue: new BigNumber(0),\n toChain,\n toToken,\n bestRoute: null,\n loading: false,\n error: '',\n sourceTokens: sortedSourceTokens,\n destinationTokens: sortedDestinationTokens,\n });\n },\n switchFromAndTo: () =>\n set((state) => ({\n fromChain: state.toChain,\n fromToken: state.toToken,\n toChain: state.fromChain,\n toToken: state.fromToken,\n sourceTokens: state.destinationTokens,\n destinationTokens: state.sourceTokens,\n inputAmount: state.outputAmount?.toString() || '',\n inputUsdValue: getUsdValue(\n state.toToken,\n state.outputAmount?.toString() || ''\n ),\n })),\n }))\n )\n);\n\nconst bestRoute = (\n bestRouteStore: typeof useBestRouteStore,\n settingsStore: typeof useSettingsStore\n) => {\n let abortController: AbortController | null = null;\n const fetchBestRoute = () => {\n const { fromToken, toToken, inputAmount, resetRoute } =\n bestRouteStore.getState();\n const {\n slippage,\n customSlippage,\n disabledLiquiditySources,\n affiliateRef,\n affiliatePercent,\n affiliateWallets,\n } = settingsStore.getState();\n if (!fromToken || !toToken || !isPositiveNumber(inputAmount)) return;\n abortController?.abort();\n abortController = new AbortController();\n const userSlippage = !!customSlippage ? customSlippage : slippage;\n const requestBody = createBestRouteRequestBody(\n fromToken,\n toToken,\n inputAmount,\n [],\n [],\n disabledLiquiditySources,\n userSlippage,\n affiliateRef,\n affiliatePercent,\n affiliateWallets\n );\n\n if (!bestRouteStore.getState().loading) {\n resetRoute();\n }\n httpService()\n .getBestRoute(requestBody, {\n signal: abortController.signal,\n })\n .then((res) => {\n const { setBestRoute } = bestRouteStore.getState();\n setBestRoute(res);\n bestRouteStore.setState({ loading: false });\n abortController = null;\n })\n .catch((error) => {\n if (error.code === 'ERR_CANCELED') return;\n bestRouteStore.setState({\n error: error.message,\n loading: false,\n });\n });\n };\n\n const debouncedFetchBestRoute = debounce(fetchBestRoute, 600);\n\n const bestRouteParamsListener = () => {\n const { fromToken, toToken, inputAmount, inputUsdValue, resetRoute } =\n useBestRouteStore.getState();\n if (!isPositiveNumber(inputAmount) || inputUsdValue?.eq(0))\n return bestRouteStore.setState({ loading: false });\n\n if (tokensAreEqual(fromToken, toToken))\n return bestRouteStore.setState({\n loading: false,\n bestRoute: null,\n outputAmount: new BigNumber(inputAmount),\n outputUsdValue: inputUsdValue,\n });\n\n if (!bestRouteStore.getState().loading) resetRoute();\n debouncedFetchBestRoute();\n };\n\n useBestRouteStore.subscribe(\n (state) => ({\n fromChain: state.fromChain,\n fromToken: state.fromToken,\n toChain: state.toChain,\n toToken: state.toToken,\n inputAmount: state.inputAmount,\n }),\n bestRouteParamsListener,\n {\n equalityFn: (prevState, currentState) => {\n if (\n isRouteParametersChanged({\n store: 'bestRoute',\n prevState,\n currentState,\n })\n )\n return false;\n else return true;\n },\n }\n );\n\n useSettingsStore.subscribe(\n (state) => ({\n slippage: state.slippage,\n customSlippage: state.customSlippage,\n disabledLiquiditySources: state.disabledLiquiditySources,\n infiniteApprove: state.infiniteApprove,\n }),\n bestRouteParamsListener,\n {\n equalityFn: (prevState, currentState) => {\n if (\n isRouteParametersChanged({\n store: 'settings',\n prevState,\n currentState,\n })\n )\n return false;\n else return true;\n },\n }\n );\n\n return { fetchBestRoute };\n};\n\nexport const { fetchBestRoute } = bestRoute(\n useBestRouteStore,\n useSettingsStore\n);\n", "import BigNumber from 'bignumber.js';\n\nexport const ZERO = new BigNumber(0);\n", "import {\n SimulationAssetAndAmount,\n SimulationValidationStatus,\n} from '@rango-dev/ui/dist/widget/ui/src/types/swaps';\nimport BigNumber from 'bignumber.js';\nimport { BestRouteResponse, BlockchainMeta, Token } from 'rango-sdk';\nimport { areEqual } from './common';\nimport { BestRouteEqualityParams, Wallet } from '../types';\nimport { numberToString } from './numbers';\nimport { PendingSwap } from '@rango-dev/queue-manager-rango-preset';\n\nexport function searchParamsToToken(\n tokens: Token[],\n searchParams: string | null,\n chain: BlockchainMeta | null\n): Token | null {\n if (!chain) return null;\n return (\n tokens.find((token) => {\n const symbolAndAddress = searchParams?.split('--');\n if (symbolAndAddress?.length === 1)\n return (\n token.symbol === symbolAndAddress[0] &&\n token.address === null &&\n token.blockchain === chain.name\n );\n return (\n token.symbol === symbolAndAddress?.[0] &&\n token.address === symbolAndAddress?.[1] &&\n token.blockchain === chain.name\n );\n }) || null\n );\n}\n\nexport function getBestRouteToTokenUsdPrice(\n bestRoute: BestRouteResponse | null\n): number | null | undefined {\n return bestRoute?.result?.swaps[bestRoute?.result?.swaps.length - 1].to\n .usdPrice;\n}\n\nexport function isNumberOfSwapsChanged(\n route1: BestRouteResponse,\n route2: BestRouteResponse\n) {\n const route1Swaps = route1.result?.swaps || [];\n const route2Swaps = route2.result?.swaps || [];\n return route1Swaps.length !== route2Swaps.length;\n}\n\nexport function isRouteSwappersUpdated(\n route1: BestRouteResponse,\n route2: BestRouteResponse\n) {\n const route1Swappers =\n route1.result?.swaps.map((swap) => swap.swapperId) || [];\n const route2Swappers =\n route2.result?.swaps.map((swap) => swap.swapperId) || [];\n return !areEqual(route1Swappers, route2Swappers);\n}\n\nexport function isRouteInternalCoinsUpdated(\n route1: BestRouteResponse,\n route2: BestRouteResponse\n) {\n const route1InternalCoins =\n route1.result?.swaps.map((swap) => swap.to.symbol) || [];\n const route2InternalCoins =\n route2.result?.swaps.map((swap) => swap.to.symbol) || [];\n return !areEqual(route1InternalCoins, route2InternalCoins);\n}\n\nexport function isRouteChanged(\n route1: BestRouteResponse,\n route2: BestRouteResponse\n): boolean {\n return (\n isNumberOfSwapsChanged(route1, route2) ||\n isRouteSwappersUpdated(route1, route2) ||\n isRouteInternalCoinsUpdated(route1, route2)\n );\n}\n\nexport function outToRatioHasWarning(\n fromUsdValue: BigNumber | null,\n outToInRatio: BigNumber | 0\n) {\n return (\n (parseInt(outToInRatio?.toFixed(2) || '0') <= -10 &&\n (fromUsdValue === null || fromUsdValue.gte(new BigNumber(200)))) ||\n (parseInt(outToInRatio?.toFixed(2) || '0') <= -5 &&\n (fromUsdValue === null || fromUsdValue.gte(new BigNumber(1000))))\n );\n}\n\nexport function getRequiredBalanceOfWallet(\n selectedWallet: Wallet,\n fee: SimulationValidationStatus[] | null\n): SimulationAssetAndAmount[] | null {\n if (fee === null) return null;\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) return null;\n return relatedFeeStatus.requiredAssets;\n}\n\nexport function isRouteParametersChanged(params: BestRouteEqualityParams) {\n if (params.store === 'bestRoute') {\n const { prevState, currentState } = params;\n return (\n !!currentState.fromToken &&\n !!currentState.toToken &&\n (prevState.fromChain?.name !== currentState.fromChain?.name ||\n prevState.toChain?.name !== currentState.toChain?.name ||\n prevState.fromToken?.symbol !== currentState.fromToken?.symbol ||\n prevState.toToken?.symbol !== currentState.toToken?.symbol ||\n prevState.fromToken?.blockchain !== prevState.fromToken?.blockchain ||\n prevState.toToken?.blockchain !== currentState.toToken?.blockchain ||\n prevState.fromToken?.address !== currentState.fromToken?.address ||\n prevState.toToken?.address !== currentState.toToken?.address ||\n prevState.inputAmount !== currentState.inputAmount)\n );\n } else if (params.store === 'settings') {\n const { prevState, currentState } = params;\n return (\n prevState.slippage !== currentState.slippage ||\n prevState.customSlippage !== currentState.customSlippage ||\n prevState.disabledLiquiditySources?.length !==\n currentState.disabledLiquiditySources?.length ||\n prevState.infiniteApprove ||\n currentState.infiniteApprove\n );\n }\n return false;\n}\n\nexport function getFormatedBestRoute(\n bestRoute: BestRouteResponse | null\n): BestRouteResponse | null {\n if (!bestRoute) return null;\n\n const formatedSwaps = (bestRoute.result?.swaps || []).map((swap) => ({\n ...swap,\n fromAmount: numberToString(swap.fromAmount, 6, 6),\n toAmount: numberToString(swap.toAmount, 6, 6),\n }));\n\n return {\n ...bestRoute,\n ...(bestRoute.result && {\n result: { ...bestRoute.result, swaps: formatedSwaps },\n }),\n };\n}\n\nexport function getFormatedPendingSwap(pendingSwap: PendingSwap): PendingSwap {\n const formatedSteps = pendingSwap.steps.map((step) => ({\n ...step,\n feeInUsd: numberToString(step.feeInUsd, 4, 4),\n outputAmount: numberToString(step.outputAmount, 6, 6),\n expectedOutputAmountHumanReadable: numberToString(\n step.expectedOutputAmountHumanReadable,\n 6,\n 6\n ),\n }));\n\n return {\n ...pendingSwap,\n inputAmount: numberToString(pendingSwap.inputAmount, 6, 6),\n steps: formatedSteps,\n };\n}\n\n//todo: refactor bestRoute store and add loadingStatus\nexport const getBestRouteStatus = (loading: boolean, error: boolean) => {\n if (loading) return 'loading';\n if (error) return 'failed';\n else return 'success';\n};\n", "export function removeDuplicateFrom<T>(array: T[]): T[] {\n return Array.from(new Set(array));\n}\n\nexport function areEqual(\n array1: (number | string)[],\n array2: (number | string)[]\n) {\n return (\n array1.length === array2.length && array1.every((v, i) => v === array2[i])\n );\n}\n\n\n\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\n\n", "import { BigNumber } from 'bignumber.js';\nimport { BestRouteResponse } from 'rango-sdk';\n\nexport const percentToString = (p: number, fractions = 0): string =>\n (p * 100).toFixed(fractions);\n\nexport const secondsToString = (s: number): string => {\n const seconds = (s % 60).toString().padStart(2, '0');\n const minutes = parseInt((s / 60).toString())\n .toString()\n .padStart(2, '0');\n return `${minutes}:${seconds}`;\n};\n\nexport const numberToString = (\n number: BigNumber | string | null | undefined,\n minDecimals: number | null = null,\n maxDecimals: number | null = null\n): string => {\n if (number === null || number === undefined) return '';\n if (number === '') return '';\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)) return n.toFormat(0, roundingMode);\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 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 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 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 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 if (n.isEqualTo(0)) return '0';\n\n return n.toFormat(\n Math.min(maxI, Math.min(maxDecimals || 100, Math.max(minDecimals || 0, 8))),\n roundingMode\n );\n};\n\nexport const convertBigNumberToHex = (\n value: BigNumber,\n decimals: number\n): string => {\n return '0x' + value.shiftedBy(decimals).toString(16);\n};\n\nexport const uint8ArrayToHex = (buffer: Uint8Array): string => {\n // buffer is an ArrayBuffer\n // eslint-disable-next-line @typescript-eslint/ban-ts-comment\n // @ts-ignore\n return [...buffer].map((x) => x.toString(16).padStart(2, '0')).join('');\n};\n\nexport function dollarToConciseString(num: number | undefined): string {\n if (!num) return '-';\n if (num < 1) return ' < 1$';\n if (num < 1000) return numberToString(new BigNumber(num)) + '$';\n if (num < 10_000) return parseInt((num / 100).toString()) / 10 + 'K';\n if (num < 1_000_000) return parseInt((num / 1000).toString()) + 'K';\n if (num < 100_000_000) return parseInt((num / 100000).toString()) / 10 + 'M';\n return parseInt((num / 1000000).toString()) + 'M';\n}\n\nexport function removeExtraDecimals(num: string, maxDecimals: number): string {\n try {\n if (!num.includes('.')) return num;\n const [b, f] = num.split('.');\n if (f && f.length > maxDecimals) {\n return `${b}.${f.substring(0, maxDecimals)}`;\n }\n return num;\n } catch (e) {\n return num;\n }\n}\n\nexport const totalArrivalTime = (data: BestRouteResponse | null) =>\n data?.result?.swaps?.reduce((a, b) => a + b.estimatedTimeInSeconds, 0) || 0;\n\nexport const rawFees = (data: BestRouteResponse): string =>\n (\n data?.result?.swaps?.flatMap((s) =>\n s.fee.map((f) => ({ swapperId: s.swapperId, fee: f }))\n ) || []\n )\n .reduce((partialSum, a) => partialSum + parseFloat(a.fee.amount), 0)\n .toFixed(3);\n\nexport const containsText = (text: string, searchText: string) =>\n text.toLowerCase().indexOf(searchText.toLowerCase()) > -1;\n\nexport const isPositiveNumber = (text?: string) =>\n !!text && parseFloat(text) > 0;\n10;\n", "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 { RangoClient } from 'rango-sdk';\nimport { getConfig } from '../utils/configs';\n\n// this API key is limited and\n// it is only for test purpose\nexport const RANGO_PUBLIC_API_KEY = 'c6381a79-2817-4602-83bf-6a641a409e32';\n\nlet rango: RangoClient | undefined = undefined;\n\nexport const httpService = () => {\n if (rango) return rango;\n rango = new RangoClient(getConfig('API_KEY'));\n return rango;\n};\n", "export interface Configs {\n API_KEY: string;\n}\n\nconst RANGO_PUBLIC_API_KEY = 'c6381a79-2817-4602-83bf-6a641a409e32';\n\nlet configs: Configs = {\n API_KEY: RANGO_PUBLIC_API_KEY,\n};\n\nexport function getConfig(name: keyof Configs) {\n return configs[name];\n}\n\nexport function setConfig(name: keyof Configs, value: any) {\n configs[name] = value;\n\n return value;\n}\n\nexport function initConfig(nextConfigs: Configs) {\n let clonedConfigs;\n if (typeof structuredClone === 'function') {\n clonedConfigs = structuredClone(nextConfigs);\n } else {\n clonedConfigs = JSON.parse(JSON.stringify(nextConfigs));\n }\n configs = clonedConfigs;\n return configs;\n}\n", "import { create } from 'zustand';\nimport { persist, subscribeWithSelector } from 'zustand/middleware';\nimport { DEFAULT_SLIPPAGE } from '../constants/swapSettings';\nimport { removeDuplicateFrom } from '../utils/common';\nimport { useMetaStore } from './meta';\nimport createSelectors from './selectors';\n\ntype Theme = 'auto' | 'dark' | 'light';\n\nexport interface SettingsState {\n slippage: number;\n customSlippage: number | null;\n infiniteApprove: boolean;\n disabledLiquiditySources: string[];\n theme: Theme;\n affiliateRef: string | null;\n affiliatePercent: number | null;\n affiliateWallets: { [key: string]: string } | null;\n setSlippage: (slippage: number) => void;\n setCustomSlippage: (customSlippage: number | null) => void;\n toggleInfiniteApprove: () => void;\n toggleLiquiditySource: (name: string) => void;\n setTheme: (theme: Theme) => void;\n toggleAllLiquiditySources: () => void;\n setAffiliateRef: (affiliateRef: string | null) => void;\n setAffiliatePercent: (affiliatePercent: number | null) => void;\n setAffiliateWallets: (\n affiliateWallets: { [key: string]: string } | null\n ) => void;\n}\n\nexport const useSettingsStore = createSelectors(\n create<SettingsState>()(\n persist(\n subscribeWithSelector((set) => ({\n slippage: DEFAULT_SLIPPAGE,\n customSlippage: null,\n infiniteApprove: false,\n affiliateRef: null,\n affiliatePercent: null,\n affiliateWallets: null,\n disabledLiquiditySources: [],\n theme: 'auto',\n setSlippage: (slippage) =>\n set(() => ({\n slippage: slippage,\n })),\n setCustomSlippage: (customSlippage) =>\n set(() => ({\n customSlippage: customSlippage,\n })),\n setAffiliateRef: (affiliateRef) =>\n set(() => ({\n affiliateRef,\n })),\n setAffiliatePercent: (affiliatePercent) =>\n set(() => ({\n affiliatePercent,\n })),\n\n setAffiliateWallets: (affiliateWallets) =>\n set(() => ({\n affiliateWallets,\n })),\n toggleAllLiquiditySources: () =>\n set((state) => {\n const { swappers } = useMetaStore.getState().meta;\n const swappersGroup = removeDuplicateFrom(\n swappers.map((swapper) => swapper.swapperGroup)\n );\n\n if (swappersGroup.length === state.disabledLiquiditySources.length)\n return { disabledLiquiditySources: [] };\n else {\n return {\n disabledLiquiditySources: swappersGroup,\n };\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 else\n return {\n disabledLiquiditySources:\n state.disabledLiquiditySources.concat(name),\n };\n }),\n setTheme: (theme) =>\n set(() => ({\n theme,\n })),\n })),\n {\n name: 'user-settings',\n skipHydration: true,\n }\n )\n )\n);\n", "export const SLIPPAGES = [0.5, 1, 3, 5, 8, 13, 20];\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 { create } from 'zustand';\nimport { MetaResponse } from 'rango-sdk';\nimport { httpService } from '../services/httpService';\nimport createSelectors from './selectors';\nimport { removeDuplicateFrom } from '../utils/common';\n\nexport type LoadingStatus = 'loading' | 'success' | 'failed';\n\nexport interface MetaState {\n meta: MetaResponse;\n loadingStatus: LoadingStatus;\n fetchMeta: () => Promise<void>;\n}\n\nexport const useMetaStore = createSelectors(\n create<MetaState>()((set) => ({\n meta: { blockchains: [], popularTokens: [], swappers: [], tokens: [] },\n loadingStatus: 'loading',\n fetchMeta: async () => {\n try {\n const response = await httpService().getAllMetadata();\n const chainThatHasTokenInMetaResponse = removeDuplicateFrom(\n response.tokens.map((t) => t.blockchain)\n );\n const enabledChains = response.blockchains.filter(\n (chain) =>\n chain.enabled &&\n chainThatHasTokenInMetaResponse.includes(chain.name)\n );\n response.blockchains = enabledChains.sort((a, b) => a.sort - b.sort);\n set({ meta: response, loadingStatus: 'success' });\n } catch (error) {\n set({ loadingStatus: 'failed' });\n }\n },\n }))\n);\n", "import BigNumber from 'bignumber.js';\nimport {\n BestRouteRequest,\n BestRouteResponse,\n RecommendedSlippage,\n SwapResult,\n Token,\n} from 'rango-sdk';\nimport { i18n } from '@lingui/core';\nimport { ConnectedWallet } from '../store/wallets';\nimport { ZERO } from '../constants/numbers';\nimport { numberToString } from './numbers';\nimport { WalletType } from '@rango-dev/wallets-shared';\nimport { getRequiredBalanceOfWallet } from './routing';\nimport { getRequiredChains } from './wallets';\nimport { LoadingStatus, useMetaStore } from '../store/meta';\nimport { ConvertedToken, SwapButtonState, Wallet } from '../types';\nimport {\n PendingSwapNetworkStatus,\n PendingSwapStep,\n} from '@rango-dev/queue-manager-rango-preset';\nimport { PendingSwap } from '@rango-dev/queue-manager-rango-preset';\nimport { removeDuplicateFrom } from './common';\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 return outputUsdValue.div(inputUsdValue).minus(1).multipliedBy(100);\n}\n\nexport function outputRatioHasWarning(\n inputUsdValue: BigNumber | null,\n outputRatio: BigNumber | 0\n): boolean {\n return (\n ((parseInt(outputRatio.toFixed(2) || '0') <= -10 &&\n inputUsdValue?.gte(new BigNumber(400))) ||\n (parseInt(outputRatio.toFixed(2) || '0') <= -5 &&\n inputUsdValue?.gte(new BigNumber(1000)))) ??\n false\n );\n}\n\nexport function hasLimitError(bestRoute: BestRouteResponse | null): boolean {\n return (\n (bestRoute?.result?.swaps || []).filter((swap) => {\n const minimum = !!swap.fromAmountMinValue\n ? new BigNumber(swap.fromAmountMinValue)\n : null;\n const maximum = !!swap.fromAmountMaxValue\n ? new BigNumber(swap.fromAmountMaxValue)\n : null;\n const isExclusive = swap.fromAmountRestrictionType === 'EXCLUSIVE';\n if (isExclusive) {\n return minimum?.gte(swap.fromAmount) || maximum?.lte(swap.fromAmount);\n } else {\n return minimum?.gt(swap.fromAmount) || maximum?.lt(swap.fromAmount);\n }\n }).length > 0\n );\n}\n\nexport function LimitErrorMessage(bestRoute: BestRouteResponse | null): {\n swap: SwapResult | null;\n fromAmountRangeError: string;\n recommendation: string;\n} {\n if (!bestRoute)\n return { swap: null, fromAmountRangeError: '', recommendation: '' };\n const swap = (bestRoute?.result?.swaps || []).filter((swap) => {\n const minimum = !!swap.fromAmountMinValue\n ? new BigNumber(swap.fromAmountMinValue)\n : null;\n const maximum = !!swap.fromAmountMaxValue\n ? new BigNumber(swap.fromAmountMaxValue)\n : null;\n const isExclusive = swap.fromAmountRestrictionType === 'EXCLUSIVE';\n if (isExclusive) {\n return minimum?.gte(swap.fromAmount) || maximum?.lte(swap.fromAmount);\n } else {\n return minimum?.gt(swap.fromAmount) || maximum?.lt(swap.fromAmount);\n }\n })[0];\n if (!swap)\n return { swap: null, fromAmountRangeError: '', recommendation: '' };\n const minimum = !!swap.fromAmountMinValue\n ? new BigNumber(swap.fromAmountMinValue)\n : null;\n const maximum = !!swap.fromAmountMaxValue\n ? new BigNumber(swap.fromAmountMaxValue)\n : null;\n const isExclusive = swap.fromAmountRestrictionType === 'EXCLUSIVE';\n\n let fromAmountRangeError = '';\n let recommendation = '';\n if (!isExclusive && !!minimum && minimum.gt(swap.fromAmount)) {\n fromAmountRangeError = `Required: >= ${numberToString(minimum)} ${\n swap.from.symbol\n }`;\n recommendation = 'Increase your swap amount';\n } else if (isExclusive && !!minimum && minimum.gte(swap.fromAmount)) {\n fromAmountRangeError = `Required: > ${numberToString(minimum)} ${\n swap.from.symbol\n }`;\n recommendation = 'Increase your swap amount';\n }\n\n if (!isExclusive && !!maximum && maximum.lt(swap.fromAmount)) {\n fromAmountRangeError = `Required: <= ${numberToString(maximum)} ${\n swap.from.symbol\n }`;\n recommendation = 'Decrease your swap amount';\n } else if (isExclusive && !!maximum && maximum.lte(swap.fromAmount)) {\n fromAmountRangeError = `Required: < ${numberToString(maximum)} ${\n swap.from.symbol\n }`;\n recommendation = 'Decrease your swap amount';\n }\n\n return { swap, fromAmountRangeError, recommendation };\n}\n\nexport function getSwapButtonState(\n loadingMetaStatus: LoadingStatus,\n connectedWallets: ConnectedWallet[],\n loading: boolean,\n bestRoute: BestRouteResponse | null,\n hasLimitError: boolean,\n highValueLoss: boolean,\n priceImpactCanNotBeComputed: boolean,\n needsToWarnEthOnPath: boolean,\n inputAmount: string\n): SwapButtonState {\n if (loadingMetaStatus !== 'success')\n return { title: `${i18n.t('Connect Wallet')}`, disabled: true };\n if (connectedWallets.length == 0)\n return { title: `${i18n.t('Connect Wallet')}`, disabled: false };\n if (loading)\n return { title: `${i18n.t('Finding Best Route...')}`, disabled: true };\n else if (!inputAmount || inputAmount === '0')\n return { title: `${i18n.t('Enter an amount')}`, disabled: true };\n else if (!bestRoute || !bestRoute.result)\n return { title: `${i18n.t('Swap')}`, disabled: true };\n else if (hasLimitError)\n return { title: `${i18n.t('Limit Error')}`, disabled: true };\n else if (highValueLoss)\n return { title: `${i18n.t('Price impact is too high!')}`, disabled: true };\n else if (priceImpactCanNotBeComputed)\n return {\n title: `${i18n.t('USD price is unknown, price impact might be high!')}`,\n disabled: false,\n hasWarning: true,\n };\n else if (needsToWarnEthOnPath)\n return {\n title: `${i18n.t('The route goes through Ethereum. Continue?')}`,\n disabled: false,\n hasWarning: true,\n };\n else return { title: `${i18n.t('Swap')}`, disabled: false };\n}\n\nexport function canComputePriceImpact(\n bestRoute: BestRouteResponse | null,\n inputAmount: string,\n inputUsdValue: BigNumber | null,\n outputUsdValue: BigNumber | null\n) {\n return !(\n (!inputUsdValue ||\n !outputUsdValue ||\n inputUsdValue.lte(ZERO) ||\n outputUsdValue.lte(ZERO)) &&\n !!bestRoute?.result &&\n !!inputAmount &&\n inputAmount !== '0' &&\n parseFloat(inputAmount || '0') !== 0 &&\n !!bestRoute.result\n );\n}\n\nexport function requiredWallets(route: BestRouteResponse | null) {\n const wallets: string[] = [];\n\n route?.result?.swaps.forEach((swap) => {\n const currentStepFromBlockchain = swap.from.blockchain;\n const currentStepToBlockchain = swap.to.blockchain;\n let lastAddedWallet = wallets[wallets.length - 1];\n if (currentStepFromBlockchain != lastAddedWallet)\n wallets.push(currentStepFromBlockchain);\n lastAddedWallet = wallets[wallets.length - 1];\n if (currentStepToBlockchain != lastAddedWallet)\n wallets.push(currentStepToBlockchain);\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') continue;\n\n const unitPrice = getUsdPrice(\n fee.asset.blockchain,\n fee.asset.symbol,\n fee.asset.address,\n allTokens\n );\n totalFeeInUsd = totalFeeInUsd.plus(\n new BigNumber(fee.amount).multipliedBy(unitPrice || 0)\n );\n }\n\n return totalFeeInUsd;\n}\n\nexport function getTotalFeeInUsd(\n bestRoute: BestRouteResponse | null,\n allTokens: Token[]\n): BigNumber | null {\n return (\n bestRoute?.result?.swaps.reduce(\n (totalFee: BigNumber, step) =>\n totalFee.plus(getUsdFeeOfStep(step, allTokens)),\n ZERO\n ) || null\n );\n}\n\nexport function hasHighFee(totalFeeInUsd: BigNumber | null) {\n if (!totalFeeInUsd) return false;\n return !totalFeeInUsd.lt(new BigNumber(30));\n}\n\nexport function hasSlippageError(\n slippages: (RecommendedSlippage | null)[] | undefined\n) {\n return (slippages?.filter((s) => !!s?.error)?.length || 0) > 0;\n}\n\nexport function getMinRequiredSlippage(\n route: BestRouteResponse\n): string | null {\n const slippages = route.result?.swaps.map(\n (slippage) => slippage.recommendedSlippage\n );\n return (\n slippages\n ?.map((s) => s?.slippage || '0')\n ?.filter((s) => parseFloat(s) > 0)\n ?.sort((a, b) => parseFloat(b) - parseFloat(a))\n ?.find(() => true) || null\n );\n}\n\nexport function hasProperSlippage(\n userSlippage: string,\n minRequiredSlippage: string | null\n) {\n if (!minRequiredSlippage) return true;\n return parseFloat(userSlippage) >= parseFloat(minRequiredSlippage);\n}\n\nexport function hasEnoughBalance(\n route: BestRouteResponse,\n selectedWallets: Wallet[]\n) {\n const fee = route.validationStatus;\n\n if (fee === null || fee.length === 0) return true;\n\n for (const wallet of selectedWallets) {\n const requiredAssets = getRequiredBalanceOfWallet(wallet, fee);\n if (!requiredAssets) continue;\n\n const enoughBalanceInWallet = requiredAssets\n .map((asset) => asset.ok)\n .reduce((previous, current) => previous && current);\n if (!enoughBalanceInWallet) return false;\n }\n\n return true;\n}\n\nexport function hasEnoughBalanceAndProperSlippage(\n route: BestRouteResponse,\n selectedWallets: Wallet[],\n userSlippage: string,\n minRequiredSlippage: string | null\n): boolean {\n return (\n hasEnoughBalance(route, selectedWallets) &&\n hasProperSlippage(userSlippage, minRequiredSlippage)\n );\n}\n\nexport function createBestRouteRequestBody(\n fromToken: Token,\n toToken: Token,\n inputAmount: string,\n wallets: ConnectedWallet[],\n selectedWallets: Wallet[],\n disabledLiquiditySources: string[],\n slippage: number,\n affiliateRef: string | null,\n affiliatePercent: number | null,\n affiliateWallets: { [key: string]: string } | null,\n initialRoute?: BestRouteResponse,\n destination?: string\n): BestRouteRequest {\n const selectedWalletsMap = selectedWallets.reduce(\n (\n selectedWalletsMap: BestRouteRequest['selectedWallets'],\n selectedWallet\n ) => (\n (selectedWalletsMap[selectedWallet.chain] = selectedWallet.address),\n selectedWalletsMap\n ),\n {}\n );\n\n const connectedWallets: BestRouteRequest['connectedWallets'] = [];\n\n wallets.forEach((wallet) => {\n const chainAndAccounts = connectedWallets.find(\n (connectedWallet) => connectedWallet.blockchain === wallet.chain\n );\n if (!!chainAndAccounts) chainAndAccounts.addresses.push(wallet.address);\n else\n connectedWallets.push({\n blockchain: wallet.chain,\n addresses: [wallet.address],\n });\n });\n\n const checkPrerequisites = !!initialRoute;\n\n const filteredBlockchains = removeDuplicateFrom(\n (initialRoute?.result?.swaps || []).reduce(\n (blockchains: string[], swap) => {\n blockchains.push(swap.from.blockchain, swap.to.blockchain);\n // Check if internalSwaps array exists\n if (swap.internalSwaps && Array.isArray(swap.internalSwaps)) {\n swap.internalSwaps.map((internalSwap) => {\n blockchains.push(\n internalSwap.from.blockchain,\n internalSwap.to.blockchain\n );\n });\n }\n return blockchains;\n },\n []\n )\n );\n\n const requestBody: BestRouteRequest = {\n amount: inputAmount.toString(),\n affiliateRef: affiliateRef ?? undefined,\n affiliatePercent: affiliatePercent ?? undefined,\n affiliateWallets: affiliateWallets ?? undefined,\n checkPrerequisites,\n from: {\n address: fromToken.address,\n blockchain: fromToken.blockchain,\n symbol: fromToken.symbol,\n },\n to: {\n address: toToken.address,\n blockchain: toToken.blockchain,\n symbol: toToken.symbol,\n },\n connectedWallets,\n destination: destination || undefined,\n selectedWallets: selectedWalletsMap,\n swapperGroups: disabledLiquiditySources,\n swappersGroupsExclude: true,\n slippage: slippage.toString(),\n ...(checkPrerequisites && { blockchains: filteredBlockchains }),\n };\n\n return requestBody;\n}\n\nexport function getWalletsForNewSwap(selectedWallets: Wallet[]) {\n const wallets = selectedWallets.reduce(\n (\n selectedWalletsMap: {\n [p: string]: { address: string; walletType: WalletType };\n },\n selectedWallet\n ) => (\n (selectedWalletsMap[selectedWallet.chain] = {\n address: selectedWallet.address,\n walletType: selectedWallet.walletType,\n }),\n selectedWalletsMap\n ),\n {}\n );\n\n return wallets;\n}\n\nexport function getRouteOutputAmount(route: BestRouteResponse | null) {\n return route?.result?.outputAmount || null;\n}\n\nexport function getPercentageChange(\n oldValue: string | number | null,\n newValue: string | number | null\n) {\n if (!oldValue || !newValue) return null;\n return new BigNumber(newValue)\n .div(new BigNumber(oldValue))\n .minus(1)\n .multipliedBy(100);\n}\n\nexport function isOutputAmountChangedALot(\n oldRoute: BestRouteResponse,\n newRoute: BestRouteResponse\n) {\n const oldOutputAmount = getRouteOutputAmount(oldRoute);\n const newOutputAmount = getRouteOutputAmount(newRoute);\n if (!oldOutputAmount || !newOutputAmount) return false;\n const percentageChange = getPercentageChange(\n oldOutputAmount,\n newOutputAmount\n );\n if (!percentageChange) return true;\n\n return percentageChange.toNumber() <= -1;\n}\n\nexport function getBalanceWarnings(\n route: BestRouteResponse,\n selectedWallets: Wallet[]\n) {\n const fee = route.validationStatus;\n const requiredWallets = getRequiredChains(route);\n const walletsSortedByRequiredWallets = selectedWallets.sort(\n (selectedWallet1, selectedWallet2) =>\n requiredWallets.indexOf(selectedWallet1.chain) -\n requiredWallets.indexOf(selectedWallet2.chain)\n );\n return walletsSortedByRequiredWallets\n .flatMap((wallet) => getRequiredBalanceOfWallet(wallet, fee) || [])\n .filter((asset) => !asset.ok)\n .map((asset) => {\n const symbol = asset.asset.symbol;\n const currentAmount = numberToString(\n new BigNumber(asset.currentAmount.amount).shiftedBy(\n -asset.currentAmount.decimals\n ),\n 8\n );\n const requiredAmount = numberToString(\n new BigNumber(asset.requiredAmount.amount).shiftedBy(\n -asset.requiredAmount.decimals\n ),\n 8\n );\n let reason = '';\n if (asset.reason === 'FEE') reason = ' for network fee';\n if (asset.reason === 'INPUT_ASSET') reason = ' for swap';\n if (asset.reason === 'FEE_AND_INPUT_ASSET')\n reason = ' for input and network fee';\n const warningMessage = `Needs \u2248 ${requiredAmount} ${symbol}${reason}, but you have ${currentAmount} ${symbol} in your ${asset.asset.blockchain} wallet.`;\n return warningMessage;\n });\n}\n\nexport function calcOutputUsdValue(\n outputAmount?: string,\n tokenPrice?: number | null\n) {\n const amount = !!outputAmount ? new BigNumber(outputAmount) : ZERO;\n\n return amount.multipliedBy(tokenPrice || 0);\n}\n\nexport function isNetworkStatusInWarningState(\n pendingSwapStep: PendingSwapStep | null\n): boolean {\n return (\n !!pendingSwapStep &&\n pendingSwapStep.networkStatus !== null &&\n pendingSwapStep.networkStatus !== PendingSwapNetworkStatus.NetworkChanged\n );\n}\n\nexport function getSwapMessages(\n pendingSwap: PendingSwap,\n currentStep: PendingSwapStep | null\n): {\n shortMessage: string;\n detailedMessage: { content: string; long: boolean };\n} {\n const textForRemove = 'bellow button or';\n let message = pendingSwap.extraMessage;\n let detailedMessage = pendingSwap.extraMessageDetail;\n\n if (pendingSwap.networkStatusExtraMessageDetail?.includes(textForRemove)) {\n pendingSwap.networkStatusExtraMessageDetail =\n pendingSwap.networkStatusExtraMessageDetail.replace(textForRemove, '');\n }\n\n const networkWarningState = isNetworkStatusInWarningState(currentStep);\n\n if (networkWarningState) {\n message = pendingSwap.networkStatusExtraMessage || '';\n detailedMessage = pendingSwap.networkStatusExtraMessageDetail || '';\n switch (currentStep?.networkStatus) {\n case PendingSwapNetworkStatus.WaitingForConnectingWallet:\n message = message || 'Waiting for connecting wallet';\n break;\n case PendingSwapNetworkStatus.WaitingForQueue:\n message = message || 'Waiting for other running tasks to be finished';\n break;\n case PendingSwapNetworkStatus.WaitingForNetworkChange:\n message = message || 'Waiting for changing wallet network';\n break;\n }\n }\n detailedMessage = detailedMessage || '';\n message = message || '';\n const isRpc =\n message?.indexOf('code') !== -1 && message?.indexOf('reason') !== -1;\n\n return {\n shortMessage: message,\n detailedMessage: { content: detailedMessage, long: isRpc },\n };\n}\n\nexport function getLastConvertedTokenInFailedSwap(\n pendingSwap: PendingSwap\n): ConvertedToken {\n let resultToken: ConvertedToken = null;\n if (pendingSwap.status === 'failed') {\n const lastSuccessStep = pendingSwap.steps\n .slice()\n .reverse()\n .filter((step) => step.status === 'success')[0];\n\n if (lastSuccessStep) {\n resultToken = {\n blockchain: lastSuccessStep.toBlockchain,\n symbol: lastSuccessStep.toSymbol,\n outputAmount: lastSuccessStep.outputAmount,\n address: lastSuccessStep.toSymbolAddress,\n };\n }\n }\n return resultToken;\n}\n\nexport function shouldRetrySwap(pendingSwap: PendingSwap) {\n return (\n pendingSwap.status === 'failed' &&\n !!pendingSwap.finishTime &&\n new Date().getTime() - parseInt(pendingSwap.finishTime) < 4 * 3600 * 1000\n );\n}\nexport function isValidCustomDestination(\n blockchain: string,\n address: string\n): boolean {\n const blockchains = useMetaStore.getState().meta.blockchains;\n const regex =\n blockchains.find((chain) => chain.name === blockchain)?.addressPatterns ||\n [];\n return regex.filter((r) => new RegExp(r).test(address)).length > 0;\n}\n\nexport function confirmSwapDisabled(\n fetching: boolean,\n destinationChain: string,\n customDestination: string,\n bestRoute: BestRouteResponse | null,\n selectedWallets: Wallet[]\n) {\n return (\n fetching ||\n (!destinationChain &&\n !requiredWallets(bestRoute).every((chain) =>\n selectedWallets.map((wallet) => wallet.chain).includes(chain)\n )) ||\n (!!destinationChain && !customDestination) ||\n (!!destinationChain &&\n !!customDestination &&\n !requiredWallets(bestRoute)\n .filter((chain) => chain !== destinationChain)\n .every((chain) =>\n selectedWallets.map((wallet) => wallet.chain).includes(chain)\n ))\n );\n}\n", "import {\n getCosmosExperimentalChainInfo,\n isEvmAddress,\n KEPLR_COMPATIBLE_WALLETS,\n Network,\n WalletState,\n WalletType,\n detectInstallLink,\n WalletInfo,\n WalletTypes,\n Networks,\n} from '@rango-dev/wallets-shared';\n\nimport {\n WalletInfo as ModalWalletInfo,\n WalletState as WalletStatus,\n SelectableWallet,\n} from '@rango-dev/ui';\nimport {\n BestRouteResponse,\n BlockchainMeta,\n Token,\n WalletDetail,\n} from 'rango-sdk';\nimport { isCosmosBlockchain } from 'rango-types';\nimport { readAccountAddress } from '@rango-dev/wallets-react';\nimport { ConnectedWallet, TokenBalance } from '../store/wallets';\nimport { numberToString } from './numbers';\nimport BigNumber from 'bignumber.js';\nimport { TokenWithBalance } from '../pages/SelectTokenPage';\nimport { ZERO } from '../constants/numbers';\nimport { Wallet } from '../types';\n\nexport function getStateWallet(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 const excludedWallets = [WalletTypes.LEAP];\n\nexport function getlistWallet(\n getState: (type: WalletType) => WalletState,\n getWalletInfo: (type: WalletType) => WalletInfo,\n list: WalletType[]\n): ModalWalletInfo[] {\n return list\n .filter((wallet) => !excludedWallets.includes(wallet as WalletTypes))\n .map((type) => {\n const {\n name,\n img: image,\n installLink,\n showOnMobile,\n } = getWalletInfo(type);\n const state = getStateWallet(getState(type));\n return {\n name,\n image,\n installLink: detectInstallLink(installLink),\n state,\n type,\n showOnMobile: typeof showOnMobile === 'undefined' ? false : true,\n };\n });\n}\n\nexport function walletAndSupportedChainsNames(\n supportedChains: BlockchainMeta[]\n): Network[] | null {\n if (!supportedChains) return null;\n let walletAndSupportedChainsNames: Network[] = [];\n walletAndSupportedChainsNames = supportedChains.map(\n (blockchainMeta) => blockchainMeta.name\n );\n\n return walletAndSupportedChainsNames;\n}\n\nexport function prepareAccountsForWalletStore(\n wallet: WalletType,\n accounts: string[],\n evmBasedChains: string[],\n supportedChainNames: Network[] | null\n): Wallet[] {\n const result: Wallet[] = [];\n\n function addAccount(network: Network, address: string) {\n const accountForChainAlreadyExists = !!result.find(\n (account) => account.chain === network\n );\n if (!accountForChainAlreadyExists) {\n const newAccount: Wallet = {\n address,\n chain: network,\n walletType: wallet,\n };\n\n result.push(newAccount);\n }\n }\n\n const supportedChains = supportedChainNames || [];\n\n accounts.forEach((account) => {\n const { address, network } = readAccountAddress(account);\n\n const hasLimitation = supportedChains.length > 0;\n const isSupported = supportedChains.includes(network);\n const isUnknown = network === Networks.Unknown;\n const notSupportedNetworkByWallet =\n hasLimitation && !isSupported && !isUnknown;\n\n // Here we check given `network` is not supported by wallet\n // And also the network is known.\n if (notSupportedNetworkByWallet) return;\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 netwrok when the uknown network is evem.\n // Otherwise, we stop executing this function.\n const isUknownAndEvmBased =\n network === Networks.Unknown && isEvmAddress(address);\n if (isUnknown && !isUknownAndEvmBased) return;\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 || isUknownAndEvmBased) {\n // all evm chains are not supported in wallets, so we are adding\n // only to those that are supported by wallet.\n const evmChainsSupportedByWallet = supportedChains.filter((chain) =>\n evmBasedChains.includes(chain)\n );\n\n evmChainsSupportedByWallet.forEach((network) => {\n // EVM addresses are not case sensetive.\n // Some wallets like Binance-chain return some letters in uppercase which produces bugs in our wallet state.\n addAccount(network, address.toLowerCase());\n });\n } else {\n addAccount(network, address);\n }\n });\n\n return result;\n}\n\nexport function getRequiredChains(route: BestRouteResponse | null) {\n const wallets: string[] = [];\n\n route?.result?.swaps.forEach((swap) => {\n const currentStepFromBlockchain = swap.from.blockchain;\n const currentStepToBlockchain = swap.to.blockchain;\n if (!wallets.includes(currentStepFromBlockchain)) {\n wallets.push(currentStepFromBlockchain);\n }\n if (!wallets.includes(currentStepToBlockchain)) {\n wallets.push(currentStepToBlockchain);\n }\n\n // Check if internalSwaps array exists\n if (swap.internalSwaps && Array.isArray(swap.internalSwaps)) {\n swap.internalSwaps.forEach((internalSwap) => {\n const internalStepFromBlockchain = internalSwap.from.blockchain;\n const internalStepToBlockchain = internalSwap.to.blockchain;\n if (!wallets.includes(internalStepFromBlockchain)) {\n wallets.push(internalStepFromBlockchain);\n }\n if (!wallets.includes(internalStepToBlockchain)) {\n wallets.push(internalStepToBlockchain);\n }\n });\n }\n });\n return wallets;\n}\n\ntype Blockchain = { name: string; accounts: ConnectedWallet[] };\n\nexport function getSelectableWallets(\n connectedWallets: ConnectedWallet[],\n selectedWallets: Wallet[],\n getWalletInfo: (type: WalletType) => WalletInfo,\n destinationChain?: string\n): SelectableWallet[] {\n const selectableWallets = connectedWallets.map(\n (connectedWallet: ConnectedWallet) => {\n return {\n address: connectedWallet.address,\n walletType: connectedWallet.walletType,\n chain: connectedWallet.chain,\n image: getWalletInfo(connectedWallet.walletType).img,\n name: getWalletInfo(connectedWallet.walletType).name,\n selected:\n destinationChain === connectedWallet.chain\n ? false\n : !!selectedWallets.find(\n (selectedWallet) =>\n selectedWallet.chain === connectedWallet.chain &&\n selectedWallet.walletType === connectedWallet.walletType\n ),\n };\n }\n );\n\n return selectableWallets;\n}\n\nexport function getBalanceFromWallet(\n connectedWallets: ConnectedWallet[],\n chain: string,\n symbol: string,\n address: string | null\n): TokenBalance | null {\n if (connectedWallets.length === 0) return null;\n\n const selectedChainWallets = connectedWallets.filter(\n (wallet) => wallet.chain === chain\n );\n if (selectedChainWallets.length === 0) return null;\n\n return (\n selectedChainWallets\n .map(\n (wallet) =>\n wallet.balances?.find(\n (balance) =>\n (address !== null && balance.address === address) ||\n (address === null &&\n balance.address === address &&\n balance.symbol === symbol)\n ) || null\n )\n .filter((balance) => balance !== null)\n .sort(\n (a, b) => parseFloat(b?.amount || '0') - parseFloat(a?.amount || '1')\n )\n .find(() => true) || null\n );\n}\n\nexport function isAccountAndWalletMatched(\n account: Wallet,\n connectedWallet: ConnectedWallet\n) {\n return (\n account.address === connectedWallet.address &&\n account.chain === connectedWallet.chain &&\n account.walletType === connectedWallet.walletType\n );\n}\n\nexport function makeBalanceFor(\n wallet: Wallet,\n retrivedBalance: WalletDetail,\n tokens: Token[]\n): ConnectedWallet {\n const {\n address,\n blockChain: chain,\n explorerUrl,\n balances = [],\n } = retrivedBalance;\n return {\n address,\n chain,\n loading: false,\n error: false,\n explorerUrl,\n walletType: wallet.walletType,\n balances:\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 uniqueBalane: ConnectedWallet[] = connectedWallet?.reduce(\n (acc: ConnectedWallet[], current: ConnectedWallet) => {\n return acc.findIndex(\n (i) => i.address === current.address && i.chain === current.chain\n ) === -1\n ? [...acc, current]\n : acc;\n },\n []\n );\n\n const modifiedWalletBlockchains = uniqueBalane?.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 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 numberWithThousandSeperator(total);\n};\n\nfunction numberWithThousandSeperator(number: string | number): string {\n const parts = number.toString().split('.');\n parts[0] = parts[0].replace(/\\B(?=(\\d{3})+(?!\\d))/g, ',');\n return parts.join('.');\n}\n\nexport const sortTokens = (tokens: TokenWithBalance[]): TokenWithBalance[] => {\n const walletConnected = !!tokens.some((token) => token.balance);\n if (!walletConnected) {\n return tokens\n .filter((token) => !token.address)\n .concat(\n tokens.filter((token) => token.address && !token.isSecondaryCoin),\n tokens.filter((token) => token.isSecondaryCoin)\n );\n }\n\n return tokens\n .filter((token) => !!token.balance)\n .sort(\n (tokenA, tokenB) =>\n parseFloat(tokenB.balance?.usdValue || '0') -\n parseFloat(tokenA.balance?.usdValue || '0')\n )\n .concat(\n tokens.filter((token) => !token.balance && !token.isSecondaryCoin),\n tokens.filter((token) => !token.balance && token.isSecondaryCoin)\n );\n};\n\nexport const getUsdPrice = (\n blockchain: string,\n symbol: string,\n address: string | null,\n allTokens: Token[]\n): number | null => {\n const token = allTokens?.find(\n (t) =>\n t.blockchain === blockchain &&\n t.symbol?.toUpperCase() === symbol?.toUpperCase() &&\n t.address === address\n );\n return token?.usdPrice || null;\n};\nexport const isExperimentalChain = (\n blockchains: BlockchainMeta[],\n wallet: string\n): boolean => {\n const cosmosExperimentalChainInfo = getCosmosExperimentalChainInfo(\n Object.entries(blockchains)\n .map(([, blockchainMeta]) => blockchainMeta)\n .filter(isCosmosBlockchain)\n );\n return cosmosExperimentalChainInfo && !!cosmosExperimentalChainInfo[wallet];\n};\n\nexport const getKeplrCompatibleConnectedWallets = (\n selectableWallets: SelectableWallet[]\n): WalletType[] => {\n const connectedWalletTypes = new Set(\n selectableWallets.map((wallet) => {\n return wallet.walletType;\n })\n );\n\n return KEPLR_COMPATIBLE_WALLETS.filter((compatibleWallet) =>\n connectedWalletTypes.has(compatibleWallet)\n );\n};\n\nexport function getTokensWithBalance(\n tokens: TokenWithBalance[],\n connectedWallets: ConnectedWallet[]\n): TokenWithBalance[] {\n return tokens.map(({ balance, ...otherProps }) => {\n const tokenAmount = numberToString(\n new BigNumber(\n getBalanceFromWallet(\n connectedWallets,\n otherProps.blockchain,\n otherProps.symbol,\n otherProps.address\n )?.amount || ZERO\n )\n );\n\n let tokenUsdValue = '';\n if (otherProps.usdPrice)\n tokenUsdValue = numberToString(\n new BigNumber(\n getBalanceFromWallet(\n connectedWallets,\n otherProps.blockchain,\n otherProps.symbol,\n otherProps.address\n )?.amount || ZERO\n ).multipliedBy(otherProps.usdPrice)\n );\n\n return {\n ...otherProps,\n ...(tokenAmount !== '0' && {\n balance: { amount: tokenAmount, usdValue: tokenUsdValue },\n }),\n };\n });\n}\n\nexport function getSortedTokens(\n chain: BlockchainMeta | null,\n tokens: Token[],\n connectedWallets: ConnectedWallet[],\n otherChainTokens: TokenWithBalance[]\n): TokenWithBalance[] {\n const fromChainEqueulsToToChain = chain?.name === otherChainTokens[0]?.name;\n if (fromChainEqueulsToToChain) return otherChainTokens;\n const filteredTokens = tokens.filter(\n (token) => token.blockchain === chain?.name\n );\n return sortTokens(getTokensWithBalance(filteredTokens, connectedWallets));\n}\n\nexport function tokensAreEqual(\n tokenA: Pick<Token, 'blockchain' | 'symbol' | 'address'> | null,\n tokenB: Pick<Token, 'blockchain' | 'symbol' | 'address'> | null\n) {\n return (\n tokenA?.blockchain === tokenB?.blockchain &&\n tokenA?.symbol === tokenB?.symbol &&\n tokenA?.address === tokenB?.address\n );\n}\n\nexport function getDefaultToken(\n sortedTokens: TokenWithBalance[],\n otherToken: TokenWithBalance | null\n): TokenWithBalance {\n let selectedToken: TokenWithBalance;\n const firstToken = sortedTokens[0];\n const secondToken = sortedTokens[1];\n if (sortedTokens.length === 1) selectedToken = firstToken;\n else if (tokensAreEqual(firstToken, otherToken)) selectedToken = secondToken;\n else selectedToken = firstToken;\n return selectedToken;\n}\n\nexport function sortWalletsBasedOnState(\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", "import { SelectableWallet } from '@rango-dev/ui';\nimport { WalletType } from '@rango-dev/wallets-shared';\nimport { create } from 'zustand';\nimport { subscribeWithSelector } from 'zustand/middleware';\nimport { shallow } from 'zustand/shallow';\nimport { httpService } from '../services/httpService';\nimport {\n getRequiredChains,\n getTokensWithBalance,\n isAccountAndWalletMatched,\n makeBalanceFor,\n resetConnectedWalletState,\n sortTokens,\n} from '../utils/wallets';\nimport { useBestRouteStore } from './bestRoute';\nimport { useMetaStore } from './meta';\nimport createSelectors from './selectors';\nimport { Wallet } from '../types';\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 loading: boolean;\n error: boolean;\n explorerUrl: string | null;\n}\n\ninterface WalletsStore {\n connectedWallets: ConnectedWallet[];\n selectedWallets: Wallet[];\n customDestination: string;\n connectWallet: (accounts: Wallet[]) => void;\n disconnectWallet: (walletType: WalletType) => void;\n initSelectedWallets: () => void;\n setSelectedWallet: (wallet: SelectableWallet) => void;\n clearConnectedWallet: () => void;\n getWalletsDetails: (accounts: Wallet[], shouldRetry?: boolean) => void;\n setCustomDestination: (customDestination: string) => void;\n}\n\nexport const useWalletsStore = createSelectors(\n create<WalletsStore>()(\n subscribeWithSelector((set, get) => ({\n connectedWallets: [],\n selectedWallets: [],\n customDestination: '',\n connectWallet: (accounts) => {\n const getWalletsDetails = get().getWalletsDetails;\n set((state) => ({\n connectedWallets: state.connectedWallets\n .filter((wallet) => wallet.walletType !== accounts[0].walletType)\n .concat(\n accounts.map((account) => ({\n balances: [],\n address: account.address,\n chain: account.chain,\n loading: true,\n walletType: account.walletType,\n error: false,\n explorerUrl: null,\n }))\n ),\n }));\n getWalletsDetails(accounts);\n },\n disconnectWallet: (walletType) => {\n set((state) => ({\n connectedWallets: state.connectedWallets.filter(\n (balance) => balance.walletType !== walletType\n ),\n selectedWallets: state.selectedWallets.filter(\n (wallet) => wallet.walletType != walletType\n ),\n }));\n },\n initSelectedWallets: () =>\n set((state) => {\n const requiredChains = getRequiredChains(\n useBestRouteStore.getState().bestRoute\n );\n const connectedWallets = state.connectedWallets;\n const selectedWallets: Wallet[] = [];\n requiredChains.forEach((chain) => {\n const anyWalletSelected = !!state.selectedWallets.find(\n (wallet) => wallet.chain === chain\n );\n\n if (!anyWalletSelected) {\n const firstWalletWithMatchedChain = connectedWallets.find(\n (wallet) => wallet.chain === chain\n );\n if (!!firstWalletWithMatchedChain)\n selectedWallets.push({\n address: firstWalletWithMatchedChain.address,\n chain: firstWalletWithMatchedChain.chain,\n walletType: firstWalletWithMatchedChain.walletType,\n });\n }\n });\n return {\n selectedWallets: state.selectedWallets.concat(selectedWallets),\n };\n }),\n setSelectedWallet: (wallet) =>\n set((state) => ({\n selectedWallets: state.selectedWallets\n .filter((selectedWallet) => selectedWallet.chain !== wallet.chain)\n .concat({\n chain: wallet.chain,\n address: wallet.address,\n walletType: wallet.walletType,\n }),\n })),\n setCustomDestination: (customDestination) =>\n set(() => ({\n customDestination,\n })),\n clearConnectedWallet: () =>\n set(() => ({\n connectedWallets: [],\n selectedWallets: [],\n })),\n getWalletsDetails: async (accounts, shouldRetry = true) => {\n const getWalletsDetails = get().getWalletsDetails;\n const { tokens } = useMetaStore.getState().meta;\n set((state) => ({\n 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 retrivedBalance = response.wallets;\n if (retrivedBalance) {\n set((state) => ({\n connectedWallets: state.connectedWallets.map(\n (connectedWallet) => {\n const matchedAccount = accounts.find((account) =>\n isAccountAndWalletMatched(account, connectedWallet)\n );\n const retrivedBalanceAccount = retrivedBalance.find(\n (balance) =>\n balance.address === connectedWallet.address &&\n balance.blockChain === connectedWallet.chain\n );\n if (\n retrivedBalanceAccount?.failed &&\n matchedAccount &&\n shouldRetry\n ) {\n getWalletsDetails([matchedAccount], false);\n }\n return matchedAccount && retrivedBalanceAccount\n ? makeBalanceFor(\n matchedAccount,\n retrivedBalanceAccount,\n tokens\n )\n : connectedWallet;\n }\n ),\n }));\n } else throw new Error('Wallet not found');\n } catch (error) {\n set((state) => ({\n connectedWallets: state.connectedWallets.map((balance) => {\n return accounts.find((account) =>\n isAccountAndWalletMatched(account, balance)\n )\n ? resetConnectedWalletState(balance)\n : balance;\n }),\n }));\n }\n },\n }))\n )\n);\n\nuseWalletsStore.subscribe(\n (state) => state.connectedWallets,\n (connectedWallets) => {\n useBestRouteStore.setState(({ sourceTokens, destinationTokens }) => {\n const sourceTokensWithBalance = getTokensWithBalance(\n sourceTokens,\n connectedWallets\n );\n const destinationTokensWithBalance = getTokensWithBalance(\n destinationTokens,\n connectedWallets\n );\n return {\n sourceTokens: sortTokens(sourceTokensWithBalance),\n destinationTokens: sortTokens(destinationTokensWithBalance),\n };\n });\n },\n {\n equalityFn: shallow,\n }\n);\n\nexport const fetchingBalanceSelector = (state: WalletsStore) =>\n !!state.connectedWallets.find((wallet) => wallet.loading);\n", "export const navigationRoutes = {\n home: '/',\n fromChain: 'from-chain',\n fromToken: 'from-token',\n toChain: 'to-chain',\n toToken: 'to-token',\n settings: 'settings',\n liquiditySources: '/settings/liquidity-sources',\n swaps: 'swaps',\n wallets: 'wallets',\n confirmSwap: 'confirm-swap',\n swapDetails: 'swaps/:requestId',\n};\n", "import { create } from 'zustand';\nimport createSelectors from './selectors';\n\ninterface UiState {\n connectWalletsButtonDisabled: boolean;\n selectedSwapRequestId: string | null;\n currentPage: string;\n toggleConnectWalletsButton: () => void;\n setSelectedSwap: (requestId: string | null) => void;\n setCurrentPage: (path: string) => void;\n}\n\nexport const useUiStore = createSelectors(\n create<UiState>()((set) => ({\n connectWalletsButtonDisabled: false,\n selectedSwapRequestId: null,\n currentPage: '',\n toggleConnectWalletsButton: () =>\n set((state) => ({\n connectWalletsButtonDisabled: !state.connectWalletsButtonDisabled,\n })),\n setSelectedSwap: (requestId) => set({ selectedSwapRequestId: requestId }),\n setCurrentPage: (path) => set({ currentPage: path }),\n }))\n);\n", "import React, { useEffect } from 'react';\nimport { useNavigate } from 'react-router-dom';\nimport { HeaderLayout } from '@rango-dev/ui';\nimport { useWallets } from '@rango-dev/wallets-react';\nimport { navigationRoutes } from '../constants/navigationRoutes';\nimport { useUiStore } from '../store/ui';\nimport { AppRoutes } from './AppRoutes';\nimport { fetchingBalanceSelector, useWalletsStore } from '../store/wallets';\nimport {\n calculateWalletUsdValue,\n getSelectableWallets,\n tokensAreEqual,\n} from '../utils/wallets';\nimport { removeDuplicateFrom } from '../utils/common';\nimport { WidgetConfig } from '../types';\nimport { useBestRouteStore } from '../store/bestRoute';\nimport { useMetaStore } from '../store/meta';\nimport { useSettingsStore } from '../store/settings';\n\nexport type LayoutProps = {\n config?: WidgetConfig;\n};\n\nexport function Layout({ config }: LayoutProps) {\n const navigate = useNavigate();\n const { connectedWallets, selectedWallets } = useWalletsStore();\n const { getWalletInfo } = useWallets();\n const connectedWalletsImages = removeDuplicateFrom(\n getSelectableWallets(connectedWallets, selectedWallets, getWalletInfo).map(\n (w) => w.image\n )\n );\n const { blockchains, tokens } = useMetaStore.use.meta();\n const setFromChain = useBestRouteStore.use.setFromChain();\n const setFromToken = useBestRouteStore.use.setFromToken();\n const setToChain = useBestRouteStore.use.setToChain();\n const setToToken = useBestRouteStore.use.setToToken();\n const setInputAmount = useBestRouteStore.use.setInputAmount();\n const setAffiliateRef = useSettingsStore.use.setAffiliateRef();\n const setAffiliatePercent = useSettingsStore.use.setAffiliatePercent();\n const setAffiliateWallets = useSettingsStore.use.setAffiliateWallets();\n\n const totalBalance = calculateWalletUsdValue(connectedWallets);\n const connectWalletsButtonDisabled =\n useUiStore.use.connectWalletsButtonDisabled();\n const loadingMetaStatus = useMetaStore.use.loadingStatus();\n const fetchingBalance = useWalletsStore(fetchingBalanceSelector);\n\n useEffect(() => {\n if (loadingMetaStatus === 'success') {\n const chain = blockchains.find(\n (chain) => chain.name === config?.to?.blockchain\n );\n const token = tokens.find((t) =>\n tokensAreEqual(t, config?.to?.token || null)\n );\n setToChain(chain || null);\n setToToken(token || null);\n }\n }, [config?.to?.token, config?.to?.blockchain, loadingMetaStatus]);\n\n useEffect(() => {\n setInputAmount(config?.amount?.toString() || '');\n }, [config?.amount]);\n\n useEffect(() => {\n if (loadingMetaStatus === 'success') {\n const chain = blockchains.find(\n (chain) => chain.name === config?.from?.blockchain\n );\n const token = tokens.find((t) =>\n tokensAreEqual(t, config?.from?.token || null)\n );\n\n setFromChain(chain || null);\n setFromToken(token || null);\n }\n }, [config?.from?.token, config?.from?.blockchain, loadingMetaStatus]);\n\n useEffect(() => {\n setAffiliateRef(config?.affiliate?.ref ?? null);\n setAffiliatePercent(config?.affiliate?.percent ?? null);\n setAffiliateWallets(config?.affiliate?.wallets ?? null);\n }, [\n config?.affiliate?.ref,\n config?.affiliate?.percent,\n config?.affiliate?.wallets,\n ]);\n\n return (\n <>\n <HeaderLayout\n loadingStatus={loadingMetaStatus}\n connectedWalletsImages={connectedWalletsImages}\n connectedWallets={connectedWallets}\n totalBalance={totalBalance}\n fetchingBalance={fetchingBalance}\n onClick={() => {\n if (!connectWalletsButtonDisabled) navigate(navigationRoutes.wallets);\n }}>\n <AppRoutes config={config} />\n </HeaderLayout>\n </>\n );\n}\n", "import React from 'react';\nimport { useRoutes } from 'react-router-dom';\nimport { navigationRoutes } from '../constants/navigationRoutes';\nimport { ConfirmSwapPage } from '../pages/ConfirmSwapPage';\nimport { HistoryPage } from '../pages/HistoryPage';\nimport { Home } from '../pages/Home';\nimport { LiquiditySourcePage } from '../pages/LiquiditySourcesPage';\nimport { SelectChainPage } from '../pages/SelectChainPage';\nimport { SelectTokenPage } from '../pages/SelectTokenPage';\nimport { SettingsPage } from '../pages/SettingsPage';\nimport { WalletsPage } from '../pages/WalletsPage';\nimport { SwapDetailsPage } from '../pages/SwapDetailsPage';\nimport { WidgetConfig } from '../types';\n\nconst getAbsolutePath = (path: string) => path.replace('/', '');\n\ninterface PropTypes {\n config?: WidgetConfig;\n}\n\nexport function AppRoutes(props: PropTypes) {\n const { config } = props;\n\n return useRoutes([\n {\n path: navigationRoutes.home,\n element: <Home />,\n },\n {\n path: navigationRoutes.fromChain,\n element: (\n <SelectChainPage\n type=\"from\"\n supportedChains={config?.from?.blockchains}\n />\n ),\n },\n {\n path: navigationRoutes.toChain,\n element: (\n <SelectChainPage type=\"to\" supportedChains={config?.to?.blockchains} />\n ),\n },\n {\n path: navigationRoutes.fromToken,\n element: (\n <SelectTokenPage type=\"from\" supportedTokens={config?.from?.tokens} />\n ),\n },\n {\n path: navigationRoutes.toToken,\n element: (\n <SelectTokenPage type=\"to\" supportedTokens={config?.to?.tokens} />\n ),\n },\n {\n path: navigationRoutes.settings,\n element: (\n <SettingsPage\n singleTheme={config?.theme?.singleTheme}\n supportedSwappers={config?.liquiditySources}\n />\n ),\n },\n {\n path: navigationRoutes.liquiditySources,\n element: (\n <LiquiditySourcePage supportedSwappers={config?.liquiditySources} />\n ),\n },\n { path: navigationRoutes.swaps, element: <HistoryPage /> },\n {\n path: navigationRoutes.swapDetails,\n element: <SwapDetailsPage />,\n },\n {\n path: navigationRoutes.wallets,\n element: (\n <WalletsPage\n supportedWallets={config?.wallets}\n multiWallets={\n typeof config?.multiWallets === 'undefined'\n ? true\n : config.multiWallets\n }\n config={config}\n />\n ),\n },\n {\n path: getAbsolutePath(navigationRoutes.confirmSwap),\n element: (\n <ConfirmSwapPage customDestinationEnabled={config?.customDestination} />\n ),\n },\n ]);\n}\n", "import React, { useEffect, useState } from 'react';\nimport { useNavigate } from 'react-router-dom';\nimport { useBestRouteStore } from '../store/bestRoute';\nimport { useWalletsStore } from '../store/wallets';\nimport { useWallets } from '@rango-dev/wallets-react';\nimport { i18n } from '@lingui/core';\nimport { navigationRoutes } from '../constants/navigationRoutes';\nimport {\n getKeplrCompatibleConnectedWallets,\n getRequiredChains,\n getSelectableWallets,\n isExperimentalChain,\n} from '../utils/wallets';\nimport {\n confirmSwapDisabled,\n getPercentageChange,\n getTotalFeeInUsd,\n isValidCustomDestination,\n} from '../utils/swap';\nimport { numberToString } from '../utils/numbers';\nimport { useMetaStore } from '../store/meta';\nimport { WalletType } from '@rango-dev/wallets-shared';\nimport { useNavigateBack } from '../hooks/useNavigateBack';\nimport {\n Divider,\n ConfirmSwap,\n LoadingFailedAlert,\n HighSlippageWarning,\n PercentageChange,\n RoutesOverview,\n TokenPreview,\n} from '@rango-dev/ui';\nimport { useManager } from '@rango-dev/queue-manager-react';\nimport { useConfirmSwap } from '../hooks/useConfirmSwap';\nimport { useSettingsStore } from '../store/settings';\nimport { useUiStore } from '../store/ui';\nimport { ConfirmSwapErrorTypes } from '../types';\nimport { ConfirmSwapErrors } from '../components/ConfirmSwapErrors';\nimport { ConfirmSwapWarnings } from '../components/ConfirmSwapWarnings';\nimport { HIGH_SLIPPAGE } from '../constants/swapSettings';\nimport { getBestRouteStatus } from '../utils/routing';\n\nexport function ConfirmSwapPage({\n customDestinationEnabled,\n}: {\n customDestinationEnabled?: boolean;\n}) {\n const navigate = useNavigate();\n const { navigateBackFrom } = useNavigateBack();\n const bestRoute = useBestRouteStore.use.bestRoute();\n const fetchingBestRoute = useBestRouteStore.use.loading();\n const fetchingBestRouteError = useBestRouteStore.use.error();\n const setSelectedSwap = useUiStore.use.setSelectedSwap();\n const { blockchains, tokens } = useMetaStore.use.meta();\n const loadingMetaStatus = useMetaStore.use.loadingStatus();\n const connectedWallets = useWalletsStore.use.connectedWallets();\n const selectedWallets = useWalletsStore.use.selectedWallets();\n const customDestination = useWalletsStore.use.customDestination();\n const setCustomDestination = useWalletsStore.use.setCustomDestination();\n const initSelectedWallets = useWalletsStore.use.initSelectedWallets();\n const setSelectedWallet = useWalletsStore.use.setSelectedWallet();\n const slippage = useSettingsStore.use.slippage();\n const customSlippage = useSettingsStore.use.customSlippage();\n const inputUsdValue = useBestRouteStore.use.inputUsdValue();\n const outputUsdValue = useBestRouteStore.use.outputUsdValue();\n const setInputAmount = useBestRouteStore.use.setInputAmount();\n const [dbErrorMessage, setDbErrorMessage] = useState<string>('');\n const bestRouteloadingStatus = getBestRouteStatus(\n fetchingBestRoute,\n !!fetchingBestRouteError\n );\n const [destinationChain, setDestinationChain] = useState<string>('');\n\n const { manager } = useManager();\n const {\n loading: fetchingConfirmedRoute,\n errors,\n warnings,\n confirmSwap,\n } = useConfirmSwap();\n\n const selectedSlippage = customSlippage || slippage;\n\n const showHighSlippageWarning = !errors.find(\n (error) => error.type === ConfirmSwapErrorTypes.INSUFFICIENT_SLIPPAGE\n );\n\n const { getWalletInfo, connect } = useWallets();\n\n const firstStep = bestRoute?.result?.swaps[0];\n const lastStep =\n bestRoute?.result?.swaps[bestRoute?.result?.swaps.length - 1];\n\n const fromAmount = numberToString(firstStep?.fromAmount, 4, 6);\n const toAmount = numberToString(lastStep?.toAmount, 4, 6);\n useEffect(() => {\n initSelectedWallets();\n if (customDestination) {\n setCustomDestination('');\n }\n }, []);\n const lastStepToBlockchain =\n bestRoute?.result?.swaps[bestRoute?.result?.swaps.length - 1].to.blockchain;\n const isWalletRequired = !!bestRoute?.result?.swaps.find(\n (swap) => swap.from.blockchain === lastStepToBlockchain\n );\n\n const selectableWallets = getSelectableWallets(\n connectedWallets,\n selectedWallets,\n getWalletInfo,\n isWalletRequired ? '' : destinationChain\n );\n\n const handleConnectChain = (wallet: string) => {\n const network = wallet;\n getKeplrCompatibleConnectedWallets(selectableWallets).forEach(\n (compatibleWallet: WalletType) => connect?.(compatibleWallet, network)\n );\n };\n\n const totalFeeInUsd = getTotalFeeInUsd(bestRoute, tokens);\n\n const percentageChange =\n !inputUsdValue || !outputUsdValue || !outputUsdValue.gt(0)\n ? null\n : getPercentageChange(\n inputUsdValue.toNumber(),\n outputUsdValue.toNumber()\n );\n\n return (\n <ConfirmSwap\n requiredWallets={getRequiredChains(bestRoute)}\n selectableWallets={selectableWallets}\n setCustomDestination={setCustomDestination}\n customDestination={customDestination}\n customDestinationEnabled={customDestinationEnabled}\n isValidCustomDestination={isValidCustomDestination}\n checkedDestination={!!destinationChain}\n setDestinationChain={setDestinationChain}\n onBack={navigateBackFrom.bind(null, navigationRoutes.confirmSwap)}\n onConfirm={async () => {\n confirmSwap?.().then(async (swap) => {\n if (swap) {\n try {\n await manager?.create(\n 'swap',\n { swapDetails: swap },\n { id: swap.requestId }\n );\n setSelectedSwap(swap.requestId);\n navigate('/' + navigationRoutes.swaps + `/${swap.requestId}`, {\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 isWalletRequired={isWalletRequired}\n onChange={(wallet) => setSelectedWallet(wallet)}\n confirmDisabled={\n loadingMetaStatus !== 'success' ||\n confirmSwapDisabled(\n fetchingBestRoute,\n destinationChain,\n customDestination,\n bestRoute,\n selectableWallets\n )\n }\n handleConnectChain={(wallet) => handleConnectChain(wallet)}\n isExperimentalChain={(wallet) =>\n getKeplrCompatibleConnectedWallets(selectableWallets).length > 0\n ? isExperimentalChain(blockchains, wallet)\n : false\n }\n previewInputs={\n <>\n <TokenPreview\n chain={{\n displayName: firstStep?.from.blockchain || '',\n logo: firstStep?.from.blockchainLogo || '',\n }}\n token={{\n symbol: firstStep?.from.symbol || '',\n image: firstStep?.from.logo || '',\n }}\n usdValue={inputUsdValue ? numberToString(inputUsdValue) : null}\n amount={fromAmount}\n label={i18n.t('From')}\n loadingStatus={\n loadingMetaStatus !== 'success'\n ? loadingMetaStatus\n : bestRouteloadingStatus\n }\n />\n <Divider size={12} />\n <TokenPreview\n chain={{\n displayName: lastStep?.to.blockchain || '',\n logo: lastStep?.to.blockchainLogo || '',\n }}\n token={{\n symbol: lastStep?.to.symbol || '',\n image: lastStep?.to.logo || '',\n }}\n usdValue={outputUsdValue ? numberToString(outputUsdValue) : null}\n amount={toAmount}\n label={i18n.t('To')}\n loadingStatus={\n loadingMetaStatus !== 'success'\n ? loadingMetaStatus\n : bestRouteloadingStatus\n }\n percentageChange={\n !percentageChange ? null : (\n <PercentageChange\n percentageChange={numberToString(percentageChange, 0, 2)}\n showPercentageChange={!!percentageChange?.lt(0)}\n />\n )\n }\n />\n </>\n }\n previewRoutes={\n <RoutesOverview\n routes={bestRoute}\n totalFee={numberToString(totalFeeInUsd, 0, 2)}\n />\n }\n loading={fetchingConfirmedRoute}\n errors={\n dbErrorMessage\n ? [dbErrorMessage, ...ConfirmSwapErrors(errors)]\n : ConfirmSwapErrors(errors)\n }\n warnings={ConfirmSwapWarnings(warnings)}\n extraMessages={\n <>\n {loadingMetaStatus === 'failed' && <LoadingFailedAlert />}\n {loadingMetaStatus === 'failed' && showHighSlippageWarning && (\n <Divider />\n )}\n <HighSlippageWarning\n selectedSlippage={selectedSlippage}\n highSlippage={selectedSlippage >= HIGH_SLIPPAGE}\n changeSlippage={() => navigate('/' + navigationRoutes.settings)}\n />\n </>\n }\n confirmButtonTitle={\n warnings.length > 0 || errors.length > 0\n ? `${i18n.t('Proceed anyway!')}`\n : `${i18n.t('Confirm swap!')}`\n }\n />\n );\n}\n", "import { useInRouterContext, useNavigate } from 'react-router-dom';\nimport { navigationRoutes } from '../constants/navigationRoutes';\n\nexport function useNavigateBack() {\n const isRouterInContext = useInRouterContext();\n const navigate = useNavigate();\n\n navigationRoutes;\n\n const navigateBackFrom = (currentRoute: string) => {\n if (currentRoute === navigationRoutes.swapDetails)\n return navigate('/' + navigationRoutes.swaps, { replace: true });\n\n if (\n !isRouterInContext ||\n (window.history.state && window.history.state.idx > 0)\n )\n navigate(-1);\n else {\n if (\n [\n navigationRoutes.fromChain,\n navigationRoutes.fromToken,\n navigationRoutes.toChain,\n navigationRoutes.toToken,\n navigationRoutes.settings,\n navigationRoutes.wallets,\n navigationRoutes.swaps,\n navigationRoutes.confirmSwap,\n ].includes(currentRoute)\n )\n navigate(navigationRoutes.home, { replace: true });\n else if (currentRoute === navigationRoutes.liquiditySources)\n navigate('/' + navigationRoutes.settings, { replace: true });\n }\n };\n\n return { navigateBackFrom };\n}\n", "import { useEffect, useRef, useState } from 'react';\nimport { useBestRouteStore } from '../store/bestRoute';\nimport { useMetaStore } from '../store/meta';\nimport { useSettingsStore } from '../store/settings';\nimport { useWalletsStore } from '../store/wallets';\nimport {\n ConfirmSwapError,\n ConfirmSwapErrorTypes,\n ConfirmSwapWarningTypes,\n ConfirmSwapWarnings,\n PendingSwapSettings,\n} from '../types';\n\nimport {\n createBestRouteRequestBody,\n getBalanceWarnings,\n getMinRequiredSlippage,\n getOutputRatio,\n getPercentageChange,\n getRouteOutputAmount,\n getWalletsForNewSwap,\n hasProperSlippage,\n isOutputAmountChangedALot,\n outputRatioHasWarning,\n} from '../utils/swap';\nimport { httpService } from '../services/httpService';\nimport BigNumber from 'bignumber.js';\nimport {\n isNumberOfSwapsChanged,\n isRouteChanged,\n isRouteInternalCoinsUpdated,\n isRouteSwappersUpdated,\n} from '../utils/routing';\nimport { numberToString } from '../utils/numbers';\nimport { BestRouteResponse } from 'rango-sdk';\nimport {\n calculatePendingSwap,\n PendingSwap,\n} from '@rango-dev/queue-manager-rango-preset';\n\ntype ConfirmSwap = {\n loading: boolean;\n errors: ConfirmSwapError[];\n warnings: ConfirmSwapWarnings[];\n confirmSwap: (() => Promise<PendingSwap | undefined>) | null;\n};\n\nexport function useConfirmSwap(): ConfirmSwap {\n const fromToken = useBestRouteStore.use.fromToken();\n const toToken = useBestRouteStore.use.toToken();\n const inputAmount = useBestRouteStore.use.inputAmount();\n const initialRoute = useBestRouteStore.use.bestRoute();\n const setBestRoute = useBestRouteStore.use.setBestRoute();\n const inputUsdValue = useBestRouteStore.use.inputUsdValue();\n const affiliateRef = useSettingsStore.use.affiliateRef();\n const affiliatePercent = useSettingsStore.use.affiliatePercent();\n const affiliateWallets = useSettingsStore.use.affiliateWallets();\n\n const connectedWallets = useWalletsStore.use.connectedWallets();\n const destination = useWalletsStore.use.customDestination();\n\n const selectedWallets = useWalletsStore.use.selectedWallets();\n const meta = useMetaStore.use.meta();\n const customSlippage = useSettingsStore.use.customSlippage();\n const slippage = useSettingsStore.use.slippage();\n const disabledLiquiditySources =\n useSettingsStore.use.disabledLiquiditySources();\n const userSlippage = customSlippage || slippage;\n const proceedAnywayRef = useRef(false);\n const confiremedRouteRef = useRef<BestRouteResponse | null>(null);\n const abortControllerRef = useRef<AbortController | null>(null);\n\n const [loading, setLoading] = useState(false);\n const [errors, setErrors] = useState<ConfirmSwapError[]>([]);\n const [warnings, setWarnings] = useState<ConfirmSwapWarnings[]>([]);\n\n useEffect(() => {\n return () => abortControllerRef.current?.abort();\n }, []);\n\n if (!fromToken || !toToken || !inputAmount || !initialRoute)\n return { loading: false, warnings: [], errors: [], confirmSwap: null };\n\n const confirmSwap = async (): Promise<PendingSwap | undefined> => {\n if (proceedAnywayRef.current) {\n const swapSettings: PendingSwapSettings = {\n slippage: userSlippage.toString(),\n disabledSwappersGroups: disabledLiquiditySources,\n };\n\n if (errors.length > 0) setErrors([]);\n if (warnings.length > 0) setWarnings([]);\n proceedAnywayRef.current = false;\n\n if (confiremedRouteRef.current) {\n const newSwap = calculatePendingSwap(\n inputAmount.toString(),\n confiremedRouteRef.current,\n getWalletsForNewSwap(selectedWallets),\n swapSettings,\n false,\n meta\n );\n\n return newSwap;\n }\n return;\n }\n\n abortControllerRef.current = new AbortController();\n\n setLoading(true);\n\n const requestBody = createBestRouteRequestBody(\n fromToken,\n toToken,\n inputAmount,\n connectedWallets,\n selectedWallets,\n disabledLiquiditySources,\n userSlippage,\n affiliateRef,\n affiliatePercent,\n affiliateWallets,\n initialRoute,\n destination\n );\n\n try {\n const confiremedRoute = await httpService().getBestRoute(requestBody, {\n signal: abortControllerRef.current?.signal,\n });\n\n abortControllerRef.current = null;\n\n setLoading(false);\n\n if (\n !confiremedRoute.result ||\n !new BigNumber(confiremedRoute.requestAmount).isEqualTo(\n new BigNumber(inputAmount || '-1')\n )\n ) {\n setErrors((prevState) =>\n prevState.concat({\n type: ConfirmSwapErrorTypes.NO_ROUTE,\n })\n );\n return;\n }\n\n const confirmSwapState: Omit<ConfirmSwap, 'confirmSwap' | 'loading'> = {\n errors: [],\n warnings: [],\n };\n\n const routeChanged = isRouteChanged(initialRoute, confiremedRoute!);\n\n if (routeChanged) {\n setBestRoute(confiremedRoute);\n const newRouteOutputUsdValue = new BigNumber(\n confiremedRoute.result?.outputAmount || '0'\n ).multipliedBy(toToken.usdPrice || 0);\n\n const outputRatio = getOutputRatio(\n inputUsdValue,\n newRouteOutputUsdValue\n );\n const highValueLoss = outputRatioHasWarning(inputUsdValue, outputRatio);\n\n if (highValueLoss)\n confirmSwapState.errors.push({\n type: ConfirmSwapErrorTypes.ROUTE_UPDATED_WITH_HIGH_VALUE_LOSS,\n });\n else if (isOutputAmountChangedALot(initialRoute, confiremedRoute))\n confirmSwapState.warnings.push({\n type: ConfirmSwapWarningTypes.ROUTE_AND_OUTPUT_AMOUNT_UPDATED,\n newOutputAmount: numberToString(\n getRouteOutputAmount(confiremedRoute)\n ),\n percentageChange: numberToString(\n getPercentageChange(\n getRouteOutputAmount(initialRoute),\n getRouteOutputAmount(confiremedRoute)\n ),\n null,\n 2\n ),\n });\n else if (isRouteInternalCoinsUpdated(initialRoute, confiremedRoute))\n confirmSwapState.warnings.push({\n type: ConfirmSwapWarningTypes.ROUTE_COINS_UPDATED,\n });\n else if (isNumberOfSwapsChanged(initialRoute, confiremedRoute))\n confirmSwapState.warnings.push({\n type: ConfirmSwapWarningTypes.ROUTE_UPDATED,\n });\n else if (isRouteSwappersUpdated(initialRoute, confiremedRoute))\n confirmSwapState.warnings.push({\n type: ConfirmSwapWarningTypes.ROUTE_SWAPPERS_UPDATED,\n });\n }\n\n const balanceWarnings = getBalanceWarnings(\n confiremedRoute,\n selectedWallets\n );\n const enoughBalance = balanceWarnings.length === 0;\n\n if (!enoughBalance)\n confirmSwapState.errors.push({\n type: ConfirmSwapErrorTypes.INSUFFICIENT_BALANCE,\n messages: balanceWarnings,\n });\n\n const minRequiredSlippage = getMinRequiredSlippage(initialRoute);\n\n if (!hasProperSlippage(userSlippage.toString(), minRequiredSlippage))\n confirmSwapState.errors.push({\n type: ConfirmSwapErrorTypes.INSUFFICIENT_SLIPPAGE,\n minRequiredSlippage,\n });\n\n const noErrors = confirmSwapState.errors.length === 0;\n const noWarnings = confirmSwapState.warnings.length === 0;\n\n if (\n (noErrors || (!noErrors && proceedAnywayRef.current)) &&\n (noWarnings || (!noWarnings && proceedAnywayRef.current))\n ) {\n const swapSettings: PendingSwapSettings = {\n slippage: userSlippage.toString(),\n disabledSwappersGroups: disabledLiquiditySources,\n };\n\n const newSwap = calculatePendingSwap(\n inputAmount.toString(),\n confiremedRoute,\n getWalletsForNewSwap(selectedWallets),\n swapSettings,\n false,\n meta\n );\n return newSwap;\n } else if (!proceedAnywayRef.current) {\n proceedAnywayRef.current = true;\n setErrors(confirmSwapState.errors);\n setWarnings(confirmSwapState.warnings);\n confiremedRouteRef.current = confiremedRoute;\n }\n return;\n } catch (error) {\n if ((error as any)?.code === 'ERR_CANCELED') {\n return;\n }\n\n const status = (error as any)?.response?.status;\n\n setLoading(false);\n setErrors([\n {\n type: ConfirmSwapErrorTypes.REQUEST_FAILED,\n status,\n },\n ]);\n\n return;\n }\n };\n\n return { loading, warnings, errors, confirmSwap };\n}\n", "import React from 'react';\nimport { BalanceErrors, MinRequiredSlippage } from '@rango-dev/ui';\nimport { ConfirmSwapError, ConfirmSwapErrorTypes } from '../types';\nimport { useNavigate } from 'react-router-dom';\nimport { navigationRoutes } from '../constants/navigationRoutes';\n\nexport function ConfirmSwapErrors(errors: ConfirmSwapError[]) {\n const navigate = useNavigate();\n\n return errors.flatMap((error) => {\n switch (error.type) {\n case ConfirmSwapErrorTypes.NO_ROUTE:\n return 'No routes found. Please try again later.';\n case ConfirmSwapErrorTypes.REQUEST_FAILED:\n return `Failed to confirm swap ${\n error.status ? `'status': ${error.status})` : ''\n }, please try again.`;\n\n case ConfirmSwapErrorTypes.ROUTE_UPDATED_WITH_HIGH_VALUE_LOSS:\n return 'Route updated and price impact is too high, try again later!';\n case ConfirmSwapErrorTypes.INSUFFICIENT_SLIPPAGE:\n return (\n <MinRequiredSlippage\n minRequiredSlippage={error.minRequiredSlippage}\n changeSlippage={() => navigate('/' + navigationRoutes.settings)}\n />\n );\n case ConfirmSwapErrorTypes.INSUFFICIENT_BALANCE:\n return <BalanceErrors messages={error.messages} />;\n default:\n return [];\n }\n });\n}\n", "import {\n ConfirmSwapWarningTypes,\n ConfirmSwapWarnings as ConfirmSwapWarningsType,\n} from '../types';\n\nexport function ConfirmSwapWarnings(warnings: ConfirmSwapWarningsType[]) {\n return warnings.flatMap((warning) => {\n switch (warning.type) {\n case ConfirmSwapWarningTypes.ROUTE_UPDATED:\n return 'Route has been updated.';\n case ConfirmSwapWarningTypes.ROUTE_AND_OUTPUT_AMOUNT_UPDATED:\n return `Output amount changed to ${warning.newOutputAmount} (${warning.percentageChange}% change).`;\n\n case ConfirmSwapWarningTypes.ROUTE_SWAPPERS_UPDATED:\n return 'Route swappers has been updated.';\n case ConfirmSwapWarningTypes.ROUTE_COINS_UPDATED:\n return 'Route internal coins has been updated.';\n default:\n return [];\n }\n });\n}\n", "import { History } from '@rango-dev/ui';\nimport { useManager } from '@rango-dev/queue-manager-react';\nimport React from 'react';\nimport { useNavigate } from 'react-router-dom';\nimport { navigationRoutes } from '../constants/navigationRoutes';\nimport { useNavigateBack } from '../hooks/useNavigateBack';\nimport { getPendingSwaps } from '../utils/queue';\nimport { useUiStore } from '../store/ui';\nimport { groupSwapsByDate } from '../utils/date';\n\nexport function HistoryPage() {\n const setSelectedSwap = useUiStore.use.setSelectedSwap();\n const navigate = useNavigate();\n const { navigateBackFrom } = useNavigateBack();\n const { manager, state } = useManager();\n const pendingSwaps = getPendingSwaps(manager).map(({ swap }) => swap);\n\n const loading = !state.loadedFromPersistor;\n\n return (\n <History\n list={pendingSwaps}\n groupBy={groupSwapsByDate}\n loading={loading}\n onSwapClick={(requestId) => {\n setSelectedSwap(requestId);\n navigate(`${requestId}`, { replace: true });\n }}\n onBack={navigateBackFrom.bind(null, navigationRoutes.swaps)}\n />\n );\n}\n", "import { Manager } from '@rango-dev/queue-manager-core';\nimport {\n PendingSwapWithQueueID,\n SwapStorage,\n} from '@rango-dev/queue-manager-rango-preset';\n\nexport const getPendingSwaps = (manager: Manager | undefined) => {\n const result: PendingSwapWithQueueID[] = [];\n\n manager?.getAll().forEach((q, id) => {\n const storage = q.list.getStorage() as SwapStorage;\n\n if (storage?.swapDetails) {\n result.push({\n id,\n swap: storage?.swapDetails,\n });\n }\n });\n\n return result.sort(\n (a, b) => Number(b.swap.creationTime) - Number(a.swap.creationTime)\n );\n};\n", "import { PendingSwap } from '@rango-dev/queue-manager-rango-preset';\nimport dayjs from 'dayjs';\nimport { GroupBy } from '@rango-dev/ui';\n\nexport const groupSwapsByDate: GroupBy = swaps => {\n const output: Map<\n string,\n {\n title: string;\n swaps: PendingSwap[];\n }\n > = new Map([\n [\n 'today',\n {\n title: 'Today',\n swaps: [],\n },\n ],\n [\n 'week',\n {\n title: 'This week',\n swaps: [],\n },\n ],\n [\n 'month',\n {\n title: 'This month',\n swaps: [],\n },\n ],\n [\n 'year',\n {\n title: 'This year',\n swaps: [],\n },\n ],\n [\n 'history',\n {\n title: 'History',\n swaps: [],\n },\n ],\n ]);\n\n const now = dayjs();\n swaps.forEach(swap => {\n const swapDate = dayjs(Number(swap.creationTime));\n if (now.isSame(swapDate, 'day')) output.get('today')?.swaps.push(swap);\n else if (now.isSame(swapDate, 'week')) 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')) output.get('year')?.swaps.push(swap);\n else output.get('history')?.swaps.push(swap);\n });\n\n return Array.from(output.values());\n};\n", "import React, { useEffect } from 'react';\nimport { useNavigate } from 'react-router-dom';\nimport { HomePanel } from '@rango-dev/ui';\nimport { fetchBestRoute, useBestRouteStore } from '../store/bestRoute';\nimport { SwithFromAndToButton } from '../components/SwitchFromAndTo';\nimport { navigationRoutes } from '../constants/navigationRoutes';\nimport { useMetaStore } from '../store/meta';\nimport { useWalletsStore } from '../store/wallets';\nimport { errorMessages } from '../constants/errors';\nimport {\n getSwapButtonState,\n getOutputRatio,\n hasLimitError,\n outputRatioHasWarning,\n canComputePriceImpact,\n LimitErrorMessage,\n getTotalFeeInUsd,\n hasHighFee,\n getPercentageChange,\n} from '../utils/swap';\nimport { useUiStore } from '../store/ui';\nimport {\n numberToString,\n secondsToString,\n totalArrivalTime,\n} from '../utils/numbers';\nimport { getBalanceFromWallet } from '../utils/wallets';\nimport { getFormatedBestRoute } from '../utils/routing';\nimport BigNumber from 'bignumber.js';\n\nexport function Home() {\n const navigate = useNavigate();\n const fromChain = useBestRouteStore.use.fromChain();\n const fromToken = useBestRouteStore.use.fromToken();\n const toChain = useBestRouteStore.use.toChain();\n const toToken = useBestRouteStore.use.toToken();\n const setInputAmount = useBestRouteStore.use.setInputAmount();\n const inputUsdValue = useBestRouteStore.use.inputUsdValue();\n const inputAmount = useBestRouteStore.use.inputAmount();\n const outputAmount = useBestRouteStore.use.outputAmount();\n const outputUsdValue = useBestRouteStore.use.outputUsdValue();\n const bestRoute = useBestRouteStore.use.bestRoute();\n const tokens = useMetaStore.use.meta().tokens;\n const fetchingBestRoute = useBestRouteStore.use.loading();\n const bestRouteError = useBestRouteStore.use.error();\n const loadingMetaStatus = useMetaStore.use.loadingStatus();\n const connectedWallets = useWalletsStore.use.connectedWallets();\n const setCurrentPage = useUiStore.use.setCurrentPage();\n\n const errorMessage =\n loadingMetaStatus === 'failed'\n ? errorMessages.genericServerError\n : bestRouteError;\n\n const needsToWarnEthOnPath = false;\n\n const showBestRoute =\n !!inputAmount && (!!bestRoute || fetchingBestRoute || !!bestRouteError);\n\n const outToInRatio = getOutputRatio(inputUsdValue, outputUsdValue);\n\n const highValueLoss = outputRatioHasWarning(inputUsdValue, outToInRatio);\n\n const { fromAmountRangeError, recommendation, swap } =\n LimitErrorMessage(bestRoute);\n\n const priceImpactCanNotBeComputed = !canComputePriceImpact(\n bestRoute,\n inputAmount,\n inputUsdValue,\n outputUsdValue\n );\n\n const swapButtonState = getSwapButtonState(\n loadingMetaStatus,\n connectedWallets,\n fetchingBestRoute,\n bestRoute,\n hasLimitError(bestRoute),\n highValueLoss,\n priceImpactCanNotBeComputed,\n needsToWarnEthOnPath,\n inputAmount\n );\n\n const totalFeeInUsd = getTotalFeeInUsd(bestRoute, tokens);\n\n const highFee = hasHighFee(totalFeeInUsd);\n\n const tokenBalance =\n !!fromChain && !!fromToken\n ? numberToString(\n getBalanceFromWallet(\n connectedWallets,\n fromChain?.name,\n fromToken?.symbol,\n fromToken?.address\n )?.amount || '0',\n 8\n )\n : '0';\n\n const tokenBalanceReal =\n !!fromChain && !!fromToken\n ? numberToString(\n getBalanceFromWallet(\n connectedWallets,\n fromChain?.name,\n fromToken?.symbol,\n fromToken?.address\n )?.amount || '0',\n getBalanceFromWallet(\n connectedWallets,\n fromChain?.name,\n fromToken?.symbol,\n fromToken?.address\n )?.decimal\n )\n : '0';\n\n useEffect(() => {\n setCurrentPage(navigationRoutes.home);\n\n return setCurrentPage.bind(null, '');\n }, []);\n\n const percentageChange =\n !inputUsdValue || !outputUsdValue || !outputUsdValue.gt(0)\n ? null\n : getPercentageChange(\n inputUsdValue.toNumber(),\n outputUsdValue.toNumber()\n );\n\n return (\n <HomePanel\n bestRoute={bestRoute}\n bestRouteError={bestRouteError}\n fetchBestRoute={fetchBestRoute}\n onClickHistory={() => navigate(navigationRoutes.swaps)}\n onClickSettings={() => navigate(navigationRoutes.settings)}\n setInputAmount={setInputAmount}\n fromChain={fromChain}\n toChain={toChain}\n fromToken={fromToken}\n toToken={toToken}\n outputAmount={\n outputAmount\n ? numberToString(new BigNumber(outputAmount))\n : numberToString(new BigNumber(0))\n }\n inputAmount={inputAmount}\n loadingStatus={loadingMetaStatus}\n showBestRoute={showBestRoute}\n fetchingBestRoute={fetchingBestRoute}\n outputUsdValue={numberToString(outputUsdValue)}\n inputUsdValue={numberToString(inputUsdValue)}\n swapButtonTitle={swapButtonState.title}\n swapButtonDisabled={swapButtonState.disabled}\n swapButtonClick={() => {\n if (swapButtonState.title === 'Connect Wallet')\n navigate(navigationRoutes.wallets);\n else {\n navigate(navigationRoutes.confirmSwap, { replace: true });\n }\n }}\n onChainClick={(route) => {\n navigate(route);\n }}\n onTokenClick={(route) => {\n navigate(route);\n }}\n highFee={highFee}\n errorMessage={errorMessage}\n hasLimitError={hasLimitError}\n swap={swap}\n fromAmountRangeError={fromAmountRangeError}\n recommendation={recommendation}\n totalFeeInUsd={numberToString(totalFeeInUsd, 0, 2)}\n swithFromAndToComponent={<SwithFromAndToButton />}\n connectedWallets={connectedWallets}\n percentageChange={numberToString(percentageChange, 0, 2)}\n showPercentageChange={!!percentageChange?.lt(0)}\n tokenBalanceReal={tokenBalanceReal}\n tokenBalance={tokenBalance}\n totalTime={secondsToString(totalArrivalTime(bestRoute))}\n bestRouteData={getFormatedBestRoute(bestRoute)}\n swapFromAmount={numberToString(swap?.fromAmount || null)}\n />\n );\n}\n", "import React, { useEffect, useRef, useState } from 'react';\nimport { useInRouterContext, useSearchParams } from 'react-router-dom';\nimport { styled, Button, VerticalSwapIcon } from '@rango-dev/ui';\nimport { SearchParams } from '../constants/searchParams';\nimport { useBestRouteStore } from '../store/bestRoute';\n\nfunction SwithFromAndTo({ count }: { count: number }) {\n const firstRender = useRef(true);\n const [searchParams, setSearchParams] = useSearchParams();\n const outputAmount = useBestRouteStore.use.outputAmount();\n\n useEffect(() => {\n if (!firstRender.current) {\n const fromChainString = searchParams.get(SearchParams.FROM_CHAIN);\n const fromTokenString = searchParams.get(SearchParams.FROM_TOKEN);\n const toChainString = searchParams.get(SearchParams.TO_CHAIN);\n const toTokenString = searchParams.get(SearchParams.TO_TOKEN);\n setSearchParams({\n ...(toChainString && { [SearchParams.FROM_CHAIN]: toChainString }),\n ...(toTokenString && { [SearchParams.FROM_TOKEN]: toTokenString }),\n ...(fromChainString && { [SearchParams.TO_CHAIN]: fromChainString }),\n ...(fromTokenString && { [SearchParams.TO_TOKEN]: fromTokenString }),\n ...(outputAmount && {\n [SearchParams.FROM_AMOUNT]: outputAmount.toString(),\n }),\n });\n } else {\n firstRender.current = false;\n }\n }, [count]);\n\n return null;\n}\n\nconst SwitchButtonContainer = styled('div', {\n position: 'absolute',\n bottom: '-12px',\n left: '50%',\n transform: 'translate(-50%, 10%)',\n});\n\nexport function SwithFromAndToButton() {\n const switchFromAndTo = useBestRouteStore.use.switchFromAndTo();\n const isRouterInContext = useInRouterContext();\n const [count, setCount] = useState(0);\n\n return (\n <SwitchButtonContainer>\n <Button\n variant=\"ghost\"\n onClick={() => {\n switchFromAndTo();\n setCount((prev) => prev + 1);\n }}>\n <VerticalSwapIcon size={32} />\n {isRouterInContext && <SwithFromAndTo count={count} />}\n </Button>\n </SwitchButtonContainer>\n );\n}\n", "export const errorMessages = {\n genericServerError: 'Error connecting server, please reload the app and try again',\n};\n", "import { LiquiditySourcesSelector } from '@rango-dev/ui';\nimport React from 'react';\nimport { navigationRoutes } from '../constants/navigationRoutes';\nimport { useNavigateBack } from '../hooks/useNavigateBack';\nimport { useMetaStore } from '../store/meta';\nimport { useSettingsStore } from '../store/settings';\nimport { removeDuplicateFrom } from '../utils/common';\ninterface PropTypes {\n supportedSwappers?: string[];\n}\nexport function LiquiditySourcePage({ supportedSwappers }: PropTypes) {\n const swappers = useMetaStore.use.meta().swappers;\n const loadingMetaStatus = useMetaStore.use.loadingStatus();\n const toggleLiquiditySource = useSettingsStore.use.toggleLiquiditySource();\n const disabledLiquiditySources =\n useSettingsStore.use.disabledLiquiditySources();\n const toggleAllLiquiditySources =\n useSettingsStore.use.toggleAllLiquiditySources();\n\n const { navigateBackFrom } = useNavigateBack();\n\n const uniqueSwappersGroups: Array<{\n title: string;\n logo: string;\n type: 'BRIDGE' | 'AGGREGATOR' | 'DEX';\n selected: boolean;\n }> = [];\n removeDuplicateFrom(swappers.map((s) => s.swapperGroup))\n .map((swapperGroup) => {\n return swappers.find((s) => s.swapperGroup === swapperGroup);\n })\n .find((s) => {\n if (s) {\n for (const type of s.types) {\n uniqueSwappersGroups.push({\n title: s.swapperGroup,\n logo: s.logo,\n type,\n selected: !disabledLiquiditySources.includes(s.swapperGroup),\n });\n }\n }\n });\n\n return (\n <LiquiditySourcesSelector\n toggleAll={toggleAllLiquiditySources}\n list={\n supportedSwappers\n ? uniqueSwappersGroups.filter(\n (item) =>\n supportedSwappers.filter((s) => s === item.title).length > 0\n )\n : uniqueSwappersGroups\n }\n onChange={(liquiditySource) =>\n toggleLiquiditySource(liquiditySource.title)\n }\n onBack={navigateBackFrom.bind(null, navigationRoutes.liquiditySources)}\n loadingStatus={loadingMetaStatus}\n />\n );\n}\n", "import React from 'react';\nimport { BlockchainSelector } from '@rango-dev/ui';\nimport { useBestRouteStore } from '../store/bestRoute';\nimport { useMetaStore } from '../store/meta';\nimport { useNavigateBack } from '../hooks/useNavigateBack';\nimport { navigationRoutes } from '../constants/navigationRoutes';\n\ninterface PropTypes {\n type: 'from' | 'to';\n supportedChains?: string[];\n}\n\nexport function SelectChainPage(props: PropTypes) {\n const { type, supportedChains } = props;\n const blockchains = supportedChains\n ? useMetaStore.use\n .meta()\n .blockchains.filter((chain) => supportedChains.includes(chain.name))\n : useMetaStore.use.meta().blockchains;\n const loadingStatus = useMetaStore.use.loadingStatus();\n const fromChain = useBestRouteStore.use.fromChain();\n const toChain = useBestRouteStore.use.toChain();\n const setFromChain = useBestRouteStore.use.setFromChain();\n const setToChain = useBestRouteStore.use.setToChain();\n\n const { navigateBackFrom } = useNavigateBack();\n\n return (\n <BlockchainSelector\n type={type === 'from' ? 'Source' : 'Destination'}\n list={blockchains}\n selected={type === 'from' ? fromChain : toChain}\n loadingStatus={loadingStatus}\n onChange={(chain) => {\n if (type === 'from') setFromChain(chain, true);\n else setToChain(chain, true);\n navigateBackFrom(navigationRoutes.fromChain);\n }}\n onBack={navigateBackFrom.bind(null, navigationRoutes.fromChain)}\n />\n );\n}\n", "import React from 'react';\nimport { TokenSelector } from '@rango-dev/ui';\nimport { useBestRouteStore } from '../store/bestRoute';\nimport { Asset, Token } from 'rango-sdk';\nimport { useNavigateBack } from '../hooks/useNavigateBack';\nimport { navigationRoutes } from '../constants/navigationRoutes';\nimport { tokensAreEqual } from '../utils/wallets';\nimport { useMetaStore } from '../store/meta';\n\ninterface PropTypes {\n type: 'from' | 'to';\n supportedTokens?: Asset[];\n}\n\nexport interface TokenWithBalance extends Token {\n balance?: {\n amount: string;\n usdValue: string;\n };\n}\n\nexport function SelectTokenPage(props: PropTypes) {\n const { navigateBackFrom } = useNavigateBack();\n\n const { type, supportedTokens } = props;\n const sourceTokens = useBestRouteStore.use.sourceTokens();\n const destinationTokens = useBestRouteStore.use.destinationTokens();\n const supportedSourceTokens = supportedTokens\n ? sourceTokens.filter((token) =>\n supportedTokens.some((supportedToken) =>\n tokensAreEqual(supportedToken, token)\n )\n )\n : sourceTokens;\n\n const supportedDestinationTokens = supportedTokens\n ? destinationTokens.filter((token) =>\n supportedTokens.some((supportedToken) =>\n tokensAreEqual(supportedToken, token)\n )\n )\n : destinationTokens;\n\n const fromToken = useBestRouteStore.use.fromToken();\n const toToken = useBestRouteStore.use.toToken();\n const setFromToken = useBestRouteStore.use.setFromToken();\n const setToToken = useBestRouteStore.use.setToToken();\n const loadingMetaStatus = useMetaStore.use.loadingStatus();\n\n return (\n <TokenSelector\n type={type === 'from' ? 'Source' : 'Destination'}\n list={type == 'from' ? supportedSourceTokens : supportedDestinationTokens}\n selected={type === 'from' ? fromToken : toToken}\n onChange={(token) => {\n if (type === 'from') setFromToken(token);\n else setToToken(token);\n navigateBackFrom(navigationRoutes.fromToken);\n }}\n onBack={navigateBackFrom.bind(null, navigationRoutes.fromToken)}\n loadingStatus={loadingMetaStatus}\n />\n );\n}\n", "import React from 'react';\nimport { Settings } from '@rango-dev/ui';\nimport { useSettingsStore } from '../store/settings';\nimport { useMetaStore } from '../store/meta';\nimport { useNavigate } from 'react-router-dom';\nimport { navigationRoutes } from '../constants/navigationRoutes';\nimport { removeDuplicateFrom } from '../utils/common';\nimport {\n MAX_SLIPPAGE,\n MIN_SLIPPGAE,\n SLIPPAGES,\n} from '../constants/swapSettings';\nimport { useNavigateBack } from '../hooks/useNavigateBack';\ninterface PropTypes {\n supportedSwappers?: string[];\n singleTheme?: boolean;\n}\nexport function SettingsPage({ supportedSwappers, singleTheme }: PropTypes) {\n const slippage = useSettingsStore.use.slippage();\n const setSlippage = useSettingsStore.use.setSlippage();\n const disabledLiquiditySources =\n useSettingsStore.use.disabledLiquiditySources();\n const customSlippage = useSettingsStore.use.customSlippage();\n const setCustomSlippage = useSettingsStore.use.setCustomSlippage();\n const theme = useSettingsStore.use.theme();\n const setTheme = useSettingsStore.use.setTheme();\n const swappers = useMetaStore.use.meta().swappers;\n const navigate = useNavigate();\n const { navigateBackFrom } = useNavigateBack();\n\n const infiniteApprove = useSettingsStore.use.infiniteApprove();\n const toggleInfiniteApprove = useSettingsStore.use.toggleInfiniteApprove();\n const loadingMetaStatus = useMetaStore.use.loadingStatus();\n\n const uniqueSwappersGroups: Array<{\n title: string;\n logo: string;\n type: 'BRIDGE' | 'AGGREGATOR' | 'DEX';\n selected: boolean;\n }> = [];\n removeDuplicateFrom(swappers.map((s) => s.swapperGroup))\n .map((swapperGroup) => {\n return swappers.find((s) => s.swapperGroup === swapperGroup);\n })\n .find((s) => {\n if (s) {\n for (const type of s.types) {\n uniqueSwappersGroups.push({\n title: s.swapperGroup,\n logo: s.logo,\n type,\n selected: !disabledLiquiditySources.includes(s.swapperGroup),\n });\n }\n }\n });\n supportedSwappers &&\n uniqueSwappersGroups.filter(\n (item) => supportedSwappers.filter((s) => s === item.title).length > 0\n );\n\n const supportedUniqueSwappersGroups = supportedSwappers\n ? uniqueSwappersGroups.filter(\n (item) => supportedSwappers.filter((s) => s === item.title).length > 0\n )\n : uniqueSwappersGroups;\n\n return (\n <Settings\n slippages={SLIPPAGES}\n selectedSlippage={slippage}\n onSlippageChange={(slippage) => setSlippage(slippage)}\n onLiquiditySourcesClick={() =>\n navigate(navigationRoutes.liquiditySources)\n }\n onBack={navigateBackFrom.bind(null, navigationRoutes.settings)}\n liquiditySources={supportedUniqueSwappersGroups}\n selectedLiquiditySources={supportedUniqueSwappersGroups.filter(\n (s) => s.selected\n )}\n singleTheme={singleTheme}\n customSlippage={customSlippage}\n onCustomSlippageChange={setCustomSlippage}\n minSlippage={MIN_SLIPPGAE}\n maxSlippage={MAX_SLIPPAGE}\n selectedTheme={theme}\n onThemeChange={setTheme}\n infiniteApprove={infiniteApprove}\n toggleInfiniteApprove={toggleInfiniteApprove}\n loadingStatus={loadingMetaStatus}\n />\n );\n}\n", "import {\n Alert,\n SecondaryPage,\n styled,\n Wallet,\n WalletState,\n WalletInfo,\n} from '@rango-dev/ui';\nimport React, { useEffect, useRef, useState } from 'react';\nimport { getlistWallet, sortWalletsBasedOnState } from '../utils/wallets';\nimport {\n WalletType,\n WalletTypes,\n detectMobileScreens,\n} from '@rango-dev/wallets-shared';\nimport { useWallets } from '@rango-dev/wallets-react';\n\nimport { useUiStore } from '../store/ui';\nimport { useNavigateBack } from '../hooks/useNavigateBack';\nimport { navigationRoutes } from '../constants/navigationRoutes';\nimport { i18n } from '@lingui/core';\nimport { useMetaStore } from '../store/meta';\nimport { Spinner } from '@rango-dev/ui';\nimport { LoadingFailedAlert } from '@rango-dev/ui';\nimport { WidgetConfig } from '../types';\nimport { configWalletsToWalletName } from '../utils/providers';\n\ninterface PropTypes {\n supportedWallets: WidgetConfig['wallets'];\n multiWallets: boolean;\n config?: WidgetConfig;\n}\n\nconst ListContainer = styled('div', {\n display: 'grid',\n gap: '.5rem',\n gridTemplateColumns: ' repeat(2, minmax(0, 1fr))',\n alignContent: 'baseline',\n padding: '0.5rem',\n overflowY: 'auto',\n});\n\nconst LoaderContainer = styled('div', {\n display: 'flex',\n justifyContent: 'center',\n width: '100%',\n position: 'absolute',\n top: '50%',\n});\n\nconst AlertContainer = styled('div', {\n paddingBottom: '$16',\n});\n\nconst ALL_SUPPORTED_WALLETS = Object.values(WalletTypes);\n\nexport function WalletsPage({\n supportedWallets,\n multiWallets,\n config,\n}: PropTypes) {\n const { navigateBackFrom } = useNavigateBack();\n const { state, disconnect, getWalletInfo, connect } = useWallets();\n const wallets = getlistWallet(\n state,\n getWalletInfo,\n configWalletsToWalletName(supportedWallets, {\n walletConnectProjectId: config?.walletConnectProjectId,\n }) || ALL_SUPPORTED_WALLETS\n );\n const walletsRef = useRef<WalletInfo[]>();\n\n let sortedWallets = detectMobileScreens()\n ? wallets.filter((wallet) => wallet.showOnMobile)\n : wallets;\n sortedWallets = sortWalletsBasedOnState(sortedWallets);\n const [walletErrorMessage, setWalletErrorMessage] = useState('');\n const toggleConnectWalletsButton =\n useUiStore.use.toggleConnectWalletsButton();\n const loadingMetaStatus = useMetaStore.use.loadingStatus();\n\n const onSelectWallet = async (type: WalletType) => {\n const wallet = state(type);\n try {\n if (walletErrorMessage) setWalletErrorMessage('');\n if (wallet.connected) {\n await disconnect(type);\n } else {\n if (\n !multiWallets &&\n !!wallets.find((w) => w.state === WalletState.CONNECTED)\n ) {\n return;\n }\n await connect(type);\n }\n } catch (e) {\n setWalletErrorMessage('Error: ' + (e as any)?.message);\n }\n };\n const disconnectConnectingWallets = () => {\n const connectingWallets =\n walletsRef.current?.filter(\n (wallet) => wallet.state === WalletState.CONNECTING\n ) || [];\n for (const wallet of connectingWallets) {\n disconnect(wallet.type);\n }\n };\n useEffect(() => {\n toggleConnectWalletsButton();\n return () => {\n disconnectConnectingWallets();\n toggleConnectWalletsButton();\n };\n }, []);\n\n useEffect(() => {\n walletsRef.current = wallets;\n }, [wallets]);\n\n return (\n <SecondaryPage\n title={i18n.t('Select Wallet') || ''}\n textField={false}\n onBack={navigateBackFrom.bind(null, navigationRoutes.wallets)}>\n <>\n {walletErrorMessage && (\n <AlertContainer>\n <Alert type=\"error\" title={walletErrorMessage} />\n </AlertContainer>\n )}\n {loadingMetaStatus === 'loading' && (\n <LoaderContainer className=\"loader\">\n <Spinner size={24} />\n </LoaderContainer>\n )}\n {loadingMetaStatus === 'failed' && <LoadingFailedAlert />}\n <ListContainer>\n {loadingMetaStatus === 'success' &&\n sortedWallets.map((wallet, index) => (\n <Wallet\n {...wallet}\n key={`${index}-${wallet.type}`}\n onClick={onSelectWallet}\n />\n ))}\n </ListContainer>\n </>\n </SecondaryPage>\n );\n}\n", "import { allProviders } from '@rango-dev/provider-all';\nimport { ProviderInterface } from '@rango-dev/wallets-react';\nimport { WidgetConfig } from '../types';\n\nexport interface ProvidersOptions {\n walletConnectProjectId?: WidgetConfig['walletConnectProjectId'];\n}\n\n/**\n *\n * Generate a list of providers by passing a provider name (e.g. metamask) or a custom provider which implemented ProviderInterface.\n * @returns ProviderInterface[] a list of ProviderInterface\n *\n */\nexport function matchAndGenerateProviders(\n providers: WidgetConfig['wallets'],\n options?: ProvidersOptions\n): ProviderInterface[] {\n const all = allProviders({\n walletconnect2: {\n WC_PROJECT_ID: options?.walletConnectProjectId || '',\n },\n });\n\n if (providers) {\n const selectedProviders: ProviderInterface[] = [];\n\n providers.forEach((requestedProvider) => {\n // There are two types of provider we get, the first one is only passing the wallet name\n // then we will match the wallet name with our providers (@rango-dev/provider-*).\n // The second way is passing a custom provider which implemented ProviderInterface.\n if (typeof requestedProvider === 'string') {\n const result: ProviderInterface | undefined = all.find((provider) => {\n return provider.config.type === requestedProvider;\n });\n if (result) {\n selectedProviders.push(result);\n } else {\n console.warn(\n `Couldn't find ${requestedProvider} provider. Please make sure you are passing the correct name.`\n );\n }\n } else {\n // It's a custom provider so we directly push it to the list.\n selectedProviders.push(requestedProvider);\n }\n });\n return selectedProviders;\n }\n\n return all;\n}\n\nexport function configWalletsToWalletName(\n config: WidgetConfig['wallets'],\n options?: ProvidersOptions\n): string[] {\n const providers = matchAndGenerateProviders(config, options);\n const names = providers.map((provider) => {\n return provider.config.type;\n });\n return names;\n}\n", "import React from 'react';\nimport { navigationRoutes } from '../constants/navigationRoutes';\nimport { useManager } from '@rango-dev/queue-manager-react';\nimport { useNavigateBack } from '../hooks/useNavigateBack';\nimport { getPendingSwaps } from '../utils/queue';\nimport {\n SwapHistory,\n useCopyToClipboard,\n SwapDetailsPlaceholder,\n} from '@rango-dev/ui';\nimport { useUiStore } from '../store/ui';\nimport {\n cancelSwap,\n PendingSwapNetworkStatus,\n} from '@rango-dev/queue-manager-rango-preset';\nimport { useWallets } from '@rango-dev/wallets-react';\nimport {\n getCurrentBlockchainOfOrNull,\n getCurrentStep,\n getRelatedWalletOrNull,\n} from '@rango-dev/queue-manager-rango-preset';\nimport { getSwapDate } from '../utils/time';\nimport { useNavigate } from 'react-router-dom';\nimport { useBestRouteStore } from '../store/bestRoute';\nimport {\n getLastConvertedTokenInFailedSwap,\n getSwapMessages,\n isNetworkStatusInWarningState,\n shouldRetrySwap,\n} from '../utils/swap';\nimport { getFormatedPendingSwap } from '../utils/routing';\n\nexport function SwapDetailsPage() {\n const selectedSwapRequestId = useUiStore.use.selectedSwapRequestId();\n const { canSwitchNetworkTo, connect, getWalletInfo } = useWallets();\n const retry = useBestRouteStore.use.retry();\n const navigate = useNavigate();\n const { navigateBackFrom } = useNavigateBack();\n const [isCopied, handleCopy] = useCopyToClipboard(2000);\n const { manager, state } = useManager();\n\n const pendingSwaps = getPendingSwaps(manager);\n const selectedSwap = pendingSwaps.find(\n ({ swap }) => swap.requestId === selectedSwapRequestId\n );\n\n const onCancel = () => {\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion, @typescript-eslint/no-non-null-asserted-optional-chain\n const swap = manager?.get(selectedSwap?.id!);\n if (swap) cancelSwap(swap);\n };\n const swap = selectedSwap?.swap;\n const loading = !state.loadedFromPersistor;\n\n if (!swap)\n return (\n <SwapDetailsPlaceholder\n requestId={selectedSwapRequestId || ''}\n loading={loading}\n onBack={navigateBackFrom.bind(null, navigationRoutes.swapDetails)}\n />\n );\n\n const currentStep = getCurrentStep(swap);\n\n const currentStepBlockchain = currentStep\n ? getCurrentBlockchainOfOrNull(swap, currentStep)\n : null;\n const currentStepWallet = currentStep\n ? getRelatedWalletOrNull(swap, currentStep)\n : null;\n const currentStepNetworkStatus = currentStep?.networkStatus;\n\n const swapMessages = getSwapMessages(swap, currentStep);\n\n const networkWarningState = isNetworkStatusInWarningState(currentStep);\n\n const swapDate = getSwapDate(swap);\n\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 lastConvertedTokenInFailedSwap =\n getLastConvertedTokenInFailedSwap(swap);\n\n return (\n <SwapHistory\n onBack={navigateBackFrom.bind(null, navigationRoutes.swapDetails)}\n /* TODO: It was temporarily removed to find a better solution*/\n /*\n previewInputs={\n <>\n <TokenPreview\n chain={{\n displayName: firstStep?.fromBlockchain || '',\n logo: firstStep?.fromBlockchainLogo || '',\n }}\n token={{\n symbol: firstStep?.fromSymbol || '',\n image: firstStep?.fromLogo || '',\n }}\n amount={fromAmount}\n label={t('From')}\n loadingStatus={'success'}\n />\n <Divider size={12} />\n <TokenPreview\n chain={{\n displayName: lastStep?.toBlockchain || '',\n logo: lastStep?.toBlockchainLogo || '',\n }}\n token={{\n symbol: lastStep?.toSymbol || '',\n image: lastStep?.toLogo || '',\n }}\n amount={toAmount}\n label={t('To')}\n loadingStatus={'success'}\n />\n </>\n }\n */\n pendingSwap={getFormatedPendingSwap(swap)}\n onCopy={handleCopy}\n isCopied={isCopied}\n onCancel={onCancel}\n shortMessage={swapMessages.shortMessage}\n detailedMessage={swapMessages.detailedMessage}\n currentStepBlockchain={currentStepBlockchain || ''}\n switchNetwork={switchNetwork}\n type={\n networkWarningState ? 'warning' : swap.extraMessageSeverity || undefined\n }\n date={swapDate}\n {...(shouldRetry && {\n onRetry: () => {\n retry(swap);\n setTimeout(() => {\n navigate(navigationRoutes.home);\n }, 0);\n },\n })}\n {...(lastConvertedTokenInFailedSwap && {\n lastConvertedTokenInFailedSwap: {\n blockchain: lastConvertedTokenInFailedSwap.blockchain,\n outputAmount: lastConvertedTokenInFailedSwap.outputAmount || '',\n symbol: lastConvertedTokenInFailedSwap.symbol,\n },\n })}\n />\n );\n}\n", "import { PendingSwap } from '@rango-dev/queue-manager-rango-preset';\n\nexport function timeSince(timeMillis: number): string {\n const seconds = Math.floor((new Date().getTime() - timeMillis) / 1000);\n let intervalType: string;\n\n let interval = Math.floor(seconds / 31536000);\n if (interval >= 1) {\n intervalType = 'year';\n } else {\n interval = Math.floor(seconds / 2592000);\n if (interval >= 1) {\n intervalType = 'month';\n } else {\n interval = Math.floor(seconds / 86400);\n if (interval >= 1) {\n intervalType = 'day';\n } else {\n interval = Math.floor(seconds / 3600);\n if (interval >= 1) {\n intervalType = 'hour';\n } else {\n interval = Math.floor(seconds / 60);\n if (interval >= 1) {\n intervalType = 'minute';\n } else {\n interval = seconds;\n intervalType = 'second';\n }\n }\n }\n }\n }\n\n if (interval > 1 || interval === 0) {\n intervalType += 's';\n }\n\n return interval + ' ' + intervalType;\n}\n\nexport function getSwapDate(pendingSwap: PendingSwap) {\n return pendingSwap.finishTime\n ? `${timeSince(parseInt(pendingSwap.finishTime))} ago`\n : `${timeSince(parseInt(pendingSwap.creationTime))} ago`;\n}\n", "import { globalCss } from '@rango-dev/ui';\n\nexport const globalFont = (fontFamily: string) =>\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 body: {\n fontFamily,\n },\n })();\n", "import { createTheme, generateRangeColors } from '@rango-dev/ui';\nimport { useState, useEffect, useLayoutEffect } from 'react';\nimport { useMetaStore } from '../store/meta';\nimport { useSettingsStore } from '../store/settings';\nimport { WidgetTheme } from '../types';\nimport usePrevious from './usePrevious';\n\nexport function useTheme({\n colors: themeColors,\n fontFamily = 'Roboto',\n borderRadius = 8,\n mode = 'auto',\n}: WidgetTheme) {\n const theme = useSettingsStore.use.theme();\n const fetchMeta = useMetaStore.use.fetchMeta();\n const setTheme = useSettingsStore.use.setTheme();\n const light = themeColors?.light;\n const dark = themeColors?.dark;\n const neutral = light?.neutral || '#fafafa';\n const background = light?.background || '#fff';\n const foreground = light?.foreground || '#000';\n\n const darkColors = {\n ...generateRangeColors('primary', 'dark', dark?.primary),\n ...generateRangeColors('error', 'dark', dark?.error),\n ...generateRangeColors('warning', 'dark', dark?.warning),\n ...generateRangeColors('success', 'dark', dark?.success),\n ...generateRangeColors('neutral', 'dark', dark?.neutral),\n surface: dark?.surface,\n background: dark?.background,\n foreground: dark?.foreground,\n };\n\n const lightColors = {\n surface: light?.surface || '#fff',\n ...generateRangeColors('primary', 'light', light?.primary || '#5FA425'),\n ...generateRangeColors('error', 'light', light?.error || '#FF0000'),\n ...generateRangeColors('warning', 'light', light?.warning || '#F5A623'),\n ...generateRangeColors('success', 'light', light?.success || '#0070F3'),\n ...generateRangeColors('neutral', 'light', neutral),\n background,\n foreground,\n };\n\n const customLightTheme = createTheme({\n colors: lightColors,\n radii: {\n 5: `${borderRadius}px`,\n },\n shadows: {\n s: `0px 3px 5px 3px ${light?.neutral || '#f0f2f5'} ,0px 6px 10px 3px ${\n light?.neutral || '#f0f2f5'\n }, 0px 1px 18px 3px ${light?.neutral || '#f0f2f5'}`,\n },\n });\n\n const customDarkTheme = createTheme({\n colors: {\n ...lightColors,\n ...generateRangeColors('neutral', 'dark', '#111111'),\n foreground: background,\n background: foreground,\n surface: '#000',\n ...JSON.parse(JSON.stringify(darkColors)),\n },\n radii: {\n 5: `${borderRadius}px`,\n },\n shadows: {\n s: `0px 3px 5px 3px ${dark?.neutral || '#222'}, 0px 6px 10px 3px ${\n dark?.neutral || '#222'\n }, 0px 1px 18px 3px ${dark?.neutral || '#222'}`,\n },\n });\n const [OSTheme, setOSTheme] = useState('light');\n\n useEffect(() => {\n (async () => {\n await fetchMeta();\n })();\n\n const switchTheme = (event: MediaQueryListEvent) => {\n if (event.matches) setOSTheme('dark');\n else setOSTheme('light');\n };\n\n if (\n window.matchMedia &&\n window.matchMedia('(prefers-color-scheme: dark)').matches\n ) {\n setOSTheme('dark');\n }\n\n window\n .matchMedia('(prefers-color-scheme: dark)')\n .addEventListener('change', switchTheme);\n return () => {\n window\n .matchMedia('(prefers-color-scheme: dark)')\n .removeEventListener('change', switchTheme);\n };\n }, []);\n useEffect(() => {\n if (mode !== 'auto') setTheme(mode);\n }, [mode]);\n const prevFont = usePrevious(fontFamily);\n\n useLayoutEffect(() => {\n const { classList } = document.body;\n\n if (prevFont) classList.remove(`font_${prevFont.replace(/ /g, '')}`);\n classList.add(`font_${fontFamily.replace(/ /g, '')}`);\n }, [fontFamily]);\n\n const getActiveTheme = () => {\n if (theme === 'auto')\n return OSTheme === 'dark' ? customDarkTheme : customLightTheme;\n else return theme === 'dark' ? customDarkTheme : customLightTheme;\n };\n\n return { activeTheme: getActiveTheme() };\n}\n", "import { useEffect, useRef } from 'react';\n\nexport default function usePrevious(value: string) {\n // The ref object is a generic container whose current property is mutable ...\n // ... and can hold any value, similar to an instance property on a class\n const ref = useRef<string>();\n // Store current value in ref\n useEffect(() => {\n ref.current = value;\n }, [value]); // Only re-run if value changes\n // Return previous value (happens before update in useEffect above)\n return ref.current;\n}\n", "import React, { PropsWithChildren, useMemo } from 'react';\nimport { Provider as ManagerProvider } from '@rango-dev/queue-manager-react';\nimport {\n makeQueueDefinition,\n SwapQueueContext,\n checkWaitingForNetworkChange,\n} from '@rango-dev/queue-manager-rango-preset';\nimport { useWallets } from '@rango-dev/wallets-react';\nimport {\n convertEvmBlockchainMetaToEvmChainInfo,\n Network,\n WalletType,\n} from '@rango-dev/wallets-shared';\nimport { useMetaStore } from './store/meta';\nimport { useWalletsStore } from './store/wallets';\nimport { walletAndSupportedChainsNames } from './utils/wallets';\nimport { getConfig } from './utils/configs';\nimport { isEvmBlockchain } from 'rango-types';\n\nfunction QueueManager(props: PropsWithChildren) {\n const {\n providers,\n getSigners,\n state,\n connect,\n canSwitchNetworkTo,\n getWalletInfo,\n } = useWallets();\n\n const swapQueueDef = useMemo(() => {\n return makeQueueDefinition({\n API_KEY: getConfig('API_KEY'),\n });\n }, []);\n\n const { blockchains } = useMetaStore.use.meta();\n const connectedWallets = useWalletsStore.use.connectedWallets();\n\n const wallets = {\n blockchains: connectedWallets.map((wallet) => ({\n accounts: [wallet],\n name: wallet.chain,\n })),\n };\n\n const switchNetwork = (wallet: WalletType, network: Network) => {\n if (!canSwitchNetworkTo(wallet, network)) {\n return undefined;\n }\n return connect(wallet, network);\n };\n\n const isMobileWallet = (walletType: WalletType): boolean =>\n !!getWalletInfo(walletType).mobileWallet;\n\n // TODO: this code copy & pasted from rango, should be refactored.\n const allBlockchains = blockchains\n .filter((blockchain) => blockchain.enabled)\n .reduce(\n (blockchainsObj: any, blockchain) => (\n (blockchainsObj[blockchain.name] = blockchain), blockchainsObj\n ),\n {}\n );\n const evmBasedChains = blockchains.filter(isEvmBlockchain);\n const getSupportedChainNames = (type: WalletType) => {\n const { supportedChains } = getWalletInfo(type);\n return walletAndSupportedChainsNames(supportedChains);\n };\n const allProviders = providers();\n\n const context: SwapQueueContext = {\n meta: {\n blockchains: allBlockchains,\n evmBasedChains: evmBasedChains,\n evmNetworkChainInfo:\n convertEvmBlockchainMetaToEvmChainInfo(evmBasedChains),\n getSupportedChainNames,\n },\n getSigners,\n //todo: remove Network type\n // eslint-disable-next-line @typescript-eslint/ban-ts-comment\n //@ts-ignore\n wallets,\n providers: allProviders,\n switchNetwork,\n canSwitchNetworkTo,\n connect,\n state,\n isMobileWallet,\n };\n\n return (\n <ManagerProvider\n queuesDefs={[swapQueueDef]}\n context={context}\n onPersistedDataLoaded={(manager) => {\n checkWaitingForNetworkChange(manager);\n }}\n isPaused={false}>\n {props.children}\n </ManagerProvider>\n );\n}\n\nexport default QueueManager;\n", "import React, { PropsWithChildren } from 'react';\nimport { useMetaStore } from './store/meta';\nimport { Events, Provider } from '@rango-dev/wallets-react';\nimport type { EventHandler } from '@rango-dev/wallets-react';\nimport { Network } from '@rango-dev/wallets-shared';\nimport {\n prepareAccountsForWalletStore,\n walletAndSupportedChainsNames,\n} from './utils/wallets';\nimport { useWalletsStore } from './store/wallets';\nimport { isEvmBlockchain } from 'rango-sdk';\nimport { useWalletProviders } from './hooks/useWalletProviders';\nimport { WidgetConfig } from './types';\nimport { createContext, useRef } from 'react';\nimport { ProvidersOptions } from './utils/providers';\n\ntype OnConnectHandler = (key: string) => void;\ninterface WidgetContextInterface {\n onConnectWallet(handler: OnConnectHandler): void;\n}\n\nexport const WidgetContext = createContext<WidgetContextInterface>({\n onConnectWallet: () => {\n return;\n },\n});\n\nexport function WidgetWallets(\n props: PropsWithChildren<{\n providers: WidgetConfig['wallets'];\n options?: ProvidersOptions;\n onUpdateState?: EventHandler;\n }>\n) {\n const { blockchains } = useMetaStore.use.meta();\n const { providers } = useWalletProviders(props.providers, props?.options);\n const disconnectWallet = useWalletsStore.use.disconnectWallet();\n const connectWallet = useWalletsStore.use.connectWallet();\n const onConnectWalletHandler = useRef<OnConnectHandler>();\n\n const evmBasedChainNames = blockchains\n .filter(isEvmBlockchain)\n .map((chain) => chain.name);\n\n const onUpdateState: EventHandler = (\n type,\n event,\n value,\n state,\n supportedChains\n ) => {\n if (event === Events.ACCOUNTS) {\n if (value) {\n const supportedChainNames: Network[] | null =\n walletAndSupportedChainsNames(supportedChains);\n const data = prepareAccountsForWalletStore(\n type,\n value,\n evmBasedChainNames,\n supportedChainNames\n );\n connectWallet(data);\n } else {\n disconnectWallet(type);\n }\n }\n if (event === Events.ACCOUNTS && state.connected) {\n const key = `${type}-${state.network}-${value}`;\n\n if (state.connected) {\n if (!!onConnectWalletHandler.current)\n onConnectWalletHandler.current(key);\n else\n console.warn(\n `onConnectWallet handler hasn't been set. Are you sure?`\n );\n }\n }\n\n if (event === Events.NETWORK && state.network) {\n const key = `${type}-${state.network}`;\n if (!!onConnectWalletHandler.current) onConnectWalletHandler.current(key);\n else\n console.warn(`onConnectWallet handler hasn't been set. Are you sure?`);\n }\n\n // propagate updates for Dapps using external wallets\n if (props.onUpdateState) {\n props.onUpdateState(type, event, value, state, supportedChains);\n }\n };\n return (\n <WidgetContext.Provider\n value={{\n onConnectWallet: (handler) => {\n onConnectWalletHandler.current = handler;\n },\n }}>\n <Provider\n allBlockChains={blockchains}\n providers={providers}\n onUpdateState={onUpdateState}\n autoConnect>\n {props.children}\n </Provider>\n </WidgetContext.Provider>\n );\n}\n", "import { ProviderInterface } from '@rango-dev/wallets-react';\nimport { useEffect } from 'react';\nimport { useWalletsStore } from '../store/wallets';\nimport { WidgetConfig } from '../types';\nimport {\n matchAndGenerateProviders,\n ProvidersOptions,\n} from '../utils/providers';\n\nexport function useWalletProviders(\n providers: WidgetConfig['wallets'],\n options?: ProvidersOptions\n) {\n const clearConnectedWallet = useWalletsStore.use.clearConnectedWallet();\n let generateProviders: ProviderInterface[] = matchAndGenerateProviders(\n undefined,\n options\n );\n\n useEffect(() => {\n clearConnectedWallet();\n generateProviders = matchAndGenerateProviders(providers, {\n walletConnectProjectId: options?.walletConnectProjectId,\n });\n }, [providers]);\n\n return {\n providers: generateProviders,\n };\n}\n", "import { useEffect } from 'react';\nimport {\n useEvents,\n MainEvents,\n StepEventType,\n StepExecutionEventStatus,\n isApprovalTX,\n} from '@rango-dev/queue-manager-rango-preset';\nimport { useWalletsStore } from '../store/wallets';\n\nexport function WidgetEvents() {\n const connectedWallets = useWalletsStore.use.connectedWallets();\n const getWalletsDetails = useWalletsStore.use.getWalletsDetails();\n\n const widgetEvents = useEvents();\n\n useEffect(() => {\n widgetEvents.on(MainEvents.StepEvent, (widgetEvent) => {\n const { event, step } = widgetEvent;\n const shouldRefetchBalance =\n (event.type === StepEventType.TX_EXECUTION &&\n event.status === StepExecutionEventStatus.TX_SENT &&\n !isApprovalTX(step)) ||\n event.type === StepEventType.SUCCEEDED;\n\n if (shouldRefetchBalance) {\n const fromAccount = connectedWallets.find(\n (account) => account.chain === step?.fromBlockchain\n );\n const toAccount =\n step?.fromBlockchain !== step?.toBlockchain &&\n connectedWallets.find(\n (wallet) => wallet.chain === step?.toBlockchain\n );\n\n fromAccount && getWalletsDetails([fromAccount]);\n toAccount && getWalletsDetails([toAccount]);\n }\n });\n\n return () => widgetEvents.all.clear();\n }, [widgetEvents, connectedWallets.length]);\n\n return null;\n}\n", "import {\n WidgetTheme,\n WidgetConfig,\n WidgetColors,\n BlockchainAndTokenConfig,\n} from './types';\nimport { WidgetProps, Widget } from './Widget';\nimport { WalletType } from '@rango-dev/wallets-shared';\nimport { WidgetWallets } from './Wallets';\nimport {\n useWallets,\n ProviderInterface,\n EventHandler as HandleWalletsUpdate,\n} from '@rango-dev/wallets-react';\nimport {\n useEvents as useWidgetEvents,\n MainEvents,\n RouteEvent,\n StepEvent,\n Route,\n Step,\n RouteStartedEvent,\n RouteSucceededEvent,\n RouteFailedEvent,\n RouteEventType,\n StepStartedEvent,\n StepSucceededEvent,\n StepFailedEvent,\n StepTxExecutionUpdatedEvent,\n StepTxExecutionBlockedEvent,\n StepCheckStatusEvent,\n StepApprovalTxSucceededEvent,\n StepOutputRevealedEvent,\n StepEventType,\n StepExecutionEventStatus,\n StepExecutionBlockedEventStatus,\n} from '@rango-dev/queue-manager-rango-preset';\n\nexport type {\n WidgetConfig,\n WalletType,\n WidgetTheme,\n WidgetColors,\n ProviderInterface,\n BlockchainAndTokenConfig,\n WidgetProps,\n RouteEvent,\n StepEvent,\n Route,\n Step,\n RouteStartedEvent,\n RouteSucceededEvent,\n RouteFailedEvent,\n StepStartedEvent,\n StepSucceededEvent,\n StepFailedEvent,\n StepTxExecutionUpdatedEvent,\n StepTxExecutionBlockedEvent,\n StepCheckStatusEvent,\n StepApprovalTxSucceededEvent,\n StepOutputRevealedEvent,\n HandleWalletsUpdate,\n};\nexport {\n Widget,\n WidgetWallets,\n useWallets,\n useWidgetEvents,\n MainEvents,\n RouteEventType,\n StepEventType,\n StepExecutionEventStatus,\n StepExecutionBlockedEventStatus,\n};\n"],
5
- "mappings": "iFAAA,OAAS,iBAAAA,GAAe,UAAAC,GAAQ,eAAAC,OAAmB,gBACnD,OAAOC,GAEL,cAAAC,GACA,aAAAC,GACA,WAAAC,GACA,YAAAC,OACK,QCPP,OAAOC,IAAS,YAAAC,OAAmC,QACnD,OAAS,gBAAAC,GAAc,sBAAAC,OAA0B,eACjD,OAAS,mBAAAC,OAAuB,wCCFhC,OAAS,aAAAC,GAAW,UAAAC,OAAc,QAClC,OACE,sBAAAC,GACA,eAAAC,GACA,mBAAAC,OACK,mBCHP,OAAS,UAAAC,OAAc,UACvB,OAAOC,MAAe,eCHtB,OAAOC,OAAe,eAEf,IAAMC,EAAO,IAAID,GAAU,CAAC,ECEnC,OAAOE,OAAe,eCJf,SAASC,EAAuBC,EAAiB,CACtD,OAAO,MAAM,KAAK,IAAI,IAAIA,CAAK,CAAC,CAClC,CAFgBC,EAAAF,EAAA,uBAIT,SAASG,GACdC,EACAC,EACA,CACA,OACED,EAAO,SAAWC,EAAO,QAAUD,EAAO,MAAM,CAACE,EAAGC,IAAMD,IAAMD,EAAOE,CAAC,CAAC,CAE7E,CAPgBL,EAAAC,GAAA,YAWT,SAASK,GAASC,EAAcC,EAAc,CACnD,IAAIC,EACJ,OAAOC,EACP,SAASA,KAAWC,EAAW,CACzBF,GACF,aAAaA,CAAS,EAExBA,EAAY,WAAW,IAAM,CAC3BA,EAAY,KACZF,EAAG,GAAGI,CAAI,CACZ,EAAGH,CAAI,CACT,CACF,CAZgBR,EAAAM,GAAA,YCfhB,OAAS,aAAAM,OAAiB,eAMnB,IAAMC,GAAkBC,EAACC,GAAsB,CACpD,IAAMC,GAAWD,EAAI,IAAI,SAAS,EAAE,SAAS,EAAG,GAAG,EAInD,MAAO,GAHS,UAAUA,EAAI,IAAI,SAAS,CAAC,EACzC,SAAS,EACT,SAAS,EAAG,GAAG,KACGC,GACvB,EAN+B,mBAQlBC,EAAiBH,EAAA,CAC5BI,EACAC,EAA6B,KAC7BC,EAA6B,OAClB,CAEX,GADIF,GAAW,MACXA,IAAW,GAAI,MAAO,GAC1B,IAAM,EAAI,IAAIG,GAAUH,CAAM,EACxBI,EAAe,EACjBC,EAAO,IACX,QAAS,EAAI,EAAG,EAAI,GAAI,IACtB,GAAI,IAAIF,GAAU,EAAE,QAAQ,EAAGC,CAAY,CAAC,EAAE,GAAG,CAAC,EAAG,CACnDC,EAAO,EACP,MAIJ,GAAI,EAAE,IAAI,GAAK,EAAG,OAAO,EAAE,SAAS,EAAGD,CAAY,EASnD,GARI,EAAE,IAAI,GAAI,GAQV,EAAE,IAAI,GAAG,EACX,OAAO,EAAE,SACP,KAAK,IACHC,EACA,KAAK,IAAIH,GAAe,IAAK,KAAK,IAAID,GAAe,EAAG,CAAC,CAAC,CAC5D,EACAG,CACF,EACF,GAAI,EAAE,IAAI,CAAC,EACT,OAAO,EAAE,SACP,KAAK,IACHC,EACA,KAAK,IAAIH,GAAe,IAAK,KAAK,IAAID,GAAe,EAAG,CAAC,CAAC,CAC5D,EACAG,CACF,EACF,GAAI,EAAE,IAAI,GAAI,EACZ,OAAO,EAAE,SACP,KAAK,IACHC,EACA,KAAK,IAAIH,GAAe,IAAK,KAAK,IAAID,GAAe,EAAG,CAAC,CAAC,CAC5D,EACAG,CACF,EACF,QAAS,EAAIH,GAAe,EAAG,EAAI,GAAI,IACrC,GAAI,EAAE,IAAI,KAAK,IAAI,GAAI,CAAC,CAAC,CAAC,EACxB,OAAO,EAAE,SACP,KAAK,IACHI,EACA,KAAK,IAAIH,GAAe,IAAK,KAAK,IAAID,GAAe,EAAG,CAAC,CAAC,CAC5D,EACAG,CACF,EACJ,OAAI,EAAE,UAAU,CAAC,EAAU,IAEpB,EAAE,SACP,KAAK,IAAIC,EAAM,KAAK,IAAIH,GAAe,IAAK,KAAK,IAAID,GAAe,EAAG,CAAC,CAAC,CAAC,EAC1EG,CACF,CACF,EAjE8B,kBAwGvB,IAAME,GAAmBC,EAACC,GAC/BA,GAAM,QAAQ,OAAO,OAAO,CAACC,EAAGC,IAAMD,EAAIC,EAAE,uBAAwB,CAAC,GAAK,EAD5C,oBAezB,IAAMC,GAAmBC,EAACC,GAC/B,CAAC,CAACA,GAAQ,WAAWA,CAAI,EAAI,EADC,oBF1HzB,SAASC,GACdC,EACAC,EACAC,EACc,CACd,OAAKA,GAEHF,EAAO,KAAMG,GAAU,CACrB,IAAMC,EAAmBH,GAAc,MAAM,IAAI,EACjD,OAAIG,GAAkB,SAAW,EAE7BD,EAAM,SAAWC,EAAiB,CAAC,GACnCD,EAAM,UAAY,MAClBA,EAAM,aAAeD,EAAM,KAG7BC,EAAM,SAAWC,IAAmB,CAAC,GACrCD,EAAM,UAAYC,IAAmB,CAAC,GACtCD,EAAM,aAAeD,EAAM,IAE/B,CAAC,GAAK,IAEV,CAtBgBG,EAAAN,GAAA,uBAwBT,SAASO,GACdC,EAC2B,CAC3B,OAAOA,GAAW,QAAQ,MAAMA,GAAW,QAAQ,MAAM,OAAS,CAAC,EAAE,GAClE,QACL,CALgBF,EAAAC,GAAA,+BAOT,SAASE,GACdC,EACAC,EACA,CACA,IAAMC,EAAcF,EAAO,QAAQ,OAAS,CAAC,EACvCG,EAAcF,EAAO,QAAQ,OAAS,CAAC,EAC7C,OAAOC,EAAY,SAAWC,EAAY,MAC5C,CAPgBP,EAAAG,GAAA,0BAST,SAASK,GACdJ,EACAC,EACA,CACA,IAAMI,EACJL,EAAO,QAAQ,MAAM,IAAKM,GAASA,EAAK,SAAS,GAAK,CAAC,EACnDC,EACJN,EAAO,QAAQ,MAAM,IAAKK,GAASA,EAAK,SAAS,GAAK,CAAC,EACzD,MAAO,CAACE,GAASH,EAAgBE,CAAc,CACjD,CATgBX,EAAAQ,GAAA,0BAWT,SAASK,GACdT,EACAC,EACA,CACA,IAAMS,EACJV,EAAO,QAAQ,MAAM,IAAKM,GAASA,EAAK,GAAG,MAAM,GAAK,CAAC,EACnDK,EACJV,EAAO,QAAQ,MAAM,IAAKK,GAASA,EAAK,GAAG,MAAM,GAAK,CAAC,EACzD,MAAO,CAACE,GAASE,EAAqBC,CAAmB,CAC3D,CATgBf,EAAAa,GAAA,+BAWT,SAASG,GACdZ,EACAC,EACS,CACT,OACEF,GAAuBC,EAAQC,CAAM,GACrCG,GAAuBJ,EAAQC,CAAM,GACrCQ,GAA4BT,EAAQC,CAAM,CAE9C,CATgBL,EAAAgB,GAAA,kBAuBT,SAASC,GACdC,EACAC,EACmC,CACnC,GAAIA,IAAQ,KAAM,OAAO,KACzB,IAAMC,EAAmBD,GACrB,KAAME,GAASA,EAAK,aAAeH,EAAe,KAAK,GACvD,QAAQ,KACPI,GACCA,EAAO,SAAS,YAAY,IAAMJ,EAAe,QAAQ,YAAY,CACzE,EACF,OAAKE,EACEA,EAAiB,eADM,IAEhC,CAbgBG,EAAAN,GAAA,8BAeT,SAASO,GAAyBC,EAAiC,CACxE,GAAIA,EAAO,QAAU,YAAa,CAChC,GAAM,CAAE,UAAAC,EAAW,aAAAC,CAAa,EAAIF,EACpC,MACE,CAAC,CAACE,EAAa,WACf,CAAC,CAACA,EAAa,UACdD,EAAU,WAAW,OAASC,EAAa,WAAW,MACrDD,EAAU,SAAS,OAASC,EAAa,SAAS,MAClDD,EAAU,WAAW,SAAWC,EAAa,WAAW,QACxDD,EAAU,SAAS,SAAWC,EAAa,SAAS,QACpDD,EAAU,WAAW,aAAeA,EAAU,WAAW,YACzDA,EAAU,SAAS,aAAeC,EAAa,SAAS,YACxDD,EAAU,WAAW,UAAYC,EAAa,WAAW,SACzDD,EAAU,SAAS,UAAYC,EAAa,SAAS,SACrDD,EAAU,cAAgBC,EAAa,qBAElCF,EAAO,QAAU,WAAY,CACtC,GAAM,CAAE,UAAAC,EAAW,aAAAC,CAAa,EAAIF,EACpC,OACEC,EAAU,WAAaC,EAAa,UACpCD,EAAU,iBAAmBC,EAAa,gBAC1CD,EAAU,0BAA0B,SAClCC,EAAa,0BAA0B,QACzCD,EAAU,iBACVC,EAAa,gBAGjB,MAAO,EACT,CA5BgBJ,EAAAC,GAAA,4BA8BT,SAASI,GACdC,EAC0B,CAC1B,GAAI,CAACA,EAAW,OAAO,KAEvB,IAAMC,GAAiBD,EAAU,QAAQ,OAAS,CAAC,GAAG,IAAKE,IAAU,CACnE,GAAGA,EACH,WAAYC,EAAeD,EAAK,WAAY,EAAG,CAAC,EAChD,SAAUC,EAAeD,EAAK,SAAU,EAAG,CAAC,CAC9C,EAAE,EAEF,MAAO,CACL,GAAGF,EACH,GAAIA,EAAU,QAAU,CACtB,OAAQ,CAAE,GAAGA,EAAU,OAAQ,MAAOC,CAAc,CACtD,CACF,CACF,CAjBgBP,EAAAK,GAAA,wBAmBT,SAASK,GAAuBC,EAAuC,CAC5E,IAAMC,EAAgBD,EAAY,MAAM,IAAKE,IAAU,CACrD,GAAGA,EACH,SAAUJ,EAAeI,EAAK,SAAU,EAAG,CAAC,EAC5C,aAAcJ,EAAeI,EAAK,aAAc,EAAG,CAAC,EACpD,kCAAmCJ,EACjCI,EAAK,kCACL,EACA,CACF,CACF,EAAE,EAEF,MAAO,CACL,GAAGF,EACH,YAAaF,EAAeE,EAAY,YAAa,EAAG,CAAC,EACzD,MAAOC,CACT,CACF,CAjBgBZ,EAAAU,GAAA,0BAoBT,IAAMI,GAAqBd,EAAA,CAACe,EAAkBC,IAC/CD,EAAgB,UAChBC,EAAc,SACN,UAHoB,sBG5KlC,IAAMC,GAAkBC,EAA2CC,GAAc,CAC/E,IAAIC,EAAQD,EACZC,EAAM,IAAM,CAAC,EACb,QAASC,KAAK,OAAO,KAAKD,EAAM,SAAS,CAAC,EACvCA,EAAM,IAAYC,CAAC,EAAI,IAAMD,EAAOE,GAAMA,EAAED,CAAmB,CAAC,EAGnE,OAAOD,CACT,EARwB,mBAUjBG,EAAQN,GLRf,OAAS,yBAAAO,OAA6B,qBMVtC,OAAS,eAAAC,OAAmB,YCI5B,IAAMC,GAAuB,uCAEzBC,GAAmB,CACrB,QAASD,EACX,EAEO,SAASE,GAAUC,EAAqB,CAC7C,OAAOF,GAAQE,CAAI,CACrB,CAFgBC,EAAAF,GAAA,aAUT,SAASG,GAAWC,EAAsB,CAC/C,IAAIC,EACJ,OAAI,OAAO,iBAAoB,WAC7BA,EAAgB,gBAAgBD,CAAW,EAE3CC,EAAgB,KAAK,MAAM,KAAK,UAAUD,CAAW,CAAC,EAExDE,GAAUD,EACHC,EACT,CATgBC,EAAAJ,GAAA,cDbhB,IAAIK,GAESC,GAAcC,EAAA,IACrBF,KACJA,GAAQ,IAAIG,GAAYC,GAAU,SAAS,CAAC,EACrCJ,IAHkB,eET3B,OAAS,UAAAK,OAAc,UACvB,OAAS,WAAAC,GAAS,yBAAAC,OAA6B,qBCDxC,IAAMC,GAAY,CAAC,GAAK,EAAG,EAAG,EAAG,EAAG,GAAI,EAAE,EAEpCC,GAAmB,EAEnBC,GAAgB,EAEhBC,GAAe,IAEfC,GAAe,ECR5B,OAAS,UAAAC,OAAc,UAchB,IAAMC,EAAeC,EAC1BC,GAAkB,EAAGC,IAAS,CAC5B,KAAM,CAAE,YAAa,CAAC,EAAG,cAAe,CAAC,EAAG,SAAU,CAAC,EAAG,OAAQ,CAAC,CAAE,EACrE,cAAe,UACf,UAAW,SAAY,CACrB,GAAI,CACF,IAAMC,EAAW,MAAMC,GAAY,EAAE,eAAe,EAC9CC,EAAkCC,EACtCH,EAAS,OAAO,IAAKI,GAAMA,EAAE,UAAU,CACzC,EACMC,EAAgBL,EAAS,YAAY,OACxCM,GACCA,EAAM,SACNJ,EAAgC,SAASI,EAAM,IAAI,CACvD,EACAN,EAAS,YAAcK,EAAc,KAAK,CAACE,EAAGC,IAAMD,EAAE,KAAOC,EAAE,IAAI,EACnET,EAAI,CAAE,KAAMC,EAAU,cAAe,SAAU,CAAC,CAClD,MAAE,CACAD,EAAI,CAAE,cAAe,QAAS,CAAC,CACjC,CACF,CACF,EAAE,CACJ,EFLO,IAAMU,EAAmBC,EAC9BC,GAAsB,EACpBC,GACEC,GAAuBC,IAAS,CAC9B,SAAUC,GACV,eAAgB,KAChB,gBAAiB,GACjB,aAAc,KACd,iBAAkB,KAClB,iBAAkB,KAClB,yBAA0B,CAAC,EAC3B,MAAO,OACP,YAAcC,GACZF,EAAI,KAAO,CACT,SAAUE,CACZ,EAAE,EACJ,kBAAoBC,GAClBH,EAAI,KAAO,CACT,eAAgBG,CAClB,EAAE,EACJ,gBAAkBC,GAChBJ,EAAI,KAAO,CACT,aAAAI,CACF,EAAE,EACJ,oBAAsBC,GACpBL,EAAI,KAAO,CACT,iBAAAK,CACF,EAAE,EAEJ,oBAAsBC,GACpBN,EAAI,KAAO,CACT,iBAAAM,CACF,EAAE,EACJ,0BAA2B,IACzBN,EAAKO,GAAU,CACb,GAAM,CAAE,SAAAC,CAAS,EAAIC,EAAa,SAAS,EAAE,KACvCC,EAAgBC,EACpBH,EAAS,IAAKI,GAAYA,EAAQ,YAAY,CAChD,EAEA,OAAIF,EAAc,SAAWH,EAAM,yBAAyB,OACnD,CAAE,yBAA0B,CAAC,CAAE,EAE/B,CACL,yBAA0BG,CAC5B,CAEJ,CAAC,EACH,sBAAuB,IACrBV,EAAKO,IAAW,CACd,gBAAiB,CAACA,EAAM,eAC1B,EAAE,EACJ,sBAAwBM,GACtBb,EAAKO,GACCA,EAAM,yBAAyB,SAASM,CAAI,EACvC,CACL,yBAA0BN,EAAM,yBAAyB,OACtDO,GAAoBA,GAAmBD,CAC1C,CACF,EAEO,CACL,yBACEN,EAAM,yBAAyB,OAAOM,CAAI,CAC9C,CACH,EACH,SAAWE,GACTf,EAAI,KAAO,CACT,MAAAe,CACF,EAAE,CACN,EAAE,EACF,CACE,KAAM,gBACN,cAAe,EACjB,CACF,CACF,CACF,EG5GA,OAAOC,MAAe,eAQtB,OAAS,QAAAC,MAAY,eCRrB,OACE,kCAAAC,GACA,gBAAAC,GACA,4BAAAC,GAIA,qBAAAC,GAEA,eAAAC,GACA,YAAAC,OACK,4BAEP,OAEE,eAAeC,MAEV,gBAOP,OAAS,sBAAAC,OAA0B,cACnC,OAAS,sBAAAC,OAA0B,2BAGnC,OAAOC,OAAe,eAKf,SAASC,GAAeC,EAAkC,CAC/D,OAAQ,GAAM,CACZ,KAAKA,EAAM,UACT,OAAOC,EAAa,UACtB,KAAKD,EAAM,WACT,OAAOC,EAAa,WACtB,IAAK,CAACD,EAAM,UACV,OAAOC,EAAa,cACtB,QACE,OAAOA,EAAa,YACxB,CACF,CAXgBC,EAAAH,GAAA,kBAaT,IAAMI,GAAkB,CAACC,GAAY,IAAI,EAEzC,SAASC,GACdC,EACAC,EACAC,EACmB,CACnB,OAAOA,EACJ,OAAQC,GAAW,CAACN,GAAgB,SAASM,CAAqB,CAAC,EACnE,IAAKC,GAAS,CACb,GAAM,CACJ,KAAAC,EACA,IAAKC,EACL,YAAAC,EACA,aAAAC,CACF,EAAIP,EAAcG,CAAI,EAChBV,EAAQD,GAAeO,EAASI,CAAI,CAAC,EAC3C,MAAO,CACL,KAAAC,EACA,MAAAC,EACA,YAAaG,GAAkBF,CAAW,EAC1C,MAAAb,EACA,KAAAU,EACA,aAAc,SAAOI,EAAiB,IACxC,CACF,CAAC,CACL,CAxBgBZ,EAAAG,GAAA,iBA0BT,SAASW,GACdC,EACkB,CAClB,GAAI,CAACA,EAAiB,OAAO,KAC7B,IAAID,EAA2C,CAAC,EAChD,OAAAA,EAAgCC,EAAgB,IAC7CC,GAAmBA,EAAe,IACrC,EAEOF,CACT,CAVgBd,EAAAc,GAAA,iCAYT,SAASG,GACdV,EACAW,EACAC,EACAC,EACU,CACV,IAAMC,EAAmB,CAAC,EAE1B,SAASC,EAAWC,EAAkBC,EAAiB,CAIrD,GAAI,CAHiC,CAAC,CAACH,EAAO,KAC3CI,GAAYA,EAAQ,QAAUF,CACjC,EACmC,CACjC,IAAMG,EAAqB,CACzB,QAAAF,EACA,MAAOD,EACP,WAAYhB,CACd,EAEAc,EAAO,KAAKK,CAAU,EAE1B,CAbS1B,EAAAsB,EAAA,cAeT,IAAMP,EAAkBK,GAAuB,CAAC,EAEhD,OAAAF,EAAS,QAASO,GAAY,CAC5B,GAAM,CAAE,QAAAD,EAAS,QAAAD,CAAQ,EAAII,GAAmBF,CAAO,EAEjDG,EAAgBb,EAAgB,OAAS,EACzCc,EAAcd,EAAgB,SAASQ,CAAO,EAC9CO,EAAYP,IAAYQ,GAAS,QAMvC,GAJEH,GAAiB,CAACC,GAAe,CAACC,EAIH,OAMjC,IAAME,EACJT,IAAYQ,GAAS,SAAWE,GAAaT,CAAO,EACtD,GAAIM,GAAa,CAACE,EAAqB,OAEfb,EAAe,SAASI,CAAO,GAGhCS,EAGcjB,EAAgB,OAAQmB,GACzDf,EAAe,SAASe,CAAK,CAC/B,EAE2B,QAASX,GAAY,CAG9CD,EAAWC,EAASC,EAAQ,YAAY,CAAC,CAC3C,CAAC,EAEDF,EAAWC,EAASC,CAAO,CAE/B,CAAC,EAEMH,CACT,CAnEgBrB,EAAAiB,GAAA,iCAqET,SAASkB,GAAkBC,EAAiC,CACjE,IAAMC,EAAoB,CAAC,EAE3B,OAAAD,GAAO,QAAQ,MAAM,QAASE,GAAS,CACrC,IAAMC,EAA4BD,EAAK,KAAK,WACtCE,EAA0BF,EAAK,GAAG,WACnCD,EAAQ,SAASE,CAAyB,GAC7CF,EAAQ,KAAKE,CAAyB,EAEnCF,EAAQ,SAASG,CAAuB,GAC3CH,EAAQ,KAAKG,CAAuB,EAIlCF,EAAK,eAAiB,MAAM,QAAQA,EAAK,aAAa,GACxDA,EAAK,cAAc,QAASG,GAAiB,CAC3C,IAAMC,EAA6BD,EAAa,KAAK,WAC/CE,EAA2BF,EAAa,GAAG,WAC5CJ,EAAQ,SAASK,CAA0B,GAC9CL,EAAQ,KAAKK,CAA0B,EAEpCL,EAAQ,SAASM,CAAwB,GAC5CN,EAAQ,KAAKM,CAAwB,CAEzC,CAAC,CAEL,CAAC,EACMN,CACT,CA5BgBrC,EAAAmC,GAAA,qBAgCT,SAASS,GACdC,EACAC,EACAzC,EACA0C,EACoB,CAqBpB,OApB0BF,EAAiB,IACxCG,IACQ,CACL,QAASA,EAAgB,QACzB,WAAYA,EAAgB,WAC5B,MAAOA,EAAgB,MACvB,MAAO3C,EAAc2C,EAAgB,UAAU,EAAE,IACjD,KAAM3C,EAAc2C,EAAgB,UAAU,EAAE,KAChD,SACED,IAAqBC,EAAgB,MACjC,GACA,CAAC,CAACF,EAAgB,KACfG,GACCA,EAAe,QAAUD,EAAgB,OACzCC,EAAe,aAAeD,EAAgB,UAClD,CACR,EAEJ,CAGF,CA3BgBhD,EAAA4C,GAAA,wBA6BT,SAASM,GACdL,EACAX,EACAiB,EACA3B,EACqB,CACrB,GAAIqB,EAAiB,SAAW,EAAG,OAAO,KAE1C,IAAMO,EAAuBP,EAAiB,OAC3CtC,GAAWA,EAAO,QAAU2B,CAC/B,EACA,OAAIkB,EAAqB,SAAW,EAAU,KAG5CA,EACG,IACE7C,GACCA,EAAO,UAAU,KACd8C,GACE7B,IAAY,MAAQ6B,EAAQ,UAAY7B,GACxCA,IAAY,MACX6B,EAAQ,UAAY7B,GACpB6B,EAAQ,SAAWF,CACzB,GAAK,IACT,EACC,OAAQE,GAAYA,IAAY,IAAI,EACpC,KACC,CAACC,EAAGC,IAAM,WAAWA,GAAG,QAAU,GAAG,EAAI,WAAWD,GAAG,QAAU,GAAG,CACtE,EACC,KAAK,IAAM,EAAI,GAAK,IAE3B,CA/BgBtD,EAAAkD,GAAA,wBAiCT,SAASM,GACd/B,EACAuB,EACA,CACA,OACEvB,EAAQ,UAAYuB,EAAgB,SACpCvB,EAAQ,QAAUuB,EAAgB,OAClCvB,EAAQ,aAAeuB,EAAgB,UAE3C,CATgBhD,EAAAwD,GAAA,6BAWT,SAASC,GACdlD,EACAmD,EACAC,EACiB,CACjB,GAAM,CACJ,QAAAnC,EACA,WAAYU,EACZ,YAAA0B,EACA,SAAAC,EAAW,CAAC,CACd,EAAIH,EACJ,MAAO,CACL,QAAAlC,EACA,MAAAU,EACA,QAAS,GACT,MAAO,GACP,YAAA0B,EACA,WAAYrD,EAAO,WACnB,SACEsD,GAAU,IAAKC,IAAkB,CAC/B,MAAA5B,EACA,OAAQ4B,EAAa,MAAM,OAC3B,OAAQA,EAAa,MAAM,OAC3B,QAASA,EAAa,MAAM,SAAW,KACvC,UAAWA,EAAa,OAAO,OAC/B,QAASA,EAAa,OAAO,SAC7B,OAAQ,IAAIC,GAAUD,EAAa,OAAO,MAAM,EAC7C,UAAU,CAACA,EAAa,OAAO,QAAQ,EACvC,QAAQ,EACX,KAAM,GACN,SACEE,GACE9B,EACA4B,EAAa,MAAM,OACnBA,EAAa,MAAM,QACnBH,CACF,GAAK,IACT,EAAE,GAAK,CAAC,CACZ,CACF,CAvCgB3D,EAAAyD,GAAA,kBAyCT,SAASQ,GACdjB,EACiB,CACjB,MAAO,CAAE,GAAGA,EAAiB,QAAS,GAAO,MAAO,EAAK,CAC3D,CAJgBhD,EAAAiE,GAAA,6BAMT,IAAMC,GAA0BlE,EAACgD,GAAuC,CAC7E,IAAMmB,EAAyB,IAAI,IAY7BC,EAXkCpB,GAAiB,OACvD,CAACqB,EAAwBC,IAChBD,EAAI,UACRE,GAAMA,EAAE,UAAYD,EAAQ,SAAWC,EAAE,QAAUD,EAAQ,KAC9D,IAAM,GACF,CAAC,GAAGD,EAAKC,CAAO,EAChBD,EAEN,CAAC,CACH,GAEgD,IAAKnC,GAAU,CAC7D,IAAMsC,EAAuC,CAC3C,KAAMtC,EAAM,MACZ,SAAU,CAAC,CACb,EACA,OAAKiC,EAAuB,IAAIjC,EAAM,OAAO,GAC3CiC,EAAuB,IAAIjC,EAAM,OAAO,EAE1CiC,EAAuB,QAASM,GAAmB,CAC7CvC,EAAM,UAAYuC,GACpBD,EAAyB,SAAS,KAAKtC,CAAK,CAChD,CAAC,EACMsC,CACT,CAAC,EACKE,EAAQC,EACZP,GACI,QAASb,GAAMA,EAAE,QAAQ,GACzB,QAASD,GAAMA,GAAG,QAAQ,GAC1B,IAAKC,GACL,IAAIQ,GAAUR,GAAG,QAAUqB,CAAI,EAAE,aAAarB,GAAG,UAAY,CAAC,CAChE,GACE,OAAO,CAACD,EAAGC,IAAMD,EAAE,KAAKC,CAAC,EAAGqB,CAAI,GAAKA,CAC3C,EAAE,SAAS,EAEX,OAAOC,GAA4BH,CAAK,CAC1C,EAtCuC,2BAwCvC,SAASG,GAA4BC,EAAiC,CACpE,IAAMC,EAAQD,EAAO,SAAS,EAAE,MAAM,GAAG,EACzC,OAAAC,EAAM,CAAC,EAAIA,EAAM,CAAC,EAAE,QAAQ,wBAAyB,GAAG,EACjDA,EAAM,KAAK,GAAG,CACvB,CAJS/E,EAAA6E,GAAA,+BAMF,IAAMG,GAAahF,EAAC2D,GACA,CAACA,EAAO,KAAMsB,GAAUA,EAAM,OAAO,EAErDtB,EACJ,OAAQsB,GAAU,CAACA,EAAM,OAAO,EAChC,OACCtB,EAAO,OAAQsB,GAAUA,EAAM,SAAW,CAACA,EAAM,eAAe,EAChEtB,EAAO,OAAQsB,GAAUA,EAAM,eAAe,CAChD,EAGGtB,EACJ,OAAQsB,GAAU,CAAC,CAACA,EAAM,OAAO,EACjC,KACC,CAACC,EAAQC,IACP,WAAWA,EAAO,SAAS,UAAY,GAAG,EAC1C,WAAWD,EAAO,SAAS,UAAY,GAAG,CAC9C,EACC,OACCvB,EAAO,OAAQsB,GAAU,CAACA,EAAM,SAAW,CAACA,EAAM,eAAe,EACjEtB,EAAO,OAAQsB,GAAU,CAACA,EAAM,SAAWA,EAAM,eAAe,CAClE,EArBsB,cAwBbjB,GAAchE,EAAA,CACzBoF,EACAjC,EACA3B,EACA6D,IAEcA,GAAW,KACtBC,GACCA,EAAE,aAAeF,GACjBE,EAAE,QAAQ,YAAY,IAAMnC,GAAQ,YAAY,GAChDmC,EAAE,UAAY9D,CAClB,GACc,UAAY,KAZD,eAcd+D,GAAsBvF,EAAA,CACjCwF,EACAjF,IACY,CACZ,IAAMkF,EAA8BC,GAClC,OAAO,QAAQF,CAAW,EACvB,IAAI,CAAC,CAAC,CAAExE,CAAc,IAAMA,CAAc,EAC1C,OAAO2E,EAAkB,CAC9B,EACA,OAAOF,GAA+B,CAAC,CAACA,EAA4BlF,CAAM,CAC5E,EAVmC,uBAYtBqF,GAAqC5F,EAChD6F,GACiB,CACjB,IAAMC,EAAuB,IAAI,IAC/BD,EAAkB,IAAKtF,GACdA,EAAO,UACf,CACH,EAEA,OAAOwF,GAAyB,OAAQC,GACtCF,EAAqB,IAAIE,CAAgB,CAC3C,CACF,EAZkD,sCAc3C,SAASC,GACdtC,EACAd,EACoB,CACpB,OAAOc,EAAO,IAAI,CAAC,CAAE,QAAAN,EAAS,GAAG6C,CAAW,IAAM,CAChD,IAAMC,EAAcxB,EAClB,IAAIZ,GACFb,GACEL,EACAqD,EAAW,WACXA,EAAW,OACXA,EAAW,OACb,GAAG,QAAUtB,CACf,CACF,EAEIwB,EAAgB,GACpB,OAAIF,EAAW,WACbE,EAAgBzB,EACd,IAAIZ,GACFb,GACEL,EACAqD,EAAW,WACXA,EAAW,OACXA,EAAW,OACb,GAAG,QAAUtB,CACf,EAAE,aAAasB,EAAW,QAAQ,CACpC,GAEK,CACL,GAAGA,EACH,GAAIC,IAAgB,KAAO,CACzB,QAAS,CAAE,OAAQA,EAAa,SAAUC,CAAc,CAC1D,CACF,CACF,CAAC,CACH,CApCgBpG,EAAAiG,GAAA,wBAsCT,SAASI,GACdnE,EACAyB,EACAd,EACAyD,EACoB,CAEpB,GADkCpE,GAAO,OAASoE,EAAiB,CAAC,GAAG,KACxC,OAAOA,EACtC,IAAMC,EAAiB5C,EAAO,OAC3BsB,GAAUA,EAAM,aAAe/C,GAAO,IACzC,EACA,OAAO8C,GAAWiB,GAAqBM,EAAgB1D,CAAgB,CAAC,CAC1E,CAZgB7C,EAAAqG,GAAA,mBAcT,SAASG,EACdtB,EACAC,EACA,CACA,OACED,GAAQ,aAAeC,GAAQ,YAC/BD,GAAQ,SAAWC,GAAQ,QAC3BD,GAAQ,UAAYC,GAAQ,OAEhC,CATgBnF,EAAAwG,EAAA,kBAWT,SAASC,GACdC,EACAC,EACkB,CAClB,IAAIC,EACEC,EAAaH,EAAa,CAAC,EAC3BI,EAAcJ,EAAa,CAAC,EAClC,OAAIA,EAAa,SAAW,EAAGE,EAAgBC,EACtCL,EAAeK,EAAYF,CAAU,EAAGC,EAAgBE,EAC5DF,EAAgBC,EACdD,CACT,CAXgB5G,EAAAyG,GAAA,mBAaT,SAASM,GACd1E,EACmB,CACnB,OAAOA,EAAQ,KACb,CAACiB,EAAGC,IACF,EAAOA,EAAE,QAAUxD,EAAa,WAC9B,EAAOuD,EAAE,QAAUvD,EAAa,YAClC,EACEwD,EAAE,QAAUxD,EAAa,cACvBwD,EAAE,QAAUxD,EAAa,YAE3B,EACEuD,EAAE,QAAUvD,EAAa,cACvBuD,EAAE,QAAUvD,EAAa,WAEnC,CACF,CAhBgBC,EAAA+G,GAAA,2BD5dhB,OACE,4BAAAC,OAEK,wCAIA,SAASC,GACdC,EACAC,EACA,CACA,MACE,CAACD,GACD,CAACC,GACDD,EAAc,IAAIE,CAAI,GACtBD,EAAe,IAAIC,CAAI,EAEhB,EACFD,EAAe,IAAID,CAAa,EAAE,MAAM,CAAC,EAAE,aAAa,GAAG,CACpE,CAZgBG,EAAAJ,GAAA,kBAcT,SAASK,GACdJ,EACAK,EACS,CACT,OACI,SAASA,EAAY,QAAQ,CAAC,GAAK,GAAG,GAAK,KAC3CL,GAAe,IAAI,IAAIM,EAAU,GAAG,CAAC,GACpC,SAASD,EAAY,QAAQ,CAAC,GAAK,GAAG,GAAK,IAC1CL,GAAe,IAAI,IAAIM,EAAU,GAAI,CAAC,IAC1C,EAEJ,CAXgBH,EAAAC,GAAA,yBAaT,SAASG,GAAcC,EAA8C,CAC1E,OACGA,GAAW,QAAQ,OAAS,CAAC,GAAG,OAAQC,GAAS,CAChD,IAAMC,EAAYD,EAAK,mBACnB,IAAIH,EAAUG,EAAK,kBAAkB,EACrC,KACEE,EAAYF,EAAK,mBACnB,IAAIH,EAAUG,EAAK,kBAAkB,EACrC,KAEJ,OADoBA,EAAK,4BAA8B,YAE9CC,GAAS,IAAID,EAAK,UAAU,GAAKE,GAAS,IAAIF,EAAK,UAAU,EAE7DC,GAAS,GAAGD,EAAK,UAAU,GAAKE,GAAS,GAAGF,EAAK,UAAU,CAEtE,CAAC,EAAE,OAAS,CAEhB,CAjBgBN,EAAAI,GAAA,iBAmBT,SAASK,GAAkBJ,EAIhC,CACA,GAAI,CAACA,EACH,MAAO,CAAE,KAAM,KAAM,qBAAsB,GAAI,eAAgB,EAAG,EACpE,IAAMC,GAAQD,GAAW,QAAQ,OAAS,CAAC,GAAG,OAAQC,GAAS,CAC7D,IAAMC,EAAYD,EAAK,mBACnB,IAAIH,EAAUG,EAAK,kBAAkB,EACrC,KACEE,EAAYF,EAAK,mBACnB,IAAIH,EAAUG,EAAK,kBAAkB,EACrC,KAEJ,OADoBA,EAAK,4BAA8B,YAE9CC,GAAS,IAAID,EAAK,UAAU,GAAKE,GAAS,IAAIF,EAAK,UAAU,EAE7DC,GAAS,GAAGD,EAAK,UAAU,GAAKE,GAAS,GAAGF,EAAK,UAAU,CAEtE,CAAC,EAAE,CAAC,EACJ,GAAI,CAACA,EACH,MAAO,CAAE,KAAM,KAAM,qBAAsB,GAAI,eAAgB,EAAG,EACpE,IAAMC,EAAYD,EAAK,mBACnB,IAAIH,EAAUG,EAAK,kBAAkB,EACrC,KACEE,EAAYF,EAAK,mBACnB,IAAIH,EAAUG,EAAK,kBAAkB,EACrC,KACEI,EAAcJ,EAAK,4BAA8B,YAEnDK,EAAuB,GACvBC,EAAiB,GACrB,MAAI,CAACF,GAAiBH,GAAWA,EAAQ,GAAGD,EAAK,UAAU,GACzDK,EAAuB,gBAAgBE,EAAeN,CAAO,KAC3DD,EAAK,KAAK,SAEZM,EAAiB,6BACRF,GAAiBH,GAAWA,EAAQ,IAAID,EAAK,UAAU,IAChEK,EAAuB,eAAeE,EAAeN,CAAO,KAC1DD,EAAK,KAAK,SAEZM,EAAiB,6BAGf,CAACF,GAAiBF,GAAWA,EAAQ,GAAGF,EAAK,UAAU,GACzDK,EAAuB,gBAAgBE,EAAeL,CAAO,KAC3DF,EAAK,KAAK,SAEZM,EAAiB,6BACRF,GAAiBF,GAAWA,EAAQ,IAAIF,EAAK,UAAU,IAChEK,EAAuB,eAAeE,EAAeL,CAAO,KAC1DF,EAAK,KAAK,SAEZM,EAAiB,6BAGZ,CAAE,KAAAN,EAAM,qBAAAK,EAAsB,eAAAC,CAAe,CACtD,CA1DgBZ,EAAAS,GAAA,qBA4DT,SAASK,GACdC,EACAC,EACAC,EACAZ,EACAD,EACAc,EACAC,EACAC,EACAC,EACiB,CACjB,OAAIN,IAAsB,UACjB,CAAE,MAAO,GAAGO,EAAK,EAAE,gBAAgB,IAAK,SAAU,EAAK,EAC5DN,EAAiB,QAAU,EACtB,CAAE,MAAO,GAAGM,EAAK,EAAE,gBAAgB,IAAK,SAAU,EAAM,EAC7DL,EACK,CAAE,MAAO,GAAGK,EAAK,EAAE,uBAAuB,IAAK,SAAU,EAAK,EAC9D,CAACD,GAAeA,IAAgB,IAChC,CAAE,MAAO,GAAGC,EAAK,EAAE,iBAAiB,IAAK,SAAU,EAAK,EACxD,CAACjB,GAAa,CAACA,EAAU,OACzB,CAAE,MAAO,GAAGiB,EAAK,EAAE,MAAM,IAAK,SAAU,EAAK,EAC7ClB,EACA,CAAE,MAAO,GAAGkB,EAAK,EAAE,aAAa,IAAK,SAAU,EAAK,EACpDJ,EACA,CAAE,MAAO,GAAGI,EAAK,EAAE,2BAA2B,IAAK,SAAU,EAAK,EAClEH,EACA,CACL,MAAO,GAAGG,EAAK,EAAE,mDAAmD,IACpE,SAAU,GACV,WAAY,EACd,EACOF,EACA,CACL,MAAO,GAAGE,EAAK,EAAE,4CAA4C,IAC7D,SAAU,GACV,WAAY,EACd,EACU,CAAE,MAAO,GAAGA,EAAK,EAAE,MAAM,IAAK,SAAU,EAAM,CAC5D,CAtCgBtB,EAAAc,GAAA,sBAwCT,SAASS,GACdlB,EACAgB,EACAxB,EACAC,EACA,CACA,MAAO,GACJ,CAACD,GACA,CAACC,GACDD,EAAc,IAAIE,CAAI,GACtBD,EAAe,IAAIC,CAAI,IACvBM,GAAW,QACXgB,GACFA,IAAgB,KAChB,WAAWA,GAAe,GAAG,IAAM,GACjChB,EAAU,OAEhB,CAjBgBL,EAAAuB,GAAA,yBAmBT,SAASC,GAAgBC,EAAiC,CAC/D,IAAMC,EAAoB,CAAC,EAE3B,OAAAD,GAAO,QAAQ,MAAM,QAASnB,GAAS,CACrC,IAAMqB,EAA4BrB,EAAK,KAAK,WACtCsB,EAA0BtB,EAAK,GAAG,WACpCuB,EAAkBH,EAAQA,EAAQ,OAAS,CAAC,EAC5CC,GAA6BE,GAC/BH,EAAQ,KAAKC,CAAyB,EACxCE,EAAkBH,EAAQA,EAAQ,OAAS,CAAC,EACxCE,GAA2BC,GAC7BH,EAAQ,KAAKE,CAAuB,CACxC,CAAC,EACMF,CACT,CAdgB1B,EAAAwB,GAAA,mBAgBT,IAAMM,GAAc9B,EAAA,CACzB+B,EACAC,EACAC,EACAC,IAEcA,GAAW,KACtBC,GACCA,EAAE,aAAeJ,GACjBI,EAAE,QAAQ,YAAY,IAAMH,GAAQ,YAAY,GAChDG,EAAE,UAAYF,CAClB,GACc,UAAY,KAZD,eAepB,SAASG,GACdC,EACAH,EACW,CACX,IAAII,EAAgBvC,EACpB,QAASwC,EAAI,EAAGA,EAAIF,EAAK,IAAI,OAAQE,IAAK,CACxC,IAAMC,EAAMH,EAAK,IAAIE,CAAC,EACtB,GAAIC,EAAI,cAAgB,uBAAwB,SAEhD,IAAMC,EAAYX,GAChBU,EAAI,MAAM,WACVA,EAAI,MAAM,OACVA,EAAI,MAAM,QACVN,CACF,EACAI,EAAgBA,EAAc,KAC5B,IAAInC,EAAUqC,EAAI,MAAM,EAAE,aAAaC,GAAa,CAAC,CACvD,EAGF,OAAOH,CACT,CArBgBtC,EAAAoC,GAAA,mBAuBT,SAASM,GACdrC,EACA6B,EACkB,CAClB,OACE7B,GAAW,QAAQ,MAAM,OACvB,CAACsC,EAAqBN,IACpBM,EAAS,KAAKP,GAAgBC,EAAMH,CAAS,CAAC,EAChDnC,CACF,GAAK,IAET,CAXgBC,EAAA0C,GAAA,oBAaT,SAASE,GAAWN,EAAiC,CAC1D,OAAKA,EACE,CAACA,EAAc,GAAG,IAAInC,EAAU,EAAE,CAAC,EADf,EAE7B,CAHgBH,EAAA4C,GAAA,cAWT,SAASC,GACdC,EACe,CAIf,OAHkBA,EAAM,QAAQ,MAAM,IACnCC,GAAaA,EAAS,mBACzB,GAGM,IAAKC,GAAMA,GAAG,UAAY,GAAG,GAC7B,OAAQA,GAAM,WAAWA,CAAC,EAAI,CAAC,GAC/B,KAAK,CAACC,EAAGC,IAAM,WAAWA,CAAC,EAAI,WAAWD,CAAC,CAAC,GAC5C,KAAK,IAAM,EAAI,GAAK,IAE5B,CAbgBE,EAAAN,GAAA,0BAeT,SAASO,GACdC,EACAC,EACA,CACA,OAAKA,EACE,WAAWD,CAAY,GAAK,WAAWC,CAAmB,EADhC,EAEnC,CANgBH,EAAAC,GAAA,qBAyCT,SAASG,GACdC,EACAC,EACAC,EACAC,EACAC,EACAC,EACAC,EACAC,EACAC,EACAC,EACAC,EACAC,EACkB,CAClB,IAAMC,EAAqBR,EAAgB,OACzC,CACEQ,EACAC,KAECD,EAAmBC,EAAe,KAAK,EAAIA,EAAe,QAC3DD,GAEF,CAAC,CACH,EAEME,EAAyD,CAAC,EAEhEX,EAAQ,QAASY,GAAW,CAC1B,IAAMC,EAAmBF,EAAiB,KACvCG,GAAoBA,EAAgB,aAAeF,EAAO,KAC7D,EACMC,EAAkBA,EAAiB,UAAU,KAAKD,EAAO,OAAO,EAEpED,EAAiB,KAAK,CACpB,WAAYC,EAAO,MACnB,UAAW,CAACA,EAAO,OAAO,CAC5B,CAAC,CACL,CAAC,EAED,IAAMG,EAAqB,CAAC,CAACR,EAEvBS,EAAsBC,GACzBV,GAAc,QAAQ,OAAS,CAAC,GAAG,OAClC,CAACW,EAAuBC,KACtBD,EAAY,KAAKC,EAAK,KAAK,WAAYA,EAAK,GAAG,UAAU,EAErDA,EAAK,eAAiB,MAAM,QAAQA,EAAK,aAAa,GACxDA,EAAK,cAAc,IAAKC,GAAiB,CACvCF,EAAY,KACVE,EAAa,KAAK,WAClBA,EAAa,GAAG,UAClB,CACF,CAAC,EAEIF,GAET,CAAC,CACH,CACF,EA2BA,MAzBsC,CACpC,OAAQnB,EAAY,SAAS,EAC7B,aAAcK,GAAgB,OAC9B,iBAAkBC,GAAoB,OACtC,iBAAkBC,GAAoB,OACtC,mBAAAS,EACA,KAAM,CACJ,QAASlB,EAAU,QACnB,WAAYA,EAAU,WACtB,OAAQA,EAAU,MACpB,EACA,GAAI,CACF,QAASC,EAAQ,QACjB,WAAYA,EAAQ,WACpB,OAAQA,EAAQ,MAClB,EACA,iBAAAa,EACA,YAAaH,GAAe,OAC5B,gBAAiBC,EACjB,cAAeP,EACf,sBAAuB,GACvB,SAAUC,EAAS,SAAS,EAC5B,GAAIY,GAAsB,CAAE,YAAaC,CAAoB,CAC/D,CAGF,CAtFgBK,EAAAzB,GAAA,8BAwFT,SAAS0B,GAAqBrB,EAA2B,CAiB9D,OAhBgBA,EAAgB,OAC9B,CACEQ,EAGAC,KAECD,EAAmBC,EAAe,KAAK,EAAI,CAC1C,QAASA,EAAe,QACxB,WAAYA,EAAe,UAC7B,EACAD,GAEF,CAAC,CACH,CAGF,CAlBgBY,EAAAC,GAAA,wBAoBT,SAASC,GAAqBC,EAAiC,CACpE,OAAOA,GAAO,QAAQ,cAAgB,IACxC,CAFgBH,EAAAE,GAAA,wBAIT,SAASE,GACdC,EACAC,EACA,CACA,MAAI,CAACD,GAAY,CAACC,EAAiB,KAC5B,IAAIC,EAAUD,CAAQ,EAC1B,IAAI,IAAIC,EAAUF,CAAQ,CAAC,EAC3B,MAAM,CAAC,EACP,aAAa,GAAG,CACrB,CATgBL,EAAAI,GAAA,uBAWT,SAASI,GACdC,EACAC,EACA,CACA,IAAMC,EAAkBT,GAAqBO,CAAQ,EAC/CG,EAAkBV,GAAqBQ,CAAQ,EACrD,GAAI,CAACC,GAAmB,CAACC,EAAiB,MAAO,GACjD,IAAMC,EAAmBT,GACvBO,EACAC,CACF,EACA,OAAKC,EAEEA,EAAiB,SAAS,GAAK,GAFR,EAGhC,CAdgBb,EAAAQ,GAAA,6BAgBT,SAASM,GACdX,EACAvB,EACA,CACA,IAAMmC,EAAMZ,EAAM,iBACZa,EAAkBC,GAAkBd,CAAK,EAM/C,OALuCvB,EAAgB,KACrD,CAACsC,EAAiBC,IAChBH,EAAgB,QAAQE,EAAgB,KAAK,EAC7CF,EAAgB,QAAQG,EAAgB,KAAK,CACjD,EAEG,QAAS5B,GAAW6B,GAA2B7B,EAAQwB,CAAG,GAAK,CAAC,CAAC,EACjE,OAAQM,GAAU,CAACA,EAAM,EAAE,EAC3B,IAAKA,GAAU,CACd,IAAMC,EAASD,EAAM,MAAM,OACrBE,EAAgBC,EACpB,IAAIjB,EAAUc,EAAM,cAAc,MAAM,EAAE,UACxC,CAACA,EAAM,cAAc,QACvB,EACA,CACF,EACMI,EAAiBD,EACrB,IAAIjB,EAAUc,EAAM,eAAe,MAAM,EAAE,UACzC,CAACA,EAAM,eAAe,QACxB,EACA,CACF,EACIK,EAAS,GACb,OAAIL,EAAM,SAAW,QAAOK,EAAS,oBACjCL,EAAM,SAAW,gBAAeK,EAAS,aACzCL,EAAM,SAAW,wBACnBK,EAAS,8BACY,gBAAWD,KAAkBH,IAASI,mBAAwBH,KAAiBD,aAAkBD,EAAM,MAAM,oBAEtI,CAAC,CACL,CApCgBrB,EAAAc,GAAA,sBAsCT,SAASa,GACdC,EACAC,EACA,CAGA,OAFiBD,EAAe,IAAIrB,EAAUqB,CAAY,EAAIE,GAEhD,aAAaD,GAAc,CAAC,CAC5C,CAPgB7B,EAAA2B,GAAA,sBAST,SAASI,GACdC,EACS,CACT,MACE,CAAC,CAACA,GACFA,EAAgB,gBAAkB,MAClCA,EAAgB,gBAAkBC,GAAyB,cAE/D,CARgBjC,EAAA+B,GAAA,iCAUT,SAASG,GACdC,EACAC,EAIA,CACA,IAAMC,EAAgB,mBAClBC,EAAUH,EAAY,aACtBI,EAAkBJ,EAAY,mBASlC,GAPIA,EAAY,iCAAiC,SAASE,CAAa,IACrEF,EAAY,gCACVA,EAAY,gCAAgC,QAAQE,EAAe,EAAE,GAG7CN,GAA8BK,CAAW,EAKnE,OAFAE,EAAUH,EAAY,2BAA6B,GACnDI,EAAkBJ,EAAY,iCAAmC,GACzDC,GAAa,cAAe,CAClC,KAAKH,GAAyB,2BAC5BK,EAAUA,GAAW,gCACrB,MACF,KAAKL,GAAyB,gBAC5BK,EAAUA,GAAW,iDACrB,MACF,KAAKL,GAAyB,wBAC5BK,EAAUA,GAAW,sCACrB,KACJ,CAEFC,EAAkBA,GAAmB,GACrCD,EAAUA,GAAW,GACrB,IAAME,EACJF,GAAS,QAAQ,MAAM,IAAM,IAAMA,GAAS,QAAQ,QAAQ,IAAM,GAEpE,MAAO,CACL,aAAcA,EACd,gBAAiB,CAAE,QAASC,EAAiB,KAAMC,CAAM,CAC3D,CACF,CA1CgBxC,EAAAkC,GAAA,mBA4CT,SAASO,GACdN,EACgB,CAChB,IAAIO,EAA8B,KAClC,GAAIP,EAAY,SAAW,SAAU,CACnC,IAAMQ,EAAkBR,EAAY,MACjC,MAAM,EACN,QAAQ,EACR,OAAQS,GAASA,EAAK,SAAW,SAAS,EAAE,CAAC,EAE5CD,IACFD,EAAc,CACZ,WAAYC,EAAgB,aAC5B,OAAQA,EAAgB,SACxB,aAAcA,EAAgB,aAC9B,QAASA,EAAgB,eAC3B,GAGJ,OAAOD,CACT,CApBgB1C,EAAAyC,GAAA,qCAsBT,SAASI,GAAgBV,EAA0B,CACxD,OACEA,EAAY,SAAW,UACvB,CAAC,CAACA,EAAY,YACd,IAAI,KAAK,EAAE,QAAQ,EAAI,SAASA,EAAY,UAAU,EAAI,EAAI,KAAO,GAEzE,CANgBnC,EAAA6C,GAAA,mBAOT,SAASC,GACdC,EACAC,EACS,CAKT,OAJoBC,EAAa,SAAS,EAAE,KAAK,YAEnC,KAAMC,GAAUA,EAAM,OAASH,CAAU,GAAG,iBACxD,CAAC,GACU,OAAQI,GAAM,IAAI,OAAOA,CAAC,EAAE,KAAKH,CAAO,CAAC,EAAE,OAAS,CACnE,CATgBhD,EAAA8C,GAAA,4BAWT,SAASM,GACdC,EACAC,EACAC,EACAC,EACA5E,EACA,CACA,OACEyE,GACC,CAACC,GACA,CAACtC,GAAgBwC,CAAS,EAAE,MAAON,GACjCtE,EAAgB,IAAKW,GAAWA,EAAO,KAAK,EAAE,SAAS2D,CAAK,CAC9D,GACD,CAAC,CAACI,GAAoB,CAACC,GACvB,CAAC,CAACD,GACD,CAAC,CAACC,GACF,CAACvC,GAAgBwC,CAAS,EACvB,OAAQN,GAAUA,IAAUI,CAAgB,EAC5C,MAAOJ,GACNtE,EAAgB,IAAKW,GAAWA,EAAO,KAAK,EAAE,SAAS2D,CAAK,CAC9D,CAER,CAtBgBlD,EAAAoD,GAAA,uBEzlBhB,OAAS,UAAAK,OAAc,UACvB,OAAS,yBAAAC,OAA6B,qBACtC,OAAS,WAAAC,OAAe,kBA+CjB,IAAMC,EAAkBC,EAC7BC,GAAqB,EACnBC,GAAsB,CAACC,EAAKC,KAAS,CACnC,iBAAkB,CAAC,EACnB,gBAAiB,CAAC,EAClB,kBAAmB,GACnB,cAAgBC,GAAa,CAC3B,IAAMC,EAAoBF,EAAI,EAAE,kBAChCD,EAAKI,IAAW,CACd,iBAAkBA,EAAM,iBACrB,OAAQC,GAAWA,EAAO,aAAeH,EAAS,CAAC,EAAE,UAAU,EAC/D,OACCA,EAAS,IAAKI,IAAa,CACzB,SAAU,CAAC,EACX,QAASA,EAAQ,QACjB,MAAOA,EAAQ,MACf,QAAS,GACT,WAAYA,EAAQ,WACpB,MAAO,GACP,YAAa,IACf,EAAE,CACJ,CACJ,EAAE,EACFH,EAAkBD,CAAQ,CAC5B,EACA,iBAAmBK,GAAe,CAChCP,EAAKI,IAAW,CACd,iBAAkBA,EAAM,iBAAiB,OACtCI,GAAYA,EAAQ,aAAeD,CACtC,EACA,gBAAiBH,EAAM,gBAAgB,OACpCC,GAAWA,EAAO,YAAcE,CACnC,CACF,EAAE,CACJ,EACA,oBAAqB,IACnBP,EAAKI,GAAU,CACb,IAAMK,EAAiBC,GACrBC,EAAkB,SAAS,EAAE,SAC/B,EACMC,EAAmBR,EAAM,iBACzBS,EAA4B,CAAC,EACnC,OAAAJ,EAAe,QAASK,GAAU,CAKhC,GAAI,CAJsB,CAAC,CAACV,EAAM,gBAAgB,KAC/CC,GAAWA,EAAO,QAAUS,CAC/B,EAEwB,CACtB,IAAMC,EAA8BH,EAAiB,KAClDP,GAAWA,EAAO,QAAUS,CAC/B,EACMC,GACJF,EAAgB,KAAK,CACnB,QAASE,EAA4B,QACrC,MAAOA,EAA4B,MACnC,WAAYA,EAA4B,UAC1C,CAAC,EAEP,CAAC,EACM,CACL,gBAAiBX,EAAM,gBAAgB,OAAOS,CAAe,CAC/D,CACF,CAAC,EACH,kBAAoBR,GAClBL,EAAKI,IAAW,CACd,gBAAiBA,EAAM,gBACpB,OAAQY,GAAmBA,EAAe,QAAUX,EAAO,KAAK,EAChE,OAAO,CACN,MAAOA,EAAO,MACd,QAASA,EAAO,QAChB,WAAYA,EAAO,UACrB,CAAC,CACL,EAAE,EACJ,qBAAuBY,GACrBjB,EAAI,KAAO,CACT,kBAAAiB,CACF,EAAE,EACJ,qBAAsB,IACpBjB,EAAI,KAAO,CACT,iBAAkB,CAAC,EACnB,gBAAiB,CAAC,CACpB,EAAE,EACJ,kBAAmB,MAAOE,EAAUgB,EAAc,KAAS,CACzD,IAAMf,EAAoBF,EAAI,EAAE,kBAC1B,CAAE,OAAAkB,CAAO,EAAIC,EAAa,SAAS,EAAE,KAC3CpB,EAAKI,IAAW,CACd,iBAAkBA,EAAM,iBAAiB,IAAKC,GACrCH,EAAS,KAAMI,GACpBe,GAA0Bf,EAASD,CAAM,CAC3C,EACI,CAAE,GAAGA,EAAQ,QAAS,EAAK,EAC3BA,CACL,CACH,EAAE,EACF,GAAI,CACF,IAAMiB,EAAOpB,EAAS,IAAI,CAAC,CAAE,QAAAqB,EAAS,MAAAT,CAAM,KAAO,CACjD,QAAAS,EACA,WAAYT,CACd,EAAE,EAEIU,GADW,MAAMC,GAAY,EAAE,kBAAkBH,CAAI,GAC1B,QACjC,GAAIE,EACFxB,EAAKI,IAAW,CACd,iBAAkBA,EAAM,iBAAiB,IACtCsB,GAAoB,CACnB,IAAMC,EAAiBzB,EAAS,KAAMI,GACpCe,GAA0Bf,EAASoB,CAAe,CACpD,EACME,EAAyBJ,EAAgB,KAC5ChB,GACCA,EAAQ,UAAYkB,EAAgB,SACpClB,EAAQ,aAAekB,EAAgB,KAC3C,EACA,OACEE,GAAwB,QACxBD,GACAT,GAEAf,EAAkB,CAACwB,CAAc,EAAG,EAAK,EAEpCA,GAAkBC,EACrBC,GACEF,EACAC,EACAT,CACF,EACAO,CACN,CACF,CACF,EAAE,MACG,OAAM,IAAI,MAAM,kBAAkB,CAC3C,MAAE,CACA1B,EAAKI,IAAW,CACd,iBAAkBA,EAAM,iBAAiB,IAAKI,GACrCN,EAAS,KAAMI,GACpBe,GAA0Bf,EAASE,CAAO,CAC5C,EACIsB,GAA0BtB,CAAO,EACjCA,CACL,CACH,EAAE,CACJ,CACF,CACF,EAAE,CACJ,CACF,EAEAZ,EAAgB,UACbQ,GAAUA,EAAM,iBAChBQ,GAAqB,CACpBD,EAAkB,SAAS,CAAC,CAAE,aAAAoB,EAAc,kBAAAC,CAAkB,IAAM,CAClE,IAAMC,EAA0BC,GAC9BH,EACAnB,CACF,EACMuB,EAA+BD,GACnCF,EACApB,CACF,EACA,MAAO,CACL,aAAcwB,GAAWH,CAAuB,EAChD,kBAAmBG,GAAWD,CAA4B,CAC5D,CACF,CAAC,CACH,EACA,CACE,WAAYE,EACd,CACF,EAEO,IAAMC,GAA0BC,EAACnC,GACtC,CAAC,CAACA,EAAM,iBAAiB,KAAMC,GAAWA,EAAO,OAAO,EADnB,2BbnMvC,IAAMmC,GAAcC,EAAA,CAACC,EAAqBC,IACxCD,GAAO,SACH,IAAIE,EAAUD,GAAUE,CAAI,EAAE,aAAaH,GAAO,UAAY,CAAC,EAC/D,KAHc,eAiCPI,EAAoBC,EAC/BC,GAAmB,EACjBC,GAAuBC,IAAS,CAC9B,UAAW,KACX,UAAW,KACX,YAAa,GACb,aAAc,KACd,cAAe,IAAIN,EAAU,CAAC,EAC9B,eAAgB,IAAIA,EAAU,CAAC,EAC/B,QAAS,KACT,QAAS,KACT,UAAW,KACX,QAAS,GACT,MAAO,GACP,aAAc,CAAC,EACf,kBAAmB,CAAC,EACpB,aAAeO,GACbD,EAAKE,GAAU,CACb,IAAIC,EAAiC,KACjCC,EAA4BT,EAChC,OAAKU,GAAiBH,EAAM,WAAW,GACjCD,IACJE,EAAiBF,EAAU,QAAQ,aAC/B,IAAIP,EAAUO,EAAU,QAAQ,YAAY,EAC5C,KACJG,EAAiBE,GACfL,EAAU,QAAQ,aAClBM,GAA4BN,CAAS,GAAKC,EAAM,SAAS,QAC3D,GAEK,CACL,UAAAD,EACA,GAAI,CAAC,CAACA,GAAa,CACjB,aAAAE,EACA,eAAAC,CACF,CACF,GAhBiD,CAAC,CAiBpD,CAAC,EACH,WAAY,IACVJ,EAAI,KAAO,CACT,QAAS,GACT,MAAO,GACP,UAAW,KACX,aAAc,KACd,eAAgB,IAAIN,EAAU,CAAC,CACjC,EAAE,EACJ,aAAc,CAACc,EAAOC,IAAoB,CACxCT,EAAKE,GAAU,CACb,GAAIA,EAAM,WAAW,OAASM,GAAO,KAAM,MAAO,CAAC,EACnD,IAAME,EAASC,EAAa,SAAS,EAAE,KAAK,OACtCC,EAAmBC,EAAgB,SAAS,EAAE,iBAC9CC,EAAeC,GACnBP,EACAE,EACAE,EACAV,EAAM,iBACR,EACMc,EAAYC,GAAgBH,EAAcZ,EAAM,OAAO,EAC7D,MAAO,CACL,UAAWM,EACX,aAAcM,EACd,GAAIL,GAAmB,CACrB,UAAAO,CACF,EACA,GAAI,CAAC,CAACd,EAAM,aAAe,CACzB,cAAeZ,GAAY0B,EAAWd,EAAM,WAAW,CACzD,CACF,CACF,CAAC,CACH,EACA,aAAeV,GACbQ,EAAKE,IAAW,CACd,UAAWV,EACX,GAAI,CAAC,CAACU,EAAM,aAAe,CACzB,cAAeZ,GAAYE,EAAOU,EAAM,WAAW,CACrD,CACF,EAAE,EACJ,WAAY,CAACM,EAAOC,IAAoB,CACtCT,EAAKE,GAAU,CACb,GAAIA,EAAM,SAAS,OAASM,GAAO,KAAM,MAAO,CAAC,EACjD,IAAME,EAASC,EAAa,SAAS,EAAE,KAAK,OACtCC,EAAmBC,EAAgB,SAAS,EAAE,iBAC9CC,EAAeC,GACnBP,EACAE,EACAE,EACAV,EAAM,iBACR,EAEA,MAAO,CACL,QAASM,EACT,kBAAmBM,EACnB,GAAIL,GAAmB,CACrB,QAASQ,GAAgBH,EAAcZ,EAAM,SAAS,CACxD,CACF,CACF,CAAC,CACH,EACA,WAAaV,GACXQ,EAAI,KAAO,CACT,QAASR,CACX,EAAE,EACJ,eAAiBC,GAAW,CAC1BO,EAAKE,IAAW,CACd,YAAaT,EACb,GAAI,CAACA,GAAU,CACb,aAAc,IAAIC,EAAU,CAAC,EAC7B,eAAgB,IAAIA,EAAU,CAAC,EAC/B,UAAW,KACX,MAAO,EACT,EACA,GAAI,CAAC,CAACQ,EAAM,WAAa,CACvB,cAAeZ,GAAYY,EAAM,UAAWT,CAAM,CACpD,CACF,EAAE,CACJ,EACA,MAAQyB,GAAgB,CACtB,GAAM,CAAE,OAAAR,EAAQ,YAAAS,CAAY,EAAIR,EAAa,SAAS,EAAE,KAClDC,EAAmBC,EAAgB,SAAS,EAAE,iBAC9CO,EACJF,EAAY,SAAW,SACnBA,EAAY,MAAM,UAAWG,GAAMA,EAAE,SAAW,QAAQ,EACxD,KAEN,GAAID,IAAgB,MAAQA,EAAc,EAAG,OAE7C,IAAME,EAAYJ,EAAY,MAAM,CAAC,EAC/BK,EAAWL,EAAY,MAAMA,EAAY,MAAM,OAAS,CAAC,EACzDM,EACJL,EAAY,KACTM,GAAeA,EAAW,OAASH,EAAU,cAChD,GAAK,KACDI,EACJP,EAAY,KACTM,GAAeA,EAAW,OAASF,EAAS,YAC/C,GAAK,KAEDP,EAAYN,EAAO,KAAMlB,GAC7BmC,EAAenC,EAAO,CACpB,WAAY8B,EAAU,eACtB,OAAQA,EAAU,WAClB,QAASA,EAAU,iBACrB,CAAC,CACH,EAEMM,EAAUlB,EAAO,KAAMlB,GAC3BmC,EAAenC,EAAO,CACpB,WAAY+B,EAAS,aACrB,OAAQA,EAAS,SACjB,QAASA,EAAS,eACpB,CAAC,CACH,EACMM,EAAqBd,GACzBS,EACAd,EACAE,EACA,CAAC,CACH,EACMkB,EAA0Bf,GAC9BW,EACAhB,EACAE,EACA,CAAC,CACH,EACMmB,EAAcb,EAAY,YAChClB,EAAI,CACF,UAAAwB,EACA,UAAAR,EACA,YAAAe,EACA,aAAc,KACd,cAAezC,GAAY0B,GAAa,KAAMe,CAAW,EACzD,eAAgB,IAAIrC,EAAU,CAAC,EAC/B,QAAAgC,EACA,QAAAE,EACA,UAAW,KACX,QAAS,GACT,MAAO,GACP,aAAcC,EACd,kBAAmBC,CACrB,CAAC,CACH,EACA,gBAAiB,IACf9B,EAAKE,IAAW,CACd,UAAWA,EAAM,QACjB,UAAWA,EAAM,QACjB,QAASA,EAAM,UACf,QAASA,EAAM,UACf,aAAcA,EAAM,kBACpB,kBAAmBA,EAAM,aACzB,YAAaA,EAAM,cAAc,SAAS,GAAK,GAC/C,cAAeZ,GACbY,EAAM,QACNA,EAAM,cAAc,SAAS,GAAK,EACpC,CACF,EAAE,CACN,EAAE,CACJ,CACF,EAEMD,GAAYV,EAAA,CAChByC,EACAC,IACG,CACH,IAAIC,EAA0C,KACxCC,EAAiB5C,EAAA,IAAM,CAC3B,GAAM,CAAE,UAAAyB,EAAW,QAAAY,EAAS,YAAAG,EAAa,WAAAK,CAAW,EAClDJ,EAAe,SAAS,EACpB,CACJ,SAAAK,EACA,eAAAC,EACA,yBAAAC,EACA,aAAAC,EACA,iBAAAC,EACA,iBAAAC,CACF,EAAIT,EAAc,SAAS,EAC3B,GAAI,CAACjB,GAAa,CAACY,GAAW,CAACvB,GAAiB0B,CAAW,EAAG,OAC9DG,GAAiB,MAAM,EACvBA,EAAkB,IAAI,gBAEtB,IAAMS,EAAcC,GAClB5B,EACAY,EACAG,EACA,CAAC,EACD,CAAC,EACDQ,EAPqBD,GAAkCD,EASvDG,EACAC,EACAC,CACF,EAEKV,EAAe,SAAS,EAAE,SAC7BI,EAAW,EAEbS,GAAY,EACT,aAAaF,EAAa,CACzB,OAAQT,EAAgB,MAC1B,CAAC,EACA,KAAMY,GAAQ,CACb,GAAM,CAAE,aAAAC,CAAa,EAAIf,EAAe,SAAS,EACjDe,EAAaD,CAAG,EAChBd,EAAe,SAAS,CAAE,QAAS,EAAM,CAAC,EAC1CE,EAAkB,IACpB,CAAC,EACA,MAAOc,GAAU,CACZA,EAAM,OAAS,gBACnBhB,EAAe,SAAS,CACtB,MAAOgB,EAAM,QACb,QAAS,EACX,CAAC,CACH,CAAC,CACL,EAhDuB,kBAkDjBC,EAA0BC,GAASf,EAAgB,GAAG,EAEtDgB,EAA0B5D,EAAA,IAAM,CACpC,GAAM,CAAE,UAAAyB,EAAW,QAAAY,EAAS,YAAAG,EAAa,cAAAqB,EAAe,WAAAhB,CAAW,EACjExC,EAAkB,SAAS,EAC7B,GAAI,CAACS,GAAiB0B,CAAW,GAAKqB,GAAe,GAAG,CAAC,EACvD,OAAOpB,EAAe,SAAS,CAAE,QAAS,EAAM,CAAC,EAEnD,GAAIL,EAAeX,EAAWY,CAAO,EACnC,OAAOI,EAAe,SAAS,CAC7B,QAAS,GACT,UAAW,KACX,aAAc,IAAItC,EAAUqC,CAAW,EACvC,eAAgBqB,CAClB,CAAC,EAEEpB,EAAe,SAAS,EAAE,SAASI,EAAW,EACnDa,EAAwB,CAC1B,EAhBgC,2BAkBhC,OAAArD,EAAkB,UACfM,IAAW,CACV,UAAWA,EAAM,UACjB,UAAWA,EAAM,UACjB,QAASA,EAAM,QACf,QAASA,EAAM,QACf,YAAaA,EAAM,WACrB,GACAiD,EACA,CACE,WAAY,CAACE,EAAWC,IAEpB,CAAAC,GAAyB,CACvB,MAAO,YACP,UAAAF,EACA,aAAAC,CACF,CAAC,CAKP,CACF,EAEAE,EAAiB,UACdtD,IAAW,CACV,SAAUA,EAAM,SAChB,eAAgBA,EAAM,eACtB,yBAA0BA,EAAM,yBAChC,gBAAiBA,EAAM,eACzB,GACAiD,EACA,CACE,WAAY,CAACE,EAAWC,IAEpB,CAAAC,GAAyB,CACvB,MAAO,WACP,UAAAF,EACA,aAAAC,CACF,CAAC,CAKP,CACF,EAEO,CAAE,eAAAnB,CAAe,CAC1B,EA3HkB,aA6HL,CAAE,eAAAA,EAAe,EAAIlC,GAChCL,EACA4D,CACF,EclYO,IAAMC,EAAmB,CAC9B,KAAM,IACN,UAAW,aACX,UAAW,aACX,QAAS,WACT,QAAS,WACT,SAAU,WACV,iBAAkB,8BAClB,MAAO,QACP,QAAS,UACT,YAAa,eACb,YAAa,kBACf,ECZA,OAAS,UAAAC,OAAc,UAYhB,IAAMC,EAAaC,EACxBC,GAAgB,EAAGC,IAAS,CAC1B,6BAA8B,GAC9B,sBAAuB,KACvB,YAAa,GACb,2BAA4B,IAC1BA,EAAKC,IAAW,CACd,6BAA8B,CAACA,EAAM,4BACvC,EAAE,EACJ,gBAAkBC,GAAcF,EAAI,CAAE,sBAAuBE,CAAU,CAAC,EACxE,eAAiBC,GAASH,EAAI,CAAE,YAAaG,CAAK,CAAC,CACrD,EAAE,CACJ,EhBXO,SAASC,IAAY,CAC1B,IAAMC,EAAcC,GAAO,EAAI,EACzB,CAACC,EAAcC,CAAe,EAAIC,GAAgB,EAClDC,EAAWC,GAAY,EACvBC,EAA0BN,GAAOI,EAAS,MAAM,EAChDG,EAAkBP,GAA+B,CAAC,CAAC,EACnDQ,EAAYC,EAAkB,IAAI,UAAU,EAC5CC,EAAUD,EAAkB,IAAI,QAAQ,EACxCE,EAAYF,EAAkB,IAAI,UAAU,EAC5CG,EAAUH,EAAkB,IAAI,QAAQ,EACxCI,EAAeJ,EAAkB,IAAI,aAAa,EAClDK,EAAeL,EAAkB,IAAI,aAAa,EAClDM,EAAaN,EAAkB,IAAI,WAAW,EAC9CO,EAAaP,EAAkB,IAAI,WAAW,EAC9CQ,EAAcR,EAAkB,IAAI,YAAY,EAChDS,EAAiBT,EAAkB,IAAI,eAAe,EACtDU,EAAgBC,EAAa,IAAI,cAAc,EAC/C,CAAE,YAAAC,EAAa,OAAAC,CAAO,EAAIF,EAAa,IAAI,KAAK,EAChDG,EAAkBC,EAAW,IAAI,gBAAgB,EAEvD,OAAAC,GAAU,IAAM,CACd,IAAMC,EAAiC,CAAC,EACxCC,GAAmBrB,EAAwB,OAAO,EAAE,QAClD,CAACsB,EAAOC,IAAQ,CACdH,EAAOG,CAAG,EAAID,CAChB,CACF,EACArB,EAAgB,QAAUmB,EAC1B,IAAMI,EACJ1B,EAAS,SAAS,MAAM2B,EAAiB,MAAQ,GAAG,EAAE,CAAC,GAAK,KAC1DD,GAAWP,EAAgBO,CAAS,CAC1C,EAAG,CAAC,CAAC,EAELL,GAAU,IAAM,CACd,GAAI,CAAC1B,EAAY,QAAS,CACxB,IAAIiC,EAAkB,GACpBC,EAAkB,GAClBC,EAAgB,GAChBC,EAAgB,GAChBC,EAAa,GACf,GAAIjB,IAAkB,UACpBa,EAAkBzB,EAAgB,mBAA+B,EACjE0B,EAAkB1B,EAAgB,mBAA+B,EACjE2B,EAAgB3B,EAAgB,iBAA6B,EAC7D4B,EAAgB5B,EAAgB,iBAA6B,EAC7D6B,EACE7B,EAAgB,oBAAgC,GAAKU,MAClD,CACL,GAAIb,EAAS,QAAU,WAAY,OACnC4B,EAAkBxB,GAAW,MAAQ,GACrCyB,GACGtB,GAAW,QAAU,KACrBA,GAAW,QAAU,KAAKA,GAAW,UAAY,IACpDuB,EAAgBxB,GAAS,MAAQ,GACjCyB,GACGvB,GAAS,QAAU,KACnBA,GAAS,QAAU,KAAKA,GAAS,UAAY,IAChDwB,EAAanB,EAEff,EACE,CACE,GAAI8B,GAAmB,CACrB,YAAwB,EAAGA,CAC7B,EACA,GAAIC,GAAmB,CACrB,YAAwB,EAAGA,CAC7B,EACA,GAAIC,GAAiB,CAAE,UAAsB,EAAGA,CAAc,EAC9D,GAAIC,GAAiB,CAAE,UAAsB,EAAGA,CAAc,EAC9D,GAAIC,GAAc,CAChB,aAAyB,EAAGA,EAAW,SAAS,CAClD,CACF,EACA,CAAE,QAAS,EAAK,CAClB,EAEFrC,EAAY,QAAU,EACxB,EAAG,CAACK,EAAS,SAAUa,EAAaT,EAAWG,EAAWD,EAASE,CAAO,CAAC,EAE3Ea,GAAU,IAAM,CACd,GAAIN,IAAkB,UAAW,CAC/B,IAAMa,EAAkB/B,EAAa,eAA2B,EAC1DgC,EAAkBhC,EAAa,eAA2B,EAC1DiC,EAAgBjC,EAAa,aAAyB,EACtDkC,EAAgBlC,EAAa,aAAyB,EACtDmC,EAAanC,EAAa,gBAA4B,EACtDO,EAAYa,EAAY,KAC3BgB,GAAeA,EAAW,OAASL,CACtC,EACMrB,EAAY2B,GAChBhB,EACAW,EACAzB,GAAa,IACf,EACME,EAAUW,EAAY,KACzBgB,GAAeA,EAAW,OAASH,CACtC,EACMtB,EAAU0B,GACdhB,EACAa,EACAzB,GAAW,IACb,EACMF,IACJK,EAAaL,CAAS,EAChBG,GAAWG,EAAaH,CAAS,GAEnCD,IACJK,EAAWL,CAAO,EACZE,GAASI,EAAWJ,CAAO,GAE/BwB,GAAYlB,EAAekB,CAAU,EAE7C,EAAG,CAACjB,CAAa,CAAC,EAEX,IACT,CAnHgBoB,EAAAzC,GAAA,aDPhB,OAAS,cAAA0C,OAAkB,2BAC3B,OAAS,mBAAAC,OAAuB,cAEzB,SAASC,GAAU,CACxB,SAAAC,EACA,GAAGC,CACL,EAIG,CACD,IAAMC,EAAoBC,GAAmB,EACvCC,EAASF,EAAoBG,GAAWC,GACxC,CAAE,YAAAC,CAAY,EAAIC,EAAa,IAAI,KAAK,EACxC,CAAE,mBAAAC,CAAmB,EAAIC,GAAW,EAEpCC,EAAYJ,EAAY,OAAOK,EAAe,EAEpD,OAAAC,GAAgB,CACd,oBAAqBZ,EAAM,oBAC3B,wBAAyBA,EAAM,wBAC/B,mBAAoBA,EAAM,mBAC1B,UAAAU,EACA,mBAAAF,CACF,CAAC,EAGCK,GAAA,cAAAA,GAAA,cACEA,GAAA,cAACV,EAAA,KAAQJ,CAAS,EACjBE,GAAqBY,GAAA,cAACC,GAAA,IAAU,CACnC,CAEJ,CA7BgBC,EAAAjB,GAAA,akBThB,OAAOkB,IAAS,aAAAC,OAAiB,QACjC,OAAS,eAAAC,OAAmB,mBAC5B,OAAS,gBAAAC,OAAoB,gBAC7B,OAAS,cAAAC,OAAkB,2BCH3B,OAAOC,MAAW,QAClB,OAAS,aAAAC,OAAiB,mBCD1B,OAAOC,GAAS,aAAAC,GAAW,YAAAC,OAAgB,QAC3C,OAAS,eAAAC,OAAmB,mBAG5B,OAAS,cAAAC,OAAkB,2BAC3B,OAAS,QAAAC,OAAY,eCLrB,OAAS,sBAAAC,GAAoB,eAAAC,OAAmB,mBAGzC,SAASC,GAAkB,CAChC,IAAMC,EAAoBC,GAAmB,EACvCC,EAAWC,GAAY,EAE7B,OAAAC,EA8BO,CAAE,iBA5BgBC,EAACC,GAAyB,CACjD,GAAIA,IAAiBF,EAAiB,YACpC,OAAOF,EAAS,IAAME,EAAiB,MAAO,CAAE,QAAS,EAAK,CAAC,EAG/D,CAACJ,GACA,OAAO,QAAQ,OAAS,OAAO,QAAQ,MAAM,IAAM,EAEpDE,EAAS,EAAE,EAGT,CACEE,EAAiB,UACjBA,EAAiB,UACjBA,EAAiB,QACjBA,EAAiB,QACjBA,EAAiB,SACjBA,EAAiB,QACjBA,EAAiB,MACjBA,EAAiB,WACnB,EAAE,SAASE,CAAY,EAEvBJ,EAASE,EAAiB,KAAM,CAAE,QAAS,EAAK,CAAC,EAC1CE,IAAiBF,EAAiB,kBACzCF,EAAS,IAAME,EAAiB,SAAU,CAAE,QAAS,EAAK,CAAC,CAEjE,EA1ByB,mBA4BC,CAC5B,CAnCgBC,EAAAN,EAAA,mBDoBhB,OACE,WAAAQ,GACA,eAAAC,GACA,sBAAAC,GACA,uBAAAC,GACA,oBAAAC,GACA,kBAAAC,GACA,gBAAAC,OACK,gBACP,OAAS,cAAAC,OAAkB,iCEhC3B,OAAS,aAAAC,GAAW,UAAAC,GAAQ,YAAAC,OAAgB,QA0B5C,OAAOC,OAAe,eAStB,OACE,wBAAAC,OAEK,wCASA,SAASC,IAA8B,CAC5C,IAAMC,EAAYC,EAAkB,IAAI,UAAU,EAC5CC,EAAUD,EAAkB,IAAI,QAAQ,EACxCE,EAAcF,EAAkB,IAAI,YAAY,EAChDG,EAAeH,EAAkB,IAAI,UAAU,EAC/CI,EAAeJ,EAAkB,IAAI,aAAa,EAClDK,EAAgBL,EAAkB,IAAI,cAAc,EACpDM,EAAeC,EAAiB,IAAI,aAAa,EACjDC,EAAmBD,EAAiB,IAAI,iBAAiB,EACzDE,EAAmBF,EAAiB,IAAI,iBAAiB,EAEzDG,EAAmBC,EAAgB,IAAI,iBAAiB,EACxDC,EAAcD,EAAgB,IAAI,kBAAkB,EAEpDE,EAAkBF,EAAgB,IAAI,gBAAgB,EACtDG,EAAOC,EAAa,IAAI,KAAK,EAC7BC,EAAiBT,EAAiB,IAAI,eAAe,EACrDU,EAAWV,EAAiB,IAAI,SAAS,EACzCW,EACJX,EAAiB,IAAI,yBAAyB,EAC1CY,EAAeH,GAAkBC,EACjCG,EAAmBC,GAAO,EAAK,EAC/BC,EAAqBD,GAAiC,IAAI,EAC1DE,EAAqBF,GAA+B,IAAI,EAExD,CAACG,EAASC,CAAU,EAAIC,GAAS,EAAK,EACtC,CAACC,EAAQC,CAAS,EAAIF,GAA6B,CAAC,CAAC,EACrD,CAACG,EAAUC,CAAW,EAAIJ,GAAgC,CAAC,CAAC,EAMlE,OAJAK,GAAU,IACD,IAAMR,EAAmB,SAAS,MAAM,EAC9C,CAAC,CAAC,EAED,CAACxB,GAAa,CAACE,GAAW,CAACC,GAAe,CAACC,EACtC,CAAE,QAAS,GAAO,SAAU,CAAC,EAAG,OAAQ,CAAC,EAAG,YAAa,IAAK,EA6LhE,CAAE,QAAAqB,EAAS,SAAAK,EAAU,OAAAF,EAAQ,YA3LhBK,EAAA,SAA8C,CAChE,GAAIZ,EAAiB,QAAS,CAC5B,IAAMa,EAAoC,CACxC,SAAUd,EAAa,SAAS,EAChC,uBAAwBD,CAC1B,EAMA,OAJIS,EAAO,OAAS,GAAGC,EAAU,CAAC,CAAC,EAC/BC,EAAS,OAAS,GAAGC,EAAY,CAAC,CAAC,EACvCV,EAAiB,QAAU,GAEvBE,EAAmB,QACLY,GACdhC,EAAY,SAAS,EACrBoB,EAAmB,QACnBa,GAAqBtB,CAAe,EACpCoB,EACA,GACAnB,CACF,EAIF,OAGFS,EAAmB,QAAU,IAAI,gBAEjCE,EAAW,EAAI,EAEf,IAAMW,EAAcC,GAClBtC,EACAE,EACAC,EACAQ,EACAG,EACAK,EACAC,EACAb,EACAE,EACAC,EACAN,EACAS,CACF,EAEA,GAAI,CACF,IAAM0B,EAAkB,MAAMC,GAAY,EAAE,aAAaH,EAAa,CACpE,OAAQb,EAAmB,SAAS,MACtC,CAAC,EAMD,GAJAA,EAAmB,QAAU,KAE7BE,EAAW,EAAK,EAGd,CAACa,EAAgB,QACjB,CAAC,IAAIE,GAAUF,EAAgB,aAAa,EAAE,UAC5C,IAAIE,GAAUtC,GAAe,IAAI,CACnC,EACA,CACA0B,EAAWa,GACTA,EAAU,OAAO,CACf,MACF,CAAC,CACH,EACA,OAGF,IAAMC,EAAiE,CACrE,OAAQ,CAAC,EACT,SAAU,CAAC,CACb,EAIA,GAFqBC,GAAexC,EAAcmC,CAAgB,EAEhD,CAChBlC,EAAakC,CAAe,EAC5B,IAAMM,EAAyB,IAAIJ,GACjCF,EAAgB,QAAQ,cAAgB,GAC1C,EAAE,aAAarC,EAAQ,UAAY,CAAC,EAE9B4C,GAAcC,GAClBzC,EACAuC,CACF,EACsBG,GAAsB1C,EAAewC,EAAW,EAGpEH,EAAiB,OAAO,KAAK,CAC3B,MACF,CAAC,EACMM,GAA0B7C,EAAcmC,CAAe,EAC9DI,EAAiB,SAAS,KAAK,CAC7B,OACA,gBAAiBO,EACfC,GAAqBZ,CAAe,CACtC,EACA,iBAAkBW,EAChBE,GACED,GAAqB/C,CAAY,EACjC+C,GAAqBZ,CAAe,CACtC,EACA,KACA,CACF,CACF,CAAC,EACMc,GAA4BjD,EAAcmC,CAAe,EAChEI,EAAiB,SAAS,KAAK,CAC7B,MACF,CAAC,EACMW,GAAuBlD,EAAcmC,CAAe,EAC3DI,EAAiB,SAAS,KAAK,CAC7B,MACF,CAAC,EACMY,GAAuBnD,EAAcmC,CAAe,GAC3DI,EAAiB,SAAS,KAAK,CAC7B,MACF,CAAC,EAGL,IAAMa,GAAkBC,GACtBlB,EACAzB,CACF,EACsB0C,GAAgB,SAAW,GAG/Cb,EAAiB,OAAO,KAAK,CAC3B,OACA,SAAUa,EACZ,CAAC,EAEH,IAAME,GAAsBC,GAAuBvD,CAAY,EAE1DwD,GAAkBxC,EAAa,SAAS,EAAGsC,EAAmB,GACjEf,EAAiB,OAAO,KAAK,CAC3B,OACA,oBAAAe,EACF,CAAC,EAEH,IAAMG,GAAWlB,EAAiB,OAAO,SAAW,EAC9CmB,GAAanB,EAAiB,SAAS,SAAW,EAExD,IACGkB,IAAa,CAACA,IAAYxC,EAAiB,WAC3CyC,IAAe,CAACA,IAAczC,EAAiB,SAChD,CACA,IAAMa,EAAoC,CACxC,SAAUd,EAAa,SAAS,EAChC,uBAAwBD,CAC1B,EAUA,OARgBgB,GACdhC,EAAY,SAAS,EACrBoC,EACAH,GAAqBtB,CAAe,EACpCoB,EACA,GACAnB,CACF,OAEUM,EAAiB,UAC3BA,EAAiB,QAAU,GAC3BQ,EAAUc,EAAiB,MAAM,EACjCZ,EAAYY,EAAiB,QAAQ,EACrCpB,EAAmB,QAAUgB,GAE/B,MACF,OAASwB,EAAP,CACA,GAAKA,GAAe,OAAS,eAC3B,OAGF,IAAMC,EAAUD,GAAe,UAAU,OAEzCrC,EAAW,EAAK,EAChBG,EAAU,CACR,CACE,OACA,OAAAmC,CACF,CACF,CAAC,EAED,MACF,CACF,EAzLoB,cA2L4B,CAClD,CAhOgB/B,EAAAlC,GAAA,kBC/ChB,OAAOkE,OAAW,QAClB,OAAS,iBAAAC,GAAe,uBAAAC,OAA2B,gBAEnD,OAAS,eAAAC,OAAmB,mBAGrB,SAASC,GAAkBC,EAA4B,CAC5D,IAAMC,EAAWC,GAAY,EAE7B,OAAOF,EAAO,QAASG,GAAU,CAC/B,OAAQA,EAAM,KAAM,CAClB,OACE,MAAO,2CACT,OACE,MAAO,0BACLA,EAAM,OAAS,aAAaA,EAAM,UAAY,wBAGlD,OACE,MAAO,+DACT,OACE,OACEC,GAAA,cAACC,GAAA,CACC,oBAAqBF,EAAM,oBAC3B,eAAgB,IAAMF,EAAS,IAAMK,EAAiB,QAAQ,EAChE,EAEJ,OACE,OAAOF,GAAA,cAACG,GAAA,CAAc,SAAUJ,EAAM,SAAU,EAClD,QACE,MAAO,CAAC,CACZ,CACF,CAAC,CACH,CA3BgBK,EAAAT,GAAA,qBCDT,SAASU,GAAoBC,EAAqC,CACvE,OAAOA,EAAS,QAASC,GAAY,CACnC,OAAQA,EAAQ,KAAM,CACpB,OACE,MAAO,0BACT,OACE,MAAO,4BAA4BA,EAAQ,oBAAoBA,EAAQ,6BAEzE,OACE,MAAO,mCACT,OACE,MAAO,yCACT,QACE,MAAO,CAAC,CACZ,CACF,CAAC,CACH,CAhBgBC,EAAAH,GAAA,uBJqCT,SAASI,GAAgB,CAC9B,yBAAAC,CACF,EAEG,CACD,IAAMC,EAAWC,GAAY,EACvB,CAAE,iBAAAC,CAAiB,EAAIC,EAAgB,EACvCC,EAAYC,EAAkB,IAAI,UAAU,EAC5CC,EAAoBD,EAAkB,IAAI,QAAQ,EAClDE,EAAyBF,EAAkB,IAAI,MAAM,EACrDG,EAAkBC,EAAW,IAAI,gBAAgB,EACjD,CAAE,YAAAC,EAAa,OAAAC,CAAO,EAAIC,EAAa,IAAI,KAAK,EAChDC,EAAoBD,EAAa,IAAI,cAAc,EACnDE,EAAmBC,EAAgB,IAAI,iBAAiB,EACxDC,EAAkBD,EAAgB,IAAI,gBAAgB,EACtDE,EAAoBF,EAAgB,IAAI,kBAAkB,EAC1DG,EAAuBH,EAAgB,IAAI,qBAAqB,EAChEI,EAAsBJ,EAAgB,IAAI,oBAAoB,EAC9DK,EAAoBL,EAAgB,IAAI,kBAAkB,EAC1DM,EAAWC,EAAiB,IAAI,SAAS,EACzCC,EAAiBD,EAAiB,IAAI,eAAe,EACrDE,EAAgBnB,EAAkB,IAAI,cAAc,EACpDoB,EAAiBpB,EAAkB,IAAI,eAAe,EACtDqB,EAAiBrB,EAAkB,IAAI,eAAe,EACtD,CAACsB,EAAgBC,CAAiB,EAAIC,GAAiB,EAAE,EACzDC,EAAyBC,GAC7BzB,EACA,CAAC,CAACC,CACJ,EACM,CAACyB,EAAkBC,CAAmB,EAAIJ,GAAiB,EAAE,EAE7D,CAAE,QAAAK,CAAQ,EAAIC,GAAW,EACzB,CACJ,QAASC,EACT,OAAAC,EACA,SAAAC,EACA,YAAAC,EACF,EAAIC,GAAe,EAEbC,GAAmBlB,GAAkBF,EAErCqB,GAA0B,CAACL,EAAO,KACrCM,GAAUA,EAAM,OAAS,CAC5B,EAEM,CAAE,cAAAC,GAAe,QAAAC,EAAQ,EAAIC,GAAW,EAExCC,GAAY3C,GAAW,QAAQ,MAAM,CAAC,EACtC4C,EACJ5C,GAAW,QAAQ,MAAMA,GAAW,QAAQ,MAAM,OAAS,CAAC,EAExD6C,GAAaC,EAAeH,IAAW,WAAY,EAAG,CAAC,EACvDI,GAAWD,EAAeF,GAAU,SAAU,EAAG,CAAC,EACxDI,GAAU,IAAM,CACdjC,EAAoB,EAChBF,GACFC,EAAqB,EAAE,CAE3B,EAAG,CAAC,CAAC,EACL,IAAMmC,GACJjD,GAAW,QAAQ,MAAMA,GAAW,QAAQ,MAAM,OAAS,CAAC,EAAE,GAAG,WAC7DkD,GAAmB,CAAC,CAAClD,GAAW,QAAQ,MAAM,KACjDmD,GAASA,EAAK,KAAK,aAAeF,EACrC,EAEMG,GAAoBC,GACxB3C,EACAE,EACA4B,GACAU,GAAmB,GAAKtB,CAC1B,EAEM0B,GAAqBC,EAACC,GAAmB,CAC7C,IAAMC,GAAUD,EAChBE,GAAmCN,EAAiB,EAAE,QACnDO,IAAiClB,KAAUkB,GAAkBF,EAAO,CACvE,CACF,EAL2B,sBAOrBG,GAAgBC,GAAiB7D,EAAWO,CAAM,EAElDuD,GACJ,CAAC1C,GAAiB,CAACC,GAAkB,CAACA,EAAe,GAAG,CAAC,EACrD,KACA0C,GACE3C,EAAc,SAAS,EACvBC,EAAe,SAAS,CAC1B,EAEN,OACE2C,EAAA,cAACC,GAAA,CACC,gBAAiBC,GAAkBlE,CAAS,EAC5C,kBAAmBoD,GACnB,qBAAsBtC,EACtB,kBAAmBD,EACnB,yBAA0BlB,EAC1B,yBAA0BwE,GAC1B,mBAAoB,CAAC,CAACvC,EACtB,oBAAqBC,EACrB,OAAQ/B,EAAiB,KAAK,KAAMsE,EAAiB,WAAW,EAChE,UAAW,SAAY,CACrBjC,KAAc,EAAE,KAAK,MAAOgB,GAAS,CACnC,GAAIA,EACF,GAAI,CACF,MAAMrB,GAAS,OACb,OACA,CAAE,YAAaqB,CAAK,EACpB,CAAE,GAAIA,EAAK,SAAU,CACvB,EACA/C,EAAgB+C,EAAK,SAAS,EAC9BvD,EAAS,IAAMwE,EAAiB,MAAQ,IAAIjB,EAAK,YAAa,CAC5D,QAAS,EACX,CAAC,EACD,WAAW,IAAM,CACf7B,EAAe,EAAE,CACnB,EAAG,CAAC,CACN,OAAS+C,GAAP,CACA7C,EAAkB,UAAa6C,IAAW,OAAO,CACnD,CAEJ,CAAC,CACH,EACA,iBAAkBnB,GAClB,SAAWM,GAAWxC,EAAkBwC,CAAM,EAC9C,gBACE/C,IAAsB,WACtB6D,GACEpE,EACA0B,EACAf,EACAb,EACAoD,EACF,EAEF,mBAAqBI,GAAWF,GAAmBE,CAAM,EACzD,oBAAsBA,GACpBE,GAAmCN,EAAiB,EAAE,OAAS,EAC3DmB,GAAoBjE,EAAakD,CAAM,EACvC,GAEN,cACEQ,EAAA,cAAAA,EAAA,cACEA,EAAA,cAACQ,GAAA,CACC,MAAO,CACL,YAAa7B,IAAW,KAAK,YAAc,GAC3C,KAAMA,IAAW,KAAK,gBAAkB,EAC1C,EACA,MAAO,CACL,OAAQA,IAAW,KAAK,QAAU,GAClC,MAAOA,IAAW,KAAK,MAAQ,EACjC,EACA,SAAUvB,EAAgB0B,EAAe1B,CAAa,EAAI,KAC1D,OAAQyB,GACR,MAAO4B,GAAK,EAAE,MAAM,EACpB,cACEhE,IAAsB,UAClBA,EACAiB,EAER,EACAsC,EAAA,cAACU,GAAA,CAAQ,KAAM,GAAI,EACnBV,EAAA,cAACQ,GAAA,CACC,MAAO,CACL,YAAa5B,GAAU,GAAG,YAAc,GACxC,KAAMA,GAAU,GAAG,gBAAkB,EACvC,EACA,MAAO,CACL,OAAQA,GAAU,GAAG,QAAU,GAC/B,MAAOA,GAAU,GAAG,MAAQ,EAC9B,EACA,SAAUvB,EAAiByB,EAAezB,CAAc,EAAI,KAC5D,OAAQ0B,GACR,MAAO0B,GAAK,EAAE,IAAI,EAClB,cACEhE,IAAsB,UAClBA,EACAiB,EAEN,iBACGoC,GACCE,EAAA,cAACW,GAAA,CACC,iBAAkB7B,EAAegB,GAAkB,EAAG,CAAC,EACvD,qBAAsB,CAAC,CAACA,IAAkB,GAAG,CAAC,EAChD,EAJkB,KAOxB,CACF,EAEF,cACEE,EAAA,cAACY,GAAA,CACC,OAAQ5E,EACR,SAAU8C,EAAec,GAAe,EAAG,CAAC,EAC9C,EAEF,QAAS5B,EACT,OACET,EACI,CAACA,EAAgB,GAAGsD,GAAkB5C,CAAM,CAAC,EAC7C4C,GAAkB5C,CAAM,EAE9B,SAAU6C,GAAoB5C,CAAQ,EACtC,cACE8B,EAAA,cAAAA,EAAA,cACGvD,IAAsB,UAAYuD,EAAA,cAACe,GAAA,IAAmB,EACtDtE,IAAsB,UAAY6B,IACjC0B,EAAA,cAACU,GAAA,IAAQ,EAEXV,EAAA,cAACgB,GAAA,CACC,iBAAkB3C,GAClB,aAAcA,IAAoB4C,GAClC,eAAgB,IAAMrF,EAAS,IAAMwE,EAAiB,QAAQ,EAChE,CACF,EAEF,mBACElC,EAAS,OAAS,GAAKD,EAAO,OAAS,EACnC,GAAGwC,GAAK,EAAE,iBAAiB,IAC3B,GAAGA,GAAK,EAAE,eAAe,IAEjC,CAEJ,CA9NgBlB,EAAA7D,GAAA,mBK1ChB,OAAS,WAAAwF,OAAe,gBACxB,OAAS,cAAAC,OAAkB,iCAC3B,OAAOC,OAAW,QAClB,OAAS,eAAAC,OAAmB,mBCGrB,IAAMC,GAAkBC,EAACC,GAAiC,CAC/D,IAAMC,EAAmC,CAAC,EAE1C,OAAAD,GAAS,OAAO,EAAE,QAAQ,CAACE,EAAGC,IAAO,CACnC,IAAMC,EAAUF,EAAE,KAAK,WAAW,EAE9BE,GAAS,aACXH,EAAO,KAAK,CACV,GAAAE,EACA,KAAMC,GAAS,WACjB,CAAC,CAEL,CAAC,EAEMH,EAAO,KACZ,CAACI,EAAGC,IAAM,OAAOA,EAAE,KAAK,YAAY,EAAI,OAAOD,EAAE,KAAK,YAAY,CACpE,CACF,EAjB+B,mBCL/B,OAAOE,OAAW,QAGX,IAAMC,GAA4BC,EAAAC,GAAS,CAChD,IAAMC,EAMF,IAAI,IAAI,CACV,CACE,QACA,CACE,MAAO,QACP,MAAO,CAAC,CACV,CACF,EACA,CACE,OACA,CACE,MAAO,YACP,MAAO,CAAC,CACV,CACF,EACA,CACE,QACA,CACE,MAAO,aACP,MAAO,CAAC,CACV,CACF,EACA,CACE,OACA,CACE,MAAO,YACP,MAAO,CAAC,CACV,CACF,EACA,CACE,UACA,CACE,MAAO,UACP,MAAO,CAAC,CACV,CACF,CACF,CAAC,EAEKC,EAAMC,GAAM,EAClB,OAAAH,EAAM,QAAQI,GAAQ,CACpB,IAAMC,EAAWF,GAAM,OAAOC,EAAK,YAAY,CAAC,EAC5CF,EAAI,OAAOG,EAAU,KAAK,EAAGJ,EAAO,IAAI,OAAO,GAAG,MAAM,KAAKG,CAAI,EAC5DF,EAAI,OAAOG,EAAU,MAAM,EAAGJ,EAAO,IAAI,MAAM,GAAG,MAAM,KAAKG,CAAI,EACjEF,EAAI,OAAOG,EAAU,OAAO,EACnCJ,EAAO,IAAI,OAAO,GAAG,MAAM,KAAKG,CAAI,EAC7BF,EAAI,OAAOG,EAAU,MAAM,EAAGJ,EAAO,IAAI,MAAM,GAAG,MAAM,KAAKG,CAAI,EACrEH,EAAO,IAAI,SAAS,GAAG,MAAM,KAAKG,CAAI,CAC7C,CAAC,EAEM,MAAM,KAAKH,EAAO,OAAO,CAAC,CACnC,EAzDyC,oBFMlC,SAASK,IAAc,CAC5B,IAAMC,EAAkBC,EAAW,IAAI,gBAAgB,EACjDC,EAAWC,GAAY,EACvB,CAAE,iBAAAC,CAAiB,EAAIC,EAAgB,EACvC,CAAE,QAAAC,EAAS,MAAAC,CAAM,EAAIC,GAAW,EAChCC,EAAeC,GAAgBJ,CAAO,EAAE,IAAI,CAAC,CAAE,KAAAK,CAAK,IAAMA,CAAI,EAE9DC,EAAU,CAACL,EAAM,oBAEvB,OACEM,GAAA,cAACC,GAAA,CACC,KAAML,EACN,QAASM,GACT,QAASH,EACT,YAAcI,GAAc,CAC1BhB,EAAgBgB,CAAS,EACzBd,EAAS,GAAGc,IAAa,CAAE,QAAS,EAAK,CAAC,CAC5C,EACA,OAAQZ,EAAiB,KAAK,KAAMa,EAAiB,KAAK,EAC5D,CAEJ,CArBgBC,EAAAnB,GAAA,eGVhB,OAAOoB,IAAS,aAAAC,OAAiB,QACjC,OAAS,eAAAC,OAAmB,mBAC5B,OAAS,aAAAC,OAAiB,gBCF1B,OAAOC,IAAS,aAAAC,GAAW,UAAAC,GAAQ,YAAAC,OAAgB,QACnD,OAAS,sBAAAC,GAAoB,mBAAAC,OAAuB,mBACpD,OAAS,UAAAC,GAAQ,UAAAC,GAAQ,oBAAAC,OAAwB,gBAIjD,SAASC,GAAe,CAAE,MAAAC,CAAM,EAAsB,CACpD,IAAMC,EAAcC,GAAO,EAAI,EACzB,CAACC,EAAcC,CAAe,EAAIC,GAAgB,EAClDC,EAAeC,EAAkB,IAAI,aAAa,EAExD,OAAAC,GAAU,IAAM,CACd,GAAKP,EAAY,QAefA,EAAY,QAAU,OAfE,CACxB,IAAMQ,EAAkBN,EAAa,eAA2B,EAC1DO,EAAkBP,EAAa,eAA2B,EAC1DQ,EAAgBR,EAAa,aAAyB,EACtDS,EAAgBT,EAAa,aAAyB,EAC5DC,EAAgB,CACd,GAAIO,GAAiB,CAAE,YAAwB,EAAGA,CAAc,EAChE,GAAIC,GAAiB,CAAE,YAAwB,EAAGA,CAAc,EAChE,GAAIH,GAAmB,CAAE,UAAsB,EAAGA,CAAgB,EAClE,GAAIC,GAAmB,CAAE,UAAsB,EAAGA,CAAgB,EAClE,GAAIJ,GAAgB,CAClB,aAAyB,EAAGA,EAAa,SAAS,CACpD,CACF,CAAC,EAIL,EAAG,CAACN,CAAK,CAAC,EAEH,IACT,CA1BSa,EAAAd,GAAA,kBA4BT,IAAMe,GAAwBC,GAAO,MAAO,CAC1C,SAAU,WACV,OAAQ,QACR,KAAM,MACN,UAAW,sBACb,CAAC,EAEM,SAASC,IAAuB,CACrC,IAAMC,EAAkBV,EAAkB,IAAI,gBAAgB,EACxDW,EAAoBC,GAAmB,EACvC,CAACnB,EAAOoB,CAAQ,EAAIC,GAAS,CAAC,EAEpC,OACEC,GAAA,cAACR,GAAA,KACCQ,GAAA,cAACC,GAAA,CACC,QAAQ,QACR,QAAS,IAAM,CACbN,EAAgB,EAChBG,EAAUI,GAASA,EAAO,CAAC,CAC7B,GACAF,GAAA,cAACG,GAAA,CAAiB,KAAM,GAAI,EAC3BP,GAAqBI,GAAA,cAACvB,GAAA,CAAe,MAAOC,EAAO,CACtD,CACF,CAEJ,CAlBgBa,EAAAG,GAAA,wBCzCT,IAAMU,GAAgB,CAC3B,mBAAoB,8DACtB,EF0BA,OAAOC,OAAe,eAEf,SAASC,IAAO,CACrB,IAAMC,EAAWC,GAAY,EACvBC,EAAYC,EAAkB,IAAI,UAAU,EAC5CC,EAAYD,EAAkB,IAAI,UAAU,EAC5CE,EAAUF,EAAkB,IAAI,QAAQ,EACxCG,EAAUH,EAAkB,IAAI,QAAQ,EACxCI,EAAiBJ,EAAkB,IAAI,eAAe,EACtDK,EAAgBL,EAAkB,IAAI,cAAc,EACpDM,EAAcN,EAAkB,IAAI,YAAY,EAChDO,EAAeP,EAAkB,IAAI,aAAa,EAClDQ,EAAiBR,EAAkB,IAAI,eAAe,EACtDS,EAAYT,EAAkB,IAAI,UAAU,EAC5CU,EAASC,EAAa,IAAI,KAAK,EAAE,OACjCC,EAAoBZ,EAAkB,IAAI,QAAQ,EAClDa,EAAiBb,EAAkB,IAAI,MAAM,EAC7Cc,EAAoBH,EAAa,IAAI,cAAc,EACnDI,EAAmBC,EAAgB,IAAI,iBAAiB,EACxDC,EAAiBC,EAAW,IAAI,eAAe,EAE/CC,EACJL,IAAsB,SAClBM,GAAc,mBACdP,EAEAQ,EAAuB,GAEvBC,EACJ,CAAC,CAAChB,IAAgB,CAAC,CAACG,GAAaG,GAAqB,CAAC,CAACC,GAEpDU,EAAeC,GAAenB,EAAeG,CAAc,EAE3DiB,EAAgBC,GAAsBrB,EAAekB,CAAY,EAEjE,CAAE,qBAAAI,EAAsB,eAAAC,EAAgB,KAAAC,CAAK,EACjDC,GAAkBrB,CAAS,EAEvBsB,EAA8B,CAACC,GACnCvB,EACAH,EACAD,EACAG,CACF,EAEMyB,EAAkBC,GACtBpB,EACAC,EACAH,EACAH,EACA0B,GAAc1B,CAAS,EACvBgB,EACAM,EACAV,EACAf,CACF,EAEM8B,EAAgBC,GAAiB5B,EAAWC,CAAM,EAElD4B,EAAUC,GAAWH,CAAa,EAElCI,EACFzC,GAAeE,EACbwC,EACEC,GACE3B,EACAhB,GAAW,KACXE,GAAW,OACXA,GAAW,OACb,GAAG,QAAU,IACb,CACF,EACA,IAEA0C,GACF5C,GAAeE,EACbwC,EACEC,GACE3B,EACAhB,GAAW,KACXE,GAAW,OACXA,GAAW,OACb,GAAG,QAAU,IACbyC,GACE3B,EACAhB,GAAW,KACXE,GAAW,OACXA,GAAW,OACb,GAAG,OACL,EACA,IAEN2C,GAAU,KACR3B,EAAe4B,EAAiB,IAAI,EAE7B5B,EAAe,KAAK,KAAM,EAAE,GAClC,CAAC,CAAC,EAEL,IAAM6B,GACJ,CAACzC,GAAiB,CAACG,GAAkB,CAACA,EAAe,GAAG,CAAC,EACrD,KACAuC,GACE1C,EAAc,SAAS,EACvBG,EAAe,SAAS,CAC1B,EAEN,OACEwC,GAAA,cAACC,GAAA,CACC,UAAWxC,EACX,eAAgBI,EAChB,eAAgBqC,GAChB,eAAgB,IAAMrD,EAASgD,EAAiB,KAAK,EACrD,gBAAiB,IAAMhD,EAASgD,EAAiB,QAAQ,EACzD,eAAgBzC,EAChB,UAAWL,EACX,QAASG,EACT,UAAWD,EACX,QAASE,EACT,aACEI,EACIkC,EAAe,IAAIU,GAAU5C,CAAY,CAAC,EAC1CkC,EAAe,IAAIU,GAAU,CAAC,CAAC,EAErC,YAAa7C,EACb,cAAeQ,EACf,cAAeQ,EACf,kBAAmBV,EACnB,eAAgB6B,EAAejC,CAAc,EAC7C,cAAeiC,EAAepC,CAAa,EAC3C,gBAAiB4B,EAAgB,MACjC,mBAAoBA,EAAgB,SACpC,gBAAiB,IAAM,CACjBA,EAAgB,QAAU,iBAC5BpC,EAASgD,EAAiB,OAAO,EAEjChD,EAASgD,EAAiB,YAAa,CAAE,QAAS,EAAK,CAAC,CAE5D,EACA,aAAeO,IAAU,CACvBvD,EAASuD,EAAK,CAChB,EACA,aAAeA,IAAU,CACvBvD,EAASuD,EAAK,CAChB,EACA,QAASd,EACT,aAAcnB,EACd,cAAegB,GACf,KAAMN,EACN,qBAAsBF,EACtB,eAAgBC,EAChB,cAAea,EAAeL,EAAe,EAAG,CAAC,EACjD,wBAAyBY,GAAA,cAACK,GAAA,IAAqB,EAC/C,iBAAkBtC,EAClB,iBAAkB0B,EAAeK,GAAkB,EAAG,CAAC,EACvD,qBAAsB,CAAC,CAACA,IAAkB,GAAG,CAAC,EAC9C,iBAAkBH,GAClB,aAAcH,EACd,UAAWc,GAAgBC,GAAiB9C,CAAS,CAAC,EACtD,cAAe+C,GAAqB/C,CAAS,EAC7C,eAAgBgC,EAAeZ,GAAM,YAAc,IAAI,EACzD,CAEJ,CAhKgB4B,EAAA7D,GAAA,QG9BhB,OAAS,4BAAA8D,OAAgC,gBACzC,OAAOC,OAAW,QASX,SAASC,GAAoB,CAAE,kBAAAC,CAAkB,EAAc,CACpE,IAAMC,EAAWC,EAAa,IAAI,KAAK,EAAE,SACnCC,EAAoBD,EAAa,IAAI,cAAc,EACnDE,EAAwBC,EAAiB,IAAI,sBAAsB,EACnEC,EACJD,EAAiB,IAAI,yBAAyB,EAC1CE,EACJF,EAAiB,IAAI,0BAA0B,EAE3C,CAAE,iBAAAG,CAAiB,EAAIC,EAAgB,EAEvCC,EAKD,CAAC,EACN,OAAAC,EAAoBV,EAAS,IAAKW,GAAMA,EAAE,YAAY,CAAC,EACpD,IAAKC,GACGZ,EAAS,KAAMW,GAAMA,EAAE,eAAiBC,CAAY,CAC5D,EACA,KAAMD,GAAM,CACX,GAAIA,EACF,QAAWE,KAAQF,EAAE,MACnBF,EAAqB,KAAK,CACxB,MAAOE,EAAE,aACT,KAAMA,EAAE,KACR,KAAAE,EACA,SAAU,CAACR,EAAyB,SAASM,EAAE,YAAY,CAC7D,CAAC,CAGP,CAAC,EAGDG,GAAA,cAACC,GAAA,CACC,UAAWT,EACX,KACEP,EACIU,EAAqB,OAClBO,GACCjB,EAAkB,OAAQY,GAAMA,IAAMK,EAAK,KAAK,EAAE,OAAS,CAC/D,EACAP,EAEN,SAAWQ,GACTd,EAAsBc,EAAgB,KAAK,EAE7C,OAAQV,EAAiB,KAAK,KAAMW,EAAiB,gBAAgB,EACrE,cAAehB,EACjB,CAEJ,CApDgBiB,EAAArB,GAAA,uBCVhB,OAAOsB,OAAW,QAClB,OAAS,sBAAAC,OAA0B,gBAW5B,SAASC,GAAgBC,EAAkB,CAChD,GAAM,CAAE,KAAAC,EAAM,gBAAAC,CAAgB,EAAIF,EAC5BG,EAAcD,EAChBE,EAAa,IACV,KAAK,EACL,YAAY,OAAQC,GAAUH,EAAgB,SAASG,EAAM,IAAI,CAAC,EACrED,EAAa,IAAI,KAAK,EAAE,YACtBE,EAAgBF,EAAa,IAAI,cAAc,EAC/CG,EAAYC,EAAkB,IAAI,UAAU,EAC5CC,EAAUD,EAAkB,IAAI,QAAQ,EACxCE,EAAeF,EAAkB,IAAI,aAAa,EAClDG,EAAaH,EAAkB,IAAI,WAAW,EAE9C,CAAE,iBAAAI,CAAiB,EAAIC,EAAgB,EAE7C,OACEC,GAAA,cAACC,GAAA,CACC,KAAMd,IAAS,OAAS,SAAW,cACnC,KAAME,EACN,SAAUF,IAAS,OAASM,EAAYE,EACxC,cAAeH,EACf,SAAWD,GAAU,CACfJ,IAAS,OAAQS,EAAaL,EAAO,EAAI,EACxCM,EAAWN,EAAO,EAAI,EAC3BO,EAAiBI,EAAiB,SAAS,CAC7C,EACA,OAAQJ,EAAiB,KAAK,KAAMI,EAAiB,SAAS,EAChE,CAEJ,CA7BgBC,EAAAlB,GAAA,mBCZhB,OAAOmB,OAAW,QAClB,OAAS,iBAAAC,OAAqB,gBAoBvB,SAASC,GAAgBC,EAAkB,CAChD,GAAM,CAAE,iBAAAC,CAAiB,EAAIC,EAAgB,EAEvC,CAAE,KAAAC,EAAM,gBAAAC,CAAgB,EAAIJ,EAC5BK,EAAeC,EAAkB,IAAI,aAAa,EAClDC,EAAoBD,EAAkB,IAAI,kBAAkB,EAC5DE,EAAwBJ,EAC1BC,EAAa,OAAQI,GACnBL,EAAgB,KAAMM,GACpBC,EAAeD,EAAgBD,CAAK,CACtC,CACF,EACAJ,EAEIO,EAA6BR,EACjCG,EAAkB,OAAQE,GACxBL,EAAgB,KAAMM,GACpBC,EAAeD,EAAgBD,CAAK,CACtC,CACF,EACAF,EAEEM,EAAYP,EAAkB,IAAI,UAAU,EAC5CQ,EAAUR,EAAkB,IAAI,QAAQ,EACxCS,EAAeT,EAAkB,IAAI,aAAa,EAClDU,EAAaV,EAAkB,IAAI,WAAW,EAC9CW,EAAoBC,EAAa,IAAI,cAAc,EAEzD,OACEC,GAAA,cAACC,GAAA,CACC,KAAMjB,IAAS,OAAS,SAAW,cACnC,KAAMA,GAAQ,OAASK,EAAwBI,EAC/C,SAAUT,IAAS,OAASU,EAAYC,EACxC,SAAWL,GAAU,CACfN,IAAS,OAAQY,EAAaN,CAAK,EAClCO,EAAWP,CAAK,EACrBR,EAAiBoB,EAAiB,SAAS,CAC7C,EACA,OAAQpB,EAAiB,KAAK,KAAMoB,EAAiB,SAAS,EAC9D,cAAeJ,EACjB,CAEJ,CA1CgBK,EAAAvB,GAAA,mBCrBhB,OAAOwB,OAAW,QAClB,OAAS,YAAAC,OAAgB,gBAGzB,OAAS,eAAAC,OAAmB,mBAarB,SAASC,GAAa,CAAE,kBAAAC,EAAmB,YAAAC,CAAY,EAAc,CAC1E,IAAMC,EAAWC,EAAiB,IAAI,SAAS,EACzCC,EAAcD,EAAiB,IAAI,YAAY,EAC/CE,EACJF,EAAiB,IAAI,yBAAyB,EAC1CG,EAAiBH,EAAiB,IAAI,eAAe,EACrDI,EAAoBJ,EAAiB,IAAI,kBAAkB,EAC3DK,EAAQL,EAAiB,IAAI,MAAM,EACnCM,EAAWN,EAAiB,IAAI,SAAS,EACzCO,EAAWC,EAAa,IAAI,KAAK,EAAE,SACnCC,EAAWC,GAAY,EACvB,CAAE,iBAAAC,CAAiB,EAAIC,EAAgB,EAEvCC,EAAkBb,EAAiB,IAAI,gBAAgB,EACvDc,EAAwBd,EAAiB,IAAI,sBAAsB,EACnEe,EAAoBP,EAAa,IAAI,cAAc,EAEnDQ,EAKD,CAAC,EACNC,EAAoBV,EAAS,IAAKW,GAAMA,EAAE,YAAY,CAAC,EACpD,IAAKC,GACGZ,EAAS,KAAMW,GAAMA,EAAE,eAAiBC,CAAY,CAC5D,EACA,KAAMD,GAAM,CACX,GAAIA,EACF,QAAWE,KAAQF,EAAE,MACnBF,EAAqB,KAAK,CACxB,MAAOE,EAAE,aACT,KAAMA,EAAE,KACR,KAAAE,EACA,SAAU,CAAClB,EAAyB,SAASgB,EAAE,YAAY,CAC7D,CAAC,CAGP,CAAC,EACHrB,GACEmB,EAAqB,OAClBK,GAASxB,EAAkB,OAAQqB,GAAMA,IAAMG,EAAK,KAAK,EAAE,OAAS,CACvE,EAEF,IAAMC,EAAgCzB,EAClCmB,EAAqB,OAClBK,GAASxB,EAAkB,OAAQqB,GAAMA,IAAMG,EAAK,KAAK,EAAE,OAAS,CACvE,EACAL,EAEJ,OACEO,GAAA,cAACC,GAAA,CACC,UAAWC,GACX,iBAAkB1B,EAClB,iBAAmBA,GAAaE,EAAYF,CAAQ,EACpD,wBAAyB,IACvBU,EAASiB,EAAiB,gBAAgB,EAE5C,OAAQf,EAAiB,KAAK,KAAMe,EAAiB,QAAQ,EAC7D,iBAAkBJ,EAClB,yBAA0BA,EAA8B,OACrDJ,GAAMA,EAAE,QACX,EACA,YAAapB,EACb,eAAgBK,EAChB,uBAAwBC,EACxB,YAAauB,GACb,YAAaC,GACb,cAAevB,EACf,cAAeC,EACf,gBAAiBO,EACjB,sBAAuBC,EACvB,cAAeC,EACjB,CAEJ,CA3EgBc,EAAAjC,GAAA,gBCjBhB,OACE,SAAAkC,GACA,iBAAAC,GACA,UAAAC,GACA,UAAAC,GACA,eAAAC,OAEK,gBACP,OAAOC,GAAS,aAAAC,GAAW,UAAAC,GAAQ,YAAAC,OAAgB,QAEnD,OAEE,eAAAC,GACA,uBAAAC,OACK,4BACP,OAAS,cAAAC,OAAkB,2BAK3B,OAAS,QAAAC,OAAY,eAErB,OAAS,WAAAC,OAAe,gBACxB,OAAS,sBAAAC,OAA0B,gBCvBnC,OAAS,gBAAAC,OAAoB,0BActB,SAASC,GACdC,EACAC,EACqB,CACrB,IAAMC,EAAMC,GAAa,CACvB,eAAgB,CACd,cAAeF,GAAS,wBAA0B,EACpD,CACF,CAAC,EAED,GAAID,EAAW,CACb,IAAMI,EAAyC,CAAC,EAEhD,OAAAJ,EAAU,QAASK,GAAsB,CAIvC,GAAI,OAAOA,GAAsB,SAAU,CACzC,IAAMC,EAAwCJ,EAAI,KAAMK,GAC/CA,EAAS,OAAO,OAASF,CACjC,EACGC,EACFF,EAAkB,KAAKE,CAAM,EAE7B,QAAQ,KACN,iBAAiBD,gEACnB,OAIFD,EAAkB,KAAKC,CAAiB,CAE5C,CAAC,EACMD,EAGT,OAAOF,CACT,CArCgBM,EAAAT,GAAA,6BAuCT,SAASU,GACdC,EACAT,EACU,CAKV,OAJkBF,GAA0BW,EAAQT,CAAO,EACnC,IAAKM,GACpBA,EAAS,OAAO,IACxB,CAEH,CATgBC,EAAAC,GAAA,6BDpBhB,IAAME,GAAgBC,GAAO,MAAO,CAClC,QAAS,OACT,IAAK,QACL,oBAAqB,6BACrB,aAAc,WACd,QAAS,SACT,UAAW,MACb,CAAC,EAEKC,GAAkBD,GAAO,MAAO,CACpC,QAAS,OACT,eAAgB,SAChB,MAAO,OACP,SAAU,WACV,IAAK,KACP,CAAC,EAEKE,GAAiBF,GAAO,MAAO,CACnC,cAAe,KACjB,CAAC,EAEKG,GAAwB,OAAO,OAAOC,EAAW,EAEhD,SAASC,GAAY,CAC1B,iBAAAC,EACA,aAAAC,EACA,OAAAC,CACF,EAAc,CACZ,GAAM,CAAE,iBAAAC,CAAiB,EAAIC,EAAgB,EACvC,CAAE,MAAAC,EAAO,WAAAC,EAAY,cAAAC,EAAe,QAAAC,CAAQ,EAAIC,GAAW,EAC3DC,EAAUC,GACdN,EACAE,EACAK,GAA0BZ,EAAkB,CAC1C,uBAAwBE,GAAQ,sBAClC,CAAC,GAAKL,EACR,EACMgB,EAAaC,GAAqB,EAEpCC,EAAgBC,GAAoB,EACpCN,EAAQ,OAAQO,GAAWA,EAAO,YAAY,EAC9CP,EACJK,EAAgBG,GAAwBH,CAAa,EACrD,GAAM,CAACI,EAAoBC,CAAqB,EAAIC,GAAS,EAAE,EACzDC,EACJC,EAAW,IAAI,2BAA2B,EACtCC,EAAoBC,EAAa,IAAI,cAAc,EAEnDC,EAAiBC,EAAA,MAAOC,GAAqB,CACjD,IAAMX,EAASZ,EAAMuB,CAAI,EACzB,GAAI,CAEF,GADIT,GAAoBC,EAAsB,EAAE,EAC5CH,EAAO,UACT,MAAMX,EAAWsB,CAAI,MAChB,CACL,GACE,CAAC3B,GACCS,EAAQ,KAAMmB,GAAMA,EAAE,QAAUC,GAAY,SAAS,EAEvD,OAEF,MAAMtB,EAAQoB,CAAI,EAEtB,OAASG,EAAP,CACAX,EAAsB,UAAaW,GAAW,OAAO,CACvD,CACF,EAlBuB,kBAmBjBC,EAA8BL,EAAA,IAAM,CACxC,IAAMM,EACJpB,EAAW,SAAS,OACjBI,GAAWA,EAAO,QAAUa,GAAY,UAC3C,GAAK,CAAC,EACR,QAAWb,KAAUgB,EACnB3B,EAAWW,EAAO,IAAI,CAE1B,EARoC,+BASpC,OAAAiB,GAAU,KACRZ,EAA2B,EACpB,IAAM,CACXU,EAA4B,EAC5BV,EAA2B,CAC7B,GACC,CAAC,CAAC,EAELY,GAAU,IAAM,CACdrB,EAAW,QAAUH,CACvB,EAAG,CAACA,CAAO,CAAC,EAGVyB,EAAA,cAACC,GAAA,CACC,MAAOC,GAAK,EAAE,eAAe,GAAK,GAClC,UAAW,GACX,OAAQlC,EAAiB,KAAK,KAAMmC,EAAiB,OAAO,GAC5DH,EAAA,cAAAA,EAAA,cACGhB,GACCgB,EAAA,cAACvC,GAAA,KACCuC,EAAA,cAACI,GAAA,CAAM,KAAK,QAAQ,MAAOpB,EAAoB,CACjD,EAEDK,IAAsB,WACrBW,EAAA,cAACxC,GAAA,CAAgB,UAAU,UACzBwC,EAAA,cAACK,GAAA,CAAQ,KAAM,GAAI,CACrB,EAEDhB,IAAsB,UAAYW,EAAA,cAACM,GAAA,IAAmB,EACvDN,EAAA,cAAC1C,GAAA,KACE+B,IAAsB,WACrBT,EAAc,IAAI,CAACE,EAAQyB,IACzBP,EAAA,cAACQ,GAAA,CACE,GAAG1B,EACJ,IAAK,GAAGyB,KAASzB,EAAO,OACxB,QAASS,EACX,CACD,CACL,CACF,CACF,CAEJ,CA/FgBC,EAAA5B,GAAA,eExDhB,OAAO6C,OAAW,QAElB,OAAS,cAAAC,OAAkB,iCAG3B,OACE,eAAAC,GACA,sBAAAC,GACA,0BAAAC,OACK,gBAEP,OACE,cAAAC,GACA,4BAAAC,OACK,wCACP,OAAS,cAAAC,OAAkB,2BAC3B,OACE,gCAAAC,GACA,kBAAAC,GACA,0BAAAC,OACK,wCClBA,SAASC,GAAUC,EAA4B,CACpD,IAAMC,EAAU,KAAK,OAAO,IAAI,KAAK,EAAE,QAAQ,EAAID,GAAc,GAAI,EACjEE,EAEAC,EAAW,KAAK,MAAMF,EAAU,OAAQ,EAC5C,OAAIE,GAAY,EACdD,EAAe,QAEfC,EAAW,KAAK,MAAMF,EAAU,MAAO,EACnCE,GAAY,EACdD,EAAe,SAEfC,EAAW,KAAK,MAAMF,EAAU,KAAK,EACjCE,GAAY,EACdD,EAAe,OAEfC,EAAW,KAAK,MAAMF,EAAU,IAAI,EAChCE,GAAY,EACdD,EAAe,QAEfC,EAAW,KAAK,MAAMF,EAAU,EAAE,EAC9BE,GAAY,EACdD,EAAe,UAEfC,EAAWF,EACXC,EAAe,eAOrBC,EAAW,GAAKA,IAAa,KAC/BD,GAAgB,KAGXC,EAAW,IAAMD,CAC1B,CArCgBE,EAAAL,GAAA,aAuCT,SAASM,GAAYC,EAA0B,CACpD,OAAOA,EAAY,WACf,GAAGP,GAAU,SAASO,EAAY,UAAU,CAAC,QAC7C,GAAGP,GAAU,SAASO,EAAY,YAAY,CAAC,OACrD,CAJgBF,EAAAC,GAAA,eDnBhB,OAAS,eAAAE,OAAmB,mBAUrB,SAASC,IAAkB,CAChC,IAAMC,EAAwBC,EAAW,IAAI,sBAAsB,EAC7D,CAAE,mBAAAC,EAAoB,QAAAC,EAAS,cAAAC,CAAc,EAAIC,GAAW,EAC5DC,EAAQC,EAAkB,IAAI,MAAM,EACpCC,EAAWC,GAAY,EACvB,CAAE,iBAAAC,CAAiB,EAAIC,EAAgB,EACvC,CAACC,EAAUC,CAAU,EAAIC,GAAmB,GAAI,EAChD,CAAE,QAAAC,EAAS,MAAAC,CAAM,EAAIC,GAAW,EAGhCC,EADeC,GAAgBJ,CAAO,EACV,KAChC,CAAC,CAAE,KAAAK,CAAK,IAAMA,EAAK,YAAcpB,CACnC,EAEMqB,EAAWC,EAAA,IAAM,CAErB,IAAMF,EAAOL,GAAS,IAAIG,GAAc,EAAG,EACvCE,GAAMG,GAAWH,CAAI,CAC3B,EAJiB,YAKXA,EAAOF,GAAc,KACrBM,EAAU,CAACR,EAAM,oBAEvB,GAAI,CAACI,EACH,OACEK,GAAA,cAACC,GAAA,CACC,UAAW1B,GAAyB,GACpC,QAASwB,EACT,OAAQd,EAAiB,KAAK,KAAMiB,EAAiB,WAAW,EAClE,EAGJ,IAAMC,EAAcC,GAAeT,CAAI,EAEjCU,EAAwBF,EAC1BG,GAA6BX,EAAMQ,CAAW,EAC9C,KACEI,EAAoBJ,EACtBK,GAAuBb,EAAMQ,CAAW,EACxC,KACEM,EAA2BN,GAAa,cAExCO,EAAeC,GAAgBhB,EAAMQ,CAAW,EAEhDS,EAAsBC,GAA8BV,CAAW,EAE/DW,EAAWC,GAAYpB,CAAI,EAE3BqB,EAAcC,GAAgBtB,CAAI,EAElCuB,EAAiBrB,EAACsB,GACtB,CAAC,CAACxC,EAAcwC,CAAU,GAAG,aADR,kBAWjBC,EAPJX,IACEY,GAAyB,yBAC3B,CAAC,CAAChB,GACF,CAAC,CAACE,GAAmB,aACpBW,EAAeX,EAAkB,UAAU,GAC1C9B,EAAmB8B,EAAkB,WAAYF,CAAqB,GAGtE3B,EAAQ,KAAK,KAAM6B,EAAkB,WAAYF,CAAqB,EACtE,OAEEiB,EACJC,GAAkC5B,CAAI,EAExC,OACEK,GAAA,cAACwB,GAAA,CACC,OAAQvC,EAAiB,KAAK,KAAMiB,EAAiB,WAAW,EAmChE,YAAauB,GAAuB9B,CAAI,EACxC,OAAQP,EACR,SAAUD,EACV,SAAUS,EACV,aAAcc,EAAa,aAC3B,gBAAiBA,EAAa,gBAC9B,sBAAuBL,GAAyB,GAChD,cAAee,EACf,KACER,EAAsB,UAAYjB,EAAK,sBAAwB,OAEjE,KAAMmB,EACL,GAAIE,GAAe,CAClB,QAAS,IAAM,CACbnC,EAAMc,CAAI,EACV,WAAW,IAAM,CACfZ,EAASmB,EAAiB,IAAI,CAChC,EAAG,CAAC,CACN,CACF,EACC,GAAIoB,GAAkC,CACrC,+BAAgC,CAC9B,WAAYA,EAA+B,WAC3C,aAAcA,EAA+B,cAAgB,GAC7D,OAAQA,EAA+B,MACzC,CACF,EACF,CAEJ,CArIgBzB,EAAAvB,GAAA,mBlBlBhB,IAAMoD,GAAkBC,EAACC,GAAiBA,EAAK,QAAQ,IAAK,EAAE,EAAtC,mBAMjB,SAASC,GAAUC,EAAkB,CAC1C,GAAM,CAAE,OAAAC,CAAO,EAAID,EAEnB,OAAOE,GAAU,CACf,CACE,KAAMC,EAAiB,KACvB,QAASC,EAAA,cAACC,GAAA,IAAK,CACjB,EACA,CACE,KAAMF,EAAiB,UACvB,QACEC,EAAA,cAACE,GAAA,CACC,KAAK,OACL,gBAAiBL,GAAQ,MAAM,YACjC,CAEJ,EACA,CACE,KAAME,EAAiB,QACvB,QACEC,EAAA,cAACE,GAAA,CAAgB,KAAK,KAAK,gBAAiBL,GAAQ,IAAI,YAAa,CAEzE,EACA,CACE,KAAME,EAAiB,UACvB,QACEC,EAAA,cAACG,GAAA,CAAgB,KAAK,OAAO,gBAAiBN,GAAQ,MAAM,OAAQ,CAExE,EACA,CACE,KAAME,EAAiB,QACvB,QACEC,EAAA,cAACG,GAAA,CAAgB,KAAK,KAAK,gBAAiBN,GAAQ,IAAI,OAAQ,CAEpE,EACA,CACE,KAAME,EAAiB,SACvB,QACEC,EAAA,cAACI,GAAA,CACC,YAAaP,GAAQ,OAAO,YAC5B,kBAAmBA,GAAQ,iBAC7B,CAEJ,EACA,CACE,KAAME,EAAiB,iBACvB,QACEC,EAAA,cAACK,GAAA,CAAoB,kBAAmBR,GAAQ,iBAAkB,CAEtE,EACA,CAAE,KAAME,EAAiB,MAAO,QAASC,EAAA,cAACM,GAAA,IAAY,CAAG,EACzD,CACE,KAAMP,EAAiB,YACvB,QAASC,EAAA,cAACO,GAAA,IAAgB,CAC5B,EACA,CACE,KAAMR,EAAiB,QACvB,QACEC,EAAA,cAACQ,GAAA,CACC,iBAAkBX,GAAQ,QAC1B,aACE,OAAOA,GAAQ,aAAiB,IAC5B,GACAA,EAAO,aAEb,OAAQA,EACV,CAEJ,EACA,CACE,KAAML,GAAgBO,EAAiB,WAAW,EAClD,QACEC,EAAA,cAACS,GAAA,CAAgB,yBAA0BZ,GAAQ,kBAAmB,CAE1E,CACF,CAAC,CACH,CA5EgBJ,EAAAE,GAAA,aDGT,SAASe,GAAO,CAAE,OAAAC,CAAO,EAAgB,CAC9C,IAAMC,EAAWC,GAAY,EACvB,CAAE,iBAAAC,EAAkB,gBAAAC,CAAgB,EAAIC,EAAgB,EACxD,CAAE,cAAAC,CAAc,EAAIC,GAAW,EAC/BC,EAAyBC,EAC7BC,GAAqBP,EAAkBC,EAAiBE,CAAa,EAAE,IACpEK,GAAMA,EAAE,KACX,CACF,EACM,CAAE,YAAAC,EAAa,OAAAC,CAAO,EAAIC,EAAa,IAAI,KAAK,EAChDC,EAAeC,EAAkB,IAAI,aAAa,EAClDC,EAAeD,EAAkB,IAAI,aAAa,EAClDE,EAAaF,EAAkB,IAAI,WAAW,EAC9CG,EAAaH,EAAkB,IAAI,WAAW,EAC9CI,EAAiBJ,EAAkB,IAAI,eAAe,EACtDK,EAAkBC,EAAiB,IAAI,gBAAgB,EACvDC,EAAsBD,EAAiB,IAAI,oBAAoB,EAC/DE,EAAsBF,EAAiB,IAAI,oBAAoB,EAE/DG,EAAeC,GAAwBvB,CAAgB,EACvDwB,EACJC,EAAW,IAAI,6BAA6B,EACxCC,EAAoBf,EAAa,IAAI,cAAc,EACnDgB,EAAkBzB,EAAgB0B,EAAuB,EAE/D,OAAAC,GAAU,IAAM,CACd,GAAIH,IAAsB,UAAW,CACnC,IAAMI,EAAQrB,EAAY,KACvBqB,GAAUA,EAAM,OAASjC,GAAQ,IAAI,UACxC,EACMkC,EAAQrB,EAAO,KAAMsB,GACzBC,EAAeD,EAAGnC,GAAQ,IAAI,OAAS,IAAI,CAC7C,EACAkB,EAAWe,GAAS,IAAI,EACxBd,EAAWe,GAAS,IAAI,EAE5B,EAAG,CAAClC,GAAQ,IAAI,MAAOA,GAAQ,IAAI,WAAY6B,CAAiB,CAAC,EAEjEG,GAAU,IAAM,CACdZ,EAAepB,GAAQ,QAAQ,SAAS,GAAK,EAAE,CACjD,EAAG,CAACA,GAAQ,MAAM,CAAC,EAEnBgC,GAAU,IAAM,CACd,GAAIH,IAAsB,UAAW,CACnC,IAAMI,EAAQrB,EAAY,KACvBqB,GAAUA,EAAM,OAASjC,GAAQ,MAAM,UAC1C,EACMkC,EAAQrB,EAAO,KAAMsB,GACzBC,EAAeD,EAAGnC,GAAQ,MAAM,OAAS,IAAI,CAC/C,EAEAe,EAAakB,GAAS,IAAI,EAC1BhB,EAAaiB,GAAS,IAAI,EAE9B,EAAG,CAAClC,GAAQ,MAAM,MAAOA,GAAQ,MAAM,WAAY6B,CAAiB,CAAC,EAErEG,GAAU,IAAM,CACdX,EAAgBrB,GAAQ,WAAW,KAAO,IAAI,EAC9CuB,EAAoBvB,GAAQ,WAAW,SAAW,IAAI,EACtDwB,EAAoBxB,GAAQ,WAAW,SAAW,IAAI,CACxD,EAAG,CACDA,GAAQ,WAAW,IACnBA,GAAQ,WAAW,QACnBA,GAAQ,WAAW,OACrB,CAAC,EAGCqC,GAAA,cAAAA,GAAA,cACEA,GAAA,cAACC,GAAA,CACC,cAAeT,EACf,uBAAwBrB,EACxB,iBAAkBL,EAClB,aAAcsB,EACd,gBAAiBK,EACjB,QAAS,IAAM,CACRH,GAA8B1B,EAASsC,EAAiB,OAAO,CACtE,GACAF,GAAA,cAACG,GAAA,CAAU,OAAQxC,EAAQ,CAC7B,CACF,CAEJ,CAjFgByC,EAAA1C,GAAA,UqBvBhB,OAAS,aAAA2C,OAAiB,gBAEnB,IAAMC,GAAaC,EAACC,GACzBC,GAAU,CACR,UAAW,CACT,wJACA,uDACF,EACA,KAAM,CACJ,WAAAD,CACF,CACF,CAAC,EAAE,EATqB,cCF1B,OAAS,eAAAE,GAAa,uBAAAC,MAA2B,gBACjD,OAAS,YAAAC,GAAU,aAAAC,GAAW,mBAAAC,OAAuB,QCDrD,OAAS,aAAAC,GAAW,UAAAC,OAAc,QAEnB,SAARC,GAA6BC,EAAe,CAGjD,IAAMC,EAAMC,GAAe,EAE3B,OAAAC,GAAU,IAAM,CACdF,EAAI,QAAUD,CAChB,EAAG,CAACA,CAAK,CAAC,EAEHC,EAAI,OACb,CAVwBG,EAAAL,GAAA,eDKjB,SAASM,GAAS,CACvB,OAAQC,EACR,WAAAC,EAAa,SACb,aAAAC,EAAe,EACf,KAAAC,EAAO,MACT,EAAgB,CACd,IAAMC,EAAQC,EAAiB,IAAI,MAAM,EACnCC,EAAYC,EAAa,IAAI,UAAU,EACvCC,EAAWH,EAAiB,IAAI,SAAS,EACzCI,EAAQT,GAAa,MACrBU,EAAOV,GAAa,KACpBW,EAAUF,GAAO,SAAW,UAC5BG,EAAaH,GAAO,YAAc,OAClCI,EAAaJ,GAAO,YAAc,OAElCK,EAAa,CACjB,GAAGC,EAAoB,UAAW,OAAQL,GAAM,OAAO,EACvD,GAAGK,EAAoB,QAAS,OAAQL,GAAM,KAAK,EACnD,GAAGK,EAAoB,UAAW,OAAQL,GAAM,OAAO,EACvD,GAAGK,EAAoB,UAAW,OAAQL,GAAM,OAAO,EACvD,GAAGK,EAAoB,UAAW,OAAQL,GAAM,OAAO,EACvD,QAASA,GAAM,QACf,WAAYA,GAAM,WAClB,WAAYA,GAAM,UACpB,EAEMM,EAAc,CAClB,QAASP,GAAO,SAAW,OAC3B,GAAGM,EAAoB,UAAW,QAASN,GAAO,SAAW,SAAS,EACtE,GAAGM,EAAoB,QAAS,QAASN,GAAO,OAAS,SAAS,EAClE,GAAGM,EAAoB,UAAW,QAASN,GAAO,SAAW,SAAS,EACtE,GAAGM,EAAoB,UAAW,QAASN,GAAO,SAAW,SAAS,EACtE,GAAGM,EAAoB,UAAW,QAASJ,CAAO,EAClD,WAAAC,EACA,WAAAC,CACF,EAEMI,EAAmBC,GAAY,CACnC,OAAQF,EACR,MAAO,CACL,EAAG,GAAGd,KACR,EACA,QAAS,CACP,EAAG,mBAAmBO,GAAO,SAAW,+BACtCA,GAAO,SAAW,+BACEA,GAAO,SAAW,WAC1C,CACF,CAAC,EAEKU,EAAkBD,GAAY,CAClC,OAAQ,CACN,GAAGF,EACH,GAAGD,EAAoB,UAAW,OAAQ,SAAS,EACnD,WAAYH,EACZ,WAAYC,EACZ,QAAS,OACT,GAAG,KAAK,MAAM,KAAK,UAAUC,CAAU,CAAC,CAC1C,EACA,MAAO,CACL,EAAG,GAAGZ,KACR,EACA,QAAS,CACP,EAAG,mBAAmBQ,GAAM,SAAW,4BACrCA,GAAM,SAAW,4BACGA,GAAM,SAAW,QACzC,CACF,CAAC,EACK,CAACU,EAASC,CAAU,EAAIC,GAAS,OAAO,EAE9CC,GAAU,IAAM,EACb,SACC,MAAMjB,EAAU,KAGlB,IAAMkB,EAAcC,EAACC,GAA+B,CAC9CA,EAAM,QAASL,EAAW,MAAM,EAC/BA,EAAW,OAAO,CACzB,EAHoB,eAKpB,OACE,OAAO,YACP,OAAO,WAAW,8BAA8B,EAAE,SAElDA,EAAW,MAAM,EAGnB,OACG,WAAW,8BAA8B,EACzC,iBAAiB,SAAUG,CAAW,EAClC,IAAM,CACX,OACG,WAAW,8BAA8B,EACzC,oBAAoB,SAAUA,CAAW,CAC9C,CACF,EAAG,CAAC,CAAC,EACLD,GAAU,IAAM,CACVpB,IAAS,QAAQK,EAASL,CAAI,CACpC,EAAG,CAACA,CAAI,CAAC,EACT,IAAMwB,EAAWC,GAAY3B,CAAU,EAEvC,OAAA4B,GAAgB,IAAM,CACpB,GAAM,CAAE,UAAAC,CAAU,EAAI,SAAS,KAE3BH,GAAUG,EAAU,OAAO,QAAQH,EAAS,QAAQ,KAAM,EAAE,GAAG,EACnEG,EAAU,IAAI,QAAQ7B,EAAW,QAAQ,KAAM,EAAE,GAAG,CACtD,EAAG,CAACA,CAAU,CAAC,EAQR,CAAE,YANcwB,EAAA,IACjBrB,IAAU,OACLgB,IAAY,OAASD,EAAkBF,EACpCb,IAAU,OAASe,EAAkBF,EAH5B,kBAMc,CAAE,CACzC,CAlHgBQ,EAAA1B,GAAA,YEPhB,OAAOgC,IAA4B,WAAAC,OAAe,QAClD,OAAS,YAAYC,OAAuB,iCAC5C,OACE,uBAAAC,GAEA,gCAAAC,OACK,wCACP,OAAS,cAAAC,OAAkB,2BAC3B,OACE,0CAAAC,OAGK,4BAKP,OAAS,mBAAAC,OAAuB,cAEhC,SAASC,GAAaC,EAA0B,CAC9C,GAAM,CACJ,UAAAC,EACA,WAAAC,EACA,MAAAC,EACA,QAAAC,EACA,mBAAAC,EACA,cAAAC,CACF,EAAIC,GAAW,EAETC,EAAeC,GAAQ,IACpBC,GAAoB,CACzB,QAASC,GAAU,SAAS,CAC9B,CAAC,EACA,CAAC,CAAC,EAEC,CAAE,YAAAC,CAAY,EAAIC,EAAa,IAAI,KAAK,EAGxCC,EAAU,CACd,YAHuBC,EAAgB,IAAI,iBAAiB,EAG9B,IAAKC,IAAY,CAC7C,SAAU,CAACA,CAAM,EACjB,KAAMA,EAAO,KACf,EAAE,CACJ,EAEMC,EAAgBC,EAAA,CAACF,EAAoBG,IAAqB,CAC9D,GAAKd,EAAmBW,EAAQG,CAAO,EAGvC,OAAOf,EAAQY,EAAQG,CAAO,CAChC,EALsB,iBAOhBC,EAAiBF,EAACG,GACtB,CAAC,CAACf,EAAce,CAAU,EAAE,aADP,kBAIjBC,EAAiBV,EACpB,OAAQW,GAAeA,EAAW,OAAO,EACzC,OACC,CAACC,EAAqBD,KACnBC,EAAeD,EAAW,IAAI,EAAIA,EAAaC,GAElD,CAAC,CACH,EACIC,EAAiBb,EAAY,OAAOc,EAAe,EACnDC,EAAyBT,EAACU,GAAqB,CACnD,GAAM,CAAE,gBAAAC,CAAgB,EAAIvB,EAAcsB,CAAI,EAC9C,OAAOE,GAA8BD,CAAe,CACtD,EAH+B,0BAIzBE,EAAe9B,EAAU,EAEzB+B,EAA4B,CAChC,KAAM,CACJ,YAAaV,EACb,eAAgBG,EAChB,oBACEQ,GAAuCR,CAAc,EACvD,uBAAAE,CACF,EACA,WAAAzB,EAIA,QAAAY,EACA,UAAWiB,EACX,cAAAd,EACA,mBAAAZ,EACA,QAAAD,EACA,MAAAD,EACA,eAAAiB,CACF,EAEA,OACEc,GAAA,cAACC,GAAA,CACC,WAAY,CAAC3B,CAAY,EACzB,QAASwB,EACT,sBAAwBI,GAAY,CAClCC,GAA6BD,CAAO,CACtC,EACA,SAAU,IACTpC,EAAM,QACT,CAEJ,CApFSkB,EAAAnB,GAAA,gBAsFT,IAAOuC,GAAQvC,GCzGf,OAAOwC,OAAkC,QAEzC,OAAS,UAAAC,GAAQ,YAAAC,OAAgB,2BAQjC,OAAS,mBAAAC,OAAuB,YCThC,OAAS,aAAAC,OAAiB,QAQnB,SAASC,GACdC,EACAC,EACA,CACA,IAAMC,EAAuBC,EAAgB,IAAI,qBAAqB,EAClEC,EAAyCC,GAC3C,OACAJ,CACF,EAEA,OAAAK,GAAU,IAAM,CACdJ,EAAqB,EACrBE,EAAoBC,GAA0BL,EAAW,CACvD,uBAAwBC,GAAS,sBACnC,CAAC,CACH,EAAG,CAACD,CAAS,CAAC,EAEP,CACL,UAAWI,CACb,CACF,CApBgBG,EAAAR,GAAA,sBDIhB,OAAS,iBAAAS,GAAe,UAAAC,OAAc,QAQ/B,IAAMC,GAAgBC,GAAsC,CACjE,gBAAiB,IAAM,CAEvB,CACF,CAAC,EAEM,SAASC,GACdC,EAKA,CACA,GAAM,CAAE,YAAAC,CAAY,EAAIC,EAAa,IAAI,KAAK,EACxC,CAAE,UAAAC,CAAU,EAAIC,GAAmBJ,EAAM,UAAWA,GAAO,OAAO,EAClEK,EAAmBC,EAAgB,IAAI,iBAAiB,EACxDC,EAAgBD,EAAgB,IAAI,cAAc,EAClDE,EAAyBC,GAAyB,EAElDC,EAAqBT,EACxB,OAAOU,EAAe,EACtB,IAAKC,GAAUA,EAAM,IAAI,EAEtBC,EAA8BC,EAAA,CAClCC,EACAC,EACAC,EACAC,EACAC,IACG,CACH,GAAIH,IAAUI,GAAO,SACnB,GAAIH,EAAO,CACT,IAAMI,EACJC,GAA8BH,CAAe,EACzCI,EAAOC,GACXT,EACAE,EACAP,EACAW,CACF,EACAd,EAAcgB,CAAI,OAElBlB,EAAiBU,CAAI,EAGzB,GAAIC,IAAUI,GAAO,UAAYF,EAAM,UAAW,CAChD,IAAMO,EAAM,GAAGV,KAAQG,EAAM,WAAWD,IAEpCC,EAAM,YACFV,EAAuB,QAC3BA,EAAuB,QAAQiB,CAAG,EAElC,QAAQ,KACN,wDACF,GAIN,GAAIT,IAAUI,GAAO,SAAWF,EAAM,QAAS,CAC7C,IAAMO,EAAM,GAAGV,KAAQG,EAAM,UACvBV,EAAuB,QAASA,EAAuB,QAAQiB,CAAG,EAEtE,QAAQ,KAAK,wDAAwD,EAIrEzB,EAAM,eACRA,EAAM,cAAce,EAAMC,EAAOC,EAAOC,EAAOC,CAAe,CAElE,EA9CoC,iBA+CpC,OACEO,GAAA,cAAC7B,GAAc,SAAd,CACC,MAAO,CACL,gBAAkB8B,GAAY,CAC5BnB,EAAuB,QAAUmB,CACnC,CACF,GACAD,GAAA,cAACE,GAAA,CACC,eAAgB3B,EAChB,UAAWE,EACX,cAAeU,EACf,YAAW,IACVb,EAAM,QACT,CACF,CAEJ,CAhFgBc,EAAAf,GAAA,iBE3BhB,OAAS,aAAA8B,OAAiB,QAC1B,OACE,aAAAC,GACA,cAAAC,GACA,iBAAAC,GACA,4BAAAC,GACA,gBAAAC,OACK,wCAGA,SAASC,IAAe,CAC7B,IAAMC,EAAmBC,EAAgB,IAAI,iBAAiB,EACxDC,EAAoBD,EAAgB,IAAI,kBAAkB,EAE1DE,EAAeC,GAAU,EAE/B,OAAAC,GAAU,KACRF,EAAa,GAAGG,GAAW,UAAYC,GAAgB,CACrD,GAAM,CAAE,MAAAC,EAAO,KAAAC,CAAK,EAAIF,EAOxB,GALGC,EAAM,OAASE,GAAc,cAC5BF,EAAM,SAAWG,GAAyB,SAC1C,CAACC,GAAaH,CAAI,GACpBD,EAAM,OAASE,GAAc,UAEL,CACxB,IAAMG,EAAcb,EAAiB,KAClCc,GAAYA,EAAQ,QAAUL,GAAM,cACvC,EACMM,EACJN,GAAM,iBAAmBA,GAAM,cAC/BT,EAAiB,KACdgB,GAAWA,EAAO,QAAUP,GAAM,YACrC,EAEFI,GAAeX,EAAkB,CAACW,CAAW,CAAC,EAC9CE,GAAab,EAAkB,CAACa,CAAS,CAAC,EAE9C,CAAC,EAEM,IAAMZ,EAAa,IAAI,MAAM,GACnC,CAACA,EAAcH,EAAiB,MAAM,CAAC,EAEnC,IACT,CAlCgBiB,EAAAlB,GAAA,gB9CYhB,IAAMmB,GAAgBC,GAAO,MAAO,CAClC,MAAO,OACP,QAAS,OACT,eAAgB,SAChB,WAAY,QACd,CAAC,EAMM,SAASC,GAAKC,EAAuC,CAC1D,GAAM,CAAE,OAAAC,CAAO,EAAID,EACnBE,GAAWD,GAAQ,OAAO,YAAc,QAAQ,EAEhD,GAAM,CAAE,YAAAE,CAAY,EAAIC,GAASH,GAAQ,OAAS,CAAC,CAAC,EAC9C,CAACI,EAAgCC,CAAiC,EACtEC,GAAiB,EAAE,EACf,CAACC,EAAoBC,CAAqB,EAAIF,GAAqB,EACnEG,EAAcC,EAAW,IAAI,YAAY,EACzCC,EAAgBC,GAAWC,EAAa,EAE9C,OAAAC,GAAQ,IAAM,CACRd,GAAQ,QACVe,GAAW,CACT,QAASf,GAAQ,MACnB,CAAC,CAEL,EAAG,CAACA,CAAM,CAAC,EAEXgB,GAAU,IAAM,CACdC,EAAiB,QAAQ,UAAU,EACnCN,EAAc,gBAAgBN,CAAiC,CACjE,EAAG,CAAC,CAAC,EAGHa,EAAA,cAACC,GAAA,CAAY,SAAUnB,GAAQ,UAC7BkB,EAAA,cAACtB,GAAA,CAAc,GAAG,iBAAiB,UAAWM,GAC5CgB,EAAA,cAACE,GAAA,KACCF,EAAA,cAACG,GAAA,IAAa,EACdH,EAAA,cAACI,GAAA,CAAc,YAAab,IAAgBc,EAAiB,MAC3DL,EAAA,cAACM,GAAA,CACC,oBAAqBpB,EACrB,mBAAoBG,EACpB,wBAAyB,IAAM,CAC7BC,EAAsB,MAAS,CACjC,GACAU,EAAA,cAACO,GAAA,CAAO,OAAQzB,EAAQ,CAC1B,CACF,CACF,CACF,CACF,CAEJ,CA3CgB0B,EAAA5B,GAAA,QA6CT,SAAS6B,GAAO5B,EAAuC,CAC5D,OAAKA,EAAM,QAAQ,gBAWZmB,EAAA,cAACpB,GAAA,CAAM,GAAGC,EAAO,EATpBmB,EAAA,cAACU,GAAA,CACC,UAAW7B,EAAM,QAAQ,QACzB,QAAS,CACP,uBAAwBA,EAAM,QAAQ,sBACxC,GACAmB,EAAA,cAACpB,GAAA,CAAM,GAAGC,EAAO,CACnB,CAIN,CAbgB2B,EAAAC,GAAA,U+CrEhB,OACE,cAAAE,OAGK,2BACP,OACE,aAAaC,GACb,cAAAC,GAQA,kBAAAC,GASA,iBAAAC,GACA,4BAAAC,GACA,mCAAAC,OACK",
4
+ "sourcesContent": ["import { SwapContainer, styled, I18nManager } from '@rango-dev/ui';\nimport React, {\n PropsWithChildren,\n useContext,\n useEffect,\n useMemo,\n useState,\n} from 'react';\nimport { AppRouter } from './components/AppRouter';\nimport { WalletType } from '@rango-dev/wallets-shared';\nimport { Layout } from './components/Layout';\nimport { globalFont } from './globalStyles';\nimport { useTheme } from './hooks/useTheme';\nimport { WidgetConfig } from './types';\nimport QueueManager from './QueueManager';\nimport { useUiStore } from './store/ui';\nimport { navigationRoutes } from './constants/navigationRoutes';\nimport { initConfig } from './utils/configs';\nimport { WidgetContext, WidgetWallets } from './Wallets';\nimport { WidgetEvents } from './components/WidgetEvents';\nimport { useSettingsStore } from './store/settings';\n\nconst MainContainer = styled('div', {\n width: '100%',\n display: 'flex',\n justifyContent: 'center',\n alignItems: 'center',\n});\n\nexport type WidgetProps = {\n config?: WidgetConfig;\n};\n\nexport function Main(props: PropsWithChildren<WidgetProps>) {\n const { config } = props;\n globalFont(config?.theme?.fontFamily || 'Roboto');\n\n const { activeTheme } = useTheme(config?.theme || {});\n const [lastConnectedWalletWithNetwork, setLastConnectedWalletWithNetwork] =\n useState<string>('');\n const [disconnectedWallet, setDisconnectedWallet] = useState<WalletType>();\n const currentPage = useUiStore.use.currentPage();\n const widgetContext = useContext(WidgetContext);\n\n useMemo(() => {\n if (config?.apiKey) {\n initConfig({\n API_KEY: config?.apiKey,\n });\n }\n }, [config]);\n\n useEffect(() => {\n useSettingsStore.persist.rehydrate();\n widgetContext.onConnectWallet(setLastConnectedWalletWithNetwork);\n }, []);\n\n return (\n <I18nManager language={config?.language}>\n <MainContainer id=\"swap-container\" className={activeTheme}>\n <QueueManager>\n <WidgetEvents />\n <SwapContainer fixedHeight={currentPage !== navigationRoutes.home}>\n <AppRouter\n lastConnectedWallet={lastConnectedWalletWithNetwork}\n disconnectedWallet={disconnectedWallet}\n clearDisconnectedWallet={() => {\n setDisconnectedWallet(undefined);\n }}>\n <Layout config={config} />\n </AppRouter>\n </SwapContainer>\n </QueueManager>\n </MainContainer>\n </I18nManager>\n );\n}\n\nexport function Widget(props: PropsWithChildren<WidgetProps>) {\n if (!props.config?.externalWallets) {\n return (\n <WidgetWallets\n providers={props.config?.wallets}\n options={{\n walletConnectProjectId: props.config?.walletConnectProjectId,\n }}>\n <Main {...props} />\n </WidgetWallets>\n );\n }\n return <Main {...props} />;\n}\n", "import React, { Fragment, PropsWithChildren } from 'react';\nimport { MemoryRouter, useInRouterContext } from 'react-router';\nimport { useQueueManager } from '@rango-dev/queue-manager-rango-preset';\nimport { WalletType } from '@rango-dev/wallets-shared';\nimport { UpdateUrl } from './UpdateUrl';\nimport { useMetaStore } from '../store/meta';\nimport { useWallets } from '@rango-dev/wallets-react';\nimport { isEvmBlockchain } from 'rango-types';\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 } = useMetaStore.use.meta();\n const { canSwitchNetworkTo } = useWallets();\n\n const evmChains = blockchains.filter(isEvmBlockchain);\n\n useQueueManager({\n lastConnectedWallet: props.lastConnectedWallet,\n clearDisconnectedWallet: props.clearDisconnectedWallet,\n disconnectedWallet: props.disconnectedWallet,\n evmChains,\n canSwitchNetworkTo,\n });\n\n return (\n <>\n <Router>{children}</Router>\n {isRouterInContext && <UpdateUrl />}\n </>\n );\n}\n", "import { useEffect, useRef } from 'react';\nimport {\n createSearchParams,\n useLocation,\n useSearchParams,\n} from 'react-router-dom';\nimport { useBestRouteStore } from '../store/bestRoute';\nimport { useMetaStore } from '../store/meta';\nimport { SearchParams } from '../constants/searchParams';\nimport { navigationRoutes } from '../constants/navigationRoutes';\nimport { useUiStore } from '../store/ui';\nimport { searchParamsToToken } from '../utils/routing';\n\nexport function UpdateUrl() {\n const firstRender = useRef(true);\n const [searchParams, setSearchParams] = useSearchParams();\n const location = useLocation();\n const firstRenderSearchParams = useRef(location.search);\n const searchParamsRef = useRef<Record<string, string>>({});\n const fromChain = useBestRouteStore.use.fromChain();\n const toChain = useBestRouteStore.use.toChain();\n const fromToken = useBestRouteStore.use.fromToken();\n const toToken = useBestRouteStore.use.toToken();\n const setFromChain = useBestRouteStore.use.setFromChain();\n const setFromToken = useBestRouteStore.use.setFromToken();\n const setToChain = useBestRouteStore.use.setToChain();\n const setToToken = useBestRouteStore.use.setToToken();\n const inputAmount = useBestRouteStore.use.inputAmount();\n const setInputAmount = useBestRouteStore.use.setInputAmount();\n const loadingStatus = useMetaStore.use.loadingStatus();\n const { blockchains, tokens } = useMetaStore.use.meta();\n const setSelectedSwap = useUiStore.use.setSelectedSwap();\n\n useEffect(() => {\n const params: Record<string, string> = {};\n createSearchParams(firstRenderSearchParams.current).forEach(\n (value, key) => {\n params[key] = value;\n }\n );\n searchParamsRef.current = params;\n const requestId =\n location.pathname.split(navigationRoutes.swaps + '/')[1] || null;\n if (requestId) setSelectedSwap(requestId);\n }, []);\n\n useEffect(() => {\n if (!firstRender.current) {\n let fromChainString = '',\n fromTokenString = '',\n toChainString = '',\n toTokenString = '',\n fromAmount = '';\n if (loadingStatus !== 'success') {\n fromChainString = searchParamsRef.current[SearchParams.FROM_CHAIN];\n fromTokenString = searchParamsRef.current[SearchParams.FROM_TOKEN];\n toChainString = searchParamsRef.current[SearchParams.TO_CHAIN];\n toTokenString = searchParamsRef.current[SearchParams.TO_TOKEN];\n fromAmount =\n searchParamsRef.current[SearchParams.FROM_AMOUNT] || inputAmount;\n } else {\n if (location.state === 'redirect') return;\n fromChainString = fromChain?.name || '';\n fromTokenString =\n (fromToken?.symbol || '') +\n (fromToken?.address ? `--${fromToken?.address}` : '');\n toChainString = toChain?.name || '';\n toTokenString =\n (toToken?.symbol || '') +\n (toToken?.address ? `--${toToken?.address}` : '');\n fromAmount = inputAmount;\n }\n setSearchParams(\n {\n ...(fromChainString && {\n [SearchParams.FROM_CHAIN]: fromChainString,\n }),\n ...(fromTokenString && {\n [SearchParams.FROM_TOKEN]: fromTokenString,\n }),\n ...(toChainString && { [SearchParams.TO_CHAIN]: toChainString }),\n ...(toTokenString && { [SearchParams.TO_TOKEN]: toTokenString }),\n ...(fromAmount && {\n [SearchParams.FROM_AMOUNT]: fromAmount.toString(),\n }),\n },\n { replace: true }\n );\n }\n firstRender.current = false;\n }, [location.pathname, inputAmount, fromChain, fromToken, toChain, toToken]);\n\n useEffect(() => {\n if (loadingStatus === 'success') {\n const fromChainString = searchParams.get(SearchParams.FROM_CHAIN);\n const fromTokenString = searchParams.get(SearchParams.FROM_TOKEN);\n const toChainString = searchParams.get(SearchParams.TO_CHAIN);\n const toTokenString = searchParams.get(SearchParams.TO_TOKEN);\n const fromAmount = searchParams.get(SearchParams.FROM_AMOUNT);\n const fromChain = blockchains.find(\n (blockchain) => blockchain.name === fromChainString\n );\n const fromToken = searchParamsToToken(\n tokens,\n fromTokenString,\n fromChain || null\n );\n const toChain = blockchains.find(\n (blockchain) => blockchain.name === toChainString\n );\n const toToken = searchParamsToToken(\n tokens,\n toTokenString,\n toChain || null\n );\n if (!!fromChain) {\n setFromChain(fromChain);\n if (!!fromToken) setFromToken(fromToken);\n }\n if (!!toChain) {\n setToChain(toChain);\n if (!!toToken) setToToken(toToken);\n }\n if (fromAmount) setInputAmount(fromAmount);\n }\n }, [loadingStatus]);\n\n return null;\n}\n", "import { BestRouteResponse, BlockchainMeta } from 'rango-sdk';\nimport { Token } from 'rango-sdk';\nimport { create } from 'zustand';\nimport BigNumber from 'bignumber.js';\nimport { ZERO } from '../constants/numbers';\nimport {\n getBestRouteToTokenUsdPrice,\n isRouteParametersChanged,\n} from '../utils/routing';\nimport createSelectors from './selectors';\nimport { subscribeWithSelector } from 'zustand/middleware';\nimport { httpService } from '../services/httpService';\nimport { useSettingsStore } from './settings';\nimport { calcOutputUsdValue, createBestRouteRequestBody } from '../utils/swap';\nimport { useMetaStore } from './meta';\nimport {\n getDefaultToken,\n getSortedTokens,\n tokensAreEqual,\n} from '../utils/wallets';\nimport { useWalletsStore } from './wallets';\nimport { TokenWithBalance } from '../pages/SelectTokenPage';\nimport { PendingSwap } from '@rango-dev/queue-manager-rango-preset/dist/shared';\nimport { debounce } from '../utils/common';\nimport { isPositiveNumber } from '../utils/numbers';\n\nconst getUsdValue = (token: Token | null, amount: string): BigNumber | null =>\n token?.usdPrice\n ? new BigNumber(amount || ZERO).multipliedBy(token?.usdPrice || 0)\n : null;\n\nexport interface RouteState {\n fromChain: BlockchainMeta | null;\n toChain: BlockchainMeta | null;\n inputAmount: string;\n inputUsdValue: BigNumber | null;\n outputAmount: BigNumber | null;\n outputUsdValue: BigNumber | null;\n fromToken: TokenWithBalance | null;\n toToken: TokenWithBalance | null;\n loading: boolean;\n error: string;\n sourceTokens: Token[];\n destinationTokens: Token[];\n resetRoute: () => void;\n setFromChain: (\n chain: BlockchainMeta | null,\n setDefaultToken?: boolean\n ) => void;\n setToChain: (chian: BlockchainMeta | null, setDefaultToken?: boolean) => void;\n setFromToken: (token: Token | null) => void;\n setToToken: (token: Token | null) => void;\n setInputAmount: (amount: string) => void;\n bestRoute: BestRouteResponse | null;\n setBestRoute: (bestRoute: BestRouteResponse | null) => void;\n retry: (pendingSwap: PendingSwap) => void;\n switchFromAndTo: () => void;\n}\n\nexport const useBestRouteStore = createSelectors(\n create<RouteState>()(\n subscribeWithSelector((set) => ({\n fromChain: null,\n fromToken: null,\n inputAmount: '',\n outputAmount: null,\n inputUsdValue: new BigNumber(0),\n outputUsdValue: new BigNumber(0),\n toChain: null,\n toToken: null,\n bestRoute: null,\n loading: false,\n error: '',\n sourceTokens: [],\n destinationTokens: [],\n setBestRoute: (bestRoute) =>\n set((state) => {\n let outputAmount: BigNumber | null = null;\n let outputUsdValue: BigNumber = ZERO;\n if (!isPositiveNumber(state.inputAmount)) return {};\n if (!!bestRoute) {\n outputAmount = !!bestRoute.result?.outputAmount\n ? new BigNumber(bestRoute.result?.outputAmount)\n : null;\n outputUsdValue = calcOutputUsdValue(\n bestRoute.result?.outputAmount,\n getBestRouteToTokenUsdPrice(bestRoute) || state.toToken?.usdPrice\n );\n }\n return {\n bestRoute,\n ...(!!bestRoute && {\n outputAmount,\n outputUsdValue,\n }),\n };\n }),\n resetRoute: () =>\n set(() => ({\n loading: true,\n error: '',\n bestRoute: null,\n outputAmount: null,\n outputUsdValue: new BigNumber(0),\n })),\n setFromChain: (chain, setDefaultToken) => {\n set((state) => {\n if (state.fromChain?.name === chain?.name) return {};\n const tokens = useMetaStore.getState().meta.tokens;\n const connectedWallets = useWalletsStore.getState().connectedWallets;\n const sortedTokens = getSortedTokens(\n chain,\n tokens,\n connectedWallets,\n state.destinationTokens\n );\n const fromToken = getDefaultToken(sortedTokens, state.toToken);\n return {\n fromChain: chain,\n sourceTokens: sortedTokens,\n ...(setDefaultToken && {\n fromToken,\n }),\n ...(!!state.inputAmount && {\n inputUsdValue: getUsdValue(fromToken, state.inputAmount),\n }),\n };\n });\n },\n setFromToken: (token) =>\n set((state) => ({\n fromToken: token,\n ...(!!state.inputAmount && {\n inputUsdValue: getUsdValue(token, state.inputAmount),\n }),\n })),\n setToChain: (chain, setDefaultToken) => {\n set((state) => {\n if (state.toChain?.name === chain?.name) return {};\n const tokens = useMetaStore.getState().meta.tokens;\n const connectedWallets = useWalletsStore.getState().connectedWallets;\n const sortedTokens = getSortedTokens(\n chain,\n tokens,\n connectedWallets,\n state.destinationTokens\n );\n\n return {\n toChain: chain,\n destinationTokens: sortedTokens,\n ...(setDefaultToken && {\n toToken: getDefaultToken(sortedTokens, state.fromToken),\n }),\n };\n });\n },\n setToToken: (token) =>\n set(() => ({\n toToken: token,\n })),\n setInputAmount: (amount) => {\n set((state) => ({\n inputAmount: amount,\n ...(!amount && {\n outputAmount: new BigNumber(0),\n outputUsdValue: new BigNumber(0),\n bestRoute: null,\n error: '',\n }),\n ...(!!state.fromToken && {\n inputUsdValue: getUsdValue(state.fromToken, amount),\n }),\n }));\n },\n retry: (pendingSwap) => {\n const { tokens, blockchains } = useMetaStore.getState().meta;\n const connectedWallets = useWalletsStore.getState().connectedWallets;\n const failedIndex =\n pendingSwap.status === 'failed'\n ? pendingSwap.steps.findIndex((s) => s.status === 'failed')\n : null;\n\n if (failedIndex === null || failedIndex < 0) return;\n\n const firstStep = pendingSwap.steps[0];\n const lastStep = pendingSwap.steps[pendingSwap.steps.length - 1];\n const fromChain =\n blockchains.find(\n (blockchain) => blockchain.name === firstStep.fromBlockchain\n ) || null;\n const toChain =\n blockchains.find(\n (blockchain) => blockchain.name === lastStep.toBlockchain\n ) || null;\n\n const fromToken = tokens.find((token) =>\n tokensAreEqual(token, {\n blockchain: firstStep.fromBlockchain,\n symbol: firstStep.fromSymbol,\n address: firstStep.fromSymbolAddress,\n })\n );\n\n const toToken = tokens.find((token) =>\n tokensAreEqual(token, {\n blockchain: lastStep.toBlockchain,\n symbol: lastStep.toSymbol,\n address: lastStep.toSymbolAddress,\n })\n );\n const sortedSourceTokens = getSortedTokens(\n fromChain,\n tokens,\n connectedWallets,\n []\n );\n const sortedDestinationTokens = getSortedTokens(\n toChain,\n tokens,\n connectedWallets,\n []\n );\n const inputAmount = pendingSwap.inputAmount;\n set({\n fromChain,\n fromToken,\n inputAmount,\n outputAmount: null,\n inputUsdValue: getUsdValue(fromToken || null, inputAmount),\n outputUsdValue: new BigNumber(0),\n toChain,\n toToken,\n bestRoute: null,\n loading: false,\n error: '',\n sourceTokens: sortedSourceTokens,\n destinationTokens: sortedDestinationTokens,\n });\n },\n switchFromAndTo: () =>\n set((state) => ({\n fromChain: state.toChain,\n fromToken: state.toToken,\n toChain: state.fromChain,\n toToken: state.fromToken,\n sourceTokens: state.destinationTokens,\n destinationTokens: state.sourceTokens,\n inputAmount: state.outputAmount?.toString() || '',\n inputUsdValue: getUsdValue(\n state.toToken,\n state.outputAmount?.toString() || ''\n ),\n })),\n }))\n )\n);\n\nconst bestRoute = (\n bestRouteStore: typeof useBestRouteStore,\n settingsStore: typeof useSettingsStore\n) => {\n let abortController: AbortController | null = null;\n const fetchBestRoute = () => {\n const { fromToken, toToken, inputAmount, resetRoute } =\n bestRouteStore.getState();\n const {\n slippage,\n customSlippage,\n disabledLiquiditySources,\n affiliateRef,\n affiliatePercent,\n affiliateWallets,\n } = settingsStore.getState();\n if (!fromToken || !toToken || !isPositiveNumber(inputAmount)) return;\n abortController?.abort();\n abortController = new AbortController();\n const userSlippage = !!customSlippage ? customSlippage : slippage;\n const requestBody = createBestRouteRequestBody(\n fromToken,\n toToken,\n inputAmount,\n [],\n [],\n disabledLiquiditySources,\n userSlippage,\n affiliateRef,\n affiliatePercent,\n affiliateWallets\n );\n\n if (!bestRouteStore.getState().loading) {\n resetRoute();\n }\n httpService()\n .getBestRoute(requestBody, {\n signal: abortController.signal,\n })\n .then((res) => {\n const { setBestRoute } = bestRouteStore.getState();\n setBestRoute(res);\n bestRouteStore.setState({ loading: false });\n abortController = null;\n })\n .catch((error) => {\n if (error.code === 'ERR_CANCELED') return;\n bestRouteStore.setState({\n error: error.message,\n loading: false,\n });\n });\n };\n\n const debouncedFetchBestRoute = debounce(fetchBestRoute, 600);\n\n const bestRouteParamsListener = () => {\n const { fromToken, toToken, inputAmount, inputUsdValue, resetRoute } =\n useBestRouteStore.getState();\n if (!isPositiveNumber(inputAmount) || inputUsdValue?.eq(0))\n return bestRouteStore.setState({ loading: false });\n\n if (tokensAreEqual(fromToken, toToken))\n return bestRouteStore.setState({\n loading: false,\n bestRoute: null,\n outputAmount: new BigNumber(inputAmount),\n outputUsdValue: inputUsdValue,\n });\n\n if (!bestRouteStore.getState().loading) resetRoute();\n debouncedFetchBestRoute();\n };\n\n useBestRouteStore.subscribe(\n (state) => ({\n fromChain: state.fromChain,\n fromToken: state.fromToken,\n toChain: state.toChain,\n toToken: state.toToken,\n inputAmount: state.inputAmount,\n }),\n bestRouteParamsListener,\n {\n equalityFn: (prevState, currentState) => {\n if (\n isRouteParametersChanged({\n store: 'bestRoute',\n prevState,\n currentState,\n })\n )\n return false;\n else return true;\n },\n }\n );\n\n useSettingsStore.subscribe(\n (state) => ({\n slippage: state.slippage,\n customSlippage: state.customSlippage,\n disabledLiquiditySources: state.disabledLiquiditySources,\n infiniteApprove: state.infiniteApprove,\n }),\n bestRouteParamsListener,\n {\n equalityFn: (prevState, currentState) => {\n if (\n isRouteParametersChanged({\n store: 'settings',\n prevState,\n currentState,\n })\n )\n return false;\n else return true;\n },\n }\n );\n\n return { fetchBestRoute };\n};\n\nexport const { fetchBestRoute } = bestRoute(\n useBestRouteStore,\n useSettingsStore\n);\n", "import BigNumber from 'bignumber.js';\n\nexport const ZERO = new BigNumber(0);\n", "import {\n SimulationAssetAndAmount,\n SimulationValidationStatus,\n} from '@rango-dev/ui/dist/widget/ui/src/types/swaps';\nimport BigNumber from 'bignumber.js';\nimport { BestRouteResponse, BlockchainMeta, Token } from 'rango-sdk';\nimport { areEqual } from './common';\nimport { BestRouteEqualityParams, Wallet } from '../types';\nimport { numberToString } from './numbers';\nimport { PendingSwap } from '@rango-dev/queue-manager-rango-preset';\n\nexport function searchParamsToToken(\n tokens: Token[],\n searchParams: string | null,\n chain: BlockchainMeta | null\n): Token | null {\n if (!chain) return null;\n return (\n tokens.find((token) => {\n const symbolAndAddress = searchParams?.split('--');\n if (symbolAndAddress?.length === 1)\n return (\n token.symbol === symbolAndAddress[0] &&\n token.address === null &&\n token.blockchain === chain.name\n );\n return (\n token.symbol === symbolAndAddress?.[0] &&\n token.address === symbolAndAddress?.[1] &&\n token.blockchain === chain.name\n );\n }) || null\n );\n}\n\nexport function getBestRouteToTokenUsdPrice(\n bestRoute: BestRouteResponse | null\n): number | null | undefined {\n return bestRoute?.result?.swaps[bestRoute?.result?.swaps.length - 1].to\n .usdPrice;\n}\n\nexport function isNumberOfSwapsChanged(\n route1: BestRouteResponse,\n route2: BestRouteResponse\n) {\n const route1Swaps = route1.result?.swaps || [];\n const route2Swaps = route2.result?.swaps || [];\n return route1Swaps.length !== route2Swaps.length;\n}\n\nexport function isRouteSwappersUpdated(\n route1: BestRouteResponse,\n route2: BestRouteResponse\n) {\n const route1Swappers =\n route1.result?.swaps.map((swap) => swap.swapperId) || [];\n const route2Swappers =\n route2.result?.swaps.map((swap) => swap.swapperId) || [];\n return !areEqual(route1Swappers, route2Swappers);\n}\n\nexport function isRouteInternalCoinsUpdated(\n route1: BestRouteResponse,\n route2: BestRouteResponse\n) {\n const route1InternalCoins =\n route1.result?.swaps.map((swap) => swap.to.symbol) || [];\n const route2InternalCoins =\n route2.result?.swaps.map((swap) => swap.to.symbol) || [];\n return !areEqual(route1InternalCoins, route2InternalCoins);\n}\n\nexport function isRouteChanged(\n route1: BestRouteResponse,\n route2: BestRouteResponse\n): boolean {\n return (\n isNumberOfSwapsChanged(route1, route2) ||\n isRouteSwappersUpdated(route1, route2) ||\n isRouteInternalCoinsUpdated(route1, route2)\n );\n}\n\nexport function outToRatioHasWarning(\n fromUsdValue: BigNumber | null,\n outToInRatio: BigNumber | 0\n) {\n return (\n (parseInt(outToInRatio?.toFixed(2) || '0') <= -10 &&\n (fromUsdValue === null || fromUsdValue.gte(new BigNumber(200)))) ||\n (parseInt(outToInRatio?.toFixed(2) || '0') <= -5 &&\n (fromUsdValue === null || fromUsdValue.gte(new BigNumber(1000))))\n );\n}\n\nexport function getRequiredBalanceOfWallet(\n selectedWallet: Wallet,\n fee: SimulationValidationStatus[] | null\n): SimulationAssetAndAmount[] | null {\n if (fee === null) return null;\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) return null;\n return relatedFeeStatus.requiredAssets;\n}\n\nexport function isRouteParametersChanged(params: BestRouteEqualityParams) {\n if (params.store === 'bestRoute') {\n const { prevState, currentState } = params;\n return (\n !!currentState.fromToken &&\n !!currentState.toToken &&\n (prevState.fromChain?.name !== currentState.fromChain?.name ||\n prevState.toChain?.name !== currentState.toChain?.name ||\n prevState.fromToken?.symbol !== currentState.fromToken?.symbol ||\n prevState.toToken?.symbol !== currentState.toToken?.symbol ||\n prevState.fromToken?.blockchain !== prevState.fromToken?.blockchain ||\n prevState.toToken?.blockchain !== currentState.toToken?.blockchain ||\n prevState.fromToken?.address !== currentState.fromToken?.address ||\n prevState.toToken?.address !== currentState.toToken?.address ||\n prevState.inputAmount !== currentState.inputAmount)\n );\n } else if (params.store === 'settings') {\n const { prevState, currentState } = params;\n return (\n prevState.slippage !== currentState.slippage ||\n prevState.customSlippage !== currentState.customSlippage ||\n prevState.disabledLiquiditySources?.length !==\n currentState.disabledLiquiditySources?.length ||\n prevState.infiniteApprove ||\n currentState.infiniteApprove\n );\n }\n return false;\n}\n\nexport function getFormatedBestRoute(\n bestRoute: BestRouteResponse | null\n): BestRouteResponse | null {\n if (!bestRoute) return null;\n\n const formatedSwaps = (bestRoute.result?.swaps || []).map((swap) => ({\n ...swap,\n fromAmount: numberToString(swap.fromAmount, 6, 6),\n toAmount: numberToString(swap.toAmount, 6, 6),\n }));\n\n return {\n ...bestRoute,\n ...(bestRoute.result && {\n result: { ...bestRoute.result, swaps: formatedSwaps },\n }),\n };\n}\n\nexport function getFormatedPendingSwap(pendingSwap: PendingSwap): PendingSwap {\n const formatedSteps = pendingSwap.steps.map((step) => ({\n ...step,\n feeInUsd: numberToString(step.feeInUsd, 4, 4),\n outputAmount: numberToString(step.outputAmount, 6, 6),\n expectedOutputAmountHumanReadable: numberToString(\n step.expectedOutputAmountHumanReadable,\n 6,\n 6\n ),\n }));\n\n return {\n ...pendingSwap,\n inputAmount: numberToString(pendingSwap.inputAmount, 6, 6),\n steps: formatedSteps,\n };\n}\n\n//todo: refactor bestRoute store and add loadingStatus\nexport const getBestRouteStatus = (loading: boolean, error: boolean) => {\n if (loading) return 'loading';\n if (error) return 'failed';\n else return 'success';\n};\n", "export function removeDuplicateFrom<T>(array: T[]): T[] {\n return Array.from(new Set(array));\n}\n\nexport function areEqual(\n array1: (number | string)[],\n array2: (number | string)[]\n) {\n return (\n array1.length === array2.length && array1.every((v, i) => v === array2[i])\n );\n}\n\n\n\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\n\n", "import { BigNumber } from 'bignumber.js';\nimport { BestRouteResponse } from 'rango-sdk';\n\nexport const percentToString = (p: number, fractions = 0): string =>\n (p * 100).toFixed(fractions);\n\nexport const secondsToString = (s: number): string => {\n const seconds = (s % 60).toString().padStart(2, '0');\n const minutes = parseInt((s / 60).toString())\n .toString()\n .padStart(2, '0');\n return `${minutes}:${seconds}`;\n};\n\nexport const numberToString = (\n number: BigNumber | string | null | undefined,\n minDecimals: number | null = null,\n maxDecimals: number | null = null\n): string => {\n if (number === null || number === undefined) return '';\n if (number === '') return '';\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)) return n.toFormat(0, roundingMode);\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 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 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 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 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 if (n.isEqualTo(0)) return '0';\n\n return n.toFormat(\n Math.min(maxI, Math.min(maxDecimals || 100, Math.max(minDecimals || 0, 8))),\n roundingMode\n );\n};\n\nexport const convertBigNumberToHex = (\n value: BigNumber,\n decimals: number\n): string => {\n return '0x' + value.shiftedBy(decimals).toString(16);\n};\n\nexport const uint8ArrayToHex = (buffer: Uint8Array): string => {\n // buffer is an ArrayBuffer\n // eslint-disable-next-line @typescript-eslint/ban-ts-comment\n // @ts-ignore\n return [...buffer].map((x) => x.toString(16).padStart(2, '0')).join('');\n};\n\nexport function dollarToConciseString(num: number | undefined): string {\n if (!num) return '-';\n if (num < 1) return ' < 1$';\n if (num < 1000) return numberToString(new BigNumber(num)) + '$';\n if (num < 10_000) return parseInt((num / 100).toString()) / 10 + 'K';\n if (num < 1_000_000) return parseInt((num / 1000).toString()) + 'K';\n if (num < 100_000_000) return parseInt((num / 100000).toString()) / 10 + 'M';\n return parseInt((num / 1000000).toString()) + 'M';\n}\n\nexport function removeExtraDecimals(num: string, maxDecimals: number): string {\n try {\n if (!num.includes('.')) return num;\n const [b, f] = num.split('.');\n if (f && f.length > maxDecimals) {\n return `${b}.${f.substring(0, maxDecimals)}`;\n }\n return num;\n } catch (e) {\n return num;\n }\n}\n\nexport const totalArrivalTime = (data: BestRouteResponse | null) =>\n data?.result?.swaps?.reduce((a, b) => a + b.estimatedTimeInSeconds, 0) || 0;\n\nexport const rawFees = (data: BestRouteResponse): string =>\n (\n data?.result?.swaps?.flatMap((s) =>\n s.fee.map((f) => ({ swapperId: s.swapperId, fee: f }))\n ) || []\n )\n .reduce((partialSum, a) => partialSum + parseFloat(a.fee.amount), 0)\n .toFixed(3);\n\nexport const containsText = (text: string, searchText: string) =>\n text.toLowerCase().indexOf(searchText.toLowerCase()) > -1;\n\nexport const isPositiveNumber = (text?: string) =>\n !!text && parseFloat(text) > 0;\n10;\n", "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 { RangoClient } from 'rango-sdk';\nimport { getConfig } from '../utils/configs';\n\n// this API key is limited and\n// it is only for test purpose\nexport const RANGO_PUBLIC_API_KEY = 'c6381a79-2817-4602-83bf-6a641a409e32';\n\nlet rango: RangoClient | undefined = undefined;\n\nexport const httpService = () => {\n if (rango) return rango;\n rango = new RangoClient(getConfig('API_KEY'));\n return rango;\n};\n", "export interface Configs {\n API_KEY: string;\n}\n\nconst RANGO_PUBLIC_API_KEY = 'c6381a79-2817-4602-83bf-6a641a409e32';\n\nlet configs: Configs = {\n API_KEY: RANGO_PUBLIC_API_KEY,\n};\n\nexport function getConfig(name: keyof Configs) {\n return configs[name];\n}\n\nexport function setConfig(name: keyof Configs, value: any) {\n configs[name] = value;\n\n return value;\n}\n\nexport function initConfig(nextConfigs: Configs) {\n let clonedConfigs;\n if (typeof structuredClone === 'function') {\n clonedConfigs = structuredClone(nextConfigs);\n } else {\n clonedConfigs = JSON.parse(JSON.stringify(nextConfigs));\n }\n configs = clonedConfigs;\n return configs;\n}\n", "import { create } from 'zustand';\nimport { persist, subscribeWithSelector } from 'zustand/middleware';\nimport { DEFAULT_SLIPPAGE } from '../constants/swapSettings';\nimport { removeDuplicateFrom } from '../utils/common';\nimport { useMetaStore } from './meta';\nimport createSelectors from './selectors';\n\ntype Theme = 'auto' | 'dark' | 'light';\n\nexport interface SettingsState {\n slippage: number;\n customSlippage: number | null;\n infiniteApprove: boolean;\n disabledLiquiditySources: string[];\n theme: Theme;\n affiliateRef: string | null;\n affiliatePercent: number | null;\n affiliateWallets: { [key: string]: string } | null;\n setSlippage: (slippage: number) => void;\n setCustomSlippage: (customSlippage: number | null) => void;\n toggleInfiniteApprove: () => void;\n toggleLiquiditySource: (name: string) => void;\n setTheme: (theme: Theme) => void;\n toggleAllLiquiditySources: () => void;\n setAffiliateRef: (affiliateRef: string | null) => void;\n setAffiliatePercent: (affiliatePercent: number | null) => void;\n setAffiliateWallets: (\n affiliateWallets: { [key: string]: string } | null\n ) => void;\n}\n\nexport const useSettingsStore = createSelectors(\n create<SettingsState>()(\n persist(\n subscribeWithSelector((set) => ({\n slippage: DEFAULT_SLIPPAGE,\n customSlippage: null,\n infiniteApprove: false,\n affiliateRef: null,\n affiliatePercent: null,\n affiliateWallets: null,\n disabledLiquiditySources: [],\n theme: 'auto',\n setSlippage: (slippage) =>\n set(() => ({\n slippage: slippage,\n })),\n setCustomSlippage: (customSlippage) =>\n set(() => ({\n customSlippage: customSlippage,\n })),\n setAffiliateRef: (affiliateRef) =>\n set(() => ({\n affiliateRef,\n })),\n setAffiliatePercent: (affiliatePercent) =>\n set(() => ({\n affiliatePercent,\n })),\n\n setAffiliateWallets: (affiliateWallets) =>\n set(() => ({\n affiliateWallets,\n })),\n toggleAllLiquiditySources: () =>\n set((state) => {\n const { swappers } = useMetaStore.getState().meta;\n const swappersGroup = removeDuplicateFrom(\n swappers.map((swapper) => swapper.swapperGroup)\n );\n\n if (swappersGroup.length === state.disabledLiquiditySources.length)\n return { disabledLiquiditySources: [] };\n else {\n return {\n disabledLiquiditySources: swappersGroup,\n };\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 else\n return {\n disabledLiquiditySources:\n state.disabledLiquiditySources.concat(name),\n };\n }),\n setTheme: (theme) =>\n set(() => ({\n theme,\n })),\n })),\n {\n name: 'user-settings',\n skipHydration: true,\n }\n )\n )\n);\n", "export const SLIPPAGES = [0.5, 1, 3, 5, 8, 13, 20];\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 { create } from 'zustand';\nimport { MetaResponse } from 'rango-sdk';\nimport { httpService } from '../services/httpService';\nimport createSelectors from './selectors';\nimport { removeDuplicateFrom } from '../utils/common';\n\nexport type LoadingStatus = 'loading' | 'success' | 'failed';\n\nexport interface MetaState {\n meta: MetaResponse;\n loadingStatus: LoadingStatus;\n fetchMeta: () => Promise<void>;\n}\n\nexport const useMetaStore = createSelectors(\n create<MetaState>()((set) => ({\n meta: { blockchains: [], popularTokens: [], swappers: [], tokens: [] },\n loadingStatus: 'loading',\n fetchMeta: async () => {\n try {\n const response = await httpService().getAllMetadata();\n const chainThatHasTokenInMetaResponse = removeDuplicateFrom(\n response.tokens.map((t) => t.blockchain)\n );\n const enabledChains = response.blockchains.filter(\n (chain) =>\n chain.enabled &&\n chainThatHasTokenInMetaResponse.includes(chain.name)\n );\n response.blockchains = enabledChains.sort((a, b) => a.sort - b.sort);\n set({ meta: response, loadingStatus: 'success' });\n } catch (error) {\n set({ loadingStatus: 'failed' });\n }\n },\n }))\n);\n", "import BigNumber from 'bignumber.js';\nimport {\n BestRouteRequest,\n BestRouteResponse,\n RecommendedSlippage,\n SwapResult,\n Token,\n} from 'rango-sdk';\nimport { i18n } from '@lingui/core';\nimport { ConnectedWallet } from '../store/wallets';\nimport { ZERO } from '../constants/numbers';\nimport { numberToString } from './numbers';\nimport { WalletType } from '@rango-dev/wallets-shared';\nimport { getRequiredBalanceOfWallet } from './routing';\nimport { getRequiredChains } from './wallets';\nimport { LoadingStatus, useMetaStore } from '../store/meta';\nimport { ConvertedToken, SwapButtonState, Wallet } from '../types';\nimport {\n PendingSwapNetworkStatus,\n PendingSwapStep,\n} from '@rango-dev/queue-manager-rango-preset';\nimport { PendingSwap } from '@rango-dev/queue-manager-rango-preset';\nimport { removeDuplicateFrom } from './common';\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 return outputUsdValue.div(inputUsdValue).minus(1).multipliedBy(100);\n}\n\nexport function outputRatioHasWarning(\n inputUsdValue: BigNumber | null,\n outputRatio: BigNumber | 0\n): boolean {\n return (\n ((parseInt(outputRatio.toFixed(2) || '0') <= -10 &&\n inputUsdValue?.gte(new BigNumber(400))) ||\n (parseInt(outputRatio.toFixed(2) || '0') <= -5 &&\n inputUsdValue?.gte(new BigNumber(1000)))) ??\n false\n );\n}\n\nexport function hasLimitError(bestRoute: BestRouteResponse | null): boolean {\n return (\n (bestRoute?.result?.swaps || []).filter((swap) => {\n const minimum = !!swap.fromAmountMinValue\n ? new BigNumber(swap.fromAmountMinValue)\n : null;\n const maximum = !!swap.fromAmountMaxValue\n ? new BigNumber(swap.fromAmountMaxValue)\n : null;\n const isExclusive = swap.fromAmountRestrictionType === 'EXCLUSIVE';\n if (isExclusive) {\n return minimum?.gte(swap.fromAmount) || maximum?.lte(swap.fromAmount);\n } else {\n return minimum?.gt(swap.fromAmount) || maximum?.lt(swap.fromAmount);\n }\n }).length > 0\n );\n}\n\nexport function LimitErrorMessage(bestRoute: BestRouteResponse | null): {\n swap: SwapResult | null;\n fromAmountRangeError: string;\n recommendation: string;\n} {\n if (!bestRoute)\n return { swap: null, fromAmountRangeError: '', recommendation: '' };\n const swap = (bestRoute?.result?.swaps || []).filter((swap) => {\n const minimum = !!swap.fromAmountMinValue\n ? new BigNumber(swap.fromAmountMinValue)\n : null;\n const maximum = !!swap.fromAmountMaxValue\n ? new BigNumber(swap.fromAmountMaxValue)\n : null;\n const isExclusive = swap.fromAmountRestrictionType === 'EXCLUSIVE';\n if (isExclusive) {\n return minimum?.gte(swap.fromAmount) || maximum?.lte(swap.fromAmount);\n } else {\n return minimum?.gt(swap.fromAmount) || maximum?.lt(swap.fromAmount);\n }\n })[0];\n if (!swap)\n return { swap: null, fromAmountRangeError: '', recommendation: '' };\n const minimum = !!swap.fromAmountMinValue\n ? new BigNumber(swap.fromAmountMinValue)\n : null;\n const maximum = !!swap.fromAmountMaxValue\n ? new BigNumber(swap.fromAmountMaxValue)\n : null;\n const isExclusive = swap.fromAmountRestrictionType === 'EXCLUSIVE';\n\n let fromAmountRangeError = '';\n let recommendation = '';\n if (!isExclusive && !!minimum && minimum.gt(swap.fromAmount)) {\n fromAmountRangeError = `Required: >= ${numberToString(minimum)} ${\n swap.from.symbol\n }`;\n recommendation = 'Increase your swap amount';\n } else if (isExclusive && !!minimum && minimum.gte(swap.fromAmount)) {\n fromAmountRangeError = `Required: > ${numberToString(minimum)} ${\n swap.from.symbol\n }`;\n recommendation = 'Increase your swap amount';\n }\n\n if (!isExclusive && !!maximum && maximum.lt(swap.fromAmount)) {\n fromAmountRangeError = `Required: <= ${numberToString(maximum)} ${\n swap.from.symbol\n }`;\n recommendation = 'Decrease your swap amount';\n } else if (isExclusive && !!maximum && maximum.lte(swap.fromAmount)) {\n fromAmountRangeError = `Required: < ${numberToString(maximum)} ${\n swap.from.symbol\n }`;\n recommendation = 'Decrease your swap amount';\n }\n\n return { swap, fromAmountRangeError, recommendation };\n}\n\nexport function getSwapButtonState(\n loadingMetaStatus: LoadingStatus,\n connectedWallets: ConnectedWallet[],\n loading: boolean,\n bestRoute: BestRouteResponse | null,\n hasLimitError: boolean,\n highValueLoss: boolean,\n priceImpactCanNotBeComputed: boolean,\n needsToWarnEthOnPath: boolean,\n inputAmount: string\n): SwapButtonState {\n if (loadingMetaStatus !== 'success')\n return { title: `${i18n.t('Connect Wallet')}`, disabled: true };\n if (connectedWallets.length == 0)\n return { title: `${i18n.t('Connect Wallet')}`, disabled: false };\n if (loading)\n return { title: `${i18n.t('Finding Best Route...')}`, disabled: true };\n else if (!inputAmount || inputAmount === '0')\n return { title: `${i18n.t('Enter an amount')}`, disabled: true };\n else if (!bestRoute || !bestRoute.result)\n return { title: `${i18n.t('Swap')}`, disabled: true };\n else if (hasLimitError)\n return { title: `${i18n.t('Limit Error')}`, disabled: true };\n else if (highValueLoss)\n return { title: `${i18n.t('Price impact is too high!')}`, disabled: true };\n else if (priceImpactCanNotBeComputed)\n return {\n title: `${i18n.t('USD price is unknown, price impact might be high!')}`,\n disabled: false,\n hasWarning: true,\n };\n else if (needsToWarnEthOnPath)\n return {\n title: `${i18n.t('The route goes through Ethereum. Continue?')}`,\n disabled: false,\n hasWarning: true,\n };\n else return { title: `${i18n.t('Swap')}`, disabled: false };\n}\n\nexport function canComputePriceImpact(\n bestRoute: BestRouteResponse | null,\n inputAmount: string,\n inputUsdValue: BigNumber | null,\n outputUsdValue: BigNumber | null\n) {\n return !(\n (!inputUsdValue ||\n !outputUsdValue ||\n inputUsdValue.lte(ZERO) ||\n outputUsdValue.lte(ZERO)) &&\n !!bestRoute?.result &&\n !!inputAmount &&\n inputAmount !== '0' &&\n parseFloat(inputAmount || '0') !== 0 &&\n !!bestRoute.result\n );\n}\n\nexport function requiredWallets(route: BestRouteResponse | null) {\n const wallets: string[] = [];\n\n route?.result?.swaps.forEach((swap) => {\n const currentStepFromBlockchain = swap.from.blockchain;\n const currentStepToBlockchain = swap.to.blockchain;\n let lastAddedWallet = wallets[wallets.length - 1];\n if (currentStepFromBlockchain != lastAddedWallet)\n wallets.push(currentStepFromBlockchain);\n lastAddedWallet = wallets[wallets.length - 1];\n if (currentStepToBlockchain != lastAddedWallet)\n wallets.push(currentStepToBlockchain);\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') continue;\n\n const unitPrice = getUsdPrice(\n fee.asset.blockchain,\n fee.asset.symbol,\n fee.asset.address,\n allTokens\n );\n totalFeeInUsd = totalFeeInUsd.plus(\n new BigNumber(fee.amount).multipliedBy(unitPrice || 0)\n );\n }\n\n return totalFeeInUsd;\n}\n\nexport function getTotalFeeInUsd(\n bestRoute: BestRouteResponse | null,\n allTokens: Token[]\n): BigNumber | null {\n return (\n bestRoute?.result?.swaps.reduce(\n (totalFee: BigNumber, step) =>\n totalFee.plus(getUsdFeeOfStep(step, allTokens)),\n ZERO\n ) || null\n );\n}\n\nexport function hasHighFee(totalFeeInUsd: BigNumber | null) {\n if (!totalFeeInUsd) return false;\n return !totalFeeInUsd.lt(new BigNumber(30));\n}\n\nexport function hasSlippageError(\n slippages: (RecommendedSlippage | null)[] | undefined\n) {\n return (slippages?.filter((s) => !!s?.error)?.length || 0) > 0;\n}\n\nexport function getMinRequiredSlippage(\n route: BestRouteResponse\n): string | null {\n const slippages = route.result?.swaps.map(\n (slippage) => slippage.recommendedSlippage\n );\n return (\n slippages\n ?.map((s) => s?.slippage || '0')\n ?.filter((s) => parseFloat(s) > 0)\n ?.sort((a, b) => parseFloat(b) - parseFloat(a))\n ?.find(() => true) || null\n );\n}\n\nexport function hasProperSlippage(\n userSlippage: string,\n minRequiredSlippage: string | null\n) {\n if (!minRequiredSlippage) return true;\n return parseFloat(userSlippage) >= parseFloat(minRequiredSlippage);\n}\n\nexport function hasEnoughBalance(\n route: BestRouteResponse,\n selectedWallets: Wallet[]\n) {\n const fee = route.validationStatus;\n\n if (fee === null || fee.length === 0) return true;\n\n for (const wallet of selectedWallets) {\n const requiredAssets = getRequiredBalanceOfWallet(wallet, fee);\n if (!requiredAssets) continue;\n\n const enoughBalanceInWallet = requiredAssets\n .map((asset) => asset.ok)\n .reduce((previous, current) => previous && current);\n if (!enoughBalanceInWallet) return false;\n }\n\n return true;\n}\n\nexport function hasEnoughBalanceAndProperSlippage(\n route: BestRouteResponse,\n selectedWallets: Wallet[],\n userSlippage: string,\n minRequiredSlippage: string | null\n): boolean {\n return (\n hasEnoughBalance(route, selectedWallets) &&\n hasProperSlippage(userSlippage, minRequiredSlippage)\n );\n}\n\nexport function createBestRouteRequestBody(\n fromToken: Token,\n toToken: Token,\n inputAmount: string,\n wallets: ConnectedWallet[],\n selectedWallets: Wallet[],\n disabledLiquiditySources: string[],\n slippage: number,\n affiliateRef: string | null,\n affiliatePercent: number | null,\n affiliateWallets: { [key: string]: string } | null,\n initialRoute?: BestRouteResponse,\n destination?: string\n): BestRouteRequest {\n const selectedWalletsMap = selectedWallets.reduce(\n (\n selectedWalletsMap: BestRouteRequest['selectedWallets'],\n selectedWallet\n ) => (\n (selectedWalletsMap[selectedWallet.chain] = selectedWallet.address),\n selectedWalletsMap\n ),\n {}\n );\n\n const connectedWallets: BestRouteRequest['connectedWallets'] = [];\n\n wallets.forEach((wallet) => {\n const chainAndAccounts = connectedWallets.find(\n (connectedWallet) => connectedWallet.blockchain === wallet.chain\n );\n if (!!chainAndAccounts) chainAndAccounts.addresses.push(wallet.address);\n else\n connectedWallets.push({\n blockchain: wallet.chain,\n addresses: [wallet.address],\n });\n });\n\n const checkPrerequisites = !!initialRoute;\n\n const filteredBlockchains = removeDuplicateFrom(\n (initialRoute?.result?.swaps || []).reduce(\n (blockchains: string[], swap) => {\n blockchains.push(swap.from.blockchain, swap.to.blockchain);\n // Check if internalSwaps array exists\n if (swap.internalSwaps && Array.isArray(swap.internalSwaps)) {\n swap.internalSwaps.map((internalSwap) => {\n blockchains.push(\n internalSwap.from.blockchain,\n internalSwap.to.blockchain\n );\n });\n }\n return blockchains;\n },\n []\n )\n );\n\n const requestBody: BestRouteRequest = {\n amount: inputAmount.toString(),\n affiliateRef: affiliateRef ?? undefined,\n affiliatePercent: affiliatePercent ?? undefined,\n affiliateWallets: affiliateWallets ?? undefined,\n checkPrerequisites,\n from: {\n address: fromToken.address,\n blockchain: fromToken.blockchain,\n symbol: fromToken.symbol,\n },\n to: {\n address: toToken.address,\n blockchain: toToken.blockchain,\n symbol: toToken.symbol,\n },\n connectedWallets,\n destination: destination || undefined,\n selectedWallets: selectedWalletsMap,\n swapperGroups: disabledLiquiditySources,\n swappersGroupsExclude: true,\n slippage: slippage.toString(),\n ...(checkPrerequisites && { blockchains: filteredBlockchains }),\n };\n\n return requestBody;\n}\n\nexport function getWalletsForNewSwap(selectedWallets: Wallet[]) {\n const wallets = selectedWallets.reduce(\n (\n selectedWalletsMap: {\n [p: string]: { address: string; walletType: WalletType };\n },\n selectedWallet\n ) => (\n (selectedWalletsMap[selectedWallet.chain] = {\n address: selectedWallet.address,\n walletType: selectedWallet.walletType,\n }),\n selectedWalletsMap\n ),\n {}\n );\n\n return wallets;\n}\n\nexport function getRouteOutputAmount(route: BestRouteResponse | null) {\n return route?.result?.outputAmount || null;\n}\n\nexport function getPercentageChange(\n oldValue: string | number | null,\n newValue: string | number | null\n) {\n if (!oldValue || !newValue) return null;\n return new BigNumber(newValue)\n .div(new BigNumber(oldValue))\n .minus(1)\n .multipliedBy(100);\n}\n\nexport function isOutputAmountChangedALot(\n oldRoute: BestRouteResponse,\n newRoute: BestRouteResponse\n) {\n const oldOutputAmount = getRouteOutputAmount(oldRoute);\n const newOutputAmount = getRouteOutputAmount(newRoute);\n if (!oldOutputAmount || !newOutputAmount) return false;\n const percentageChange = getPercentageChange(\n oldOutputAmount,\n newOutputAmount\n );\n if (!percentageChange) return true;\n\n return percentageChange.toNumber() <= -1;\n}\n\nexport function getBalanceWarnings(\n route: BestRouteResponse,\n selectedWallets: Wallet[]\n) {\n const fee = route.validationStatus;\n const requiredWallets = getRequiredChains(route);\n const walletsSortedByRequiredWallets = selectedWallets.sort(\n (selectedWallet1, selectedWallet2) =>\n requiredWallets.indexOf(selectedWallet1.chain) -\n requiredWallets.indexOf(selectedWallet2.chain)\n );\n return walletsSortedByRequiredWallets\n .flatMap((wallet) => getRequiredBalanceOfWallet(wallet, fee) || [])\n .filter((asset) => !asset.ok)\n .map((asset) => {\n const symbol = asset.asset.symbol;\n const currentAmount = numberToString(\n new BigNumber(asset.currentAmount.amount).shiftedBy(\n -asset.currentAmount.decimals\n ),\n 8\n );\n const requiredAmount = numberToString(\n new BigNumber(asset.requiredAmount.amount).shiftedBy(\n -asset.requiredAmount.decimals\n ),\n 8\n );\n let reason = '';\n if (asset.reason === 'FEE') reason = ' for network fee';\n if (asset.reason === 'INPUT_ASSET') reason = ' for swap';\n if (asset.reason === 'FEE_AND_INPUT_ASSET')\n reason = ' for input and network fee';\n const warningMessage = `Needs \u2248 ${requiredAmount} ${symbol}${reason}, but you have ${currentAmount} ${symbol} in your ${asset.asset.blockchain} wallet.`;\n return warningMessage;\n });\n}\n\nexport function calcOutputUsdValue(\n outputAmount?: string,\n tokenPrice?: number | null\n) {\n const amount = !!outputAmount ? new BigNumber(outputAmount) : ZERO;\n\n return amount.multipliedBy(tokenPrice || 0);\n}\n\nexport function isNetworkStatusInWarningState(\n pendingSwapStep: PendingSwapStep | null\n): boolean {\n return (\n !!pendingSwapStep &&\n pendingSwapStep.networkStatus !== null &&\n pendingSwapStep.networkStatus !== PendingSwapNetworkStatus.NetworkChanged\n );\n}\n\nexport function getSwapMessages(\n pendingSwap: PendingSwap,\n currentStep: PendingSwapStep | null\n): {\n shortMessage: string;\n detailedMessage: { content: string; long: boolean };\n} {\n const textForRemove = 'bellow button or';\n let message = pendingSwap.extraMessage;\n let detailedMessage = pendingSwap.extraMessageDetail;\n\n if (pendingSwap.networkStatusExtraMessageDetail?.includes(textForRemove)) {\n pendingSwap.networkStatusExtraMessageDetail =\n pendingSwap.networkStatusExtraMessageDetail.replace(textForRemove, '');\n }\n\n const networkWarningState = isNetworkStatusInWarningState(currentStep);\n\n if (networkWarningState) {\n message = pendingSwap.networkStatusExtraMessage || '';\n detailedMessage = pendingSwap.networkStatusExtraMessageDetail || '';\n switch (currentStep?.networkStatus) {\n case PendingSwapNetworkStatus.WaitingForConnectingWallet:\n message = message || 'Waiting for connecting wallet';\n break;\n case PendingSwapNetworkStatus.WaitingForQueue:\n message = message || 'Waiting for other running tasks to be finished';\n break;\n case PendingSwapNetworkStatus.WaitingForNetworkChange:\n message = message || 'Waiting for changing wallet network';\n break;\n }\n }\n detailedMessage = detailedMessage || '';\n message = message || '';\n const isRpc =\n message?.indexOf('code') !== -1 && message?.indexOf('reason') !== -1;\n\n return {\n shortMessage: message,\n detailedMessage: { content: detailedMessage, long: isRpc },\n };\n}\n\nexport function getLastConvertedTokenInFailedSwap(\n pendingSwap: PendingSwap\n): ConvertedToken {\n let resultToken: ConvertedToken = null;\n if (pendingSwap.status === 'failed') {\n const lastSuccessStep = pendingSwap.steps\n .slice()\n .reverse()\n .filter((step) => step.status === 'success')[0];\n\n if (lastSuccessStep) {\n resultToken = {\n blockchain: lastSuccessStep.toBlockchain,\n symbol: lastSuccessStep.toSymbol,\n outputAmount: lastSuccessStep.outputAmount,\n address: lastSuccessStep.toSymbolAddress,\n };\n }\n }\n return resultToken;\n}\n\nexport function shouldRetrySwap(pendingSwap: PendingSwap) {\n return (\n pendingSwap.status === 'failed' &&\n !!pendingSwap.finishTime &&\n new Date().getTime() - parseInt(pendingSwap.finishTime) < 4 * 3600 * 1000\n );\n}\nexport function isValidCustomDestination(\n blockchain: string,\n address: string\n): boolean {\n const blockchains = useMetaStore.getState().meta.blockchains;\n const regex =\n blockchains.find((chain) => chain.name === blockchain)?.addressPatterns ||\n [];\n return regex.filter((r) => new RegExp(r).test(address)).length > 0;\n}\n\nexport function confirmSwapDisabled(\n fetching: boolean,\n destinationChain: string,\n customDestination: string,\n bestRoute: BestRouteResponse | null,\n selectedWallets: Wallet[]\n) {\n return (\n fetching ||\n (!destinationChain &&\n !requiredWallets(bestRoute).every((chain) =>\n selectedWallets.map((wallet) => wallet.chain).includes(chain)\n )) ||\n (!!destinationChain && !customDestination) ||\n (!!destinationChain &&\n !!customDestination &&\n !requiredWallets(bestRoute)\n .filter((chain) => chain !== destinationChain)\n .every((chain) =>\n selectedWallets.map((wallet) => wallet.chain).includes(chain)\n ))\n );\n}\n", "import {\n getCosmosExperimentalChainInfo,\n isEvmAddress,\n KEPLR_COMPATIBLE_WALLETS,\n Network,\n WalletState,\n WalletType,\n detectInstallLink,\n WalletInfo,\n WalletTypes,\n Networks,\n} from '@rango-dev/wallets-shared';\n\nimport {\n WalletInfo as ModalWalletInfo,\n WalletState as WalletStatus,\n SelectableWallet,\n} from '@rango-dev/ui';\nimport {\n BestRouteResponse,\n BlockchainMeta,\n Token,\n WalletDetail,\n} from 'rango-sdk';\nimport { isCosmosBlockchain } from 'rango-types';\nimport { readAccountAddress } from '@rango-dev/wallets-react';\nimport { ConnectedWallet, TokenBalance } from '../store/wallets';\nimport { numberToString } from './numbers';\nimport BigNumber from 'bignumber.js';\nimport { TokenWithBalance } from '../pages/SelectTokenPage';\nimport { ZERO } from '../constants/numbers';\nimport { Wallet } from '../types';\n\nexport function getStateWallet(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 const excludedWallets = [WalletTypes.LEAP];\n\nexport function getlistWallet(\n getState: (type: WalletType) => WalletState,\n getWalletInfo: (type: WalletType) => WalletInfo,\n list: WalletType[]\n): ModalWalletInfo[] {\n return list\n .filter((wallet) => !excludedWallets.includes(wallet as WalletTypes))\n .map((type) => {\n const {\n name,\n img: image,\n installLink,\n showOnMobile,\n } = getWalletInfo(type);\n const state = getStateWallet(getState(type));\n return {\n name,\n image,\n installLink: detectInstallLink(installLink),\n state,\n type,\n showOnMobile: typeof showOnMobile === 'undefined' ? false : true,\n };\n });\n}\n\nexport function walletAndSupportedChainsNames(\n supportedChains: BlockchainMeta[]\n): Network[] | null {\n if (!supportedChains) return null;\n let walletAndSupportedChainsNames: Network[] = [];\n walletAndSupportedChainsNames = supportedChains.map(\n (blockchainMeta) => blockchainMeta.name\n );\n\n return walletAndSupportedChainsNames;\n}\n\nexport function prepareAccountsForWalletStore(\n wallet: WalletType,\n accounts: string[],\n evmBasedChains: string[],\n supportedChainNames: Network[] | null\n): Wallet[] {\n const result: Wallet[] = [];\n\n function addAccount(network: Network, address: string) {\n const accountForChainAlreadyExists = !!result.find(\n (account) => account.chain === network\n );\n if (!accountForChainAlreadyExists) {\n const newAccount: Wallet = {\n address,\n chain: network,\n walletType: wallet,\n };\n\n result.push(newAccount);\n }\n }\n\n const supportedChains = supportedChainNames || [];\n\n accounts.forEach((account) => {\n const { address, network } = readAccountAddress(account);\n\n const hasLimitation = supportedChains.length > 0;\n const isSupported = supportedChains.includes(network);\n const isUnknown = network === Networks.Unknown;\n const notSupportedNetworkByWallet =\n hasLimitation && !isSupported && !isUnknown;\n\n // Here we check given `network` is not supported by wallet\n // And also the network is known.\n if (notSupportedNetworkByWallet) return;\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 netwrok when the uknown network is evem.\n // Otherwise, we stop executing this function.\n const isUknownAndEvmBased =\n network === Networks.Unknown && isEvmAddress(address);\n if (isUnknown && !isUknownAndEvmBased) return;\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 || isUknownAndEvmBased) {\n // all evm chains are not supported in wallets, so we are adding\n // only to those that are supported by wallet.\n const evmChainsSupportedByWallet = supportedChains.filter((chain) =>\n evmBasedChains.includes(chain)\n );\n\n evmChainsSupportedByWallet.forEach((network) => {\n // EVM addresses are not case sensetive.\n // Some wallets like Binance-chain return some letters in uppercase which produces bugs in our wallet state.\n addAccount(network, address.toLowerCase());\n });\n } else {\n addAccount(network, address);\n }\n });\n\n return result;\n}\n\nexport function getRequiredChains(route: BestRouteResponse | null) {\n const wallets: string[] = [];\n\n route?.result?.swaps.forEach((swap) => {\n const currentStepFromBlockchain = swap.from.blockchain;\n const currentStepToBlockchain = swap.to.blockchain;\n if (!wallets.includes(currentStepFromBlockchain)) {\n wallets.push(currentStepFromBlockchain);\n }\n if (!wallets.includes(currentStepToBlockchain)) {\n wallets.push(currentStepToBlockchain);\n }\n\n // Check if internalSwaps array exists\n if (swap.internalSwaps && Array.isArray(swap.internalSwaps)) {\n swap.internalSwaps.forEach((internalSwap) => {\n const internalStepFromBlockchain = internalSwap.from.blockchain;\n const internalStepToBlockchain = internalSwap.to.blockchain;\n if (!wallets.includes(internalStepFromBlockchain)) {\n wallets.push(internalStepFromBlockchain);\n }\n if (!wallets.includes(internalStepToBlockchain)) {\n wallets.push(internalStepToBlockchain);\n }\n });\n }\n });\n return wallets;\n}\n\ntype Blockchain = { name: string; accounts: ConnectedWallet[] };\n\nexport function getSelectableWallets(\n connectedWallets: ConnectedWallet[],\n selectedWallets: Wallet[],\n getWalletInfo: (type: WalletType) => WalletInfo,\n destinationChain?: string\n): SelectableWallet[] {\n const selectableWallets = connectedWallets.map(\n (connectedWallet: ConnectedWallet) => {\n return {\n address: connectedWallet.address,\n walletType: connectedWallet.walletType,\n chain: connectedWallet.chain,\n image: getWalletInfo(connectedWallet.walletType).img,\n name: getWalletInfo(connectedWallet.walletType).name,\n selected:\n destinationChain === connectedWallet.chain\n ? false\n : !!selectedWallets.find(\n (selectedWallet) =>\n selectedWallet.chain === connectedWallet.chain &&\n selectedWallet.walletType === connectedWallet.walletType\n ),\n };\n }\n );\n\n return selectableWallets;\n}\n\nexport function getBalanceFromWallet(\n connectedWallets: ConnectedWallet[],\n chain: string,\n symbol: string,\n address: string | null\n): TokenBalance | null {\n if (connectedWallets.length === 0) return null;\n\n const selectedChainWallets = connectedWallets.filter(\n (wallet) => wallet.chain === chain\n );\n if (selectedChainWallets.length === 0) return null;\n\n return (\n selectedChainWallets\n .map(\n (wallet) =>\n wallet.balances?.find(\n (balance) =>\n (address !== null && balance.address === address) ||\n (address === null &&\n balance.address === address &&\n balance.symbol === symbol)\n ) || null\n )\n .filter((balance) => balance !== null)\n .sort(\n (a, b) => parseFloat(b?.amount || '0') - parseFloat(a?.amount || '1')\n )\n .find(() => true) || null\n );\n}\n\nexport function isAccountAndWalletMatched(\n account: Wallet,\n connectedWallet: ConnectedWallet\n) {\n return (\n account.address === connectedWallet.address &&\n account.chain === connectedWallet.chain &&\n account.walletType === connectedWallet.walletType\n );\n}\n\nexport function makeBalanceFor(\n wallet: Wallet,\n retrivedBalance: WalletDetail,\n tokens: Token[]\n): ConnectedWallet {\n const {\n address,\n blockChain: chain,\n explorerUrl,\n balances = [],\n } = retrivedBalance;\n return {\n address,\n chain,\n loading: false,\n error: false,\n explorerUrl,\n walletType: wallet.walletType,\n balances:\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 uniqueBalane: ConnectedWallet[] = connectedWallet?.reduce(\n (acc: ConnectedWallet[], current: ConnectedWallet) => {\n return acc.findIndex(\n (i) => i.address === current.address && i.chain === current.chain\n ) === -1\n ? [...acc, current]\n : acc;\n },\n []\n );\n\n const modifiedWalletBlockchains = uniqueBalane?.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 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 numberWithThousandSeperator(total);\n};\n\nfunction numberWithThousandSeperator(number: string | number): string {\n const parts = number.toString().split('.');\n parts[0] = parts[0].replace(/\\B(?=(\\d{3})+(?!\\d))/g, ',');\n return parts.join('.');\n}\n\nexport const sortTokens = (tokens: TokenWithBalance[]): TokenWithBalance[] => {\n const walletConnected = !!tokens.some((token) => token.balance);\n if (!walletConnected) {\n return tokens\n .filter((token) => !token.address)\n .concat(\n tokens.filter((token) => token.address && !token.isSecondaryCoin),\n tokens.filter((token) => token.isSecondaryCoin)\n );\n }\n\n return tokens\n .filter((token) => !!token.balance)\n .sort(\n (tokenA, tokenB) =>\n parseFloat(tokenB.balance?.usdValue || '0') -\n parseFloat(tokenA.balance?.usdValue || '0')\n )\n .concat(\n tokens.filter((token) => !token.balance && !token.isSecondaryCoin),\n tokens.filter((token) => !token.balance && token.isSecondaryCoin)\n );\n};\n\nexport const getUsdPrice = (\n blockchain: string,\n symbol: string,\n address: string | null,\n allTokens: Token[]\n): number | null => {\n const token = allTokens?.find(\n (t) =>\n t.blockchain === blockchain &&\n t.symbol?.toUpperCase() === symbol?.toUpperCase() &&\n t.address === address\n );\n return token?.usdPrice || null;\n};\nexport const isExperimentalChain = (\n blockchains: BlockchainMeta[],\n wallet: string\n): boolean => {\n const cosmosExperimentalChainInfo = getCosmosExperimentalChainInfo(\n Object.entries(blockchains)\n .map(([, blockchainMeta]) => blockchainMeta)\n .filter(isCosmosBlockchain)\n );\n return cosmosExperimentalChainInfo && !!cosmosExperimentalChainInfo[wallet];\n};\n\nexport const getKeplrCompatibleConnectedWallets = (\n selectableWallets: SelectableWallet[]\n): WalletType[] => {\n const connectedWalletTypes = new Set(\n selectableWallets.map((wallet) => {\n return wallet.walletType;\n })\n );\n\n return KEPLR_COMPATIBLE_WALLETS.filter((compatibleWallet) =>\n connectedWalletTypes.has(compatibleWallet)\n );\n};\n\nexport function getTokensWithBalance(\n tokens: TokenWithBalance[],\n connectedWallets: ConnectedWallet[]\n): TokenWithBalance[] {\n return tokens.map(({ balance, ...otherProps }) => {\n const tokenAmount = numberToString(\n new BigNumber(\n getBalanceFromWallet(\n connectedWallets,\n otherProps.blockchain,\n otherProps.symbol,\n otherProps.address\n )?.amount || ZERO\n )\n );\n\n let tokenUsdValue = '';\n if (otherProps.usdPrice)\n tokenUsdValue = numberToString(\n new BigNumber(\n getBalanceFromWallet(\n connectedWallets,\n otherProps.blockchain,\n otherProps.symbol,\n otherProps.address\n )?.amount || ZERO\n ).multipliedBy(otherProps.usdPrice)\n );\n\n return {\n ...otherProps,\n ...(tokenAmount !== '0' && {\n balance: { amount: tokenAmount, usdValue: tokenUsdValue },\n }),\n };\n });\n}\n\nexport function getSortedTokens(\n chain: BlockchainMeta | null,\n tokens: Token[],\n connectedWallets: ConnectedWallet[],\n otherChainTokens: TokenWithBalance[]\n): TokenWithBalance[] {\n const fromChainEqueulsToToChain = chain?.name === otherChainTokens[0]?.name;\n if (fromChainEqueulsToToChain) return otherChainTokens;\n const filteredTokens = tokens.filter(\n (token) => token.blockchain === chain?.name\n );\n return sortTokens(getTokensWithBalance(filteredTokens, connectedWallets));\n}\n\nexport function tokensAreEqual(\n tokenA: Pick<Token, 'blockchain' | 'symbol' | 'address'> | null,\n tokenB: Pick<Token, 'blockchain' | 'symbol' | 'address'> | null\n) {\n return (\n tokenA?.blockchain === tokenB?.blockchain &&\n tokenA?.symbol === tokenB?.symbol &&\n tokenA?.address === tokenB?.address\n );\n}\n\nexport function getDefaultToken(\n sortedTokens: TokenWithBalance[],\n otherToken: TokenWithBalance | null\n): TokenWithBalance {\n let selectedToken: TokenWithBalance;\n const firstToken = sortedTokens[0];\n const secondToken = sortedTokens[1];\n if (sortedTokens.length === 1) selectedToken = firstToken;\n else if (tokensAreEqual(firstToken, otherToken)) selectedToken = secondToken;\n else selectedToken = firstToken;\n return selectedToken;\n}\n\nexport function sortWalletsBasedOnState(\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", "import { SelectableWallet } from '@rango-dev/ui';\nimport { WalletType } from '@rango-dev/wallets-shared';\nimport { create } from 'zustand';\nimport { subscribeWithSelector } from 'zustand/middleware';\nimport { shallow } from 'zustand/shallow';\nimport { httpService } from '../services/httpService';\nimport {\n getRequiredChains,\n getTokensWithBalance,\n isAccountAndWalletMatched,\n makeBalanceFor,\n resetConnectedWalletState,\n sortTokens,\n} from '../utils/wallets';\nimport { useBestRouteStore } from './bestRoute';\nimport { useMetaStore } from './meta';\nimport createSelectors from './selectors';\nimport { Wallet } from '../types';\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 loading: boolean;\n error: boolean;\n explorerUrl: string | null;\n}\n\ninterface WalletsStore {\n connectedWallets: ConnectedWallet[];\n selectedWallets: Wallet[];\n customDestination: string;\n connectWallet: (accounts: Wallet[]) => void;\n disconnectWallet: (walletType: WalletType) => void;\n initSelectedWallets: () => void;\n setSelectedWallet: (wallet: SelectableWallet) => void;\n clearConnectedWallet: () => void;\n getWalletsDetails: (accounts: Wallet[], shouldRetry?: boolean) => void;\n setCustomDestination: (customDestination: string) => void;\n}\n\nexport const useWalletsStore = createSelectors(\n create<WalletsStore>()(\n subscribeWithSelector((set, get) => ({\n connectedWallets: [],\n selectedWallets: [],\n customDestination: '',\n connectWallet: (accounts) => {\n const getWalletsDetails = get().getWalletsDetails;\n set((state) => ({\n connectedWallets: state.connectedWallets\n .filter((wallet) => wallet.walletType !== accounts[0].walletType)\n .concat(\n accounts.map((account) => ({\n balances: [],\n address: account.address,\n chain: account.chain,\n loading: true,\n walletType: account.walletType,\n error: false,\n explorerUrl: null,\n }))\n ),\n }));\n getWalletsDetails(accounts);\n },\n disconnectWallet: (walletType) => {\n set((state) => ({\n connectedWallets: state.connectedWallets.filter(\n (balance) => balance.walletType !== walletType\n ),\n selectedWallets: state.selectedWallets.filter(\n (wallet) => wallet.walletType != walletType\n ),\n }));\n },\n initSelectedWallets: () =>\n set((state) => {\n const requiredChains = getRequiredChains(\n useBestRouteStore.getState().bestRoute\n );\n const connectedWallets = state.connectedWallets;\n const selectedWallets: Wallet[] = [];\n requiredChains.forEach((chain) => {\n const anyWalletSelected = !!state.selectedWallets.find(\n (wallet) => wallet.chain === chain\n );\n\n if (!anyWalletSelected) {\n const firstWalletWithMatchedChain = connectedWallets.find(\n (wallet) => wallet.chain === chain\n );\n if (!!firstWalletWithMatchedChain)\n selectedWallets.push({\n address: firstWalletWithMatchedChain.address,\n chain: firstWalletWithMatchedChain.chain,\n walletType: firstWalletWithMatchedChain.walletType,\n });\n }\n });\n return {\n selectedWallets: state.selectedWallets.concat(selectedWallets),\n };\n }),\n setSelectedWallet: (wallet) =>\n set((state) => ({\n selectedWallets: state.selectedWallets\n .filter((selectedWallet) => selectedWallet.chain !== wallet.chain)\n .concat({\n chain: wallet.chain,\n address: wallet.address,\n walletType: wallet.walletType,\n }),\n })),\n setCustomDestination: (customDestination) =>\n set(() => ({\n customDestination,\n })),\n clearConnectedWallet: () =>\n set(() => ({\n connectedWallets: [],\n selectedWallets: [],\n })),\n getWalletsDetails: async (accounts, shouldRetry = true) => {\n const getWalletsDetails = get().getWalletsDetails;\n const { tokens } = useMetaStore.getState().meta;\n set((state) => ({\n 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 retrivedBalance = response.wallets;\n if (retrivedBalance) {\n set((state) => ({\n connectedWallets: state.connectedWallets.map(\n (connectedWallet) => {\n const matchedAccount = accounts.find((account) =>\n isAccountAndWalletMatched(account, connectedWallet)\n );\n const retrivedBalanceAccount = retrivedBalance.find(\n (balance) =>\n balance.address === connectedWallet.address &&\n balance.blockChain === connectedWallet.chain\n );\n if (\n retrivedBalanceAccount?.failed &&\n matchedAccount &&\n shouldRetry\n ) {\n getWalletsDetails([matchedAccount], false);\n }\n return matchedAccount && retrivedBalanceAccount\n ? makeBalanceFor(\n matchedAccount,\n retrivedBalanceAccount,\n tokens\n )\n : connectedWallet;\n }\n ),\n }));\n } else throw new Error('Wallet not found');\n } catch (error) {\n set((state) => ({\n connectedWallets: state.connectedWallets.map((balance) => {\n return accounts.find((account) =>\n isAccountAndWalletMatched(account, balance)\n )\n ? resetConnectedWalletState(balance)\n : balance;\n }),\n }));\n }\n },\n }))\n )\n);\n\nuseWalletsStore.subscribe(\n (state) => state.connectedWallets,\n (connectedWallets) => {\n useBestRouteStore.setState(({ sourceTokens, destinationTokens }) => {\n const sourceTokensWithBalance = getTokensWithBalance(\n sourceTokens,\n connectedWallets\n );\n const destinationTokensWithBalance = getTokensWithBalance(\n destinationTokens,\n connectedWallets\n );\n return {\n sourceTokens: sortTokens(sourceTokensWithBalance),\n destinationTokens: sortTokens(destinationTokensWithBalance),\n };\n });\n },\n {\n equalityFn: shallow,\n }\n);\n\nexport const fetchingBalanceSelector = (state: WalletsStore) =>\n !!state.connectedWallets.find((wallet) => wallet.loading);\n", "export const navigationRoutes = {\n home: '/',\n fromChain: 'from-chain',\n fromToken: 'from-token',\n toChain: 'to-chain',\n toToken: 'to-token',\n settings: 'settings',\n liquiditySources: '/settings/liquidity-sources',\n swaps: 'swaps',\n wallets: 'wallets',\n confirmSwap: 'confirm-swap',\n swapDetails: 'swaps/:requestId',\n};\n", "import { create } from 'zustand';\nimport createSelectors from './selectors';\n\ninterface UiState {\n connectWalletsButtonDisabled: boolean;\n selectedSwapRequestId: string | null;\n currentPage: string;\n toggleConnectWalletsButton: () => void;\n setSelectedSwap: (requestId: string | null) => void;\n setCurrentPage: (path: string) => void;\n}\n\nexport const useUiStore = createSelectors(\n create<UiState>()((set) => ({\n connectWalletsButtonDisabled: false,\n selectedSwapRequestId: null,\n currentPage: '',\n toggleConnectWalletsButton: () =>\n set((state) => ({\n connectWalletsButtonDisabled: !state.connectWalletsButtonDisabled,\n })),\n setSelectedSwap: (requestId) => set({ selectedSwapRequestId: requestId }),\n setCurrentPage: (path) => set({ currentPage: path }),\n }))\n);\n", "import React, { useEffect } from 'react';\nimport { useNavigate } from 'react-router-dom';\nimport { HeaderLayout } from '@rango-dev/ui';\nimport { useWallets } from '@rango-dev/wallets-react';\nimport { navigationRoutes } from '../constants/navigationRoutes';\nimport { useUiStore } from '../store/ui';\nimport { AppRoutes } from './AppRoutes';\nimport { fetchingBalanceSelector, useWalletsStore } from '../store/wallets';\nimport {\n calculateWalletUsdValue,\n getSelectableWallets,\n tokensAreEqual,\n} from '../utils/wallets';\nimport { removeDuplicateFrom } from '../utils/common';\nimport { WidgetConfig } from '../types';\nimport { useBestRouteStore } from '../store/bestRoute';\nimport { useMetaStore } from '../store/meta';\nimport { useSettingsStore } from '../store/settings';\n\nexport type LayoutProps = {\n config?: WidgetConfig;\n};\n\nexport function Layout({ config }: LayoutProps) {\n const navigate = useNavigate();\n const { connectedWallets, selectedWallets } = useWalletsStore();\n const { getWalletInfo } = useWallets();\n const connectedWalletsImages = removeDuplicateFrom(\n getSelectableWallets(connectedWallets, selectedWallets, getWalletInfo).map(\n (w) => w.image\n )\n );\n const { blockchains, tokens } = useMetaStore.use.meta();\n const setFromChain = useBestRouteStore.use.setFromChain();\n const setFromToken = useBestRouteStore.use.setFromToken();\n const setToChain = useBestRouteStore.use.setToChain();\n const setToToken = useBestRouteStore.use.setToToken();\n const setInputAmount = useBestRouteStore.use.setInputAmount();\n const setAffiliateRef = useSettingsStore.use.setAffiliateRef();\n const setAffiliatePercent = useSettingsStore.use.setAffiliatePercent();\n const setAffiliateWallets = useSettingsStore.use.setAffiliateWallets();\n\n const totalBalance = calculateWalletUsdValue(connectedWallets);\n const connectWalletsButtonDisabled =\n useUiStore.use.connectWalletsButtonDisabled();\n const loadingMetaStatus = useMetaStore.use.loadingStatus();\n const fetchingBalance = useWalletsStore(fetchingBalanceSelector);\n\n useEffect(() => {\n if (loadingMetaStatus === 'success') {\n const chain = blockchains.find(\n (chain) => chain.name === config?.to?.blockchain\n );\n const token = tokens.find((t) =>\n tokensAreEqual(t, config?.to?.token || null)\n );\n setToChain(chain || null);\n setToToken(token || null);\n }\n }, [config?.to?.token, config?.to?.blockchain, loadingMetaStatus]);\n\n useEffect(() => {\n setInputAmount(config?.amount?.toString() || '');\n }, [config?.amount]);\n\n useEffect(() => {\n if (loadingMetaStatus === 'success') {\n const chain = blockchains.find(\n (chain) => chain.name === config?.from?.blockchain\n );\n const token = tokens.find((t) =>\n tokensAreEqual(t, config?.from?.token || null)\n );\n\n setFromChain(chain || null);\n setFromToken(token || null);\n }\n }, [config?.from?.token, config?.from?.blockchain, loadingMetaStatus]);\n\n useEffect(() => {\n setAffiliateRef(config?.affiliate?.ref ?? null);\n setAffiliatePercent(config?.affiliate?.percent ?? null);\n setAffiliateWallets(config?.affiliate?.wallets ?? null);\n }, [\n config?.affiliate?.ref,\n config?.affiliate?.percent,\n config?.affiliate?.wallets,\n ]);\n\n return (\n <>\n <HeaderLayout\n loadingStatus={loadingMetaStatus}\n connectedWalletsImages={connectedWalletsImages}\n connectedWallets={connectedWallets}\n totalBalance={totalBalance}\n fetchingBalance={fetchingBalance}\n onClick={() => {\n if (!connectWalletsButtonDisabled) navigate(navigationRoutes.wallets);\n }}>\n <AppRoutes config={config} />\n </HeaderLayout>\n </>\n );\n}\n", "import React from 'react';\nimport { useRoutes } from 'react-router-dom';\nimport { navigationRoutes } from '../constants/navigationRoutes';\nimport { ConfirmSwapPage } from '../pages/ConfirmSwapPage';\nimport { HistoryPage } from '../pages/HistoryPage';\nimport { Home } from '../pages/Home';\nimport { LiquiditySourcePage } from '../pages/LiquiditySourcesPage';\nimport { SelectChainPage } from '../pages/SelectChainPage';\nimport { SelectTokenPage } from '../pages/SelectTokenPage';\nimport { SettingsPage } from '../pages/SettingsPage';\nimport { WalletsPage } from '../pages/WalletsPage';\nimport { SwapDetailsPage } from '../pages/SwapDetailsPage';\nimport { WidgetConfig } from '../types';\n\nconst getAbsolutePath = (path: string) => path.replace('/', '');\n\ninterface PropTypes {\n config?: WidgetConfig;\n}\n\nexport function AppRoutes(props: PropTypes) {\n const { config } = props;\n\n return useRoutes([\n {\n path: navigationRoutes.home,\n element: <Home />,\n },\n {\n path: navigationRoutes.fromChain,\n element: (\n <SelectChainPage\n type=\"from\"\n supportedChains={config?.from?.blockchains}\n />\n ),\n },\n {\n path: navigationRoutes.toChain,\n element: (\n <SelectChainPage type=\"to\" supportedChains={config?.to?.blockchains} />\n ),\n },\n {\n path: navigationRoutes.fromToken,\n element: (\n <SelectTokenPage type=\"from\" supportedTokens={config?.from?.tokens} />\n ),\n },\n {\n path: navigationRoutes.toToken,\n element: (\n <SelectTokenPage type=\"to\" supportedTokens={config?.to?.tokens} />\n ),\n },\n {\n path: navigationRoutes.settings,\n element: (\n <SettingsPage\n singleTheme={config?.theme?.singleTheme}\n supportedSwappers={config?.liquiditySources}\n />\n ),\n },\n {\n path: navigationRoutes.liquiditySources,\n element: (\n <LiquiditySourcePage supportedSwappers={config?.liquiditySources} />\n ),\n },\n { path: navigationRoutes.swaps, element: <HistoryPage /> },\n {\n path: navigationRoutes.swapDetails,\n element: <SwapDetailsPage />,\n },\n {\n path: navigationRoutes.wallets,\n element: (\n <WalletsPage\n supportedWallets={config?.wallets}\n multiWallets={\n typeof config?.multiWallets === 'undefined'\n ? true\n : config.multiWallets\n }\n config={config}\n />\n ),\n },\n {\n path: getAbsolutePath(navigationRoutes.confirmSwap),\n element: (\n <ConfirmSwapPage customDestinationEnabled={config?.customDestination} />\n ),\n },\n ]);\n}\n", "import React, { useEffect, useState } from 'react';\nimport { useNavigate } from 'react-router-dom';\nimport { useBestRouteStore } from '../store/bestRoute';\nimport { useWalletsStore } from '../store/wallets';\nimport { useWallets } from '@rango-dev/wallets-react';\nimport { i18n } from '@lingui/core';\nimport { navigationRoutes } from '../constants/navigationRoutes';\nimport {\n getKeplrCompatibleConnectedWallets,\n getRequiredChains,\n getSelectableWallets,\n isExperimentalChain,\n} from '../utils/wallets';\nimport {\n confirmSwapDisabled,\n getPercentageChange,\n getTotalFeeInUsd,\n isValidCustomDestination,\n} from '../utils/swap';\nimport { numberToString } from '../utils/numbers';\nimport { useMetaStore } from '../store/meta';\nimport { WalletType } from '@rango-dev/wallets-shared';\nimport { useNavigateBack } from '../hooks/useNavigateBack';\nimport {\n Divider,\n ConfirmSwap,\n LoadingFailedAlert,\n HighSlippageWarning,\n PercentageChange,\n RoutesOverview,\n TokenPreview,\n} from '@rango-dev/ui';\nimport { useManager } from '@rango-dev/queue-manager-react';\nimport { useConfirmSwap } from '../hooks/useConfirmSwap';\nimport { useSettingsStore } from '../store/settings';\nimport { useUiStore } from '../store/ui';\nimport { ConfirmSwapErrorTypes } from '../types';\nimport { ConfirmSwapErrors } from '../components/ConfirmSwapErrors';\nimport { ConfirmSwapWarnings } from '../components/ConfirmSwapWarnings';\nimport { HIGH_SLIPPAGE } from '../constants/swapSettings';\nimport { getBestRouteStatus } from '../utils/routing';\n\nexport function ConfirmSwapPage({\n customDestinationEnabled,\n}: {\n customDestinationEnabled?: boolean;\n}) {\n const navigate = useNavigate();\n const { navigateBackFrom } = useNavigateBack();\n const bestRoute = useBestRouteStore.use.bestRoute();\n const fetchingBestRoute = useBestRouteStore.use.loading();\n const fetchingBestRouteError = useBestRouteStore.use.error();\n const setSelectedSwap = useUiStore.use.setSelectedSwap();\n const { blockchains, tokens } = useMetaStore.use.meta();\n const loadingMetaStatus = useMetaStore.use.loadingStatus();\n const connectedWallets = useWalletsStore.use.connectedWallets();\n const selectedWallets = useWalletsStore.use.selectedWallets();\n const customDestination = useWalletsStore.use.customDestination();\n const setCustomDestination = useWalletsStore.use.setCustomDestination();\n const initSelectedWallets = useWalletsStore.use.initSelectedWallets();\n const setSelectedWallet = useWalletsStore.use.setSelectedWallet();\n const slippage = useSettingsStore.use.slippage();\n const customSlippage = useSettingsStore.use.customSlippage();\n const inputUsdValue = useBestRouteStore.use.inputUsdValue();\n const outputUsdValue = useBestRouteStore.use.outputUsdValue();\n const setInputAmount = useBestRouteStore.use.setInputAmount();\n const [dbErrorMessage, setDbErrorMessage] = useState<string>('');\n const bestRouteloadingStatus = getBestRouteStatus(\n fetchingBestRoute,\n !!fetchingBestRouteError\n );\n const [destinationChain, setDestinationChain] = useState<string>('');\n\n const { manager } = useManager();\n const {\n loading: fetchingConfirmedRoute,\n errors,\n warnings,\n confirmSwap,\n } = useConfirmSwap();\n\n const selectedSlippage = customSlippage || slippage;\n\n const showHighSlippageWarning = !errors.find(\n (error) => error.type === ConfirmSwapErrorTypes.INSUFFICIENT_SLIPPAGE\n );\n\n const { getWalletInfo, connect } = useWallets();\n\n const firstStep = bestRoute?.result?.swaps[0];\n const lastStep =\n bestRoute?.result?.swaps[bestRoute?.result?.swaps.length - 1];\n\n const fromAmount = numberToString(firstStep?.fromAmount, 4, 6);\n const toAmount = numberToString(lastStep?.toAmount, 4, 6);\n useEffect(() => {\n initSelectedWallets();\n if (customDestination) {\n setCustomDestination('');\n }\n }, []);\n const lastStepToBlockchain =\n bestRoute?.result?.swaps[bestRoute?.result?.swaps.length - 1].to.blockchain;\n const isWalletRequired = !!bestRoute?.result?.swaps.find(\n (swap) => swap.from.blockchain === lastStepToBlockchain\n );\n\n const selectableWallets = getSelectableWallets(\n connectedWallets,\n selectedWallets,\n getWalletInfo,\n isWalletRequired ? '' : destinationChain\n );\n\n const handleConnectChain = (wallet: string) => {\n const network = wallet;\n getKeplrCompatibleConnectedWallets(selectableWallets).forEach(\n (compatibleWallet: WalletType) => connect?.(compatibleWallet, network)\n );\n };\n\n const totalFeeInUsd = getTotalFeeInUsd(bestRoute, tokens);\n\n const percentageChange =\n !inputUsdValue || !outputUsdValue || !outputUsdValue.gt(0)\n ? null\n : getPercentageChange(\n inputUsdValue.toNumber(),\n outputUsdValue.toNumber()\n );\n\n return (\n <ConfirmSwap\n requiredWallets={getRequiredChains(bestRoute)}\n selectableWallets={selectableWallets}\n setCustomDestination={setCustomDestination}\n customDestination={customDestination}\n customDestinationEnabled={customDestinationEnabled}\n isValidCustomDestination={isValidCustomDestination}\n checkedDestination={!!destinationChain}\n setDestinationChain={setDestinationChain}\n onBack={navigateBackFrom.bind(null, navigationRoutes.confirmSwap)}\n onConfirm={async () => {\n confirmSwap?.().then(async (swap) => {\n if (swap) {\n try {\n await manager?.create(\n 'swap',\n { swapDetails: swap },\n { id: swap.requestId }\n );\n setSelectedSwap(swap.requestId);\n navigate('/' + navigationRoutes.swaps + `/${swap.requestId}`, {\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 isWalletRequired={isWalletRequired}\n onChange={(wallet) => setSelectedWallet(wallet)}\n confirmDisabled={\n loadingMetaStatus !== 'success' ||\n confirmSwapDisabled(\n fetchingBestRoute,\n destinationChain,\n customDestination,\n bestRoute,\n selectableWallets\n )\n }\n handleConnectChain={(wallet) => handleConnectChain(wallet)}\n isExperimentalChain={(wallet) =>\n getKeplrCompatibleConnectedWallets(selectableWallets).length > 0\n ? isExperimentalChain(blockchains, wallet)\n : false\n }\n previewInputs={\n <>\n <TokenPreview\n chain={{\n displayName: firstStep?.from.blockchain || '',\n logo: firstStep?.from.blockchainLogo || '',\n }}\n token={{\n symbol: firstStep?.from.symbol || '',\n image: firstStep?.from.logo || '',\n }}\n usdValue={inputUsdValue ? numberToString(inputUsdValue) : null}\n amount={fromAmount}\n label={i18n.t('From')}\n loadingStatus={\n loadingMetaStatus !== 'success'\n ? loadingMetaStatus\n : bestRouteloadingStatus\n }\n />\n <Divider size={12} />\n <TokenPreview\n chain={{\n displayName: lastStep?.to.blockchain || '',\n logo: lastStep?.to.blockchainLogo || '',\n }}\n token={{\n symbol: lastStep?.to.symbol || '',\n image: lastStep?.to.logo || '',\n }}\n usdValue={outputUsdValue ? numberToString(outputUsdValue) : null}\n amount={toAmount}\n label={i18n.t('To')}\n loadingStatus={\n loadingMetaStatus !== 'success'\n ? loadingMetaStatus\n : bestRouteloadingStatus\n }\n percentageChange={\n !percentageChange ? null : (\n <PercentageChange\n percentageChange={numberToString(percentageChange, 0, 2)}\n showPercentageChange={!!percentageChange?.lt(0)}\n />\n )\n }\n />\n </>\n }\n previewRoutes={\n <RoutesOverview\n routes={bestRoute}\n totalFee={numberToString(totalFeeInUsd, 0, 2)}\n />\n }\n loading={fetchingConfirmedRoute}\n errors={\n dbErrorMessage\n ? [dbErrorMessage, ...ConfirmSwapErrors(errors)]\n : ConfirmSwapErrors(errors)\n }\n warnings={ConfirmSwapWarnings(warnings)}\n extraMessages={\n <>\n {loadingMetaStatus === 'failed' && <LoadingFailedAlert />}\n {loadingMetaStatus === 'failed' && showHighSlippageWarning && (\n <Divider />\n )}\n <HighSlippageWarning\n selectedSlippage={selectedSlippage}\n highSlippage={selectedSlippage >= HIGH_SLIPPAGE}\n changeSlippage={() => navigate('/' + navigationRoutes.settings)}\n />\n </>\n }\n confirmButtonTitle={\n warnings.length > 0 || errors.length > 0\n ? `${i18n.t('Proceed anyway!')}`\n : `${i18n.t('Confirm swap!')}`\n }\n />\n );\n}\n", "import { useInRouterContext, useNavigate } from 'react-router-dom';\nimport { navigationRoutes } from '../constants/navigationRoutes';\n\nexport function useNavigateBack() {\n const isRouterInContext = useInRouterContext();\n const navigate = useNavigate();\n\n navigationRoutes;\n\n const navigateBackFrom = (currentRoute: string) => {\n if (currentRoute === navigationRoutes.swapDetails)\n return navigate('/' + navigationRoutes.swaps, { replace: true });\n\n if (\n !isRouterInContext ||\n (window.history.state && window.history.state.idx > 0)\n )\n navigate(-1);\n else {\n if (\n [\n navigationRoutes.fromChain,\n navigationRoutes.fromToken,\n navigationRoutes.toChain,\n navigationRoutes.toToken,\n navigationRoutes.settings,\n navigationRoutes.wallets,\n navigationRoutes.swaps,\n navigationRoutes.confirmSwap,\n ].includes(currentRoute)\n )\n navigate(navigationRoutes.home, { replace: true });\n else if (currentRoute === navigationRoutes.liquiditySources)\n navigate('/' + navigationRoutes.settings, { replace: true });\n }\n };\n\n return { navigateBackFrom };\n}\n", "import { useEffect, useRef, useState } from 'react';\nimport { useBestRouteStore } from '../store/bestRoute';\nimport { useMetaStore } from '../store/meta';\nimport { useSettingsStore } from '../store/settings';\nimport { useWalletsStore } from '../store/wallets';\nimport {\n ConfirmSwapError,\n ConfirmSwapErrorTypes,\n ConfirmSwapWarningTypes,\n ConfirmSwapWarnings,\n PendingSwapSettings,\n} from '../types';\n\nimport {\n createBestRouteRequestBody,\n getBalanceWarnings,\n getMinRequiredSlippage,\n getOutputRatio,\n getPercentageChange,\n getRouteOutputAmount,\n getWalletsForNewSwap,\n hasProperSlippage,\n isOutputAmountChangedALot,\n outputRatioHasWarning,\n} from '../utils/swap';\nimport { httpService } from '../services/httpService';\nimport BigNumber from 'bignumber.js';\nimport {\n isNumberOfSwapsChanged,\n isRouteChanged,\n isRouteInternalCoinsUpdated,\n isRouteSwappersUpdated,\n} from '../utils/routing';\nimport { numberToString } from '../utils/numbers';\nimport { BestRouteResponse } from 'rango-sdk';\nimport {\n calculatePendingSwap,\n PendingSwap,\n} from '@rango-dev/queue-manager-rango-preset';\n\ntype ConfirmSwap = {\n loading: boolean;\n errors: ConfirmSwapError[];\n warnings: ConfirmSwapWarnings[];\n confirmSwap: (() => Promise<PendingSwap | undefined>) | null;\n};\n\nexport function useConfirmSwap(): ConfirmSwap {\n const fromToken = useBestRouteStore.use.fromToken();\n const toToken = useBestRouteStore.use.toToken();\n const inputAmount = useBestRouteStore.use.inputAmount();\n const initialRoute = useBestRouteStore.use.bestRoute();\n const setBestRoute = useBestRouteStore.use.setBestRoute();\n const inputUsdValue = useBestRouteStore.use.inputUsdValue();\n const affiliateRef = useSettingsStore.use.affiliateRef();\n const affiliatePercent = useSettingsStore.use.affiliatePercent();\n const affiliateWallets = useSettingsStore.use.affiliateWallets();\n\n const connectedWallets = useWalletsStore.use.connectedWallets();\n const destination = useWalletsStore.use.customDestination();\n\n const selectedWallets = useWalletsStore.use.selectedWallets();\n const meta = useMetaStore.use.meta();\n const customSlippage = useSettingsStore.use.customSlippage();\n const slippage = useSettingsStore.use.slippage();\n const disabledLiquiditySources =\n useSettingsStore.use.disabledLiquiditySources();\n const userSlippage = customSlippage || slippage;\n const proceedAnywayRef = useRef(false);\n const confiremedRouteRef = useRef<BestRouteResponse | null>(null);\n const abortControllerRef = useRef<AbortController | null>(null);\n\n const [loading, setLoading] = useState(false);\n const [errors, setErrors] = useState<ConfirmSwapError[]>([]);\n const [warnings, setWarnings] = useState<ConfirmSwapWarnings[]>([]);\n\n useEffect(() => {\n return () => abortControllerRef.current?.abort();\n }, []);\n\n if (!fromToken || !toToken || !inputAmount || !initialRoute)\n return { loading: false, warnings: [], errors: [], confirmSwap: null };\n\n const confirmSwap = async (): Promise<PendingSwap | undefined> => {\n if (proceedAnywayRef.current) {\n const swapSettings: PendingSwapSettings = {\n slippage: userSlippage.toString(),\n disabledSwappersGroups: disabledLiquiditySources,\n };\n\n if (errors.length > 0) setErrors([]);\n if (warnings.length > 0) setWarnings([]);\n proceedAnywayRef.current = false;\n\n if (confiremedRouteRef.current) {\n const newSwap = calculatePendingSwap(\n inputAmount.toString(),\n confiremedRouteRef.current,\n getWalletsForNewSwap(selectedWallets),\n swapSettings,\n false,\n meta\n );\n\n return newSwap;\n }\n return;\n }\n\n abortControllerRef.current = new AbortController();\n\n setLoading(true);\n\n const requestBody = createBestRouteRequestBody(\n fromToken,\n toToken,\n inputAmount,\n connectedWallets,\n selectedWallets,\n disabledLiquiditySources,\n userSlippage,\n affiliateRef,\n affiliatePercent,\n affiliateWallets,\n initialRoute,\n destination\n );\n\n try {\n const confiremedRoute = await httpService().getBestRoute(requestBody, {\n signal: abortControllerRef.current?.signal,\n });\n\n abortControllerRef.current = null;\n\n setLoading(false);\n\n if (\n !confiremedRoute.result ||\n !new BigNumber(confiremedRoute.requestAmount).isEqualTo(\n new BigNumber(inputAmount || '-1')\n )\n ) {\n setErrors((prevState) =>\n prevState.concat({\n type: ConfirmSwapErrorTypes.NO_ROUTE,\n })\n );\n return;\n }\n\n const confirmSwapState: Omit<ConfirmSwap, 'confirmSwap' | 'loading'> = {\n errors: [],\n warnings: [],\n };\n\n const routeChanged = isRouteChanged(initialRoute, confiremedRoute!);\n\n if (routeChanged) {\n setBestRoute(confiremedRoute);\n const newRouteOutputUsdValue = new BigNumber(\n confiremedRoute.result?.outputAmount || '0'\n ).multipliedBy(toToken.usdPrice || 0);\n\n const outputRatio = getOutputRatio(\n inputUsdValue,\n newRouteOutputUsdValue\n );\n const highValueLoss = outputRatioHasWarning(inputUsdValue, outputRatio);\n\n if (highValueLoss)\n confirmSwapState.errors.push({\n type: ConfirmSwapErrorTypes.ROUTE_UPDATED_WITH_HIGH_VALUE_LOSS,\n });\n else if (isOutputAmountChangedALot(initialRoute, confiremedRoute))\n confirmSwapState.warnings.push({\n type: ConfirmSwapWarningTypes.ROUTE_AND_OUTPUT_AMOUNT_UPDATED,\n newOutputAmount: numberToString(\n getRouteOutputAmount(confiremedRoute)\n ),\n percentageChange: numberToString(\n getPercentageChange(\n getRouteOutputAmount(initialRoute),\n getRouteOutputAmount(confiremedRoute)\n ),\n null,\n 2\n ),\n });\n else if (isRouteInternalCoinsUpdated(initialRoute, confiremedRoute))\n confirmSwapState.warnings.push({\n type: ConfirmSwapWarningTypes.ROUTE_COINS_UPDATED,\n });\n else if (isNumberOfSwapsChanged(initialRoute, confiremedRoute))\n confirmSwapState.warnings.push({\n type: ConfirmSwapWarningTypes.ROUTE_UPDATED,\n });\n else if (isRouteSwappersUpdated(initialRoute, confiremedRoute))\n confirmSwapState.warnings.push({\n type: ConfirmSwapWarningTypes.ROUTE_SWAPPERS_UPDATED,\n });\n }\n\n const balanceWarnings = getBalanceWarnings(\n confiremedRoute,\n selectedWallets\n );\n const enoughBalance = balanceWarnings.length === 0;\n\n if (!enoughBalance)\n confirmSwapState.errors.push({\n type: ConfirmSwapErrorTypes.INSUFFICIENT_BALANCE,\n messages: balanceWarnings,\n });\n\n const minRequiredSlippage = getMinRequiredSlippage(initialRoute);\n\n if (!hasProperSlippage(userSlippage.toString(), minRequiredSlippage))\n confirmSwapState.errors.push({\n type: ConfirmSwapErrorTypes.INSUFFICIENT_SLIPPAGE,\n minRequiredSlippage,\n });\n\n const noErrors = confirmSwapState.errors.length === 0;\n const noWarnings = confirmSwapState.warnings.length === 0;\n\n if (\n (noErrors || (!noErrors && proceedAnywayRef.current)) &&\n (noWarnings || (!noWarnings && proceedAnywayRef.current))\n ) {\n const swapSettings: PendingSwapSettings = {\n slippage: userSlippage.toString(),\n disabledSwappersGroups: disabledLiquiditySources,\n };\n\n const newSwap = calculatePendingSwap(\n inputAmount.toString(),\n confiremedRoute,\n getWalletsForNewSwap(selectedWallets),\n swapSettings,\n false,\n meta\n );\n return newSwap;\n } else if (!proceedAnywayRef.current) {\n proceedAnywayRef.current = true;\n setErrors(confirmSwapState.errors);\n setWarnings(confirmSwapState.warnings);\n confiremedRouteRef.current = confiremedRoute;\n }\n return;\n } catch (error) {\n if ((error as any)?.code === 'ERR_CANCELED') {\n return;\n }\n\n const status = (error as any)?.response?.status;\n\n setLoading(false);\n setErrors([\n {\n type: ConfirmSwapErrorTypes.REQUEST_FAILED,\n status,\n },\n ]);\n\n return;\n }\n };\n\n return { loading, warnings, errors, confirmSwap };\n}\n", "import React from 'react';\nimport { BalanceErrors, MinRequiredSlippage } from '@rango-dev/ui';\nimport { ConfirmSwapError, ConfirmSwapErrorTypes } from '../types';\nimport { useNavigate } from 'react-router-dom';\nimport { navigationRoutes } from '../constants/navigationRoutes';\n\nexport function ConfirmSwapErrors(errors: ConfirmSwapError[]) {\n const navigate = useNavigate();\n\n return errors.flatMap((error) => {\n switch (error.type) {\n case ConfirmSwapErrorTypes.NO_ROUTE:\n return 'No routes found. Please try again later.';\n case ConfirmSwapErrorTypes.REQUEST_FAILED:\n return `Failed to confirm swap ${\n error.status ? `'status': ${error.status})` : ''\n }, please try again.`;\n\n case ConfirmSwapErrorTypes.ROUTE_UPDATED_WITH_HIGH_VALUE_LOSS:\n return 'Route updated and price impact is too high, try again later!';\n case ConfirmSwapErrorTypes.INSUFFICIENT_SLIPPAGE:\n return (\n <MinRequiredSlippage\n minRequiredSlippage={error.minRequiredSlippage}\n changeSlippage={() => navigate('/' + navigationRoutes.settings)}\n />\n );\n case ConfirmSwapErrorTypes.INSUFFICIENT_BALANCE:\n return <BalanceErrors messages={error.messages} />;\n default:\n return [];\n }\n });\n}\n", "import {\n ConfirmSwapWarningTypes,\n ConfirmSwapWarnings as ConfirmSwapWarningsType,\n} from '../types';\n\nexport function ConfirmSwapWarnings(warnings: ConfirmSwapWarningsType[]) {\n return warnings.flatMap((warning) => {\n switch (warning.type) {\n case ConfirmSwapWarningTypes.ROUTE_UPDATED:\n return 'Route has been updated.';\n case ConfirmSwapWarningTypes.ROUTE_AND_OUTPUT_AMOUNT_UPDATED:\n return `Output amount changed to ${warning.newOutputAmount} (${warning.percentageChange}% change).`;\n\n case ConfirmSwapWarningTypes.ROUTE_SWAPPERS_UPDATED:\n return 'Route swappers has been updated.';\n case ConfirmSwapWarningTypes.ROUTE_COINS_UPDATED:\n return 'Route internal coins has been updated.';\n default:\n return [];\n }\n });\n}\n", "import { History } from '@rango-dev/ui';\nimport { useManager } from '@rango-dev/queue-manager-react';\nimport React from 'react';\nimport { useNavigate } from 'react-router-dom';\nimport { navigationRoutes } from '../constants/navigationRoutes';\nimport { useNavigateBack } from '../hooks/useNavigateBack';\nimport { getPendingSwaps } from '../utils/queue';\nimport { useUiStore } from '../store/ui';\nimport { groupSwapsByDate } from '../utils/date';\n\nexport function HistoryPage() {\n const setSelectedSwap = useUiStore.use.setSelectedSwap();\n const navigate = useNavigate();\n const { navigateBackFrom } = useNavigateBack();\n const { manager, state } = useManager();\n const pendingSwaps = getPendingSwaps(manager).map(({ swap }) => swap);\n\n const loading = !state.loadedFromPersistor;\n\n return (\n <History\n list={pendingSwaps}\n groupBy={groupSwapsByDate}\n loading={loading}\n onSwapClick={(requestId) => {\n setSelectedSwap(requestId);\n navigate(`${requestId}`, { replace: true });\n }}\n onBack={navigateBackFrom.bind(null, navigationRoutes.swaps)}\n />\n );\n}\n", "import { Manager } from '@rango-dev/queue-manager-core';\nimport {\n PendingSwapWithQueueID,\n SwapStorage,\n} from '@rango-dev/queue-manager-rango-preset';\n\nexport const getPendingSwaps = (manager: Manager | undefined) => {\n const result: PendingSwapWithQueueID[] = [];\n\n manager?.getAll().forEach((q, id) => {\n const storage = q.list.getStorage() as SwapStorage;\n\n if (storage?.swapDetails) {\n result.push({\n id,\n swap: storage?.swapDetails,\n });\n }\n });\n\n return result.sort(\n (a, b) => Number(b.swap.creationTime) - Number(a.swap.creationTime)\n );\n};\n", "import { PendingSwap } from '@rango-dev/queue-manager-rango-preset';\nimport dayjs from 'dayjs';\nimport { GroupBy } from '@rango-dev/ui';\n\nexport const groupSwapsByDate: GroupBy = swaps => {\n const output: Map<\n string,\n {\n title: string;\n swaps: PendingSwap[];\n }\n > = new Map([\n [\n 'today',\n {\n title: 'Today',\n swaps: [],\n },\n ],\n [\n 'week',\n {\n title: 'This week',\n swaps: [],\n },\n ],\n [\n 'month',\n {\n title: 'This month',\n swaps: [],\n },\n ],\n [\n 'year',\n {\n title: 'This year',\n swaps: [],\n },\n ],\n [\n 'history',\n {\n title: 'History',\n swaps: [],\n },\n ],\n ]);\n\n const now = dayjs();\n swaps.forEach(swap => {\n const swapDate = dayjs(Number(swap.creationTime));\n if (now.isSame(swapDate, 'day')) output.get('today')?.swaps.push(swap);\n else if (now.isSame(swapDate, 'week')) 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')) output.get('year')?.swaps.push(swap);\n else output.get('history')?.swaps.push(swap);\n });\n\n return Array.from(output.values());\n};\n", "import React, { useEffect } from 'react';\nimport { useNavigate } from 'react-router-dom';\nimport { HomePanel } from '@rango-dev/ui';\nimport { fetchBestRoute, useBestRouteStore } from '../store/bestRoute';\nimport { SwithFromAndToButton } from '../components/SwitchFromAndTo';\nimport { navigationRoutes } from '../constants/navigationRoutes';\nimport { useMetaStore } from '../store/meta';\nimport { useWalletsStore } from '../store/wallets';\nimport { errorMessages } from '../constants/errors';\nimport {\n getSwapButtonState,\n getOutputRatio,\n hasLimitError,\n outputRatioHasWarning,\n canComputePriceImpact,\n LimitErrorMessage,\n getTotalFeeInUsd,\n hasHighFee,\n getPercentageChange,\n} from '../utils/swap';\nimport { useUiStore } from '../store/ui';\nimport {\n numberToString,\n secondsToString,\n totalArrivalTime,\n} from '../utils/numbers';\nimport { getBalanceFromWallet } from '../utils/wallets';\nimport { getFormatedBestRoute } from '../utils/routing';\nimport BigNumber from 'bignumber.js';\n\nexport function Home() {\n const navigate = useNavigate();\n const fromChain = useBestRouteStore.use.fromChain();\n const fromToken = useBestRouteStore.use.fromToken();\n const toChain = useBestRouteStore.use.toChain();\n const toToken = useBestRouteStore.use.toToken();\n const setInputAmount = useBestRouteStore.use.setInputAmount();\n const inputUsdValue = useBestRouteStore.use.inputUsdValue();\n const inputAmount = useBestRouteStore.use.inputAmount();\n const outputAmount = useBestRouteStore.use.outputAmount();\n const outputUsdValue = useBestRouteStore.use.outputUsdValue();\n const bestRoute = useBestRouteStore.use.bestRoute();\n const tokens = useMetaStore.use.meta().tokens;\n const fetchingBestRoute = useBestRouteStore.use.loading();\n const bestRouteError = useBestRouteStore.use.error();\n const loadingMetaStatus = useMetaStore.use.loadingStatus();\n const connectedWallets = useWalletsStore.use.connectedWallets();\n const setCurrentPage = useUiStore.use.setCurrentPage();\n\n const errorMessage =\n loadingMetaStatus === 'failed'\n ? errorMessages.genericServerError\n : bestRouteError;\n\n const needsToWarnEthOnPath = false;\n\n const showBestRoute =\n !!inputAmount && (!!bestRoute || fetchingBestRoute || !!bestRouteError);\n\n const outToInRatio = getOutputRatio(inputUsdValue, outputUsdValue);\n\n const highValueLoss = outputRatioHasWarning(inputUsdValue, outToInRatio);\n\n const { fromAmountRangeError, recommendation, swap } =\n LimitErrorMessage(bestRoute);\n\n const priceImpactCanNotBeComputed = !canComputePriceImpact(\n bestRoute,\n inputAmount,\n inputUsdValue,\n outputUsdValue\n );\n\n const swapButtonState = getSwapButtonState(\n loadingMetaStatus,\n connectedWallets,\n fetchingBestRoute,\n bestRoute,\n hasLimitError(bestRoute),\n highValueLoss,\n priceImpactCanNotBeComputed,\n needsToWarnEthOnPath,\n inputAmount\n );\n\n const totalFeeInUsd = getTotalFeeInUsd(bestRoute, tokens);\n\n const highFee = hasHighFee(totalFeeInUsd);\n\n const tokenBalance =\n !!fromChain && !!fromToken\n ? numberToString(\n getBalanceFromWallet(\n connectedWallets,\n fromChain?.name,\n fromToken?.symbol,\n fromToken?.address\n )?.amount || '0',\n 8\n )\n : '0';\n\n const tokenBalanceReal =\n !!fromChain && !!fromToken\n ? numberToString(\n getBalanceFromWallet(\n connectedWallets,\n fromChain?.name,\n fromToken?.symbol,\n fromToken?.address\n )?.amount || '0',\n getBalanceFromWallet(\n connectedWallets,\n fromChain?.name,\n fromToken?.symbol,\n fromToken?.address\n )?.decimal\n )\n : '0';\n\n useEffect(() => {\n setCurrentPage(navigationRoutes.home);\n\n return setCurrentPage.bind(null, '');\n }, []);\n\n const percentageChange =\n !inputUsdValue || !outputUsdValue || !outputUsdValue.gt(0)\n ? null\n : getPercentageChange(\n inputUsdValue.toNumber(),\n outputUsdValue.toNumber()\n );\n\n return (\n <HomePanel\n bestRoute={bestRoute}\n bestRouteError={bestRouteError}\n fetchBestRoute={fetchBestRoute}\n onClickHistory={() => navigate(navigationRoutes.swaps)}\n onClickSettings={() => navigate(navigationRoutes.settings)}\n setInputAmount={setInputAmount}\n fromChain={fromChain}\n toChain={toChain}\n fromToken={fromToken}\n toToken={toToken}\n outputAmount={\n outputAmount\n ? numberToString(new BigNumber(outputAmount))\n : numberToString(new BigNumber(0))\n }\n inputAmount={inputAmount}\n loadingStatus={loadingMetaStatus}\n showBestRoute={showBestRoute}\n fetchingBestRoute={fetchingBestRoute}\n outputUsdValue={numberToString(outputUsdValue)}\n inputUsdValue={numberToString(inputUsdValue)}\n swapButtonTitle={swapButtonState.title}\n swapButtonDisabled={swapButtonState.disabled}\n swapButtonClick={() => {\n if (swapButtonState.title === 'Connect Wallet')\n navigate(navigationRoutes.wallets);\n else {\n navigate(navigationRoutes.confirmSwap, { replace: true });\n }\n }}\n onChainClick={(route) => {\n navigate(route);\n }}\n onTokenClick={(route) => {\n navigate(route);\n }}\n highFee={highFee}\n errorMessage={errorMessage}\n hasLimitError={hasLimitError}\n swap={swap}\n fromAmountRangeError={fromAmountRangeError}\n recommendation={recommendation}\n totalFeeInUsd={numberToString(totalFeeInUsd, 0, 2)}\n swithFromAndToComponent={<SwithFromAndToButton />}\n connectedWallets={connectedWallets}\n percentageChange={numberToString(percentageChange, 0, 2)}\n showPercentageChange={!!percentageChange?.lt(0)}\n tokenBalanceReal={tokenBalanceReal}\n tokenBalance={tokenBalance}\n totalTime={secondsToString(totalArrivalTime(bestRoute))}\n bestRouteData={getFormatedBestRoute(bestRoute)}\n swapFromAmount={numberToString(swap?.fromAmount || null)}\n />\n );\n}\n", "import React, { useEffect, useRef, useState } from 'react';\nimport { useInRouterContext, useSearchParams } from 'react-router-dom';\nimport { styled, Button, VerticalSwapIcon } from '@rango-dev/ui';\nimport { SearchParams } from '../constants/searchParams';\nimport { useBestRouteStore } from '../store/bestRoute';\n\nfunction SwithFromAndTo({ count }: { count: number }) {\n const firstRender = useRef(true);\n const [searchParams, setSearchParams] = useSearchParams();\n const outputAmount = useBestRouteStore.use.outputAmount();\n\n useEffect(() => {\n if (!firstRender.current) {\n const fromChainString = searchParams.get(SearchParams.FROM_CHAIN);\n const fromTokenString = searchParams.get(SearchParams.FROM_TOKEN);\n const toChainString = searchParams.get(SearchParams.TO_CHAIN);\n const toTokenString = searchParams.get(SearchParams.TO_TOKEN);\n setSearchParams({\n ...(toChainString && { [SearchParams.FROM_CHAIN]: toChainString }),\n ...(toTokenString && { [SearchParams.FROM_TOKEN]: toTokenString }),\n ...(fromChainString && { [SearchParams.TO_CHAIN]: fromChainString }),\n ...(fromTokenString && { [SearchParams.TO_TOKEN]: fromTokenString }),\n ...(outputAmount && {\n [SearchParams.FROM_AMOUNT]: outputAmount.toString(),\n }),\n });\n } else {\n firstRender.current = false;\n }\n }, [count]);\n\n return null;\n}\n\nconst SwitchButtonContainer = styled('div', {\n position: 'absolute',\n bottom: '-12px',\n left: '50%',\n transform: 'translate(-50%, 10%)',\n});\n\nexport function SwithFromAndToButton() {\n const switchFromAndTo = useBestRouteStore.use.switchFromAndTo();\n const isRouterInContext = useInRouterContext();\n const [count, setCount] = useState(0);\n\n return (\n <SwitchButtonContainer>\n <Button\n variant=\"ghost\"\n onClick={() => {\n switchFromAndTo();\n setCount((prev) => prev + 1);\n }}>\n <VerticalSwapIcon size={32} />\n {isRouterInContext && <SwithFromAndTo count={count} />}\n </Button>\n </SwitchButtonContainer>\n );\n}\n", "export const errorMessages = {\n genericServerError: 'Error connecting server, please reload the app and try again',\n};\n", "import { LiquiditySourcesSelector } from '@rango-dev/ui';\nimport React from 'react';\nimport { navigationRoutes } from '../constants/navigationRoutes';\nimport { useNavigateBack } from '../hooks/useNavigateBack';\nimport { useMetaStore } from '../store/meta';\nimport { useSettingsStore } from '../store/settings';\nimport { removeDuplicateFrom } from '../utils/common';\ninterface PropTypes {\n supportedSwappers?: string[];\n}\nexport function LiquiditySourcePage({ supportedSwappers }: PropTypes) {\n const swappers = useMetaStore.use.meta().swappers;\n const loadingMetaStatus = useMetaStore.use.loadingStatus();\n const toggleLiquiditySource = useSettingsStore.use.toggleLiquiditySource();\n const disabledLiquiditySources =\n useSettingsStore.use.disabledLiquiditySources();\n const toggleAllLiquiditySources =\n useSettingsStore.use.toggleAllLiquiditySources();\n\n const { navigateBackFrom } = useNavigateBack();\n\n const uniqueSwappersGroups: Array<{\n title: string;\n logo: string;\n type: 'BRIDGE' | 'AGGREGATOR' | 'DEX';\n selected: boolean;\n }> = [];\n removeDuplicateFrom(swappers.map((s) => s.swapperGroup))\n .map((swapperGroup) => {\n return swappers.find((s) => s.swapperGroup === swapperGroup);\n })\n .find((s) => {\n if (s) {\n for (const type of s.types) {\n uniqueSwappersGroups.push({\n title: s.swapperGroup,\n logo: s.logo,\n type,\n selected: !disabledLiquiditySources.includes(s.swapperGroup),\n });\n }\n }\n });\n\n return (\n <LiquiditySourcesSelector\n toggleAll={toggleAllLiquiditySources}\n list={\n supportedSwappers\n ? uniqueSwappersGroups.filter(\n (item) =>\n supportedSwappers.filter((s) => s === item.title).length > 0\n )\n : uniqueSwappersGroups\n }\n onChange={(liquiditySource) =>\n toggleLiquiditySource(liquiditySource.title)\n }\n onBack={navigateBackFrom.bind(null, navigationRoutes.liquiditySources)}\n loadingStatus={loadingMetaStatus}\n />\n );\n}\n", "import React from 'react';\nimport { BlockchainSelector } from '@rango-dev/ui';\nimport { useBestRouteStore } from '../store/bestRoute';\nimport { useMetaStore } from '../store/meta';\nimport { useNavigateBack } from '../hooks/useNavigateBack';\nimport { navigationRoutes } from '../constants/navigationRoutes';\n\ninterface PropTypes {\n type: 'from' | 'to';\n supportedChains?: string[];\n}\n\nexport function SelectChainPage(props: PropTypes) {\n const { type, supportedChains } = props;\n const blockchains = supportedChains\n ? useMetaStore.use\n .meta()\n .blockchains.filter((chain) => supportedChains.includes(chain.name))\n : useMetaStore.use.meta().blockchains;\n const loadingStatus = useMetaStore.use.loadingStatus();\n const fromChain = useBestRouteStore.use.fromChain();\n const toChain = useBestRouteStore.use.toChain();\n const setFromChain = useBestRouteStore.use.setFromChain();\n const setToChain = useBestRouteStore.use.setToChain();\n\n const { navigateBackFrom } = useNavigateBack();\n\n return (\n <BlockchainSelector\n type={type === 'from' ? 'Source' : 'Destination'}\n list={blockchains}\n selected={type === 'from' ? fromChain : toChain}\n loadingStatus={loadingStatus}\n onChange={(chain) => {\n if (type === 'from') setFromChain(chain, true);\n else setToChain(chain, true);\n navigateBackFrom(navigationRoutes.fromChain);\n }}\n onBack={navigateBackFrom.bind(null, navigationRoutes.fromChain)}\n />\n );\n}\n", "import React from 'react';\nimport { TokenSelector } from '@rango-dev/ui';\nimport { useBestRouteStore } from '../store/bestRoute';\nimport { Asset, Token } from 'rango-sdk';\nimport { useNavigateBack } from '../hooks/useNavigateBack';\nimport { navigationRoutes } from '../constants/navigationRoutes';\nimport { tokensAreEqual } from '../utils/wallets';\nimport { useMetaStore } from '../store/meta';\n\ninterface PropTypes {\n type: 'from' | 'to';\n supportedTokens?: Asset[];\n}\n\nexport interface TokenWithBalance extends Token {\n balance?: {\n amount: string;\n usdValue: string;\n };\n}\n\nexport function SelectTokenPage(props: PropTypes) {\n const { navigateBackFrom } = useNavigateBack();\n\n const { type, supportedTokens } = props;\n const sourceTokens = useBestRouteStore.use.sourceTokens();\n const destinationTokens = useBestRouteStore.use.destinationTokens();\n const supportedSourceTokens = supportedTokens\n ? sourceTokens.filter((token) =>\n supportedTokens.some((supportedToken) =>\n tokensAreEqual(supportedToken, token)\n )\n )\n : sourceTokens;\n\n const supportedDestinationTokens = supportedTokens\n ? destinationTokens.filter((token) =>\n supportedTokens.some((supportedToken) =>\n tokensAreEqual(supportedToken, token)\n )\n )\n : destinationTokens;\n\n const fromToken = useBestRouteStore.use.fromToken();\n const toToken = useBestRouteStore.use.toToken();\n const setFromToken = useBestRouteStore.use.setFromToken();\n const setToToken = useBestRouteStore.use.setToToken();\n const loadingMetaStatus = useMetaStore.use.loadingStatus();\n\n return (\n <TokenSelector\n type={type === 'from' ? 'Source' : 'Destination'}\n list={type == 'from' ? supportedSourceTokens : supportedDestinationTokens}\n selected={type === 'from' ? fromToken : toToken}\n onChange={(token) => {\n if (type === 'from') setFromToken(token);\n else setToToken(token);\n navigateBackFrom(navigationRoutes.fromToken);\n }}\n onBack={navigateBackFrom.bind(null, navigationRoutes.fromToken)}\n loadingStatus={loadingMetaStatus}\n />\n );\n}\n", "import React from 'react';\nimport { Settings } from '@rango-dev/ui';\nimport { useSettingsStore } from '../store/settings';\nimport { useMetaStore } from '../store/meta';\nimport { useNavigate } from 'react-router-dom';\nimport { navigationRoutes } from '../constants/navigationRoutes';\nimport { removeDuplicateFrom } from '../utils/common';\nimport {\n MAX_SLIPPAGE,\n MIN_SLIPPGAE,\n SLIPPAGES,\n} from '../constants/swapSettings';\nimport { useNavigateBack } from '../hooks/useNavigateBack';\ninterface PropTypes {\n supportedSwappers?: string[];\n singleTheme?: boolean;\n}\nexport function SettingsPage({ supportedSwappers, singleTheme }: PropTypes) {\n const slippage = useSettingsStore.use.slippage();\n const setSlippage = useSettingsStore.use.setSlippage();\n const disabledLiquiditySources =\n useSettingsStore.use.disabledLiquiditySources();\n const customSlippage = useSettingsStore.use.customSlippage();\n const setCustomSlippage = useSettingsStore.use.setCustomSlippage();\n const theme = useSettingsStore.use.theme();\n const setTheme = useSettingsStore.use.setTheme();\n const swappers = useMetaStore.use.meta().swappers;\n const navigate = useNavigate();\n const { navigateBackFrom } = useNavigateBack();\n\n const infiniteApprove = useSettingsStore.use.infiniteApprove();\n const toggleInfiniteApprove = useSettingsStore.use.toggleInfiniteApprove();\n const loadingMetaStatus = useMetaStore.use.loadingStatus();\n\n const uniqueSwappersGroups: Array<{\n title: string;\n logo: string;\n type: 'BRIDGE' | 'AGGREGATOR' | 'DEX';\n selected: boolean;\n }> = [];\n removeDuplicateFrom(swappers.map((s) => s.swapperGroup))\n .map((swapperGroup) => {\n return swappers.find((s) => s.swapperGroup === swapperGroup);\n })\n .find((s) => {\n if (s) {\n for (const type of s.types) {\n uniqueSwappersGroups.push({\n title: s.swapperGroup,\n logo: s.logo,\n type,\n selected: !disabledLiquiditySources.includes(s.swapperGroup),\n });\n }\n }\n });\n supportedSwappers &&\n uniqueSwappersGroups.filter(\n (item) => supportedSwappers.filter((s) => s === item.title).length > 0\n );\n\n const supportedUniqueSwappersGroups = supportedSwappers\n ? uniqueSwappersGroups.filter(\n (item) => supportedSwappers.filter((s) => s === item.title).length > 0\n )\n : uniqueSwappersGroups;\n\n return (\n <Settings\n slippages={SLIPPAGES}\n selectedSlippage={slippage}\n onSlippageChange={(slippage) => setSlippage(slippage)}\n onLiquiditySourcesClick={() =>\n navigate(navigationRoutes.liquiditySources)\n }\n onBack={navigateBackFrom.bind(null, navigationRoutes.settings)}\n liquiditySources={supportedUniqueSwappersGroups}\n selectedLiquiditySources={supportedUniqueSwappersGroups.filter(\n (s) => s.selected\n )}\n singleTheme={singleTheme}\n customSlippage={customSlippage}\n onCustomSlippageChange={setCustomSlippage}\n minSlippage={MIN_SLIPPGAE}\n maxSlippage={MAX_SLIPPAGE}\n selectedTheme={theme}\n onThemeChange={setTheme}\n infiniteApprove={infiniteApprove}\n toggleInfiniteApprove={toggleInfiniteApprove}\n loadingStatus={loadingMetaStatus}\n />\n );\n}\n", "import {\n Alert,\n SecondaryPage,\n styled,\n Wallet,\n WalletState,\n WalletInfo,\n} from '@rango-dev/ui';\nimport React, { useEffect, useRef, useState } from 'react';\nimport { getlistWallet, sortWalletsBasedOnState } from '../utils/wallets';\nimport {\n WalletType,\n WalletTypes,\n detectMobileScreens,\n} from '@rango-dev/wallets-shared';\nimport { useWallets } from '@rango-dev/wallets-react';\n\nimport { useUiStore } from '../store/ui';\nimport { useNavigateBack } from '../hooks/useNavigateBack';\nimport { navigationRoutes } from '../constants/navigationRoutes';\nimport { i18n } from '@lingui/core';\nimport { useMetaStore } from '../store/meta';\nimport { Spinner } from '@rango-dev/ui';\nimport { LoadingFailedAlert } from '@rango-dev/ui';\nimport { WidgetConfig } from '../types';\nimport { configWalletsToWalletName } from '../utils/providers';\n\ninterface PropTypes {\n supportedWallets: WidgetConfig['wallets'];\n multiWallets: boolean;\n config?: WidgetConfig;\n}\n\nconst ListContainer = styled('div', {\n display: 'grid',\n gap: '.5rem',\n gridTemplateColumns: ' repeat(2, minmax(0, 1fr))',\n alignContent: 'baseline',\n padding: '0.5rem',\n overflowY: 'auto',\n});\n\nconst LoaderContainer = styled('div', {\n display: 'flex',\n justifyContent: 'center',\n width: '100%',\n position: 'absolute',\n top: '50%',\n});\n\nconst AlertContainer = styled('div', {\n paddingBottom: '$16',\n});\n\nconst ALL_SUPPORTED_WALLETS = Object.values(WalletTypes);\n\nexport function WalletsPage({\n supportedWallets,\n multiWallets,\n config,\n}: PropTypes) {\n const { navigateBackFrom } = useNavigateBack();\n const { state, disconnect, getWalletInfo, connect } = useWallets();\n const wallets = getlistWallet(\n state,\n getWalletInfo,\n configWalletsToWalletName(supportedWallets, {\n walletConnectProjectId: config?.walletConnectProjectId,\n }) || ALL_SUPPORTED_WALLETS\n );\n const walletsRef = useRef<WalletInfo[]>();\n\n let sortedWallets = detectMobileScreens()\n ? wallets.filter((wallet) => wallet.showOnMobile)\n : wallets;\n sortedWallets = sortWalletsBasedOnState(sortedWallets);\n const [walletErrorMessage, setWalletErrorMessage] = useState('');\n const toggleConnectWalletsButton =\n useUiStore.use.toggleConnectWalletsButton();\n const loadingMetaStatus = useMetaStore.use.loadingStatus();\n\n const onSelectWallet = async (type: WalletType) => {\n const wallet = state(type);\n try {\n if (walletErrorMessage) setWalletErrorMessage('');\n if (wallet.connected) {\n await disconnect(type);\n } else {\n if (\n !multiWallets &&\n !!wallets.find((w) => w.state === WalletState.CONNECTED)\n ) {\n return;\n }\n await connect(type);\n }\n } catch (e) {\n setWalletErrorMessage('Error: ' + (e as any)?.message);\n }\n };\n const disconnectConnectingWallets = () => {\n const connectingWallets =\n walletsRef.current?.filter(\n (wallet) => wallet.state === WalletState.CONNECTING\n ) || [];\n for (const wallet of connectingWallets) {\n disconnect(wallet.type);\n }\n };\n useEffect(() => {\n toggleConnectWalletsButton();\n return () => {\n disconnectConnectingWallets();\n toggleConnectWalletsButton();\n };\n }, []);\n\n useEffect(() => {\n walletsRef.current = wallets;\n }, [wallets]);\n\n return (\n <SecondaryPage\n title={i18n.t('Select Wallet') || ''}\n textField={false}\n onBack={navigateBackFrom.bind(null, navigationRoutes.wallets)}>\n <>\n {walletErrorMessage && (\n <AlertContainer>\n <Alert type=\"error\" title={walletErrorMessage} />\n </AlertContainer>\n )}\n {loadingMetaStatus === 'loading' && (\n <LoaderContainer className=\"loader\">\n <Spinner size={24} />\n </LoaderContainer>\n )}\n {loadingMetaStatus === 'failed' && <LoadingFailedAlert />}\n <ListContainer>\n {loadingMetaStatus === 'success' &&\n sortedWallets.map((wallet, index) => (\n <Wallet\n {...wallet}\n key={`${index}-${wallet.type}`}\n onClick={onSelectWallet}\n />\n ))}\n </ListContainer>\n </>\n </SecondaryPage>\n );\n}\n", "import { allProviders } from '@rango-dev/provider-all';\nimport { ProviderInterface } from '@rango-dev/wallets-react';\nimport { WidgetConfig } from '../types';\n\nexport interface ProvidersOptions {\n walletConnectProjectId?: WidgetConfig['walletConnectProjectId'];\n}\n\n/**\n *\n * Generate a list of providers by passing a provider name (e.g. metamask) or a custom provider which implemented ProviderInterface.\n * @returns ProviderInterface[] a list of ProviderInterface\n *\n */\nexport function matchAndGenerateProviders(\n providers: WidgetConfig['wallets'],\n options?: ProvidersOptions\n): ProviderInterface[] {\n const all = allProviders({\n walletconnect2: {\n WC_PROJECT_ID: options?.walletConnectProjectId || '',\n },\n });\n\n if (providers) {\n const selectedProviders: ProviderInterface[] = [];\n\n providers.forEach((requestedProvider) => {\n // There are two types of provider we get, the first one is only passing the wallet name\n // then we will match the wallet name with our providers (@rango-dev/provider-*).\n // The second way is passing a custom provider which implemented ProviderInterface.\n if (typeof requestedProvider === 'string') {\n const result: ProviderInterface | undefined = all.find((provider) => {\n return provider.config.type === requestedProvider;\n });\n if (result) {\n selectedProviders.push(result);\n } else {\n console.warn(\n `Couldn't find ${requestedProvider} provider. Please make sure you are passing the correct name.`\n );\n }\n } else {\n // It's a custom provider so we directly push it to the list.\n selectedProviders.push(requestedProvider);\n }\n });\n return selectedProviders;\n }\n\n return all;\n}\n\nexport function configWalletsToWalletName(\n config: WidgetConfig['wallets'],\n options?: ProvidersOptions\n): string[] {\n const providers = matchAndGenerateProviders(config, options);\n const names = providers.map((provider) => {\n return provider.config.type;\n });\n return names;\n}\n", "import React from 'react';\nimport { navigationRoutes } from '../constants/navigationRoutes';\nimport { useManager } from '@rango-dev/queue-manager-react';\nimport { useNavigateBack } from '../hooks/useNavigateBack';\nimport { getPendingSwaps } from '../utils/queue';\nimport {\n SwapHistory,\n useCopyToClipboard,\n SwapDetailsPlaceholder,\n} from '@rango-dev/ui';\nimport { useUiStore } from '../store/ui';\nimport {\n cancelSwap,\n PendingSwapNetworkStatus,\n} from '@rango-dev/queue-manager-rango-preset';\nimport { useWallets } from '@rango-dev/wallets-react';\nimport {\n getCurrentBlockchainOfOrNull,\n getCurrentStep,\n getRelatedWalletOrNull,\n} from '@rango-dev/queue-manager-rango-preset';\nimport { getSwapDate } from '../utils/time';\nimport { useNavigate } from 'react-router-dom';\nimport { useBestRouteStore } from '../store/bestRoute';\nimport {\n getLastConvertedTokenInFailedSwap,\n getSwapMessages,\n isNetworkStatusInWarningState,\n shouldRetrySwap,\n} from '../utils/swap';\nimport { getFormatedPendingSwap } from '../utils/routing';\n\nexport function SwapDetailsPage() {\n const selectedSwapRequestId = useUiStore.use.selectedSwapRequestId();\n const { canSwitchNetworkTo, connect, getWalletInfo } = useWallets();\n const retry = useBestRouteStore.use.retry();\n const navigate = useNavigate();\n const { navigateBackFrom } = useNavigateBack();\n const [isCopied, handleCopy] = useCopyToClipboard(2000);\n const { manager, state } = useManager();\n\n const pendingSwaps = getPendingSwaps(manager);\n const selectedSwap = pendingSwaps.find(\n ({ swap }) => swap.requestId === selectedSwapRequestId\n );\n\n const onCancel = () => {\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion, @typescript-eslint/no-non-null-asserted-optional-chain\n const swap = manager?.get(selectedSwap?.id!);\n if (swap) cancelSwap(swap);\n };\n const swap = selectedSwap?.swap;\n const loading = !state.loadedFromPersistor;\n\n if (!swap)\n return (\n <SwapDetailsPlaceholder\n requestId={selectedSwapRequestId || ''}\n loading={loading}\n onBack={navigateBackFrom.bind(null, navigationRoutes.swapDetails)}\n />\n );\n\n const currentStep = getCurrentStep(swap);\n\n const currentStepBlockchain = currentStep\n ? getCurrentBlockchainOfOrNull(swap, currentStep)\n : null;\n const currentStepWallet = currentStep\n ? getRelatedWalletOrNull(swap, currentStep)\n : null;\n const currentStepNetworkStatus = currentStep?.networkStatus;\n\n const swapMessages = getSwapMessages(swap, currentStep);\n\n const networkWarningState = isNetworkStatusInWarningState(currentStep);\n\n const swapDate = getSwapDate(swap);\n\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 lastConvertedTokenInFailedSwap =\n getLastConvertedTokenInFailedSwap(swap);\n\n return (\n <SwapHistory\n onBack={navigateBackFrom.bind(null, navigationRoutes.swapDetails)}\n /* TODO: It was temporarily removed to find a better solution*/\n /*\n previewInputs={\n <>\n <TokenPreview\n chain={{\n displayName: firstStep?.fromBlockchain || '',\n logo: firstStep?.fromBlockchainLogo || '',\n }}\n token={{\n symbol: firstStep?.fromSymbol || '',\n image: firstStep?.fromLogo || '',\n }}\n amount={fromAmount}\n label={t('From')}\n loadingStatus={'success'}\n />\n <Divider size={12} />\n <TokenPreview\n chain={{\n displayName: lastStep?.toBlockchain || '',\n logo: lastStep?.toBlockchainLogo || '',\n }}\n token={{\n symbol: lastStep?.toSymbol || '',\n image: lastStep?.toLogo || '',\n }}\n amount={toAmount}\n label={t('To')}\n loadingStatus={'success'}\n />\n </>\n }\n */\n pendingSwap={getFormatedPendingSwap(swap)}\n onCopy={handleCopy}\n isCopied={isCopied}\n onCancel={onCancel}\n shortMessage={swapMessages.shortMessage}\n detailedMessage={swapMessages.detailedMessage}\n currentStepBlockchain={currentStepBlockchain || ''}\n switchNetwork={switchNetwork}\n type={\n networkWarningState ? 'warning' : swap.extraMessageSeverity || undefined\n }\n date={swapDate}\n {...(shouldRetry && {\n onRetry: () => {\n retry(swap);\n setTimeout(() => {\n navigate(navigationRoutes.home);\n }, 0);\n },\n })}\n {...(lastConvertedTokenInFailedSwap && {\n lastConvertedTokenInFailedSwap: {\n blockchain: lastConvertedTokenInFailedSwap.blockchain,\n outputAmount: lastConvertedTokenInFailedSwap.outputAmount || '',\n symbol: lastConvertedTokenInFailedSwap.symbol,\n },\n })}\n />\n );\n}\n", "import { PendingSwap } from '@rango-dev/queue-manager-rango-preset';\n\nexport function timeSince(timeMillis: number): string {\n const seconds = Math.floor((new Date().getTime() - timeMillis) / 1000);\n let intervalType: string;\n\n let interval = Math.floor(seconds / 31536000);\n if (interval >= 1) {\n intervalType = 'year';\n } else {\n interval = Math.floor(seconds / 2592000);\n if (interval >= 1) {\n intervalType = 'month';\n } else {\n interval = Math.floor(seconds / 86400);\n if (interval >= 1) {\n intervalType = 'day';\n } else {\n interval = Math.floor(seconds / 3600);\n if (interval >= 1) {\n intervalType = 'hour';\n } else {\n interval = Math.floor(seconds / 60);\n if (interval >= 1) {\n intervalType = 'minute';\n } else {\n interval = seconds;\n intervalType = 'second';\n }\n }\n }\n }\n }\n\n if (interval > 1 || interval === 0) {\n intervalType += 's';\n }\n\n return interval + ' ' + intervalType;\n}\n\nexport function getSwapDate(pendingSwap: PendingSwap) {\n return pendingSwap.finishTime\n ? `${timeSince(parseInt(pendingSwap.finishTime))} ago`\n : `${timeSince(parseInt(pendingSwap.creationTime))} ago`;\n}\n", "import { globalCss } from '@rango-dev/ui';\n\nexport const globalFont = (fontFamily: string) =>\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 body: {\n fontFamily,\n },\n })();\n", "import { createTheme, generateRangeColors } from '@rango-dev/ui';\nimport { useState, useEffect, useLayoutEffect } from 'react';\nimport { useMetaStore } from '../store/meta';\nimport { useSettingsStore } from '../store/settings';\nimport { WidgetTheme } from '../types';\nimport usePrevious from './usePrevious';\n\nexport function useTheme({\n colors: themeColors,\n fontFamily = 'Roboto',\n borderRadius = 8,\n mode = 'auto',\n}: WidgetTheme) {\n const theme = useSettingsStore.use.theme();\n const fetchMeta = useMetaStore.use.fetchMeta();\n const setTheme = useSettingsStore.use.setTheme();\n const light = themeColors?.light;\n const dark = themeColors?.dark;\n const neutral = light?.neutral || '#fafafa';\n const background = light?.background || '#fff';\n const foreground = light?.foreground || '#000';\n\n const darkColors = {\n ...generateRangeColors('primary', 'dark', dark?.primary),\n ...generateRangeColors('error', 'dark', dark?.error),\n ...generateRangeColors('warning', 'dark', dark?.warning),\n ...generateRangeColors('success', 'dark', dark?.success),\n ...generateRangeColors('neutral', 'dark', dark?.neutral),\n surface: dark?.surface,\n background: dark?.background,\n foreground: dark?.foreground,\n };\n\n const lightColors = {\n surface: light?.surface || '#fff',\n ...generateRangeColors('primary', 'light', light?.primary || '#5FA425'),\n ...generateRangeColors('error', 'light', light?.error || '#FF0000'),\n ...generateRangeColors('warning', 'light', light?.warning || '#F5A623'),\n ...generateRangeColors('success', 'light', light?.success || '#0070F3'),\n ...generateRangeColors('neutral', 'light', neutral),\n background,\n foreground,\n };\n\n const customLightTheme = createTheme({\n colors: lightColors,\n radii: {\n 5: `${borderRadius}px`,\n },\n shadows: {\n s: `0px 3px 5px 3px ${light?.neutral || '#f0f2f5'} ,0px 6px 10px 3px ${\n light?.neutral || '#f0f2f5'\n }, 0px 1px 18px 3px ${light?.neutral || '#f0f2f5'}`,\n },\n });\n\n const customDarkTheme = createTheme({\n colors: {\n ...lightColors,\n ...generateRangeColors('neutral', 'dark', '#111111'),\n foreground: background,\n background: foreground,\n surface: '#000',\n ...JSON.parse(JSON.stringify(darkColors)),\n },\n radii: {\n 5: `${borderRadius}px`,\n },\n shadows: {\n s: `0px 3px 5px 3px ${dark?.neutral || '#222'}, 0px 6px 10px 3px ${\n dark?.neutral || '#222'\n }, 0px 1px 18px 3px ${dark?.neutral || '#222'}`,\n },\n });\n const [OSTheme, setOSTheme] = useState('light');\n\n useEffect(() => {\n (async () => {\n await fetchMeta();\n })();\n\n const switchTheme = (event: MediaQueryListEvent) => {\n if (event.matches) setOSTheme('dark');\n else setOSTheme('light');\n };\n\n if (\n window.matchMedia &&\n window.matchMedia('(prefers-color-scheme: dark)').matches\n ) {\n setOSTheme('dark');\n }\n\n window\n .matchMedia('(prefers-color-scheme: dark)')\n .addEventListener('change', switchTheme);\n return () => {\n window\n .matchMedia('(prefers-color-scheme: dark)')\n .removeEventListener('change', switchTheme);\n };\n }, []);\n useEffect(() => {\n if (mode !== 'auto') setTheme(mode);\n }, [mode]);\n const prevFont = usePrevious(fontFamily);\n\n useLayoutEffect(() => {\n const { classList } = document.body;\n\n if (prevFont) classList.remove(`font_${prevFont.replace(/ /g, '')}`);\n classList.add(`font_${fontFamily.replace(/ /g, '')}`);\n }, [fontFamily]);\n\n const getActiveTheme = () => {\n if (theme === 'auto')\n return OSTheme === 'dark' ? customDarkTheme : customLightTheme;\n else return theme === 'dark' ? customDarkTheme : customLightTheme;\n };\n\n return { activeTheme: getActiveTheme() };\n}\n", "import { useEffect, useRef } from 'react';\n\nexport default function usePrevious(value: string) {\n // The ref object is a generic container whose current property is mutable ...\n // ... and can hold any value, similar to an instance property on a class\n const ref = useRef<string>();\n // Store current value in ref\n useEffect(() => {\n ref.current = value;\n }, [value]); // Only re-run if value changes\n // Return previous value (happens before update in useEffect above)\n return ref.current;\n}\n", "import React, { PropsWithChildren, useMemo } from 'react';\nimport { Provider as ManagerProvider } from '@rango-dev/queue-manager-react';\nimport {\n makeQueueDefinition,\n SwapQueueContext,\n checkWaitingForNetworkChange,\n} from '@rango-dev/queue-manager-rango-preset';\nimport { useWallets } from '@rango-dev/wallets-react';\nimport {\n convertEvmBlockchainMetaToEvmChainInfo,\n Network,\n WalletType,\n} from '@rango-dev/wallets-shared';\nimport { useMetaStore } from './store/meta';\nimport { useWalletsStore } from './store/wallets';\nimport { walletAndSupportedChainsNames } from './utils/wallets';\nimport { getConfig } from './utils/configs';\nimport { isEvmBlockchain } from 'rango-types';\n\nfunction QueueManager(props: PropsWithChildren) {\n const {\n providers,\n getSigners,\n state,\n connect,\n canSwitchNetworkTo,\n getWalletInfo,\n } = useWallets();\n\n const swapQueueDef = useMemo(() => {\n return makeQueueDefinition({\n API_KEY: getConfig('API_KEY'),\n });\n }, []);\n\n const { blockchains } = useMetaStore.use.meta();\n const connectedWallets = useWalletsStore.use.connectedWallets();\n\n const wallets = {\n blockchains: connectedWallets.map((wallet) => ({\n accounts: [wallet],\n name: wallet.chain,\n })),\n };\n\n const switchNetwork = (wallet: WalletType, network: Network) => {\n if (!canSwitchNetworkTo(wallet, network)) {\n return undefined;\n }\n return connect(wallet, network);\n };\n\n const isMobileWallet = (walletType: WalletType): boolean =>\n !!getWalletInfo(walletType).mobileWallet;\n\n // TODO: this code copy & pasted from rango, should be refactored.\n const allBlockchains = blockchains\n .filter((blockchain) => blockchain.enabled)\n .reduce(\n (blockchainsObj: any, blockchain) => (\n (blockchainsObj[blockchain.name] = blockchain), blockchainsObj\n ),\n {}\n );\n const evmBasedChains = blockchains.filter(isEvmBlockchain);\n const getSupportedChainNames = (type: WalletType) => {\n const { supportedChains } = getWalletInfo(type);\n return walletAndSupportedChainsNames(supportedChains);\n };\n const allProviders = providers();\n\n const context: SwapQueueContext = {\n meta: {\n blockchains: allBlockchains,\n evmBasedChains: evmBasedChains,\n evmNetworkChainInfo:\n convertEvmBlockchainMetaToEvmChainInfo(evmBasedChains),\n getSupportedChainNames,\n },\n getSigners,\n //todo: remove Network type\n // eslint-disable-next-line @typescript-eslint/ban-ts-comment\n //@ts-ignore\n wallets,\n providers: allProviders,\n switchNetwork,\n canSwitchNetworkTo,\n connect,\n state,\n isMobileWallet,\n };\n\n return (\n <ManagerProvider\n queuesDefs={[swapQueueDef]}\n context={context}\n onPersistedDataLoaded={(manager) => {\n checkWaitingForNetworkChange(manager);\n }}\n isPaused={false}>\n {props.children}\n </ManagerProvider>\n );\n}\n\nexport default QueueManager;\n", "import React, { PropsWithChildren } from 'react';\nimport { useMetaStore } from './store/meta';\nimport { Events, Provider } from '@rango-dev/wallets-react';\nimport type { EventHandler } from '@rango-dev/wallets-react';\nimport { Network } from '@rango-dev/wallets-shared';\nimport {\n prepareAccountsForWalletStore,\n walletAndSupportedChainsNames,\n} from './utils/wallets';\nimport { useWalletsStore } from './store/wallets';\nimport { isEvmBlockchain } from 'rango-sdk';\nimport { useWalletProviders } from './hooks/useWalletProviders';\nimport { WidgetConfig } from './types';\nimport { createContext, useRef } from 'react';\nimport { ProvidersOptions } from './utils/providers';\n\ntype OnConnectHandler = (key: string) => void;\ninterface WidgetContextInterface {\n onConnectWallet(handler: OnConnectHandler): void;\n}\n\nexport const WidgetContext = createContext<WidgetContextInterface>({\n onConnectWallet: () => {\n return;\n },\n});\n\nexport function WidgetWallets(\n props: PropsWithChildren<{\n providers: WidgetConfig['wallets'];\n options?: ProvidersOptions;\n onUpdateState?: EventHandler;\n }>\n) {\n const { blockchains } = useMetaStore.use.meta();\n const { providers } = useWalletProviders(props.providers, props?.options);\n const disconnectWallet = useWalletsStore.use.disconnectWallet();\n const connectWallet = useWalletsStore.use.connectWallet();\n const onConnectWalletHandler = useRef<OnConnectHandler>();\n\n const evmBasedChainNames = blockchains\n .filter(isEvmBlockchain)\n .map((chain) => chain.name);\n\n const onUpdateState: EventHandler = (\n type,\n event,\n value,\n state,\n supportedChains\n ) => {\n if (event === Events.ACCOUNTS) {\n if (value) {\n const supportedChainNames: Network[] | null =\n walletAndSupportedChainsNames(supportedChains);\n const data = prepareAccountsForWalletStore(\n type,\n value,\n evmBasedChainNames,\n supportedChainNames\n );\n connectWallet(data);\n } else {\n disconnectWallet(type);\n }\n }\n if (event === Events.ACCOUNTS && state.connected) {\n const key = `${type}-${state.network}-${value}`;\n\n if (state.connected) {\n if (!!onConnectWalletHandler.current)\n onConnectWalletHandler.current(key);\n else\n console.warn(\n `onConnectWallet handler hasn't been set. Are you sure?`\n );\n }\n }\n\n if (event === Events.NETWORK && state.network) {\n const key = `${type}-${state.network}`;\n if (!!onConnectWalletHandler.current) onConnectWalletHandler.current(key);\n else\n console.warn(`onConnectWallet handler hasn't been set. Are you sure?`);\n }\n\n // propagate updates for Dapps using external wallets\n if (props.onUpdateState) {\n props.onUpdateState(type, event, value, state, supportedChains);\n }\n };\n return (\n <WidgetContext.Provider\n value={{\n onConnectWallet: (handler) => {\n onConnectWalletHandler.current = handler;\n },\n }}>\n <Provider\n allBlockChains={blockchains}\n providers={providers}\n onUpdateState={onUpdateState}\n autoConnect>\n {props.children}\n </Provider>\n </WidgetContext.Provider>\n );\n}\n", "import { ProviderInterface } from '@rango-dev/wallets-react';\nimport { useEffect } from 'react';\nimport { useWalletsStore } from '../store/wallets';\nimport { WidgetConfig } from '../types';\nimport {\n matchAndGenerateProviders,\n ProvidersOptions,\n} from '../utils/providers';\n\nexport function useWalletProviders(\n providers: WidgetConfig['wallets'],\n options?: ProvidersOptions\n) {\n const clearConnectedWallet = useWalletsStore.use.clearConnectedWallet();\n let generateProviders: ProviderInterface[] = matchAndGenerateProviders(\n undefined,\n options\n );\n\n useEffect(() => {\n clearConnectedWallet();\n generateProviders = matchAndGenerateProviders(providers, {\n walletConnectProjectId: options?.walletConnectProjectId,\n });\n }, [providers]);\n\n return {\n providers: generateProviders,\n };\n}\n", "import { useEffect } from 'react';\nimport {\n useEvents,\n MainEvents,\n StepEventType,\n StepExecutionEventStatus,\n isApprovalTX,\n} from '@rango-dev/queue-manager-rango-preset';\nimport { useWalletsStore } from '../store/wallets';\n\nexport function WidgetEvents() {\n const connectedWallets = useWalletsStore.use.connectedWallets();\n const getWalletsDetails = useWalletsStore.use.getWalletsDetails();\n\n const widgetEvents = useEvents();\n\n useEffect(() => {\n widgetEvents.on(MainEvents.StepEvent, (widgetEvent) => {\n const { event, step } = widgetEvent;\n const shouldRefetchBalance =\n (event.type === StepEventType.TX_EXECUTION &&\n event.status === StepExecutionEventStatus.TX_SENT &&\n !isApprovalTX(step)) ||\n event.type === StepEventType.SUCCEEDED;\n\n if (shouldRefetchBalance) {\n const fromAccount = connectedWallets.find(\n (account) => account.chain === step?.fromBlockchain\n );\n const toAccount =\n step?.fromBlockchain !== step?.toBlockchain &&\n connectedWallets.find(\n (wallet) => wallet.chain === step?.toBlockchain\n );\n\n fromAccount && getWalletsDetails([fromAccount]);\n toAccount && getWalletsDetails([toAccount]);\n }\n });\n\n return () => widgetEvents.all.clear();\n }, [widgetEvents, connectedWallets.length]);\n\n return null;\n}\n", "import {\n WidgetTheme,\n WidgetConfig,\n WidgetColors,\n BlockchainAndTokenConfig,\n} from './types';\nimport { WidgetProps, Widget } from './Widget';\nimport { WalletType } from '@rango-dev/wallets-shared';\nimport { WidgetWallets } from './Wallets';\nimport {\n useWallets,\n ProviderInterface,\n EventHandler as HandleWalletsUpdate,\n} from '@rango-dev/wallets-react';\nimport {\n useEvents as useWidgetEvents,\n MainEvents,\n RouteEvent,\n StepEvent,\n Route,\n Step,\n RouteStartedEvent,\n RouteSucceededEvent,\n RouteFailedEvent,\n RouteEventType,\n StepStartedEvent,\n StepSucceededEvent,\n StepFailedEvent,\n StepTxExecutionUpdatedEvent,\n StepTxExecutionBlockedEvent,\n StepCheckStatusEvent,\n StepApprovalTxSucceededEvent,\n StepOutputRevealedEvent,\n StepEventType,\n StepExecutionEventStatus,\n StepExecutionBlockedEventStatus,\n} from '@rango-dev/queue-manager-rango-preset';\n\nexport type {\n WidgetConfig,\n WalletType,\n WidgetTheme,\n WidgetColors,\n ProviderInterface,\n BlockchainAndTokenConfig,\n WidgetProps,\n RouteEvent,\n StepEvent,\n Route,\n Step,\n RouteStartedEvent,\n RouteSucceededEvent,\n RouteFailedEvent,\n StepStartedEvent,\n StepSucceededEvent,\n StepFailedEvent,\n StepTxExecutionUpdatedEvent,\n StepTxExecutionBlockedEvent,\n StepCheckStatusEvent,\n StepApprovalTxSucceededEvent,\n StepOutputRevealedEvent,\n HandleWalletsUpdate,\n};\nexport {\n Widget,\n WidgetWallets,\n useWallets,\n useWidgetEvents,\n MainEvents,\n RouteEventType,\n StepEventType,\n StepExecutionEventStatus,\n StepExecutionBlockedEventStatus,\n};\n"],
5
+ "mappings": "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",
6
6
  "names": ["SwapContainer", "styled", "I18nManager", "React", "useContext", "useEffect", "useMemo", "useState", "React", "Fragment", "MemoryRouter", "useInRouterContext", "useQueueManager", "useEffect", "useRef", "createSearchParams", "useLocation", "useSearchParams", "create", "BigNumber", "BigNumber", "ZERO", "BigNumber", "removeDuplicateFrom", "array", "__name", "areEqual", "array1", "array2", "v", "i", "debounce", "fn", "time", "timeoutId", "wrapper", "args", "BigNumber", "secondsToString", "__name", "s", "seconds", "numberToString", "number", "minDecimals", "maxDecimals", "BigNumber", "roundingMode", "maxI", "totalArrivalTime", "__name", "data", "a", "b", "isPositiveNumber", "__name", "text", "searchParamsToToken", "tokens", "searchParams", "chain", "token", "symbolAndAddress", "__name", "getBestRouteToTokenUsdPrice", "bestRoute", "isNumberOfSwapsChanged", "route1", "route2", "route1Swaps", "route2Swaps", "isRouteSwappersUpdated", "route1Swappers", "swap", "route2Swappers", "areEqual", "isRouteInternalCoinsUpdated", "route1InternalCoins", "route2InternalCoins", "isRouteChanged", "getRequiredBalanceOfWallet", "selectedWallet", "fee", "relatedFeeStatus", "item", "wallet", "__name", "isRouteParametersChanged", "params", "prevState", "currentState", "getFormatedBestRoute", "bestRoute", "formatedSwaps", "swap", "numberToString", "getFormatedPendingSwap", "pendingSwap", "formatedSteps", "step", "getBestRouteStatus", "loading", "error", "createSelectors", "__name", "_store", "store", "k", "s", "selectors_default", "subscribeWithSelector", "RangoClient", "RANGO_PUBLIC_API_KEY", "configs", "getConfig", "name", "__name", "initConfig", "nextConfigs", "clonedConfigs", "configs", "__name", "rango", "httpService", "__name", "RangoClient", "getConfig", "create", "persist", "subscribeWithSelector", "SLIPPAGES", "DEFAULT_SLIPPAGE", "HIGH_SLIPPAGE", "MAX_SLIPPAGE", "MIN_SLIPPGAE", "create", "useMetaStore", "selectors_default", "create", "set", "response", "httpService", "chainThatHasTokenInMetaResponse", "removeDuplicateFrom", "t", "enabledChains", "chain", "a", "b", "useSettingsStore", "selectors_default", "create", "persist", "subscribeWithSelector", "set", "DEFAULT_SLIPPAGE", "slippage", "customSlippage", "affiliateRef", "affiliatePercent", "affiliateWallets", "state", "swappers", "useMetaStore", "swappersGroup", "removeDuplicateFrom", "swapper", "name", "liquiditySource", "theme", "BigNumber", "i18n", "getCosmosExperimentalChainInfo", "isEvmAddress", "KEPLR_COMPATIBLE_WALLETS", "detectInstallLink", "WalletTypes", "Networks", "WalletStatus", "isCosmosBlockchain", "readAccountAddress", "BigNumber", "getStateWallet", "state", "WalletStatus", "__name", "excludedWallets", "WalletTypes", "getlistWallet", "getState", "getWalletInfo", "list", "wallet", "type", "name", "image", "installLink", "showOnMobile", "detectInstallLink", "walletAndSupportedChainsNames", "supportedChains", "blockchainMeta", "prepareAccountsForWalletStore", "accounts", "evmBasedChains", "supportedChainNames", "result", "addAccount", "network", "address", "account", "newAccount", "readAccountAddress", "hasLimitation", "isSupported", "isUnknown", "Networks", "isUknownAndEvmBased", "isEvmAddress", "chain", "getRequiredChains", "route", "wallets", "swap", "currentStepFromBlockchain", "currentStepToBlockchain", "internalSwap", "internalStepFromBlockchain", "internalStepToBlockchain", "getSelectableWallets", "connectedWallets", "selectedWallets", "destinationChain", "connectedWallet", "selectedWallet", "getBalanceFromWallet", "symbol", "selectedChainWallets", "balance", "a", "b", "isAccountAndWalletMatched", "makeBalanceFor", "retrivedBalance", "tokens", "explorerUrl", "balances", "tokenBalance", "BigNumber", "getUsdPrice", "resetConnectedWalletState", "calculateWalletUsdValue", "uniqueAccountAddresses", "modifiedWalletBlockchains", "acc", "current", "i", "modifiedWalletBlockchain", "accountAddress", "total", "numberToString", "ZERO", "numberWithThousandSeperator", "number", "parts", "sortTokens", "token", "tokenA", "tokenB", "blockchain", "allTokens", "t", "isExperimentalChain", "blockchains", "cosmosExperimentalChainInfo", "getCosmosExperimentalChainInfo", "isCosmosBlockchain", "getKeplrCompatibleConnectedWallets", "selectableWallets", "connectedWalletTypes", "KEPLR_COMPATIBLE_WALLETS", "compatibleWallet", "getTokensWithBalance", "otherProps", "tokenAmount", "tokenUsdValue", "getSortedTokens", "otherChainTokens", "filteredTokens", "tokensAreEqual", "getDefaultToken", "sortedTokens", "otherToken", "selectedToken", "firstToken", "secondToken", "sortWalletsBasedOnState", "PendingSwapNetworkStatus", "getOutputRatio", "inputUsdValue", "outputUsdValue", "ZERO", "__name", "outputRatioHasWarning", "outputRatio", "BigNumber", "hasLimitError", "bestRoute", "swap", "minimum", "maximum", "LimitErrorMessage", "isExclusive", "fromAmountRangeError", "recommendation", "numberToString", "getSwapButtonState", "loadingMetaStatus", "connectedWallets", "loading", "highValueLoss", "priceImpactCanNotBeComputed", "needsToWarnEthOnPath", "inputAmount", "i18n", "canComputePriceImpact", "requiredWallets", "route", "wallets", "currentStepFromBlockchain", "currentStepToBlockchain", "lastAddedWallet", "getUsdPrice", "blockchain", "symbol", "address", "allTokens", "t", "getUsdFeeOfStep", "step", "totalFeeInUsd", "i", "fee", "unitPrice", "getTotalFeeInUsd", "totalFee", "hasHighFee", "getMinRequiredSlippage", "route", "slippage", "s", "a", "b", "__name", "hasProperSlippage", "userSlippage", "minRequiredSlippage", "createBestRouteRequestBody", "fromToken", "toToken", "inputAmount", "wallets", "selectedWallets", "disabledLiquiditySources", "slippage", "affiliateRef", "affiliatePercent", "affiliateWallets", "initialRoute", "destination", "selectedWalletsMap", "selectedWallet", "connectedWallets", "wallet", "chainAndAccounts", "connectedWallet", "checkPrerequisites", "filteredBlockchains", "removeDuplicateFrom", "blockchains", "swap", "internalSwap", "__name", "getWalletsForNewSwap", "getRouteOutputAmount", "route", "getPercentageChange", "oldValue", "newValue", "BigNumber", "isOutputAmountChangedALot", "oldRoute", "newRoute", "oldOutputAmount", "newOutputAmount", "percentageChange", "getBalanceWarnings", "fee", "requiredWallets", "getRequiredChains", "selectedWallet1", "selectedWallet2", "getRequiredBalanceOfWallet", "asset", "symbol", "currentAmount", "numberToString", "requiredAmount", "reason", "calcOutputUsdValue", "outputAmount", "tokenPrice", "ZERO", "isNetworkStatusInWarningState", "pendingSwapStep", "PendingSwapNetworkStatus", "getSwapMessages", "pendingSwap", "currentStep", "textForRemove", "message", "detailedMessage", "isRpc", "getLastConvertedTokenInFailedSwap", "resultToken", "lastSuccessStep", "step", "shouldRetrySwap", "isValidCustomDestination", "blockchain", "address", "useMetaStore", "chain", "r", "confirmSwapDisabled", "fetching", "destinationChain", "customDestination", "bestRoute", "create", "subscribeWithSelector", "shallow", "useWalletsStore", "selectors_default", "create", "subscribeWithSelector", "set", "get", "accounts", "getWalletsDetails", "state", "wallet", "account", "walletType", "balance", "requiredChains", "getRequiredChains", "useBestRouteStore", "connectedWallets", "selectedWallets", "chain", "firstWalletWithMatchedChain", "selectedWallet", "customDestination", "shouldRetry", "tokens", "useMetaStore", "isAccountAndWalletMatched", "data", "address", "retrivedBalance", "httpService", "connectedWallet", "matchedAccount", "retrivedBalanceAccount", "makeBalanceFor", "resetConnectedWalletState", "sourceTokens", "destinationTokens", "sourceTokensWithBalance", "getTokensWithBalance", "destinationTokensWithBalance", "sortTokens", "shallow", "fetchingBalanceSelector", "__name", "getUsdValue", "__name", "token", "amount", "BigNumber", "ZERO", "useBestRouteStore", "selectors_default", "create", "subscribeWithSelector", "set", "bestRoute", "state", "outputAmount", "outputUsdValue", "isPositiveNumber", "calcOutputUsdValue", "getBestRouteToTokenUsdPrice", "chain", "setDefaultToken", "tokens", "useMetaStore", "connectedWallets", "useWalletsStore", "sortedTokens", "getSortedTokens", "fromToken", "getDefaultToken", "pendingSwap", "blockchains", "failedIndex", "s", "firstStep", "lastStep", "fromChain", "blockchain", "toChain", "tokensAreEqual", "toToken", "sortedSourceTokens", "sortedDestinationTokens", "inputAmount", "bestRouteStore", "settingsStore", "abortController", "fetchBestRoute", "resetRoute", "slippage", "customSlippage", "disabledLiquiditySources", "affiliateRef", "affiliatePercent", "affiliateWallets", "requestBody", "createBestRouteRequestBody", "httpService", "res", "setBestRoute", "error", "debouncedFetchBestRoute", "debounce", "bestRouteParamsListener", "inputUsdValue", "prevState", "currentState", "isRouteParametersChanged", "useSettingsStore", "navigationRoutes", "create", "useUiStore", "selectors_default", "create", "set", "state", "requestId", "path", "UpdateUrl", "firstRender", "useRef", "searchParams", "setSearchParams", "useSearchParams", "location", "useLocation", "firstRenderSearchParams", "searchParamsRef", "fromChain", "useBestRouteStore", "toChain", "fromToken", "toToken", "setFromChain", "setFromToken", "setToChain", "setToToken", "inputAmount", "setInputAmount", "loadingStatus", "useMetaStore", "blockchains", "tokens", "setSelectedSwap", "useUiStore", "useEffect", "params", "createSearchParams", "value", "key", "requestId", "navigationRoutes", "fromChainString", "fromTokenString", "toChainString", "toTokenString", "fromAmount", "blockchain", "searchParamsToToken", "__name", "useWallets", "isEvmBlockchain", "AppRouter", "children", "props", "isRouterInContext", "useInRouterContext", "Router", "Fragment", "MemoryRouter", "blockchains", "useMetaStore", "canSwitchNetworkTo", "useWallets", "evmChains", "isEvmBlockchain", "useQueueManager", "React", "UpdateUrl", "__name", "React", "useEffect", "useNavigate", "HeaderLayout", "useWallets", "React", "useRoutes", "React", "useEffect", "useState", "useNavigate", "useWallets", "i18n", "useInRouterContext", "useNavigate", "useNavigateBack", "isRouterInContext", "useInRouterContext", "navigate", "useNavigate", "navigationRoutes", "__name", "currentRoute", "Divider", "ConfirmSwap", "LoadingFailedAlert", "HighSlippageWarning", "PercentageChange", "RoutesOverview", "TokenPreview", "useManager", "useEffect", "useRef", "useState", "BigNumber", "calculatePendingSwap", "useConfirmSwap", "fromToken", "useBestRouteStore", "toToken", "inputAmount", "initialRoute", "setBestRoute", "inputUsdValue", "affiliateRef", "useSettingsStore", "affiliatePercent", "affiliateWallets", "connectedWallets", "useWalletsStore", "destination", "selectedWallets", "meta", "useMetaStore", "customSlippage", "slippage", "disabledLiquiditySources", "userSlippage", "proceedAnywayRef", "useRef", "confiremedRouteRef", "abortControllerRef", "loading", "setLoading", "useState", "errors", "setErrors", "warnings", "setWarnings", "useEffect", "__name", "swapSettings", "calculatePendingSwap", "getWalletsForNewSwap", "requestBody", "createBestRouteRequestBody", "confiremedRoute", "httpService", "BigNumber", "prevState", "confirmSwapState", "isRouteChanged", "newRouteOutputUsdValue", "outputRatio", "getOutputRatio", "outputRatioHasWarning", "isOutputAmountChangedALot", "numberToString", "getRouteOutputAmount", "getPercentageChange", "isRouteInternalCoinsUpdated", "isNumberOfSwapsChanged", "isRouteSwappersUpdated", "balanceWarnings", "getBalanceWarnings", "minRequiredSlippage", "getMinRequiredSlippage", "hasProperSlippage", "noErrors", "noWarnings", "error", "status", "React", "BalanceErrors", "MinRequiredSlippage", "useNavigate", "ConfirmSwapErrors", "errors", "navigate", "useNavigate", "error", "React", "MinRequiredSlippage", "navigationRoutes", "BalanceErrors", "__name", "ConfirmSwapWarnings", "warnings", "warning", "__name", "ConfirmSwapPage", "customDestinationEnabled", "navigate", "useNavigate", "navigateBackFrom", "useNavigateBack", "bestRoute", "useBestRouteStore", "fetchingBestRoute", "fetchingBestRouteError", "setSelectedSwap", "useUiStore", "blockchains", "tokens", "useMetaStore", "loadingMetaStatus", "connectedWallets", "useWalletsStore", "selectedWallets", "customDestination", "setCustomDestination", "initSelectedWallets", "setSelectedWallet", "slippage", "useSettingsStore", "customSlippage", "inputUsdValue", "outputUsdValue", "setInputAmount", "dbErrorMessage", "setDbErrorMessage", "useState", "bestRouteloadingStatus", "getBestRouteStatus", "destinationChain", "setDestinationChain", "manager", "useManager", "fetchingConfirmedRoute", "errors", "warnings", "confirmSwap", "useConfirmSwap", "selectedSlippage", "showHighSlippageWarning", "error", "getWalletInfo", "connect", "useWallets", "firstStep", "lastStep", "fromAmount", "numberToString", "toAmount", "useEffect", "lastStepToBlockchain", "isWalletRequired", "swap", "selectableWallets", "getSelectableWallets", "handleConnectChain", "__name", "wallet", "network", "getKeplrCompatibleConnectedWallets", "compatibleWallet", "totalFeeInUsd", "getTotalFeeInUsd", "percentageChange", "getPercentageChange", "React", "ConfirmSwap", "getRequiredChains", "isValidCustomDestination", "navigationRoutes", "e", "confirmSwapDisabled", "isExperimentalChain", "TokenPreview", "i18n", "Divider", "PercentageChange", "RoutesOverview", "ConfirmSwapErrors", "ConfirmSwapWarnings", "LoadingFailedAlert", "HighSlippageWarning", "HIGH_SLIPPAGE", "History", "useManager", "React", "useNavigate", "getPendingSwaps", "__name", "manager", "result", "q", "id", "storage", "a", "b", "dayjs", "groupSwapsByDate", "__name", "swaps", "output", "now", "dayjs", "swap", "swapDate", "HistoryPage", "setSelectedSwap", "useUiStore", "navigate", "useNavigate", "navigateBackFrom", "useNavigateBack", "manager", "state", "useManager", "pendingSwaps", "getPendingSwaps", "swap", "loading", "React", "History", "groupSwapsByDate", "requestId", "navigationRoutes", "__name", "React", "useEffect", "useNavigate", "HomePanel", "React", "useEffect", "useRef", "useState", "useInRouterContext", "useSearchParams", "styled", "Button", "VerticalSwapIcon", "SwithFromAndTo", "count", "firstRender", "useRef", "searchParams", "setSearchParams", "useSearchParams", "outputAmount", "useBestRouteStore", "useEffect", "fromChainString", "fromTokenString", "toChainString", "toTokenString", "__name", "SwitchButtonContainer", "styled", "SwithFromAndToButton", "switchFromAndTo", "isRouterInContext", "useInRouterContext", "setCount", "useState", "React", "Button", "prev", "VerticalSwapIcon", "errorMessages", "BigNumber", "Home", "navigate", "useNavigate", "fromChain", "useBestRouteStore", "fromToken", "toChain", "toToken", "setInputAmount", "inputUsdValue", "inputAmount", "outputAmount", "outputUsdValue", "bestRoute", "tokens", "useMetaStore", "fetchingBestRoute", "bestRouteError", "loadingMetaStatus", "connectedWallets", "useWalletsStore", "setCurrentPage", "useUiStore", "errorMessage", "errorMessages", "needsToWarnEthOnPath", "showBestRoute", "outToInRatio", "getOutputRatio", "highValueLoss", "outputRatioHasWarning", "fromAmountRangeError", "recommendation", "swap", "LimitErrorMessage", "priceImpactCanNotBeComputed", "canComputePriceImpact", "swapButtonState", "getSwapButtonState", "hasLimitError", "totalFeeInUsd", "getTotalFeeInUsd", "highFee", "hasHighFee", "tokenBalance", "numberToString", "getBalanceFromWallet", "tokenBalanceReal", "useEffect", "navigationRoutes", "percentageChange", "getPercentageChange", "React", "HomePanel", "fetchBestRoute", "BigNumber", "route", "SwithFromAndToButton", "secondsToString", "totalArrivalTime", "getFormatedBestRoute", "__name", "LiquiditySourcesSelector", "React", "LiquiditySourcePage", "supportedSwappers", "swappers", "useMetaStore", "loadingMetaStatus", "toggleLiquiditySource", "useSettingsStore", "disabledLiquiditySources", "toggleAllLiquiditySources", "navigateBackFrom", "useNavigateBack", "uniqueSwappersGroups", "removeDuplicateFrom", "s", "swapperGroup", "type", "React", "LiquiditySourcesSelector", "item", "liquiditySource", "navigationRoutes", "__name", "React", "BlockchainSelector", "SelectChainPage", "props", "type", "supportedChains", "blockchains", "useMetaStore", "chain", "loadingStatus", "fromChain", "useBestRouteStore", "toChain", "setFromChain", "setToChain", "navigateBackFrom", "useNavigateBack", "React", "BlockchainSelector", "navigationRoutes", "__name", "React", "TokenSelector", "SelectTokenPage", "props", "navigateBackFrom", "useNavigateBack", "type", "supportedTokens", "sourceTokens", "useBestRouteStore", "destinationTokens", "supportedSourceTokens", "token", "supportedToken", "tokensAreEqual", "supportedDestinationTokens", "fromToken", "toToken", "setFromToken", "setToToken", "loadingMetaStatus", "useMetaStore", "React", "TokenSelector", "navigationRoutes", "__name", "React", "Settings", "useNavigate", "SettingsPage", "supportedSwappers", "singleTheme", "slippage", "useSettingsStore", "setSlippage", "disabledLiquiditySources", "customSlippage", "setCustomSlippage", "theme", "setTheme", "swappers", "useMetaStore", "navigate", "useNavigate", "navigateBackFrom", "useNavigateBack", "infiniteApprove", "toggleInfiniteApprove", "loadingMetaStatus", "uniqueSwappersGroups", "removeDuplicateFrom", "s", "swapperGroup", "type", "item", "supportedUniqueSwappersGroups", "React", "Settings", "SLIPPAGES", "navigationRoutes", "MIN_SLIPPGAE", "MAX_SLIPPAGE", "__name", "Alert", "SecondaryPage", "styled", "Wallet", "WalletState", "React", "useEffect", "useRef", "useState", "WalletTypes", "detectMobileScreens", "useWallets", "i18n", "Spinner", "LoadingFailedAlert", "allProviders", "matchAndGenerateProviders", "providers", "options", "all", "allProviders", "selectedProviders", "requestedProvider", "result", "provider", "__name", "configWalletsToWalletName", "config", "ListContainer", "styled", "LoaderContainer", "AlertContainer", "ALL_SUPPORTED_WALLETS", "WalletTypes", "WalletsPage", "supportedWallets", "multiWallets", "config", "navigateBackFrom", "useNavigateBack", "state", "disconnect", "getWalletInfo", "connect", "useWallets", "wallets", "getlistWallet", "configWalletsToWalletName", "walletsRef", "useRef", "sortedWallets", "detectMobileScreens", "wallet", "sortWalletsBasedOnState", "walletErrorMessage", "setWalletErrorMessage", "useState", "toggleConnectWalletsButton", "useUiStore", "loadingMetaStatus", "useMetaStore", "onSelectWallet", "__name", "type", "w", "WalletState", "e", "disconnectConnectingWallets", "connectingWallets", "useEffect", "React", "SecondaryPage", "i18n", "navigationRoutes", "Alert", "Spinner", "LoadingFailedAlert", "index", "Wallet", "React", "useManager", "SwapHistory", "useCopyToClipboard", "SwapDetailsPlaceholder", "cancelSwap", "PendingSwapNetworkStatus", "useWallets", "getCurrentBlockchainOfOrNull", "getCurrentStep", "getRelatedWalletOrNull", "timeSince", "timeMillis", "seconds", "intervalType", "interval", "__name", "getSwapDate", "pendingSwap", "useNavigate", "SwapDetailsPage", "selectedSwapRequestId", "useUiStore", "canSwitchNetworkTo", "connect", "getWalletInfo", "useWallets", "retry", "useBestRouteStore", "navigate", "useNavigate", "navigateBackFrom", "useNavigateBack", "isCopied", "handleCopy", "useCopyToClipboard", "manager", "state", "useManager", "selectedSwap", "getPendingSwaps", "swap", "onCancel", "__name", "cancelSwap", "loading", "React", "SwapDetailsPlaceholder", "navigationRoutes", "currentStep", "getCurrentStep", "currentStepBlockchain", "getCurrentBlockchainOfOrNull", "currentStepWallet", "getRelatedWalletOrNull", "currentStepNetworkStatus", "swapMessages", "getSwapMessages", "networkWarningState", "isNetworkStatusInWarningState", "swapDate", "getSwapDate", "shouldRetry", "shouldRetrySwap", "isMobileWallet", "walletType", "switchNetwork", "PendingSwapNetworkStatus", "lastConvertedTokenInFailedSwap", "getLastConvertedTokenInFailedSwap", "SwapHistory", "getFormatedPendingSwap", "getAbsolutePath", "__name", "path", "AppRoutes", "props", "config", "useRoutes", "navigationRoutes", "React", "Home", "SelectChainPage", "SelectTokenPage", "SettingsPage", "LiquiditySourcePage", "HistoryPage", "SwapDetailsPage", "WalletsPage", "ConfirmSwapPage", "Layout", "config", "navigate", "useNavigate", "connectedWallets", "selectedWallets", "useWalletsStore", "getWalletInfo", "useWallets", "connectedWalletsImages", "removeDuplicateFrom", "getSelectableWallets", "w", "blockchains", "tokens", "useMetaStore", "setFromChain", "useBestRouteStore", "setFromToken", "setToChain", "setToToken", "setInputAmount", "setAffiliateRef", "useSettingsStore", "setAffiliatePercent", "setAffiliateWallets", "totalBalance", "calculateWalletUsdValue", "connectWalletsButtonDisabled", "useUiStore", "loadingMetaStatus", "fetchingBalance", "fetchingBalanceSelector", "useEffect", "chain", "token", "t", "tokensAreEqual", "React", "HeaderLayout", "navigationRoutes", "AppRoutes", "__name", "globalCss", "globalFont", "__name", "fontFamily", "globalCss", "createTheme", "generateRangeColors", "useState", "useEffect", "useLayoutEffect", "useEffect", "useRef", "usePrevious", "value", "ref", "useRef", "useEffect", "__name", "useTheme", "themeColors", "fontFamily", "borderRadius", "mode", "theme", "useSettingsStore", "fetchMeta", "useMetaStore", "setTheme", "light", "dark", "neutral", "background", "foreground", "darkColors", "generateRangeColors", "lightColors", "customLightTheme", "createTheme", "customDarkTheme", "OSTheme", "setOSTheme", "useState", "useEffect", "switchTheme", "__name", "event", "prevFont", "usePrevious", "useLayoutEffect", "classList", "React", "useMemo", "ManagerProvider", "makeQueueDefinition", "checkWaitingForNetworkChange", "useWallets", "convertEvmBlockchainMetaToEvmChainInfo", "isEvmBlockchain", "QueueManager", "props", "providers", "getSigners", "state", "connect", "canSwitchNetworkTo", "getWalletInfo", "useWallets", "swapQueueDef", "useMemo", "makeQueueDefinition", "getConfig", "blockchains", "useMetaStore", "wallets", "useWalletsStore", "wallet", "switchNetwork", "__name", "network", "isMobileWallet", "walletType", "allBlockchains", "blockchain", "blockchainsObj", "evmBasedChains", "isEvmBlockchain", "getSupportedChainNames", "type", "supportedChains", "walletAndSupportedChainsNames", "allProviders", "context", "convertEvmBlockchainMetaToEvmChainInfo", "React", "ManagerProvider", "manager", "checkWaitingForNetworkChange", "QueueManager_default", "React", "Events", "Provider", "isEvmBlockchain", "useEffect", "useWalletProviders", "providers", "options", "clearConnectedWallet", "useWalletsStore", "generateProviders", "matchAndGenerateProviders", "useEffect", "__name", "createContext", "useRef", "WidgetContext", "createContext", "WidgetWallets", "props", "blockchains", "useMetaStore", "providers", "useWalletProviders", "disconnectWallet", "useWalletsStore", "connectWallet", "onConnectWalletHandler", "useRef", "evmBasedChainNames", "isEvmBlockchain", "chain", "onUpdateState", "__name", "type", "event", "value", "state", "supportedChains", "Events", "supportedChainNames", "walletAndSupportedChainsNames", "data", "prepareAccountsForWalletStore", "key", "React", "handler", "Provider", "useEffect", "useEvents", "MainEvents", "StepEventType", "StepExecutionEventStatus", "isApprovalTX", "WidgetEvents", "connectedWallets", "useWalletsStore", "getWalletsDetails", "widgetEvents", "useEvents", "useEffect", "MainEvents", "widgetEvent", "event", "step", "StepEventType", "StepExecutionEventStatus", "isApprovalTX", "fromAccount", "account", "toAccount", "wallet", "__name", "MainContainer", "styled", "Main", "props", "config", "globalFont", "activeTheme", "useTheme", "lastConnectedWalletWithNetwork", "setLastConnectedWalletWithNetwork", "useState", "disconnectedWallet", "setDisconnectedWallet", "currentPage", "useUiStore", "widgetContext", "useContext", "WidgetContext", "useMemo", "initConfig", "useEffect", "useSettingsStore", "React", "I18nManager", "QueueManager_default", "WidgetEvents", "SwapContainer", "navigationRoutes", "AppRouter", "Layout", "__name", "Widget", "WidgetWallets", "useWallets", "useWidgetEvents", "MainEvents", "RouteEventType", "StepEventType", "StepExecutionEventStatus", "StepExecutionBlockedEventStatus"]
7
7
  }