{"version":3,"sources":["assets/images/walletConnectIcon.svg","assets/svg/logo.png","assets/images sync /^/.//.*$","assets/images/blue-loader.svg","assets/images/noise.png","assets/images/thunder.jpg","assets/images/xdai-logo.png","assets/images/xl_uni.png","assets/svg/tokenlist.svg","assets/images/arrow-down-blue.svg","assets/images/arrow-down-grey.svg","assets/images/arrow-right-white.png","assets/images/arrow-right.svg","assets/images/big_unicorn.png","assets/images/circle-grey.svg","assets/images/circle.svg","assets/images/coinbaseWalletIcon.svg","assets/images/dropdown-blue.svg","assets/images/dropdown.svg","assets/images/dropup-blue.svg","assets/images/ethereum-logo.png","assets/images/fortmaticIcon.png","assets/images/lightmode.svg","assets/images/link.svg","assets/images/magnifying-glass.svg","assets/images/managelist.svg","assets/images/menu.svg","assets/images/plus-blue.svg","assets/images/plus-grey.svg","assets/images/portisIcon.png","assets/images/question-mark.svg","assets/images/question.svg","assets/images/spinner.svg","assets/images/token-list/lists-dark.png","assets/images/token-list/lists-light.png","assets/images/token-logo.png","assets/images/trustWallet.png","assets/images/x.svg","connectors/NetworkConnector.ts","connectors/index.ts","constants/index.ts","constants/proposals/index.ts","constants/proposals/uniswap_grants.ts","hooks/index.ts","components/Blocklist/index.tsx","i18n.ts","components/analytics/GoogleAnalyticsReporter.tsx","constants/lists.ts","utils/listSort.ts","state/lists/hooks.ts","state/application/actions.ts","state/application/hooks.ts","state/multicall/actions.ts","state/multicall/hooks.ts","utils/index.ts","constants/abis/erc20.ts","constants/abis/migrator.ts","constants/multicall/index.ts","constants/v1/index.ts","hooks/useContract.ts","components/SearchModal/filtering.ts","hooks/Tokens.ts","state/user/actions.ts","state/user/hooks.tsx","state/wallet/hooks.ts","components/Card/index.tsx","webpack:///./src/assets/images/menu.svg?4992","hooks/useOnClickOutside.tsx","theme/components.tsx","theme/index.tsx","components/Menu/index.tsx","components/Row/index.tsx","utils/isZero.ts","hooks/useDebounce.ts","hooks/useENSName.ts","hooks/useSocksBalance.ts","state/transactions/actions.ts","state/transactions/hooks.tsx","components/Button/index.tsx","components/Identicon/index.tsx","components/Loader/index.tsx","webpack:///./src/assets/images/x.svg?844a","hooks/usePrevious.ts","components/AccountDetails/Copy.tsx","hooks/useCopyClipboard.ts","components/AccountDetails/Transaction.tsx","components/AccountDetails/index.tsx","components/Modal/index.tsx","components/WalletModal/Option.tsx","components/WalletModal/PendingView.tsx","components/WalletModal/index.tsx","components/Web3Status/index.tsx","webpack:///./src/assets/images/lightmode.svg?6d28","components/Toggle_/index.tsx","utils/AddTokenToMetamask.ts","components/Header/index.tsx","components/Header/Polling.tsx","components/Header/URLWarning.tsx","components/Column/index.tsx","state/lists/actions.ts","utils/listVersionLabel.ts","components/Popups/ListUpdatePopup.tsx","components/Popups/TransactionPopup.tsx","components/Popups/PopupItem.tsx","components/Popups/index.tsx","components/Web3ReactManager/index.tsx","theme/DarkModeQueryParamReader.tsx","utils/wrappedCurrency.ts","components/TransactionConfirmationModal/index.tsx","hooks/useAddTokenToMetamask.ts","hooks/useLast.ts","hooks/useInterval.ts","components/Popover/index.tsx","components/Tooltip/index.tsx","components/QuestionHelper/index.tsx","utils/contenthashToUri.ts","utils/parseENSAddress.ts","utils/uriToHttp.ts","hooks/useHttpLocations.ts","hooks/useENSContentHash.ts","components/Logo/index.tsx","components/CurrencyLogo/index.tsx","components/SearchModal/CommonBases.tsx","components/SearchModal/styleds.tsx","components/ListLogo/index.tsx","hooks/useTheme.ts","components/SearchModal/ImportRow.tsx","components/SearchModal/CurrencyList.tsx","components/SearchModal/sorting.ts","hooks/useToggle.ts","components/SearchModal/CurrencySearch.tsx","components/swap/styleds.tsx","components/SearchModal/ImportToken.tsx","utils/getTokenList.ts","utils/resolveENSContentHash.ts","hooks/useFetchListCallback.ts","hooks/useColor.ts","components/Toggle/ListToggle.tsx","components/SearchModal/ManageLists.tsx","components/SearchModal/ManageTokens.tsx","components/SearchModal/Manage.tsx","components/SearchModal/ImportList.tsx","components/SearchModal/CurrencySearchModal.tsx","components/DoubleLogo/index.tsx","components/NumericalInput/index.tsx","webpack:///./src/assets/images/dropdown.svg?d0dc","components/CurrencyInputPanel/index.tsx","components/NavigationTabs/index.tsx","data/TotalSupply.ts","utils/currencyId.ts","components/earn/styled.ts","components/PositionCard/index.tsx","data/Reserves.ts","hooks/useToggledVersion.ts","hooks/useParsedQueryString.ts","data/V1.ts","state/swap/actions.ts","hooks/useApproveCallback.ts","state/mint/actions.ts","utils/prices.ts","data/Allowances.ts","hooks/useCurrentBlockTimestamp.ts","hooks/useTransactionDeadline.ts","hooks/useENSAddress.ts","hooks/useENS.ts","hooks/Trades.ts","state/swap/hooks.ts","state/mint/hooks.ts","utils/maxAmountSpend.ts","pages/AppBody.tsx","pages/Pool/styleds.tsx","pages/AddLiquidity/ConfirmAddModalBottom.tsx","pages/AddLiquidity/PoolPriceBar.tsx","constants/abis/staking-rewards.ts","state/stake/hooks.ts","pages/AddLiquidity/index.tsx","pages/AddLiquidity/redirects.tsx","pages/MigrateV1/EmptyState.tsx","components/PositionCard/V1.tsx","pages/MigrateV1/index.tsx","components/FormattedCurrencyAmount/index.tsx","pages/MigrateV1/MigrateV1Exchange.tsx","pages/MigrateV1/RemoveV1Exchange.tsx","pages/Pool/index.tsx","pages/PoolFinder/index.tsx","components/Slider/index.tsx","state/burn/actions.ts","state/burn/hooks.ts","pages/RemoveLiquidity/index.tsx","utils/useDebouncedChangeHandler.tsx","pages/RemoveLiquidity/redirects.tsx","components/AddressInputPanel/index.tsx","components/swap/FormattedPriceImpact.tsx","components/swap/SwapModalFooter.tsx","components/swap/SwapModalHeader.tsx","components/swap/ConfirmSwapModal.tsx","components/swap/SwapRoute.tsx","components/swap/AdvancedSwapDetails.tsx","components/swap/AdvancedSwapDetailsDropdown.tsx","components/swap/BetterTradeLink.tsx","components/swap/TradePrice.tsx","components/TokenWarningModal/index.tsx","components/ProgressSteps/index.tsx","hooks/useSwapCallback.ts","hooks/useWrapCallback.ts","utils/v1SwapArguments.ts","components/Toggle/index.tsx","components/TransactionSettings/index.tsx","components/Settings/index.tsx","components/SwapMenu/index.tsx","pages/Swap/index.tsx","components/swap/confirmPriceImpactWithoutFee.ts","pages/Swap/redirects.tsx","pages/App.tsx","state/application/reducer.ts","state/global/actions.ts","state/user/reducer.ts","state/transactions/reducer.ts","state/swap/reducer.ts","state/mint/reducer.ts","state/lists/reducer.ts","state/burn/reducer.ts","state/multicall/reducer.ts","state/index.ts","hooks/useIsWindowVisible.ts","state/application/updater.ts","state/lists/updater.ts","utils/retry.ts","state/multicall/updater.tsx","utils/chunkArray.ts","state/transactions/updater.tsx","state/user/updater.tsx","utils/getLibrary.ts","index.tsx","assets/images/metamask.png"],"names":["module","exports","map","webpackContext","req","id","webpackContextResolve","__webpack_require__","o","e","Error","code","keys","Object","resolve","RequestError","message","data","MiniRpcProvider","chainId","url","batchWaitTimeMs","isMetaMask","host","path","nextId","batchTimeoutId","batch","clearBatch","a","console","debug","fetch","method","headers","accept","body","JSON","stringify","item","request","response","forEach","reject","ok","status","statusText","json","byKey","reduce","memo","current","result","error","sendAsync","callback","params","then","jsonrpc","catch","toString","promise","Promise","push","setTimeout","this","parsed","URL","pathname","NetworkConnector","urls","defaultChainId","invariant","length","supportedChainIds","k","Number","providers","currentChainId","accumulator","provider","account","AbstractConnector","NETWORK_URL","process","NETWORK_CHAIN_ID","parseInt","networkLibrary","network","injected","InjectedConnector","walletconnect","WalletConnectConnector","rpc","100","bridge","qrcode","pollingInterval","ROUTER_ADDRESS","Map","USDC","Token","ChainId","XDAI","XDAI_WETH","STAKE","LEVIN","UNI_ADDRESS","UNI","MAINNET","RINKEBY","ROPSTEN","GÖRLI","KOVAN","WETH_ONLY","WETH","BASES_TO_CHECK_TRADES_AGAINST","CUSTOM_BASES","SUGGESTED_BASES","BASES_TO_TRACK_LIQUIDITY_FOR","PINNED_PAIRS","SUPPORTED_WALLETS","INJECTED","connector","name","iconName","description","href","color","primary","METAMASK","WALLET_CONNECT","mobile","BIG_INT_ZERO","JSBI","BigInt","ONE_BIPS","Percent","BIPS_BASE","ALLOWED_PRICE_IMPACT_LOW","ALLOWED_PRICE_IMPACT_MEDIUM","ALLOWED_PRICE_IMPACT_HIGH","PRICE_IMPACT_WITHOUT_FEE_CONFIRM_MIN","BLOCKED_PRICE_IMPACT_NON_EXPERT","MIN_ETH","exponentiate","BETTER_TRADE_LINK_THRESHOLD","BLOCKED_ADDRESSES","useActiveWeb3React","context","useWeb3ReactCore","contextNetwork","active","Blocklist","children","useMemo","Boolean","indexOf","i18next","use","XHR","LanguageDetector","initReactI18next","init","backend","loadPath","react","useSuspense","fallbackLng","preload","keySeparator","interpolation","escapeValue","GoogleAnalyticsReporter","location","search","useEffect","ReactGA","pageview","UNSUPPORTED_LIST_URLS","DEFAULT_LIST_OF_LISTS","DEFAULT_ACTIVE_LIST_URLS","sortByListPriority","urlA","urlB","first","includes","MAX_SAFE_INTEGER","second","WrappedTokenInfo","tokenInfo","tags","address","decimals","symbol","logoURI","EMPTY_LIST","listCache","WeakMap","listToTokenMap","list","get","tokens","tokenMap","tagId","filter","x","token","undefined","set","useAllLists","useSelector","state","lists","byUrl","combineMaps","map1","map2","1","3","4","5","42","useCombinedTokenMapFromUrls","slice","sort","allTokens","currentUrl","assign","useActiveListUrls","activeListUrls","useCombinedActiveList","activeTokens","useCombinedInactiveList","allActiveListUrls","useInactiveListUrls","ApplicationModal","updateBlockNumber","createAction","setOpenModal","addPopup","removePopup","useBlockNumber","application","blockNumber","useModalOpen","modal","openModal","useToggleModal","open","dispatch","useDispatch","useCallback","useWalletModalToggle","WALLET","useToggleSettingsMenu","SETTINGS","useRemovePopup","key","ADDRESS_REGEX","LOWER_HEX_REGEX","toCallKey","call","test","callData","parseCallKey","callKey","pcs","split","addMulticallListeners","removeMulticallListeners","fetchingMulticallResults","errorFetchingMulticallResults","updateMulticallResults","isMethodArg","isValidMethodArgs","Array","isArray","every","xi","INVALID_RESULT","valid","NEVER_RELOAD","blocksPerFetch","Infinity","useCallsData","calls","options","callResults","multicall","serializedCallKeys","c","callKeys","parse","INVALID_CALL_STATE","loading","syncing","LOADING_CALL_STATE","toCallState","callResult","contractInterface","fragment","latestBlockNumber","success","decodeFunctionResult","useSingleContractMultipleData","contract","methodName","callInputs","interface","getFunction","results","inputs","encodeFunctionData","useMultipleContractSingleData","addresses","useSingleCallResult","isAddress","value","getAddress","ETHERSCAN_PREFIXES","getEtherscanLink","type","prefix","shortenAddress","chars","substring","calculateGasMargin","mul","BigNumber","from","add","div","calculateSlippageAmount","slippage","divide","multiply","raw","getContract","ABI","library","AddressZero","Contract","getSigner","connectUnchecked","getProviderOrSigner","getRouterContract","_","IUniswapV2Router02ABI","ERC20_INTERFACE","Interface","ERC20_ABI","ERC20_BYTES32_ABI","MIGRATOR_ADDRESS","MULTICALL_NETWORKS","V1_FACTORY_ADDRESSES","V1_FACTORY_ABI","V1_EXCHANGE_ABI","useContract","withSignerIfPossible","useV1FactoryContract","useV1ExchangeContract","useTokenContract","tokenAddress","useENSRegistrarContract","ENS_ABI","useENSResolverContract","ENS_PUBLIC_RESOLVER_ABI","useMulticallContract","MULTICALL_ABI","filterTokens","searchingAddress","lowerSearchParts","toLowerCase","s","matchesSearch","sParts","p","some","sp","startsWith","endsWith","useSortedTokensByQuery","searchQuery","symbolMatch","exactMatches","symbolSubtrings","rest","trim","useTokensFromMap","includeUserAdded","userAddedTokens","useUserAddedTokens","mapWithoutUrls","newMap","useAllTokens","useAllInactiveTokens","inactiveTokens","activeTokensAddresses","useIsUserAddedToken","currency","find","currencyEquals","BYTES32_REGEX","parseStringOrBytes32","str","bytes32","defaultValue","arrayify","parseBytes32String","useToken","tokenContract","tokenContractBytes32","useBytes32TokenContract","tokenName","tokenNameBytes32","symbolBytes32","useCurrency","currencyId","isETH","toUpperCase","ETHER","updateMatchesDarkMode","updateUserDarkMode","updateUserExpertMode","updateUserSlippageTolerance","updateUserDeadline","addSerializedToken","removeSerializedToken","addSerializedPair","removeSerializedPair","toggleURLWarning","serializeToken","deserializeToken","serializedToken","useIsDarkMode","user","matchesDarkMode","userDarkMode","shallowEqual","useDarkModeManager","darkMode","toggleSetDarkMode","useIsExpertMode","userExpertMode","useExpertModeManager","expertMode","toggleSetExpertMode","useUserSlippageTolerance","userSlippageTolerance","serializedTokensMap","values","serializePair","pair","token0","token1","useURLWarningVisible","URLWarningVisible","toV2LiquidityToken","tokenA","tokenB","Pair","useTrackedTokenPairs","pinnedPairs","generatedPairs","flatMap","base","savedSerializedPairs","pairs","userPairs","forChain","pairId","combinedList","concat","keyed","sorted","sortsBefore","useETHBalances","uncheckedAddresses","multicallContract","i","CurrencyAmount","ether","useTokenBalancesWithLoadingIndicator","validatedTokens","t","balances","vt","anyLoading","callState","amount","TokenAmount","useTokenBalances","useTokenBalance","tokenBalances","useCurrencyBalances","currencies","ethBalance","useCurrencyBalance","Card","styled","Box","padding","border","borderRadius","LightCard","theme","bg2","bg1","LightGreyCard","GreyCard","bg3","YellowCard","yellow2","PinkCard","primary1","BlueCardStyled","primary5","BlueCard","fontWeight","_extends","target","arguments","source","prototype","hasOwnProperty","apply","_objectWithoutProperties","excluded","sourceKeys","_objectWithoutPropertiesLoose","getOwnPropertySymbols","sourceSymbolKeys","propertyIsEnumerable","createElement","d","stroke","strokeWidth","strokeLinecap","strokeLinejoin","_ref","svgRef","title","props","width","height","viewBox","fill","ref","ForwardRef","forwardRef","useOnClickOutside","node","handler","handlerRef","useRef","handleClickOutside","contains","document","addEventListener","removeEventListener","ButtonText","button","LinkIconWrapper","LinkIcon","LinkIconFeather","blue1","ExternalLinkIcon","rel","handleClick","event","ctrlKey","metaKey","outboundLink","label","preventDefault","window","onClick","IconWrapper","size","marginRight","marginLeft","TrashIcon","Trash","text3","CloseIcon","attrs","warning","backgroundColor","red1","white","darken","text4","X","LinkStyledButton","disabled","text2","StyledInternalLink","Link","StyledLink","rotateImg","keyframes","img","ExternalLink","rotate","Spinner","BackArrowLink","text1","BackArrow","to","CustomLightSpinner","HideSmall","span","mediaWidth","upToSmall","HideExtraSmall","upToExtraSmall","ExtraSmallOnly","MEDIA_WIDTHS","upToMedium","upToLarge","mediaWidthTemplates","b","css","colors","black","grd1","grd2","grd3","grd4","grd5","grd6","text5","bg4","bg5","modalBG","advancedBG","primary2","primary3","primary4","primary6","primaryText1","secondary1","secondary2","secondary3","red2","green1","yellow1","grey1","ThemeProvider","themeObject","grids","sm","md","lg","shadow1","flexColumnNoWrap","flexRowNoWrap","TextWrapper","Text","TYPE","fontSize","fontStyle","FixedGlobalStyle","createGlobalStyle","ThemedGlobalStyle","transparentize","StyledMenuIcon","MenuIcon","StyledMenuButton","StyledMenu","MenuFlyout","MenuItem","Menu","MENU","toggle","Row","align","RowBetween","RowFlat","AutoRow","gap","justify","RowFixed","isZero","hexNumberString","useDebounce","delay","useState","debouncedValue","setDebouncedValue","clearTimeout","useENSName","debouncedAddress","ensNodeArgument","namehash","substr","resolverAddress","resolverAddressResult","changed","ENSName","useSocksBalance","UNISOCKS_ABI","addTransaction","clearAllTransactions","finalizeTransaction","checkedTransaction","useTransactionAdder","summary","approval","claim","hash","useAllTransactions","transactions","useIsTransactionPending","transactionHash","receipt","isTransactionRecent","tx","Date","getTime","addedTime","Base","RebassButton","ButtonPrimary","altDisabledStyle","ButtonLight","ButtonSecondary","ButtonUNIGradient","ButtonOutlined","ButtonEmpty","ButtonConfirmedStyle","lighten","ButtonErrorStyle","ButtonConfirmed","confirmed","ButtonError","ButtonDropdownLight","style","display","alignItems","StyledIdenticonContainer","Identicon","innerHTML","appendChild","Jazzicon","StyledSVG","svg","Loader","xmlns","x1","y1","x2","y2","className","usePrevious","CopyIcon","TransactionStatusText","CopyHelper","timeout","isCopied","setIsCopied","staticCopy","text","didCopy","copy","hide","useCopyClipboard","setCopied","toCopy","TransactionWrapper","TransactionState","pending","Transaction","allTransactions","HeaderRow","UpperSection","InfoCard","AccountGroupingRow","AccountSection","YourAccount","LowerSection","AccountControl","AddressLink","CloseColor","Close","WalletName","TransactionListWrapper","WalletAction","renderTransactions","AccountDetails","toggleWalletModal","pendingTransactions","confirmedTransactions","openOptions","useContext","ThemeContext","getStatusIcon","src","WalletConnectIcon","alt","clearAllTransactionsCallback","ethereum","formatConnectorName","close","hasENS","isENS","mb","justifyContent","AnimatedDialogOverlay","animated","DialogOverlay","StyledDialogOverlay","AnimatedDialogContent","DialogContent","StyledDialogContent","minHeight","maxHeight","isOpen","Modal","onDismiss","initialFocusRef","fadeTransition","useTransition","config","duration","opacity","enter","leave","useSpring","y","mass","tension","friction","bind","useGesture","onDrag","down","movement","velocity","direction","isMobile","transform","interpolate","aria-label","tabIndex","OptionCard","OptionCardLeft","OptionCardClickable","clickable","GreenCircle","CircleWrapper","HeaderText","SubHeader","Option","link","header","subheader","icon","content","PendingSection","StyledLoader","LoadingMessage","ErrorGroup","ErrorButton","LoadingWrapper","PendingView","setPendingError","tryActivation","isMetamask","option","require","Wrapper","ContentWrapper","Blurb","OptionGrid","HoverText","WALLET_VIEWS","WalletModal","useWeb3React","activate","walletView","setWalletView","pendingWallet","setPendingWallet","pendingError","walletModalOpen","previousAccount","activePrevious","connectorPrevious","category","action","walletConnectProvider","wc","uri","UnsupportedChainIdError","web3","MetamaskIcon","mobileOnly","getOptions","Web3StatusGeneric","Web3StatusError","Web3StatusConnect","faded","Web3StatusConnected","NetworkIcon","Activity","newTransactionsFirst","SOCK","role","marginTop","marginBottom","StatusIcon","Web3StatusInner","useTranslation","hasPendingTransactions","hasSocks","balance","greaterThan","useHasSocks","Web3Status","sortedRecentTransactions","cx","cy","r","StyledLightIcon","LightIcon","Toggle","image","log","HeaderFrame","HeaderControls","HeaderElement","HeaderElementWrap","HeaderLinks","AccountElement","Ramp","LevinToken","NetworkCard","BalanceText","Title","UniIcon","NETWORK_LABELS","Header","userEthBalance","handleAddLvn","addTokenToMetamask","startMtp","script","async","onload","onerror","showMtpModal","lang","_ctkn","tabs","rfr","bsc","bdc","ssc","sdc","ssa","wsc","wsa","wdc","toggleDarkMode","LogoDark","Metamask","pointerEvents","flexShrink","pl","pr","toSignificant","isActive","StyledPolling","StyledPollingDot","rotate360","Polling","isMounted","setIsMounted","timer1","PhishAlert","StyledClose","URLWarning","useURLWarningToggle","showURLWarning","hostname","Column","ColumnCenter","AutoColumn","fetchTokenList","fulfilled","rejected","addList","removeList","enableList","disableList","acceptListUpdate","listVersionLabel","version","major","minor","patch","ChangesList","ul","ListUpdatePopup","popKey","listUrl","oldList","newList","auto","removeThisPopup","handleAcceptUpdate","diffTokenLists","tokensAdded","added","tokensChanged","tokensRemoved","removed","numTokensChanged","flex","Fragment","flexGrow","RowNoFlex","TransactionPopup","paddingRight","Popup","Fader","AnimatedFader","PopupItem","removeAfterMs","popupContent","txn","listUpdate","faderStyle","MobilePopupWrapper","MobilePopupInner","FixedPopupColumn","extraPadding","Popups","activePopups","popupList","show","useActivePopups","urlWarningActive","reverse","MessageWrapper","Message","h2","Web3ReactManager","networkActive","networkError","activateNetwork","triedEager","tried","setTried","isAuthorized","useEagerConnect","suppress","on","handleChainChanged","handleAccountsChanged","accounts","removeListener","useInactiveListener","showLoader","setShowLoader","DarkModeQueryParamReader","parseArrays","ignoreQueryPrefix","wrappedCurrency","wrappedCurrencyAmount","currencyAmount","unwrappedToken","equals","Section","BottomSection","ConfirmedIcon","StyledLogo","ConfirmationPendingContent","pendingText","Circle","textAlign","TransactionSubmittedContent","currencyToAdd","setSuccess","addToken","useAddTokenToMetamask","mt","MetaMaskLogo","margin","ConfirmationModalContent","bottomContent","topContent","TransactionErrorContent","TransactionConfirmationModal","attemptingTxn","useLast","filterFn","last","setLast","isDefined","useInterval","leading","savedCallback","tick","setInterval","clearInterval","PopoverContainer","ReferenceElement","Arrow","Popover","placement","referenceElement","setReferenceElement","popperElement","setPopperElement","arrowElement","setArrowElement","usePopper","strategy","modifiers","offset","element","styles","update","attributes","popper","arrow","TooltipContainer","Tooltip","MouseoverTooltip","setShow","onMouseEnter","onMouseLeave","QuestionWrapper","QuestionHelper","UTF_8_DECODER","TextDecoder","contenthashToUri","contenthash","buff","hex","arr","Uint8Array","hexToUint8Array","codec","getCodec","rmPrefix","cid","CID","toB58String","multihash","decode","digest","ENS_NAME_REGEX","parseENSAddress","ensAddress","match","ensName","ensPath","uriToHttp","useHttpLocations","ens","resolvedContentHash","useENSContentHash","BAD_SRCS","Logo","srcs","refresh","onError","getTokenLogoURL","StyledxDaiLogo","CurrencyLogo","uriLocations","xDai","xDaiLogo","BaseWrapper","disable","CommonBases","onSelect","selectedCurrency","selected","Checkbox","input","PaddedColumn","TextDot","SearchInput","Separator","SeparatorDark","StyledListLogo","ListLogo","useTheme","TokenSection","dim","CheckIcon","CheckCircle","NameOverflow","ImportRow","showImportView","setImportToken","inactiveTokenList","isAdded","useIsTokenActive","ml","mr","minWidth","currencyKey","StyledBalanceText","Tag","FixedContentRow","Balance","toExact","TagContainer","TokenListLogoWrapper","TokenTags","tag","join","CurrencyRow","isSelected","otherSelected","isOnSelectedList","defaultTokens","isTokenOnList","customAdded","justifySelf","CurrencyList","onCurrencySelect","otherCurrency","fixedListRef","showETH","breakIndex","itemData","formatted","Currency","index","showImport","TokenListLogo","itemKey","itemCount","itemSize","useTokenComparator","inverted","useAllTokenBalances","comparator","balanceComp","balanceA","balanceB","equalTo","balanceComparator","getTokenComparator","useToggle","initialState","setState","Footer","CurrencySearch","otherSelectedCurrency","showCommonBases","showManageView","fixedList","setSearchQuery","debouncedQuery","invertSearchOrder","isAddressSearch","searchToken","searchTokenIsAdded","tokenComparator","filteredTokens","filteredSortedTokens","handleCurrencySelect","inputRef","handleInput","checksummedInput","scrollTo","handleEnter","useFoundOnInactiveList","filteredInactiveTokens","ManageCenterStyled","placeholder","autoComplete","onChange","onKeyDown","disableWidth","ArrowWrapper","SectionBreak","BottomGrouping","ErrorText","severity","StyledBalanceMaxMini","TruncatedText","Dots","SwapCallbackErrorInner","SwapCallbackErrorInnerAlertTriangle","SwapCallbackError","SwapShowAcceptChanges","WarningWrapper","highWarning","AddressText","ImportToken","onBack","setConfirmed","useAddUserToken","fromLists","cursor","checked","tokenListValidator","Ajv","allErrors","compile","schema","getTokenList","resolveENSContentHash","parsedENS","contentHashUri","translatedUri","isLast","validationErrors","errors","dataPath","REGISTRAR_ABI","constant","outputs","payable","stateMutability","RESOLVER_ABI","internalType","resolverContract","ensRegistrarContract","resolver","useFetchListCallback","ensResolver","Web3Provider","getNetworkLibrary","sendDispatch","requestId","nanoid","tokenList","errorMessage","Vibrant","getPalette","palette","detectedHex","AAscore","shade","formattedPath","useColor","setColor","useLayoutEffect","stale","getColorFromToken","tokenColor","useListColor","listImageUri","getColorFromUriPath","ToggleElement","bgColor","StatusText","ListToggle","UnpaddedLinkStyledButton","StyledTitleText","StyledListUrlText","RowWrapper","listUrlRowHTMLId","replace","ListRow","listsByUrl","pendingUpdate","listColor","useIsListActive","handleAcceptListUpdate","handleRemoveList","prompt","handleEnableList","handleDisableList","ListContainer","ManageLists","setModalView","setImportList","setListUrl","listUrlInput","setListUrlInput","activeCopy","setActiveCopy","fetchList","validUrl","sortedLists","u1","u2","l1","l2","tempList","setTempList","addError","setAddError","fetchTempList","isImported","handleImport","CurrencyModalView","importList","textOverflow","overflow","paddingTop","ManageTokens","removeToken","useRemoveUserAddedToken","handleRemoveAll","importToken","ToggleWrapper","ToggleOption","Manage","showLists","setShowLists","paddingBottom","ImportList","listURL","adding","loadingRequestId","handleAddList","manage","CurrencySearchModal","modalView","lastOpen","prevView","sizeraw","HigherLogo","CoveredLogo","DoubleCurrencyLogo","currency0","currency1","StyledInput","inputRegex","RegExp","Input","React","onUserInput","nextUserInput","inputMode","autoCorrect","pattern","minLength","maxLength","spellCheck","InputRow","CurrencySelect","LabelRow","Aligner","StyledDropDown","DropDown","InputPanel","hideInput","Container","StyledTokenName","StyledBalanceMax","CurrencyInputPanel","onMax","showMaxButton","disableCurrencySelect","hideBalance","customBalanceText","modalOpen","setModalOpen","selectedCurrencyBalance","handleDismissSearch","val","Tabs","StyledNavLink","NavLink","activeClassName","StyledNavLinkLiquidity","ActiveText","StyledArrowLeft","ArrowLeft","SwapMenuStyled","RowStyled","SwapPoolTabs","FindPoolTabs","AddRemoveTabs","creating","useTotalSupply","totalSupply","uImage","desaturate","xlUnicorn","CardNoise","noise","FixedHeightRow","HoverCard","StyledPositionCard","MinimalPositionCard","showUnwrapped","showMore","setShowMore","userPoolBalance","liquidityToken","totalPoolTokens","poolTokenPercentage","greaterThanOrEqual","getLiquidityValue","token0Deposited","token1Deposited","toFixed","FullPositionCard","stakedBalance","userDefaultPoolBalance","as","PairState","PAIR_INTERFACE","IUniswapV2PairABI","usePairs","currencyA","currencyB","reserves","LOADING","INVALID","NOT_EXISTS","reserve0","reserve1","EXISTS","usePair","Version","useParsedQueryString","useLocation","DEFAULT_VERSION","v2","useToggledVersion","v1","useV1ExchangeAddress","MockV1Pair","etherAmount","tokenAmount","useMockV1Pair","inputCurrency","v1PairAddress","tokenBalance","ETHBalance","useAllTokenV1Exchanges","factory","args","ix","useUserHasLiquidityInAllTokens","exchanges","getTradeVersion","trade","isV1","route","useV1TradeExchangeAddress","inputAmount","outputAmount","Field","ZERO_PERCENT","ONE_HUNDRED_PERCENT","isTradeBetter","tradeA","tradeB","minimumDelta","tradeType","executionPrice","lessThan","ApprovalState","selectCurrency","switchCurrencies","typeInput","replaceSwapState","setRecipient","BASE_FEE","INPUT_FRACTION_AFTER_FEE","subtract","computeTradePriceBreakdown","realizedLPFee","currentFee","priceImpactWithoutFeeFraction","priceImpact","priceImpactWithoutFee","numerator","denominator","quotient","computeSlippageAdjustedAmounts","allowedSlippage","num","pct","INPUT","maximumAmountIn","OUTPUT","minimumAmountOut","warningSeverity","useApproveCallback","amountToApprove","spender","currentAllowance","owner","allowance","useTokenAllowance","pendingApproval","useHasPendingApproval","approvalState","APPROVED","PENDING","NOT_APPROVED","UNKNOWN","approve","useExact","estimateGas","MaxUint256","estimatedGas","gasLimit","useCurrentBlockTimestamp","useTransactionDeadline","ttl","userDeadline","blockTimestamp","resetMintState","useENSAddress","debouncedName","addr","useENS","nameOrAddress","validated","reverseLookup","lookup","useAllCommonPairs","bases","basePairs","otherBase","t0","t1","allPairs","customBases","customBasesA","customBasesB","curr","useSwapState","swap","tryParseAmount","typedValueParsed","parseUnits","BAD_RECIPIENT_ADDRESSES","involvesAddress","checksummedAddress","useDerivedSwapInfo","inputError","toggledVersion","independentField","typedValue","inputCurrencyId","outputCurrencyId","recipient","outputCurrency","recipientLookup","relevantTokenBalances","isExactIn","parsedAmount","bestTradeExactIn","currencyAmountIn","currencyOut","allowedPairs","Trade","maxHops","maxNumResults","useTradeExactIn","bestTradeExactOut","currencyIn","currencyAmountOut","useTradeExactOut","v2Trade","currencyBalances","v1Trade","exactAmount","inputPair","outputPair","inputIsETH","outputIsETH","Route","TradeType","EXACT_INPUT","EXACT_OUTPUT","useV1Trade","formattedTo","slippageAdjustedAmounts","slippageAdjustedAmountsV1","balanceIn","amountIn","parseCurrencyFromURLParameter","urlParam","queryParametersToSwapState","parsedQs","validatedRecipient","isNaN","parseFloat","parseIndependentFieldURLParameter","exactField","ZERO","useMintState","mint","maxAmountSpend","BodyWrapper","AppBody","ClickableText","MaxButton","ConfirmAddModalBottom","noLiquidity","price","parsedAmounts","onAdd","CURRENCY_A","CURRENCY_B","invert","PoolPriceBar","pt","STAKING_REWARDS_INTERFACE","STAKING_REWARDS_ABI","STAKING_REWARDS_INFO","STAKING_REWARDS_FACTORY_ABI","stakingRewardAddress","useStakingInfo","pairToFilterBy","currentBlockTimestamp","info","stakingRewardInfo","involvesToken","uni","rewardsAddresses","accountArg","earnedAmounts","totalSupplies","rewardRates","periodFinishes","rewardsAddress","balanceState","earnedAmountState","totalSupplyState","rewardRateState","periodFinishState","dummyPair","stakedAmount","totalStakedAmount","totalRewardRate","getHypotheticalRewardRate","individualRewardRate","periodFinishSeconds","toNumber","periodFinishMs","periodFinish","earnedAmount","rewardRate","AddLiquidity","currencyIdA","currencyIdB","history","oneCurrencyIsWETH","otherTypedValue","dependentField","pairState","equal","independentAmount","dependentAmount","wrappedIndependentAmount","dependentCurrency","dependentTokenAmount","priceOf","quote","currencyAAmount","currencyBAmount","Price","wrappedCurrencyA","liquidityMinted","tokenAmountA","tokenAmountB","getLiquidityMinted","useDerivedMintInfo","onFieldAInput","field","onFieldBInput","useMintActionHandlers","isValid","showConfirm","setShowConfirm","setAttemptingTxn","deadline","txHash","setTxHash","formattedAmounts","maxAmounts","atMaxAmounts","approvalA","approveACallback","approvalB","approveBCallback","router","parsedAmountA","parsedAmountB","amountsMin","tokenBIsETH","addLiquidityETH","toHexString","addLiquidity","modalHeader","lineHeight","modalBottom","handleCurrencyASelect","newCurrencyIdA","handleCurrencyBSelect","newCurrencyIdB","handleDismissConfirmation","trackedTokenPairs","tokenPairsWithLiquidityTokens","liquidityTokens","tpwlt","v2PairsBalances","fetchingV2PairBalances","liquidityTokensWithBalances","v2Pairs","v2IsLoading","V2Pair","allV2PairsWithLiquidity","v2Pair","hasV1Liquidity","stakingInfo","stakingInfosWithBalance","pool","stakingPairs","v2PairsWithoutStakedAmount","stakingPair","isCreate","TitleRow","EmptyProposals","maxWidth","RedirectToAddLiquidity","OLD_PATH_STRUCTURE","RedirectOldAddLiquidityPathStructure","RedirectDuplicateTokenIds","EmptyState","withRouter","V1LiquidityBalance","px","py","MigrateV1","tokenSearch","setTokenSearch","handleTokenSearchChange","V1Exchanges","V1LiquidityTokens","exchangeAddress","V1LiquidityBalances","V1LiquidityBalancesLoading","allV1PairsWithLiquidity","V1LiquidityToken","V1","isLoading","CURRENCY_AMOUNT_MIN","Fraction","FormattedCurrencyAmount","significantDigits","WEI_DENOM","ONE","ZERO_FRACTION","ALLOWED_OUTPUT_MIN_PERCENT","V1LiquidityInfo","liquidityTokenAmount","tokenWorth","ethWorth","my","V1PairMigration","exchangeETHBalance","exchangeTokenBalance","v2PairState","isFirstLiquidityProvider","v2SpotPrice","reserveOf","confirmingMigration","setConfirmingMigration","pendingMigrationHash","setPendingMigrationHash","shareFraction","v1SpotPrice","priceDifferenceFraction","priceDifferenceAbs","minAmountETH","minAmountToken","isMigrationPending","migrator","MIGRATOR_ABI","migrate","Math","floor","noLiquidityTokens","largePriceDifference","isSuccessfullyMigrated","MigrateV1Exchange","validatedAddress","userLiquidityBalance","V1PairRemoval","exchangeContract","confirmingRemoval","setConfirmingRemoval","pendingRemovalHash","setPendingRemovalHash","isRemovalPending","remove","removeLiquidity","isSuccessfullyRemoved","RemoveV1Exchange","Fields","PageWrapper","Pool","PoolFinder","showSearch","setShowSearch","TOKEN1","activeField","setActiveField","setCurrency0","setCurrency1","addPair","serializedPair","usePairAdder","validPairNoLiquidity","position","hasPosition","TOKEN0","handleSearchDismiss","prerequisiteMessage","justifyItems","StyledRangeInput","Slider","min","step","max","changeCallback","aria-labelledby","useBurnState","burn","RemoveLiquidity","userLiquidity","LIQUIDITY","liquidityValueA","liquidityValueB","liquidityValues","percentToRemove","LIQUIDITY_PERCENT","liquidityValue","useDerivedBurnInfo","_onUserInput","useBurnActionHandlers","showDetailed","setShowDetailed","atMaxAmount","pairContract","signatureData","setSignatureData","approveCallback","onLiquidityInput","onCurrencyAInput","onCurrencyBInput","onRemove","currencyAmountA","currencyAmountB","liquidityAmount","currencyBIsETH","oneCurrencyIsETH","methodNames","v","all","safeGasEstimates","indexOfSuccessfulEstimation","findIndex","safeGasEstimate","isBigNumber","liquidityPercentChangeCallback","handleSelectCurrencyA","handleSelectCurrencyB","debouncedMs","inner","setInner","timer","onChangeInner","newValue","useDebouncedChangeHandler","innerLiquidityPercentage","setInnerLiquidityPercentage","RedirectOldRemoveLiquidityPathStructure","ContainerRow","InputContainer","AddressInputPanel","withoutSpaces","autoCapitalize","FormattedPriceImpact","SwapModalFooter","onConfirm","swapErrorMessage","disabledConfirm","showInverted","setShowInverted","paddingLeft","formatExecutionPrice","SwapModalHeader","showAcceptChanges","onAcceptChanges","priceImpactSeverity","ConfirmSwapModal","originalTrade","confirmationContent","flexWrap","isLastItem","InfoLink","TradeSummary","AdvancedSwapDetails","showRoute","AdvancedDetailsFooter","AdvancedSwapDetailsDropdown","lastTrade","VersionLinkContainer","BetterTradeLink","linkDestination","DefaultVersionLink","TradePrice","formattedPrice","baseCurrency","quoteCurrency","WarningContainer","StyledWarningIcon","AlertTriangle","TokenWarningCard","tokenSymbol","duplicateNameOrSymbol","userToken","TokenWarningModal","understandChecked","setUnderstandChecked","toggleUnderstand","uc","handleDismiss","userSelect","SwapCallbackState","WrapType","Grouping","CircleRow","Connector","prevConfirmed","ProgressCircles","steps","toHex","v1SwapArguments","inputETH","outputETH","outputToken","output","useSwapCallArguments","recipientAddressOrName","recipientAddress","v1Exchange","tradeVersion","swapMethods","Router","swapCallParameters","feeOnTransfer","parameters","NOT_APPLICABLE","wrapType","useWrapCallback","wethContract","WETH_ABI","useWETHContract","sufficientBalance","WRAP","execute","deposit","txReceipt","UNWRAP","withdraw","SlippageError","DeadlineError","isOnSwitch","StyledToggle","FancyButton","OptionCustom","SlippageEmojiContainer","SlippageTabs","slippageError","deadlineError","rawSlippage","setRawSlippage","setDeadline","slippageInput","setSlippageInput","deadlineInput","setDeadlineInput","slippageInputIsValid","deadlineInputIsValid","parseCustomSlippage","valueAsIntFromRoundedFloat","parseCustomDeadline","valueAsInt","RiskyLow","RiskyHigh","InvalidInput","onBlur","StyledCloseIcon","StyledSettingsText","EmojiWrapper","Break","ModalContentWrapper","SettingsTab","setUserslippageTolerance","useUserTransactionTTL","setTtl","toggleExpertMode","showConfirmation","setShowConfirmation","SettingsStyled","SwapMenu","Swap","loadedUrlParams","setResult","useDefaultsFromURLSearch","loadedInputCurrency","loadedOutputCurrency","dismissTokenWarning","setDismissTokenWarning","urlLoadedTokens","handleConfirmTokenWarning","toggleSettings","isExpertMode","swapInputError","onWrap","wrapInputError","showWrap","tradesByVersion","defaultTrade","betterTradeLinkVersion","onCurrencySelection","onSwitchTokens","onChangeRecipient","useSwapActionHandlers","handleTypeInput","handleTypeOutput","tradeToConfirm","setSwapState","userHasSpecifiedInputOutput","noRoute","tradeIsV1","v1ExchangeAddress","useApproveCallbackFromTrade","approvalSubmitted","setApprovalSubmitted","maxAmountInput","atMaxAmountInput","swapCalls","VALID","gasEstimate","gasError","callStatic","callError","reason","estimatedCalls","successfulEstimation","el","errorCalls","inputSymbol","outputSymbol","withRecipient","withVersion","useSwapCallback","swapCallback","swapCallbackError","handleSwap","confirm","confirmPriceImpactWithoutFee","showApproveFlow","handleConfirmDismiss","handleAcceptChanges","handleInputSelect","handleMaxInput","handleOutputSelect","RedirectPathToSwapOnly","RedirectToSwap","OpenClaimAddressModalAndRedirectToSwap","ADDRESS_CLAIM","AppWrapper","HeaderWrapper","Marginer","App","fallback","component","exact","strict","createReducer","builder","addCase","payload","popup","updateVersion","currentTimestamp","pairKey","token0Address","token1Address","timestamp","lastUpdateVersionTimestamp","tokenAAddress","tokenBAddress","now","txs","lastCheckedBlockNumber","confirmedTime","otherField","NEW_LIST_STATE","lastInitializedDefaultListOfLists","getVersionUpgrade","VersionUpgrade","NONE","u","lastInitializedSet","l","Set","newListOfListsSet","has","listeners","callListeners","fetchingBlockNumber","PERSISTED_KEYS","store","configureStore","reducer","middleware","getDefaultMiddleware","thunk","save","states","preloadedState","load","VISIBILITY_STATE_SUPPORTED","isWindowVisible","visibilityState","useIsWindowVisible","focused","setFocused","listener","Updater","windowVisible","blockNumberCallback","getBlockNumber","debouncedState","bump","PATCH","MINOR","minVersionBump","MAJOR","waitRandom","ms","round","random","CancelledError","RetryableError","chunk","minBlockNumber","aggregate","obj","resultsBlockNumber","returnData","debouncedListeners","cancellations","listeningKeys","allListeners","keyListeners","previousMin","activeListeningKeys","unserializedOutdatedCallKeys","minDataBlockNumber","outdatedListeningKeys","serializedOutdatedCallKeys","outdatedCallKeys","chunkedCalls","items","maxChunkSize","numChunks","ceil","chunkSize","chunkArray","fn","rejectCancelled","n","minWait","maxWait","completed","cancel","retry","fetchChunk","fetchBlockNumber","firstCallKeyIndex","lastCallKeyIndex","lastBlockNumber","useAddPopup","blocksSinceCheck","minutesPending","shouldCheck","getTransactionReceipt","blockHash","contractAddress","transactionIndex","darkHandler","matches","matchMedia","addListener","getLibrary","Web3ProviderNetwork","createWeb3ReactRoot","autoRefreshOnNetworkChange","Updaters","initialize","customBrowserType","exception","filename","lineno","colno","fatal","ReactDOM","render","getElementById"],"mappings":"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","file":"static/js/main.e7d06115.chunk.js","sourcesContent":["module.exports = __webpack_public_path__ + \"static/media/walletConnectIcon.8215855c.svg\";","module.exports = \"data:image/png;base64,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\"","var map = {\n\t\"./arrow-down-blue.svg\": 394,\n\t\"./arrow-down-grey.svg\": 395,\n\t\"./arrow-right-white.png\": 396,\n\t\"./arrow-right.svg\": 397,\n\t\"./big_unicorn.png\": 398,\n\t\"./blue-loader.svg\": 199,\n\t\"./circle-grey.svg\": 399,\n\t\"./circle.svg\": 400,\n\t\"./coinbaseWalletIcon.svg\": 401,\n\t\"./dropdown-blue.svg\": 402,\n\t\"./dropdown.svg\": 403,\n\t\"./dropup-blue.svg\": 404,\n\t\"./ethereum-logo.png\": 405,\n\t\"./fortmaticIcon.png\": 406,\n\t\"./lightmode.svg\": 407,\n\t\"./link.svg\": 408,\n\t\"./magnifying-glass.svg\": 409,\n\t\"./managelist.svg\": 410,\n\t\"./menu.svg\": 411,\n\t\"./metamask.png\": 98,\n\t\"./noise.png\": 200,\n\t\"./plus-blue.svg\": 412,\n\t\"./plus-grey.svg\": 413,\n\t\"./portisIcon.png\": 414,\n\t\"./question-mark.svg\": 415,\n\t\"./question.svg\": 416,\n\t\"./spinner.svg\": 417,\n\t\"./thunder.jpg\": 201,\n\t\"./token-list/lists-dark.png\": 418,\n\t\"./token-list/lists-light.png\": 419,\n\t\"./token-logo.png\": 420,\n\t\"./trustWallet.png\": 421,\n\t\"./walletConnectIcon.svg\": 129,\n\t\"./x.svg\": 422,\n\t\"./xdai-logo.png\": 202,\n\t\"./xl_uni.png\": 203\n};\n\n\nfunction webpackContext(req) {\n\tvar id = webpackContextResolve(req);\n\treturn __webpack_require__(id);\n}\nfunction webpackContextResolve(req) {\n\tif(!__webpack_require__.o(map, req)) {\n\t\tvar e = new Error(\"Cannot find module '\" + req + \"'\");\n\t\te.code = 'MODULE_NOT_FOUND';\n\t\tthrow e;\n\t}\n\treturn map[req];\n}\nwebpackContext.keys = function webpackContextKeys() {\n\treturn Object.keys(map);\n};\nwebpackContext.resolve = webpackContextResolve;\nmodule.exports = webpackContext;\nwebpackContext.id = 168;","module.exports = __webpack_public_path__ + \"static/media/blue-loader.904b44c2.svg\";","module.exports = __webpack_public_path__ + \"static/media/noise.17ab2292.png\";","module.exports = __webpack_public_path__ + \"static/media/thunder.69a35985.jpg\";","module.exports = \"data:image/png;base64,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\"","module.exports = __webpack_public_path__ + \"static/media/xl_uni.ed12c533.png\";","module.exports = __webpack_public_path__ + \"static/media/tokenlist.4dc9ede3.svg\";","module.exports = __webpack_public_path__ + \"static/media/arrow-down-blue.cd061363.svg\";","module.exports = __webpack_public_path__ + \"static/media/arrow-down-grey.c0dedd2f.svg\";","module.exports = __webpack_public_path__ + \"static/media/arrow-right-white.337ad716.png\";","module.exports = __webpack_public_path__ + \"static/media/arrow-right.d285b6cf.svg\";","module.exports = __webpack_public_path__ + \"static/media/big_unicorn.3de55567.png\";","module.exports = __webpack_public_path__ + \"static/media/circle-grey.ed2a1dad.svg\";","module.exports = __webpack_public_path__ + \"static/media/circle.2d975615.svg\";","module.exports = __webpack_public_path__ + \"static/media/coinbaseWalletIcon.aa4c7a76.svg\";","module.exports = __webpack_public_path__ + \"static/media/dropdown-blue.b20914ec.svg\";","module.exports = __webpack_public_path__ + \"static/media/dropdown.7d32d2fa.svg\";","module.exports = __webpack_public_path__ + \"static/media/dropup-blue.b96d70e1.svg\";","module.exports = \"data:image/png;base64,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\"","module.exports = \"data:image/png;base64,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\"","module.exports = __webpack_public_path__ + \"static/media/lightmode.d1bb2c1b.svg\";","module.exports = __webpack_public_path__ + \"static/media/link.50c67f3c.svg\";","module.exports = __webpack_public_path__ + \"static/media/magnifying-glass.67440097.svg\";","module.exports = __webpack_public_path__ + \"static/media/managelist.61d2e0ba.svg\";","module.exports = __webpack_public_path__ + \"static/media/menu.4f2c4440.svg\";","module.exports = __webpack_public_path__ + \"static/media/plus-blue.e8021e51.svg\";","module.exports = __webpack_public_path__ + \"static/media/plus-grey.d8e0be7d.svg\";","module.exports = __webpack_public_path__ + \"static/media/portisIcon.b234b2bf.png\";","module.exports = __webpack_public_path__ + \"static/media/question-mark.1ae4d9f4.svg\";","module.exports = __webpack_public_path__ + \"static/media/question.a46e8bc1.svg\";","module.exports = __webpack_public_path__ + \"static/media/spinner.be00fc4a.svg\";","module.exports = \"data:image/png;base64,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\"","module.exports = \"data:image/png;base64,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\"","module.exports = \"data:image/png;base64,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\"","module.exports = __webpack_public_path__ + \"static/media/trustWallet.edcc1ab5.png\";","module.exports = __webpack_public_path__ + \"static/media/x.5b8e2186.svg\";","import { ConnectorUpdate } from '@web3-react/types'\nimport { AbstractConnector } from '@web3-react/abstract-connector'\nimport invariant from 'tiny-invariant'\n\ninterface NetworkConnectorArguments {\n urls: { [chainId: number]: string }\n defaultChainId?: number\n}\n\n// taken from ethers.js, compatible interface with web3 provider\ntype AsyncSendable = {\n isMetaMask?: boolean\n host?: string\n path?: string\n sendAsync?: (request: any, callback: (error: any, response: any) => void) => void\n send?: (request: any, callback: (error: any, response: any) => void) => void\n}\n\nclass RequestError extends Error {\n constructor(message: string, public code: number, public data?: unknown) {\n super(message)\n }\n}\n\ninterface BatchItem {\n request: { jsonrpc: '2.0'; id: number; method: string; params: unknown }\n resolve: (result: any) => void\n reject: (error: Error) => void\n}\n\nclass MiniRpcProvider implements AsyncSendable {\n public readonly isMetaMask: false = false\n public readonly chainId: number\n public readonly url: string\n public readonly host: string\n public readonly path: string\n public readonly batchWaitTimeMs: number\n\n private nextId = 1\n private batchTimeoutId: ReturnType | null = null\n private batch: BatchItem[] = []\n\n constructor(chainId: number, url: string, batchWaitTimeMs?: number) {\n this.chainId = chainId\n this.url = url\n const parsed = new URL(url)\n this.host = parsed.host\n this.path = parsed.pathname\n // how long to wait to batch calls\n this.batchWaitTimeMs = batchWaitTimeMs ?? 50\n }\n\n public readonly clearBatch = async () => {\n console.debug('Clearing batch', this.batch)\n const batch = this.batch\n this.batch = []\n this.batchTimeoutId = null\n let response: Response\n try {\n response = await fetch(this.url, {\n method: 'POST',\n headers: { 'content-type': 'application/json', accept: 'application/json' },\n body: JSON.stringify(batch.map(item => item.request))\n })\n } catch (error) {\n batch.forEach(({ reject }) => reject(new Error('Failed to send batch call')))\n return\n }\n\n if (!response.ok) {\n batch.forEach(({ reject }) => reject(new RequestError(`${response.status}: ${response.statusText}`, -32000)))\n return\n }\n\n let json\n try {\n json = await response.json()\n } catch (error) {\n batch.forEach(({ reject }) => reject(new Error('Failed to parse JSON response')))\n return\n }\n const byKey = batch.reduce<{ [id: number]: BatchItem }>((memo, current) => {\n memo[current.request.id] = current\n return memo\n }, {})\n for (const result of json) {\n const {\n resolve,\n reject,\n request: { method }\n } = byKey[result.id]\n if (resolve && reject) {\n if ('error' in result) {\n reject(new RequestError(result?.error?.message, result?.error?.code, result?.error?.data))\n } else if ('result' in result) {\n resolve(result.result)\n } else {\n reject(new RequestError(`Received unexpected JSON-RPC response to ${method} request.`, -32000, result))\n }\n }\n }\n }\n\n public readonly sendAsync = (\n request: { jsonrpc: '2.0'; id: number | string | null; method: string; params?: unknown[] | object },\n callback: (error: any, response: any) => void\n ): void => {\n this.request(request.method, request.params)\n .then(result => callback(null, { jsonrpc: '2.0', id: request.id, result }))\n .catch(error => callback(error, null))\n }\n\n public readonly request = async (\n method: string | { method: string; params: unknown[] },\n params?: unknown[] | object\n ): Promise => {\n if (typeof method !== 'string') {\n return this.request(method.method, method.params)\n }\n if (method === 'eth_chainId') {\n return `0x${this.chainId.toString(16)}`\n }\n const promise = new Promise((resolve, reject) => {\n this.batch.push({\n request: {\n jsonrpc: '2.0',\n id: this.nextId++,\n method,\n params\n },\n resolve,\n reject\n })\n })\n this.batchTimeoutId = this.batchTimeoutId ?? setTimeout(this.clearBatch, this.batchWaitTimeMs)\n return promise\n }\n}\n\nexport class NetworkConnector extends AbstractConnector {\n private readonly providers: { [chainId: number]: MiniRpcProvider }\n private currentChainId: number\n\n constructor({ urls, defaultChainId }: NetworkConnectorArguments) {\n invariant(defaultChainId || Object.keys(urls).length === 1, 'defaultChainId is a required argument with >1 url')\n super({ supportedChainIds: Object.keys(urls).map((k): number => Number(k)) })\n\n this.currentChainId = defaultChainId || Number(Object.keys(urls)[0])\n this.providers = Object.keys(urls).reduce<{ [chainId: number]: MiniRpcProvider }>((accumulator, chainId) => {\n accumulator[Number(chainId)] = new MiniRpcProvider(Number(chainId), urls[Number(chainId)])\n return accumulator\n }, {})\n }\n\n public get provider(): MiniRpcProvider {\n return this.providers[this.currentChainId]\n }\n\n public async activate(): Promise {\n return { provider: this.providers[this.currentChainId], chainId: this.currentChainId, account: null }\n }\n\n public async getProvider(): Promise {\n return this.providers[this.currentChainId]\n }\n\n public async getChainId(): Promise {\n return this.currentChainId\n }\n\n public async getAccount(): Promise {\n return null\n }\n\n public deactivate() {\n return\n }\n}\n","import { Web3Provider } from '@ethersproject/providers'\r\nimport { InjectedConnector } from '@web3-react/injected-connector'\r\nimport { WalletConnectConnector } from '@web3-react/walletconnect-connector'\r\nimport { NetworkConnector } from './NetworkConnector'\r\n\r\nconst NETWORK_URL = process.env.REACT_APP_NETWORK_URL\r\n\r\nexport const NETWORK_CHAIN_ID: number = parseInt(process.env.REACT_APP_CHAIN_ID ?? '1')\r\n\r\nif (typeof NETWORK_URL === 'undefined') {\r\n throw new Error(`REACT_APP_NETWORK_URL must be a defined environment variable`)\r\n}\r\n\r\nexport const network = new NetworkConnector({\r\n urls: { [NETWORK_CHAIN_ID]: NETWORK_URL }\r\n})\r\n\r\nlet networkLibrary: Web3Provider | undefined\r\nexport function getNetworkLibrary(): Web3Provider {\r\n return (networkLibrary = networkLibrary ?? new Web3Provider(network.provider as any))\r\n}\r\n\r\nexport const injected = new InjectedConnector({\r\n supportedChainIds: [100]\r\n})\r\n\r\nexport const walletconnect = new WalletConnectConnector({\r\n rpc: { 100: 'https://rpc.xdaichain.com/' },\r\n bridge: 'https://bridge.walletconnect.org/',\r\n qrcode: true,\r\n pollingInterval: 15000\r\n})","import { ChainId, JSBI, Percent, Token, WETH } from '@levinswap/uniswap-sdk'\r\nimport { AbstractConnector } from '@web3-react/abstract-connector'\r\n\r\nimport { injected, walletconnect } from '../connectors'\r\n\r\nexport const ROUTER_ADDRESS = '0xb18d4f69627F8320619A696202Ad2C430CeF7C53'\r\n\r\nexport const ZERO_ADDRESS = '0x0000000000000000000000000000000000000000'\r\n\r\nexport { PRELOADED_PROPOSALS } from './proposals'\r\n\r\n// a list of tokens by chain\r\ntype ChainTokenList = {\r\n readonly [chainId in ChainId]: Token[]\r\n}\r\n\r\nexport const USDC = new Token(ChainId.XDAI, '0xDDAfbb505ad214D7b80b1f830fcCc89B60fb7A83', 18, 'USDC', 'USDC on xDai')\r\n\r\nexport const XDAI_WETH = new Token(\r\n ChainId.XDAI,\r\n '0x6A023CCd1ff6F2045C3309768eAd9E68F978f6e1',\r\n 18,\r\n 'WETH',\r\n 'Wrapped Ether on xDai'\r\n)\r\n\r\nexport const STAKE = new Token(\r\n ChainId.XDAI,\r\n '0xb7D311E2Eb55F2f68a9440da38e7989210b9A05e',\r\n 18,\r\n 'STAKE',\r\n 'Stake Token on xDai'\r\n)\r\n\r\nexport const LEVIN = new Token(\r\n ChainId.XDAI,\r\n '0x1698cD22278ef6E7c0DF45a8dEA72EDbeA9E42aa',\r\n 18,\r\n 'LEVIN',\r\n 'Levin Token on xDai'\r\n)\r\n\r\n// Block time here is slightly higher (~1s) than average in order to avoid ongoing proposals past the displayed time\r\nexport const AVERAGE_BLOCK_TIME_IN_SECS = 13\r\nexport const PROPOSAL_LENGTH_IN_BLOCKS = 40_320\r\nexport const PROPOSAL_LENGTH_IN_SECS = AVERAGE_BLOCK_TIME_IN_SECS * PROPOSAL_LENGTH_IN_BLOCKS\r\n\r\nexport const GOVERNANCE_ADDRESS = '0x5e4be8Bc9637f0EAA1A755019e06A68ce081D58F'\r\n\r\nexport const TIMELOCK_ADDRESS = '0x1a9C8182C09F50C8318d769245beA52c32BE35BC'\r\n\r\nconst UNI_ADDRESS = '0x1698cd22278ef6e7c0df45a8dea72edbea9e42aa'\r\nexport const UNI: { [chainId in ChainId]: Token } = {\r\n [ChainId.MAINNET]: new Token(ChainId.MAINNET, UNI_ADDRESS, 18, 'UNI', 'Uniswap'),\r\n [ChainId.RINKEBY]: new Token(ChainId.RINKEBY, UNI_ADDRESS, 18, 'UNI', 'Uniswap'),\r\n [ChainId.ROPSTEN]: new Token(ChainId.ROPSTEN, UNI_ADDRESS, 18, 'UNI', 'Uniswap'),\r\n [ChainId.GÖRLI]: new Token(ChainId.GÖRLI, UNI_ADDRESS, 18, 'UNI', 'Uniswap'),\r\n [ChainId.KOVAN]: new Token(ChainId.KOVAN, UNI_ADDRESS, 18, 'UNI', 'Uniswap'),\r\n [ChainId.XDAI]: new Token(ChainId.KOVAN, UNI_ADDRESS, 18, 'UNI', 'Uniswap')\r\n}\r\n\r\nexport const COMMON_CONTRACT_NAMES: { [address: string]: string } = {\r\n [UNI_ADDRESS]: 'UNI',\r\n [GOVERNANCE_ADDRESS]: 'Governance',\r\n [TIMELOCK_ADDRESS]: 'Timelock'\r\n}\r\n\r\n// TODO: specify merkle distributor for mainnet\r\nexport const MERKLE_DISTRIBUTOR_ADDRESS: { [chainId in ChainId]?: string } = {\r\n [ChainId.MAINNET]: '0x090D4613473dEE047c3f2706764f49E0821D256e'\r\n}\r\n\r\nconst WETH_ONLY: ChainTokenList = {\r\n [ChainId.MAINNET]: [WETH[ChainId.MAINNET]],\r\n [ChainId.ROPSTEN]: [WETH[ChainId.ROPSTEN]],\r\n [ChainId.RINKEBY]: [WETH[ChainId.RINKEBY]],\r\n [ChainId.GÖRLI]: [WETH[ChainId.GÖRLI]],\r\n [ChainId.KOVAN]: [WETH[ChainId.KOVAN]],\r\n [ChainId.XDAI]: [WETH[ChainId.XDAI]]\r\n}\r\n\r\n// used to construct intermediary pairs for trading\r\nexport const BASES_TO_CHECK_TRADES_AGAINST: ChainTokenList = {\r\n ...WETH_ONLY,\r\n [ChainId.XDAI]: [...WETH_ONLY[ChainId.XDAI], XDAI_WETH, LEVIN, STAKE, USDC]\r\n}\r\n\r\n/**\r\n * Some tokens can only be swapped via certain pairs, so we override the list of bases that are considered for these\r\n * tokens.\r\n */\r\nexport const CUSTOM_BASES: { [chainId in ChainId]?: { [tokenAddress: string]: Token[] } } = {}\r\n\r\n// used for display in the default list when adding liquidity\r\nexport const SUGGESTED_BASES: ChainTokenList = {\r\n ...WETH_ONLY,\r\n [ChainId.XDAI]: [...WETH_ONLY[ChainId.XDAI], XDAI_WETH, LEVIN, STAKE, USDC]\r\n}\r\n\r\n// used to construct the list of all pairs we consider by default in the frontend\r\nexport const BASES_TO_TRACK_LIQUIDITY_FOR: ChainTokenList = {\r\n ...WETH_ONLY,\r\n [ChainId.XDAI]: [...WETH_ONLY[ChainId.XDAI], XDAI_WETH, LEVIN, STAKE, USDC]\r\n}\r\n\r\nexport const PINNED_PAIRS: { readonly [chainId in ChainId]?: [Token, Token][] } = {}\r\n\r\nexport interface WalletInfo {\r\n connector?: AbstractConnector\r\n name: string\r\n iconName: string\r\n description: string\r\n href: string | null\r\n color: string\r\n primary?: true\r\n mobile?: true\r\n mobileOnly?: true\r\n}\r\n\r\nexport const SUPPORTED_WALLETS: { [key: string]: WalletInfo } = {\r\n INJECTED: {\r\n connector: injected,\r\n name: 'Injected',\r\n iconName: 'arrow-right.svg',\r\n description: 'Injected web3 provider.',\r\n href: null,\r\n color: '#010101',\r\n primary: true\r\n },\r\n METAMASK: {\r\n connector: injected,\r\n name: 'MetaMask',\r\n iconName: 'metamask.png',\r\n description: 'Easy-to-use browser extension.',\r\n href: null,\r\n color: '#E8831D'\r\n },\r\n WALLET_CONNECT: {\r\n connector: walletconnect,\r\n name: 'WalletConnect',\r\n iconName: 'walletConnectIcon.svg',\r\n description: 'Connect to Trust Wallet, Rainbow Wallet and more...',\r\n href: null,\r\n color: '#4196FC',\r\n mobile: true\r\n }\r\n}\r\n\r\nexport const NetworkContextName = 'NETWORK'\r\n\r\n// default allowed slippage, in bips\r\nexport const INITIAL_ALLOWED_SLIPPAGE = 50\r\n// 20 minutes, denominated in seconds\r\nexport const DEFAULT_DEADLINE_FROM_NOW = 60 * 20\r\n\r\n// used for rewards deadlines\r\nexport const BIG_INT_SECONDS_IN_WEEK = JSBI.BigInt(60 * 60 * 24 * 7)\r\n\r\nexport const BIG_INT_ZERO = JSBI.BigInt(0)\r\n\r\n// one basis point\r\nexport const ONE_BIPS = new Percent(JSBI.BigInt(1), JSBI.BigInt(10000))\r\nexport const BIPS_BASE = JSBI.BigInt(10000)\r\n// used for warning states\r\nexport const ALLOWED_PRICE_IMPACT_LOW: Percent = new Percent(JSBI.BigInt(100), BIPS_BASE) // 1%\r\nexport const ALLOWED_PRICE_IMPACT_MEDIUM: Percent = new Percent(JSBI.BigInt(300), BIPS_BASE) // 3%\r\nexport const ALLOWED_PRICE_IMPACT_HIGH: Percent = new Percent(JSBI.BigInt(500), BIPS_BASE) // 5%\r\n// if the price slippage exceeds this number, force the user to type 'confirm' to execute\r\nexport const PRICE_IMPACT_WITHOUT_FEE_CONFIRM_MIN: Percent = new Percent(JSBI.BigInt(1000), BIPS_BASE) // 10%\r\n// for non expert mode disable swaps above this\r\nexport const BLOCKED_PRICE_IMPACT_NON_EXPERT: Percent = new Percent(JSBI.BigInt(1500), BIPS_BASE) // 15%\r\n\r\n// used to ensure the user doesn't send so much ETH so they end up with <.01\r\nexport const MIN_ETH: JSBI = JSBI.exponentiate(JSBI.BigInt(10), JSBI.BigInt(16)) // .01 ETH\r\nexport const BETTER_TRADE_LINK_THRESHOLD = new Percent(JSBI.BigInt(75), JSBI.BigInt(10000))\r\n\r\n// SDN OFAC addresses\r\nexport const BLOCKED_ADDRESSES: string[] = [\r\n '0x7F367cC41522cE07553e823bf3be79A889DEbe1B',\r\n '0xd882cFc20F52f2599D84b8e8D58C7FB62cfE344b',\r\n '0x901bb9583b24D97e995513C6778dc6888AB6870e',\r\n '0xA7e5d5A720f06526557c513402f2e6B5fA20b008',\r\n '0x64e8a115ec254a6a5949dbc5801a8ccf3ae4f72f'\r\n]\r\n","import { UNISWAP_GRANTS } from './uniswap_grants'\n\n// Proposals are 0-indexed\nexport const PRELOADED_PROPOSALS = new Map([[2, UNISWAP_GRANTS]])\n","export const UNISWAP_GRANTS = `# Uniswap Grants Program v0.1\r\n\r\n*co-authored with [Ken Ng](https://twitter.com/nkennethk?lang=en)*\r\n\r\n## Summary:\r\n\r\n**This post outlines a framework for funding Uniswap ecosystem development with grants from the[ UNI Community Treasury](https://levinswap.realtoken.community/blog/uni/).** The program starts small—sponsoring hackathons, [for example](https://gov.levinswap.realtoken.community/c/proposal-discussion/5)—but could grow in significance over time (with renewals approved by governance) to fund core protocol development. Grants administration is a subjective process that cannot be easily automated, and thus we propose a nimble committee of 6 members —1 lead and 5 reviewers—to deliver an efficient, predictable process to applicants, such that funding can be administered without having to put each application to a vote. We propose the program start with an initial cap of $750K per quarter and a limit of 2 quarters before renewal—a sum that we feel is appropriate for an MVP relative to the size of the treasury that UNI token holders are entrusted with allocating.\r\n\r\n**Purpose:**\r\n\r\n**The mission of the UGP is to provide valuable resources to help grow the Uniswap ecosystem.** Through public discourse and inbound applications, the community will get first-hand exposure to identify and respond to the most pressing needs of the ecosystem, as well as the ability to support innovative projects expanding the capabilities of Uniswap. By rewarding talent early with developer incentives, bounties, and infrastructure support, UGP acts as a catalyst for growth and helps to maintain Uniswap as a nexus for DeFi on ethereum.\r\n\r\n**Quarterly Budget:**\r\n\r\n* Max quarterly budget of up to $750k\r\n* Budget and caps to be assessed every six months\r\n\r\n**Grant Allocation Committee:**\r\n\r\n* Of 6 committee members: 1 lead and 5 reviewers\r\n* Each committee has a term of 2 quarters (6 months) after which the program needs to be renewed by UNI governance\r\n* Committee functions as a 4 of 5 multi-sig\r\n\r\n**Committee Members**\r\n\r\nWhile the goals and priorities of the grant program will be thoroughly discussed and reviewed by the community through public discourse, **the decision to start UGP by operating as a small committee is to ensure that the application and decision process will be efficient and predictable, so applicants have clear objectives and timely decisions.**\r\n\r\nStarting with just six members enables the committee to efficiently fund projects with tight feedback loops and rapid iterations. The purpose of this committee would be to test the hypothesis that the Grants Program can successfully provide value for the UNI ecosystem before scaling the program.\r\n\r\n**We suggest the grants program is administered by a single lead. Here we propose Kenneth Ng, a co-author of this post**. Ken has helped grow the ethereum Foundation Grants Program over the last two years in establishing high level priorities and adapting for the ecosystems needs.\r\n\r\n**The other 5 committee members should be thought of as “reviewers” — UNI community members who will keep the grants program functional by ensuring Ken is leading effectively and, of course, not absconding with funds.** Part of the reviewers job is to hold the program accountable for success (defined below) and/or return any excess funds to the UNI treasury. Reviewers are not compensated as part of this proposal as we expect their time commitment to be minimal. Compensation for the lead role is discussed below, as we expect this to be a labor intensive role.\r\n\r\n**Program Lead:** [Ken Ng](https://twitter.com/nkennethk?lang=en) (HL Creative Corp)\r\n*Ecosystem Support Program at the ethereum Foundation*\r\n\r\n1. Reviewer: [Jesse Walden](https://twitter.com/jessewldn) (o/b/o Unofficial LLC dba [Variant Fund](http://twitter.com/variantfund))\r\n*Founder and Investor at Variant Fund (holds UNI)*\r\n\r\n2. Reviewer: [Monet Supply](https://twitter.com/MonetSupply)\r\n*Risk Analyst at MakerDAO*\r\n\r\n3. Reviewer: [Robert Leshner](https://twitter.com/rleshner)\r\n*Founder and CEO of Compound Finance*\r\n\r\n4. Reviewer: [Kain Warwick](https://twitter.com/kaiynne)\r\n*Founder of Synthetix*\r\n\r\n5. Reviewer: [Ashleigh Schap](https://twitter.com/ashleighschap)\r\n*Growth Lead, Uniswap (Company)*\r\n\r\n## Methodology\r\n\r\n**1.1 Budget**\r\n\r\nThis proposal recommends a max cap of $750K per quarter, with the ability to reevaluate biannually at each epoch (two fiscal quarters). While the UGP Grants Committee will be the decision makers around individual grants, respective budgets, roadmaps, and milestones, any top-level changes to UGP including epochs and max cap, will require full community quorum (4% approval).\r\n\r\nThe UGP will be funded by the UNI treasury according to the[ release schedule](https://levinswap.realtoken.community/blog/uni/) set out by the Uniswap team, whereby 43% of the UNI treasury is released over a four-year timeline. In Year 1 this will total to 172,000,000 UNI (~$344M as of writing).\r\n\r\nTaking into consideration the current landscape of ecosystem funding across ethereum, the community would be hard-pressed to allocate even 5% of Year 1’s treasury. For context Gitcoin CLR Round 7 distributed $725k ($450k in matched) across 857 projects and YTD, Moloch has granted just under $200k but in contrast, the EF has committed to somewhere in the 8 figure range.\r\n\r\n**1.2 Committee Compensation**\r\n\r\nOperating a successful grants program takes considerable time and effort. Take, for instance, the EF Ecosystem Support Program, which has awarded grants since 2018, consists of an internal team at the Foundation as well as an ever increasing roster of community advisors in order to keep expanding and adapting to best serve the needs of the ethereum ecosystem. While the structure of the allocation committee has six members, we propose that only the lead will be remunerated for their work in establishing the initial processes, vetting applications, and managing the program overall as this role is expected to be time consuming if the program is to be succesful. We propose that the other committee members be unpaid UNI ecosystem stakeholders who have an interest in seeing the protocol ecosystem continue to operate and grow.\r\n\r\n**We propose the lead be compensated 25 UNI/hr (approximately $100 USD at time of this writing) capped at 30 hours/week. This compensation, along with the quarterly budget, will be allocated to the UGP multisig from the UNI treasury**. In keeping with the committee’s commitment to the community, hours and duties will be logged publicly and transparently .\r\n\r\n**2.1 Priorities**\r\n\r\nInitially, the program aims to start narrow in scope, funding peripheral ecosystem initiatives, such as targeted bounties, hackathon sponsorships, and other low-stakes means of building out the Uniswap developer ecosystem. Over time, if the program proves effective, the grant allocations can grow in scope to include, for example, improved frontends, trading interfaces, and eventually, core protocol development.\r\n\r\n![|624x199](upload://vNP0APCOjiwQMurCmYI47cTLklc.png)\r\n\r\nWith the initial priorities in mind, some effective measures for quick successes might look like:\r\n\r\n* Total number of projects funded\r\n* Quarterly increase in applications\r\n* Project engagement post-event/funding\r\n* Overall community engagement/sentiment\r\n\r\n**2.2 Timeline**\r\n\r\nIn keeping with the fast pace of the UNI ecosystem, we organize time in epochs, or two calendar quarters. Each epoch will see two funding rounds, one per quarter, after which the community can review and create proposals to improve or revamp the program as they deem fit.\r\n\r\n**![|624x245](upload://n56TSh5X3mt4TSqVVMFhbnZM0eM.png)**\r\n\r\n**Rolling Wave 1 & 2 Applications**\r\n\r\n* Starting in Q1 2021, UGP will start accepting applications for events looking for support in the form of bounties or prizes that in parallel can be proactively sourced. During these first two waves of funding projects, the allocation committee lead can begin laying out guardrails for continued funding\r\n\r\n* Considering the immediate feedback loops for the first epoch, we expect these allocation decisions to be discussed and reviewed by the larger community. Should this not be of value, the community can submit a formal governance proposal to change any piece of UGP that was not effective\r\n\r\n**Wave 3 & Beyond**\r\n\r\n* Beginning with Wave 3, there should have been enough time with impactful projects funded to be considered for follow-on funding, should it make sense. In the same vein, projects within scope will be expanded to also include those working on integrations and and other key components.\r\n\r\n* Beyond the second epoch, as the community helps to review and help adapt UGP to be most effective, the scope will continue to grow in order to accommodate the state of the ecosystem including that of core protocol improvements\r\n\r\n## Conclusion:\r\n\r\n**If this proposal is successfully approved, UGP will start accepting applications on a rolling basis beginning at the start of 2021.** With the phases and priorities laid out above, UGP will aim to make a significant impact by catalyzing growth and innovation in the UNI ecosystem.\r\n\r\n**This program is meant to be the simplest possible MVP of a Uniswap Ecosystem Grants initiative.** While the multi-sig committee comes with trust assumptions about the members, our hope is the community will approve this limited engagement to get the ball rolling in an efficient structure. **After the first epoch (2 fiscal quarters) the burden of proof will be on UGP to show empirical evidence that the program is worth continuing in its existing form and will submit to governance to renew treasury funding.**\r\n\r\nIf this program proves successful, we hope it will inspire others to follow suit and create their own funding committees for allocating treasury capital—ideally with different specializations.\r\n`\r\n","import { Web3Provider } from '@ethersproject/providers'\r\nimport { ChainId } from '@levinswap/uniswap-sdk'\r\nimport { useWeb3React as useWeb3ReactCore } from '@web3-react/core'\r\nimport { Web3ReactContextInterface } from '@web3-react/core/dist/types'\r\nimport { useEffect, useState } from 'react'\r\nimport { isMobile } from 'react-device-detect'\r\nimport { injected } from '../connectors'\r\nimport { NetworkContextName } from '../constants'\r\n\r\nexport function useActiveWeb3React(): Web3ReactContextInterface & { chainId?: ChainId } {\r\n const context = useWeb3ReactCore()\r\n const contextNetwork = useWeb3ReactCore(NetworkContextName)\r\n return context.active ? context : contextNetwork\r\n}\r\n\r\nexport function useEagerConnect() {\r\n const { activate, active } = useWeb3ReactCore() // specifically using useWeb3ReactCore because of what this hook does\r\n const [tried, setTried] = useState(false)\r\n\r\n useEffect(() => {\r\n injected.isAuthorized().then(isAuthorized => {\r\n if (isAuthorized) {\r\n activate(injected, undefined, true).catch(() => {\r\n setTried(true)\r\n })\r\n } else {\r\n if (isMobile && window.ethereum) {\r\n activate(injected, undefined, true).catch(() => {\r\n setTried(true)\r\n })\r\n } else {\r\n setTried(true)\r\n }\r\n }\r\n })\r\n }, [activate]) // intentionally only running on mount (make sure it's only mounted once :))\r\n\r\n // if the connection worked, wait until we get confirmation of that to flip the flag\r\n useEffect(() => {\r\n if (active) {\r\n setTried(true)\r\n }\r\n }, [active])\r\n\r\n return tried\r\n}\r\n\r\n/**\r\n * Use for network and injected - logs user in\r\n * and out after checking what network theyre on\r\n */\r\nexport function useInactiveListener(suppress = false) {\r\n const { active, error, activate } = useWeb3ReactCore() // specifically using useWeb3React because of what this hook does\r\n\r\n useEffect(() => {\r\n const { ethereum } = window\r\n\r\n if (ethereum && ethereum.on && !active && !error && !suppress) {\r\n const handleChainChanged = () => {\r\n // eat errors\r\n activate(injected, undefined, true).catch(error => {\r\n console.error('Failed to activate after chain changed', error)\r\n })\r\n }\r\n\r\n const handleAccountsChanged = (accounts: string[]) => {\r\n if (accounts.length > 0) {\r\n // eat errors\r\n activate(injected, undefined, true).catch(error => {\r\n console.error('Failed to activate after accounts changed', error)\r\n })\r\n }\r\n }\r\n\r\n ethereum.on('chainChanged', handleChainChanged)\r\n ethereum.on('accountsChanged', handleAccountsChanged)\r\n\r\n return () => {\r\n if (ethereum.removeListener) {\r\n ethereum.removeListener('chainChanged', handleChainChanged)\r\n ethereum.removeListener('accountsChanged', handleAccountsChanged)\r\n }\r\n }\r\n }\r\n return undefined\r\n }, [active, error, suppress, activate])\r\n}\r\n","import React, { ReactNode, useMemo } from 'react'\nimport { BLOCKED_ADDRESSES } from '../../constants'\nimport { useActiveWeb3React } from '../../hooks'\n\nexport default function Blocklist({ children }: { children: ReactNode }) {\n const { account } = useActiveWeb3React()\n const blocked: boolean = useMemo(() => Boolean(account && BLOCKED_ADDRESSES.indexOf(account) !== -1), [account])\n if (blocked) {\n return
Blocked address
\n }\n return <>{children}\n}\n","import i18next from 'i18next'\nimport { initReactI18next } from 'react-i18next'\nimport XHR from 'i18next-xhr-backend'\nimport LanguageDetector from 'i18next-browser-languagedetector'\n\ni18next\n .use(XHR)\n .use(LanguageDetector)\n .use(initReactI18next)\n .init({\n backend: {\n loadPath: `./locales/{{lng}}.json`\n },\n react: {\n useSuspense: true\n },\n fallbackLng: 'en',\n preload: ['en'],\n keySeparator: false,\n interpolation: { escapeValue: false }\n })\n\nexport default i18next\n","import { useEffect } from 'react'\nimport ReactGA from 'react-ga'\nimport { RouteComponentProps } from 'react-router-dom'\n\n// fires a GA pageview every time the route changes\nexport default function GoogleAnalyticsReporter({ location: { pathname, search } }: RouteComponentProps): null {\n useEffect(() => {\n ReactGA.pageview(`${pathname}${search}`)\n }, [pathname, search])\n return null\n}\n","// used to mark unsupported tokens, these are hosted lists of unsupported tokens\r\n\r\nconst LEVINSWAP_LIST =\r\n 'https://ipfs.io/ipfs/QmUmN7Be3LLHiEwcVZDm6WsPjcTddWsc6C7hrLCmPzsanv?filename=levinswap-default.tokenlist.json'\r\nconst LEVINSWAP_STABLECOIN_LIST =\r\n 'https://ipfs.io/ipfs/QmWrhnRTCQ8CgSoNmHV6WsneLLhErouD4fQPpSaqhsibpD?filename=levinswap-stablecoin-tokenlist.json'\r\nconst REALT_LIST = 'https://api.realtoken.community/v1/tokenList'\r\nconst REN_LIST =\r\n 'https://ipfs.io/ipfs/QmSqYWWdzfngm57int8AesJr1APRBBYxC8knmYC9rN4ECj?filename=ren-default.tokenlist.json'\r\nconst SYNTHETIX_LST =\r\n 'https://ipfs.io/ipfs/QmYeWjmKW4tQ6JfCG9XUkVa9CFBAUY36Z1W9w1iM6Bx4ne?filename=synthetix-default.tokenlist.json'\r\nconst BSC_LIST =\r\n 'https://ipfs.io/ipfs/QmcT2RnZ2tJcpfxaruy1EkKAF6aGCRrVsNFfn5oSCQLPQJ?filename=bsc-default.tokenlist.json'\r\n\r\nexport const UNSUPPORTED_LIST_URLS: string[] = []\r\n\r\n// lower index == higher priority for token import\r\nexport const DEFAULT_LIST_OF_LISTS: string[] = [\r\n LEVINSWAP_LIST,\r\n LEVINSWAP_STABLECOIN_LIST,\r\n REALT_LIST,\r\n REN_LIST,\r\n SYNTHETIX_LST,\r\n BSC_LIST\r\n]\r\n\r\n// default lists to be 'active' aka searched across\r\nexport const DEFAULT_ACTIVE_LIST_URLS: string[] = []\r\n","import { DEFAULT_LIST_OF_LISTS } from './../constants/lists'\n\n// use ordering of default list of lists to assign priority\nexport default function sortByListPriority(urlA: string, urlB: string) {\n const first = DEFAULT_LIST_OF_LISTS.includes(urlA) ? DEFAULT_LIST_OF_LISTS.indexOf(urlA) : Number.MAX_SAFE_INTEGER\n const second = DEFAULT_LIST_OF_LISTS.includes(urlB) ? DEFAULT_LIST_OF_LISTS.indexOf(urlB) : Number.MAX_SAFE_INTEGER\n\n // need reverse order to make sure mapping includes top priority last\n if (first < second) return 1\n else if (first > second) return -1\n return 0\n}\n","import { UNSUPPORTED_LIST_URLS } from './../../constants/lists'\r\n//import DEFAULT_TOKEN_LIST from 'levinswap-default-token-list'\r\nimport { ChainId, Token } from '@levinswap/uniswap-sdk'\r\nimport { Tags, TokenInfo, TokenList } from '@uniswap/token-lists'\r\nimport { useMemo } from 'react'\r\nimport { useSelector } from 'react-redux'\r\nimport { AppState } from '../index'\r\nimport sortByListPriority from 'utils/listSort'\r\nimport UNSUPPORTED_TOKEN_LIST from '../../constants/tokenLists/uniswap-v2-unsupported.tokenlist.json'\r\n\r\ntype TagDetails = Tags[keyof Tags]\r\nexport interface TagInfo extends TagDetails {\r\n id: string\r\n}\r\n\r\n/**\r\n * Token instances created from token info.\r\n */\r\nexport class WrappedTokenInfo extends Token {\r\n public readonly tokenInfo: TokenInfo\r\n public readonly tags: TagInfo[]\r\n constructor(tokenInfo: TokenInfo, tags: TagInfo[]) {\r\n super(tokenInfo.chainId, tokenInfo.address, tokenInfo.decimals, tokenInfo.symbol, tokenInfo.name)\r\n this.tokenInfo = tokenInfo\r\n this.tags = tags\r\n }\r\n public get logoURI(): string | undefined {\r\n return this.tokenInfo.logoURI\r\n }\r\n}\r\n\r\nexport type TokenAddressMap = Readonly<\r\n { [chainId in ChainId]: Readonly<{ [tokenAddress: string]: { token: WrappedTokenInfo; list: TokenList } }> }\r\n>\r\n\r\n/**\r\n * An empty result, useful as a default.\r\n */\r\nconst EMPTY_LIST: TokenAddressMap = {\r\n [ChainId.KOVAN]: {},\r\n [ChainId.RINKEBY]: {},\r\n [ChainId.ROPSTEN]: {},\r\n [ChainId.GÖRLI]: {},\r\n [ChainId.MAINNET]: {},\r\n [ChainId.XDAI]: {}\r\n}\r\n\r\nconst listCache: WeakMap | null =\r\n typeof WeakMap !== 'undefined' ? new WeakMap() : null\r\n\r\nexport function listToTokenMap(list: TokenList): TokenAddressMap {\r\n const result = listCache?.get(list)\r\n if (result) return result\r\n\r\n const map = list.tokens.reduce(\r\n (tokenMap, tokenInfo) => {\r\n const tags: TagInfo[] =\r\n tokenInfo.tags\r\n ?.map(tagId => {\r\n if (!list.tags?.[tagId]) return undefined\r\n return { ...list.tags[tagId], id: tagId }\r\n })\r\n ?.filter((x): x is TagInfo => Boolean(x)) ?? []\r\n const token = new WrappedTokenInfo(tokenInfo, tags)\r\n if (tokenMap[token.chainId][token.address] !== undefined) throw Error('Duplicate tokens.')\r\n return {\r\n ...tokenMap,\r\n [token.chainId]: {\r\n ...tokenMap[token.chainId],\r\n [token.address]: {\r\n token,\r\n list: list\r\n }\r\n }\r\n }\r\n },\r\n { ...EMPTY_LIST }\r\n )\r\n listCache?.set(list, map)\r\n return map\r\n}\r\n\r\nexport function useAllLists(): {\r\n readonly [url: string]: {\r\n readonly current: TokenList | null\r\n readonly pendingUpdate: TokenList | null\r\n readonly loadingRequestId: string | null\r\n readonly error: string | null\r\n }\r\n} {\r\n return useSelector(state => state.lists.byUrl)\r\n}\r\n\r\nfunction combineMaps(map1: TokenAddressMap, map2: TokenAddressMap): TokenAddressMap {\r\n return {\r\n 1: { ...map1[1], ...map2[1] },\r\n 3: { ...map1[3], ...map2[3] },\r\n 4: { ...map1[4], ...map2[4] },\r\n 5: { ...map1[5], ...map2[5] },\r\n 42: { ...map1[42], ...map2[42] },\r\n 100: { ...map1[100], ...map2[100] }\r\n }\r\n}\r\n\r\n// merge tokens contained within lists from urls\r\nfunction useCombinedTokenMapFromUrls(urls: string[] | undefined): TokenAddressMap {\r\n const lists = useAllLists()\r\n\r\n return useMemo(() => {\r\n if (!urls) return EMPTY_LIST\r\n\r\n return (\r\n urls\r\n .slice()\r\n // sort by priority so top priority goes last\r\n .sort(sortByListPriority)\r\n .reduce((allTokens, currentUrl) => {\r\n const current = lists[currentUrl]?.current\r\n if (!current) return allTokens\r\n try {\r\n const newTokens = Object.assign(listToTokenMap(current))\r\n return combineMaps(allTokens, newTokens)\r\n } catch (error) {\r\n return allTokens\r\n }\r\n }, EMPTY_LIST)\r\n )\r\n }, [lists, urls])\r\n}\r\n\r\n// filter out unsupported lists\r\nexport function useActiveListUrls(): string[] | undefined {\r\n return useSelector(state => state.lists.activeListUrls)?.filter(\r\n url => !UNSUPPORTED_LIST_URLS.includes(url)\r\n )\r\n}\r\n\r\nexport function useInactiveListUrls(): string[] {\r\n const lists = useAllLists()\r\n const allActiveListUrls = useActiveListUrls()\r\n return Object.keys(lists).filter(url => !allActiveListUrls?.includes(url) && !UNSUPPORTED_LIST_URLS.includes(url))\r\n}\r\n\r\n// get all the tokens from active lists, combine with local default tokens\r\nexport function useCombinedActiveList(): TokenAddressMap {\r\n const activeListUrls = useActiveListUrls()\r\n const activeTokens = useCombinedTokenMapFromUrls(activeListUrls)\r\n /*const defaultTokenMap = listToTokenMap(DEFAULT_TOKEN_LIST)*/\r\n return combineMaps(activeTokens, activeTokens /*defaultTokenMap*/)\r\n}\r\n\r\n// all tokens from inactive lists\r\nexport function useCombinedInactiveList(): TokenAddressMap {\r\n const allInactiveListUrls: string[] = useInactiveListUrls()\r\n return useCombinedTokenMapFromUrls(allInactiveListUrls)\r\n}\r\n\r\n// used to hide warnings on import for default tokens\r\n/*export function useDefaultTokenList(): TokenAddressMap {\r\n return listToTokenMap(DEFAULT_TOKEN_LIST)\r\n}*/\r\n\r\n// list of tokens not supported on interface, used to show warnings and prevent swaps and adds\r\nexport function useUnsupportedTokenList(): TokenAddressMap {\r\n // get hard coded unsupported tokens\r\n const localUnsupportedListMap = listToTokenMap(UNSUPPORTED_TOKEN_LIST)\r\n\r\n // get any loaded unsupported tokens\r\n const loadedUnsupportedListMap = useCombinedTokenMapFromUrls(UNSUPPORTED_LIST_URLS)\r\n\r\n // format into one token address map\r\n return combineMaps(localUnsupportedListMap, loadedUnsupportedListMap)\r\n}\r\n\r\nexport function useIsListActive(url: string): boolean {\r\n const activeListUrls = useActiveListUrls()\r\n return Boolean(activeListUrls?.includes(url))\r\n}\r\n","import { createAction } from '@reduxjs/toolkit'\nimport { TokenList } from '@uniswap/token-lists'\n\nexport type PopupContent =\n | {\n txn: {\n hash: string\n success: boolean\n summary?: string\n }\n }\n | {\n listUpdate: {\n listUrl: string\n oldList: TokenList\n newList: TokenList\n auto: boolean\n }\n }\n\nexport enum ApplicationModal {\n WALLET,\n SETTINGS,\n SELF_CLAIM,\n ADDRESS_CLAIM,\n CLAIM_POPUP,\n MENU,\n DELEGATE\n}\n\nexport const updateBlockNumber = createAction<{ chainId: number; blockNumber: number }>('application/updateBlockNumber')\nexport const setOpenModal = createAction('application/setOpenModal')\nexport const addPopup = createAction<{ key?: string; removeAfterMs?: number | null; content: PopupContent }>(\n 'application/addPopup'\n)\nexport const removePopup = createAction<{ key: string }>('application/removePopup')\n","import { useCallback, useMemo } from 'react'\nimport { useDispatch, useSelector } from 'react-redux'\nimport { useActiveWeb3React } from '../../hooks'\nimport { AppDispatch, AppState } from '../index'\nimport { addPopup, ApplicationModal, PopupContent, removePopup, setOpenModal } from './actions'\n\nexport function useBlockNumber(): number | undefined {\n const { chainId } = useActiveWeb3React()\n\n return useSelector((state: AppState) => state.application.blockNumber[chainId ?? -1])\n}\n\nexport function useModalOpen(modal: ApplicationModal): boolean {\n const openModal = useSelector((state: AppState) => state.application.openModal)\n return openModal === modal\n}\n\nexport function useToggleModal(modal: ApplicationModal): () => void {\n const open = useModalOpen(modal)\n const dispatch = useDispatch()\n return useCallback(() => dispatch(setOpenModal(open ? null : modal)), [dispatch, modal, open])\n}\n\nexport function useOpenModal(modal: ApplicationModal): () => void {\n const dispatch = useDispatch()\n return useCallback(() => dispatch(setOpenModal(modal)), [dispatch, modal])\n}\n\nexport function useCloseModals(): () => void {\n const dispatch = useDispatch()\n return useCallback(() => dispatch(setOpenModal(null)), [dispatch])\n}\n\nexport function useWalletModalToggle(): () => void {\n return useToggleModal(ApplicationModal.WALLET)\n}\n\nexport function useToggleSettingsMenu(): () => void {\n return useToggleModal(ApplicationModal.SETTINGS)\n}\n\n// export function useShowClaimPopup(): boolean {\n// return useModalOpen(ApplicationModal.CLAIM_POPUP)\n// }\n\n// export function useToggleShowClaimPopup(): () => void {\n// return useToggleModal(ApplicationModal.CLAIM_POPUP)\n// }\n\n// export function useToggleSelfClaimModal(): () => void {\n// return useToggleModal(ApplicationModal.SELF_CLAIM)\n// }\n\n// returns a function that allows adding a popup\nexport function useAddPopup(): (content: PopupContent, key?: string) => void {\n const dispatch = useDispatch()\n\n return useCallback(\n (content: PopupContent, key?: string) => {\n dispatch(addPopup({ content, key }))\n },\n [dispatch]\n )\n}\n\n// returns a function that allows removing a popup via its key\nexport function useRemovePopup(): (key: string) => void {\n const dispatch = useDispatch()\n return useCallback(\n (key: string) => {\n dispatch(removePopup({ key }))\n },\n [dispatch]\n )\n}\n\n// get the list of active popups\nexport function useActivePopups(): AppState['application']['popupList'] {\n const list = useSelector((state: AppState) => state.application.popupList)\n return useMemo(() => list.filter(item => item.show), [list])\n}\n","import { createAction } from '@reduxjs/toolkit'\n\nexport interface Call {\n address: string\n callData: string\n}\n\nconst ADDRESS_REGEX = /^0x[a-fA-F0-9]{40}$/\nconst LOWER_HEX_REGEX = /^0x[a-f0-9]*$/\nexport function toCallKey(call: Call): string {\n if (!ADDRESS_REGEX.test(call.address)) {\n throw new Error(`Invalid address: ${call.address}`)\n }\n if (!LOWER_HEX_REGEX.test(call.callData)) {\n throw new Error(`Invalid hex: ${call.callData}`)\n }\n return `${call.address}-${call.callData}`\n}\n\nexport function parseCallKey(callKey: string): Call {\n const pcs = callKey.split('-')\n if (pcs.length !== 2) {\n throw new Error(`Invalid call key: ${callKey}`)\n }\n return {\n address: pcs[0],\n callData: pcs[1]\n }\n}\n\nexport interface ListenerOptions {\n // how often this data should be fetched, by default 1\n readonly blocksPerFetch?: number\n}\n\nexport const addMulticallListeners = createAction<{ chainId: number; calls: Call[]; options?: ListenerOptions }>(\n 'multicall/addMulticallListeners'\n)\nexport const removeMulticallListeners = createAction<{ chainId: number; calls: Call[]; options?: ListenerOptions }>(\n 'multicall/removeMulticallListeners'\n)\nexport const fetchingMulticallResults = createAction<{ chainId: number; calls: Call[]; fetchingBlockNumber: number }>(\n 'multicall/fetchingMulticallResults'\n)\nexport const errorFetchingMulticallResults = createAction<{\n chainId: number\n calls: Call[]\n fetchingBlockNumber: number\n}>('multicall/errorFetchingMulticallResults')\nexport const updateMulticallResults = createAction<{\n chainId: number\n blockNumber: number\n results: {\n [callKey: string]: string | null\n }\n}>('multicall/updateMulticallResults')\n","import { Interface, FunctionFragment } from '@ethersproject/abi'\nimport { BigNumber } from '@ethersproject/bignumber'\nimport { Contract } from '@ethersproject/contracts'\nimport { useEffect, useMemo } from 'react'\nimport { useDispatch, useSelector } from 'react-redux'\nimport { useActiveWeb3React } from '../../hooks'\nimport { useBlockNumber } from '../application/hooks'\nimport { AppDispatch, AppState } from '../index'\nimport {\n addMulticallListeners,\n Call,\n removeMulticallListeners,\n parseCallKey,\n toCallKey,\n ListenerOptions\n} from './actions'\n\nexport interface Result extends ReadonlyArray {\n readonly [key: string]: any\n}\n\ntype MethodArg = string | number | BigNumber\ntype MethodArgs = Array\n\ntype OptionalMethodInputs = Array | undefined\n\nfunction isMethodArg(x: unknown): x is MethodArg {\n return ['string', 'number'].indexOf(typeof x) !== -1\n}\n\nfunction isValidMethodArgs(x: unknown): x is MethodArgs | undefined {\n return (\n x === undefined ||\n (Array.isArray(x) && x.every(xi => isMethodArg(xi) || (Array.isArray(xi) && xi.every(isMethodArg))))\n )\n}\n\ninterface CallResult {\n readonly valid: boolean\n readonly data: string | undefined\n readonly blockNumber: number | undefined\n}\n\nconst INVALID_RESULT: CallResult = { valid: false, blockNumber: undefined, data: undefined }\n\n// use this options object\nexport const NEVER_RELOAD: ListenerOptions = {\n blocksPerFetch: Infinity\n}\n\n// the lowest level call for subscribing to contract data\nfunction useCallsData(calls: (Call | undefined)[], options?: ListenerOptions): CallResult[] {\n const { chainId } = useActiveWeb3React()\n const callResults = useSelector(state => state.multicall.callResults)\n const dispatch = useDispatch()\n\n const serializedCallKeys: string = useMemo(\n () =>\n JSON.stringify(\n calls\n ?.filter((c): c is Call => Boolean(c))\n ?.map(toCallKey)\n ?.sort() ?? []\n ),\n [calls]\n )\n\n // update listeners when there is an actual change that persists for at least 100ms\n useEffect(() => {\n const callKeys: string[] = JSON.parse(serializedCallKeys)\n if (!chainId || callKeys.length === 0) return undefined\n const calls = callKeys.map(key => parseCallKey(key))\n dispatch(\n addMulticallListeners({\n chainId,\n calls,\n options\n })\n )\n\n return () => {\n dispatch(\n removeMulticallListeners({\n chainId,\n calls,\n options\n })\n )\n }\n }, [chainId, dispatch, options, serializedCallKeys])\n\n return useMemo(\n () =>\n calls.map(call => {\n if (!chainId || !call) return INVALID_RESULT\n\n const result = callResults[chainId]?.[toCallKey(call)]\n let data\n if (result?.data && result?.data !== '0x') {\n data = result.data\n }\n\n return { valid: true, data, blockNumber: result?.blockNumber }\n }),\n [callResults, calls, chainId]\n )\n}\n\ninterface CallState {\n readonly valid: boolean\n // the result, or undefined if loading or errored/no data\n readonly result: Result | undefined\n // true if the result has never been fetched\n readonly loading: boolean\n // true if the result is not for the latest block\n readonly syncing: boolean\n // true if the call was made and is synced, but the return data is invalid\n readonly error: boolean\n}\n\nconst INVALID_CALL_STATE: CallState = { valid: false, result: undefined, loading: false, syncing: false, error: false }\nconst LOADING_CALL_STATE: CallState = { valid: true, result: undefined, loading: true, syncing: true, error: false }\n\nfunction toCallState(\n callResult: CallResult | undefined,\n contractInterface: Interface | undefined,\n fragment: FunctionFragment | undefined,\n latestBlockNumber: number | undefined\n): CallState {\n if (!callResult) return INVALID_CALL_STATE\n const { valid, data, blockNumber } = callResult\n if (!valid) return INVALID_CALL_STATE\n if (valid && !blockNumber) return LOADING_CALL_STATE\n if (!contractInterface || !fragment || !latestBlockNumber) return LOADING_CALL_STATE\n const success = data && data.length > 2\n const syncing = (blockNumber ?? 0) < latestBlockNumber\n let result: Result | undefined = undefined\n if (success && data) {\n try {\n result = contractInterface.decodeFunctionResult(fragment, data)\n } catch (error) {\n console.debug('Result data parsing failed', fragment, data)\n return {\n valid: true,\n loading: false,\n error: true,\n syncing,\n result\n }\n }\n }\n return {\n valid: true,\n loading: false,\n syncing,\n result: result,\n error: !success\n }\n}\n\nexport function useSingleContractMultipleData(\n contract: Contract | null | undefined,\n methodName: string,\n callInputs: OptionalMethodInputs[],\n options?: ListenerOptions\n): CallState[] {\n const fragment = useMemo(() => contract?.interface?.getFunction(methodName), [contract, methodName])\n\n const calls = useMemo(\n () =>\n contract && fragment && callInputs && callInputs.length > 0\n ? callInputs.map(inputs => {\n return {\n address: contract.address,\n callData: contract.interface.encodeFunctionData(fragment, inputs)\n }\n })\n : [],\n [callInputs, contract, fragment]\n )\n\n const results = useCallsData(calls, options)\n\n const latestBlockNumber = useBlockNumber()\n\n return useMemo(() => {\n return results.map(result => toCallState(result, contract?.interface, fragment, latestBlockNumber))\n }, [fragment, contract, results, latestBlockNumber])\n}\n\nexport function useMultipleContractSingleData(\n addresses: (string | undefined)[],\n contractInterface: Interface,\n methodName: string,\n callInputs?: OptionalMethodInputs,\n options?: ListenerOptions\n): CallState[] {\n const fragment = useMemo(() => contractInterface.getFunction(methodName), [contractInterface, methodName])\n const callData: string | undefined = useMemo(\n () =>\n fragment && isValidMethodArgs(callInputs)\n ? contractInterface.encodeFunctionData(fragment, callInputs)\n : undefined,\n [callInputs, contractInterface, fragment]\n )\n\n const calls = useMemo(\n () =>\n fragment && addresses && addresses.length > 0 && callData\n ? addresses.map(address => {\n return address && callData\n ? {\n address,\n callData\n }\n : undefined\n })\n : [],\n [addresses, callData, fragment]\n )\n\n const results = useCallsData(calls, options)\n\n const latestBlockNumber = useBlockNumber()\n\n return useMemo(() => {\n return results.map(result => toCallState(result, contractInterface, fragment, latestBlockNumber))\n }, [fragment, results, contractInterface, latestBlockNumber])\n}\n\nexport function useSingleCallResult(\n contract: Contract | null | undefined,\n methodName: string,\n inputs?: OptionalMethodInputs,\n options?: ListenerOptions\n): CallState {\n const fragment = useMemo(() => contract?.interface?.getFunction(methodName), [contract, methodName])\n\n const calls = useMemo(() => {\n return contract && fragment && isValidMethodArgs(inputs)\n ? [\n {\n address: contract.address,\n callData: contract.interface.encodeFunctionData(fragment, inputs)\n }\n ]\n : []\n }, [contract, fragment, inputs])\n\n const result = useCallsData(calls, options)[0]\n const latestBlockNumber = useBlockNumber()\n\n return useMemo(() => {\n return toCallState(result, contract?.interface, fragment, latestBlockNumber)\n }, [result, contract, fragment, latestBlockNumber])\n}\n","import { Contract } from '@ethersproject/contracts'\r\nimport { getAddress } from '@ethersproject/address'\r\nimport { AddressZero } from '@ethersproject/constants'\r\nimport { JsonRpcSigner, Web3Provider } from '@ethersproject/providers'\r\nimport { BigNumber } from '@ethersproject/bignumber'\r\nimport { abi as IUniswapV2Router02ABI } from '@uniswap/v2-periphery/build/IUniswapV2Router02.json'\r\nimport { ROUTER_ADDRESS } from '../constants'\r\nimport { ChainId, JSBI, Percent, Token, CurrencyAmount, Currency, ETHER } from '@levinswap/uniswap-sdk'\r\nimport { TokenAddressMap } from '../state/lists/hooks'\r\n\r\n// returns the checksummed address if the address is valid, otherwise returns false\r\nexport function isAddress(value: any): string | false {\r\n try {\r\n return getAddress(value)\r\n } catch {\r\n return false\r\n }\r\n}\r\n\r\nconst ETHERSCAN_PREFIXES: { [chainId in ChainId]: string } = {\r\n 1: '',\r\n 3: 'ropsten.',\r\n 4: 'rinkeby.',\r\n 5: 'goerli.',\r\n 42: 'kovan.',\r\n 100: 'xdai.'\r\n}\r\n\r\nexport function getEtherscanLink(\r\n chainId: ChainId,\r\n data: string,\r\n type: 'transaction' | 'token' | 'address' | 'block'\r\n): string {\r\n const prefix =\r\n chainId !== 100\r\n ? `https://${ETHERSCAN_PREFIXES[chainId] || ETHERSCAN_PREFIXES[1]}blockscout.com/poa/xdai`\r\n : `https://blockscout.com/poa/xdai`\r\n\r\n switch (type) {\r\n case 'transaction': {\r\n return `${prefix}/tx/${data}`\r\n }\r\n case 'token': {\r\n return `${prefix}/token/${data}`\r\n }\r\n case 'block': {\r\n return `${prefix}/block/${data}`\r\n }\r\n case 'address':\r\n default: {\r\n return `${prefix}/address/${data}`\r\n }\r\n }\r\n}\r\n\r\n// shorten the checksummed version of the input address to have 0x + 4 characters at start and end\r\nexport function shortenAddress(address: string, chars = 4): string {\r\n const parsed = isAddress(address)\r\n if (!parsed) {\r\n throw Error(`Invalid 'address' parameter '${address}'.`)\r\n }\r\n return `${parsed.substring(0, chars + 2)}...${parsed.substring(42 - chars)}`\r\n}\r\n\r\n// add 10%\r\nexport function calculateGasMargin(value: BigNumber): BigNumber {\r\n return value.mul(BigNumber.from(10000).add(BigNumber.from(1000))).div(BigNumber.from(10000))\r\n}\r\n\r\n// converts a basis points value to a sdk percent\r\nexport function basisPointsToPercent(num: number): Percent {\r\n return new Percent(JSBI.BigInt(num), JSBI.BigInt(10000))\r\n}\r\n\r\nexport function calculateSlippageAmount(value: CurrencyAmount, slippage: number): [JSBI, JSBI] {\r\n if (slippage < 0 || slippage > 10000) {\r\n throw Error(`Unexpected slippage value: ${slippage}`)\r\n }\r\n return [\r\n JSBI.divide(JSBI.multiply(value.raw, JSBI.BigInt(10000 - slippage)), JSBI.BigInt(10000)),\r\n JSBI.divide(JSBI.multiply(value.raw, JSBI.BigInt(10000 + slippage)), JSBI.BigInt(10000))\r\n ]\r\n}\r\n\r\n// account is not optional\r\nexport function getSigner(library: Web3Provider, account: string): JsonRpcSigner {\r\n return library.getSigner(account).connectUnchecked()\r\n}\r\n\r\n// account is optional\r\nexport function getProviderOrSigner(library: Web3Provider, account?: string): Web3Provider | JsonRpcSigner {\r\n return account ? getSigner(library, account) : library\r\n}\r\n\r\n// account is optional\r\nexport function getContract(address: string, ABI: any, library: Web3Provider, account?: string): Contract {\r\n if (!isAddress(address) || address === AddressZero) {\r\n throw Error(`Invalid 'address' parameter '${address}'.`)\r\n }\r\n\r\n return new Contract(address, ABI, getProviderOrSigner(library, account) as any)\r\n}\r\n\r\n// account is optional\r\nexport function getRouterContract(_: number, library: Web3Provider, account?: string): Contract {\r\n return getContract(ROUTER_ADDRESS, IUniswapV2Router02ABI, library, account)\r\n}\r\n\r\nexport function escapeRegExp(string: string): string {\r\n return string.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&') // $& means the whole matched string\r\n}\r\n\r\nexport function isTokenOnList(defaultTokens: TokenAddressMap, currency?: Currency): boolean {\r\n if (currency === ETHER) return true\r\n return Boolean(currency instanceof Token && defaultTokens[currency.chainId]?.[currency.address])\r\n}\r\n","import { Interface } from '@ethersproject/abi'\nimport ERC20_ABI from './erc20.json'\nimport ERC20_BYTES32_ABI from './erc20_bytes32.json'\n\nconst ERC20_INTERFACE = new Interface(ERC20_ABI)\n\nconst ERC20_BYTES32_INTERFACE = new Interface(ERC20_BYTES32_ABI)\n\nexport default ERC20_INTERFACE\nexport { ERC20_ABI, ERC20_BYTES32_INTERFACE, ERC20_BYTES32_ABI }\n","import MIGRATOR_ABI from './migrator.json'\n\nconst MIGRATOR_ADDRESS = '0x16D4F26C15f3658ec65B1126ff27DD3dF2a2996b'\n\nexport { MIGRATOR_ADDRESS, MIGRATOR_ABI }\n","import { ChainId } from '@levinswap/uniswap-sdk'\r\nimport MULTICALL_ABI from './abi.json'\r\n\r\nconst MULTICALL_NETWORKS: { [chainId in ChainId]: string } = {\r\n [ChainId.MAINNET]: '0xeefBa1e63905eF1D7ACbA5a8513c70307C1cE441',\r\n [ChainId.ROPSTEN]: '0x53C43764255c17BD724F74c4eF150724AC50a3ed',\r\n [ChainId.KOVAN]: '0x2cc8688C5f75E365aaEEb4ea8D6a480405A48D2A',\r\n [ChainId.RINKEBY]: '0x42Ad527de7d4e9d9d011aC45B31D8551f8Fe9821',\r\n [ChainId.GÖRLI]: '0x77dCa2C955b15e9dE4dbBCf1246B4B85b651e50e',\r\n [ChainId.XDAI]: '0xb5b692a88BDFc81ca69dcB1d924f59f0413A602a'\r\n}\r\n\r\nexport { MULTICALL_ABI, MULTICALL_NETWORKS }\r\n","import { Interface } from '@ethersproject/abi'\r\nimport { ChainId } from '@levinswap/uniswap-sdk'\r\nimport V1_EXCHANGE_ABI from './v1_exchange.json'\r\nimport V1_FACTORY_ABI from './v1_factory.json'\r\n\r\nconst V1_FACTORY_ADDRESSES: { [chainId in ChainId]: string } = {\r\n [ChainId.MAINNET]: '0xc0a47dFe034B400B47bDaD5FecDa2621de6c4d95',\r\n [ChainId.ROPSTEN]: '0x9c83dCE8CA20E9aAF9D3efc003b2ea62aBC08351',\r\n [ChainId.RINKEBY]: '0xf5D915570BC477f9B8D6C0E980aA81757A3AaC36',\r\n [ChainId.GÖRLI]: '0x6Ce570d02D73d4c384b46135E87f8C592A8c86dA',\r\n [ChainId.KOVAN]: '0xD3E51Ef092B2845f10401a0159B2B96e8B6c3D30',\r\n [ChainId.XDAI]: ''\r\n}\r\n\r\nconst V1_FACTORY_INTERFACE = new Interface(V1_FACTORY_ABI)\r\nconst V1_EXCHANGE_INTERFACE = new Interface(V1_EXCHANGE_ABI)\r\n\r\nexport { V1_FACTORY_ADDRESSES, V1_FACTORY_INTERFACE, V1_FACTORY_ABI, V1_EXCHANGE_INTERFACE, V1_EXCHANGE_ABI }\r\n","import { Contract } from '@ethersproject/contracts'\r\n// import { abi as STAKING_REWARDS_ABI } from '@uniswap/liquidity-staker/build/StakingRewards.json'\r\nimport { ChainId, WETH } from '@levinswap/uniswap-sdk'\r\nimport { abi as IUniswapV2PairABI } from '@uniswap/v2-core/build/IUniswapV2Pair.json'\r\nimport { useMemo } from 'react'\r\nimport ENS_PUBLIC_RESOLVER_ABI from '../constants/abis/ens-public-resolver.json'\r\nimport ENS_ABI from '../constants/abis/ens-registrar.json'\r\nimport { ERC20_BYTES32_ABI } from '../constants/abis/erc20'\r\nimport ERC20_ABI from '../constants/abis/erc20.json'\r\nimport { MIGRATOR_ABI, MIGRATOR_ADDRESS } from '../constants/abis/migrator'\r\nimport UNISOCKS_ABI from '../constants/abis/unisocks.json'\r\nimport WETH_ABI from '../constants/abis/weth.json'\r\nimport { MULTICALL_ABI, MULTICALL_NETWORKS } from '../constants/multicall'\r\nimport { V1_EXCHANGE_ABI, V1_FACTORY_ABI, V1_FACTORY_ADDRESSES } from '../constants/v1'\r\nimport { getContract } from '../utils'\r\nimport { useActiveWeb3React } from './index'\r\n\r\n// returns null on errors\r\nfunction useContract(address: string | undefined, ABI: any, withSignerIfPossible = true): Contract | null {\r\n const { library, account } = useActiveWeb3React()\r\n\r\n return useMemo(() => {\r\n if (!address || !ABI || !library) return null\r\n try {\r\n return getContract(address, ABI, library, withSignerIfPossible && account ? account : undefined)\r\n } catch (error) {\r\n console.error('Failed to get contract', error)\r\n return null\r\n }\r\n }, [address, ABI, library, withSignerIfPossible, account])\r\n}\r\n\r\nexport function useV1FactoryContract(): Contract | null {\r\n const { chainId } = useActiveWeb3React()\r\n return useContract(chainId && V1_FACTORY_ADDRESSES[chainId], V1_FACTORY_ABI, false)\r\n}\r\n\r\nexport function useV2MigratorContract(): Contract | null {\r\n return useContract(MIGRATOR_ADDRESS, MIGRATOR_ABI, true)\r\n}\r\n\r\nexport function useV1ExchangeContract(address?: string, withSignerIfPossible?: boolean): Contract | null {\r\n return useContract(address, V1_EXCHANGE_ABI, withSignerIfPossible)\r\n}\r\n\r\nexport function useTokenContract(tokenAddress?: string, withSignerIfPossible?: boolean): Contract | null {\r\n return useContract(tokenAddress, ERC20_ABI, withSignerIfPossible)\r\n}\r\n\r\nexport function useWETHContract(withSignerIfPossible?: boolean): Contract | null {\r\n const { chainId } = useActiveWeb3React()\r\n return useContract(chainId ? WETH[chainId].address : undefined, WETH_ABI, withSignerIfPossible)\r\n}\r\n\r\nexport function useENSRegistrarContract(withSignerIfPossible?: boolean): Contract | null {\r\n const { chainId } = useActiveWeb3React()\r\n let address: string | undefined\r\n if (chainId) {\r\n switch (chainId) {\r\n case ChainId.XDAI:\r\n address = '0x25D2252Ec30de7830b6825D6b4A08E70a581cD6a'\r\n break\r\n case ChainId.MAINNET:\r\n case ChainId.GÖRLI:\r\n case ChainId.ROPSTEN:\r\n case ChainId.RINKEBY:\r\n address = '0x00000000000C2E074eC69A0dFb2997BA6C7d2e1e'\r\n break\r\n }\r\n }\r\n return useContract(address, ENS_ABI, withSignerIfPossible)\r\n}\r\n\r\nexport function useENSResolverContract(address: string | undefined, withSignerIfPossible?: boolean): Contract | null {\r\n return useContract(address, ENS_PUBLIC_RESOLVER_ABI, withSignerIfPossible)\r\n}\r\n\r\nexport function useBytes32TokenContract(tokenAddress?: string, withSignerIfPossible?: boolean): Contract | null {\r\n return useContract(tokenAddress, ERC20_BYTES32_ABI, withSignerIfPossible)\r\n}\r\n\r\nexport function usePairContract(pairAddress?: string, withSignerIfPossible?: boolean): Contract | null {\r\n return useContract(pairAddress, IUniswapV2PairABI, withSignerIfPossible)\r\n}\r\n\r\nexport function useMulticallContract(): Contract | null {\r\n const { chainId } = useActiveWeb3React()\r\n return useContract(chainId && MULTICALL_NETWORKS[chainId], MULTICALL_ABI, false)\r\n}\r\n\r\n// export function useStakingContract(stakingAddress?: string, withSignerIfPossible?: boolean): Contract | null {\r\n// return useContract(stakingAddress, STAKING_REWARDS_ABI, withSignerIfPossible)\r\n// }\r\n\r\nexport function useSocksController(): Contract | null {\r\n const { chainId } = useActiveWeb3React()\r\n return useContract(\r\n chainId === ChainId.MAINNET ? '0x65770b5283117639760beA3F867b69b3697a91dd' : undefined,\r\n UNISOCKS_ABI,\r\n false\r\n )\r\n}\r\n","import { useMemo } from 'react'\r\nimport { isAddress } from '../../utils'\r\nimport { Token } from '@levinswap/uniswap-sdk'\r\n\r\nexport function filterTokens(tokens: Token[], search: string): Token[] {\r\n if (search.length === 0) return tokens\r\n\r\n const searchingAddress = isAddress(search)\r\n\r\n if (searchingAddress) {\r\n return tokens.filter(token => token.address === searchingAddress)\r\n }\r\n\r\n const lowerSearchParts = search\r\n .toLowerCase()\r\n .split(/\\s+/)\r\n .filter(s => s.length > 0)\r\n\r\n if (lowerSearchParts.length === 0) {\r\n return tokens\r\n }\r\n\r\n const matchesSearch = (s: string): boolean => {\r\n const sParts = s\r\n .toLowerCase()\r\n .split(/\\s+/)\r\n .filter(s => s.length > 0)\r\n\r\n return lowerSearchParts.every(p => p.length === 0 || sParts.some(sp => sp.startsWith(p) || sp.endsWith(p)))\r\n }\r\n\r\n return tokens.filter(token => {\r\n const { symbol, name } = token\r\n\r\n return (symbol && matchesSearch(symbol)) || (name && matchesSearch(name))\r\n })\r\n}\r\n\r\nexport function useSortedTokensByQuery(tokens: Token[] | undefined, searchQuery: string): Token[] {\r\n return useMemo(() => {\r\n if (!tokens) {\r\n return []\r\n }\r\n\r\n const symbolMatch = searchQuery\r\n .toLowerCase()\r\n .split(/\\s+/)\r\n .filter(s => s.length > 0)\r\n\r\n if (symbolMatch.length > 1) {\r\n return tokens\r\n }\r\n\r\n const exactMatches: Token[] = []\r\n const symbolSubtrings: Token[] = []\r\n const rest: Token[] = []\r\n\r\n // sort tokens by exact match -> subtring on symbol match -> rest\r\n tokens.map(token => {\r\n if (token.symbol?.toLowerCase() === symbolMatch[0]) {\r\n return exactMatches.push(token)\r\n } else if (token.symbol?.toLowerCase().startsWith(searchQuery.toLowerCase().trim())) {\r\n return symbolSubtrings.push(token)\r\n } else {\r\n return rest.push(token)\r\n }\r\n })\r\n\r\n return [...exactMatches, ...symbolSubtrings, ...rest]\r\n }, [tokens, searchQuery])\r\n}\r\n","import { TokenAddressMap, /*useDefaultTokenList,*/ useUnsupportedTokenList } from './../state/lists/hooks'\r\nimport { parseBytes32String } from '@ethersproject/strings'\r\nimport { Currency, ETHER, Token, currencyEquals } from '@levinswap/uniswap-sdk'\r\nimport { useMemo } from 'react'\r\nimport { useCombinedActiveList, useCombinedInactiveList } from '../state/lists/hooks'\r\nimport { NEVER_RELOAD, useSingleCallResult } from '../state/multicall/hooks'\r\nimport { useUserAddedTokens } from '../state/user/hooks'\r\nimport { isAddress } from '../utils'\r\n\r\nimport { useActiveWeb3React } from './index'\r\nimport { useBytes32TokenContract, useTokenContract } from './useContract'\r\nimport { filterTokens } from '../components/SearchModal/filtering'\r\nimport { arrayify } from 'ethers/lib/utils'\r\n\r\n// reduce token map into standard address <-> Token mapping, optionally include user added tokens\r\nfunction useTokensFromMap(tokenMap: TokenAddressMap, includeUserAdded: boolean): { [address: string]: Token } {\r\n const { chainId } = useActiveWeb3React()\r\n const userAddedTokens = useUserAddedTokens()\r\n\r\n return useMemo(() => {\r\n if (!chainId) return {}\r\n\r\n // reduce to just tokens\r\n const mapWithoutUrls = Object.keys(tokenMap[chainId]).reduce<{ [address: string]: Token }>((newMap, address) => {\r\n newMap[address] = tokenMap[chainId][address].token\r\n return newMap\r\n }, {})\r\n\r\n if (includeUserAdded) {\r\n return (\r\n userAddedTokens\r\n // reduce into all ALL_TOKENS filtered by the current chain\r\n .reduce<{ [address: string]: Token }>(\r\n (tokenMap, token) => {\r\n tokenMap[token.address] = token\r\n return tokenMap\r\n },\r\n // must make a copy because reduce modifies the map, and we do not\r\n // want to make a copy in every iteration\r\n { ...mapWithoutUrls }\r\n )\r\n )\r\n }\r\n\r\n return mapWithoutUrls\r\n }, [chainId, userAddedTokens, tokenMap, includeUserAdded])\r\n}\r\n\r\n/*export function useDefaultTokens(): { [address: string]: Token } {\r\n const defaultList = useDefaultTokenList()\r\n return useTokensFromMap(defaultList, false)\r\n}*/\r\n\r\nexport function useAllTokens(): { [address: string]: Token } {\r\n const allTokens = useCombinedActiveList()\r\n return useTokensFromMap(allTokens, true)\r\n}\r\n\r\nexport function useAllInactiveTokens(): { [address: string]: Token } {\r\n // get inactive tokens\r\n const inactiveTokensMap = useCombinedInactiveList()\r\n const inactiveTokens = useTokensFromMap(inactiveTokensMap, false)\r\n\r\n // filter out any token that are on active list\r\n const activeTokensAddresses = Object.keys(useAllTokens())\r\n const filteredInactive = activeTokensAddresses\r\n ? Object.keys(inactiveTokens).reduce<{ [address: string]: Token }>((newMap, address) => {\r\n if (!activeTokensAddresses.includes(address)) {\r\n newMap[address] = inactiveTokens[address]\r\n }\r\n return newMap\r\n }, {})\r\n : inactiveTokens\r\n\r\n return filteredInactive\r\n}\r\n\r\nexport function useUnsupportedTokens(): { [address: string]: Token } {\r\n const unsupportedTokensMap = useUnsupportedTokenList()\r\n return useTokensFromMap(unsupportedTokensMap, false)\r\n}\r\n\r\nexport function useIsTokenActive(token: Token | undefined | null): boolean {\r\n const activeTokens = useAllTokens()\r\n\r\n if (!activeTokens || !token) {\r\n return false\r\n }\r\n\r\n return !!activeTokens[token.address]\r\n}\r\n\r\n// used to detect extra search results\r\nexport function useFoundOnInactiveList(searchQuery: string): Token[] | undefined {\r\n const { chainId } = useActiveWeb3React()\r\n const inactiveTokens = useAllInactiveTokens()\r\n\r\n return useMemo(() => {\r\n if (!chainId || searchQuery === '') {\r\n return undefined\r\n } else {\r\n const tokens = filterTokens(Object.values(inactiveTokens), searchQuery)\r\n return tokens\r\n }\r\n }, [chainId, inactiveTokens, searchQuery])\r\n}\r\n\r\n// Check if currency is included in custom list from user storage\r\nexport function useIsUserAddedToken(currency: Currency | undefined | null): boolean {\r\n const userAddedTokens = useUserAddedTokens()\r\n\r\n if (!currency) {\r\n return false\r\n }\r\n\r\n return !!userAddedTokens.find(token => currencyEquals(currency, token))\r\n}\r\n\r\n// parse a name or symbol from a token response\r\nconst BYTES32_REGEX = /^0x[a-fA-F0-9]{64}$/\r\n\r\nfunction parseStringOrBytes32(str: string | undefined, bytes32: string | undefined, defaultValue: string): string {\r\n return str && str.length > 0\r\n ? str\r\n : // need to check for proper bytes string and valid terminator\r\n bytes32 && BYTES32_REGEX.test(bytes32) && arrayify(bytes32)[31] === 0\r\n ? parseBytes32String(bytes32)\r\n : defaultValue\r\n}\r\n\r\n// undefined if invalid or does not exist\r\n// null if loading\r\n// otherwise returns the token\r\nexport function useToken(tokenAddress?: string): Token | undefined | null {\r\n const { chainId } = useActiveWeb3React()\r\n const tokens = useAllTokens()\r\n\r\n const address = isAddress(tokenAddress)\r\n\r\n const tokenContract = useTokenContract(address ? address : undefined, false)\r\n const tokenContractBytes32 = useBytes32TokenContract(address ? address : undefined, false)\r\n const token: Token | undefined = address ? tokens[address] : undefined\r\n\r\n const tokenName = useSingleCallResult(token ? undefined : tokenContract, 'name', undefined, NEVER_RELOAD)\r\n const tokenNameBytes32 = useSingleCallResult(\r\n token ? undefined : tokenContractBytes32,\r\n 'name',\r\n undefined,\r\n NEVER_RELOAD\r\n )\r\n const symbol = useSingleCallResult(token ? undefined : tokenContract, 'symbol', undefined, NEVER_RELOAD)\r\n const symbolBytes32 = useSingleCallResult(token ? undefined : tokenContractBytes32, 'symbol', undefined, NEVER_RELOAD)\r\n const decimals = useSingleCallResult(token ? undefined : tokenContract, 'decimals', undefined, NEVER_RELOAD)\r\n\r\n return useMemo(() => {\r\n if (token) return token\r\n if (!chainId || !address) return undefined\r\n if (decimals.loading || symbol.loading || tokenName.loading) return null\r\n if (decimals.result) {\r\n return new Token(\r\n chainId,\r\n address,\r\n decimals.result[0],\r\n parseStringOrBytes32(symbol.result?.[0], symbolBytes32.result?.[0], 'UNKNOWN'),\r\n parseStringOrBytes32(tokenName.result?.[0], tokenNameBytes32.result?.[0], 'Unknown Token')\r\n )\r\n }\r\n return undefined\r\n }, [\r\n address,\r\n chainId,\r\n decimals.loading,\r\n decimals.result,\r\n symbol.loading,\r\n symbol.result,\r\n symbolBytes32.result,\r\n token,\r\n tokenName.loading,\r\n tokenName.result,\r\n tokenNameBytes32.result\r\n ])\r\n}\r\n\r\nexport function useCurrency(currencyId: string | undefined): Currency | null | undefined {\r\n const isETH = currencyId?.toUpperCase() === 'ETH'\r\n const token = useToken(isETH ? undefined : currencyId)\r\n return isETH ? ETHER : token\r\n}\r\n","import { createAction } from '@reduxjs/toolkit'\n\nexport interface SerializedToken {\n chainId: number\n address: string\n decimals: number\n symbol?: string\n name?: string\n}\n\nexport interface SerializedPair {\n token0: SerializedToken\n token1: SerializedToken\n}\n\nexport const updateMatchesDarkMode = createAction<{ matchesDarkMode: boolean }>('user/updateMatchesDarkMode')\nexport const updateUserDarkMode = createAction<{ userDarkMode: boolean }>('user/updateUserDarkMode')\nexport const updateUserExpertMode = createAction<{ userExpertMode: boolean }>('user/updateUserExpertMode')\nexport const updateUserSlippageTolerance = createAction<{ userSlippageTolerance: number }>(\n 'user/updateUserSlippageTolerance'\n)\nexport const updateUserDeadline = createAction<{ userDeadline: number }>('user/updateUserDeadline')\nexport const addSerializedToken = createAction<{ serializedToken: SerializedToken }>('user/addSerializedToken')\nexport const removeSerializedToken = createAction<{ chainId: number; address: string }>('user/removeSerializedToken')\nexport const addSerializedPair = createAction<{ serializedPair: SerializedPair }>('user/addSerializedPair')\nexport const removeSerializedPair = createAction<{ chainId: number; tokenAAddress: string; tokenBAddress: string }>(\n 'user/removeSerializedPair'\n)\nexport const toggleURLWarning = createAction('app/toggleURLWarning')\n","import { ChainId, Pair, Token } from '@levinswap/uniswap-sdk'\nimport flatMap from 'lodash.flatmap'\nimport { useCallback, useMemo } from 'react'\nimport { shallowEqual, useDispatch, useSelector } from 'react-redux'\nimport { BASES_TO_TRACK_LIQUIDITY_FOR, PINNED_PAIRS } from '../../constants'\n\nimport { useActiveWeb3React } from '../../hooks'\nimport { useAllTokens } from '../../hooks/Tokens'\nimport { AppDispatch, AppState } from '../index'\nimport {\n addSerializedPair,\n addSerializedToken,\n removeSerializedToken,\n SerializedPair,\n SerializedToken,\n updateUserDarkMode,\n updateUserDeadline,\n updateUserExpertMode,\n updateUserSlippageTolerance,\n toggleURLWarning\n} from './actions'\n\nfunction serializeToken(token: Token): SerializedToken {\n return {\n chainId: token.chainId,\n address: token.address,\n decimals: token.decimals,\n symbol: token.symbol,\n name: token.name\n }\n}\n\nfunction deserializeToken(serializedToken: SerializedToken): Token {\n return new Token(\n serializedToken.chainId,\n serializedToken.address,\n serializedToken.decimals,\n serializedToken.symbol,\n serializedToken.name\n )\n}\n\nexport function useIsDarkMode(): boolean {\n const { userDarkMode, matchesDarkMode } = useSelector<\n AppState,\n { userDarkMode: boolean | null; matchesDarkMode: boolean }\n >(\n ({ user: { matchesDarkMode, userDarkMode } }) => ({\n userDarkMode,\n matchesDarkMode\n }),\n shallowEqual\n )\n\n return userDarkMode === null ? matchesDarkMode : userDarkMode\n}\n\nexport function useDarkModeManager(): [boolean, () => void] {\n const dispatch = useDispatch()\n const darkMode = useIsDarkMode()\n\n const toggleSetDarkMode = useCallback(() => {\n dispatch(updateUserDarkMode({ userDarkMode: !darkMode }))\n }, [darkMode, dispatch])\n\n return [darkMode, toggleSetDarkMode]\n}\n\nexport function useIsExpertMode(): boolean {\n return useSelector(state => state.user.userExpertMode)\n}\n\nexport function useExpertModeManager(): [boolean, () => void] {\n const dispatch = useDispatch()\n const expertMode = useIsExpertMode()\n\n const toggleSetExpertMode = useCallback(() => {\n dispatch(updateUserExpertMode({ userExpertMode: !expertMode }))\n }, [expertMode, dispatch])\n\n return [expertMode, toggleSetExpertMode]\n}\n\nexport function useUserSlippageTolerance(): [number, (slippage: number) => void] {\n const dispatch = useDispatch()\n const userSlippageTolerance = useSelector(state => {\n return state.user.userSlippageTolerance\n })\n\n const setUserSlippageTolerance = useCallback(\n (userSlippageTolerance: number) => {\n dispatch(updateUserSlippageTolerance({ userSlippageTolerance }))\n },\n [dispatch]\n )\n\n return [userSlippageTolerance, setUserSlippageTolerance]\n}\n\nexport function useUserTransactionTTL(): [number, (slippage: number) => void] {\n const dispatch = useDispatch()\n const userDeadline = useSelector(state => {\n return state.user.userDeadline\n })\n\n const setUserDeadline = useCallback(\n (userDeadline: number) => {\n dispatch(updateUserDeadline({ userDeadline }))\n },\n [dispatch]\n )\n\n return [userDeadline, setUserDeadline]\n}\n\nexport function useAddUserToken(): (token: Token) => void {\n const dispatch = useDispatch()\n return useCallback(\n (token: Token) => {\n dispatch(addSerializedToken({ serializedToken: serializeToken(token) }))\n },\n [dispatch]\n )\n}\n\nexport function useRemoveUserAddedToken(): (chainId: number, address: string) => void {\n const dispatch = useDispatch()\n return useCallback(\n (chainId: number, address: string) => {\n dispatch(removeSerializedToken({ chainId, address }))\n },\n [dispatch]\n )\n}\n\nexport function useUserAddedTokens(): Token[] {\n const { chainId } = useActiveWeb3React()\n const serializedTokensMap = useSelector(({ user: { tokens } }) => tokens)\n\n return useMemo(() => {\n if (!chainId) return []\n return Object.values(serializedTokensMap[chainId as ChainId] ?? {}).map(deserializeToken)\n }, [serializedTokensMap, chainId])\n}\n\nfunction serializePair(pair: Pair): SerializedPair {\n return {\n token0: serializeToken(pair.token0),\n token1: serializeToken(pair.token1)\n }\n}\n\nexport function usePairAdder(): (pair: Pair) => void {\n const dispatch = useDispatch()\n\n return useCallback(\n (pair: Pair) => {\n dispatch(addSerializedPair({ serializedPair: serializePair(pair) }))\n },\n [dispatch]\n )\n}\n\nexport function useURLWarningVisible(): boolean {\n return useSelector((state: AppState) => state.user.URLWarningVisible)\n}\n\nexport function useURLWarningToggle(): () => void {\n const dispatch = useDispatch()\n return useCallback(() => dispatch(toggleURLWarning()), [dispatch])\n}\n\n/**\n * Given two tokens return the liquidity token that represents its liquidity shares\n * @param tokenA one of the two tokens\n * @param tokenB the other token\n */\nexport function toV2LiquidityToken([tokenA, tokenB]: [Token, Token]): Token {\n return new Token(tokenA.chainId, Pair.getAddress(tokenA, tokenB), 18, 'UNI-V2', 'Uniswap V2')\n}\n\n/**\n * Returns all the pairs of tokens that are tracked by the user for the current chain ID.\n */\nexport function useTrackedTokenPairs(): [Token, Token][] {\n const { chainId } = useActiveWeb3React()\n const tokens = useAllTokens()\n\n // pinned pairs\n const pinnedPairs = useMemo(() => (chainId ? PINNED_PAIRS[chainId] ?? [] : []), [chainId])\n\n // pairs for every token against every base\n const generatedPairs: [Token, Token][] = useMemo(\n () =>\n chainId\n ? flatMap(Object.keys(tokens), tokenAddress => {\n const token = tokens[tokenAddress]\n // for each token on the current chain,\n return (\n // loop though all bases on the current chain\n (BASES_TO_TRACK_LIQUIDITY_FOR[chainId] ?? [])\n // to construct pairs of the given token with each base\n .map(base => {\n if (base.address === token.address) {\n return null\n } else {\n return [base, token]\n }\n })\n .filter((p): p is [Token, Token] => p !== null)\n )\n })\n : [],\n [tokens, chainId]\n )\n\n // pairs saved by users\n const savedSerializedPairs = useSelector(({ user: { pairs } }) => pairs)\n\n const userPairs: [Token, Token][] = useMemo(() => {\n if (!chainId || !savedSerializedPairs) return []\n const forChain = savedSerializedPairs[chainId]\n if (!forChain) return []\n\n return Object.keys(forChain).map(pairId => {\n return [deserializeToken(forChain[pairId].token0), deserializeToken(forChain[pairId].token1)]\n })\n }, [savedSerializedPairs, chainId])\n\n const combinedList = useMemo(() => userPairs.concat(generatedPairs).concat(pinnedPairs), [\n generatedPairs,\n pinnedPairs,\n userPairs\n ])\n\n return useMemo(() => {\n // dedupes pairs of tokens in the combined list\n const keyed = combinedList.reduce<{ [key: string]: [Token, Token] }>((memo, [tokenA, tokenB]) => {\n const sorted = tokenA.sortsBefore(tokenB)\n const key = sorted ? `${tokenA.address}:${tokenB.address}` : `${tokenB.address}:${tokenA.address}`\n if (memo[key]) return memo\n memo[key] = sorted ? [tokenA, tokenB] : [tokenB, tokenA]\n return memo\n }, {})\n\n return Object.keys(keyed).map(key => keyed[key])\n }, [combinedList])\n}\n","// import { UNI } from './../../constants/index'\nimport { Currency, CurrencyAmount, ETHER, JSBI, Token, TokenAmount } from '@levinswap/uniswap-sdk'\nimport { useMemo } from 'react'\nimport ERC20_INTERFACE from '../../constants/abis/erc20'\nimport { useAllTokens } from '../../hooks/Tokens'\nimport { useActiveWeb3React } from '../../hooks'\nimport { useMulticallContract } from '../../hooks/useContract'\nimport { isAddress } from '../../utils'\nimport { useSingleContractMultipleData, useMultipleContractSingleData } from '../multicall/hooks'\n// import { useUserUnclaimedAmount } from '../claim/hooks'\n// import { useTotalUniEarned } from '../stake/hooks'\n\n/**\n * Returns a map of the given addresses to their eventually consistent ETH balances.\n */\nexport function useETHBalances(\n uncheckedAddresses?: (string | undefined)[]\n): { [address: string]: CurrencyAmount | undefined } {\n const multicallContract = useMulticallContract()\n\n const addresses: string[] = useMemo(\n () =>\n uncheckedAddresses\n ? uncheckedAddresses\n .map(isAddress)\n .filter((a): a is string => a !== false)\n .sort()\n : [],\n [uncheckedAddresses]\n )\n\n const results = useSingleContractMultipleData(\n multicallContract,\n 'getEthBalance',\n addresses.map(address => [address])\n )\n\n return useMemo(\n () =>\n addresses.reduce<{ [address: string]: CurrencyAmount }>((memo, address, i) => {\n const value = results?.[i]?.result?.[0]\n if (value) memo[address] = CurrencyAmount.ether(JSBI.BigInt(value.toString()))\n return memo\n }, {}),\n [addresses, results]\n )\n}\n\n/**\n * Returns a map of token addresses to their eventually consistent token balances for a single account.\n */\nexport function useTokenBalancesWithLoadingIndicator(\n address?: string,\n tokens?: (Token | undefined)[]\n): [{ [tokenAddress: string]: TokenAmount | undefined }, boolean] {\n const validatedTokens: Token[] = useMemo(\n () => tokens?.filter((t?: Token): t is Token => isAddress(t?.address) !== false) ?? [],\n [tokens]\n )\n\n const validatedTokenAddresses = useMemo(() => validatedTokens.map(vt => vt.address), [validatedTokens])\n\n const balances = useMultipleContractSingleData(validatedTokenAddresses, ERC20_INTERFACE, 'balanceOf', [address])\n\n const anyLoading: boolean = useMemo(() => balances.some(callState => callState.loading), [balances])\n\n return [\n useMemo(\n () =>\n address && validatedTokens.length > 0\n ? validatedTokens.reduce<{ [tokenAddress: string]: TokenAmount | undefined }>((memo, token, i) => {\n const value = balances?.[i]?.result?.[0]\n const amount = value ? JSBI.BigInt(value.toString()) : undefined\n if (amount) {\n memo[token.address] = new TokenAmount(token, amount)\n }\n return memo\n }, {})\n : {},\n [address, validatedTokens, balances]\n ),\n anyLoading\n ]\n}\n\nexport function useTokenBalances(\n address?: string,\n tokens?: (Token | undefined)[]\n): { [tokenAddress: string]: TokenAmount | undefined } {\n return useTokenBalancesWithLoadingIndicator(address, tokens)[0]\n}\n\n// get the balance for a single token/account combo\nexport function useTokenBalance(account?: string, token?: Token): TokenAmount | undefined {\n const tokenBalances = useTokenBalances(account, [token])\n if (!token) return undefined\n return tokenBalances[token.address]\n}\n\nexport function useCurrencyBalances(\n account?: string,\n currencies?: (Currency | undefined)[]\n): (CurrencyAmount | undefined)[] {\n const tokens = useMemo(() => currencies?.filter((currency): currency is Token => currency instanceof Token) ?? [], [\n currencies\n ])\n\n const tokenBalances = useTokenBalances(account, tokens)\n const containsETH: boolean = useMemo(() => currencies?.some(currency => currency === ETHER) ?? false, [currencies])\n const ethBalance = useETHBalances(containsETH ? [account] : [])\n\n return useMemo(\n () =>\n currencies?.map(currency => {\n if (!account || !currency) return undefined\n if (currency instanceof Token) return tokenBalances[currency.address]\n if (currency === ETHER) return ethBalance[account]\n return undefined\n }) ?? [],\n [account, currencies, ethBalance, tokenBalances]\n )\n}\n\nexport function useCurrencyBalance(account?: string, currency?: Currency): CurrencyAmount | undefined {\n return useCurrencyBalances(account, [currency])[0]\n}\n\n// mimics useAllBalances\nexport function useAllTokenBalances(): { [tokenAddress: string]: TokenAmount | undefined } {\n const { account } = useActiveWeb3React()\n const allTokens = useAllTokens()\n const allTokensArray = useMemo(() => Object.values(allTokens ?? {}), [allTokens])\n const balances = useTokenBalances(account ?? undefined, allTokensArray)\n return balances ?? {}\n}\n\n// get the total owned, unclaimed, and unharvested UNI for account\n// export function useAggregateUniBalance(): TokenAmount | undefined {\n// const { account, chainId } = useActiveWeb3React()\n\n// const uni = chainId ? UNI[chainId] : undefined\n\n// const uniBalance: TokenAmount | undefined = useTokenBalance(account ?? undefined, uni)\n// // const uniUnclaimed: TokenAmount | undefined = useUserUnclaimedAmount(account)\n// const uniUnHarvested: TokenAmount | undefined = useTotalUniEarned()\n\n// if (!uni) return undefined\n\n// return new TokenAmount(\n// uni,\n// JSBI.add(\n// JSBI.add(uniBalance?.raw ?? JSBI.BigInt(0), uniUnclaimed?.raw ?? JSBI.BigInt(0)),\n// uniUnHarvested?.raw ?? JSBI.BigInt(0)\n// )\n// )\n// }\n","import React from 'react'\r\nimport styled from 'styled-components'\r\nimport { CardProps, Text } from 'rebass'\r\nimport { Box } from 'rebass/styled-components'\r\n\r\nconst Card = styled(Box)<{ padding?: string; border?: string; borderRadius?: string }>`\r\n width: 100%;\r\n border-radius: 5px;\r\n padding: 1.25rem;\r\n padding: ${({ padding }) => padding};\r\n border: ${({ border }) => border};\r\n border-radius: ${({ borderRadius }) => borderRadius};\r\n`\r\nexport default Card\r\n\r\nexport const LightCard = styled(Card)`\r\n border: 1px solid ${({ theme }) => theme.bg2};\r\n background-color: ${({ theme }) => theme.bg1};\r\n`\r\nexport const LightGreyCard = styled(Card)`\r\n background-color: ${({ theme }) => theme.bg2};\r\n`\r\n\r\nexport const GreyCard = styled(Card)`\r\n background-color: ${({ theme }) => theme.bg3};\r\n`\r\n\r\nexport const OutlineCard = styled(Card)`\r\n border: 1px solid ${({ theme }) => theme.bg3};\r\n`\r\n\r\nexport const YellowCard = styled(Card)`\r\n background-color: rgba(250, 229, 236);\r\n color: ${({ theme }) => theme.yellow2};\r\n font-weight: 500;\r\n`\r\n\r\nexport const PinkCard = styled(Card)`\r\n background-color: rgba(255, 0, 122, 0.03);\r\n color: ${({ theme }) => theme.primary1};\r\n font-weight: 500;\r\n`\r\n\r\nconst BlueCardStyled = styled(Card)`\r\n background-color: ${({ theme }) => theme.primary5};\r\n color: ${({ theme }) => theme.primary1};\r\n border-radius: 5px;\r\n width: fit-content;\r\n`\r\n\r\nexport const BlueCard = ({ children, ...rest }: CardProps) => {\r\n return (\r\n \r\n \r\n {children}\r\n \r\n \r\n )\r\n}\r\n","function _extends() { _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; return _extends.apply(this, arguments); }\n\nfunction _objectWithoutProperties(source, excluded) { if (source == null) return {}; var target = _objectWithoutPropertiesLoose(source, excluded); var key, i; if (Object.getOwnPropertySymbols) { var sourceSymbolKeys = Object.getOwnPropertySymbols(source); for (i = 0; i < sourceSymbolKeys.length; i++) { key = sourceSymbolKeys[i]; if (excluded.indexOf(key) >= 0) continue; if (!Object.prototype.propertyIsEnumerable.call(source, key)) continue; target[key] = source[key]; } } return target; }\n\nfunction _objectWithoutPropertiesLoose(source, excluded) { if (source == null) return {}; var target = {}; var sourceKeys = Object.keys(source); var key, i; for (i = 0; i < sourceKeys.length; i++) { key = sourceKeys[i]; if (excluded.indexOf(key) >= 0) continue; target[key] = source[key]; } return target; }\n\nimport React from \"react\";\n\nvar _ref2 = /*#__PURE__*/React.createElement(\"path\", {\n d: \"M12 13C12.5523 13 13 12.5523 13 12C13 11.4477 12.5523 11 12 11C11.4477 11 11 11.4477 11 12C11 12.5523 11.4477 13 12 13Z\",\n stroke: \"black\",\n strokeWidth: 2,\n strokeLinecap: \"round\",\n strokeLinejoin: \"round\"\n});\n\nvar _ref3 = /*#__PURE__*/React.createElement(\"path\", {\n d: \"M19 13C19.5523 13 20 12.5523 20 12C20 11.4477 19.5523 11 19 11C18.4477 11 18 11.4477 18 12C18 12.5523 18.4477 13 19 13Z\",\n stroke: \"black\",\n strokeWidth: 2,\n strokeLinecap: \"round\",\n strokeLinejoin: \"round\"\n});\n\nvar _ref4 = /*#__PURE__*/React.createElement(\"path\", {\n d: \"M5 13C5.55228 13 6 12.5523 6 12C6 11.4477 5.55228 11 5 11C4.44772 11 4 11.4477 4 12C4 12.5523 4.44772 13 5 13Z\",\n stroke: \"black\",\n strokeWidth: 2,\n strokeLinecap: \"round\",\n strokeLinejoin: \"round\"\n});\n\nvar SvgMenu = function SvgMenu(_ref) {\n var svgRef = _ref.svgRef,\n title = _ref.title,\n props = _objectWithoutProperties(_ref, [\"svgRef\", \"title\"]);\n\n return /*#__PURE__*/React.createElement(\"svg\", _extends({\n width: 24,\n height: 24,\n viewBox: \"0 0 24 24\",\n fill: \"none\",\n ref: svgRef\n }, props), title ? /*#__PURE__*/React.createElement(\"title\", null, title) : null, _ref2, _ref3, _ref4);\n};\n\nvar ForwardRef = /*#__PURE__*/React.forwardRef(function (props, ref) {\n return /*#__PURE__*/React.createElement(SvgMenu, _extends({\n svgRef: ref\n }, props));\n});\nexport default __webpack_public_path__ + \"static/media/menu.4f2c4440.svg\";\nexport { ForwardRef as ReactComponent };","import { RefObject, useEffect, useRef } from 'react'\n\nexport function useOnClickOutside(\n node: RefObject,\n handler: undefined | (() => void)\n) {\n const handlerRef = useRef void)>(handler)\n useEffect(() => {\n handlerRef.current = handler\n }, [handler])\n\n useEffect(() => {\n const handleClickOutside = (e: MouseEvent) => {\n if (node.current?.contains(e.target as Node) ?? false) {\n return\n }\n if (handlerRef.current) handlerRef.current()\n }\n\n document.addEventListener('mousedown', handleClickOutside)\n\n return () => {\n document.removeEventListener('mousedown', handleClickOutside)\n }\n }, [node])\n}\n","import React, { HTMLProps, useCallback } from 'react'\r\nimport ReactGA from 'react-ga'\r\nimport { Link } from 'react-router-dom'\r\nimport styled, { keyframes } from 'styled-components'\r\nimport { darken } from 'polished'\r\nimport { ArrowLeft, X, ExternalLink as LinkIconFeather, Trash } from 'react-feather'\r\n\r\nexport const ButtonText = styled.button`\r\n outline: none;\r\n border: none;\r\n font-size: inherit;\r\n padding: 0;\r\n margin: 0;\r\n background: none;\r\n cursor: pointer;\r\n\r\n :hover {\r\n opacity: 0.7;\r\n }\r\n\r\n :focus {\r\n text-decoration: underline;\r\n }\r\n`\r\n\r\nconst LinkIconWrapper = styled.a`\r\n text-decoration: none;\r\n cursor: pointer;\r\n align-items: center;\r\n justify-content: center;\r\n display: flex;\r\n\r\n :hover {\r\n text-decoration: none;\r\n opacity: 0.7;\r\n }\r\n\r\n :focus {\r\n outline: none;\r\n text-decoration: none;\r\n }\r\n\r\n :active {\r\n text-decoration: none;\r\n }\r\n`\r\n\r\nexport const LinkIcon = styled(LinkIconFeather)`\r\n height: 16px;\r\n width: 18px;\r\n margin-left: 10px;\r\n stroke: ${({ theme }) => theme.blue1};\r\n`\r\n\r\nexport function ExternalLinkIcon({\r\n target = '_blank',\r\n href,\r\n rel = 'noopener noreferrer',\r\n ...rest\r\n}: Omit, 'as' | 'ref' | 'onClick'> & { href: string }) {\r\n const handleClick = useCallback(\r\n (event: React.MouseEvent) => {\r\n // don't prevent default, don't redirect if it's a new tab\r\n if (target === '_blank' || event.ctrlKey || event.metaKey) {\r\n ReactGA.outboundLink({ label: href }, () => {\r\n console.debug('Fired outbound link event', href)\r\n })\r\n } else {\r\n event.preventDefault()\r\n // send a ReactGA event and then trigger a location change\r\n ReactGA.outboundLink({ label: href }, () => {\r\n window.location.href = href\r\n })\r\n }\r\n },\r\n [href, target]\r\n )\r\n return (\r\n \r\n \r\n \r\n )\r\n}\r\n\r\nexport const IconWrapper = styled.div<{ stroke?: string; size?: string; marginRight?: string; marginLeft?: string }>`\r\n display: flex;\r\n align-items: center;\r\n justify-content: center;\r\n width: ${({ size }) => size ?? '20px'};\r\n height: ${({ size }) => size ?? '20px'};\r\n margin-right: ${({ marginRight }) => marginRight ?? 0};\r\n margin-left: ${({ marginLeft }) => marginLeft ?? 0};\r\n & > * {\r\n stroke: ${({ theme, stroke }) => stroke ?? theme.blue1};\r\n }\r\n`\r\n\r\nexport const TrashIcon = styled(Trash)`\r\n height: 16px;\r\n width: 18px;\r\n margin-left: 10px;\r\n stroke: ${({ theme }) => theme.text3};\r\n\r\n cursor: pointer;\r\n align-items: center;\r\n justify-content: center;\r\n display: flex;\r\n\r\n :hover {\r\n opacity: 0.7;\r\n }\r\n`\r\n\r\nexport const Button = styled.button.attrs<{ warning: boolean }, { backgroundColor: string }>(({ warning, theme }) => ({\r\n backgroundColor: warning ? theme.red1 : theme.primary1\r\n}))`\r\n padding: 1rem 2rem 1rem 2rem;\r\n border-radius: 3rem;\r\n cursor: pointer;\r\n user-select: none;\r\n font-size: 1rem;\r\n border: none;\r\n outline: none;\r\n background-color: ${({ backgroundColor }) => backgroundColor};\r\n color: ${({ theme }) => theme.white};\r\n width: 100%;\r\n\r\n :hover,\r\n :focus {\r\n background-color: ${({ backgroundColor }) => darken(0.05, backgroundColor)};\r\n }\r\n\r\n :active {\r\n background-color: ${({ backgroundColor }) => darken(0.1, backgroundColor)};\r\n }\r\n\r\n :disabled {\r\n background-color: ${({ theme }) => theme.bg1};\r\n color: ${({ theme }) => theme.text4};\r\n cursor: auto;\r\n }\r\n`\r\n\r\nexport const CloseIcon = styled(X)<{ onClick: () => void }>`\r\n cursor: pointer;\r\n`\r\n\r\n// A button that triggers some onClick result, but looks like a link.\r\nexport const LinkStyledButton = styled.button<{ disabled?: boolean }>`\r\n border: none;\r\n text-decoration: none;\r\n background: none;\r\n\r\n cursor: ${({ disabled }) => (disabled ? 'default' : 'pointer')};\r\n color: ${({ theme, disabled }) => (disabled ? theme.text2 : theme.primary1)};\r\n font-weight: 500;\r\n\r\n :hover {\r\n text-decoration: ${({ disabled }) => (disabled ? null : 'underline')};\r\n }\r\n\r\n :focus {\r\n outline: none;\r\n text-decoration: ${({ disabled }) => (disabled ? null : 'underline')};\r\n }\r\n\r\n :active {\r\n text-decoration: none;\r\n }\r\n`\r\n\r\n// An internal link from the react-router-dom library that is correctly styled\r\nexport const StyledInternalLink = styled(Link)`\r\n text-decoration: none;\r\n cursor: pointer;\r\n color: ${({ theme }) => theme.primary1};\r\n font-weight: 500;\r\n\r\n :hover {\r\n text-decoration: underline;\r\n }\r\n\r\n :focus {\r\n outline: none;\r\n text-decoration: underline;\r\n }\r\n\r\n :active {\r\n text-decoration: none;\r\n }\r\n`\r\n\r\nconst StyledLink = styled.a`\r\n text-decoration: none;\r\n cursor: pointer;\r\n color: ${({ theme }) => theme.primary1};\r\n font-weight: 500;\r\n\r\n :hover {\r\n text-decoration: underline;\r\n }\r\n\r\n :focus {\r\n outline: none;\r\n text-decoration: underline;\r\n }\r\n\r\n :active {\r\n text-decoration: none;\r\n }\r\n`\r\n\r\nconst rotateImg = keyframes`\r\n 0% {\r\n transform: perspective(1000px) rotateY(0deg);\r\n }\r\n\r\n 100% {\r\n transform: perspective(1000px) rotateY(360deg);\r\n }\r\n`\r\n\r\nexport const UniTokenAnimated = styled.img`\r\n animation: ${rotateImg} 5s cubic-bezier(0.83, 0, 0.17, 1) infinite;\r\n padding: 2rem 0 0 0;\r\n filter: drop-shadow(0px 2px 4px rgba(0, 0, 0, 0.15));\r\n`\r\n\r\n/**\r\n * Outbound link that handles firing google analytics events\r\n */\r\nexport function ExternalLink({\r\n target = '_blank',\r\n href,\r\n rel = 'noopener noreferrer',\r\n ...rest\r\n}: Omit, 'as' | 'ref' | 'onClick'> & { href: string }) {\r\n const handleClick = useCallback(\r\n (event: React.MouseEvent) => {\r\n // don't prevent default, don't redirect if it's a new tab\r\n if (target === '_blank' || event.ctrlKey || event.metaKey) {\r\n ReactGA.outboundLink({ label: href }, () => {\r\n console.debug('Fired outbound link event', href)\r\n })\r\n } else {\r\n event.preventDefault()\r\n // send a ReactGA event and then trigger a location change\r\n ReactGA.outboundLink({ label: href }, () => {\r\n window.location.href = href\r\n })\r\n }\r\n },\r\n [href, target]\r\n )\r\n return \r\n}\r\n\r\nconst rotate = keyframes`\r\n from {\r\n transform: rotate(0deg);\r\n }\r\n to {\r\n transform: rotate(360deg);\r\n }\r\n`\r\n\r\nexport const Spinner = styled.img`\r\n animation: 2s ${rotate} linear infinite;\r\n width: 16px;\r\n height: 16px;\r\n`\r\n\r\nconst BackArrowLink = styled(StyledInternalLink)`\r\n color: ${({ theme }) => theme.text1};\r\n`\r\nexport function BackArrow({ to }: { to: string }) {\r\n return (\r\n \r\n \r\n \r\n )\r\n}\r\n\r\nexport const CustomLightSpinner = styled(Spinner)<{ size: string }>`\r\n height: ${({ size }) => size};\r\n width: ${({ size }) => size};\r\n`\r\n\r\nexport const HideSmall = styled.span`\r\n ${({ theme }) => theme.mediaWidth.upToSmall`\r\n display: none;\r\n `};\r\n`\r\n\r\nexport const HideExtraSmall = styled.span`\r\n ${({ theme }) => theme.mediaWidth.upToExtraSmall`\r\n display: none;\r\n `};\r\n`\r\n\r\nexport const ExtraSmallOnly = styled.span`\r\n display: none;\r\n ${({ theme }) => theme.mediaWidth.upToExtraSmall`\r\n display: block;\r\n `};\r\n`\r\n","import { transparentize } from 'polished'\r\nimport React, { useMemo } from 'react'\r\nimport styled, {\r\n ThemeProvider as StyledComponentsThemeProvider,\r\n createGlobalStyle,\r\n css,\r\n DefaultTheme\r\n} from 'styled-components'\r\nimport { useIsDarkMode } from '../state/user/hooks'\r\nimport { Text, TextProps } from 'rebass'\r\nimport { Colors } from './styled'\r\n\r\nexport * from './components'\r\n\r\nconst MEDIA_WIDTHS = {\r\n upToExtraSmall: 500,\r\n upToSmall: 720,\r\n upToMedium: 960,\r\n upToLarge: 1280\r\n}\r\n\r\nconst mediaWidthTemplates: { [width in keyof typeof MEDIA_WIDTHS]: typeof css } = Object.keys(MEDIA_WIDTHS).reduce(\r\n (accumulator, size) => {\r\n ;(accumulator as any)[size] = (a: any, b: any, c: any) => css`\r\n @media (max-width: ${(MEDIA_WIDTHS as any)[size]}px) {\r\n ${css(a, b, c)}\r\n }\r\n `\r\n return accumulator\r\n },\r\n {}\r\n) as any\r\n\r\nconst white = '#FFFFFF'\r\nconst black = '#000000'\r\n\r\nexport function colors(darkMode: boolean): Colors {\r\n return {\r\n // base\r\n white,\r\n black,\r\n\r\n // gradient colors\r\n grd1: darkMode ? '#a27395' : '#ffffff', // lower left\r\n grd2: darkMode ? '#a27395' : '#fae5ec', // slightly above lower left\r\n grd3: darkMode ? '#a27395' : '#fae5ec', // still lower left\r\n grd4: darkMode ? '#2C2F36' : '#fae5ec', // middle diagonal\r\n grd5: darkMode ? '#5e6263' : '#fae5ec', // upper right diagonal\r\n grd6: darkMode ? '#2C2F36' : '#ffffff', // upper right\r\n\r\n // text\r\n text1: darkMode ? '#FFFFFF' : '#000000',\r\n text2: darkMode ? '#C3C5CB' : '#565A69',\r\n text3: darkMode ? '#6C7284' : '#888D9B',\r\n text4: darkMode ? '#565A69' : '#C3C5CB',\r\n text5: darkMode ? '#2C2F36' : '#EDEEF2',\r\n\r\n // backgrounds / greys\r\n bg1: darkMode ? '#212429' : '#FFFFFF',\r\n bg2: darkMode ? '#2C2F36' : '#F7F8FA',\r\n bg3: darkMode ? '#40444F' : '#EDEEF2',\r\n bg4: darkMode ? '#565A69' : '#CED0D9',\r\n bg5: darkMode ? '#6C7284' : '#888D9B',\r\n\r\n //specialty colors\r\n modalBG: darkMode ? 'rgba(0,0,0,.425)' : 'rgba(0,0,0,0.3)',\r\n advancedBG: darkMode ? 'rgba(0,0,0,0.1)' : 'rgba(255,255,255,0.6)',\r\n\r\n //primary colors\r\n primary1: darkMode ? '#a27395' : '#463e53',\r\n primary2: darkMode ? '#463e53' : '#463e53',\r\n primary3: darkMode ? '#a27395' : '#463e53',\r\n primary4: darkMode ? '#a27395' : '#463e53',\r\n primary5: darkMode ? '#a27395' : '#a27395',\r\n primary6: darkMode ? '#fae5ec' : '#fae5ec',\r\n\r\n // color text\r\n primaryText1: darkMode ? white : '#fff',\r\n\r\n // secondary colors\r\n secondary1: darkMode ? '#2172E5' : '#a27395',\r\n secondary2: darkMode ? '#17000b26' : '#a27395',\r\n secondary3: darkMode ? '#17000b26' : '#FDEAF1',\r\n\r\n // other\r\n red1: '#FF6871',\r\n red2: '#F82D3A',\r\n green1: '#27AE60',\r\n yellow1: '#a27395',\r\n yellow2: '#463e53',\r\n blue1: '#2172E5',\r\n grey1: '#edeef2'\r\n\r\n // dont wanna forget these blue yet\r\n // blue4: darkMode ? '#153d6f70' : '#C4D9F8',\r\n // blue5: darkMode ? '#153d6f70' : '#EBF4FF',\r\n }\r\n}\r\n\r\nexport function theme(darkMode: boolean): DefaultTheme {\r\n return {\r\n ...colors(darkMode),\r\n\r\n grids: {\r\n sm: 8,\r\n md: 12,\r\n lg: 24\r\n },\r\n\r\n //shadows\r\n shadow1: darkMode ? '#000' : '#2F80ED',\r\n\r\n // media queries\r\n mediaWidth: mediaWidthTemplates,\r\n\r\n // css snippets\r\n flexColumnNoWrap: css`\r\n display: flex;\r\n flex-flow: column nowrap;\r\n `,\r\n flexRowNoWrap: css`\r\n display: flex;\r\n flex-flow: row nowrap;\r\n `\r\n }\r\n}\r\n\r\nexport default function ThemeProvider({ children }: { children: React.ReactNode }) {\r\n const darkMode = useIsDarkMode()\r\n\r\n const themeObject = useMemo(() => theme(darkMode), [darkMode])\r\n\r\n return {children}\r\n}\r\n\r\nconst TextWrapper = styled(Text)<{ color: keyof Colors }>`\r\n color: ${({ color, theme }) => (theme as any)[color]};\r\n`\r\n\r\nexport const TYPE = {\r\n main(props: TextProps) {\r\n return \r\n },\r\n link(props: TextProps) {\r\n return \r\n },\r\n black(props: TextProps) {\r\n return \r\n },\r\n white(props: TextProps) {\r\n return \r\n },\r\n body(props: TextProps) {\r\n return \r\n },\r\n largeHeader(props: TextProps) {\r\n return \r\n },\r\n mediumHeader(props: TextProps) {\r\n return \r\n },\r\n subHeader(props: TextProps) {\r\n return \r\n },\r\n small(props: TextProps) {\r\n return \r\n },\r\n blue(props: TextProps) {\r\n return \r\n },\r\n yellow(props: TextProps) {\r\n return \r\n },\r\n darkGray(props: TextProps) {\r\n return \r\n },\r\n gray(props: TextProps) {\r\n return \r\n },\r\n italic(props: TextProps) {\r\n return \r\n },\r\n error({ error, ...props }: { error: boolean } & TextProps) {\r\n return \r\n }\r\n}\r\n\r\nexport const FixedGlobalStyle = createGlobalStyle`\r\nhtml, input, textarea, button {\r\n font-family: 'Inter', sans-serif;\r\n font-display: fallback;\r\n}\r\n@supports (font-variation-settings: normal) {\r\n html, input, textarea, button {\r\n font-family: 'Inter var', sans-serif;\r\n }\r\n}\r\n\r\nhtml,\r\nbody {\r\n margin: 0;\r\n padding: 0;\r\n}\r\n\r\n a {\r\n color: ${colors(false).blue1}; \r\n }\r\n\r\n* {\r\n box-sizing: border-box;\r\n}\r\n\r\nbutton {\r\n user-select: none;\r\n}\r\n\r\nhtml {\r\n font-size: 16px;\r\n font-variant: none;\r\n -webkit-font-smoothing: antialiased;\r\n -moz-osx-font-smoothing: grayscale;\r\n -webkit-tap-highlight-color: rgba(0, 0, 0, 0);\r\n font-feature-settings: 'ss01' on, 'ss02' on, 'cv01' on, 'cv03' on;\r\n \r\n}\r\n`\r\n\r\nexport const ThemedGlobalStyle = createGlobalStyle`\r\nhtml {\r\n color: ${({ theme }) => theme.text1};\r\n background: linear-gradient(60deg, \r\n ${({ theme }) => theme.grd1} 0%, \r\n ${({ theme }) => theme.grd2} 0%, \r\n ${({ theme }) => theme.grd3} 0%,\r\n ${({ theme }) => theme.grd4} 0%,\r\n ${({ theme }) => theme.grd5} 0%,\r\n ${({ theme }) => theme.grd6} 0%);\r\n}\r\n\r\nbody {\r\n min-height: 100vh;\r\n background-position: 0 -30vh;\r\n background-repeat: no-repeat;\r\n background-image: ${({ theme }) =>\r\n `radial-gradient(50% 50% at 50% 50%, ${transparentize(0.9, theme.primary1)} 0%, ${transparentize(\r\n 1,\r\n theme.bg1\r\n )} 100%)`};\r\n}\r\n`\r\n","import React, { useRef } from 'react'\r\nimport { BookOpen, Code, Info, MessageCircle, PieChart } from 'react-feather'\r\nimport styled from 'styled-components'\r\nimport { ReactComponent as MenuIcon } from '../../assets/images/menu.svg'\r\nimport { useOnClickOutside } from '../../hooks/useOnClickOutside'\r\nimport { ApplicationModal } from '../../state/application/actions'\r\nimport { useModalOpen, useToggleModal } from '../../state/application/hooks'\r\n\r\nimport { ExternalLink } from '../../theme'\r\n\r\nconst StyledMenuIcon = styled(MenuIcon)`\r\n path {\r\n stroke: ${({ theme }) => theme.text1};\r\n }\r\n`\r\n\r\nconst StyledMenuButton = styled.button`\r\n width: 100%;\r\n height: 100%;\r\n border: none;\r\n background-color: transparent;\r\n margin: 0;\r\n padding: 0;\r\n height: 35px;\r\n background-color: ${({ theme }) => theme.bg3};\r\n\r\n padding: 0.15rem 0.5rem;\r\n border-radius: 5px;\r\n\r\n :hover,\r\n :focus {\r\n cursor: pointer;\r\n outline: none;\r\n background-color: ${({ theme }) => theme.bg4};\r\n }\r\n\r\n svg {\r\n margin-top: 2px;\r\n }\r\n`\r\n\r\nconst StyledMenu = styled.div`\r\n margin-left: 0.5rem;\r\n display: flex;\r\n justify-content: center;\r\n align-items: center;\r\n position: relative;\r\n border: none;\r\n text-align: left;\r\n`\r\n\r\nconst MenuFlyout = styled.span`\r\n min-width: 8.125rem;\r\n background-color: ${({ theme }) => theme.bg3};\r\n box-shadow: 0px 0px 1px rgba(0, 0, 0, 0.01), 0px 4px 8px rgba(0, 0, 0, 0.04), 0px 16px 24px rgba(0, 0, 0, 0.04),\r\n 0px 24px 32px rgba(0, 0, 0, 0.01);\r\n border-radius: 5px;\r\n padding: 0.5rem;\r\n display: flex;\r\n flex-direction: column;\r\n font-size: 1rem;\r\n position: absolute;\r\n top: 4rem;\r\n right: 0rem;\r\n z-index: 100;\r\n\r\n ${({ theme }) => theme.mediaWidth.upToMedium`\r\n top: -17.25rem;\r\n `};\r\n`\r\n\r\nconst MenuItem = styled(ExternalLink)`\r\n flex: 1;\r\n padding: 0.5rem 0.5rem;\r\n color: ${({ theme }) => theme.text2};\r\n :hover {\r\n color: ${({ theme }) => theme.text1};\r\n cursor: pointer;\r\n text-decoration: none;\r\n }\r\n > svg {\r\n margin-right: 8px;\r\n }\r\n`\r\n\r\nconst CODE_LINK = 'https://github.com/RealT-Community/levinswap-interface'\r\n\r\nexport default function Menu() {\r\n const node = useRef()\r\n const open = useModalOpen(ApplicationModal.MENU)\r\n const toggle = useToggleModal(ApplicationModal.MENU)\r\n useOnClickOutside(node, open ? toggle : undefined)\r\n\r\n return (\r\n // https://github.com/DefinitelyTyped/DefinitelyTyped/issues/30451\r\n \r\n \r\n \r\n \r\n\r\n {open && (\r\n \r\n \r\n \r\n About\r\n \r\n \r\n \r\n Wiki\r\n \r\n \r\n \r\n Code\r\n \r\n \r\n \r\n Discord\r\n \r\n \r\n \r\n Analytics\r\n \r\n \r\n )}\r\n \r\n )\r\n}\r\n","import styled from 'styled-components'\r\nimport { Box } from 'rebass/styled-components'\r\n\r\nconst Row = styled(Box)<{ align?: string; padding?: string; border?: string; borderRadius?: string }>`\r\n width: 100%;\r\n display: flex;\r\n padding: 0;\r\n align-items: ${({ align }) => (align ? align : 'center')};\r\n padding: ${({ padding }) => padding};\r\n border: ${({ border }) => border};\r\n border-radius: ${({ borderRadius }) => borderRadius};\r\n`\r\n\r\nexport const RowBetween = styled(Row)`\r\n justify-content: space-between;\r\n`\r\n\r\nexport const RowFlat = styled.div`\r\n display: flex;\r\n align-items: flex-end;\r\n`\r\n\r\nexport const AutoRow = styled(Row)<{ gap?: string; justify?: string }>`\r\n flex-wrap: wrap;\r\n margin: ${({ gap }) => gap && `-${gap}`};\r\n justify-content: ${({ justify }) => justify && justify};\r\n\r\n & > * {\r\n margin: ${({ gap }) => gap} !important;\r\n }\r\n`\r\n\r\nexport const RowFixed = styled(Row)<{ gap?: string; justify?: string }>`\r\n width: fit-content;\r\n margin: ${({ gap }) => gap && `-${gap}`};\r\n`\r\n\r\nexport default Row\r\n","/**\n * Returns true if the string value is zero in hex\n * @param hexNumberString\n */\nexport default function isZero(hexNumberString: string) {\n return /^0x0*$/.test(hexNumberString)\n}\n","import { useEffect, useState } from 'react'\n\n// modified from https://usehooks.com/useDebounce/\nexport default function useDebounce(value: T, delay: number): T {\n const [debouncedValue, setDebouncedValue] = useState(value)\n\n useEffect(() => {\n // Update debounced value after delay\n const handler = setTimeout(() => {\n setDebouncedValue(value)\n }, delay)\n\n // Cancel the timeout if value changes (also on delay change or unmount)\n // This is how we prevent debounced value from updating if value is changed ...\n // .. within the delay period. Timeout gets cleared and restarted.\n return () => {\n clearTimeout(handler)\n }\n }, [value, delay])\n\n return debouncedValue\n}\n","import { namehash } from 'ethers/lib/utils'\nimport { useMemo } from 'react'\nimport { useSingleCallResult } from '../state/multicall/hooks'\nimport { isAddress } from '../utils'\nimport isZero from '../utils/isZero'\nimport { useENSRegistrarContract, useENSResolverContract } from './useContract'\nimport useDebounce from './useDebounce'\n\n/**\n * Does a reverse lookup for an address to find its ENS name.\n * Note this is not the same as looking up an ENS name to find an address.\n */\nexport default function useENSName(address?: string): { ENSName: string | null; loading: boolean } {\n const debouncedAddress = useDebounce(address, 200)\n const ensNodeArgument = useMemo(() => {\n if (!debouncedAddress || !isAddress(debouncedAddress)) return [undefined]\n try {\n return debouncedAddress ? [namehash(`${debouncedAddress.toLowerCase().substr(2)}.addr.reverse`)] : [undefined]\n } catch (error) {\n return [undefined]\n }\n }, [debouncedAddress])\n const registrarContract = useENSRegistrarContract(false)\n const resolverAddress = useSingleCallResult(registrarContract, 'resolver', ensNodeArgument)\n const resolverAddressResult = resolverAddress.result?.[0]\n const resolverContract = useENSResolverContract(\n resolverAddressResult && !isZero(resolverAddressResult) ? resolverAddressResult : undefined,\n false\n )\n const name = useSingleCallResult(resolverContract, 'name', ensNodeArgument)\n\n const changed = debouncedAddress !== address\n return {\n ENSName: changed ? null : name.result?.[0] ?? null,\n loading: changed || resolverAddress.loading || name.loading\n }\n}\n","import { JSBI } from '@levinswap/uniswap-sdk'\nimport { useMemo } from 'react'\nimport { NEVER_RELOAD, useSingleCallResult } from '../state/multicall/hooks'\nimport { useActiveWeb3React } from './index'\nimport { useSocksController } from './useContract'\n\nexport default function useSocksBalance(): JSBI | undefined {\n const { account } = useActiveWeb3React()\n const socksContract = useSocksController()\n\n const { result } = useSingleCallResult(socksContract, 'balanceOf', [account ?? undefined], NEVER_RELOAD)\n const data = result?.[0]\n return data ? JSBI.BigInt(data.toString()) : undefined\n}\n\nexport function useHasSocks(): boolean | undefined {\n const balance = useSocksBalance()\n return useMemo(() => balance && JSBI.greaterThan(balance, JSBI.BigInt(0)), [balance])\n}\n","import { createAction } from '@reduxjs/toolkit'\nimport { ChainId } from '@levinswap/uniswap-sdk'\n\nexport interface SerializableTransactionReceipt {\n to: string\n from: string\n contractAddress: string\n transactionIndex: number\n blockHash: string\n transactionHash: string\n blockNumber: number\n status?: number\n}\n\nexport const addTransaction = createAction<{\n chainId: ChainId\n hash: string\n from: string\n approval?: { tokenAddress: string; spender: string }\n claim?: { recipient: string }\n summary?: string\n}>('transactions/addTransaction')\nexport const clearAllTransactions = createAction<{ chainId: ChainId }>('transactions/clearAllTransactions')\nexport const finalizeTransaction = createAction<{\n chainId: ChainId\n hash: string\n receipt: SerializableTransactionReceipt\n}>('transactions/finalizeTransaction')\nexport const checkedTransaction = createAction<{\n chainId: ChainId\n hash: string\n blockNumber: number\n}>('transactions/checkedTransaction')\n","import { TransactionResponse } from '@ethersproject/providers'\nimport { useCallback, useMemo } from 'react'\nimport { useDispatch, useSelector } from 'react-redux'\n\nimport { useActiveWeb3React } from '../../hooks'\nimport { AppDispatch, AppState } from '../index'\nimport { addTransaction } from './actions'\nimport { TransactionDetails } from './reducer'\n\n// helper that can take a ethers library transaction response and add it to the list of transactions\nexport function useTransactionAdder(): (\n response: TransactionResponse,\n customData?: { summary?: string; approval?: { tokenAddress: string; spender: string }; claim?: { recipient: string } }\n) => void {\n const { chainId, account } = useActiveWeb3React()\n const dispatch = useDispatch()\n\n return useCallback(\n (\n response: TransactionResponse,\n {\n summary,\n approval,\n claim\n }: { summary?: string; claim?: { recipient: string }; approval?: { tokenAddress: string; spender: string } } = {}\n ) => {\n if (!account) return\n if (!chainId) return\n\n const { hash } = response\n if (!hash) {\n throw Error('No transaction hash found.')\n }\n dispatch(addTransaction({ hash, from: account, chainId, approval, summary, claim }))\n },\n [dispatch, chainId, account]\n )\n}\n\n// returns all the transactions for the current chain\nexport function useAllTransactions(): { [txHash: string]: TransactionDetails } {\n const { chainId } = useActiveWeb3React()\n\n const state = useSelector(state => state.transactions)\n\n return chainId ? state[chainId] ?? {} : {}\n}\n\nexport function useIsTransactionPending(transactionHash?: string): boolean {\n const transactions = useAllTransactions()\n\n if (!transactionHash || !transactions[transactionHash]) return false\n\n return !transactions[transactionHash].receipt\n}\n\n/**\n * Returns whether a transaction happened in the last day (86400 seconds * 1000 milliseconds / second)\n * @param tx to check for recency\n */\nexport function isTransactionRecent(tx: TransactionDetails): boolean {\n return new Date().getTime() - tx.addedTime < 86_400_000\n}\n\n// returns whether a token has a pending approval transaction\nexport function useHasPendingApproval(tokenAddress: string | undefined, spender: string | undefined): boolean {\n const allTransactions = useAllTransactions()\n return useMemo(\n () =>\n typeof tokenAddress === 'string' &&\n typeof spender === 'string' &&\n Object.keys(allTransactions).some(hash => {\n const tx = allTransactions[hash]\n if (!tx) return false\n if (tx.receipt) {\n return false\n } else {\n const approval = tx.approval\n if (!approval) return false\n return approval.spender === spender && approval.tokenAddress === tokenAddress && isTransactionRecent(tx)\n }\n }),\n [allTransactions, spender, tokenAddress]\n )\n}\n\n// watch for submissions to claim\n// return null if not done loading, return undefined if not found\nexport function useUserHasSubmittedClaim(\n account?: string\n): { claimSubmitted: boolean; claimTxn: TransactionDetails | undefined } {\n const allTransactions = useAllTransactions()\n\n // get the txn if it has been submitted\n const claimTxn = useMemo(() => {\n const txnIndex = Object.keys(allTransactions).find(hash => {\n const tx = allTransactions[hash]\n return tx.claim && tx.claim.recipient === account\n })\n return txnIndex && allTransactions[txnIndex] ? allTransactions[txnIndex] : undefined\n }, [account, allTransactions])\n\n return { claimSubmitted: Boolean(claimTxn), claimTxn }\n}\n","import React from 'react'\r\nimport styled from 'styled-components'\r\nimport { darken, lighten } from 'polished'\r\n\r\nimport { RowBetween } from '../Row'\r\nimport { ChevronDown } from 'react-feather'\r\nimport { Button as RebassButton, ButtonProps } from 'rebass/styled-components'\r\n\r\nconst Base = styled(RebassButton)<{\r\n padding?: string\r\n width?: string\r\n borderRadius?: string\r\n altDisabledStyle?: boolean\r\n}>`\r\n padding: ${({ padding }) => (padding ? padding : '18px')};\r\n width: ${({ width }) => (width ? width : '100%')};\r\n font-weight: 500;\r\n text-align: center;\r\n border-radius: 5px;\r\n border-radius: ${({ borderRadius }) => borderRadius && borderRadius};\r\n outline: none;\r\n border: 1px solid transparent;\r\n color: white;\r\n text-decoration: none;\r\n display: flex;\r\n justify-content: center;\r\n flex-wrap: nowrap;\r\n align-items: center;\r\n cursor: pointer;\r\n position: relative;\r\n z-index: 1;\r\n &:disabled {\r\n cursor: auto;\r\n }\r\n\r\n > * {\r\n user-select: none;\r\n }\r\n`\r\n\r\nexport const ButtonPrimary = styled(Base)`\r\n background-color: ${({ theme }) => theme.primary1};\r\n color: white;\r\n &:focus {\r\n box-shadow: 0 0 0 1pt ${({ theme }) => darken(0.05, theme.primary1)};\r\n background-color: ${({ theme }) => darken(0.05, theme.primary1)};\r\n }\r\n &:hover {\r\n }\r\n &:active {\r\n box-shadow: 0 0 0 1pt ${({ theme }) => darken(0.1, theme.primary1)};\r\n background-color: ${({ theme }) => darken(0.1, theme.primary1)};\r\n }\r\n &:disabled {\r\n background-color: ${({ theme, altDisabledStyle }) => (altDisabledStyle ? theme.primary1 : theme.bg3)};\r\n color: ${({ theme, altDisabledStyle }) => (altDisabledStyle ? 'white' : theme.text3)};\r\n cursor: auto;\r\n box-shadow: none;\r\n border: 1px solid transparent;\r\n outline: none;\r\n opacity: ${({ altDisabledStyle }) => (altDisabledStyle ? '0.7' : '1')};\r\n }\r\n`\r\n\r\nexport const ButtonLight = styled(Base)`\r\n background-color: ${({ theme }) => theme.primary5};\r\n color: ${({ theme }) => theme.primaryText1};\r\n font-size: 16px;\r\n font-weight: 500;\r\n &:focus {\r\n box-shadow: 0 0 0 1pt ${({ theme, disabled }) => !disabled && darken(0.03, theme.primary5)};\r\n background-color: ${({ theme, disabled }) => !disabled && darken(0.03, theme.primary5)};\r\n }\r\n &:hover {\r\n background-color: ${({ theme, disabled }) => !disabled && darken(0.03, theme.primary5)};\r\n }\r\n &:active {\r\n box-shadow: 0 0 0 1pt ${({ theme, disabled }) => !disabled && darken(0.05, theme.primary5)};\r\n background-color: ${({ theme, disabled }) => !disabled && darken(0.05, theme.primary5)};\r\n }\r\n :disabled {\r\n opacity: 0.4;\r\n :hover {\r\n cursor: auto;\r\n background-color: ${({ theme }) => theme.primary5};\r\n box-shadow: none;\r\n border: 1px solid transparent;\r\n outline: none;\r\n }\r\n }\r\n`\r\n\r\nexport const ButtonGray = styled(Base)`\r\n background-color: ${({ theme }) => theme.bg3};\r\n color: ${({ theme }) => theme.text2};\r\n font-size: 16px;\r\n font-weight: 500;\r\n &:focus {\r\n box-shadow: 0 0 0 1pt ${({ theme, disabled }) => !disabled && darken(0.05, theme.bg2)};\r\n background-color: ${({ theme, disabled }) => !disabled && darken(0.05, theme.bg2)};\r\n }\r\n &:hover {\r\n background-color: ${({ theme, disabled }) => !disabled && darken(0.05, theme.bg2)};\r\n }\r\n &:active {\r\n box-shadow: 0 0 0 1pt ${({ theme, disabled }) => !disabled && darken(0.1, theme.bg2)};\r\n background-color: ${({ theme, disabled }) => !disabled && darken(0.1, theme.bg2)};\r\n }\r\n`\r\n\r\nexport const ButtonSecondary = styled(Base)`\r\n border: 1px solid ${({ theme }) => theme.primary4};\r\n color: ${({ theme }) => theme.primary1};\r\n background-color: transparent;\r\n font-size: 16px;\r\n border-radius: 5px;\r\n padding: ${({ padding }) => (padding ? padding : '10px')};\r\n\r\n &:focus {\r\n box-shadow: 0 0 0 1pt ${({ theme }) => theme.primary4};\r\n border: 1px solid ${({ theme }) => theme.primary3};\r\n }\r\n &:hover {\r\n border: 1px solid ${({ theme }) => theme.primary3};\r\n }\r\n &:active {\r\n box-shadow: 0 0 0 1pt ${({ theme }) => theme.primary4};\r\n border: 1px solid ${({ theme }) => theme.primary3};\r\n }\r\n &:disabled {\r\n opacity: 50%;\r\n cursor: auto;\r\n }\r\n a:hover {\r\n text-decoration: none;\r\n }\r\n`\r\n\r\nexport const ButtonPink = styled(Base)`\r\n background-color: ${({ theme }) => theme.primary1};\r\n color: white;\r\n\r\n &:focus {\r\n box-shadow: 0 0 0 1pt ${({ theme }) => darken(0.05, theme.primary1)};\r\n background-color: ${({ theme }) => darken(0.05, theme.primary1)};\r\n }\r\n &:hover {\r\n background-color: ${({ theme }) => darken(0.05, theme.primary1)};\r\n }\r\n &:active {\r\n box-shadow: 0 0 0 1pt ${({ theme }) => darken(0.1, theme.primary1)};\r\n background-color: ${({ theme }) => darken(0.1, theme.primary1)};\r\n }\r\n &:disabled {\r\n background-color: ${({ theme }) => theme.primary1};\r\n opacity: 50%;\r\n cursor: auto;\r\n }\r\n`\r\n\r\nexport const ButtonUNIGradient = styled(ButtonPrimary)`\r\n color: white;\r\n padding: 4px 8px;\r\n height: 36px;\r\n font-weight: 500;\r\n background-color: ${({ theme }) => theme.bg3};\r\n background: radial-gradient(174.47% 188.91% at 1.84% 0%, #ff007a 0%, #2172e5 100%), #edeef2;\r\n width: fit-content;\r\n position: relative;\r\n cursor: pointer;\r\n border: none;\r\n white-space: no-wrap;\r\n :hover {\r\n opacity: 0.8;\r\n }\r\n :active {\r\n opacity: 0.9;\r\n }\r\n`\r\n\r\nexport const ButtonOutlined = styled(Base)`\r\n border: 1px solid ${({ theme }) => theme.bg2};\r\n background-color: transparent;\r\n color: ${({ theme }) => theme.text1};\r\n\r\n &:focus {\r\n box-shadow: 0 0 0 1px ${({ theme }) => theme.bg4};\r\n }\r\n &:hover {\r\n box-shadow: 0 0 0 1px ${({ theme }) => theme.bg4};\r\n }\r\n &:active {\r\n box-shadow: 0 0 0 1px ${({ theme }) => theme.bg4};\r\n }\r\n &:disabled {\r\n opacity: 50%;\r\n cursor: auto;\r\n }\r\n`\r\n\r\nexport const ButtonEmpty = styled(Base)`\r\n background-color: transparent;\r\n color: ${({ theme }) => theme.primary1};\r\n display: flex;\r\n justify-content: center;\r\n align-items: center;\r\n\r\n &:focus {\r\n text-decoration: underline;\r\n }\r\n &:hover {\r\n text-decoration: underline;\r\n }\r\n &:active {\r\n text-decoration: underline;\r\n }\r\n &:disabled {\r\n opacity: 50%;\r\n cursor: auto;\r\n }\r\n`\r\n\r\nexport const ButtonWhite = styled(Base)`\r\n border: 1px solid #edeef2;\r\n background-color: ${({ theme }) => theme.bg1};\r\n color: black;\r\n\r\n &:focus {\r\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\r\n box-shadow: 0 0 0 1pt ${darken(0.05, '#edeef2')};\r\n }\r\n &:hover {\r\n box-shadow: 0 0 0 1pt ${darken(0.1, '#edeef2')};\r\n }\r\n &:active {\r\n box-shadow: 0 0 0 1pt ${darken(0.1, '#edeef2')};\r\n }\r\n &:disabled {\r\n opacity: 50%;\r\n cursor: auto;\r\n }\r\n`\r\n\r\nconst ButtonConfirmedStyle = styled(Base)`\r\n background-color: ${({ theme }) => lighten(0.5, theme.green1)};\r\n color: ${({ theme }) => theme.green1};\r\n border: 1px solid ${({ theme }) => theme.green1};\r\n\r\n &:disabled {\r\n opacity: 50%;\r\n cursor: auto;\r\n }\r\n`\r\n\r\nconst ButtonErrorStyle = styled(Base)`\r\n background-color: ${({ theme }) => theme.red1};\r\n border: 1px solid ${({ theme }) => theme.red1};\r\n\r\n &:focus {\r\n box-shadow: 0 0 0 1pt ${({ theme }) => darken(0.05, theme.red1)};\r\n background-color: ${({ theme }) => darken(0.05, theme.red1)};\r\n }\r\n &:hover {\r\n background-color: ${({ theme }) => darken(0.05, theme.red1)};\r\n }\r\n &:active {\r\n box-shadow: 0 0 0 1pt ${({ theme }) => darken(0.1, theme.red1)};\r\n background-color: ${({ theme }) => darken(0.1, theme.red1)};\r\n }\r\n &:disabled {\r\n opacity: 50%;\r\n cursor: auto;\r\n box-shadow: none;\r\n background-color: ${({ theme }) => theme.red1};\r\n border: 1px solid ${({ theme }) => theme.red1};\r\n }\r\n`\r\n\r\nexport function ButtonConfirmed({\r\n confirmed,\r\n altDisabledStyle,\r\n ...rest\r\n}: { confirmed?: boolean; altDisabledStyle?: boolean } & ButtonProps) {\r\n if (confirmed) {\r\n return \r\n } else {\r\n return \r\n }\r\n}\r\n\r\nexport function ButtonError({ error, ...rest }: { error?: boolean } & ButtonProps) {\r\n if (error) {\r\n return \r\n } else {\r\n return \r\n }\r\n}\r\n\r\nexport function ButtonDropdown({ disabled = false, children, ...rest }: { disabled?: boolean } & ButtonProps) {\r\n return (\r\n \r\n \r\n
{children}
\r\n \r\n
\r\n
\r\n )\r\n}\r\n\r\nexport function ButtonDropdownLight({ disabled = false, children, ...rest }: { disabled?: boolean } & ButtonProps) {\r\n return (\r\n \r\n \r\n
{children}
\r\n \r\n
\r\n
\r\n )\r\n}\r\n\r\nexport function ButtonRadio({ active, ...rest }: { active?: boolean } & ButtonProps) {\r\n if (!active) {\r\n return \r\n } else {\r\n return \r\n }\r\n}\r\n","import React, { useEffect, useRef } from 'react'\r\n\r\nimport styled from 'styled-components'\r\n\r\nimport { useActiveWeb3React } from '../../hooks'\r\nimport Jazzicon from 'jazzicon'\r\n\r\nconst StyledIdenticonContainer = styled.div`\r\n height: 1rem;\r\n width: 1rem;\r\n border-radius: 5px;\r\n background-color: ${({ theme }) => theme.bg4};\r\n`\r\n\r\nexport default function Identicon() {\r\n const ref = useRef()\r\n\r\n const { account } = useActiveWeb3React()\r\n\r\n useEffect(() => {\r\n if (account && ref.current) {\r\n ref.current.innerHTML = ''\r\n ref.current.appendChild(Jazzicon(16, parseInt(account.slice(2, 10), 16)))\r\n }\r\n }, [account])\r\n\r\n // https://github.com/DefinitelyTyped/DefinitelyTyped/issues/30451\r\n return \r\n}\r\n","import React from 'react'\n\nimport styled, { keyframes } from 'styled-components'\n\nconst rotate = keyframes`\n from {\n transform: rotate(0deg);\n }\n to {\n transform: rotate(360deg);\n }\n`\n\nconst StyledSVG = styled.svg<{ size: string; stroke?: string }>`\n animation: 2s ${rotate} linear infinite;\n height: ${({ size }) => size};\n width: ${({ size }) => size};\n path {\n stroke: ${({ stroke, theme }) => stroke ?? theme.primary1};\n }\n`\n\n/**\n * Takes in custom size and stroke for circle color, default to primary color as fill,\n * need ...rest for layered styles on top\n */\nexport default function Loader({\n size = '16px',\n stroke,\n ...rest\n}: {\n size?: string\n stroke?: string\n [k: string]: any\n}) {\n return (\n \n \n \n )\n}\n","function _extends() { _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; return _extends.apply(this, arguments); }\n\nfunction _objectWithoutProperties(source, excluded) { if (source == null) return {}; var target = _objectWithoutPropertiesLoose(source, excluded); var key, i; if (Object.getOwnPropertySymbols) { var sourceSymbolKeys = Object.getOwnPropertySymbols(source); for (i = 0; i < sourceSymbolKeys.length; i++) { key = sourceSymbolKeys[i]; if (excluded.indexOf(key) >= 0) continue; if (!Object.prototype.propertyIsEnumerable.call(source, key)) continue; target[key] = source[key]; } } return target; }\n\nfunction _objectWithoutPropertiesLoose(source, excluded) { if (source == null) return {}; var target = {}; var sourceKeys = Object.keys(source); var key, i; for (i = 0; i < sourceKeys.length; i++) { key = sourceKeys[i]; if (excluded.indexOf(key) >= 0) continue; target[key] = source[key]; } return target; }\n\nimport React from \"react\";\n\nvar _ref2 = /*#__PURE__*/React.createElement(\"line\", {\n x1: 18,\n y1: 6,\n x2: 6,\n y2: 18\n});\n\nvar _ref3 = /*#__PURE__*/React.createElement(\"line\", {\n x1: 6,\n y1: 6,\n x2: 18,\n y2: 18\n});\n\nvar SvgX = function SvgX(_ref) {\n var svgRef = _ref.svgRef,\n title = _ref.title,\n props = _objectWithoutProperties(_ref, [\"svgRef\", \"title\"]);\n\n return /*#__PURE__*/React.createElement(\"svg\", _extends({\n width: 20,\n height: 20,\n viewBox: \"0 0 20 20\",\n fill: \"none\",\n stroke: \"currentColor\",\n strokeWidth: 2,\n strokeLinecap: \"round\",\n strokeLinejoin: \"round\",\n className: \"feather feather-x\",\n ref: svgRef\n }, props), title ? /*#__PURE__*/React.createElement(\"title\", null, title) : null, _ref2, _ref3);\n};\n\nvar ForwardRef = /*#__PURE__*/React.forwardRef(function (props, ref) {\n return /*#__PURE__*/React.createElement(SvgX, _extends({\n svgRef: ref\n }, props));\n});\nexport default __webpack_public_path__ + \"static/media/x.5b8e2186.svg\";\nexport { ForwardRef as ReactComponent };","import { useEffect, useRef } from 'react'\n\n// modified from https://usehooks.com/usePrevious/\nexport default function usePrevious(value: T) {\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()\n\n // Store current value in ref\n useEffect(() => {\n ref.current = value\n }, [value]) // Only re-run if value changes\n\n // Return previous value (happens before update in useEffect above)\n return ref.current\n}\n","import React from 'react'\nimport styled from 'styled-components'\nimport useCopyClipboard from '../../hooks/useCopyClipboard'\n\nimport { LinkStyledButton } from '../../theme'\nimport { CheckCircle, Copy } from 'react-feather'\n\nconst CopyIcon = styled(LinkStyledButton)`\n color: ${({ theme }) => theme.text3};\n flex-shrink: 0;\n display: flex;\n text-decoration: none;\n font-size: 0.825rem;\n :hover,\n :active,\n :focus {\n text-decoration: none;\n color: ${({ theme }) => theme.text2};\n }\n`\nconst TransactionStatusText = styled.span`\n margin-left: 0.25rem;\n font-size: 0.825rem;\n ${({ theme }) => theme.flexRowNoWrap};\n align-items: center;\n`\n\nexport default function CopyHelper(props: { toCopy: string; children?: React.ReactNode }) {\n const [isCopied, setCopied] = useCopyClipboard()\n\n return (\n setCopied(props.toCopy)}>\n {isCopied ? (\n \n \n Copied\n \n ) : (\n \n \n \n )}\n {isCopied ? '' : props.children}\n \n )\n}\n","import copy from 'copy-to-clipboard'\nimport { useCallback, useEffect, useState } from 'react'\n\nexport default function useCopyClipboard(timeout = 500): [boolean, (toCopy: string) => void] {\n const [isCopied, setIsCopied] = useState(false)\n\n const staticCopy = useCallback(text => {\n const didCopy = copy(text)\n setIsCopied(didCopy)\n }, [])\n\n useEffect(() => {\n if (isCopied) {\n const hide = setTimeout(() => {\n setIsCopied(false)\n }, timeout)\n\n return () => {\n clearTimeout(hide)\n }\n }\n return undefined\n }, [isCopied, setIsCopied, timeout])\n\n return [isCopied, staticCopy]\n}\n","import React from 'react'\r\nimport styled from 'styled-components'\r\nimport { CheckCircle, Triangle } from 'react-feather'\r\n\r\nimport { useActiveWeb3React } from '../../hooks'\r\nimport { getEtherscanLink } from '../../utils'\r\nimport { ExternalLink } from '../../theme'\r\nimport { useAllTransactions } from '../../state/transactions/hooks'\r\nimport { RowFixed } from '../Row'\r\nimport Loader from '../Loader'\r\n\r\nconst TransactionWrapper = styled.div``\r\n\r\nconst TransactionStatusText = styled.div`\r\n margin-right: 0.5rem;\r\n display: flex;\r\n align-items: center;\r\n :hover {\r\n text-decoration: underline;\r\n }\r\n`\r\n\r\nconst TransactionState = styled(ExternalLink)<{ pending: boolean; success?: boolean }>`\r\n display: flex;\r\n justify-content: space-between;\r\n align-items: center;\r\n text-decoration: none !important;\r\n border-radius: 5px;\r\n padding: 0.25rem 0rem;\r\n font-weight: 500;\r\n font-size: 0.825rem;\r\n color: ${({ theme }) => theme.primary1};\r\n`\r\n\r\nconst IconWrapper = styled.div<{ pending: boolean; success?: boolean }>`\r\n color: ${({ pending, success, theme }) => (pending ? theme.primary1 : success ? theme.green1 : theme.red1)};\r\n`\r\n\r\nexport default function Transaction({ hash }: { hash: string }) {\r\n const { chainId } = useActiveWeb3React()\r\n const allTransactions = useAllTransactions()\r\n\r\n const tx = allTransactions?.[hash]\r\n const summary = tx?.summary\r\n const pending = !tx?.receipt\r\n const success = !pending && tx && (tx.receipt?.status === 1 || typeof tx.receipt?.status === 'undefined')\r\n\r\n if (!chainId) return null\r\n\r\n return (\r\n \r\n \r\n \r\n {summary ?? hash} ↗\r\n \r\n \r\n {pending ? : success ? : }\r\n \r\n \r\n \r\n )\r\n}\r\n","import React, { useCallback, useContext } from 'react'\r\nimport { useDispatch } from 'react-redux'\r\nimport styled, { ThemeContext } from 'styled-components'\r\nimport { useActiveWeb3React } from '../../hooks'\r\nimport { AppDispatch } from '../../state'\r\nimport { clearAllTransactions } from '../../state/transactions/actions'\r\nimport { shortenAddress } from '../../utils'\r\nimport { AutoRow } from '../Row'\r\nimport Copy from './Copy'\r\nimport Transaction from './Transaction'\r\n\r\nimport { SUPPORTED_WALLETS } from '../../constants'\r\nimport { ReactComponent as Close } from '../../assets/images/x.svg'\r\nimport { getEtherscanLink } from '../../utils'\r\nimport { injected, walletconnect } from '../../connectors'\r\nimport WalletConnectIcon from '../../assets/images/walletConnectIcon.svg'\r\nimport Identicon from '../Identicon'\r\nimport { ButtonSecondary } from '../Button'\r\nimport { ExternalLink as LinkIcon } from 'react-feather'\r\nimport { ExternalLink, LinkStyledButton, TYPE } from '../../theme'\r\n\r\nconst HeaderRow = styled.div`\r\n ${({ theme }) => theme.flexRowNoWrap};\r\n padding: 1rem 1rem;\r\n font-weight: 500;\r\n color: ${props => (props.color === 'blue' ? ({ theme }) => theme.primary1 : 'inherit')};\r\n ${({ theme }) => theme.mediaWidth.upToMedium`\r\n padding: 1rem;\r\n `};\r\n`\r\n\r\nconst UpperSection = styled.div`\r\n position: relative;\r\n\r\n h5 {\r\n margin: 0;\r\n margin-bottom: 0.5rem;\r\n font-size: 1rem;\r\n font-weight: 400;\r\n }\r\n\r\n h5:last-child {\r\n margin-bottom: 0px;\r\n }\r\n\r\n h4 {\r\n margin-top: 0;\r\n font-weight: 500;\r\n }\r\n`\r\n\r\nconst InfoCard = styled.div`\r\n padding: 1rem;\r\n border: 1px solid ${({ theme }) => theme.bg3};\r\n border-radius: 5px;\r\n position: relative;\r\n display: grid;\r\n grid-row-gap: 12px;\r\n margin-bottom: 20px;\r\n`\r\n\r\nconst AccountGroupingRow = styled.div`\r\n ${({ theme }) => theme.flexRowNoWrap};\r\n justify-content: space-between;\r\n align-items: center;\r\n font-weight: 400;\r\n color: ${({ theme }) => theme.text1};\r\n\r\n div {\r\n ${({ theme }) => theme.flexRowNoWrap}\r\n align-items: center;\r\n }\r\n`\r\n\r\nconst AccountSection = styled.div`\r\n background-color: ${({ theme }) => theme.bg1};\r\n padding: 0rem 1rem;\r\n ${({ theme }) => theme.mediaWidth.upToMedium`padding: 0rem 1rem 1.5rem 1rem;`};\r\n`\r\n\r\nconst YourAccount = styled.div`\r\n h5 {\r\n margin: 0 0 1rem 0;\r\n font-weight: 400;\r\n }\r\n\r\n h4 {\r\n margin: 0;\r\n font-weight: 500;\r\n }\r\n`\r\n\r\nconst LowerSection = styled.div`\r\n ${({ theme }) => theme.flexColumnNoWrap}\r\n padding: 1.5rem;\r\n flex-grow: 1;\r\n overflow: auto;\r\n background-color: ${({ theme }) => theme.bg2};\r\n border-bottom-left-radius: 20px;\r\n border-bottom-right-radius: 20px;\r\n\r\n h5 {\r\n margin: 0;\r\n font-weight: 400;\r\n color: ${({ theme }) => theme.text3};\r\n }\r\n`\r\n\r\nconst AccountControl = styled.div`\r\n display: flex;\r\n justify-content: space-between;\r\n min-width: 0;\r\n width: 100%;\r\n\r\n font-weight: 500;\r\n font-size: 1.25rem;\r\n\r\n a:hover {\r\n text-decoration: underline;\r\n }\r\n\r\n p {\r\n min-width: 0;\r\n margin: 0;\r\n overflow: hidden;\r\n text-overflow: ellipsis;\r\n white-space: nowrap;\r\n }\r\n`\r\n\r\nconst AddressLink = styled(ExternalLink)<{ hasENS: boolean; isENS: boolean }>`\r\n font-size: 0.825rem;\r\n color: ${({ theme }) => theme.text3};\r\n margin-left: 1rem;\r\n font-size: 0.825rem;\r\n display: flex;\r\n :hover {\r\n color: ${({ theme }) => theme.text2};\r\n }\r\n`\r\n\r\nconst CloseIcon = styled.div`\r\n position: absolute;\r\n right: 1rem;\r\n top: 14px;\r\n &:hover {\r\n cursor: pointer;\r\n opacity: 0.6;\r\n }\r\n`\r\n\r\nconst CloseColor = styled(Close)`\r\n path {\r\n stroke: ${({ theme }) => theme.text4};\r\n }\r\n`\r\n\r\nconst WalletName = styled.div`\r\n width: initial;\r\n font-size: 0.825rem;\r\n font-weight: 500;\r\n color: ${({ theme }) => theme.text3};\r\n`\r\n\r\nconst IconWrapper = styled.div<{ size?: number }>`\r\n ${({ theme }) => theme.flexColumnNoWrap};\r\n align-items: center;\r\n justify-content: center;\r\n margin-right: 8px;\r\n & > img,\r\n span {\r\n height: ${({ size }) => (size ? size + 'px' : '32px')};\r\n width: ${({ size }) => (size ? size + 'px' : '32px')};\r\n }\r\n ${({ theme }) => theme.mediaWidth.upToMedium`\r\n align-items: flex-end;\r\n `};\r\n`\r\n\r\nconst TransactionListWrapper = styled.div`\r\n ${({ theme }) => theme.flexColumnNoWrap};\r\n`\r\n\r\nconst WalletAction = styled(ButtonSecondary)`\r\n width: fit-content;\r\n font-weight: 400;\r\n margin-left: 8px;\r\n font-size: 0.825rem;\r\n padding: 4px 6px;\r\n :hover {\r\n cursor: pointer;\r\n text-decoration: underline;\r\n }\r\n`\r\n\r\nfunction renderTransactions(transactions: string[]) {\r\n return (\r\n \r\n {transactions.map((hash, i) => {\r\n return \r\n })}\r\n \r\n )\r\n}\r\n\r\ninterface AccountDetailsProps {\r\n toggleWalletModal: () => void\r\n pendingTransactions: string[]\r\n confirmedTransactions: string[]\r\n ENSName?: string\r\n openOptions: () => void\r\n}\r\n\r\nexport default function AccountDetails({\r\n toggleWalletModal,\r\n pendingTransactions,\r\n confirmedTransactions,\r\n ENSName,\r\n openOptions\r\n}: AccountDetailsProps) {\r\n const { chainId, account, connector } = useActiveWeb3React()\r\n const theme = useContext(ThemeContext)\r\n const dispatch = useDispatch()\r\n\r\n function formatConnectorName() {\r\n const { ethereum } = window\r\n const isMetaMask = !!(ethereum && ethereum.isMetaMask)\r\n const name = Object.keys(SUPPORTED_WALLETS)\r\n .filter(\r\n k =>\r\n SUPPORTED_WALLETS[k].connector === connector && (connector !== injected || isMetaMask === (k === 'METAMASK'))\r\n )\r\n .map(k => SUPPORTED_WALLETS[k].name)[0]\r\n return Connected with {name}\r\n }\r\n\r\n function getStatusIcon() {\r\n if (connector === injected) {\r\n return (\r\n \r\n \r\n \r\n )\r\n } else if (connector === walletconnect) {\r\n return (\r\n \r\n {'wallet\r\n \r\n )\r\n }\r\n return null\r\n }\r\n\r\n const clearAllTransactionsCallback = useCallback(() => {\r\n if (chainId) dispatch(clearAllTransactions({ chainId }))\r\n }, [dispatch, chainId])\r\n\r\n return (\r\n <>\r\n \r\n \r\n \r\n \r\n Account\r\n \r\n \r\n \r\n \r\n {formatConnectorName()}\r\n
\r\n {connector !== injected && (\r\n {\r\n ;(connector as any).close()\r\n }}\r\n >\r\n Disconnect\r\n \r\n )}\r\n {\r\n openOptions()\r\n }}\r\n >\r\n Change\r\n \r\n
\r\n
\r\n \r\n \r\n {ENSName ? (\r\n <>\r\n
\r\n {getStatusIcon()}\r\n

{ENSName}

\r\n
\r\n \r\n ) : (\r\n <>\r\n
\r\n {getStatusIcon()}\r\n

{account && shortenAddress(account)}

\r\n
\r\n \r\n )}\r\n
\r\n
\r\n \r\n {ENSName ? (\r\n <>\r\n \r\n
\r\n {account && (\r\n \r\n Copy Address\r\n \r\n )}\r\n {chainId && account && (\r\n \r\n \r\n View on Blockscout\r\n \r\n )}\r\n
\r\n
\r\n \r\n ) : (\r\n <>\r\n \r\n
\r\n {account && (\r\n \r\n Copy Address\r\n \r\n )}\r\n {chainId && account && (\r\n \r\n \r\n View on Blockscout\r\n \r\n )}\r\n
\r\n
\r\n \r\n )}\r\n
\r\n
\r\n
\r\n
\r\n
\r\n {!!pendingTransactions.length || !!confirmedTransactions.length ? (\r\n \r\n \r\n Recent Transactions\r\n (clear all)\r\n \r\n {renderTransactions(pendingTransactions)}\r\n {renderTransactions(confirmedTransactions)}\r\n \r\n ) : (\r\n \r\n Your transactions will appear here...\r\n \r\n )}\r\n \r\n )\r\n}\r\n","import React from 'react'\r\nimport styled, { css } from 'styled-components'\r\nimport { animated, useTransition, useSpring } from 'react-spring'\r\nimport { DialogOverlay, DialogContent } from '@reach/dialog'\r\nimport { isMobile } from 'react-device-detect'\r\nimport '@reach/dialog/styles.css'\r\nimport { transparentize } from 'polished'\r\nimport { useGesture } from 'react-use-gesture'\r\n\r\nconst AnimatedDialogOverlay = animated(DialogOverlay)\r\n// eslint-disable-next-line @typescript-eslint/no-unused-vars\r\nconst StyledDialogOverlay = styled(AnimatedDialogOverlay)`\r\n &[data-reach-dialog-overlay] {\r\n z-index: 2;\r\n background-color: transparent;\r\n overflow: hidden;\r\n\r\n display: flex;\r\n align-items: center;\r\n justify-content: center;\r\n\r\n background-color: ${({ theme }) => theme.modalBG};\r\n }\r\n`\r\n\r\nconst AnimatedDialogContent = animated(DialogContent)\r\n// destructure to not pass custom props to Dialog DOM element\r\n// eslint-disable-next-line @typescript-eslint/no-unused-vars\r\nconst StyledDialogContent = styled(({ minHeight, maxHeight, mobile, isOpen, ...rest }) => (\r\n \r\n)).attrs({\r\n 'aria-label': 'dialog'\r\n})`\r\n overflow-y: ${({ mobile }) => (mobile ? 'scroll' : 'hidden')};\r\n\r\n &[data-reach-dialog-content] {\r\n margin: 0 0 2rem 0;\r\n background-color: ${({ theme }) => theme.bg1};\r\n box-shadow: 0 4px 8px 0 ${({ theme }) => transparentize(0.95, theme.shadow1)};\r\n padding: 0px;\r\n width: 50vw;\r\n overflow-y: ${({ mobile }) => (mobile ? 'scroll' : 'hidden')};\r\n overflow-x: hidden;\r\n\r\n align-self: ${({ mobile }) => (mobile ? 'flex-end' : 'center')};\r\n\r\n max-width: 420px;\r\n ${({ maxHeight }) =>\r\n maxHeight &&\r\n css`\r\n max-height: ${maxHeight}vh;\r\n `}\r\n ${({ minHeight }) =>\r\n minHeight &&\r\n css`\r\n min-height: ${minHeight}vh;\r\n `}\r\n display: flex;\r\n border-radius: 5px;\r\n ${({ theme }) => theme.mediaWidth.upToMedium`\r\n width: 65vw;\r\n margin: 0;\r\n `}\r\n ${({ theme, mobile }) => theme.mediaWidth.upToSmall`\r\n width: 85vw;\r\n ${mobile &&\r\n css`\r\n width: 100vw;\r\n border-radius: 5px;\r\n border-bottom-left-radius: 0;\r\n border-bottom-right-radius: 0;\r\n `}\r\n `}\r\n }\r\n`\r\n\r\ninterface ModalProps {\r\n isOpen: boolean\r\n onDismiss: () => void\r\n minHeight?: number | false\r\n maxHeight?: number\r\n initialFocusRef?: React.RefObject\r\n children?: React.ReactNode\r\n}\r\n\r\nexport default function Modal({\r\n isOpen,\r\n onDismiss,\r\n minHeight = false,\r\n maxHeight = 90,\r\n initialFocusRef,\r\n children\r\n}: ModalProps) {\r\n const fadeTransition = useTransition(isOpen, null, {\r\n config: { duration: 200 },\r\n from: { opacity: 0 },\r\n enter: { opacity: 1 },\r\n leave: { opacity: 0 }\r\n })\r\n\r\n const [{ y }, set] = useSpring(() => ({ y: 0, config: { mass: 1, tension: 210, friction: 20 } }))\r\n const bind = useGesture({\r\n onDrag: state => {\r\n set({\r\n y: state.down ? state.movement[1] : 0\r\n })\r\n if (state.movement[1] > 300 || (state.velocity > 3 && state.direction[1] > 0)) {\r\n onDismiss()\r\n }\r\n }\r\n })\r\n\r\n return (\r\n <>\r\n {fadeTransition.map(\r\n ({ item, key, props }) =>\r\n item && (\r\n \r\n `translateY(${y as any > 0 ? y : 0}px)`) }\r\n }\r\n : {})}\r\n aria-label=\"dialog content\"\r\n minHeight={minHeight}\r\n maxHeight={maxHeight}\r\n mobile={isMobile}\r\n >\r\n {/* prevents the automatic focusing of inputs on mobile by the reach dialog */}\r\n {!initialFocusRef && isMobile ?
: null}\r\n {children}\r\n \r\n \r\n )\r\n )}\r\n \r\n )\r\n}\r\n","import React from 'react'\r\nimport styled from 'styled-components'\r\nimport { ExternalLink } from '../../theme'\r\n\r\nconst InfoCard = styled.button<{ active?: boolean }>`\r\n background-color: ${({ theme, active }) => (active ? theme.bg3 : theme.bg2)};\r\n padding: 1rem;\r\n outline: none;\r\n border: 1px solid;\r\n border-radius: 5px;\r\n width: 100% !important;\r\n &:focus {\r\n box-shadow: 0 0 0 1px ${({ theme }) => theme.primary1};\r\n }\r\n border-color: ${({ theme, active }) => (active ? 'transparent' : theme.bg3)};\r\n`\r\n\r\nconst OptionCard = styled(InfoCard as any)`\r\n display: flex;\r\n flex-direction: row;\r\n align-items: center;\r\n justify-content: space-between;\r\n margin-top: 2rem;\r\n padding: 1rem;\r\n`\r\n\r\nconst OptionCardLeft = styled.div`\r\n ${({ theme }) => theme.flexColumnNoWrap};\r\n justify-content: center;\r\n height: 100%;\r\n`\r\n\r\nconst OptionCardClickable = styled(OptionCard as any)<{ clickable?: boolean }>`\r\n margin-top: 0;\r\n &:hover {\r\n cursor: ${({ clickable }) => (clickable ? 'pointer' : '')};\r\n border: ${({ clickable, theme }) => (clickable ? `1px solid ${theme.primary1}` : ``)};\r\n }\r\n opacity: ${({ disabled }) => (disabled ? '0.5' : '1')};\r\n`\r\n\r\nconst GreenCircle = styled.div`\r\n ${({ theme }) => theme.flexRowNoWrap}\r\n justify-content: center;\r\n align-items: center;\r\n\r\n &:first-child {\r\n height: 8px;\r\n width: 8px;\r\n margin-right: 8px;\r\n background-color: ${({ theme }) => theme.green1};\r\n border-radius: 50%;\r\n }\r\n`\r\n\r\nconst CircleWrapper = styled.div`\r\n color: ${({ theme }) => theme.green1};\r\n display: flex;\r\n justify-content: center;\r\n align-items: center;\r\n`\r\n\r\nconst HeaderText = styled.div`\r\n ${({ theme }) => theme.flexRowNoWrap};\r\n color: ${props => (props.color === 'blue' ? ({ theme }) => theme.primary1 : ({ theme }) => theme.text1)};\r\n font-size: 1rem;\r\n font-weight: 500;\r\n`\r\n\r\nconst SubHeader = styled.div`\r\n color: ${({ theme }) => theme.text1};\r\n margin-top: 10px;\r\n font-size: 12px;\r\n`\r\n\r\nconst IconWrapper = styled.div<{ size?: number | null }>`\r\n ${({ theme }) => theme.flexColumnNoWrap};\r\n align-items: center;\r\n justify-content: center;\r\n & > img,\r\n span {\r\n height: ${({ size }) => (size ? size + 'px' : '24px')};\r\n width: ${({ size }) => (size ? size + 'px' : '24px')};\r\n }\r\n ${({ theme }) => theme.mediaWidth.upToMedium`\r\n align-items: flex-end;\r\n `};\r\n`\r\n\r\nexport default function Option({\r\n link = null,\r\n clickable = true,\r\n size,\r\n onClick = null,\r\n color,\r\n header,\r\n subheader = null,\r\n icon,\r\n active = false,\r\n id\r\n}: {\r\n link?: string | null\r\n clickable?: boolean\r\n size?: number | null\r\n onClick?: null | (() => void)\r\n color: string\r\n header: React.ReactNode\r\n subheader: React.ReactNode | null\r\n icon: string\r\n active?: boolean\r\n id: string\r\n}) {\r\n const content = (\r\n \r\n \r\n \r\n {active ? (\r\n \r\n \r\n
\r\n \r\n \r\n ) : (\r\n ''\r\n )}\r\n {header}\r\n \r\n {subheader && {subheader}}\r\n \r\n \r\n {'Icon'}\r\n \r\n \r\n )\r\n if (link) {\r\n return {content}\r\n }\r\n\r\n return content\r\n}\r\n","import { AbstractConnector } from '@web3-react/abstract-connector'\r\nimport React from 'react'\r\nimport styled from 'styled-components'\r\nimport Option from './Option'\r\nimport { SUPPORTED_WALLETS } from '../../constants'\r\nimport { injected } from '../../connectors'\r\nimport { darken } from 'polished'\r\nimport Loader from '../Loader'\r\n\r\nconst PendingSection = styled.div`\r\n ${({ theme }) => theme.flexColumnNoWrap};\r\n align-items: center;\r\n justify-content: center;\r\n width: 100%;\r\n & > * {\r\n width: 100%;\r\n }\r\n`\r\n\r\nconst StyledLoader = styled(Loader)`\r\n margin-right: 1rem;\r\n`\r\n\r\nconst LoadingMessage = styled.div<{ error?: boolean }>`\r\n ${({ theme }) => theme.flexRowNoWrap};\r\n align-items: center;\r\n justify-content: flex-start;\r\n border-radius: 5px;\r\n margin-bottom: 20px;\r\n color: ${({ theme, error }) => (error ? theme.red1 : 'inherit')};\r\n border: 1px solid ${({ theme, error }) => (error ? theme.red1 : theme.text4)};\r\n\r\n & > * {\r\n padding: 1rem;\r\n }\r\n`\r\n\r\nconst ErrorGroup = styled.div`\r\n ${({ theme }) => theme.flexRowNoWrap};\r\n align-items: center;\r\n justify-content: flex-start;\r\n`\r\n\r\nconst ErrorButton = styled.div`\r\n border-radius: 5px;\r\n font-size: 12px;\r\n color: ${({ theme }) => theme.text1};\r\n background-color: ${({ theme }) => theme.bg4};\r\n margin-left: 1rem;\r\n padding: 0.5rem;\r\n font-weight: 600;\r\n user-select: none;\r\n\r\n &:hover {\r\n cursor: pointer;\r\n background-color: ${({ theme }) => darken(0.1, theme.text4)};\r\n }\r\n`\r\n\r\nconst LoadingWrapper = styled.div`\r\n ${({ theme }) => theme.flexRowNoWrap};\r\n align-items: center;\r\n justify-content: center;\r\n`\r\n\r\nexport default function PendingView({\r\n connector,\r\n error = false,\r\n setPendingError,\r\n tryActivation\r\n}: {\r\n connector?: AbstractConnector\r\n error?: boolean\r\n setPendingError: (error: boolean) => void\r\n tryActivation: (connector: AbstractConnector) => void\r\n}) {\r\n const isMetamask = window?.ethereum?.isMetaMask\r\n\r\n return (\r\n \r\n \r\n \r\n {error ? (\r\n \r\n
Error connecting.
\r\n {\r\n setPendingError(false)\r\n connector && tryActivation(connector)\r\n }}\r\n >\r\n Try Again\r\n \r\n
\r\n ) : (\r\n <>\r\n \r\n Initializing...\r\n \r\n )}\r\n
\r\n
\r\n {Object.keys(SUPPORTED_WALLETS).map(key => {\r\n const option = SUPPORTED_WALLETS[key]\r\n if (option.connector === connector) {\r\n if (option.connector === injected) {\r\n if (isMetamask && option.name !== 'MetaMask') {\r\n return null\r\n }\r\n if (!isMetamask && option.name === 'MetaMask') {\r\n return null\r\n }\r\n }\r\n return (\r\n \r\n )\r\n }\r\n return null\r\n })}\r\n
\r\n )\r\n}\r\n","import { AbstractConnector } from '@web3-react/abstract-connector'\r\nimport { UnsupportedChainIdError, useWeb3React } from '@web3-react/core'\r\nimport { WalletConnectConnector } from '@web3-react/walletconnect-connector'\r\nimport React, { useEffect, useState } from 'react'\r\nimport { isMobile } from 'react-device-detect'\r\nimport ReactGA from 'react-ga'\r\nimport styled from 'styled-components'\r\nimport MetamaskIcon from '../../assets/images/metamask.png'\r\nimport { ReactComponent as Close } from '../../assets/images/x.svg'\r\nimport { injected } from '../../connectors'\r\nimport { SUPPORTED_WALLETS } from '../../constants'\r\nimport usePrevious from '../../hooks/usePrevious'\r\nimport { ApplicationModal } from '../../state/application/actions'\r\nimport { useModalOpen, useWalletModalToggle } from '../../state/application/hooks'\r\nimport { ExternalLink } from '../../theme'\r\nimport AccountDetails from '../AccountDetails'\r\n\r\nimport Modal from '../Modal'\r\nimport Option from './Option'\r\nimport PendingView from './PendingView'\r\n\r\nconst CloseIcon = styled.div`\r\n position: absolute;\r\n right: 1rem;\r\n top: 14px;\r\n &:hover {\r\n cursor: pointer;\r\n opacity: 0.6;\r\n }\r\n`\r\n\r\nconst CloseColor = styled(Close)`\r\n path {\r\n stroke: ${({ theme }) => theme.text4};\r\n }\r\n`\r\n\r\nconst Wrapper = styled.div`\r\n ${({ theme }) => theme.flexColumnNoWrap}\r\n margin: 0;\r\n padding: 0;\r\n width: 100%;\r\n`\r\n\r\nconst HeaderRow = styled.div`\r\n ${({ theme }) => theme.flexRowNoWrap};\r\n padding: 1rem 1rem;\r\n border-radius: 25px;\r\n font-weight: 500;\r\n color: ${props => (props.color === 'blue' ? ({ theme }) => theme.primary1 : 'inherit')};\r\n ${({ theme }) => theme.mediaWidth.upToMedium`\r\n padding: 1rem;\r\n `};\r\n`\r\n\r\nconst ContentWrapper = styled.div`\r\n background-color: ${({ theme }) => theme.bg2};\r\n padding: 2rem;\r\n border-bottom-left-radius: 20px;\r\n border-bottom-right-radius: 20px;\r\n\r\n ${({ theme }) => theme.mediaWidth.upToMedium`padding: 1rem`};\r\n`\r\n\r\nconst UpperSection = styled.div`\r\n position: relative;\r\n\r\n h5 {\r\n margin: 0;\r\n margin-bottom: 0.5rem;\r\n font-size: 1rem;\r\n font-weight: 400;\r\n }\r\n\r\n h5:last-child {\r\n margin-bottom: 0px;\r\n }\r\n\r\n h4 {\r\n margin-top: 0;\r\n font-weight: 500;\r\n }\r\n`\r\n\r\nconst Blurb = styled.div`\r\n ${({ theme }) => theme.flexRowNoWrap}\r\n align-items: center;\r\n justify-content: center;\r\n flex-wrap: wrap;\r\n margin-top: 2rem;\r\n ${({ theme }) => theme.mediaWidth.upToMedium`\r\n margin: 1rem;\r\n font-size: 12px;\r\n `};\r\n`\r\n\r\nconst OptionGrid = styled.div`\r\n display: grid;\r\n grid-gap: 10px;\r\n ${({ theme }) => theme.mediaWidth.upToMedium`\r\n grid-template-columns: 1fr;\r\n grid-gap: 10px;\r\n `};\r\n`\r\n\r\nconst HoverText = styled.div`\r\n :hover {\r\n cursor: pointer;\r\n }\r\n`\r\n\r\nconst WALLET_VIEWS = {\r\n OPTIONS: 'options',\r\n OPTIONS_SECONDARY: 'options_secondary',\r\n ACCOUNT: 'account',\r\n PENDING: 'pending'\r\n}\r\n\r\nexport default function WalletModal({\r\n pendingTransactions,\r\n confirmedTransactions,\r\n ENSName\r\n}: {\r\n pendingTransactions: string[] // hashes of pending\r\n confirmedTransactions: string[] // hashes of confirmed\r\n ENSName?: string\r\n}) {\r\n // important that these are destructed from the account-specific web3-react context\r\n const { active, account, connector, activate, error } = useWeb3React()\r\n\r\n const [walletView, setWalletView] = useState(WALLET_VIEWS.ACCOUNT)\r\n\r\n const [pendingWallet, setPendingWallet] = useState()\r\n\r\n const [pendingError, setPendingError] = useState()\r\n\r\n const walletModalOpen = useModalOpen(ApplicationModal.WALLET)\r\n const toggleWalletModal = useWalletModalToggle()\r\n\r\n const previousAccount = usePrevious(account)\r\n\r\n // close on connection, when logged out before\r\n useEffect(() => {\r\n if (account && !previousAccount && walletModalOpen) {\r\n toggleWalletModal()\r\n }\r\n }, [account, previousAccount, toggleWalletModal, walletModalOpen])\r\n\r\n // always reset to account view\r\n useEffect(() => {\r\n if (walletModalOpen) {\r\n setPendingError(false)\r\n setWalletView(WALLET_VIEWS.ACCOUNT)\r\n }\r\n }, [walletModalOpen])\r\n\r\n // close modal when a connection is successful\r\n const activePrevious = usePrevious(active)\r\n const connectorPrevious = usePrevious(connector)\r\n useEffect(() => {\r\n if (walletModalOpen && ((active && !activePrevious) || (connector && connector !== connectorPrevious && !error))) {\r\n setWalletView(WALLET_VIEWS.ACCOUNT)\r\n }\r\n }, [setWalletView, active, error, connector, walletModalOpen, activePrevious, connectorPrevious])\r\n\r\n const tryActivation = async (connector: AbstractConnector | undefined) => {\r\n let name = ''\r\n Object.keys(SUPPORTED_WALLETS).map(key => {\r\n if (connector === SUPPORTED_WALLETS[key].connector) {\r\n return (name = SUPPORTED_WALLETS[key].name)\r\n }\r\n return true\r\n })\r\n // log selected wallet\r\n ReactGA.event({\r\n category: 'Wallet',\r\n action: 'Change Wallet',\r\n label: name\r\n })\r\n setPendingWallet(connector) // set wallet for pending view\r\n setWalletView(WALLET_VIEWS.PENDING)\r\n\r\n // if the connector is walletconnect and the user has already tried to connect, manually reset the connector\r\n if (connector instanceof WalletConnectConnector && connector.walletConnectProvider?.wc?.uri) {\r\n connector.walletConnectProvider = undefined\r\n }\r\n\r\n connector &&\r\n activate(connector, undefined, true).catch(error => {\r\n if (error instanceof UnsupportedChainIdError) {\r\n activate(connector) // a little janky...can't use setError because the connector isn't set\r\n } else {\r\n setPendingError(true)\r\n }\r\n })\r\n }\r\n\r\n useEffect(() => {}, [toggleWalletModal])\r\n\r\n // get wallets user can switch too, depending on device/browser\r\n function getOptions() {\r\n const isMetamask = window.ethereum && window.ethereum.isMetaMask\r\n return Object.keys(SUPPORTED_WALLETS).map(key => {\r\n const option = SUPPORTED_WALLETS[key]\r\n // check for mobile options\r\n if (isMobile) {\r\n if (!window.web3 && !window.ethereum && option.mobile) {\r\n return (\r\n {\r\n option.connector !== connector && !option.href && tryActivation(option.connector)\r\n }}\r\n id={`connect-${key}`}\r\n key={key}\r\n active={option.connector && option.connector === connector}\r\n color={option.color}\r\n link={option.href}\r\n header={option.name}\r\n subheader={null}\r\n icon={require('../../assets/images/' + option.iconName)}\r\n />\r\n )\r\n }\r\n return null\r\n }\r\n\r\n // overwrite injected when needed\r\n if (option.connector === injected) {\r\n // don't show injected if there's no injected provider\r\n if (!(window.web3 || window.ethereum)) {\r\n if (option.name === 'MetaMask') {\r\n return (\r\n \r\n )\r\n } else {\r\n return null //dont want to return install twice\r\n }\r\n }\r\n // don't return metamask if injected provider isn't metamask\r\n else if (option.name === 'MetaMask' && !isMetamask) {\r\n return null\r\n }\r\n // likewise for generic\r\n else if (option.name === 'Injected' && isMetamask) {\r\n return null\r\n }\r\n }\r\n\r\n // return rest of options\r\n return (\r\n !isMobile &&\r\n !option.mobileOnly && (\r\n {\r\n option.connector === connector\r\n ? setWalletView(WALLET_VIEWS.ACCOUNT)\r\n : !option.href && tryActivation(option.connector)\r\n }}\r\n key={key}\r\n active={option.connector === connector}\r\n color={option.color}\r\n link={option.href}\r\n header={option.name}\r\n subheader={null} //use option.descriptio to bring back multi-line\r\n icon={require('../../assets/images/' + option.iconName)}\r\n />\r\n )\r\n )\r\n })\r\n }\r\n\r\n function getModalContent() {\r\n if (error) {\r\n return (\r\n \r\n \r\n \r\n \r\n {error instanceof UnsupportedChainIdError ? 'Wrong Network' : 'Error connecting'}\r\n \r\n {error instanceof UnsupportedChainIdError ? (\r\n
Please connect to the appropriate ethereum network.
\r\n ) : (\r\n 'Error connecting. Try refreshing the page.'\r\n )}\r\n
\r\n
\r\n )\r\n }\r\n if (account && walletView === WALLET_VIEWS.ACCOUNT) {\r\n return (\r\n setWalletView(WALLET_VIEWS.OPTIONS)}\r\n />\r\n )\r\n }\r\n return (\r\n \r\n \r\n \r\n \r\n {walletView !== WALLET_VIEWS.ACCOUNT ? (\r\n \r\n {\r\n setPendingError(false)\r\n setWalletView(WALLET_VIEWS.ACCOUNT)\r\n }}\r\n >\r\n Back\r\n \r\n \r\n ) : (\r\n \r\n Connect to a wallet\r\n \r\n )}\r\n \r\n {walletView === WALLET_VIEWS.PENDING ? (\r\n \r\n ) : (\r\n {getOptions()}\r\n )}\r\n {walletView !== WALLET_VIEWS.PENDING && (\r\n \r\n New to ethereum?  {' '}\r\n Learn more about wallets\r\n \r\n )}\r\n \r\n \r\n )\r\n }\r\n\r\n return (\r\n \r\n {getModalContent()}\r\n \r\n )\r\n}\r\n","import { AbstractConnector } from '@web3-react/abstract-connector'\r\nimport { UnsupportedChainIdError, useWeb3React } from '@web3-react/core'\r\nimport { darken, lighten } from 'polished'\r\nimport React, { useMemo } from 'react'\r\nimport { Activity } from 'react-feather'\r\nimport { useTranslation } from 'react-i18next'\r\nimport styled, { css } from 'styled-components'\r\nimport WalletConnectIcon from '../../assets/images/walletConnectIcon.svg'\r\nimport { injected, walletconnect } from '../../connectors'\r\nimport { NetworkContextName } from '../../constants'\r\nimport useENSName from '../../hooks/useENSName'\r\nimport { useHasSocks } from '../../hooks/useSocksBalance'\r\nimport { useWalletModalToggle } from '../../state/application/hooks'\r\nimport { isTransactionRecent, useAllTransactions } from '../../state/transactions/hooks'\r\nimport { TransactionDetails } from '../../state/transactions/reducer'\r\nimport { shortenAddress } from '../../utils'\r\nimport { ButtonSecondary } from '../Button'\r\n\r\nimport Identicon from '../Identicon'\r\nimport Loader from '../Loader'\r\n\r\nimport { RowBetween } from '../Row'\r\nimport WalletModal from '../WalletModal'\r\n\r\nconst IconWrapper = styled.div<{ size?: number }>`\r\n ${({ theme }) => theme.flexColumnNoWrap};\r\n align-items: center;\r\n justify-content: center;\r\n & > * {\r\n height: ${({ size }) => (size ? size + 'px' : '32px')};\r\n width: ${({ size }) => (size ? size + 'px' : '32px')};\r\n }\r\n`\r\n\r\nconst Web3StatusGeneric = styled(ButtonSecondary)`\r\n ${({ theme }) => theme.flexRowNoWrap}\r\n width: 100%;\r\n align-items: center;\r\n padding: 0.5rem;\r\n border-radius: 5px;\r\n cursor: pointer;\r\n user-select: none;\r\n :focus {\r\n outline: none;\r\n }\r\n`\r\nconst Web3StatusError = styled(Web3StatusGeneric)`\r\n background-color: ${({ theme }) => theme.red1};\r\n border: 1px solid ${({ theme }) => theme.red1};\r\n color: ${({ theme }) => theme.white};\r\n font-weight: 500;\r\n :hover,\r\n :focus {\r\n background-color: ${({ theme }) => darken(0.1, theme.red1)};\r\n }\r\n`\r\n\r\nconst Web3StatusConnect = styled(Web3StatusGeneric)<{ faded?: boolean }>`\r\n background-color: ${({ theme }) => theme.primary4};\r\n border: none;\r\n color: ${({ theme }) => theme.primaryText1};\r\n font-weight: 500;\r\n\r\n :hover,\r\n :focus {\r\n border: 1px solid ${({ theme }) => darken(0.05, theme.primary4)};\r\n color: ${({ theme }) => theme.primaryText1};\r\n }\r\n\r\n ${({ faded }) =>\r\n faded &&\r\n css`\r\n background-color: ${({ theme }) => theme.primary5};\r\n border: 1px solid ${({ theme }) => theme.primary5};\r\n color: ${({ theme }) => theme.primaryText1};\r\n\r\n :hover,\r\n :focus {\r\n border: 1px solid ${({ theme }) => darken(0.05, theme.primary4)};\r\n color: ${({ theme }) => darken(0.05, theme.primaryText1)};\r\n }\r\n `}\r\n`\r\n\r\nconst Web3StatusConnected = styled(Web3StatusGeneric)<{ pending?: boolean }>`\r\n background-color: ${({ pending, theme }) => (pending ? theme.primary1 : theme.bg2)};\r\n border: 1px solid ${({ pending, theme }) => (pending ? theme.primary1 : theme.bg3)};\r\n color: ${({ pending, theme }) => (pending ? theme.white : theme.text1)};\r\n font-weight: 500;\r\n :hover,\r\n :focus {\r\n background-color: ${({ pending, theme }) => (pending ? darken(0.05, theme.primary1) : lighten(0.05, theme.bg2))};\r\n\r\n :focus {\r\n border: 1px solid ${({ pending, theme }) => (pending ? darken(0.1, theme.primary1) : darken(0.1, theme.bg3))};\r\n }\r\n }\r\n`\r\n\r\nconst Text = styled.p`\r\n flex: 1 1 auto;\r\n overflow: hidden;\r\n text-overflow: ellipsis;\r\n white-space: nowrap;\r\n margin: 0 0.5rem 0 0.25rem;\r\n font-size: 1rem;\r\n width: fit-content;\r\n font-weight: 500;\r\n`\r\n\r\nconst NetworkIcon = styled(Activity)`\r\n margin-left: 0.25rem;\r\n margin-right: 0.5rem;\r\n width: 16px;\r\n height: 16px;\r\n`\r\n\r\n// we want the latest one to come first, so return negative if a is after b\r\nfunction newTransactionsFirst(a: TransactionDetails, b: TransactionDetails) {\r\n return b.addedTime - a.addedTime\r\n}\r\n\r\nconst SOCK = (\r\n \r\n 🧦\r\n \r\n)\r\n\r\n// eslint-disable-next-line react/prop-types\r\nfunction StatusIcon({ connector }: { connector: AbstractConnector }) {\r\n if (connector === injected) {\r\n return \r\n } else if (connector === walletconnect) {\r\n return (\r\n \r\n {''}\r\n \r\n )\r\n }\r\n return null\r\n}\r\n\r\nfunction Web3StatusInner() {\r\n const { t } = useTranslation()\r\n const { account, connector, error } = useWeb3React()\r\n\r\n const { ENSName } = useENSName(account ?? undefined)\r\n\r\n const allTransactions = useAllTransactions()\r\n\r\n const sortedRecentTransactions = useMemo(() => {\r\n const txs = Object.values(allTransactions)\r\n return txs.filter(isTransactionRecent).sort(newTransactionsFirst)\r\n }, [allTransactions])\r\n\r\n const pending = sortedRecentTransactions.filter(tx => !tx.receipt).map(tx => tx.hash)\r\n\r\n const hasPendingTransactions = !!pending.length\r\n const hasSocks = useHasSocks()\r\n const toggleWalletModal = useWalletModalToggle()\r\n\r\n if (account) {\r\n return (\r\n \r\n {hasPendingTransactions ? (\r\n \r\n {pending?.length} Pending \r\n \r\n ) : (\r\n <>\r\n {hasSocks ? SOCK : null}\r\n {ENSName || shortenAddress(account)}\r\n \r\n )}\r\n {!hasPendingTransactions && connector && }\r\n \r\n )\r\n } else if (error) {\r\n return (\r\n \r\n \r\n {error instanceof UnsupportedChainIdError ? 'Wrong Network' : 'Error'}\r\n \r\n )\r\n } else {\r\n return (\r\n \r\n {t('Connect to a wallet')}\r\n \r\n )\r\n }\r\n}\r\n\r\nexport default function Web3Status() {\r\n const { active, account } = useWeb3React()\r\n const contextNetwork = useWeb3React(NetworkContextName)\r\n\r\n const { ENSName } = useENSName(account ?? undefined)\r\n\r\n const allTransactions = useAllTransactions()\r\n\r\n const sortedRecentTransactions = useMemo(() => {\r\n const txs = Object.values(allTransactions)\r\n return txs.filter(isTransactionRecent).sort(newTransactionsFirst)\r\n }, [allTransactions])\r\n\r\n const pending = sortedRecentTransactions.filter(tx => !tx.receipt).map(tx => tx.hash)\r\n const confirmed = sortedRecentTransactions.filter(tx => tx.receipt).map(tx => tx.hash)\r\n\r\n if (!contextNetwork.active && !active) {\r\n return null\r\n }\r\n\r\n return (\r\n <>\r\n \r\n \r\n \r\n )\r\n}\r\n","function _extends() { _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; return _extends.apply(this, arguments); }\n\nfunction _objectWithoutProperties(source, excluded) { if (source == null) return {}; var target = _objectWithoutPropertiesLoose(source, excluded); var key, i; if (Object.getOwnPropertySymbols) { var sourceSymbolKeys = Object.getOwnPropertySymbols(source); for (i = 0; i < sourceSymbolKeys.length; i++) { key = sourceSymbolKeys[i]; if (excluded.indexOf(key) >= 0) continue; if (!Object.prototype.propertyIsEnumerable.call(source, key)) continue; target[key] = source[key]; } } return target; }\n\nfunction _objectWithoutPropertiesLoose(source, excluded) { if (source == null) return {}; var target = {}; var sourceKeys = Object.keys(source); var key, i; for (i = 0; i < sourceKeys.length; i++) { key = sourceKeys[i]; if (excluded.indexOf(key) >= 0) continue; target[key] = source[key]; } return target; }\n\nimport React from \"react\";\n\nvar _ref2 = /*#__PURE__*/React.createElement(\"circle\", {\n cx: 12,\n cy: 12,\n r: 5\n});\n\nvar _ref3 = /*#__PURE__*/React.createElement(\"line\", {\n x1: 12,\n y1: 1,\n x2: 12,\n y2: 3\n});\n\nvar _ref4 = /*#__PURE__*/React.createElement(\"line\", {\n x1: 12,\n y1: 21,\n x2: 12,\n y2: 23\n});\n\nvar _ref5 = /*#__PURE__*/React.createElement(\"line\", {\n x1: 4.22,\n y1: 4.22,\n x2: 5.64,\n y2: 5.64\n});\n\nvar _ref6 = /*#__PURE__*/React.createElement(\"line\", {\n x1: 18.36,\n y1: 18.36,\n x2: 19.78,\n y2: 19.78\n});\n\nvar _ref7 = /*#__PURE__*/React.createElement(\"line\", {\n x1: 1,\n y1: 12,\n x2: 3,\n y2: 12\n});\n\nvar _ref8 = /*#__PURE__*/React.createElement(\"line\", {\n x1: 21,\n y1: 12,\n x2: 23,\n y2: 12\n});\n\nvar _ref9 = /*#__PURE__*/React.createElement(\"line\", {\n x1: 4.22,\n y1: 19.78,\n x2: 5.64,\n y2: 18.36\n});\n\nvar _ref10 = /*#__PURE__*/React.createElement(\"line\", {\n x1: 18.36,\n y1: 5.64,\n x2: 19.78,\n y2: 4.22\n});\n\nvar SvgLightmode = function SvgLightmode(_ref) {\n var svgRef = _ref.svgRef,\n title = _ref.title,\n props = _objectWithoutProperties(_ref, [\"svgRef\", \"title\"]);\n\n return /*#__PURE__*/React.createElement(\"svg\", _extends({\n width: 20,\n height: 20,\n viewBox: \"0 0 24 24\",\n fill: \"none\",\n stroke: \"currentColor\",\n strokeWidth: 2,\n strokeLinecap: \"round\",\n strokeLinejoin: \"round\",\n ref: svgRef\n }, props), title ? /*#__PURE__*/React.createElement(\"title\", null, title) : null, _ref2, _ref3, _ref4, _ref5, _ref6, _ref7, _ref8, _ref9, _ref10);\n};\n\nvar ForwardRef = /*#__PURE__*/React.forwardRef(function (props, ref) {\n return /*#__PURE__*/React.createElement(SvgLightmode, _extends({\n svgRef: ref\n }, props));\n});\nexport default __webpack_public_path__ + \"static/media/lightmode.d1bb2c1b.svg\";\nexport { ForwardRef as ReactComponent };","import React from 'react'\r\nimport styled from 'styled-components'\r\nimport { ReactComponent as LightIcon } from '../../assets/images/lightmode.svg'\r\n\r\nconst StyledLightIcon = styled(LightIcon)`\r\n circle {\r\n stroke: ${({ theme }) => theme.text1};\r\n }\r\n line {\r\n stroke: ${({ theme }) => theme.text1};\r\n }\r\n`\r\n\r\nconst StyledMenuButton = styled.button`\r\n width: 100%;\r\n height: 100%;\r\n border: none;\r\n background-color: transparent;\r\n margin: 0;\r\n padding: 0;\r\n height: 35px;\r\n background-color: ${({ theme }) => theme.bg3};\r\n\r\n padding: 0.15rem 0.5rem;\r\n border-radius: 5px;\r\n\r\n :hover {\r\n cursor: pointer;\r\n outline: none;\r\n background-color: ${({ theme }) => theme.bg4};\r\n }\r\n :focus {\r\n cursor: pointer;\r\n outline: none;\r\n }\r\n\r\n svg {\r\n margin-top: 2px;\r\n }\r\n`\r\n\r\nconst StyledMenu = styled.div`\r\n margin-left: 0.5rem;\r\n display: flex;\r\n justify-content: center;\r\n align-items: center;\r\n position: relative;\r\n border: none;\r\n text-align: left;\r\n`\r\n\r\nexport interface ToggleProps {\r\n id?: string\r\n isActive: boolean\r\n toggle: () => void\r\n}\r\n\r\nexport default function Toggle({ toggle }: ToggleProps) {\r\n return (\r\n \r\n \r\n \r\n \r\n \r\n )\r\n}\r\n","import { Token } from '@levinswap/uniswap-sdk'\r\n\r\nexport async function addTokenToMetamask(ethereum: any, token: Token) {\r\n const IMAGE_URL =\r\n 'https://raw.githubusercontent.com/Levinswap/default-token-list/master/src/assets/xdai/0x71850b7E9Ee3f13Ab46d67167341E4bDc905Eef9/logo.png'\r\n try {\r\n await ethereum.request({\r\n method: 'wallet_watchAsset',\r\n params: {\r\n type: 'ERC20',\r\n options: {\r\n address: token.address,\r\n symbol: token.symbol ? token.symbol : '',\r\n decimals: token.decimals,\r\n image: IMAGE_URL\r\n }\r\n }\r\n })\r\n } catch (error) {\r\n console.log(error)\r\n }\r\n}\r\n","import { ChainId /*, TokenAmount */ } from '@levinswap/uniswap-sdk'\r\nimport React, { useCallback } from 'react'\r\nimport { Text } from 'rebass'\r\n\r\nimport styled from 'styled-components'\r\n\r\nimport Logo from '../../assets/svg/logo.png'\r\nimport LogoDark from '../../assets/svg/logo.png'\r\nimport { useActiveWeb3React } from '../../hooks'\r\nimport { useDarkModeManager } from '../../state/user/hooks'\r\nimport { useETHBalances /*, useAggregateUniBalance */ } from '../../state/wallet/hooks'\r\n// import { CardNoise } from '../earn/styled'\r\n// import { CountUp } from 'use-count-up'\r\n\r\nimport { YellowCard } from '../Card'\r\nimport Menu from '../Menu'\r\n\r\nimport Row, { RowFixed } from '../Row'\r\nimport Web3Status from '../Web3Status'\r\n// import ClaimModal from '../claim/ClaimModal'\r\n// import { useToggleSelfClaimModal, useShowClaimPopup } from '../../state/application/hooks'\r\n// import { useUserHasAvailableClaim } from '../../state/claim/hooks'\r\n// import { useUserHasSubmittedClaim } from '../../state/transactions/hooks'\r\n// import { Dots } from '../swap/styleds'\r\n// import Modal from '../Modal'\r\n// import usePrevious from '../../hooks/usePrevious'\r\n\r\nimport { RowBetween } from '../Row'\r\nimport Toggle from '../Toggle_'\r\nimport { LEVIN } from './../../constants/index'\r\nimport { addTokenToMetamask } from './../../utils/AddTokenToMetamask'\r\nimport Metamask from '../../assets/images/metamask.png'\r\n\r\ndeclare function showMtpModal(options: any): void;\r\n\r\nconst HeaderFrame = styled.div`\r\n display: grid;\r\n grid-template-columns: 1fr 120px;\r\n align-items: center;\r\n justify-content: space-between;\r\n align-items: center;\r\n flex-direction: row;\r\n width: 100%;\r\n top: 0;\r\n position: relative;\r\n border-bottom: 1px solid rgba(0, 0, 0, 0.1);\r\n padding: 1rem;\r\n z-index: 2;\r\n ${({ theme }) => theme.mediaWidth.upToMedium`\r\n grid-template-columns: 1fr;\r\n padding: 0 1rem;\r\n width: calc(100%);\r\n position: relative;\r\n `};\r\n\r\n ${({ theme }) => theme.mediaWidth.upToExtraSmall`\r\n padding: 0.5rem 1rem;\r\n `}\r\n`\r\n\r\nconst HeaderControls = styled.div`\r\n display: flex;\r\n flex-direction: row;\r\n align-items: center;\r\n justify-self: flex-end;\r\n\r\n ${({ theme }) => theme.mediaWidth.upToMedium`\r\n flex-direction: row;\r\n justify-content: space-between;\r\n justify-self: center;\r\n width: 100%;\r\n max-width: 960px;\r\n padding: 1rem;\r\n position: fixed;\r\n bottom: 0px;\r\n left: 0px;\r\n width: 100%;\r\n z-index: 99;\r\n height: 72px;\r\n border-radius: 5px;\r\n background-color: ${({ theme }) => theme.bg1};\r\n `};\r\n`\r\n\r\nconst HeaderElement = styled.div`\r\n display: flex;\r\n align-items: center;\r\n gap: 8px;\r\n\r\n ${({ theme }) => theme.mediaWidth.upToMedium`\r\n flex-direction: row-reverse;\r\n align-items: center;\r\n `};\r\n`\r\n\r\nconst HeaderElementWrap = styled.div`\r\n display: flex;\r\n align-items: center;\r\n`\r\n\r\nconst HeaderRow = styled(RowFixed)`\r\n ${({ theme }) => theme.mediaWidth.upToMedium`\r\n width: 100%;\r\n `};\r\n`\r\n\r\nconst HeaderLinks = styled(Row)`\r\n justify-content: center;\r\n ${({ theme }) => theme.mediaWidth.upToMedium`\r\n padding: 1rem 0 1rem 1rem;\r\n justify-content: flex-end;\r\n`};\r\n`\r\n\r\nconst AccountElement = styled.div<{ active: boolean }>`\r\n display: flex;\r\n flex-direction: row;\r\n align-items: center;\r\n background-color: ${({ theme, active }) => (!active ? theme.bg1 : theme.bg3)};\r\n border-radius: 5px;\r\n white-space: nowrap;\r\n width: 100%;\r\n cursor: pointer;\r\n\r\n :focus {\r\n border: 1px solid blue;\r\n }\r\n`\r\n\r\nconst Ramp = styled.div`\r\n display: flex;\r\n flex-direction: row;\r\n align-items: center;\r\n background-color: ${({ theme }) => theme.primary6};\r\n color: ${({ theme }) => theme.primary2};\r\n border: solid 1px transparent\r\n padding: 8px 12px;\r\n border-radius: 5px; \r\n white-space: nowrap;\r\n width: 100%;\r\n cursor: pointer;\r\n font-weight: 500;\r\n transition: 0.05s ease;\r\n\r\n :hover {\r\n border: 1px solid #463e53;\r\n }\r\n`\r\n\r\nconst LevinToken = styled.div` \r\n display: flex;\r\n flex-direction: row;\r\n align-items: center;\r\n background-color: ${({ theme }) => theme.primary6};\r\n color: ${({ theme }) => theme.primary2};\r\n border: solid 1px transparent\r\n padding: 8px 12px;\r\n border-radius: 5px; \r\n white-space: nowrap;\r\n width: 100%;\r\n cursor: pointer;\r\n font-weight: 500;\r\n transition: 0.05s ease;\r\n\r\n :hover {\r\n cursor: pointer;\r\n border: 1px solid #463e53;\r\n }\r\n`\r\n\r\n// const UNIAmount = styled(AccountElement)`\r\n// color: white;\r\n// padding: 4px 8px;\r\n// height: 36px;\r\n// font-weight: 500;\r\n// background-color: ${({ theme }) => theme.bg3};\r\n// background: radial-gradient(174.47% 188.91% at 1.84% 0%, #ff007a 0%, #2172e5 100%), #edeef2;\r\n// `\r\n\r\n// const UNIWrapper = styled.span`\r\n// width: fit-content;\r\n// position: relative;\r\n// cursor: pointer;\r\n\r\n// :hover {\r\n// opacity: 0.8;\r\n// }\r\n\r\n// :active {\r\n// opacity: 0.9;\r\n// }\r\n// `\r\n\r\nconst HideSmall = styled.span`\r\n ${({ theme }) => theme.mediaWidth.upToSmall`\r\n display: none;\r\n `};\r\n`\r\n\r\nconst NetworkCard = styled(YellowCard)`\r\n border-radius: 5px;\r\n padding: 9px 12px;\r\n ${({ theme }) => theme.mediaWidth.upToSmall`\r\n margin: 0;\r\n margin-right: 0.5rem;\r\n width: initial;\r\n overflow: hidden;\r\n text-overflow: ellipsis;\r\n flex-shrink: 1;\r\n cursor: pointer;\r\n `};\r\n`\r\n\r\nconst BalanceText = styled(Text)`\r\n ${({ theme }) => theme.mediaWidth.upToExtraSmall`\r\n display: none;\r\n `};\r\n`\r\n\r\nconst Title = styled.a`\r\n display: flex;\r\n align-items: center;\r\n pointer-events: auto;\r\n justify-self: flex-start;\r\n margin-right: 12px;\r\n ${({ theme }) => theme.mediaWidth.upToSmall`\r\n justify-self: center;\r\n `};\r\n :hover {\r\n cursor: pointer;\r\n }\r\n`\r\n\r\nconst UniIcon = styled.div`\r\n transition: transform 0.3s ease;\r\n :hover {\r\n transform: rotate(-5deg);\r\n }\r\n`\r\n\r\nconst NETWORK_LABELS: { [chainId in ChainId]?: string } = {\r\n [ChainId.RINKEBY]: 'Rinkeby',\r\n [ChainId.ROPSTEN]: 'Ropsten',\r\n [ChainId.GÖRLI]: 'Görli',\r\n [ChainId.XDAI]: 'xDai'\r\n}\r\n\r\nexport default function Header() {\r\n const { account, chainId } = useActiveWeb3React()\r\n\r\n const userEthBalance = useETHBalances(account ? [account] : [])?.[account ?? '']\r\n const [isDark] = useDarkModeManager()\r\n\r\n const { ethereum } = window\r\n const handleAddLvn = useCallback(() => addTokenToMetamask(ethereum, LEVIN), [ethereum])\r\n\r\n const loadMtp = () => {\r\n return new Promise((resolve, reject) => {\r\n const script = document.createElement(\"script\");\r\n script.src = \"https://widget.mtpelerin.com/mtp-widget.js\";\r\n script.async = true;\r\n \r\n script.onload = resolve; // Appelé lorsque le script est chargé\r\n script.onerror = reject; // Appelé en cas d'erreur de chargement du script\r\n \r\n document.body.appendChild(script);\r\n });\r\n }\r\n \r\n const startMtp = async () => {\r\n try {\r\n await loadMtp(); // Attend que le script soit chargé\r\n showMtpModal({\r\n lang: 'en',\r\n _ctkn: 'b2c16dab-0823-4447-b913-3e1cc1f60ab0',\r\n type: 'popup',\r\n tabs: 'buy,sell,swap',\r\n rfr: 'uogVuVxx',\r\n // net: 'xdai_mainnet',\r\n bsc: 'EUR',\r\n bdc: 'XDAI',\r\n ssc: 'XDAI',\r\n sdc: 'EUR',\r\n ssa: '100',\r\n wsc: 'XDAI',\r\n wsa: '100',\r\n wdc: 'USDC'\r\n });\r\n } catch (error) {\r\n console.error(\"Erreur lors du chargement du script MTP:\", error);\r\n }\r\n }\r\n\r\n // const toggleClaimModal = useToggleSelfClaimModal()\r\n\r\n // const availableClaim: boolean = useUserHasAvailableClaim(account)\r\n\r\n // const { claimTxn } = useUserHasSubmittedClaim(account ?? undefined)\r\n\r\n // const aggregateBalance: TokenAmount | undefined = useAggregateUniBalance()\r\n\r\n // const showClaimPopup = useShowClaimPopup()\r\n\r\n // const countUpValue = aggregateBalance?.toFixed(0) ?? '0'\r\n // const countUpValuePrevious = usePrevious(countUpValue) ?? '0'\r\n const [darkMode, toggleDarkMode] = useDarkModeManager()\r\n return (\r\n \r\n {/* */}\r\n {/* setShowUniBalanceModal(false)}>\r\n \r\n */}\r\n \r\n \r\n <UniIcon>\r\n <img width={'36px'} src={isDark ? LogoDark : Logo} alt=\"logo\" />\r\n </UniIcon>\r\n \r\n \r\n {/* \r\n UNI\r\n */}\r\n {/* \r\n Vote\r\n */}\r\n \r\n \r\n \r\n \r\n \r\n {chainId && NETWORK_LABELS[chainId] && (\r\n {NETWORK_LABELS[chainId]}\r\n )}\r\n \r\n window.open('https://farm.levinswap.realtoken.community', '_blank')}>\r\n \r\n 🌾\r\n {' '}\r\n Farm\r\n \r\n window.open('https://stake.levinswap.realtoken.community', '_blank')}>\r\n \r\n 🍸\r\n {' '}\r\n Stake\r\n \r\n \r\n \"Metamask\" Levin\r\n \r\n \r\n Buy xDai\r\n \r\n {/* {availableClaim && !showClaimPopup && (\r\n \r\n \r\n \r\n {claimTxn && !claimTxn?.receipt ? Claiming UNI : 'Claim UNI'}\r\n \r\n \r\n \r\n \r\n )} */}\r\n {/* {!availableClaim && aggregateBalance && (\r\n setShowUniBalanceModal(true)}>\r\n \r\n {account && (\r\n \r\n \r\n \r\n \r\n \r\n )}\r\n UNI\r\n \r\n \r\n \r\n )} */}\r\n \r\n {account && userEthBalance ? (\r\n \r\n {userEthBalance?.toSignificant(4)} {chainId === 100 ? 'XDAI' : 'ETH'}\r\n \r\n ) : null}\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n )\r\n}\r\n","import React, { useState, useEffect } from 'react'\nimport styled, { keyframes } from 'styled-components'\nimport { TYPE, ExternalLink } from '../../theme'\n\nimport { useBlockNumber } from '../../state/application/hooks'\nimport { getEtherscanLink } from '../../utils'\nimport { useActiveWeb3React } from '../../hooks'\n\nconst StyledPolling = styled.div`\n position: fixed;\n display: flex;\n right: 0;\n bottom: 0;\n padding: 1rem;\n color: white;\n transition: opacity 0.25s ease;\n color: ${({ theme }) => theme.green1};\n :hover {\n opacity: 1;\n }\n\n ${({ theme }) => theme.mediaWidth.upToMedium`\n display: none;\n `}\n`\nconst StyledPollingDot = styled.div`\n width: 8px;\n height: 8px;\n min-height: 8px;\n min-width: 8px;\n margin-left: 0.5rem;\n margin-top: 3px;\n border-radius: 50%;\n position: relative;\n background-color: ${({ theme }) => theme.green1};\n`\n\nconst rotate360 = keyframes`\n from {\n transform: rotate(0deg);\n }\n to {\n transform: rotate(360deg);\n }\n`\n\nconst Spinner = styled.div`\n animation: ${rotate360} 1s cubic-bezier(0.83, 0, 0.17, 1) infinite;\n transform: translateZ(0);\n\n border-top: 1px solid transparent;\n border-right: 1px solid transparent;\n border-bottom: 1px solid transparent;\n border-left: 2px solid ${({ theme }) => theme.green1};\n background: transparent;\n width: 14px;\n height: 14px;\n border-radius: 50%;\n position: relative;\n\n left: -3px;\n top: -3px;\n`\n\nexport default function Polling() {\n const { chainId } = useActiveWeb3React()\n\n const blockNumber = useBlockNumber()\n\n const [isMounted, setIsMounted] = useState(true)\n\n useEffect(\n () => {\n const timer1 = setTimeout(() => setIsMounted(true), 1000)\n\n // this will clear Timeout when component unmount like in willComponentUnmount\n return () => {\n setIsMounted(false)\n clearTimeout(timer1)\n }\n },\n [blockNumber] //useEffect will run only one time\n //if you pass a value to array, like this [data] than clearTimeout will run every time this value changes (useEffect re-run)\n )\n\n return (\n \n \n {blockNumber}\n {!isMounted && }\n \n \n )\n}\n","import React from 'react'\nimport styled from 'styled-components'\n\nimport { AlertTriangle, X } from 'react-feather'\nimport { useURLWarningToggle, useURLWarningVisible } from '../../state/user/hooks'\nimport { isMobile } from 'react-device-detect'\n\nconst PhishAlert = styled.div<{ isActive: any }>`\n width: 100%;\n padding: 6px 6px;\n background-color: ${({ theme }) => theme.blue1};\n color: white;\n font-size: 11px;\n justify-content: space-between;\n align-items: center;\n display: ${({ isActive }) => (isActive ? 'flex' : 'none')};\n`\n\nexport const StyledClose = styled(X)`\n :hover {\n cursor: pointer;\n }\n`\n\nexport default function URLWarning() {\n const toggleURLWarning = useURLWarningToggle()\n const showURLWarning = useURLWarningVisible()\n\n return isMobile ? (\n \n
\n Make sure the URL is\n app.levinswap.realtoken.community\n
\n \n
\n ) : window.location.hostname === 'app.levinswap.realtoken.community' ? (\n \n
\n Always make sure the URL is\n app.levinswap.realtoken.community - bookmark it\n to be safe.\n
\n \n
\n ) : null\n}\n","import styled from 'styled-components'\n\nconst Column = styled.div`\n display: flex;\n flex-direction: column;\n justify-content: flex-start;\n`\nexport const ColumnCenter = styled(Column)`\n width: 100%;\n align-items: center;\n`\n\nexport const AutoColumn = styled.div<{\n gap?: 'sm' | 'md' | 'lg' | string\n justify?: 'stretch' | 'center' | 'start' | 'end' | 'flex-start' | 'flex-end' | 'space-between'\n}>`\n display: grid;\n grid-auto-rows: auto;\n grid-row-gap: ${({ gap }) => (gap === 'sm' && '8px') || (gap === 'md' && '12px') || (gap === 'lg' && '24px') || gap};\n justify-items: ${({ justify }) => justify && justify};\n`\n\nexport default Column\n","import { ActionCreatorWithPayload, createAction } from '@reduxjs/toolkit'\r\nimport { TokenList, Version } from '@uniswap/token-lists'\r\n\r\nexport const fetchTokenList: Readonly<{\r\n pending: ActionCreatorWithPayload<{ url: string; requestId: string }>\r\n fulfilled: ActionCreatorWithPayload<{ url: string; tokenList: TokenList; requestId: string }>\r\n rejected: ActionCreatorWithPayload<{ url: string; errorMessage: string; requestId: string }>\r\n}> = {\r\n pending: createAction('lists/fetchTokenList/pending'),\r\n fulfilled: createAction('lists/fetchTokenList/fulfilled'),\r\n rejected: createAction('lists/fetchTokenList/rejected')\r\n}\r\n// add and remove from list options\r\nexport const addList = createAction('lists/addList')\r\nexport const removeList = createAction('lists/removeList')\r\n\r\n// select which lists to search across from loaded lists\r\nexport const enableList = createAction('lists/enableList')\r\nexport const disableList = createAction('lists/disableList')\r\n\r\n// versioning\r\nexport const acceptListUpdate = createAction('lists/acceptListUpdate')\r\nexport const rejectVersionUpdate = createAction('lists/rejectVersionUpdate')\r\n","import { Version } from '@uniswap/token-lists'\n\nexport default function listVersionLabel(version: Version): string {\n return `v${version.major}.${version.minor}.${version.patch}`\n}\n","import { diffTokenLists, TokenList } from '@uniswap/token-lists'\nimport React, { useCallback, useMemo } from 'react'\nimport ReactGA from 'react-ga'\nimport { useDispatch } from 'react-redux'\nimport { Text } from 'rebass'\nimport styled from 'styled-components'\nimport { AppDispatch } from '../../state'\nimport { useRemovePopup } from '../../state/application/hooks'\nimport { acceptListUpdate } from '../../state/lists/actions'\nimport { TYPE } from '../../theme'\nimport listVersionLabel from '../../utils/listVersionLabel'\nimport { ButtonSecondary } from '../Button'\nimport { AutoColumn } from '../Column'\nimport { AutoRow } from '../Row'\n\nexport const ChangesList = styled.ul`\n max-height: 400px;\n overflow: auto;\n`\n\nexport default function ListUpdatePopup({\n popKey,\n listUrl,\n oldList,\n newList,\n auto\n}: {\n popKey: string\n listUrl: string\n oldList: TokenList\n newList: TokenList\n auto: boolean\n}) {\n const removePopup = useRemovePopup()\n const removeThisPopup = useCallback(() => removePopup(popKey), [popKey, removePopup])\n const dispatch = useDispatch()\n\n const handleAcceptUpdate = useCallback(() => {\n if (auto) return\n ReactGA.event({\n category: 'Lists',\n action: 'Update List from Popup',\n label: listUrl\n })\n dispatch(acceptListUpdate(listUrl))\n removeThisPopup()\n }, [auto, dispatch, listUrl, removeThisPopup])\n\n const { added: tokensAdded, changed: tokensChanged, removed: tokensRemoved } = useMemo(() => {\n return diffTokenLists(oldList.tokens, newList.tokens)\n }, [newList.tokens, oldList.tokens])\n const numTokensChanged = useMemo(\n () =>\n Object.keys(tokensChanged).reduce((memo, chainId: any) => memo + Object.keys(tokensChanged[chainId]).length, 0),\n [tokensChanged]\n )\n\n return (\n \n \n {auto ? (\n \n The token list "{oldList.name}" has been updated to{' '}\n {listVersionLabel(newList.version)}.\n \n ) : (\n <>\n
\n \n An update is available for the token list "{oldList.name}" (\n {listVersionLabel(oldList.version)} to {listVersionLabel(newList.version)}).\n \n \n {tokensAdded.length > 0 ? (\n
  • \n {tokensAdded.map((token, i) => (\n \n {token.symbol}\n {i === tokensAdded.length - 1 ? null : ', '}\n \n ))}{' '}\n added\n
  • \n ) : null}\n {tokensRemoved.length > 0 ? (\n
  • \n {tokensRemoved.map((token, i) => (\n \n {token.symbol}\n {i === tokensRemoved.length - 1 ? null : ', '}\n \n ))}{' '}\n removed\n
  • \n ) : null}\n {numTokensChanged > 0 ?
  • {numTokensChanged} tokens updated
  • : null}\n
    \n
    \n \n
    \n Accept update\n
    \n
    \n Dismiss\n
    \n
    \n \n )}\n
    \n
    \n )\n}\n","import React, { useContext } from 'react'\nimport { AlertCircle, CheckCircle } from 'react-feather'\nimport styled, { ThemeContext } from 'styled-components'\nimport { useActiveWeb3React } from '../../hooks'\nimport { TYPE } from '../../theme'\nimport { ExternalLink } from '../../theme/components'\nimport { getEtherscanLink } from '../../utils'\nimport { AutoColumn } from '../Column'\nimport { AutoRow } from '../Row'\n\nconst RowNoFlex = styled(AutoRow)`\n flex-wrap: nowrap;\n`\n\nexport default function TransactionPopup({\n hash,\n success,\n summary\n}: {\n hash: string\n success?: boolean\n summary?: string\n}) {\n const { chainId } = useActiveWeb3React()\n\n const theme = useContext(ThemeContext)\n\n return (\n \n
    \n {success ? : }\n
    \n \n {summary ?? 'Hash: ' + hash.slice(0, 8) + '...' + hash.slice(58, 65)}\n {chainId && (\n View on Blockscout\n )}\n \n
    \n )\n}\n","import React, { useCallback, useContext, useEffect } from 'react'\nimport { X } from 'react-feather'\nimport { useSpring } from 'react-spring/web'\nimport styled, { ThemeContext } from 'styled-components'\nimport { animated } from 'react-spring'\nimport { PopupContent } from '../../state/application/actions'\nimport { useRemovePopup } from '../../state/application/hooks'\nimport ListUpdatePopup from './ListUpdatePopup'\nimport TransactionPopup from './TransactionPopup'\n\nexport const StyledClose = styled(X)`\n position: absolute;\n right: 10px;\n top: 10px;\n\n :hover {\n cursor: pointer;\n }\n`\nexport const Popup = styled.div`\n display: inline-block;\n width: 100%;\n padding: 1em;\n background-color: ${({ theme }) => theme.bg1};\n position: relative;\n border-radius: 10px;\n padding: 20px;\n padding-right: 35px;\n overflow: hidden;\n\n ${({ theme }) => theme.mediaWidth.upToSmall`\n min-width: 290px;\n &:not(:last-of-type) {\n margin-right: 20px;\n }\n `}\n`\nconst Fader = styled.div`\n position: absolute;\n bottom: 0px;\n left: 0px;\n width: 100%;\n height: 2px;\n background-color: ${({ theme }) => theme.bg3};\n`\n\nconst AnimatedFader = animated(Fader)\n\nexport default function PopupItem({\n removeAfterMs,\n content,\n popKey\n}: {\n removeAfterMs: number | null\n content: PopupContent\n popKey: string\n}) {\n const removePopup = useRemovePopup()\n const removeThisPopup = useCallback(() => removePopup(popKey), [popKey, removePopup])\n useEffect(() => {\n if (removeAfterMs === null) return undefined\n\n const timeout = setTimeout(() => {\n removeThisPopup()\n }, removeAfterMs)\n\n return () => {\n clearTimeout(timeout)\n }\n }, [removeAfterMs, removeThisPopup])\n\n const theme = useContext(ThemeContext)\n\n let popupContent\n if ('txn' in content) {\n const {\n txn: { hash, success, summary }\n } = content\n popupContent = \n } else if ('listUpdate' in content) {\n const {\n listUpdate: { listUrl, oldList, newList, auto }\n } = content\n popupContent = \n }\n\n const faderStyle = useSpring({\n from: { width: '100%' },\n to: { width: '0%' },\n config: { duration: removeAfterMs ?? undefined }\n })\n\n return (\n \n \n {popupContent}\n {removeAfterMs !== null ? : null}\n \n )\n}\n","import React from 'react'\nimport styled from 'styled-components'\nimport { useActivePopups } from '../../state/application/hooks'\nimport { AutoColumn } from '../Column'\nimport PopupItem from './PopupItem'\n// import ClaimPopup from './ClaimPopup'\nimport { useURLWarningVisible } from '../../state/user/hooks'\n\nconst MobilePopupWrapper = styled.div<{ height: string | number }>`\n position: relative;\n max-width: 100%;\n height: ${({ height }) => height};\n margin: ${({ height }) => (height ? '0 auto;' : 0)};\n margin-bottom: ${({ height }) => (height ? '20px' : 0)}};\n\n display: none;\n ${({ theme }) => theme.mediaWidth.upToSmall`\n display: block;\n `};\n`\n\nconst MobilePopupInner = styled.div`\n height: 99%;\n overflow-x: auto;\n overflow-y: hidden;\n display: flex;\n flex-direction: row;\n -webkit-overflow-scrolling: touch;\n ::-webkit-scrollbar {\n display: none;\n }\n`\n\nconst FixedPopupColumn = styled(AutoColumn)<{ extraPadding: boolean }>`\n position: fixed;\n top: ${({ extraPadding }) => (extraPadding ? '108px' : '88px')};\n right: 1rem;\n max-width: 355px !important;\n width: 100%;\n z-index: 3;\n\n ${({ theme }) => theme.mediaWidth.upToSmall`\n display: none;\n `};\n`\n\nexport default function Popups() {\n // get all popups\n const activePopups = useActivePopups()\n\n const urlWarningActive = useURLWarningVisible()\n\n return (\n <>\n \n {/* */}\n {activePopups.map(item => (\n \n ))}\n \n 0 ? 'fit-content' : 0}>\n \n {activePopups // reverse so new items up front\n .slice(0)\n .reverse()\n .map(item => (\n \n ))}\n \n \n \n )\n}\n","import React, { useState, useEffect } from 'react'\nimport { useWeb3React } from '@web3-react/core'\nimport styled from 'styled-components'\nimport { useTranslation } from 'react-i18next'\n\nimport { network } from '../../connectors'\nimport { useEagerConnect, useInactiveListener } from '../../hooks'\nimport { NetworkContextName } from '../../constants'\nimport Loader from '../Loader'\n\nconst MessageWrapper = styled.div`\n display: flex;\n align-items: center;\n justify-content: center;\n height: 20rem;\n`\n\nconst Message = styled.h2`\n color: ${({ theme }) => theme.secondary1};\n`\n\nexport default function Web3ReactManager({ children }: { children: JSX.Element }) {\n const { t } = useTranslation()\n const { active } = useWeb3React()\n const { active: networkActive, error: networkError, activate: activateNetwork } = useWeb3React(NetworkContextName)\n\n // try to eagerly connect to an injected provider, if it exists and has granted access already\n const triedEager = useEagerConnect()\n\n // after eagerly trying injected, if the network connect ever isn't active or in an error state, activate itd\n useEffect(() => {\n if (triedEager && !networkActive && !networkError && !active) {\n activateNetwork(network)\n }\n }, [triedEager, networkActive, networkError, activateNetwork, active])\n\n // when there's no account connected, react to logins (broadly speaking) on the injected provider, if it exists\n useInactiveListener(!triedEager)\n\n // handle delayed loader state\n const [showLoader, setShowLoader] = useState(false)\n useEffect(() => {\n const timeout = setTimeout(() => {\n setShowLoader(true)\n }, 600)\n\n return () => {\n clearTimeout(timeout)\n }\n }, [])\n\n // on page load, do nothing until we've tried to connect to the injected connector\n if (!triedEager) {\n return null\n }\n\n // if the account context isn't active, and there's an error on the network context, it's an irrecoverable error\n if (!active && networkError) {\n return (\n \n {t('unknownError')}\n \n )\n }\n\n // if neither context is active, spin\n if (!active && !networkActive) {\n return showLoader ? (\n \n \n \n ) : null\n }\n\n return children\n}\n","import { useEffect } from 'react'\nimport { useDispatch } from 'react-redux'\nimport { RouteComponentProps } from 'react-router-dom'\nimport { parse } from 'qs'\nimport { AppDispatch } from '../state'\nimport { updateUserDarkMode } from '../state/user/actions'\n\nexport default function DarkModeQueryParamReader({ location: { search } }: RouteComponentProps): null {\n const dispatch = useDispatch()\n\n useEffect(() => {\n if (!search) return\n if (search.length < 2) return\n\n const parsed = parse(search, {\n parseArrays: false,\n ignoreQueryPrefix: true\n })\n\n const theme = parsed.theme\n\n if (typeof theme !== 'string') return\n\n if (theme.toLowerCase() === 'light') {\n dispatch(updateUserDarkMode({ userDarkMode: false }))\n } else if (theme.toLowerCase() === 'dark') {\n dispatch(updateUserDarkMode({ userDarkMode: true }))\n }\n }, [dispatch, search])\n\n return null\n}\n","import { ChainId, Currency, CurrencyAmount, ETHER, Token, TokenAmount, WETH } from '@levinswap/uniswap-sdk'\n\nexport function wrappedCurrency(currency: Currency | undefined, chainId: ChainId | undefined): Token | undefined {\n return chainId && currency === ETHER ? WETH[chainId] : currency instanceof Token ? currency : undefined\n}\n\nexport function wrappedCurrencyAmount(\n currencyAmount: CurrencyAmount | undefined,\n chainId: ChainId | undefined\n): TokenAmount | undefined {\n const token = currencyAmount && chainId ? wrappedCurrency(currencyAmount.currency, chainId) : undefined\n return token && currencyAmount ? new TokenAmount(token, currencyAmount.raw) : undefined\n}\n\nexport function unwrappedToken(token: Token): Currency {\n if (token.equals(WETH[token.chainId])) return ETHER\n return token\n}\n","import { ChainId, Currency } from '@levinswap/uniswap-sdk'\nimport React, { useContext } from 'react'\nimport styled, { ThemeContext } from 'styled-components'\nimport Modal from '../Modal'\nimport { ExternalLink } from '../../theme'\nimport { Text } from 'rebass'\nimport { CloseIcon, CustomLightSpinner } from '../../theme/components'\nimport { RowBetween, RowFixed } from '../Row'\nimport { AlertTriangle, ArrowUpCircle, CheckCircle } from 'react-feather'\nimport { ButtonPrimary, ButtonLight } from '../Button'\nimport { AutoColumn, ColumnCenter } from '../Column'\nimport { useActiveWeb3React } from '../../hooks'\nimport useAddTokenToMetamask from 'hooks/useAddTokenToMetamask'\nimport Circle from '../../assets/images/blue-loader.svg'\nimport { getEtherscanLink } from '../../utils'\nimport MetaMaskLogo from '../../assets/images/metamask.png'\n\nconst Wrapper = styled.div`\n width: 100%;\n`\nconst Section = styled(AutoColumn)`\n padding: 24px;\n`\n\nconst BottomSection = styled(Section)`\n background-color: ${({ theme }) => theme.bg2};\n border-bottom-left-radius: 20px;\n border-bottom-right-radius: 20px;\n`\n\nconst ConfirmedIcon = styled(ColumnCenter)`\n padding: 60px 0;\n`\n\nconst StyledLogo = styled.img`\n height: 16px;\n width: 16px;\n margin-left: 6px;\n`\n\nfunction ConfirmationPendingContent({ onDismiss, pendingText }: { onDismiss: () => void; pendingText: string }) {\n return (\n \n
    \n \n
    \n \n \n \n \n \n \n \n Waiting For Confirmation\n \n \n \n {pendingText}\n \n \n \n Confirm this transaction in your wallet\n \n \n
    \n
    \n )\n}\n\nfunction TransactionSubmittedContent({\n onDismiss,\n chainId,\n hash,\n currencyToAdd\n}: {\n onDismiss: () => void\n hash: string | undefined\n chainId: ChainId\n currencyToAdd?: Currency | undefined\n}) {\n const theme = useContext(ThemeContext)\n\n const { library } = useActiveWeb3React()\n\n const { addToken, success } = useAddTokenToMetamask(currencyToAdd)\n\n return (\n \n
    \n \n
    \n \n \n \n \n \n \n \n Transaction Submitted\n \n {chainId && hash && (\n \n \n View on Blockscout\n \n \n )}\n {currencyToAdd && library?.provider?.isMetaMask && (\n \n {!success ? (\n \n Add {currencyToAdd.symbol} to Metamask \n \n ) : (\n \n Added {currencyToAdd.symbol}{' '}\n \n \n )}\n \n )}\n \n \n Close\n \n \n \n
    \n
    \n )\n}\n\nexport function ConfirmationModalContent({\n title,\n bottomContent,\n onDismiss,\n topContent\n}: {\n title: string\n onDismiss: () => void\n topContent: () => React.ReactNode\n bottomContent: () => React.ReactNode\n}) {\n return (\n \n
    \n \n \n {title}\n \n \n \n {topContent()}\n
    \n {bottomContent()}\n
    \n )\n}\n\nexport function TransactionErrorContent({ message, onDismiss }: { message: string; onDismiss: () => void }) {\n const theme = useContext(ThemeContext)\n return (\n \n
    \n \n \n Error\n \n \n \n \n \n \n {message}\n \n \n
    \n \n Dismiss\n \n
    \n )\n}\n\ninterface ConfirmationModalProps {\n isOpen: boolean\n onDismiss: () => void\n hash: string | undefined\n content: () => React.ReactNode\n attemptingTxn: boolean\n pendingText: string\n currencyToAdd?: Currency | undefined\n}\n\nexport default function TransactionConfirmationModal({\n isOpen,\n onDismiss,\n attemptingTxn,\n hash,\n pendingText,\n content,\n currencyToAdd\n}: ConfirmationModalProps) {\n const { chainId } = useActiveWeb3React()\n\n if (!chainId) return null\n\n // confirmation screen\n return (\n \n {attemptingTxn ? (\n \n ) : hash ? (\n \n ) : (\n content()\n )}\n \n )\n}\n","import { wrappedCurrency } from 'utils/wrappedCurrency'\nimport { Currency, Token } from '@levinswap/uniswap-sdk'\nimport { useCallback, useState } from 'react'\nimport { useActiveWeb3React } from 'hooks'\n\nexport default function useAddTokenToMetamask(\n currencyToAdd: Currency | undefined\n): { addToken: () => void; success: boolean | undefined } {\n const { library, chainId } = useActiveWeb3React()\n\n const token: Token | undefined = wrappedCurrency(currencyToAdd, chainId)\n\n const [success, setSuccess] = useState()\n\n const addToken = useCallback(() => {\n if (library && library.provider.isMetaMask && library.provider.request && token) {\n library.provider\n .request({\n method: 'wallet_watchAsset',\n params: {\n // eslint-disable-next-line @typescript-eslint/ban-ts-ignore\n //@ts-ignore // need this for incorrect ethers provider type\n type: 'ERC20',\n options: {\n address: token.address,\n symbol: token.symbol,\n decimals: token.decimals\n }\n }\n })\n .then(success => {\n setSuccess(success)\n })\n .catch(() => setSuccess(false))\n } else {\n setSuccess(false)\n }\n }, [library, token])\n\n return { addToken, success }\n}\n","import { useEffect, useState } from 'react'\n\n/**\n * Returns the last value of type T that passes a filter function\n * @param value changing value\n * @param filterFn function that determines whether a given value should be considered for the last value\n */\nexport default function useLast(\n value: T | undefined | null,\n filterFn?: (value: T | null | undefined) => boolean\n): T | null | undefined {\n const [last, setLast] = useState(filterFn && filterFn(value) ? value : undefined)\n useEffect(() => {\n setLast(last => {\n const shouldUse: boolean = filterFn ? filterFn(value) : true\n if (shouldUse) return value\n return last\n })\n }, [filterFn, value])\n return last\n}\n\nfunction isDefined(x: T | null | undefined): x is T {\n return x !== null && x !== undefined\n}\n\n/**\n * Returns the last truthy value of type T\n * @param value changing value\n */\nexport function useLastTruthy(value: T | undefined | null): T | null | undefined {\n return useLast(value, isDefined)\n}\n","import { useEffect, useRef } from 'react'\n\nexport default function useInterval(callback: () => void, delay: null | number, leading = true) {\n const savedCallback = useRef<() => void>()\n\n // Remember the latest callback.\n useEffect(() => {\n savedCallback.current = callback\n }, [callback])\n\n // Set up the interval.\n useEffect(() => {\n function tick() {\n const current = savedCallback.current\n current && current()\n }\n\n if (delay !== null) {\n if (leading) tick()\n const id = setInterval(tick, delay)\n return () => clearInterval(id)\n }\n return undefined\n }, [delay, leading])\n}\n","import { Placement } from '@popperjs/core'\r\nimport { transparentize } from 'polished'\r\nimport React, { useCallback, useState } from 'react'\r\nimport { usePopper } from 'react-popper'\r\nimport styled from 'styled-components'\r\nimport useInterval from '../../hooks/useInterval'\r\nimport Portal from '@reach/portal'\r\n\r\nconst PopoverContainer = styled.div<{ show: boolean }>`\r\n z-index: 9999;\r\n\r\n visibility: ${props => (props.show ? 'visible' : 'hidden')};\r\n opacity: ${props => (props.show ? 1 : 0)};\r\n transition: visibility 150ms linear, opacity 150ms linear;\r\n\r\n background: ${({ theme }) => theme.bg2};\r\n border: 1px solid ${({ theme }) => theme.bg3};\r\n box-shadow: 0 4px 8px 0 ${({ theme }) => transparentize(0.9, theme.shadow1)};\r\n color: ${({ theme }) => theme.text2};\r\n border-radius: 5px;\r\n`\r\n\r\nconst ReferenceElement = styled.div`\r\n display: inline-block;\r\n`\r\n\r\nconst Arrow = styled.div`\r\n width: 8px;\r\n height: 8px;\r\n z-index: 9998;\r\n\r\n ::before {\r\n position: absolute;\r\n width: 8px;\r\n height: 8px;\r\n z-index: 9998;\r\n\r\n content: '';\r\n border: 1px solid ${({ theme }) => theme.bg3};\r\n transform: rotate(45deg);\r\n background: ${({ theme }) => theme.bg2};\r\n }\r\n\r\n &.arrow-top {\r\n bottom: -5px;\r\n ::before {\r\n border-top: none;\r\n border-left: none;\r\n }\r\n }\r\n\r\n &.arrow-bottom {\r\n top: -5px;\r\n ::before {\r\n border-bottom: none;\r\n border-right: none;\r\n }\r\n }\r\n\r\n &.arrow-left {\r\n right: -5px;\r\n\r\n ::before {\r\n border-bottom: none;\r\n border-left: none;\r\n }\r\n }\r\n\r\n &.arrow-right {\r\n left: -5px;\r\n ::before {\r\n border-right: none;\r\n border-top: none;\r\n }\r\n }\r\n`\r\n\r\nexport interface PopoverProps {\r\n content: React.ReactNode\r\n show: boolean\r\n children: React.ReactNode\r\n placement?: Placement\r\n}\r\n\r\nexport default function Popover({ content, show, children, placement = 'auto' }: PopoverProps) {\r\n const [referenceElement, setReferenceElement] = useState(null)\r\n const [popperElement, setPopperElement] = useState(null)\r\n const [arrowElement, setArrowElement] = useState(null)\r\n const { styles, update, attributes } = usePopper(referenceElement, popperElement, {\r\n placement,\r\n strategy: 'fixed',\r\n modifiers: [\r\n { name: 'offset', options: { offset: [8, 8] } },\r\n { name: 'arrow', options: { element: arrowElement } }\r\n ]\r\n })\r\n const updateCallback = useCallback(() => {\r\n update && update()\r\n }, [update])\r\n useInterval(updateCallback, show ? 100 : null)\r\n\r\n return (\r\n <>\r\n {children}\r\n \r\n \r\n {content}\r\n \r\n \r\n \r\n \r\n )\r\n}\r\n","import React, { useCallback, useState } from 'react'\nimport styled from 'styled-components'\nimport Popover, { PopoverProps } from '../Popover'\n\nconst TooltipContainer = styled.div`\n width: 228px;\n padding: 0.6rem 1rem;\n line-height: 150%;\n font-weight: 400;\n`\n\ninterface TooltipProps extends Omit {\n text: string\n}\n\nexport default function Tooltip({ text, ...rest }: TooltipProps) {\n return {text}} {...rest} />\n}\n\nexport function MouseoverTooltip({ children, ...rest }: Omit) {\n const [show, setShow] = useState(false)\n const open = useCallback(() => setShow(true), [setShow])\n const close = useCallback(() => setShow(false), [setShow])\n return (\n \n
    \n {children}\n
    \n
    \n )\n}\n","import React, { useCallback, useState } from 'react'\r\nimport { HelpCircle as Question } from 'react-feather'\r\nimport styled from 'styled-components'\r\nimport Tooltip from '../Tooltip'\r\n\r\nconst QuestionWrapper = styled.div`\r\n display: flex;\r\n align-items: center;\r\n justify-content: center;\r\n padding: 0.2rem;\r\n border: none;\r\n background: none;\r\n outline: none;\r\n cursor: default;\r\n border-radius: 36px;\r\n background-color: ${({ theme }) => theme.bg2};\r\n color: ${({ theme }) => theme.text2};\r\n\r\n :hover,\r\n :focus {\r\n opacity: 0.7;\r\n }\r\n`\r\n\r\nconst LightQuestionWrapper = styled.div`\r\n display: flex;\r\n align-items: center;\r\n justify-content: center;\r\n padding: 0.2rem;\r\n border: none;\r\n background: none;\r\n outline: none;\r\n cursor: default;\r\n border-radius: 36px;\r\n width: 24px;\r\n height: 24px;\r\n background-color: rgba(255, 255, 255, 0.1);\r\n color: ${({ theme }) => theme.white};\r\n\r\n :hover,\r\n :focus {\r\n opacity: 0.7;\r\n }\r\n`\r\n\r\nconst QuestionMark = styled.span`\r\n font-size: 1rem;\r\n`\r\n\r\nexport default function QuestionHelper({ text }: { text: string }) {\r\n const [show, setShow] = useState(false)\r\n\r\n const open = useCallback(() => setShow(true), [setShow])\r\n const close = useCallback(() => setShow(false), [setShow])\r\n\r\n return (\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n )\r\n}\r\n\r\nexport function LightQuestionHelper({ text }: { text: string }) {\r\n const [show, setShow] = useState(false)\r\n\r\n const open = useCallback(() => setShow(true), [setShow])\r\n const close = useCallback(() => setShow(false), [setShow])\r\n\r\n return (\r\n \r\n \r\n \r\n ?\r\n \r\n \r\n \r\n )\r\n}\r\n","import CID from 'cids'\nimport { getCodec, rmPrefix } from 'multicodec'\nimport { decode, toB58String } from 'multihashes'\n\nexport function hexToUint8Array(hex: string): Uint8Array {\n hex = hex.startsWith('0x') ? hex.substr(2) : hex\n if (hex.length % 2 !== 0) throw new Error('hex must have length that is multiple of 2')\n const arr = new Uint8Array(hex.length / 2)\n for (let i = 0; i < arr.length; i++) {\n arr[i] = parseInt(hex.substr(i * 2, 2), 16)\n }\n return arr\n}\n\nconst UTF_8_DECODER = new TextDecoder()\n\n/**\n * Returns the URI representation of the content hash for supported codecs\n * @param contenthash to decode\n */\nexport default function contenthashToUri(contenthash: string): string {\n const buff = hexToUint8Array(contenthash)\n const codec = getCodec(buff as Buffer) // the typing is wrong for @types/multicodec\n switch (codec) {\n case 'ipfs-ns': {\n const data = rmPrefix(buff as Buffer)\n const cid = new CID(data)\n return `ipfs://${toB58String(cid.multihash)}`\n }\n case 'ipns-ns': {\n const data = rmPrefix(buff as Buffer)\n const cid = new CID(data)\n const multihash = decode(cid.multihash)\n if (multihash.name === 'identity') {\n return `ipns://${UTF_8_DECODER.decode(multihash.digest).trim()}`\n } else {\n return `ipns://${toB58String(cid.multihash)}`\n }\n }\n default:\n throw new Error(`Unrecognized codec: ${codec}`)\n }\n}\n","const ENS_NAME_REGEX = /^(([a-zA-Z0-9]+(-[a-zA-Z0-9]+)*\\.)+)eth(\\/.*)?$/\n\nexport function parseENSAddress(ensAddress: string): { ensName: string; ensPath: string | undefined } | undefined {\n const match = ensAddress.match(ENS_NAME_REGEX)\n if (!match) return undefined\n return { ensName: `${match[1].toLowerCase()}eth`, ensPath: match[4] }\n}\n","/**\n * Given a URI that may be ipfs, ipns, http, or https protocol, return the fetch-able http(s) URLs for the same content\n * @param uri to convert to fetch-able http url\n */\nexport default function uriToHttp(uri: string): string[] {\n const protocol = uri.split(':')[0].toLowerCase()\n switch (protocol) {\n case 'https':\n return [uri]\n case 'http':\n return ['https' + uri.substr(4), uri]\n case 'ipfs':\n const hash = uri.match(/^ipfs:(\\/\\/)?(.*)$/i)?.[2]\n return [`https://cloudflare-ipfs.com/ipfs/${hash}/`, `https://ipfs.io/ipfs/${hash}/`]\n case 'ipns':\n const name = uri.match(/^ipns:(\\/\\/)?(.*)$/i)?.[2]\n return [`https://cloudflare-ipfs.com/ipns/${name}/`, `https://ipfs.io/ipns/${name}/`]\n default:\n return []\n }\n}\n","import { useMemo } from 'react'\nimport contenthashToUri from '../utils/contenthashToUri'\nimport { parseENSAddress } from '../utils/parseENSAddress'\nimport uriToHttp from '../utils/uriToHttp'\nimport useENSContentHash from './useENSContentHash'\n\nexport default function useHttpLocations(uri: string | undefined): string[] {\n const ens = useMemo(() => (uri ? parseENSAddress(uri) : undefined), [uri])\n const resolvedContentHash = useENSContentHash(ens?.ensName)\n return useMemo(() => {\n if (ens) {\n return resolvedContentHash.contenthash ? uriToHttp(contenthashToUri(resolvedContentHash.contenthash)) : []\n } else {\n return uri ? uriToHttp(uri) : []\n }\n }, [ens, resolvedContentHash.contenthash, uri])\n}\n","import { namehash } from 'ethers/lib/utils'\nimport { useMemo } from 'react'\nimport { useSingleCallResult } from '../state/multicall/hooks'\nimport isZero from '../utils/isZero'\nimport { useENSRegistrarContract, useENSResolverContract } from './useContract'\n\n/**\n * Does a lookup for an ENS name to find its contenthash.\n */\nexport default function useENSContentHash(ensName?: string | null): { loading: boolean; contenthash: string | null } {\n const ensNodeArgument = useMemo(() => {\n if (!ensName) return [undefined]\n try {\n return ensName ? [namehash(ensName)] : [undefined]\n } catch (error) {\n return [undefined]\n }\n }, [ensName])\n const registrarContract = useENSRegistrarContract(false)\n const resolverAddressResult = useSingleCallResult(registrarContract, 'resolver', ensNodeArgument)\n const resolverAddress = resolverAddressResult.result?.[0]\n const resolverContract = useENSResolverContract(\n resolverAddress && isZero(resolverAddress) ? undefined : resolverAddress,\n false\n )\n const contenthash = useSingleCallResult(resolverContract, 'contenthash', ensNodeArgument)\n\n return {\n contenthash: contenthash.result?.[0] ?? null,\n loading: resolverAddressResult.loading || contenthash.loading\n }\n}\n","import React, { useState } from 'react'\nimport { HelpCircle } from 'react-feather'\nimport { ImageProps } from 'rebass'\n\nconst BAD_SRCS: { [tokenAddress: string]: true } = {}\n\nexport interface LogoProps extends Pick {\n srcs: string[]\n}\n\n/**\n * Renders an image by sequentially trying a list of URIs, and then eventually a fallback triangle alert\n */\nexport default function Logo({ srcs, alt, ...rest }: LogoProps) {\n const [, refresh] = useState(0)\n\n const src: string | undefined = srcs.find(src => !BAD_SRCS[src])\n\n if (src) {\n return (\n {\n if (src) BAD_SRCS[src] = true\n refresh(i => i + 1)\n }}\n />\n )\n }\n\n return \n}\n","import { Currency, ETHER as xDai, WETH, ChainId, Token } from '@levinswap/uniswap-sdk'\r\nimport React, { useMemo } from 'react'\r\nimport styled from 'styled-components'\r\n\r\nimport xDaiLogo from '../../assets/images/xdai-logo.png'\r\nimport useHttpLocations from '../../hooks/useHttpLocations'\r\nimport { WrappedTokenInfo } from '../../state/lists/hooks'\r\nimport Logo from '../Logo'\r\n\r\nexport const getTokenLogoURL = (address: string) =>\r\n `./images/tokens/${address}.png`\r\n\r\nconst StyledxDaiLogo = styled.img<{ size: string }>`\r\n width: ${({ size }) => size};\r\n height: ${({ size }) => size};\r\n box-shadow: 0px 6px 10px rgba(0, 0, 0, 0.075);\r\n border-radius: 24px;\r\n`\r\n\r\nconst StyledLogo = styled(Logo)<{ size: string }>`\r\n width: ${({ size }) => size};\r\n height: ${({ size }) => size};\r\n border-radius: ${({ size }) => size};\r\n box-shadow: 0px 6px 10px rgba(0, 0, 0, 0.075);\r\n`\r\n\r\nexport default function CurrencyLogo({\r\n currency,\r\n size = '24px',\r\n style\r\n}: {\r\n currency?: Currency\r\n size?: string\r\n style?: React.CSSProperties\r\n}) {\r\n const uriLocations = useHttpLocations(currency instanceof WrappedTokenInfo ? currency.logoURI : undefined)\r\n\r\n const srcs: string[] = useMemo(() => {\r\n if (currency === xDai || currency === WETH[ChainId.XDAI]) return []\r\n\r\n if (currency instanceof Token) {\r\n if (currency instanceof WrappedTokenInfo) {\r\n return [...uriLocations, getTokenLogoURL(currency.address)]\r\n }\r\n\r\n return [getTokenLogoURL(currency.address)]\r\n }\r\n return []\r\n }, [currency, uriLocations])\r\n\r\n if (currency === xDai || currency === WETH[ChainId.XDAI]) {\r\n return \r\n }\r\n\r\n return \r\n}\r\n","import React from 'react'\r\nimport { Text } from 'rebass'\r\nimport { ChainId, Currency, currencyEquals, ETHER, Token } from '@levinswap/uniswap-sdk'\r\nimport styled from 'styled-components'\r\n\r\nimport { SUGGESTED_BASES } from '../../constants'\r\nimport { AutoColumn } from '../Column'\r\nimport QuestionHelper from '../QuestionHelper'\r\nimport { AutoRow } from '../Row'\r\nimport CurrencyLogo from '../CurrencyLogo'\r\n\r\nconst BaseWrapper = styled.div<{ disable?: boolean }>`\r\n border: 1px solid ${({ theme, disable }) => (disable ? 'transparent' : theme.bg3)};\r\n border-radius: 10px;\r\n display: flex;\r\n padding: 6px;\r\n\r\n align-items: center;\r\n :hover {\r\n cursor: ${({ disable }) => !disable && 'pointer'};\r\n background-color: ${({ theme, disable }) => !disable && theme.bg2};\r\n }\r\n\r\n background-color: ${({ theme, disable }) => disable && theme.bg3};\r\n opacity: ${({ disable }) => disable && '0.4'};\r\n`\r\n\r\nexport default function CommonBases({\r\n chainId,\r\n onSelect,\r\n selectedCurrency\r\n}: {\r\n chainId?: ChainId\r\n selectedCurrency?: Currency | null\r\n onSelect: (currency: Currency) => void\r\n}) {\r\n return (\r\n \r\n \r\n \r\n Common bases\r\n \r\n \r\n \r\n \r\n {\r\n if (!selectedCurrency || !currencyEquals(selectedCurrency, ETHER)) {\r\n onSelect(ETHER)\r\n }\r\n }}\r\n disable={selectedCurrency === ETHER}\r\n >\r\n \r\n \r\n XDAI\r\n \r\n \r\n {(chainId ? SUGGESTED_BASES[chainId] : []).map((token: Token) => {\r\n const selected = selectedCurrency instanceof Token && selectedCurrency.address === token.address\r\n return (\r\n !selected && onSelect(token)} disable={selected} key={token.address}>\r\n \r\n \r\n {token.symbol}\r\n \r\n \r\n )\r\n })}\r\n \r\n \r\n )\r\n}\r\n","import styled from 'styled-components'\r\nimport { AutoColumn } from '../Column'\r\nimport { RowBetween, RowFixed } from '../Row'\r\n\r\nexport const ModalInfo = styled.div`\r\n ${({ theme }) => theme.flexRowNoWrap}\r\n align-items: center;\r\n padding: 1rem 1rem;\r\n margin: 0.25rem 0.5rem;\r\n justify-content: center;\r\n flex: 1;\r\n user-select: none;\r\n`\r\n\r\nexport const Checkbox = styled.input`\r\n border: 1px solid ${({ theme }) => theme.red1};\r\n height: 20px;\r\n margin: 0;\r\n`\r\n\r\nexport const FadedSpan = styled(RowFixed)`\r\n color: ${({ theme }) => theme.primary1};\r\n font-size: 14px;\r\n`\r\n\r\nexport const PaddedColumn = styled(AutoColumn)`\r\n padding: 20px;\r\n padding-bottom: 12px;\r\n`\r\n\r\nexport const TextDot = styled.div`\r\n height: 3px;\r\n width: 3px;\r\n background-color: ${({ theme }) => theme.text2};\r\n border-radius: 50%;\r\n`\r\n\r\nexport const MenuItem = styled(RowBetween)`\r\n padding: 4px 20px;\r\n height: 56px;\r\n display: grid;\r\n grid-template-columns: auto minmax(auto, 1fr) auto minmax(0, 72px);\r\n grid-gap: 16px;\r\n cursor: ${({ disabled }) => !disabled && 'pointer'};\r\n pointer-events: ${({ disabled }) => disabled && 'none'};\r\n :hover {\r\n background-color: ${({ theme, disabled }) => !disabled && theme.bg2};\r\n }\r\n opacity: ${({ disabled, selected }) => (disabled || selected ? 0.5 : 1)};\r\n`\r\n\r\nexport const SearchInput = styled.input`\r\n position: relative;\r\n display: flex;\r\n padding: 16px;\r\n align-items: center;\r\n width: 100%;\r\n white-space: nowrap;\r\n background: none;\r\n border: none;\r\n outline: none;\r\n border-radius: 5px;\r\n color: ${({ theme }) => theme.text1};\r\n border-style: solid;\r\n border: 1px solid ${({ theme }) => theme.bg3};\r\n -webkit-appearance: none;\r\n\r\n font-size: 18px;\r\n\r\n ::placeholder {\r\n color: ${({ theme }) => theme.text3};\r\n }\r\n transition: border 100ms;\r\n :focus {\r\n border: 1px solid ${({ theme }) => theme.primary1};\r\n outline: none;\r\n }\r\n`\r\nexport const Separator = styled.div`\r\n width: 100%;\r\n height: 1px;\r\n background-color: ${({ theme }) => theme.bg2};\r\n`\r\n\r\nexport const SeparatorDark = styled.div`\r\n width: 100%;\r\n height: 1px;\r\n background-color: ${({ theme }) => theme.bg3};\r\n`\r\n","import React from 'react'\nimport styled from 'styled-components'\nimport useHttpLocations from '../../hooks/useHttpLocations'\n\nimport Logo from '../Logo'\n\nconst StyledListLogo = styled(Logo)<{ size: string }>`\n width: ${({ size }) => size};\n height: ${({ size }) => size};\n`\n\nexport default function ListLogo({\n logoURI,\n style,\n size = '24px',\n alt\n}: {\n logoURI: string\n size?: string\n style?: React.CSSProperties\n alt?: string\n}) {\n const srcs: string[] = useHttpLocations(logoURI)\n\n return \n}\n","import { ThemeContext } from 'styled-components'\nimport { useContext } from 'react'\n\nexport default function useTheme() {\n return useContext(ThemeContext)\n}\n","import React, { CSSProperties } from 'react'\nimport { Token } from '@levinswap/uniswap-sdk'\nimport { AutoRow, RowFixed } from 'components/Row'\nimport { AutoColumn } from 'components/Column'\nimport CurrencyLogo from 'components/CurrencyLogo'\nimport { TYPE } from 'theme'\nimport ListLogo from 'components/ListLogo'\nimport { useActiveWeb3React } from 'hooks'\nimport { useCombinedInactiveList } from 'state/lists/hooks'\nimport { ButtonPrimary } from 'components/Button'\nimport styled from 'styled-components'\nimport { useIsUserAddedToken, useIsTokenActive } from 'hooks/Tokens'\nimport { CheckCircle } from 'react-feather'\nimport useTheme from 'hooks/useTheme'\n\nconst TokenSection = styled.div<{ dim?: boolean }>`\n padding: 4px 20px;\n height: 56px;\n display: grid;\n grid-template-columns: auto minmax(auto, 1fr) auto;\n grid-gap: 16px;\n align-items: center;\n\n opacity: ${({ dim }) => (dim ? '0.4' : '1')};\n`\n\nconst CheckIcon = styled(CheckCircle)`\n height: 16px;\n width: 16px;\n margin-right: 6px;\n stroke: ${({ theme }) => theme.green1};\n`\n\nconst NameOverflow = styled.div`\n white-space: nowrap;\n text-overflow: ellipsis;\n overflow: hidden;\n text-overflow: ellipsis;\n max-width: 140px;\n font-size: 12px;\n`\n\nexport default function ImportRow({\n token,\n style,\n dim,\n showImportView,\n setImportToken\n}: {\n token: Token\n style?: CSSProperties\n dim?: boolean\n showImportView: () => void\n setImportToken: (token: Token) => void\n}) {\n // gloabls\n const { chainId } = useActiveWeb3React()\n const theme = useTheme()\n\n // check if token comes from list\n const inactiveTokenList = useCombinedInactiveList()\n const list = chainId && inactiveTokenList?.[chainId]?.[token.address]?.list\n\n // check if already active on list or local storage tokens\n const isAdded = useIsUserAddedToken(token)\n const isActive = useIsTokenActive(token)\n\n return (\n \n \n \n \n {token.symbol}\n \n {token.name}\n \n \n {list && list.logoURI && (\n \n \n via {list.name}\n \n \n \n )}\n \n {!isActive && !isAdded ? (\n {\n setImportToken && setImportToken(token)\n showImportView()\n }}\n >\n Import\n \n ) : (\n \n \n Active\n \n )}\n \n )\n}\n","import { Currency, CurrencyAmount, currencyEquals, ETHER, Token } from '@levinswap/uniswap-sdk'\r\nimport React, { CSSProperties, MutableRefObject, useCallback, useMemo } from 'react'\r\nimport { FixedSizeList } from 'react-window'\r\nimport { Text } from 'rebass'\r\nimport styled from 'styled-components'\r\nimport { useActiveWeb3React } from '../../hooks'\r\nimport { WrappedTokenInfo, useCombinedActiveList } from '../../state/lists/hooks'\r\nimport { useCurrencyBalance } from '../../state/wallet/hooks'\r\nimport { TYPE } from '../../theme'\r\nimport { useIsUserAddedToken, useAllInactiveTokens } from '../../hooks/Tokens'\r\nimport Column from '../Column'\r\nimport { RowFixed, RowBetween } from '../Row'\r\nimport CurrencyLogo from '../CurrencyLogo'\r\nimport { MouseoverTooltip } from '../Tooltip'\r\nimport { MenuItem } from './styleds'\r\nimport Loader from '../Loader'\r\nimport { isTokenOnList } from '../../utils'\r\nimport ImportRow from './ImportRow'\r\nimport { wrappedCurrency } from 'utils/wrappedCurrency'\r\nimport { LightGreyCard } from 'components/Card'\r\nimport TokenListLogo from '../../assets/svg/tokenlist.svg'\r\nimport QuestionHelper from 'components/QuestionHelper'\r\nimport useTheme from 'hooks/useTheme'\r\n\r\nfunction currencyKey(currency: Currency): string {\r\n return currency instanceof Token ? currency.address : currency === ETHER ? 'ETHER' : ''\r\n}\r\n\r\nconst StyledBalanceText = styled(Text)`\r\n white-space: nowrap;\r\n overflow: hidden;\r\n max-width: 5rem;\r\n text-overflow: ellipsis;\r\n`\r\n\r\nconst Tag = styled.div`\r\n background-color: ${({ theme }) => theme.bg3};\r\n color: ${({ theme }) => theme.text2};\r\n font-size: 14px;\r\n border-radius: 4px;\r\n padding: 0.25rem 0.3rem 0.25rem 0.3rem;\r\n max-width: 6rem;\r\n overflow: hidden;\r\n text-overflow: ellipsis;\r\n white-space: nowrap;\r\n justify-self: flex-end;\r\n margin-right: 4px;\r\n`\r\n\r\nconst FixedContentRow = styled.div`\r\n padding: 4px 20px;\r\n height: 56px;\r\n display: grid;\r\n grid-gap: 16px;\r\n align-items: center;\r\n`\r\n\r\nfunction Balance({ balance }: { balance: CurrencyAmount }) {\r\n return {balance.toSignificant(4)}\r\n}\r\n\r\nconst TagContainer = styled.div`\r\n display: flex;\r\n justify-content: flex-end;\r\n`\r\n\r\nconst TokenListLogoWrapper = styled.img`\r\n height: 20px;\r\n`\r\n\r\nfunction TokenTags({ currency }: { currency: Currency }) {\r\n if (!(currency instanceof WrappedTokenInfo)) {\r\n return \r\n }\r\n\r\n const tags = currency.tags\r\n if (!tags || tags.length === 0) return \r\n\r\n const tag = tags[0]\r\n\r\n return (\r\n \r\n \r\n {tag.name}\r\n \r\n {tags.length > 1 ? (\r\n `${name}: ${description}`)\r\n .join('; \\n')}\r\n >\r\n ...\r\n \r\n ) : null}\r\n \r\n )\r\n}\r\n\r\nfunction CurrencyRow({\r\n currency,\r\n onSelect,\r\n isSelected,\r\n otherSelected,\r\n style\r\n}: {\r\n currency: Currency\r\n onSelect: () => void\r\n isSelected: boolean\r\n otherSelected: boolean\r\n style: CSSProperties\r\n}) {\r\n const { account } = useActiveWeb3React()\r\n const key = currencyKey(currency)\r\n const selectedTokenList = useCombinedActiveList()\r\n const isOnSelectedList = isTokenOnList(selectedTokenList, currency)\r\n const customAdded = useIsUserAddedToken(currency)\r\n const balance = useCurrencyBalance(account ?? undefined, currency)\r\n\r\n // only show add or remove buttons if not on selected list\r\n return (\r\n (isSelected ? null : onSelect())}\r\n disabled={isSelected}\r\n selected={otherSelected}\r\n >\r\n \r\n \r\n \r\n {currency.symbol}\r\n \r\n \r\n {currency.name} {!isOnSelectedList && customAdded && '• Added by user'}\r\n \r\n \r\n \r\n \r\n {balance ? : account ? : null}\r\n \r\n \r\n )\r\n}\r\n\r\nexport default function CurrencyList({\r\n height,\r\n currencies,\r\n selectedCurrency,\r\n onCurrencySelect,\r\n otherCurrency,\r\n fixedListRef,\r\n showETH,\r\n showImportView,\r\n setImportToken,\r\n breakIndex\r\n}: {\r\n height: number\r\n currencies: Currency[]\r\n selectedCurrency?: Currency | null\r\n onCurrencySelect: (currency: Currency) => void\r\n otherCurrency?: Currency | null\r\n fixedListRef?: MutableRefObject\r\n showETH: boolean\r\n showImportView: () => void\r\n setImportToken: (token: Token) => void\r\n breakIndex: number | undefined\r\n}) {\r\n const itemData: (Currency | undefined)[] = useMemo(() => {\r\n let formatted: (Currency | undefined)[] = showETH ? [Currency.ETHER, ...currencies] : currencies\r\n if (breakIndex !== undefined) {\r\n formatted = [...formatted.slice(0, breakIndex), undefined, ...formatted.slice(breakIndex, formatted.length)]\r\n }\r\n return formatted\r\n }, [breakIndex, currencies, showETH])\r\n\r\n const { chainId } = useActiveWeb3React()\r\n const theme = useTheme()\r\n\r\n const inactiveTokens: {\r\n [address: string]: Token\r\n } = useAllInactiveTokens()\r\n\r\n const Row = useCallback(\r\n ({ data, index, style }) => {\r\n const currency: Currency = data[index]\r\n const isSelected = Boolean(selectedCurrency && currencyEquals(selectedCurrency, currency))\r\n const otherSelected = Boolean(otherCurrency && currencyEquals(otherCurrency, currency))\r\n const handleSelect = () => onCurrencySelect(currency)\r\n\r\n const token = wrappedCurrency(currency, chainId)\r\n\r\n const showImport = inactiveTokens && token && Object.keys(inactiveTokens).includes(token.address)\r\n\r\n if (index === breakIndex || !data) {\r\n return (\r\n \r\n \r\n \r\n \r\n \r\n \r\n Expanded results from inactive Token Lists\r\n \r\n \r\n \r\n \r\n \r\n \r\n )\r\n }\r\n\r\n if (showImport && token) {\r\n return (\r\n \r\n )\r\n } else {\r\n return (\r\n \r\n )\r\n }\r\n },\r\n [\r\n chainId,\r\n inactiveTokens,\r\n onCurrencySelect,\r\n otherCurrency,\r\n selectedCurrency,\r\n setImportToken,\r\n showImportView,\r\n breakIndex,\r\n theme.text1\r\n ]\r\n )\r\n\r\n const itemKey = useCallback((index: number, data: any) => currencyKey(data[index]), [])\r\n\r\n return (\r\n \r\n {Row}\r\n \r\n )\r\n}\r\n","import { Token, TokenAmount } from '@levinswap/uniswap-sdk'\nimport { useMemo } from 'react'\nimport { useAllTokenBalances } from '../../state/wallet/hooks'\n\n// compare two token amounts with highest one coming first\nfunction balanceComparator(balanceA?: TokenAmount, balanceB?: TokenAmount) {\n if (balanceA && balanceB) {\n return balanceA.greaterThan(balanceB) ? -1 : balanceA.equalTo(balanceB) ? 0 : 1\n } else if (balanceA && balanceA.greaterThan('0')) {\n return -1\n } else if (balanceB && balanceB.greaterThan('0')) {\n return 1\n }\n return 0\n}\n\nfunction getTokenComparator(balances: {\n [tokenAddress: string]: TokenAmount | undefined\n}): (tokenA: Token, tokenB: Token) => number {\n return function sortTokens(tokenA: Token, tokenB: Token): number {\n // -1 = a is first\n // 1 = b is first\n\n // sort by balances\n const balanceA = balances[tokenA.address]\n const balanceB = balances[tokenB.address]\n\n const balanceComp = balanceComparator(balanceA, balanceB)\n if (balanceComp !== 0) return balanceComp\n\n if (tokenA.symbol && tokenB.symbol) {\n // sort by symbol\n return tokenA.symbol.toLowerCase() < tokenB.symbol.toLowerCase() ? -1 : 1\n } else {\n return tokenA.symbol ? -1 : tokenB.symbol ? -1 : 0\n }\n }\n}\n\nexport function useTokenComparator(inverted: boolean): (tokenA: Token, tokenB: Token) => number {\n const balances = useAllTokenBalances()\n const comparator = useMemo(() => getTokenComparator(balances ?? {}), [balances])\n return useMemo(() => {\n if (inverted) {\n return (tokenA: Token, tokenB: Token) => comparator(tokenA, tokenB) * -1\n } else {\n return comparator\n }\n }, [inverted, comparator])\n}\n","import { useCallback, useState } from 'react'\n\nexport default function useToggle(initialState = false): [boolean, () => void] {\n const [state, setState] = useState(initialState)\n const toggle = useCallback(() => setState(state => !state), [])\n return [state, toggle]\n}\n","import { Currency, ETHER, Token } from '@levinswap/uniswap-sdk'\r\nimport React, { KeyboardEvent, RefObject, useCallback, useEffect, useMemo, useRef, useState } from 'react'\r\nimport ReactGA from 'react-ga'\r\nimport { useTranslation } from 'react-i18next'\r\nimport { FixedSizeList } from 'react-window'\r\nimport { Text } from 'rebass'\r\nimport { useActiveWeb3React } from '../../hooks'\r\nimport { useAllTokens, useToken, useIsUserAddedToken, useFoundOnInactiveList } from '../../hooks/Tokens'\r\nimport { CloseIcon, TYPE, ButtonText, IconWrapper } from '../../theme'\r\nimport { isAddress } from '../../utils'\r\nimport Column from '../Column'\r\nimport Row, { RowBetween, RowFixed } from '../Row'\r\nimport CommonBases from './CommonBases'\r\nimport CurrencyList from './CurrencyList'\r\nimport { filterTokens, useSortedTokensByQuery } from './filtering'\r\nimport { useTokenComparator } from './sorting'\r\nimport { PaddedColumn, SearchInput, Separator } from './styleds'\r\nimport AutoSizer from 'react-virtualized-auto-sizer'\r\nimport styled from 'styled-components'\r\nimport useToggle from 'hooks/useToggle'\r\nimport { useOnClickOutside } from 'hooks/useOnClickOutside'\r\nimport ImportRow from './ImportRow'\r\nimport { Edit } from 'react-feather'\r\nimport useDebounce from 'hooks/useDebounce'\r\nimport useTheme from 'hooks/useTheme'\r\n\r\nconst ContentWrapper = styled(Column)`\r\n width: 100%;\r\n flex: 1 1;\r\n position: relative;\r\n`\r\n\r\nconst Footer = styled.div`\r\n width: 100%;\r\n border-radius: 20px;\r\n padding: 20px;\r\n border-top-left-radius: 0;\r\n border-top-right-radius: 0;\r\n background-color: ${({ theme }) => theme.bg1};\r\n border-top: 1px solid ${({ theme }) => theme.bg2};\r\n`\r\n\r\ninterface CurrencySearchProps {\r\n isOpen: boolean\r\n onDismiss: () => void\r\n selectedCurrency?: Currency | null\r\n onCurrencySelect: (currency: Currency) => void\r\n otherSelectedCurrency?: Currency | null\r\n showCommonBases?: boolean\r\n showManageView: () => void\r\n showImportView: () => void\r\n setImportToken: (token: Token) => void\r\n}\r\n\r\nexport function CurrencySearch({\r\n selectedCurrency,\r\n onCurrencySelect,\r\n otherSelectedCurrency,\r\n showCommonBases,\r\n onDismiss,\r\n isOpen,\r\n showManageView,\r\n showImportView,\r\n setImportToken\r\n}: CurrencySearchProps) {\r\n const { t } = useTranslation()\r\n const { chainId } = useActiveWeb3React()\r\n const theme = useTheme()\r\n\r\n // refs for fixed size lists\r\n const fixedList = useRef()\r\n\r\n const [searchQuery, setSearchQuery] = useState('')\r\n const debouncedQuery = useDebounce(searchQuery, 200)\r\n\r\n const [invertSearchOrder] = useState(false)\r\n\r\n const allTokens = useAllTokens()\r\n\r\n // if they input an address, use it\r\n const isAddressSearch = isAddress(debouncedQuery)\r\n const searchToken = useToken(debouncedQuery)\r\n const searchTokenIsAdded = useIsUserAddedToken(searchToken)\r\n\r\n useEffect(() => {\r\n if (isAddressSearch) {\r\n ReactGA.event({\r\n category: 'Currency Select',\r\n action: 'Search by address',\r\n label: isAddressSearch\r\n })\r\n }\r\n }, [isAddressSearch])\r\n\r\n const showETH: boolean = useMemo(() => {\r\n const s = debouncedQuery.toLowerCase().trim()\r\n return s === '' || s === 'e' || s === 'et' || s === 'eth'\r\n }, [debouncedQuery])\r\n\r\n const tokenComparator = useTokenComparator(invertSearchOrder)\r\n\r\n const filteredTokens: Token[] = useMemo(() => {\r\n return filterTokens(Object.values(allTokens), debouncedQuery)\r\n }, [allTokens, debouncedQuery])\r\n\r\n const sortedTokens: Token[] = useMemo(() => {\r\n return filteredTokens.sort(tokenComparator)\r\n }, [filteredTokens, tokenComparator])\r\n\r\n const filteredSortedTokens = useSortedTokensByQuery(sortedTokens, debouncedQuery)\r\n\r\n const handleCurrencySelect = useCallback(\r\n (currency: Currency) => {\r\n onCurrencySelect(currency)\r\n onDismiss()\r\n },\r\n [onDismiss, onCurrencySelect]\r\n )\r\n\r\n // clear the input on open\r\n useEffect(() => {\r\n if (isOpen) setSearchQuery('')\r\n }, [isOpen])\r\n\r\n // manage focus on modal show\r\n const inputRef = useRef()\r\n const handleInput = useCallback(event => {\r\n const input = event.target.value\r\n const checksummedInput = isAddress(input)\r\n setSearchQuery(checksummedInput || input)\r\n fixedList.current?.scrollTo(0)\r\n }, [])\r\n\r\n const handleEnter = useCallback(\r\n (e: KeyboardEvent) => {\r\n if (e.key === 'Enter') {\r\n const s = debouncedQuery.toLowerCase().trim()\r\n if (s === 'eth') {\r\n handleCurrencySelect(ETHER)\r\n } else if (filteredSortedTokens.length > 0) {\r\n if (\r\n filteredSortedTokens[0].symbol?.toLowerCase() === debouncedQuery.trim().toLowerCase() ||\r\n filteredSortedTokens.length === 1\r\n ) {\r\n handleCurrencySelect(filteredSortedTokens[0])\r\n }\r\n }\r\n }\r\n },\r\n [filteredSortedTokens, handleCurrencySelect, debouncedQuery]\r\n )\r\n\r\n // menu ui\r\n const [open, toggle] = useToggle(false)\r\n const node = useRef()\r\n useOnClickOutside(node, open ? toggle : undefined)\r\n\r\n // if no results on main list, show option to expand into inactive\r\n const inactiveTokens = useFoundOnInactiveList(debouncedQuery)\r\n const filteredInactiveTokens: Token[] = useSortedTokensByQuery(inactiveTokens, debouncedQuery)\r\n\r\n const ManageCenterStyled = styled.div`\r\n width: 100%;\r\n display: flex;\r\n align-items: center;\r\n justify-content: center;\r\n align-text: center;\r\n `\r\n\r\n return (\r\n \r\n \r\n \r\n \r\n Select a token\r\n \r\n \r\n \r\n \r\n }\r\n onChange={handleInput}\r\n onKeyDown={handleEnter}\r\n />\r\n \r\n {showCommonBases && (\r\n \r\n )}\r\n \r\n \r\n {searchToken && !searchTokenIsAdded ? (\r\n \r\n \r\n \r\n ) : filteredSortedTokens?.length > 0 || filteredInactiveTokens?.length > 0 ? (\r\n
    \r\n \r\n {({ height }) => (\r\n \r\n )}\r\n \r\n
    \r\n ) : (\r\n \r\n \r\n No results found.\r\n \r\n \r\n )}\r\n
    \r\n \r\n \r\n \r\n \r\n \r\n \r\n Manage\r\n \r\n \r\n \r\n
    \r\n
    \r\n )\r\n}\r\n","import { transparentize } from 'polished'\r\nimport React from 'react'\r\nimport { AlertTriangle } from 'react-feather'\r\nimport styled, { css } from 'styled-components'\r\nimport { Text } from 'rebass'\r\nimport { AutoColumn } from '../Column'\r\n\r\nexport const Wrapper = styled.div`\r\n position: relative;\r\n`\r\n\r\nexport const ArrowWrapper = styled.div<{ clickable: boolean }>`\r\n padding: 2px;\r\n\r\n ${({ clickable }) =>\r\n clickable\r\n ? css`\r\n :hover {\r\n cursor: pointer;\r\n opacity: 0.8;\r\n }\r\n `\r\n : null}\r\n`\r\n\r\nexport const SectionBreak = styled.div`\r\n height: 1px;\r\n width: 100%;\r\n background-color: ${({ theme }) => theme.bg3};\r\n`\r\n\r\nexport const BottomGrouping = styled.div`\r\n margin-top: 1rem;\r\n`\r\n\r\nexport const ErrorText = styled(Text)<{ severity?: 0 | 1 | 2 | 3 | 4 }>`\r\n color: ${({ theme, severity }) =>\r\n severity === 3 || severity === 4\r\n ? theme.red1\r\n : severity === 2\r\n ? theme.yellow2\r\n : severity === 1\r\n ? theme.text1\r\n : theme.green1};\r\n`\r\n\r\nexport const StyledBalanceMaxMini = styled.button`\r\n height: 22px;\r\n width: 22px;\r\n background-color: ${({ theme }) => theme.bg2};\r\n border: none;\r\n border-radius: 5px;\r\n padding: 0.2rem;\r\n font-size: 0.875rem;\r\n font-weight: 400;\r\n margin-left: 0.4rem;\r\n cursor: pointer;\r\n color: ${({ theme }) => theme.text2};\r\n display: flex;\r\n justify-content: center;\r\n align-items: center;\r\n float: right;\r\n\r\n :hover {\r\n background-color: ${({ theme }) => theme.bg3};\r\n }\r\n :focus {\r\n background-color: ${({ theme }) => theme.bg3};\r\n outline: none;\r\n }\r\n`\r\n\r\nexport const TruncatedText = styled(Text)`\r\n text-overflow: ellipsis;\r\n width: 220px;\r\n overflow: hidden;\r\n`\r\n\r\n// styles\r\nexport const Dots = styled.span`\r\n &::after {\r\n display: inline-block;\r\n animation: ellipsis 1.25s infinite;\r\n content: '.';\r\n width: 1em;\r\n text-align: left;\r\n }\r\n @keyframes ellipsis {\r\n 0% {\r\n content: '.';\r\n }\r\n 33% {\r\n content: '..';\r\n }\r\n 66% {\r\n content: '...';\r\n }\r\n }\r\n`\r\n\r\nconst SwapCallbackErrorInner = styled.div`\r\n background-color: ${({ theme }) => transparentize(0.9, theme.red1)};\r\n border-radius: 5px;\r\n display: flex;\r\n align-items: center;\r\n font-size: 0.825rem;\r\n width: 100%;\r\n padding: 3rem 1.25rem 1rem 1rem;\r\n margin-top: -2rem;\r\n color: ${({ theme }) => theme.red1};\r\n z-index: -1;\r\n p {\r\n padding: 0;\r\n margin: 0;\r\n font-weight: 500;\r\n }\r\n`\r\n\r\nconst SwapCallbackErrorInnerAlertTriangle = styled.div`\r\n background-color: ${({ theme }) => transparentize(0.9, theme.red1)};\r\n display: flex;\r\n align-items: center;\r\n justify-content: center;\r\n margin-right: 12px;\r\n border-radius: 5px;\r\n min-width: 48px;\r\n height: 48px;\r\n`\r\n\r\nexport function SwapCallbackError({ error }: { error: string }) {\r\n return (\r\n \r\n \r\n \r\n \r\n

    {error}

    \r\n
    \r\n )\r\n}\r\n\r\nexport const SwapShowAcceptChanges = styled(AutoColumn)`\r\n background-color: ${({ theme }) => transparentize(0.9, theme.primary1)};\r\n color: ${({ theme }) => theme.primary1};\r\n padding: 0.5rem;\r\n border-radius: 5px;\r\n margin-top: 8px;\r\n`\r\n","import React, { useState } from 'react'\nimport { Token, Currency } from '@levinswap/uniswap-sdk'\nimport styled from 'styled-components'\nimport { TYPE, CloseIcon } from 'theme'\nimport Card from 'components/Card'\nimport { AutoColumn } from 'components/Column'\nimport { RowBetween, RowFixed, AutoRow } from 'components/Row'\nimport CurrencyLogo from 'components/CurrencyLogo'\nimport { ArrowLeft, AlertTriangle } from 'react-feather'\nimport { transparentize } from 'polished'\nimport { ButtonPrimary } from 'components/Button'\nimport { SectionBreak } from 'components/swap/styleds'\nimport { useAddUserToken } from 'state/user/hooks'\nimport { getEtherscanLink } from 'utils'\nimport { useActiveWeb3React } from 'hooks'\nimport { ExternalLink } from '../../theme/components'\nimport { useCombinedInactiveList } from 'state/lists/hooks'\nimport ListLogo from 'components/ListLogo'\nimport { PaddedColumn, Checkbox } from './styleds'\nimport useTheme from 'hooks/useTheme'\n\nconst Wrapper = styled.div`\n position: relative;\n width: 100%;\n overflow: auto;\n`\n\nconst WarningWrapper = styled(Card)<{ highWarning: boolean }>`\n background-color: ${({ theme, highWarning }) =>\n highWarning ? transparentize(0.8, theme.red1) : transparentize(0.8, theme.yellow2)};\n width: fit-content;\n`\n\nconst AddressText = styled(TYPE.blue)`\n font-size: 12px;\n\n ${({ theme }) => theme.mediaWidth.upToSmall`\n font-size: 10px;\n`}\n`\n\ninterface ImportProps {\n tokens: Token[]\n onBack?: () => void\n onDismiss?: () => void\n handleCurrencySelect?: (currency: Currency) => void\n}\n\nexport function ImportToken({ tokens, onBack, onDismiss, handleCurrencySelect }: ImportProps) {\n const theme = useTheme()\n\n const { chainId } = useActiveWeb3React()\n\n const [confirmed, setConfirmed] = useState(false)\n\n const addToken = useAddUserToken()\n\n // use for showing import source on inactive tokens\n const inactiveTokenList = useCombinedInactiveList()\n\n // higher warning severity if either is not on a list\n const fromLists =\n (chainId && inactiveTokenList?.[chainId]?.[tokens[0]?.address]?.list) ||\n (chainId && inactiveTokenList?.[chainId]?.[tokens[1]?.address]?.list)\n\n return (\n \n \n \n {onBack ? :
    }\n Import {tokens.length > 1 ? 'Tokens' : 'Token'}\n {onDismiss ? :
    }\n
    \n
    \n \n \n {tokens.map(token => {\n const list = chainId && inactiveTokenList?.[chainId]?.[token.address]?.list\n return (\n \n \n \n \n \n {token.symbol}\n \n {token.name}\n \n {chainId && (\n \n {token.address}\n \n )}\n {list !== undefined ? (\n \n {list.logoURI && }\n \n via {list.name}\n \n \n ) : (\n \n \n \n \n Unknown Source\n \n \n \n )}\n \n \n )\n })}\n\n \n \n \n \n Trade at your own risk!\n \n \n\n \n \n Anyone can create a token, including creating fake versions of existing tokens that claim to represent\n projects.\n \n \n If you purchase this token, you may not be able to sell it back.\n \n \n setConfirmed(!confirmed)}>\n setConfirmed(!confirmed)}\n />\n \n I understand\n \n \n \n {\n tokens.map(token => addToken(token))\n handleCurrencySelect && handleCurrencySelect(tokens[0])\n }}\n className=\".token-dismiss-button\"\n >\n Import\n \n \n
    \n )\n}\n","import { TokenList } from '@uniswap/token-lists'\nimport schema from '@uniswap/token-lists/src/tokenlist.schema.json'\nimport Ajv from 'ajv'\nimport contenthashToUri from './contenthashToUri'\nimport { parseENSAddress } from './parseENSAddress'\nimport uriToHttp from './uriToHttp'\n\nconst tokenListValidator = new Ajv({ allErrors: true }).compile(schema)\n\n/**\n * Contains the logic for resolving a list URL to a validated token list\n * @param listUrl list url\n * @param resolveENSContentHash resolves an ens name to a contenthash\n */\nexport default async function getTokenList(\n listUrl: string,\n resolveENSContentHash: (ensName: string) => Promise\n): Promise {\n const parsedENS = parseENSAddress(listUrl)\n let urls: string[]\n if (parsedENS) {\n let contentHashUri\n try {\n contentHashUri = await resolveENSContentHash(parsedENS.ensName)\n } catch (error) {\n console.debug(`Failed to resolve ENS name: ${parsedENS.ensName}`, error)\n throw new Error(`Failed to resolve ENS name: ${parsedENS.ensName}`)\n }\n let translatedUri\n try {\n translatedUri = contenthashToUri(contentHashUri)\n } catch (error) {\n console.debug('Failed to translate contenthash to URI', contentHashUri)\n throw new Error(`Failed to translate contenthash to URI: ${contentHashUri}`)\n }\n urls = uriToHttp(`${translatedUri}${parsedENS.ensPath ?? ''}`)\n } else {\n urls = uriToHttp(listUrl)\n }\n for (let i = 0; i < urls.length; i++) {\n const url = urls[i]\n const isLast = i === urls.length - 1\n let response\n try {\n response = await fetch(url)\n } catch (error) {\n console.debug('Failed to fetch list', listUrl, error)\n if (isLast) throw new Error(`Failed to download list ${listUrl}`)\n continue\n }\n\n if (!response.ok) {\n if (isLast) throw new Error(`Failed to download list ${listUrl}`)\n continue\n }\n\n const json = await response.json()\n if (!tokenListValidator(json)) {\n const validationErrors: string =\n tokenListValidator.errors?.reduce((memo, error) => {\n const add = `${error.dataPath} ${error.message ?? ''}`\n return memo.length > 0 ? `${memo}; ${add}` : `${add}`\n }, '') ?? 'unknown error'\n throw new Error(`Token list failed validation: ${validationErrors}`)\n }\n return json\n }\n throw new Error('Unrecognized list URL protocol.')\n}\n","import { Contract } from '@ethersproject/contracts'\nimport { Provider } from '@ethersproject/abstract-provider'\nimport { namehash } from 'ethers/lib/utils'\n\nconst REGISTRAR_ABI = [\n {\n constant: true,\n inputs: [\n {\n name: 'node',\n type: 'bytes32'\n }\n ],\n name: 'resolver',\n outputs: [\n {\n name: 'resolverAddress',\n type: 'address'\n }\n ],\n payable: false,\n stateMutability: 'view',\n type: 'function'\n }\n]\nconst REGISTRAR_ADDRESS = '0x00000000000C2E074eC69A0dFb2997BA6C7d2e1e'\n\nconst RESOLVER_ABI = [\n {\n constant: true,\n inputs: [\n {\n internalType: 'bytes32',\n name: 'node',\n type: 'bytes32'\n }\n ],\n name: 'contenthash',\n outputs: [\n {\n internalType: 'bytes',\n name: '',\n type: 'bytes'\n }\n ],\n payable: false,\n stateMutability: 'view',\n type: 'function'\n }\n]\n\n// cache the resolver contracts since most of them are the public resolver\nfunction resolverContract(resolverAddress: string, provider: Provider): Contract {\n return new Contract(resolverAddress, RESOLVER_ABI, provider)\n}\n\n/**\n * Fetches and decodes the result of an ENS contenthash lookup on mainnet to a URI\n * @param ensName to resolve\n * @param provider provider to use to fetch the data\n */\nexport default async function resolveENSContentHash(ensName: string, provider: Provider): Promise {\n const ensRegistrarContract = new Contract(REGISTRAR_ADDRESS, REGISTRAR_ABI, provider)\n const hash = namehash(ensName)\n const resolverAddress = await ensRegistrarContract.resolver(hash)\n return resolverContract(resolverAddress, provider).contenthash(hash)\n}\n","import { nanoid } from '@reduxjs/toolkit'\r\nimport { ChainId } from '@levinswap/uniswap-sdk'\r\nimport { TokenList } from '@uniswap/token-lists'\r\nimport { useCallback } from 'react'\r\nimport { useDispatch } from 'react-redux'\r\nimport { getNetworkLibrary, NETWORK_CHAIN_ID } from '../connectors'\r\nimport { AppDispatch } from '../state'\r\nimport { fetchTokenList } from '../state/lists/actions'\r\nimport getTokenList from '../utils/getTokenList'\r\nimport resolveENSContentHash from '../utils/resolveENSContentHash'\r\nimport { useActiveWeb3React } from './index'\r\n\r\nexport function useFetchListCallback(): (listUrl: string, sendDispatch?: boolean) => Promise {\r\n const { chainId, library } = useActiveWeb3React()\r\n const dispatch = useDispatch()\r\n\r\n const ensResolver = useCallback(\r\n (ensName: string) => {\r\n if (!library || chainId !== ChainId.MAINNET) {\r\n if (NETWORK_CHAIN_ID === ChainId.MAINNET) {\r\n const networkLibrary = getNetworkLibrary()\r\n if (networkLibrary) {\r\n return resolveENSContentHash(ensName, networkLibrary)\r\n }\r\n }\r\n throw new Error('Could not construct mainnet ENS resolver')\r\n }\r\n return resolveENSContentHash(ensName, library)\r\n },\r\n [chainId, library]\r\n )\r\n\r\n // note: prevent dispatch if using for list search or unsupported list\r\n return useCallback(\r\n async (listUrl: string, sendDispatch = true) => {\r\n const requestId = nanoid()\r\n sendDispatch && dispatch(fetchTokenList.pending({ requestId, url: listUrl }))\r\n return getTokenList(listUrl, ensResolver)\r\n .then(tokenList => {\r\n sendDispatch && dispatch(fetchTokenList.fulfilled({ url: listUrl, tokenList, requestId }))\r\n return tokenList\r\n })\r\n .catch(error => {\r\n console.debug(`Failed to get list at url ${listUrl}`, error)\r\n sendDispatch && dispatch(fetchTokenList.rejected({ url: listUrl, requestId, errorMessage: error.message }))\r\n throw error\r\n })\r\n },\r\n [dispatch, ensResolver]\r\n )\r\n}\r\n","import { useState, useLayoutEffect } from 'react'\r\nimport { shade } from 'polished'\r\nimport Vibrant from 'node-vibrant'\r\nimport { hex } from 'wcag-contrast'\r\nimport { Token, ChainId } from '@levinswap/uniswap-sdk'\r\nimport uriToHttp from 'utils/uriToHttp'\r\n\r\nasync function getColorFromToken(token: Token): Promise {\r\n if (token.chainId === ChainId.RINKEBY && token.address === '0xc7AD46e0b8a400Bb3C915120d284AafbA8fc4735') {\r\n return Promise.resolve('#FAAB14')\r\n }\r\n\r\n const path = `./images/tokens/${token.address}.png`\r\n\r\n return Vibrant.from(path)\r\n .getPalette()\r\n .then(palette => {\r\n if (palette?.Vibrant) {\r\n let detectedHex = palette.Vibrant.hex\r\n let AAscore = hex(detectedHex, '#FFF')\r\n while (AAscore < 3) {\r\n detectedHex = shade(0.005, detectedHex)\r\n AAscore = hex(detectedHex, '#FFF')\r\n }\r\n return detectedHex\r\n }\r\n return null\r\n })\r\n .catch(() => null)\r\n}\r\n\r\nasync function getColorFromUriPath(uri: string): Promise {\r\n const formattedPath = uriToHttp(uri)[0]\r\n\r\n return Vibrant.from(formattedPath)\r\n .getPalette()\r\n .then(palette => {\r\n if (palette?.Vibrant) {\r\n return palette.Vibrant.hex\r\n }\r\n return null\r\n })\r\n .catch(() => null)\r\n}\r\n\r\nexport function useColor(token?: Token) {\r\n const [color, setColor] = useState('#2172E5')\r\n\r\n useLayoutEffect(() => {\r\n let stale = false\r\n\r\n if (token) {\r\n getColorFromToken(token).then(tokenColor => {\r\n if (!stale && tokenColor !== null) {\r\n setColor(tokenColor)\r\n }\r\n })\r\n }\r\n\r\n return () => {\r\n stale = true\r\n setColor('#2172E5')\r\n }\r\n }, [token])\r\n\r\n return color\r\n}\r\n\r\nexport function useListColor(listImageUri?: string) {\r\n const [color, setColor] = useState('#2172E5')\r\n\r\n useLayoutEffect(() => {\r\n let stale = false\r\n\r\n if (listImageUri) {\r\n getColorFromUriPath(listImageUri).then(color => {\r\n if (!stale && color !== null) {\r\n setColor(color)\r\n }\r\n })\r\n }\r\n\r\n return () => {\r\n stale = true\r\n setColor('#2172E5')\r\n }\r\n }, [listImageUri])\r\n\r\n return color\r\n}\r\n","import React from 'react'\nimport styled from 'styled-components'\nimport { TYPE } from '../../theme'\n\nconst Wrapper = styled.button<{ isActive?: boolean; activeElement?: boolean }>`\n border-radius: 20px;\n border: none;\n background: ${({ theme }) => theme.bg1};\n display: flex;\n width: fit-content;\n cursor: pointer;\n outline: none;\n padding: 0.4rem 0.4rem;\n align-items: center;\n`\n\nconst ToggleElement = styled.span<{ isActive?: boolean; bgColor?: string }>`\n border-radius: 50%;\n height: 24px;\n width: 24px;\n background-color: ${({ isActive, bgColor, theme }) => (isActive ? bgColor : theme.bg4)};\n :hover {\n opacity: 0.8;\n }\n`\n\nconst StatusText = styled(TYPE.main)<{ isActive?: boolean }>`\n margin: 0 10px;\n width: 24px;\n color: ${({ theme, isActive }) => (isActive ? theme.text1 : theme.text3)};\n`\n\nexport interface ToggleProps {\n id?: string\n isActive: boolean\n bgColor: string\n toggle: () => void\n}\n\nexport default function ListToggle({ id, isActive, bgColor, toggle }: ToggleProps) {\n return (\n \n {isActive && (\n \n ON\n \n )}\n \n {!isActive && (\n \n OFF\n \n )}\n \n )\n}\n","import React, { memo, useCallback, useMemo, useRef, useState, useEffect } from 'react'\nimport { Settings, CheckCircle } from 'react-feather'\nimport ReactGA from 'react-ga'\nimport { usePopper } from 'react-popper'\nimport { useDispatch, useSelector } from 'react-redux'\nimport styled from 'styled-components'\nimport { useFetchListCallback } from '../../hooks/useFetchListCallback'\nimport { useOnClickOutside } from '../../hooks/useOnClickOutside'\nimport { TokenList } from '@uniswap/token-lists'\n\nimport useToggle from '../../hooks/useToggle'\nimport { AppDispatch, AppState } from '../../state'\nimport { acceptListUpdate, removeList, disableList, enableList } from '../../state/lists/actions'\nimport { useIsListActive, useAllLists, useActiveListUrls } from '../../state/lists/hooks'\nimport { ExternalLink, LinkStyledButton, TYPE, IconWrapper } from '../../theme'\nimport listVersionLabel from '../../utils/listVersionLabel'\nimport { parseENSAddress } from '../../utils/parseENSAddress'\nimport uriToHttp from '../../utils/uriToHttp'\nimport { ButtonEmpty, ButtonPrimary } from '../Button'\nimport useTheme from 'hooks/useTheme'\n\nimport Column, { AutoColumn } from '../Column'\nimport ListLogo from '../ListLogo'\nimport Row, { RowFixed, RowBetween } from '../Row'\nimport { PaddedColumn, SearchInput, Separator, SeparatorDark } from './styleds'\nimport { useListColor } from 'hooks/useColor'\nimport ListToggle from '../Toggle/ListToggle'\nimport Card from 'components/Card'\nimport { CurrencyModalView } from './CurrencySearchModal'\nimport { UNSUPPORTED_LIST_URLS } from 'constants/lists'\n\nconst Wrapper = styled(Column)`\n width: 100%;\n height: 100%;\n`\n\nconst UnpaddedLinkStyledButton = styled(LinkStyledButton)`\n padding: 0;\n font-size: 1rem;\n opacity: ${({ disabled }) => (disabled ? '0.4' : '1')};\n`\n\nconst PopoverContainer = styled.div<{ show: boolean }>`\n z-index: 100;\n visibility: ${props => (props.show ? 'visible' : 'hidden')};\n opacity: ${props => (props.show ? 1 : 0)};\n transition: visibility 150ms linear, opacity 150ms linear;\n background: ${({ theme }) => theme.bg2};\n border: 1px solid ${({ theme }) => theme.bg3};\n box-shadow: 0px 0px 1px rgba(0, 0, 0, 0.01), 0px 4px 8px rgba(0, 0, 0, 0.04), 0px 16px 24px rgba(0, 0, 0, 0.04),\n 0px 24px 32px rgba(0, 0, 0, 0.01);\n color: ${({ theme }) => theme.text2};\n border-radius: 0.5rem;\n padding: 1rem;\n display: grid;\n grid-template-rows: 1fr;\n grid-gap: 8px;\n font-size: 1rem;\n text-align: left;\n`\n\nconst StyledMenu = styled.div`\n display: flex;\n justify-content: center;\n align-items: center;\n position: relative;\n border: none;\n`\n\nconst StyledTitleText = styled.div<{ active: boolean }>`\n font-size: 16px;\n overflow: hidden;\n text-overflow: ellipsis;\n font-weight: 600;\n color: ${({ theme, active }) => (active ? theme.white : theme.text2)};\n`\n\nconst StyledListUrlText = styled(TYPE.main)<{ active: boolean }>`\n font-size: 12px;\n color: ${({ theme, active }) => (active ? theme.white : theme.text2)};\n`\n\nconst RowWrapper = styled(Row)<{ bgColor: string; active: boolean }>`\n background-color: ${({ bgColor, active, theme }) => (active ? bgColor ?? 'transparent' : theme.bg2)};\n transition: 200ms;\n align-items: center;\n padding: 1rem;\n border-radius: 20px;\n`\n\nfunction listUrlRowHTMLId(listUrl: string) {\n return `list-row-${listUrl.replace(/\\./g, '-')}`\n}\n\nconst ListRow = memo(function ListRow({ listUrl }: { listUrl: string }) {\n const listsByUrl = useSelector(state => state.lists.byUrl)\n const dispatch = useDispatch()\n const { current: list, pendingUpdate: pending } = listsByUrl[listUrl]\n\n const theme = useTheme()\n const listColor = useListColor(list?.logoURI)\n const isActive = useIsListActive(listUrl)\n\n const [open, toggle] = useToggle(false)\n const node = useRef()\n const [referenceElement, setReferenceElement] = useState()\n const [popperElement, setPopperElement] = useState()\n\n const { styles, attributes } = usePopper(referenceElement, popperElement, {\n placement: 'auto',\n strategy: 'fixed',\n modifiers: [{ name: 'offset', options: { offset: [8, 8] } }]\n })\n\n useOnClickOutside(node, open ? toggle : undefined)\n\n const handleAcceptListUpdate = useCallback(() => {\n if (!pending) return\n ReactGA.event({\n category: 'Lists',\n action: 'Update List from List Select',\n label: listUrl\n })\n dispatch(acceptListUpdate(listUrl))\n }, [dispatch, listUrl, pending])\n\n const handleRemoveList = useCallback(() => {\n ReactGA.event({\n category: 'Lists',\n action: 'Start Remove List',\n label: listUrl\n })\n if (window.prompt(`Please confirm you would like to remove this list by typing REMOVE`) === `REMOVE`) {\n ReactGA.event({\n category: 'Lists',\n action: 'Confirm Remove List',\n label: listUrl\n })\n dispatch(removeList(listUrl))\n }\n }, [dispatch, listUrl])\n\n const handleEnableList = useCallback(() => {\n ReactGA.event({\n category: 'Lists',\n action: 'Enable List',\n label: listUrl\n })\n dispatch(enableList(listUrl))\n }, [dispatch, listUrl])\n\n const handleDisableList = useCallback(() => {\n ReactGA.event({\n category: 'Lists',\n action: 'Disable List',\n label: listUrl\n })\n dispatch(disableList(listUrl))\n }, [dispatch, listUrl])\n\n if (!list) return null\n\n return (\n \n {list.logoURI ? (\n \n ) : (\n
    \n )}\n \n \n {list.name}\n \n \n \n {list.tokens.length} tokens\n \n \n \n \n \n {open && (\n \n
    {list && listVersionLabel(list.version)}
    \n \n View list\n \n Remove list\n \n {pending && (\n Update list\n )}\n
    \n )}\n
    \n
    \n
    \n {\n isActive ? handleDisableList() : handleEnableList()\n }}\n />\n \n )\n})\n\nconst ListContainer = styled.div`\n padding: 1rem;\n height: 100%;\n overflow: auto;\n padding-bottom: 80px;\n`\n\nexport function ManageLists({\n setModalView,\n setImportList,\n setListUrl\n}: {\n setModalView: (view: CurrencyModalView) => void\n setImportList: (list: TokenList) => void\n setListUrl: (url: string) => void\n}) {\n const theme = useTheme()\n\n const [listUrlInput, setListUrlInput] = useState('')\n\n const lists = useAllLists()\n\n // sort by active but only if not visible\n const activeListUrls = useActiveListUrls()\n const [activeCopy, setActiveCopy] = useState()\n useEffect(() => {\n if (!activeCopy && activeListUrls) {\n setActiveCopy(activeListUrls)\n }\n }, [activeCopy, activeListUrls])\n\n const handleInput = useCallback(e => {\n setListUrlInput(e.target.value)\n }, [])\n\n const fetchList = useFetchListCallback()\n\n const validUrl: boolean = useMemo(() => {\n return uriToHttp(listUrlInput).length > 0 || Boolean(parseENSAddress(listUrlInput))\n }, [listUrlInput])\n\n const sortedLists = useMemo(() => {\n const listUrls = Object.keys(lists)\n return listUrls\n .filter(listUrl => {\n // only show loaded lists, hide unsupported lists\n return Boolean(lists[listUrl].current) && !Boolean(UNSUPPORTED_LIST_URLS.includes(listUrl))\n })\n .sort((u1, u2) => {\n const { current: l1 } = lists[u1]\n const { current: l2 } = lists[u2]\n\n // first filter on active lists\n if (activeCopy?.includes(u1) && !activeCopy?.includes(u2)) {\n return -1\n }\n if (!activeCopy?.includes(u1) && activeCopy?.includes(u2)) {\n return 1\n }\n\n if (l1 && l2) {\n return l1.name.toLowerCase() < l2.name.toLowerCase()\n ? -1\n : l1.name.toLowerCase() === l2.name.toLowerCase()\n ? 0\n : 1\n }\n if (l1) return -1\n if (l2) return 1\n return 0\n })\n }, [lists, activeCopy])\n\n // temporary fetched list for import flow\n const [tempList, setTempList] = useState()\n const [addError, setAddError] = useState()\n\n useEffect(() => {\n async function fetchTempList() {\n fetchList(listUrlInput, false)\n .then(list => setTempList(list))\n .catch(() => setAddError('Error importing list'))\n }\n // if valid url, fetch details for card\n if (validUrl) {\n fetchTempList()\n } else {\n setTempList(undefined)\n listUrlInput !== '' && setAddError('Enter valid list location')\n }\n\n // reset error\n if (listUrlInput === '') {\n setAddError(undefined)\n }\n }, [fetchList, listUrlInput, validUrl])\n\n // check if list is already imported\n const isImported = Object.keys(lists).includes(listUrlInput)\n\n // set list values and have parent modal switch to import list view\n const handleImport = useCallback(() => {\n if (!tempList) return\n setImportList(tempList)\n setModalView(CurrencyModalView.importList)\n setListUrl(listUrlInput)\n }, [listUrlInput, setImportList, setListUrl, setModalView, tempList])\n\n return (\n \n \n \n \n \n {addError ? (\n \n {addError}\n \n ) : null}\n \n {tempList && (\n \n \n \n \n {tempList.logoURI && }\n \n {tempList.name}\n {tempList.tokens.length} tokens\n \n \n {isImported ? (\n \n \n \n \n Loaded\n \n ) : (\n \n Import\n \n )}\n \n \n \n )}\n \n \n \n {sortedLists.map(listUrl => (\n \n ))}\n \n \n \n )\n}\n","import React, { useRef, RefObject, useCallback, useState, useMemo } from 'react'\nimport Column from 'components/Column'\nimport { PaddedColumn, Separator, SearchInput } from './styleds'\nimport Row, { RowBetween, RowFixed } from 'components/Row'\nimport { TYPE, ExternalLinkIcon, TrashIcon, ButtonText, ExternalLink } from 'theme'\nimport { useToken } from 'hooks/Tokens'\nimport styled from 'styled-components'\nimport { useUserAddedTokens, useRemoveUserAddedToken } from 'state/user/hooks'\nimport { Token } from '@levinswap/uniswap-sdk'\nimport CurrencyLogo from 'components/CurrencyLogo'\nimport { getEtherscanLink, isAddress } from 'utils'\nimport { useActiveWeb3React } from 'hooks'\nimport Card from 'components/Card'\nimport ImportRow from './ImportRow'\nimport useTheme from 'hooks/useTheme'\n\nimport { CurrencyModalView } from './CurrencySearchModal'\n\nconst Wrapper = styled.div`\n width: 100%;\n height: calc(100% - 60px);\n position: relative;\n padding-bottom: 60px;\n`\n\nconst Footer = styled.div`\n position: absolute;\n bottom: 0;\n width: 100%;\n border-radius: 20px;\n border-top-right-radius: 0;\n border-top-left-radius: 0;\n border-top: 1px solid ${({ theme }) => theme.bg3};\n padding: 20px;\n text-align: center;\n`\n\nexport default function ManageTokens({\n setModalView,\n setImportToken\n}: {\n setModalView: (view: CurrencyModalView) => void\n setImportToken: (token: Token) => void\n}) {\n const { chainId } = useActiveWeb3React()\n\n const [searchQuery, setSearchQuery] = useState('')\n const theme = useTheme()\n\n // manage focus on modal show\n const inputRef = useRef()\n const handleInput = useCallback(event => {\n const input = event.target.value\n const checksummedInput = isAddress(input)\n setSearchQuery(checksummedInput || input)\n }, [])\n\n // if they input an address, use it\n const isAddressSearch = isAddress(searchQuery)\n const searchToken = useToken(searchQuery)\n\n // all tokens for local lisr\n const userAddedTokens: Token[] = useUserAddedTokens()\n const removeToken = useRemoveUserAddedToken()\n\n const handleRemoveAll = useCallback(() => {\n if (chainId && userAddedTokens) {\n userAddedTokens.map(token => {\n return removeToken(chainId, token.address)\n })\n }\n }, [removeToken, userAddedTokens, chainId])\n\n const tokenList = useMemo(() => {\n return (\n chainId &&\n userAddedTokens.map(token => (\n \n \n \n \n \n {token.symbol}\n \n \n \n \n removeToken(chainId, token.address)} />\n \n \n \n ))\n )\n }, [userAddedTokens, chainId, removeToken])\n\n return (\n \n \n \n \n }\n onChange={handleInput}\n />\n \n {searchQuery !== '' && !isAddressSearch && Enter valid token address}\n {searchToken && (\n \n setModalView(CurrencyModalView.importToken)}\n setImportToken={setImportToken}\n style={{ height: 'fit-content' }}\n />\n \n )}\n \n \n \n \n \n {userAddedTokens?.length} Custom {userAddedTokens.length === 1 ? 'Token' : 'Tokens'}\n \n {userAddedTokens.length > 0 && (\n \n Clear all\n \n )}\n \n {tokenList}\n \n \n
    \n Tip: Custom tokens are stored locally in your browser\n
    \n
    \n )\n}\n","import React, { useState } from 'react'\nimport { PaddedColumn, Separator } from './styleds'\nimport { RowBetween } from 'components/Row'\nimport { ArrowLeft } from 'react-feather'\nimport { Text } from 'rebass'\nimport { CloseIcon } from 'theme'\nimport styled from 'styled-components'\nimport { Token } from '@levinswap/uniswap-sdk'\nimport { ManageLists } from './ManageLists'\nimport ManageTokens from './ManageTokens'\nimport { TokenList } from '@uniswap/token-lists'\nimport { CurrencyModalView } from './CurrencySearchModal'\n\nconst Wrapper = styled.div`\n width: 100%;\n position: relative;\n padding-bottom: 80px;\n`\n\nconst ToggleWrapper = styled(RowBetween)`\n background-color: ${({ theme }) => theme.bg3};\n border-radius: 12px;\n padding: 6px;\n`\n\nconst ToggleOption = styled.div<{ active?: boolean }>`\n width: 48%;\n padding: 10px;\n display: flex;\n align-items: center;\n justify-content: center;\n border-radius: 12px;\n font-weight: 600;\n background-color: ${({ theme, active }) => (active ? theme.bg1 : theme.bg3)};\n color: ${({ theme, active }) => (active ? theme.text1 : theme.text2)};\n user-select: none;\n\n :hover {\n cursor: pointer;\n opacity: 0.7;\n }\n`\n\nexport default function Manage({\n onDismiss,\n setModalView,\n setImportList,\n setImportToken,\n setListUrl\n}: {\n onDismiss: () => void\n setModalView: (view: CurrencyModalView) => void\n setImportToken: (token: Token) => void\n setImportList: (list: TokenList) => void\n setListUrl: (url: string) => void\n}) {\n // toggle between tokens and lists\n const [showLists, setShowLists] = useState(true)\n\n return (\n \n \n \n setModalView(CurrencyModalView.search)} />\n \n Manage\n \n \n \n \n \n \n \n setShowLists(!showLists)} active={showLists}>\n Lists\n \n setShowLists(!showLists)} active={!showLists}>\n Tokens\n \n \n \n {showLists ? (\n \n ) : (\n \n )}\n \n )\n}\n","import React, { useState, useCallback } from 'react'\nimport styled from 'styled-components'\nimport ReactGA from 'react-ga'\nimport { TYPE, CloseIcon } from 'theme'\nimport Card from 'components/Card'\nimport { AutoColumn } from 'components/Column'\nimport { RowBetween, RowFixed, AutoRow } from 'components/Row'\nimport { ArrowLeft, AlertTriangle } from 'react-feather'\nimport { transparentize } from 'polished'\nimport { ButtonPrimary } from 'components/Button'\nimport { SectionBreak } from 'components/swap/styleds'\nimport { ExternalLink } from '../../theme/components'\nimport ListLogo from 'components/ListLogo'\nimport { PaddedColumn, Checkbox, TextDot } from './styleds'\nimport { TokenList } from '@uniswap/token-lists'\nimport { useDispatch } from 'react-redux'\nimport { AppDispatch } from 'state'\nimport { useFetchListCallback } from 'hooks/useFetchListCallback'\nimport { removeList, enableList } from 'state/lists/actions'\nimport { CurrencyModalView } from './CurrencySearchModal'\nimport { useAllLists } from 'state/lists/hooks'\nimport useTheme from 'hooks/useTheme'\n\nconst Wrapper = styled.div`\n position: relative;\n width: 100%;\n overflow: auto;\n`\n\ninterface ImportProps {\n listURL: string\n list: TokenList\n onDismiss: () => void\n setModalView: (view: CurrencyModalView) => void\n}\n\nexport function ImportList({ listURL, list, setModalView, onDismiss }: ImportProps) {\n const theme = useTheme()\n const dispatch = useDispatch()\n\n // user must accept\n const [confirmed, setConfirmed] = useState(false)\n\n const lists = useAllLists()\n const fetchList = useFetchListCallback()\n\n // monitor is list is loading\n const adding = Boolean(lists[listURL]?.loadingRequestId)\n const [addError, setAddError] = useState(null)\n\n const handleAddList = useCallback(() => {\n if (adding) return\n setAddError(null)\n fetchList(listURL)\n .then(() => {\n ReactGA.event({\n category: 'Lists',\n action: 'Add List',\n label: listURL\n })\n\n // turn list on\n dispatch(enableList(listURL))\n // go back to lists\n setModalView(CurrencyModalView.manage)\n })\n .catch(error => {\n ReactGA.event({\n category: 'Lists',\n action: 'Add List Failed',\n label: listURL\n })\n setAddError(error.message)\n dispatch(removeList(listURL))\n })\n }, [adding, dispatch, fetchList, listURL, setModalView])\n\n return (\n \n \n \n setModalView(CurrencyModalView.manage)} />\n Import List\n \n \n \n \n \n \n \n \n \n {list.logoURI && }\n \n \n \n {list.name}\n \n \n \n {list.tokens.length} tokens\n \n \n \n \n {listURL}\n \n \n \n \n \n \n \n \n \n \n Import at your own risk{' '}\n \n \n\n \n \n By adding this list you are implicitly trusting that the data is correct. Anyone can create a list,\n including creating fake versions of existing lists and lists that claim to represent projects that do\n not have one.\n \n \n If you purchase a token from this list, you may not be able to sell it back.\n \n \n setConfirmed(!confirmed)}>\n setConfirmed(!confirmed)}\n />\n \n I understand\n \n \n \n\n \n Import\n \n {addError ? (\n \n {addError}\n \n ) : null}\n \n {/* */}\n \n \n )\n}\n","import { Currency, Token } from '@levinswap/uniswap-sdk'\r\nimport React, { useCallback, useEffect, useState } from 'react'\r\nimport useLast from '../../hooks/useLast'\r\nimport Modal from '../Modal'\r\nimport { CurrencySearch } from './CurrencySearch'\r\nimport { ImportToken } from './ImportToken'\r\nimport usePrevious from 'hooks/usePrevious'\r\nimport Manage from './Manage'\r\nimport { TokenList } from '@uniswap/token-lists'\r\nimport { ImportList } from './ImportList'\r\n\r\ninterface CurrencySearchModalProps {\r\n isOpen: boolean\r\n onDismiss: () => void\r\n selectedCurrency?: Currency | null\r\n onCurrencySelect: (currency: Currency) => void\r\n otherSelectedCurrency?: Currency | null\r\n showCommonBases?: boolean\r\n}\r\n\r\nexport enum CurrencyModalView {\r\n search,\r\n manage,\r\n importToken,\r\n importList\r\n}\r\n\r\nexport default function CurrencySearchModal({\r\n isOpen,\r\n onDismiss,\r\n onCurrencySelect,\r\n selectedCurrency,\r\n otherSelectedCurrency,\r\n showCommonBases = false\r\n}: CurrencySearchModalProps) {\r\n const [modalView, setModalView] = useState(CurrencyModalView.manage)\r\n const lastOpen = useLast(isOpen)\r\n\r\n useEffect(() => {\r\n if (isOpen && !lastOpen) {\r\n setModalView(CurrencyModalView.search)\r\n }\r\n }, [isOpen, lastOpen])\r\n\r\n const handleCurrencySelect = useCallback(\r\n (currency: Currency) => {\r\n onCurrencySelect(currency)\r\n onDismiss()\r\n },\r\n [onDismiss, onCurrencySelect]\r\n )\r\n\r\n // for token import view\r\n const prevView = usePrevious(modalView)\r\n\r\n // used for import token flow\r\n const [importToken, setImportToken] = useState()\r\n\r\n // used for import list\r\n const [importList, setImportList] = useState()\r\n const [listURL, setListUrl] = useState()\r\n\r\n // change min height if not searching\r\n const minHeight = modalView === CurrencyModalView.importToken || modalView === CurrencyModalView.importList ? 40 : 80\r\n\r\n return (\r\n \r\n {modalView === CurrencyModalView.search ? (\r\n setModalView(CurrencyModalView.importToken)}\r\n setImportToken={setImportToken}\r\n showManageView={() => setModalView(CurrencyModalView.manage)}\r\n />\r\n ) : modalView === CurrencyModalView.importToken && importToken ? (\r\n \r\n setModalView(prevView && prevView !== CurrencyModalView.importToken ? prevView : CurrencyModalView.search)\r\n }\r\n handleCurrencySelect={handleCurrencySelect}\r\n />\r\n ) : modalView === CurrencyModalView.importList && importList && listURL ? (\r\n \r\n ) : modalView === CurrencyModalView.manage ? (\r\n \r\n ) : (\r\n ''\r\n )}\r\n \r\n )\r\n}\r\n","import { Currency } from '@levinswap/uniswap-sdk'\nimport React from 'react'\nimport styled from 'styled-components'\nimport CurrencyLogo from '../CurrencyLogo'\n\nconst Wrapper = styled.div<{ margin: boolean; sizeraw: number }>`\n position: relative;\n display: flex;\n flex-direction: row;\n margin-right: ${({ sizeraw, margin }) => margin && (sizeraw / 3 + 8).toString() + 'px'};\n`\n\ninterface DoubleCurrencyLogoProps {\n margin?: boolean\n size?: number\n currency0?: Currency\n currency1?: Currency\n}\n\nconst HigherLogo = styled(CurrencyLogo)`\n z-index: 2;\n`\nconst CoveredLogo = styled(CurrencyLogo)<{ sizeraw: number }>`\n position: absolute;\n left: ${({ sizeraw }) => '-' + (sizeraw / 2).toString() + 'px'} !important;\n`\n\nexport default function DoubleCurrencyLogo({\n currency0,\n currency1,\n size = 16,\n margin = false\n}: DoubleCurrencyLogoProps) {\n return (\n \n {currency0 && }\n {currency1 && }\n \n )\n}\n","import React from 'react'\nimport styled from 'styled-components'\nimport { escapeRegExp } from '../../utils'\n\nconst StyledInput = styled.input<{ error?: boolean; fontSize?: string; align?: string }>`\n color: ${({ error, theme }) => (error ? theme.red1 : theme.text1)};\n width: 0;\n position: relative;\n font-weight: 500;\n outline: none;\n border: none;\n flex: 1 1 auto;\n background-color: ${({ theme }) => theme.bg1};\n font-size: ${({ fontSize }) => fontSize ?? '24px'};\n text-align: ${({ align }) => align && align};\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n padding: 0px;\n -webkit-appearance: textfield;\n\n ::-webkit-search-decoration {\n -webkit-appearance: none;\n }\n\n [type='number'] {\n -moz-appearance: textfield;\n }\n\n ::-webkit-outer-spin-button,\n ::-webkit-inner-spin-button {\n -webkit-appearance: none;\n }\n\n ::placeholder {\n color: ${({ theme }) => theme.text4};\n }\n`\n\nconst inputRegex = RegExp(`^\\\\d*(?:\\\\\\\\[.])?\\\\d*$`) // match escaped \".\" characters via in a non-capturing group\n\nexport const Input = React.memo(function InnerInput({\n value,\n onUserInput,\n placeholder,\n ...rest\n}: {\n value: string | number\n onUserInput: (input: string) => void\n error?: boolean\n fontSize?: string\n align?: 'right' | 'left'\n} & Omit, 'ref' | 'onChange' | 'as'>) {\n const enforcer = (nextUserInput: string) => {\n if (nextUserInput === '' || inputRegex.test(escapeRegExp(nextUserInput))) {\n onUserInput(nextUserInput)\n }\n }\n\n return (\n {\n // replace commas with periods, because uniswap exclusively uses period as the decimal separator\n enforcer(event.target.value.replace(/,/g, '.'))\n }}\n // universal input options\n inputMode=\"decimal\"\n title=\"Token Amount\"\n autoComplete=\"off\"\n autoCorrect=\"off\"\n // text-specific options\n type=\"text\"\n pattern=\"^[0-9]*[.,]?[0-9]*$\"\n placeholder={placeholder || '0.0'}\n minLength={1}\n maxLength={79}\n spellCheck=\"false\"\n />\n )\n})\n\nexport default Input\n\n// const inputRegex = RegExp(`^\\\\d*(?:\\\\\\\\[.])?\\\\d*$`) // match escaped \".\" characters via in a non-capturing group\n","function _extends() { _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; return _extends.apply(this, arguments); }\n\nfunction _objectWithoutProperties(source, excluded) { if (source == null) return {}; var target = _objectWithoutPropertiesLoose(source, excluded); var key, i; if (Object.getOwnPropertySymbols) { var sourceSymbolKeys = Object.getOwnPropertySymbols(source); for (i = 0; i < sourceSymbolKeys.length; i++) { key = sourceSymbolKeys[i]; if (excluded.indexOf(key) >= 0) continue; if (!Object.prototype.propertyIsEnumerable.call(source, key)) continue; target[key] = source[key]; } } return target; }\n\nfunction _objectWithoutPropertiesLoose(source, excluded) { if (source == null) return {}; var target = {}; var sourceKeys = Object.keys(source); var key, i; for (i = 0; i < sourceKeys.length; i++) { key = sourceKeys[i]; if (excluded.indexOf(key) >= 0) continue; target[key] = source[key]; } return target; }\n\nimport React from \"react\";\n\nvar _ref2 = /*#__PURE__*/React.createElement(\"path\", {\n d: \"M0.97168 1L6.20532 6L11.439 1\",\n stroke: \"#AEAEAE\"\n});\n\nvar SvgDropdown = function SvgDropdown(_ref) {\n var svgRef = _ref.svgRef,\n title = _ref.title,\n props = _objectWithoutProperties(_ref, [\"svgRef\", \"title\"]);\n\n return /*#__PURE__*/React.createElement(\"svg\", _extends({\n width: 12,\n height: 7,\n viewBox: \"0 0 12 7\",\n fill: \"none\",\n ref: svgRef\n }, props), title ? /*#__PURE__*/React.createElement(\"title\", null, title) : null, _ref2);\n};\n\nvar ForwardRef = /*#__PURE__*/React.forwardRef(function (props, ref) {\n return /*#__PURE__*/React.createElement(SvgDropdown, _extends({\n svgRef: ref\n }, props));\n});\nexport default __webpack_public_path__ + \"static/media/dropdown.7d32d2fa.svg\";\nexport { ForwardRef as ReactComponent };","import { Currency, Pair } from '@levinswap/uniswap-sdk'\r\nimport React, { useState, useContext, useCallback } from 'react'\r\nimport styled, { ThemeContext } from 'styled-components'\r\nimport { darken } from 'polished'\r\nimport { useCurrencyBalance } from '../../state/wallet/hooks'\r\nimport CurrencySearchModal from '../SearchModal/CurrencySearchModal'\r\nimport CurrencyLogo from '../CurrencyLogo'\r\nimport DoubleCurrencyLogo from '../DoubleLogo'\r\nimport { RowBetween } from '../Row'\r\nimport { TYPE } from '../../theme'\r\nimport { Input as NumericalInput } from '../NumericalInput'\r\nimport { ReactComponent as DropDown } from '../../assets/images/dropdown.svg'\r\n\r\nimport { useActiveWeb3React } from '../../hooks'\r\nimport { useTranslation } from 'react-i18next'\r\n\r\nconst InputRow = styled.div<{ selected: boolean }>`\r\n ${({ theme }) => theme.flexRowNoWrap}\r\n align-items: center;\r\n padding: ${({ selected }) => (selected ? '0.75rem 0.5rem 0.75rem 1rem' : '0.75rem 0.75rem 0.75rem 1rem')};\r\n`\r\n\r\nconst CurrencySelect = styled.button<{ selected: boolean }>`\r\n align-items: center;\r\n height: 2.2rem;\r\n font-size: 20px;\r\n font-weight: 500;\r\n background-color: ${({ selected, theme }) => (selected ? theme.bg1 : theme.primary1)};\r\n color: ${({ selected, theme }) => (selected ? theme.text1 : theme.white)};\r\n border-radius: 5px;\r\n box-shadow: ${({ selected }) => (selected ? 'none' : '0px 6px 10px rgba(0, 0, 0, 0.075)')};\r\n outline: none;\r\n cursor: pointer;\r\n user-select: none;\r\n border: none;\r\n padding: 0 0.5rem;\r\n\r\n :focus,\r\n :hover {\r\n background-color: ${({ selected, theme }) => (selected ? theme.bg2 : darken(0.05, theme.primary1))};\r\n }\r\n`\r\n\r\nconst LabelRow = styled.div`\r\n ${({ theme }) => theme.flexRowNoWrap}\r\n align-items: center;\r\n color: ${({ theme }) => theme.text1};\r\n font-size: 0.75rem;\r\n line-height: 1rem;\r\n padding: 0.75rem 1rem 0 1rem;\r\n span:hover {\r\n cursor: pointer;\r\n color: ${({ theme }) => darken(0.2, theme.text2)};\r\n }\r\n`\r\n\r\nconst Aligner = styled.span`\r\n display: flex;\r\n align-items: center;\r\n justify-content: space-between;\r\n`\r\n\r\nconst StyledDropDown = styled(DropDown)<{ selected: boolean }>`\r\n margin: 0 0.25rem 0 0.5rem;\r\n height: 35%;\r\n\r\n path {\r\n stroke: ${({ selected, theme }) => (selected ? theme.text1 : theme.white)};\r\n stroke-width: 1.5px;\r\n }\r\n`\r\n\r\nconst InputPanel = styled.div<{ hideInput?: boolean }>`\r\n ${({ theme }) => theme.flexColumnNoWrap}\r\n position: relative;\r\n border-radius: ${({ hideInput }) => (hideInput ? '8px' : '5px')};\r\n background-color: ${({ theme }) => theme.bg2};\r\n z-index: 1;\r\n`\r\n\r\nconst Container = styled.div<{ hideInput: boolean }>`\r\n border-radius: ${({ hideInput }) => (hideInput ? '8px' : '5px')};\r\n border: 1px solid ${({ theme }) => theme.bg2};\r\n background-color: ${({ theme }) => theme.bg1};\r\n`\r\n\r\nconst StyledTokenName = styled.span<{ active?: boolean }>`\r\n ${({ active }) => (active ? ' margin: 0 0.25rem 0 0.75rem;' : ' margin: 0 0.25rem 0 0.25rem;')}\r\n font-size: ${({ active }) => (active ? '20px' : '16px')};\r\n\r\n`\r\n\r\nconst StyledBalanceMax = styled.button`\r\n height: 28px;\r\n background-color: ${({ theme }) => theme.primary5};\r\n border: 1px solid ${({ theme }) => theme.primary5};\r\n border-radius: 5px;\r\n font-size: 0.875rem;\r\n\r\n font-weight: 500;\r\n cursor: pointer;\r\n margin-right: 0.5rem;\r\n color: ${({ theme }) => theme.primaryText1};\r\n :hover {\r\n border: 1px solid ${({ theme }) => theme.primary1};\r\n }\r\n :focus {\r\n border: 1px solid ${({ theme }) => theme.primary1};\r\n outline: none;\r\n }\r\n\r\n ${({ theme }) => theme.mediaWidth.upToExtraSmall`\r\n margin-right: 0.5rem;\r\n `};\r\n`\r\n\r\ninterface CurrencyInputPanelProps {\r\n value: string\r\n onUserInput: (value: string) => void\r\n onMax?: () => void\r\n showMaxButton: boolean\r\n label?: string\r\n onCurrencySelect?: (currency: Currency) => void\r\n currency?: Currency | null\r\n disableCurrencySelect?: boolean\r\n hideBalance?: boolean\r\n pair?: Pair | null\r\n hideInput?: boolean\r\n otherCurrency?: Currency | null\r\n id: string\r\n showCommonBases?: boolean\r\n customBalanceText?: string\r\n}\r\n\r\nexport default function CurrencyInputPanel({\r\n value,\r\n onUserInput,\r\n onMax,\r\n showMaxButton,\r\n label = 'Input',\r\n onCurrencySelect,\r\n currency,\r\n disableCurrencySelect = false,\r\n hideBalance = false,\r\n pair = null, // used for double token logo\r\n hideInput = false,\r\n otherCurrency,\r\n id,\r\n showCommonBases,\r\n customBalanceText\r\n}: CurrencyInputPanelProps) {\r\n const { t } = useTranslation()\r\n\r\n const [modalOpen, setModalOpen] = useState(false)\r\n const { account } = useActiveWeb3React()\r\n const selectedCurrencyBalance = useCurrencyBalance(account ?? undefined, currency ?? undefined)\r\n const theme = useContext(ThemeContext)\r\n\r\n const handleDismissSearch = useCallback(() => {\r\n setModalOpen(false)\r\n }, [setModalOpen])\r\n\r\n return (\r\n \r\n \r\n {!hideInput && (\r\n \r\n \r\n \r\n {label}\r\n \r\n {account && (\r\n \r\n {!hideBalance && !!currency && selectedCurrencyBalance\r\n ? (customBalanceText ?? 'Balance: ') + selectedCurrencyBalance?.toSignificant(6)\r\n : ' -'}\r\n \r\n )}\r\n \r\n \r\n )}\r\n \r\n {!hideInput && (\r\n <>\r\n {\r\n onUserInput(val)\r\n }}\r\n />\r\n {account && currency && showMaxButton && label !== 'To' && (\r\n MAX\r\n )}\r\n \r\n )}\r\n {\r\n if (!disableCurrencySelect) {\r\n setModalOpen(true)\r\n }\r\n }}\r\n >\r\n \r\n {pair ? (\r\n \r\n ) : currency ? (\r\n \r\n ) : null}\r\n {pair ? (\r\n \r\n {pair?.token0.symbol}:{pair?.token1.symbol}\r\n \r\n ) : (\r\n \r\n {(currency && currency.symbol && currency.symbol.length > 20\r\n ? currency.symbol.slice(0, 4) +\r\n '...' +\r\n currency.symbol.slice(currency.symbol.length - 5, currency.symbol.length)\r\n : currency?.symbol) || t('selectToken')}\r\n \r\n )}\r\n {!disableCurrencySelect && }\r\n \r\n \r\n \r\n \r\n {!disableCurrencySelect && onCurrencySelect && (\r\n \r\n )}\r\n \r\n )\r\n}\r\n","import React from 'react'\r\nimport styled from 'styled-components'\r\nimport { darken } from 'polished'\r\nimport { useTranslation } from 'react-i18next'\r\nimport { NavLink, Link as HistoryLink } from 'react-router-dom'\r\n\r\nimport { ArrowLeft } from 'react-feather'\r\nimport { RowBetween } from '../Row'\r\nimport QuestionHelper from '../QuestionHelper'\r\n\r\nconst Tabs = styled.div`\r\n ${({ theme }) => theme.flexRowNoWrap}\r\n align-items: center;\r\n border-radius: 3rem;\r\n justify-content: space-evenly;\r\n`\r\n\r\nconst activeClassName = 'ACTIVE'\r\n\r\nconst StyledNavLink = styled(NavLink).attrs({\r\n activeClassName\r\n})`\r\n ${({ theme }) => theme.flexRowNoWrap}\r\n align-items: center;\r\n justify-content: center;\r\n height: 3rem;\r\n border-radius: 3rem;\r\n outline: none;\r\n cursor: pointer;\r\n text-decoration: none;\r\n color: ${({ theme }) => theme.text3};\r\n font-size: 16px;\r\n\r\n &.${activeClassName} {\r\n border-radius: 5px;\r\n font-weight: 500;\r\n color: ${({ theme }) => theme.text1};\r\n }\r\n\r\n :hover,\r\n :focus {\r\n color: ${({ theme }) => darken(0.1, theme.text1)};\r\n }\r\n`\r\n\r\nconst StyledNavLinkLiquidity = styled(NavLink).attrs({\r\n activeClassName\r\n})`\r\n ${({ theme }) => theme.flexRowNoWrap}\r\n align-items: center;\r\n justify-content: center;\r\n height: 3rem;\r\n border-radius: 3rem;\r\n margin-left: 15px;\r\n outline: none;\r\n cursor: pointer;\r\n text-decoration: none;\r\n color: ${({ theme }) => theme.text3};\r\n font-size: 16px;\r\n\r\n &.${activeClassName} {\r\n border-radius: 5px;\r\n font-weight: 500;\r\n color: ${({ theme }) => theme.text1};\r\n }\r\n\r\n :hover,\r\n :focus {\r\n color: ${({ theme }) => darken(0.1, theme.text1)};\r\n }\r\n`\r\n\r\nconst ActiveText = styled.div`\r\n font-weight: 500;\r\n font-size: 20px;\r\n`\r\n\r\nconst StyledArrowLeft = styled(ArrowLeft)`\r\n color: ${({ theme }) => theme.text1};\r\n`\r\n\r\nconst SwapMenuStyled = styled.div`\r\n font-weight: 500;\r\n`\r\n\r\nconst RowStyled = styled.div`\r\n display: flex;\r\n align-items: center;\r\n padding: 0px 15px 10px 15px;\r\n position: ;\r\n`\r\n\r\nconst Row = styled.div`\r\n display: flex;\r\n justify-content: space-between;\r\n height: 58px;\r\n`\r\n\r\nexport function SwapPoolTabs({ active }: { active: 'swap' | 'pool' }) {\r\n const { t } = useTranslation()\r\n return (\r\n \r\n active === 'swap'}>\r\n {t('swap')}\r\n \r\n active === 'pool'}>\r\n {t('pool')}\r\n \r\n \r\n )\r\n}\r\n\r\nexport function FindPoolTabs() {\r\n return (\r\n \r\n \r\n \r\n \r\n \r\n Import Pool\r\n \r\n \r\n \r\n )\r\n}\r\n\r\nexport function AddRemoveTabs({ adding, creating }: { adding: boolean; creating: boolean }) {\r\n const { t } = useTranslation()\r\n return (\r\n \r\n \r\n \r\n \r\n {t('swap')}\r\n \r\n \r\n {t('+ Liquidity')}\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n )\r\n}\r\n","import { BigNumber } from '@ethersproject/bignumber'\nimport { Token, TokenAmount } from '@levinswap/uniswap-sdk'\nimport { useTokenContract } from '../hooks/useContract'\nimport { useSingleCallResult } from '../state/multicall/hooks'\n\n// returns undefined if input token is undefined, or fails to get token contract,\n// or contract total supply cannot be fetched\nexport function useTotalSupply(token?: Token): TokenAmount | undefined {\n const contract = useTokenContract(token?.address, false)\n\n const totalSupply: BigNumber = useSingleCallResult(contract, 'totalSupply')?.result?.[0]\n\n return token && totalSupply ? new TokenAmount(token, totalSupply.toString()) : undefined\n}\n","import { Currency, ETHER, Token } from '@levinswap/uniswap-sdk'\n\nexport function currencyId(currency: Currency): string {\n if (currency === ETHER) return 'ETH'\n if (currency instanceof Token) return currency.address\n throw new Error('invalid currency')\n}\n","import styled from 'styled-components'\r\nimport { AutoColumn } from '../Column'\r\n\r\nimport uImage from '../../assets/images/thunder.jpg'\r\nimport xlUnicorn from '../../assets/images/xl_uni.png'\r\nimport noise from '../../assets/images/noise.png'\r\n\r\nexport const TextBox = styled.div`\r\n display: flex;\r\n align-items: center;\r\n justify-content: center;\r\n padding: 4px 12px;\r\n border: 1px solid rgba(255, 255, 255, 0.4);\r\n border-radius: 5px;\r\n width: fit-content;\r\n justify-self: flex-end;\r\n`\r\n\r\nexport const DataCard = styled(AutoColumn)<{ disabled?: boolean }>`\r\n background: radial-gradient(76.02% 75.41% at 1.84% 0%, #ff007a 0%, #2172e5 100%);\r\n border-radius: 5px;\r\n width: 100%;\r\n position: relative;\r\n overflow: hidden;\r\n`\r\n\r\nexport const CardBGImage = styled.span<{ desaturate?: boolean }>`\r\n background: url(${uImage});\r\n width: 1000px;\r\n height: 600px;\r\n position: absolute;\r\n border-radius: 5px;\r\n opacity: 0.4;\r\n top: -100px;\r\n left: -100px;\r\n transform: rotate(-15deg);\r\n user-select: none;\r\n\r\n ${({ desaturate }) => desaturate && `filter: saturate(0)`}\r\n`\r\n\r\nexport const CardBGImageSmaller = styled.span<{ desaturate?: boolean }>`\r\n background: url(${xlUnicorn});\r\n width: 1200px;\r\n height: 1200px;\r\n position: absolute;\r\n border-radius: 5px;\r\n top: -300px;\r\n left: -300px;\r\n opacity: 0.4;\r\n user-select: none;\r\n\r\n ${({ desaturate }) => desaturate && `filter: saturate(0)`}\r\n`\r\n\r\nexport const CardNoise = styled.span`\r\n background: url(${noise});\r\n background-size: cover;\r\n mix-blend-mode: overlay;\r\n border-radius: 5px;\r\n width: 100%;\r\n height: 100%;\r\n opacity: 0.15;\r\n position: absolute;\r\n top: 0;\r\n left: 0;\r\n user-select: none;\r\n`\r\n\r\nexport const CardSection = styled(AutoColumn)<{ disabled?: boolean }>`\r\n padding: 1rem;\r\n z-index: 1;\r\n opacity: ${({ disabled }) => disabled && '0.4'};\r\n`\r\n\r\nexport const Break = styled.div`\r\n width: 100%;\r\n background-color: rgba(255, 255, 255, 0.2);\r\n height: 1px;\r\n`\r\n","import { JSBI, Pair, Percent, TokenAmount } from '@levinswap/uniswap-sdk'\r\nimport { darken } from 'polished'\r\nimport React, { useState } from 'react'\r\nimport { ChevronDown, ChevronUp } from 'react-feather'\r\nimport { Link } from 'react-router-dom'\r\nimport { Text } from 'rebass'\r\nimport styled from 'styled-components'\r\nimport { useTotalSupply } from '../../data/TotalSupply'\r\n\r\nimport { useActiveWeb3React } from '../../hooks'\r\nimport { useTokenBalance } from '../../state/wallet/hooks'\r\nimport { ExternalLink, TYPE, HideExtraSmall, ExtraSmallOnly } from '../../theme'\r\nimport { currencyId } from '../../utils/currencyId'\r\nimport { unwrappedToken } from '../../utils/wrappedCurrency'\r\nimport { ButtonPrimary, ButtonSecondary, ButtonEmpty, ButtonUNIGradient } from '../Button'\r\nimport { transparentize } from 'polished'\r\nimport { CardNoise } from '../earn/styled'\r\n\r\nimport { useColor } from '../../hooks/useColor'\r\n\r\nimport Card, { GreyCard, LightCard } from '../Card'\r\nimport { AutoColumn } from '../Column'\r\nimport CurrencyLogo from '../CurrencyLogo'\r\nimport DoubleCurrencyLogo from '../DoubleLogo'\r\nimport { RowBetween, RowFixed, AutoRow } from '../Row'\r\nimport { Dots } from '../swap/styleds'\r\nimport { BIG_INT_ZERO } from '../../constants'\r\n\r\nexport const FixedHeightRow = styled(RowBetween)`\r\n height: 24px;\r\n`\r\n\r\nexport const HoverCard = styled(Card)`\r\n border: 1px solid transparent;\r\n :hover {\r\n border: 1px solid ${({ theme }) => darken(0.06, theme.bg2)};\r\n }\r\n`\r\nconst StyledPositionCard = styled(LightCard)<{ bgColor: any }>`\r\n border: none;\r\n background: ${({ theme, bgColor }) =>\r\n `radial-gradient(91.85% 100% at 1.84% 0%, ${transparentize(0.8, bgColor)} 0%, ${theme.bg3} 100%) `};\r\n position: relative;\r\n overflow: hidden;\r\n`\r\n\r\ninterface PositionCardProps {\r\n pair: Pair\r\n showUnwrapped?: boolean\r\n border?: string\r\n stakedBalance?: TokenAmount // optional balance to indicate that liquidity is deposited in mining pool\r\n}\r\n\r\nexport function MinimalPositionCard({ pair, showUnwrapped = false, border }: PositionCardProps) {\r\n const { account } = useActiveWeb3React()\r\n\r\n const currency0 = showUnwrapped ? pair.token0 : unwrappedToken(pair.token0)\r\n const currency1 = showUnwrapped ? pair.token1 : unwrappedToken(pair.token1)\r\n\r\n const [showMore, setShowMore] = useState(false)\r\n\r\n const userPoolBalance = useTokenBalance(account ?? undefined, pair.liquidityToken)\r\n const totalPoolTokens = useTotalSupply(pair.liquidityToken)\r\n\r\n const poolTokenPercentage =\r\n !!userPoolBalance && !!totalPoolTokens && JSBI.greaterThanOrEqual(totalPoolTokens.raw, userPoolBalance.raw)\r\n ? new Percent(userPoolBalance.raw, totalPoolTokens.raw)\r\n : undefined\r\n\r\n const [token0Deposited, token1Deposited] =\r\n !!pair &&\r\n !!totalPoolTokens &&\r\n !!userPoolBalance &&\r\n // this condition is a short-circuit in the case where useTokenBalance updates sooner than useTotalSupply\r\n JSBI.greaterThanOrEqual(totalPoolTokens.raw, userPoolBalance.raw)\r\n ? [\r\n pair.getLiquidityValue(pair.token0, totalPoolTokens, userPoolBalance, false),\r\n pair.getLiquidityValue(pair.token1, totalPoolTokens, userPoolBalance, false)\r\n ]\r\n : [undefined, undefined]\r\n\r\n return (\r\n <>\r\n {userPoolBalance && JSBI.greaterThan(userPoolBalance.raw, JSBI.BigInt(0)) ? (\r\n \r\n \r\n \r\n \r\n \r\n Your position\r\n \r\n \r\n \r\n setShowMore(!showMore)}>\r\n \r\n \r\n \r\n {currency0.symbol}/{currency1.symbol}\r\n \r\n \r\n \r\n \r\n {userPoolBalance ? userPoolBalance.toSignificant(4) : '-'}\r\n \r\n \r\n \r\n \r\n \r\n \r\n Your pool share:\r\n \r\n \r\n {poolTokenPercentage ? poolTokenPercentage.toFixed(6) + '%' : '-'}\r\n \r\n \r\n \r\n \r\n {currency0.symbol}:\r\n \r\n {token0Deposited ? (\r\n \r\n \r\n {token0Deposited?.toSignificant(6)}\r\n \r\n \r\n ) : (\r\n '-'\r\n )}\r\n \r\n \r\n \r\n {currency1.symbol}:\r\n \r\n {token1Deposited ? (\r\n \r\n \r\n {token1Deposited?.toSignificant(6)}\r\n \r\n \r\n ) : (\r\n '-'\r\n )}\r\n \r\n \r\n \r\n \r\n ) : (\r\n \r\n \r\n \r\n ⭐️\r\n {' '}\r\n By adding liquidity you'll earn 0.25% of all trades on this pair proportional to your share of the\r\n pool. Fees are added to the pool, accrue in real time and can be claimed by withdrawing your liquidity.\r\n \r\n \r\n )}\r\n \r\n )\r\n}\r\n\r\nexport default function FullPositionCard({ pair, border, stakedBalance }: PositionCardProps) {\r\n const { account } = useActiveWeb3React()\r\n\r\n const currency0 = unwrappedToken(pair.token0)\r\n const currency1 = unwrappedToken(pair.token1)\r\n\r\n const [showMore, setShowMore] = useState(false)\r\n\r\n const userDefaultPoolBalance = useTokenBalance(account ?? undefined, pair.liquidityToken)\r\n const totalPoolTokens = useTotalSupply(pair.liquidityToken)\r\n\r\n // if staked balance balance provided, add to standard liquidity amount\r\n const userPoolBalance = stakedBalance ? userDefaultPoolBalance?.add(stakedBalance) : userDefaultPoolBalance\r\n\r\n const poolTokenPercentage =\r\n !!userPoolBalance && !!totalPoolTokens && JSBI.greaterThanOrEqual(totalPoolTokens.raw, userPoolBalance.raw)\r\n ? new Percent(userPoolBalance.raw, totalPoolTokens.raw)\r\n : undefined\r\n\r\n const [token0Deposited, token1Deposited] =\r\n !!pair &&\r\n !!totalPoolTokens &&\r\n !!userPoolBalance &&\r\n // this condition is a short-circuit in the case where useTokenBalance updates sooner than useTotalSupply\r\n JSBI.greaterThanOrEqual(totalPoolTokens.raw, userPoolBalance.raw)\r\n ? [\r\n pair.getLiquidityValue(pair.token0, totalPoolTokens, userPoolBalance, false),\r\n pair.getLiquidityValue(pair.token1, totalPoolTokens, userPoolBalance, false)\r\n ]\r\n : [undefined, undefined]\r\n\r\n const backgroundColor = useColor(pair?.token0)\r\n\r\n return (\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n {!currency0 || !currency1 ? Loading : `${currency0.symbol}/${currency1.symbol}`}\r\n \r\n {!!stakedBalance && (\r\n \r\n Earning UNI\r\n \r\n \r\n ⚡\r\n \r\n \r\n \r\n )}\r\n \r\n\r\n \r\n setShowMore(!showMore)}\r\n >\r\n {showMore ? (\r\n <>\r\n Manage\r\n \r\n \r\n ) : (\r\n <>\r\n Manage\r\n \r\n \r\n )}\r\n \r\n \r\n \r\n\r\n {showMore && (\r\n \r\n \r\n \r\n Your total pool tokens:\r\n \r\n \r\n {userPoolBalance ? userPoolBalance.toSignificant(4) : '-'}\r\n \r\n \r\n {stakedBalance && (\r\n \r\n \r\n Pool tokens in rewards pool:\r\n \r\n \r\n {stakedBalance.toSignificant(4)}\r\n \r\n \r\n )}\r\n \r\n \r\n \r\n Pooled {currency0.symbol}:\r\n \r\n \r\n {token0Deposited ? (\r\n \r\n \r\n {token0Deposited?.toSignificant(6)}\r\n \r\n \r\n \r\n ) : (\r\n '-'\r\n )}\r\n \r\n\r\n \r\n \r\n \r\n Pooled {currency1.symbol}:\r\n \r\n \r\n {token1Deposited ? (\r\n \r\n \r\n {token1Deposited?.toSignificant(6)}\r\n \r\n \r\n \r\n ) : (\r\n '-'\r\n )}\r\n \r\n\r\n \r\n \r\n Your pool share:\r\n \r\n \r\n {poolTokenPercentage\r\n ? (poolTokenPercentage.toFixed(2) === '0.00' ? '<0.01' : poolTokenPercentage.toFixed(2)) + '%'\r\n : '-'}\r\n \r\n \r\n\r\n \r\n \r\n View accrued fees and analytics\r\n \r\n \r\n {userDefaultPoolBalance && JSBI.greaterThan(userDefaultPoolBalance.raw, BIG_INT_ZERO) && (\r\n \r\n \r\n Add\r\n \r\n \r\n Remove\r\n \r\n \r\n )}\r\n {stakedBalance && JSBI.greaterThan(stakedBalance.raw, BIG_INT_ZERO) && (\r\n \r\n Manage Liquidity in Rewards Pool\r\n \r\n )}\r\n \r\n )}\r\n \r\n \r\n )\r\n}\r\n","import { TokenAmount, Pair, Currency } from '@levinswap/uniswap-sdk'\nimport { useMemo } from 'react'\nimport { abi as IUniswapV2PairABI } from '@uniswap/v2-core/build/IUniswapV2Pair.json'\nimport { Interface } from '@ethersproject/abi'\nimport { useActiveWeb3React } from '../hooks'\n\nimport { useMultipleContractSingleData } from '../state/multicall/hooks'\nimport { wrappedCurrency } from '../utils/wrappedCurrency'\n\nconst PAIR_INTERFACE = new Interface(IUniswapV2PairABI)\n\nexport enum PairState {\n LOADING,\n NOT_EXISTS,\n EXISTS,\n INVALID\n}\n\nexport function usePairs(currencies: [Currency | undefined, Currency | undefined][]): [PairState, Pair | null][] {\n const { chainId } = useActiveWeb3React()\n\n const tokens = useMemo(\n () =>\n currencies.map(([currencyA, currencyB]) => [\n wrappedCurrency(currencyA, chainId),\n wrappedCurrency(currencyB, chainId)\n ]),\n [chainId, currencies]\n )\n\n const pairAddresses = useMemo(\n () =>\n tokens.map(([tokenA, tokenB]) => {\n return tokenA && tokenB && !tokenA.equals(tokenB) ? Pair.getAddress(tokenA, tokenB) : undefined\n }),\n [tokens]\n )\n\n const results = useMultipleContractSingleData(pairAddresses, PAIR_INTERFACE, 'getReserves')\n\n return useMemo(() => {\n return results.map((result, i) => {\n const { result: reserves, loading } = result\n const tokenA = tokens[i][0]\n const tokenB = tokens[i][1]\n\n if (loading) return [PairState.LOADING, null]\n if (!tokenA || !tokenB || tokenA.equals(tokenB)) return [PairState.INVALID, null]\n if (!reserves) return [PairState.NOT_EXISTS, null]\n const { reserve0, reserve1 } = reserves\n const [token0, token1] = tokenA.sortsBefore(tokenB) ? [tokenA, tokenB] : [tokenB, tokenA]\n return [\n PairState.EXISTS,\n new Pair(new TokenAmount(token0, reserve0.toString()), new TokenAmount(token1, reserve1.toString()))\n ]\n })\n }, [results, tokens])\n}\n\nexport function usePair(tokenA?: Currency, tokenB?: Currency): [PairState, Pair | null] {\n return usePairs([[tokenA, tokenB]])[0]\n}\n","import useParsedQueryString from './useParsedQueryString'\n\nexport enum Version {\n v1 = 'v1',\n v2 = 'v2'\n}\n\nexport const DEFAULT_VERSION: Version = Version.v2\n\nexport default function useToggledVersion(): Version {\n const { use } = useParsedQueryString()\n if (!use || typeof use !== 'string') return Version.v2\n if (use.toLowerCase() === 'v1') return Version.v1\n return DEFAULT_VERSION\n}\n","import { parse, ParsedQs } from 'qs'\nimport { useMemo } from 'react'\nimport { useLocation } from 'react-router-dom'\n\nexport default function useParsedQueryString(): ParsedQs {\n const { search } = useLocation()\n return useMemo(\n () => (search && search.length > 1 ? parse(search, { parseArrays: false, ignoreQueryPrefix: true }) : {}),\n [search]\n )\n}\n","import { AddressZero } from '@ethersproject/constants'\nimport {\n BigintIsh,\n Currency,\n CurrencyAmount,\n currencyEquals,\n ETHER,\n JSBI,\n Pair,\n Percent,\n Route,\n Token,\n TokenAmount,\n Trade,\n TradeType,\n WETH\n} from '@levinswap/uniswap-sdk'\nimport { useMemo } from 'react'\nimport { useActiveWeb3React } from '../hooks'\nimport { useAllTokens } from '../hooks/Tokens'\nimport { useV1FactoryContract } from '../hooks/useContract'\nimport { Version } from '../hooks/useToggledVersion'\nimport { NEVER_RELOAD, useSingleCallResult, useSingleContractMultipleData } from '../state/multicall/hooks'\nimport { useETHBalances, useTokenBalance, useTokenBalances } from '../state/wallet/hooks'\n\nexport function useV1ExchangeAddress(tokenAddress?: string): string | undefined {\n const contract = useV1FactoryContract()\n\n const inputs = useMemo(() => [tokenAddress], [tokenAddress])\n return useSingleCallResult(contract, 'getExchange', inputs)?.result?.[0]\n}\n\nexport class MockV1Pair extends Pair {\n constructor(etherAmount: BigintIsh, tokenAmount: TokenAmount) {\n super(tokenAmount, new TokenAmount(WETH[tokenAmount.token.chainId], etherAmount))\n }\n}\n\nfunction useMockV1Pair(inputCurrency?: Currency): MockV1Pair | undefined {\n const token = inputCurrency instanceof Token ? inputCurrency : undefined\n\n const isWETH = Boolean(token && token.equals(WETH[token.chainId]))\n const v1PairAddress = useV1ExchangeAddress(isWETH ? undefined : token?.address)\n const tokenBalance = useTokenBalance(v1PairAddress, token)\n const ETHBalance = useETHBalances([v1PairAddress])[v1PairAddress ?? '']\n\n return useMemo(\n () =>\n token && tokenBalance && ETHBalance && inputCurrency ? new MockV1Pair(ETHBalance.raw, tokenBalance) : undefined,\n [ETHBalance, inputCurrency, token, tokenBalance]\n )\n}\n\n// returns all v1 exchange addresses in the user's token list\nexport function useAllTokenV1Exchanges(): { [exchangeAddress: string]: Token } {\n const allTokens = useAllTokens()\n const factory = useV1FactoryContract()\n const args = useMemo(() => Object.keys(allTokens).map(tokenAddress => [tokenAddress]), [allTokens])\n\n const data = useSingleContractMultipleData(factory, 'getExchange', args, NEVER_RELOAD)\n\n return useMemo(\n () =>\n data?.reduce<{ [exchangeAddress: string]: Token }>((memo, { result }, ix) => {\n if (result?.[0] && result[0] !== AddressZero) {\n memo[result[0]] = allTokens[args[ix][0]]\n }\n return memo\n }, {}) ?? {},\n [allTokens, args, data]\n )\n}\n\n// returns whether any of the tokens in the user's token list have liquidity on v1\nexport function useUserHasLiquidityInAllTokens(): boolean | undefined {\n const { account, chainId } = useActiveWeb3React()\n\n const exchanges = useAllTokenV1Exchanges()\n\n const v1ExchangeLiquidityTokens = useMemo(\n () =>\n chainId ? Object.keys(exchanges).map(address => new Token(chainId, address, 18, 'UNI-V1', 'Uniswap V1')) : [],\n [chainId, exchanges]\n )\n\n const balances = useTokenBalances(account ?? undefined, v1ExchangeLiquidityTokens)\n\n return useMemo(\n () =>\n Object.keys(balances).some(tokenAddress => {\n const b = balances[tokenAddress]?.raw\n return b && JSBI.greaterThan(b, JSBI.BigInt(0))\n }),\n [balances]\n )\n}\n\n/**\n * Returns the trade to execute on V1 to go between input and output token\n */\nexport function useV1Trade(\n isExactIn?: boolean,\n inputCurrency?: Currency,\n outputCurrency?: Currency,\n exactAmount?: CurrencyAmount\n): Trade | undefined {\n // get the mock v1 pairs\n const inputPair = useMockV1Pair(inputCurrency)\n const outputPair = useMockV1Pair(outputCurrency)\n\n const inputIsETH = inputCurrency === ETHER\n const outputIsETH = outputCurrency === ETHER\n\n // construct a direct or through ETH v1 route\n let pairs: Pair[] = []\n if (inputIsETH && outputPair) {\n pairs = [outputPair]\n } else if (outputIsETH && inputPair) {\n pairs = [inputPair]\n }\n // if neither are ETH, it's token-to-token (if they both exist)\n else if (inputPair && outputPair) {\n pairs = [inputPair, outputPair]\n }\n\n const route = inputCurrency && pairs && pairs.length > 0 && new Route(pairs, inputCurrency, outputCurrency)\n let v1Trade: Trade | undefined\n try {\n v1Trade =\n route && exactAmount\n ? new Trade(route, exactAmount, isExactIn ? TradeType.EXACT_INPUT : TradeType.EXACT_OUTPUT)\n : undefined\n } catch (error) {\n console.debug('Failed to create V1 trade', error)\n }\n return v1Trade\n}\n\nexport function getTradeVersion(trade?: Trade): Version | undefined {\n const isV1 = trade?.route?.pairs?.some(pair => pair instanceof MockV1Pair)\n if (isV1) return Version.v1\n if (isV1 === false) return Version.v2\n return undefined\n}\n\n// returns the v1 exchange against which a trade should be executed\nexport function useV1TradeExchangeAddress(trade: Trade | undefined): string | undefined {\n const tokenAddress: string | undefined = useMemo(() => {\n if (!trade) return undefined\n const isV1 = getTradeVersion(trade) === Version.v1\n if (!isV1) return undefined\n return trade.inputAmount instanceof TokenAmount\n ? trade.inputAmount.token.address\n : trade.outputAmount instanceof TokenAmount\n ? trade.outputAmount.token.address\n : undefined\n }, [trade])\n return useV1ExchangeAddress(tokenAddress)\n}\n\nconst ZERO_PERCENT = new Percent('0')\nconst ONE_HUNDRED_PERCENT = new Percent('1')\n\n// returns whether tradeB is better than tradeA by at least a threshold percentage amount\nexport function isTradeBetter(\n tradeA: Trade | undefined,\n tradeB: Trade | undefined,\n minimumDelta: Percent = ZERO_PERCENT\n): boolean | undefined {\n if (tradeA && !tradeB) return false\n if (tradeB && !tradeA) return true\n if (!tradeA || !tradeB) return undefined\n\n if (\n tradeA.tradeType !== tradeB.tradeType ||\n !currencyEquals(tradeA.inputAmount.currency, tradeB.inputAmount.currency) ||\n !currencyEquals(tradeB.outputAmount.currency, tradeB.outputAmount.currency)\n ) {\n throw new Error('Trades are not comparable')\n }\n\n if (minimumDelta.equalTo(ZERO_PERCENT)) {\n return tradeA.executionPrice.lessThan(tradeB.executionPrice)\n } else {\n return tradeA.executionPrice.raw.multiply(minimumDelta.add(ONE_HUNDRED_PERCENT)).lessThan(tradeB.executionPrice)\n }\n}\n","import { createAction } from '@reduxjs/toolkit'\n\nexport enum Field {\n INPUT = 'INPUT',\n OUTPUT = 'OUTPUT'\n}\n\nexport const selectCurrency = createAction<{ field: Field; currencyId: string }>('swap/selectCurrency')\nexport const switchCurrencies = createAction('swap/switchCurrencies')\nexport const typeInput = createAction<{ field: Field; typedValue: string }>('swap/typeInput')\nexport const replaceSwapState = createAction<{\n field: Field\n typedValue: string\n inputCurrencyId?: string\n outputCurrencyId?: string\n recipient: string | null\n}>('swap/replaceSwapState')\nexport const setRecipient = createAction<{ recipient: string | null }>('swap/setRecipient')\n","import { MaxUint256 } from '@ethersproject/constants'\nimport { TransactionResponse } from '@ethersproject/providers'\nimport { Trade, TokenAmount, CurrencyAmount, ETHER } from '@levinswap/uniswap-sdk'\nimport { useCallback, useMemo } from 'react'\nimport { ROUTER_ADDRESS } from '../constants'\nimport { useTokenAllowance } from '../data/Allowances'\nimport { getTradeVersion, useV1TradeExchangeAddress } from '../data/V1'\nimport { Field } from '../state/swap/actions'\nimport { useTransactionAdder, useHasPendingApproval } from '../state/transactions/hooks'\nimport { computeSlippageAdjustedAmounts } from '../utils/prices'\nimport { calculateGasMargin } from '../utils'\nimport { useTokenContract } from './useContract'\nimport { useActiveWeb3React } from './index'\nimport { Version } from './useToggledVersion'\n\nexport enum ApprovalState {\n UNKNOWN,\n NOT_APPROVED,\n PENDING,\n APPROVED\n}\n\n// returns a variable indicating the state of the approval and a function which approves if necessary or early returns\nexport function useApproveCallback(\n amountToApprove?: CurrencyAmount,\n spender?: string\n): [ApprovalState, () => Promise] {\n const { account } = useActiveWeb3React()\n const token = amountToApprove instanceof TokenAmount ? amountToApprove.token : undefined\n const currentAllowance = useTokenAllowance(token, account ?? undefined, spender)\n const pendingApproval = useHasPendingApproval(token?.address, spender)\n\n // check the current approval status\n const approvalState: ApprovalState = useMemo(() => {\n if (!amountToApprove || !spender) return ApprovalState.UNKNOWN\n if (amountToApprove.currency === ETHER) return ApprovalState.APPROVED\n // we might not have enough data to know whether or not we need to approve\n if (!currentAllowance) return ApprovalState.UNKNOWN\n\n // amountToApprove will be defined if currentAllowance is\n return currentAllowance.lessThan(amountToApprove)\n ? pendingApproval\n ? ApprovalState.PENDING\n : ApprovalState.NOT_APPROVED\n : ApprovalState.APPROVED\n }, [amountToApprove, currentAllowance, pendingApproval, spender])\n\n const tokenContract = useTokenContract(token?.address)\n const addTransaction = useTransactionAdder()\n\n const approve = useCallback(async (): Promise => {\n if (approvalState !== ApprovalState.NOT_APPROVED) {\n console.error('approve was called unnecessarily')\n return\n }\n if (!token) {\n console.error('no token')\n return\n }\n\n if (!tokenContract) {\n console.error('tokenContract is null')\n return\n }\n\n if (!amountToApprove) {\n console.error('missing amount to approve')\n return\n }\n\n if (!spender) {\n console.error('no spender')\n return\n }\n\n let useExact = false\n const estimatedGas = await tokenContract.estimateGas.approve(spender, MaxUint256).catch(() => {\n // general fallback for tokens who restrict approval amounts\n useExact = true\n return tokenContract.estimateGas.approve(spender, amountToApprove.raw.toString())\n })\n\n return tokenContract\n .approve(spender, useExact ? amountToApprove.raw.toString() : MaxUint256, {\n gasLimit: calculateGasMargin(estimatedGas)\n })\n .then((response: TransactionResponse) => {\n addTransaction(response, {\n summary: 'Approve ' + amountToApprove.currency.symbol,\n approval: { tokenAddress: token.address, spender: spender }\n })\n })\n .catch((error: Error) => {\n console.debug('Failed to approve token', error)\n throw error\n })\n }, [approvalState, token, tokenContract, amountToApprove, spender, addTransaction])\n\n return [approvalState, approve]\n}\n\n// wraps useApproveCallback in the context of a swap\nexport function useApproveCallbackFromTrade(trade?: Trade, allowedSlippage = 0) {\n const amountToApprove = useMemo(\n () => (trade ? computeSlippageAdjustedAmounts(trade, allowedSlippage)[Field.INPUT] : undefined),\n [trade, allowedSlippage]\n )\n const tradeIsV1 = getTradeVersion(trade) === Version.v1\n const v1ExchangeAddress = useV1TradeExchangeAddress(trade)\n return useApproveCallback(amountToApprove, tradeIsV1 ? v1ExchangeAddress : ROUTER_ADDRESS)\n}\n","import { createAction } from '@reduxjs/toolkit'\n\nexport enum Field {\n CURRENCY_A = 'CURRENCY_A',\n CURRENCY_B = 'CURRENCY_B'\n}\n\nexport const typeInput = createAction<{ field: Field; typedValue: string; noLiquidity: boolean }>('mint/typeInputMint')\nexport const resetMintState = createAction('mint/resetMintState')\n","import { BLOCKED_PRICE_IMPACT_NON_EXPERT } from '../constants'\nimport { CurrencyAmount, Fraction, JSBI, Percent, TokenAmount, Trade } from '@levinswap/uniswap-sdk'\nimport { ALLOWED_PRICE_IMPACT_HIGH, ALLOWED_PRICE_IMPACT_LOW, ALLOWED_PRICE_IMPACT_MEDIUM } from '../constants'\nimport { Field } from '../state/swap/actions'\nimport { basisPointsToPercent } from './index'\n\nconst BASE_FEE = new Percent(JSBI.BigInt(30), JSBI.BigInt(10000))\nconst ONE_HUNDRED_PERCENT = new Percent(JSBI.BigInt(10000), JSBI.BigInt(10000))\nconst INPUT_FRACTION_AFTER_FEE = ONE_HUNDRED_PERCENT.subtract(BASE_FEE)\n\n// computes price breakdown for the trade\nexport function computeTradePriceBreakdown(\n trade?: Trade\n): { priceImpactWithoutFee?: Percent; realizedLPFee?: CurrencyAmount } {\n // for each hop in our trade, take away the x*y=k price impact from 0.25% fees\n // e.g. for 3 tokens/2 hops: 1 - ((1 - .03) * (1-.03))\n const realizedLPFee = !trade\n ? undefined\n : ONE_HUNDRED_PERCENT.subtract(\n trade.route.pairs.reduce(\n (currentFee: Fraction): Fraction => currentFee.multiply(INPUT_FRACTION_AFTER_FEE),\n ONE_HUNDRED_PERCENT\n )\n )\n\n // remove lp fees from price impact\n const priceImpactWithoutFeeFraction = trade && realizedLPFee ? trade.priceImpact.subtract(realizedLPFee) : undefined\n\n // the x*y=k impact\n const priceImpactWithoutFeePercent = priceImpactWithoutFeeFraction\n ? new Percent(priceImpactWithoutFeeFraction?.numerator, priceImpactWithoutFeeFraction?.denominator)\n : undefined\n\n // the amount of the input that accrues to LPs\n const realizedLPFeeAmount =\n realizedLPFee &&\n trade &&\n (trade.inputAmount instanceof TokenAmount\n ? new TokenAmount(trade.inputAmount.token, realizedLPFee.multiply(trade.inputAmount.raw).quotient)\n : CurrencyAmount.ether(realizedLPFee.multiply(trade.inputAmount.raw).quotient))\n\n return { priceImpactWithoutFee: priceImpactWithoutFeePercent, realizedLPFee: realizedLPFeeAmount }\n}\n\n// computes the minimum amount out and maximum amount in for a trade given a user specified allowed slippage in bips\nexport function computeSlippageAdjustedAmounts(\n trade: Trade | undefined,\n allowedSlippage: number\n): { [field in Field]?: CurrencyAmount } {\n const pct = basisPointsToPercent(allowedSlippage)\n return {\n [Field.INPUT]: trade?.maximumAmountIn(pct),\n [Field.OUTPUT]: trade?.minimumAmountOut(pct)\n }\n}\n\nexport function warningSeverity(priceImpact: Percent | undefined): 0 | 1 | 2 | 3 | 4 {\n if (!priceImpact?.lessThan(BLOCKED_PRICE_IMPACT_NON_EXPERT)) return 4\n if (!priceImpact?.lessThan(ALLOWED_PRICE_IMPACT_HIGH)) return 3\n if (!priceImpact?.lessThan(ALLOWED_PRICE_IMPACT_MEDIUM)) return 2\n if (!priceImpact?.lessThan(ALLOWED_PRICE_IMPACT_LOW)) return 1\n return 0\n}\n\nexport function formatExecutionPrice(trade?: Trade, inverted?: boolean): string {\n if (!trade) {\n return ''\n }\n return inverted\n ? `${trade.executionPrice.invert().toSignificant(6)} ${trade.inputAmount.currency.symbol} / ${\n trade.outputAmount.currency.symbol\n }`\n : `${trade.executionPrice.toSignificant(6)} ${trade.outputAmount.currency.symbol} / ${\n trade.inputAmount.currency.symbol\n }`\n}\n","import { Token, TokenAmount } from '@levinswap/uniswap-sdk'\nimport { useMemo } from 'react'\n\nimport { useTokenContract } from '../hooks/useContract'\nimport { useSingleCallResult } from '../state/multicall/hooks'\n\nexport function useTokenAllowance(token?: Token, owner?: string, spender?: string): TokenAmount | undefined {\n const contract = useTokenContract(token?.address, false)\n\n const inputs = useMemo(() => [owner, spender], [owner, spender])\n const allowance = useSingleCallResult(contract, 'allowance', inputs).result\n\n return useMemo(() => (token && allowance ? new TokenAmount(token, allowance.toString()) : undefined), [\n token,\n allowance\n ])\n}\n","import { BigNumber } from 'ethers'\nimport { useSingleCallResult } from '../state/multicall/hooks'\nimport { useMulticallContract } from './useContract'\n\n// gets the current timestamp from the blockchain\nexport default function useCurrentBlockTimestamp(): BigNumber | undefined {\n const multicall = useMulticallContract()\n return useSingleCallResult(multicall, 'getCurrentBlockTimestamp')?.result?.[0]\n}\n","import { BigNumber } from 'ethers'\nimport { useMemo } from 'react'\nimport { useSelector } from 'react-redux'\nimport { AppState } from '../state'\nimport useCurrentBlockTimestamp from './useCurrentBlockTimestamp'\n\n// combines the block timestamp with the user setting to give the deadline that should be used for any submitted transaction\nexport default function useTransactionDeadline(): BigNumber | undefined {\n const ttl = useSelector(state => state.user.userDeadline)\n const blockTimestamp = useCurrentBlockTimestamp()\n return useMemo(() => {\n if (blockTimestamp && ttl) return blockTimestamp.add(ttl)\n return undefined\n }, [blockTimestamp, ttl])\n}\n","import { namehash } from 'ethers/lib/utils'\nimport { useMemo } from 'react'\nimport { useSingleCallResult } from '../state/multicall/hooks'\nimport isZero from '../utils/isZero'\nimport { useENSRegistrarContract, useENSResolverContract } from './useContract'\nimport useDebounce from './useDebounce'\n\n/**\n * Does a lookup for an ENS name to find its address.\n */\nexport default function useENSAddress(ensName?: string | null): { loading: boolean; address: string | null } {\n const debouncedName = useDebounce(ensName, 200)\n const ensNodeArgument = useMemo(() => {\n if (!debouncedName) return [undefined]\n try {\n return debouncedName ? [namehash(debouncedName)] : [undefined]\n } catch (error) {\n return [undefined]\n }\n }, [debouncedName])\n const registrarContract = useENSRegistrarContract(false)\n const resolverAddress = useSingleCallResult(registrarContract, 'resolver', ensNodeArgument)\n const resolverAddressResult = resolverAddress.result?.[0]\n const resolverContract = useENSResolverContract(\n resolverAddressResult && !isZero(resolverAddressResult) ? resolverAddressResult : undefined,\n false\n )\n const addr = useSingleCallResult(resolverContract, 'addr', ensNodeArgument)\n\n const changed = debouncedName !== ensName\n return {\n address: changed ? null : addr.result?.[0] ?? null,\n loading: changed || resolverAddress.loading || addr.loading\n }\n}\n","import { isAddress } from '../utils'\nimport useENSAddress from './useENSAddress'\nimport useENSName from './useENSName'\n\n/**\n * Given a name or address, does a lookup to resolve to an address and name\n * @param nameOrAddress ENS name or address\n */\nexport default function useENS(\n nameOrAddress?: string | null\n): { loading: boolean; address: string | null; name: string | null } {\n const validated = isAddress(nameOrAddress)\n const reverseLookup = useENSName(validated ? validated : undefined)\n const lookup = useENSAddress(nameOrAddress)\n\n return {\n loading: reverseLookup.loading || lookup.loading,\n address: validated ? validated : lookup.address,\n name: reverseLookup.ENSName ? reverseLookup.ENSName : !validated && lookup.address ? nameOrAddress || null : null\n }\n}\n","import { Currency, CurrencyAmount, Pair, Token, Trade } from '@levinswap/uniswap-sdk'\nimport flatMap from 'lodash.flatmap'\nimport { useMemo } from 'react'\n\nimport { BASES_TO_CHECK_TRADES_AGAINST, CUSTOM_BASES } from '../constants'\nimport { PairState, usePairs } from '../data/Reserves'\nimport { wrappedCurrency } from '../utils/wrappedCurrency'\n\nimport { useActiveWeb3React } from './index'\n\nfunction useAllCommonPairs(currencyA?: Currency, currencyB?: Currency): Pair[] {\n const { chainId } = useActiveWeb3React()\n\n const bases: Token[] = chainId ? BASES_TO_CHECK_TRADES_AGAINST[chainId] : []\n\n const [tokenA, tokenB] = chainId\n ? [wrappedCurrency(currencyA, chainId), wrappedCurrency(currencyB, chainId)]\n : [undefined, undefined]\n\n const basePairs: [Token, Token][] = useMemo(\n () =>\n flatMap(bases, (base): [Token, Token][] => bases.map(otherBase => [base, otherBase])).filter(\n ([t0, t1]) => t0.address !== t1.address\n ),\n [bases]\n )\n\n const allPairCombinations: [Token, Token][] = useMemo(\n () =>\n tokenA && tokenB\n ? [\n // the direct pair\n [tokenA, tokenB],\n // token A against all bases\n ...bases.map((base): [Token, Token] => [tokenA, base]),\n // token B against all bases\n ...bases.map((base): [Token, Token] => [tokenB, base]),\n // each base against all bases\n ...basePairs\n ]\n .filter((tokens): tokens is [Token, Token] => Boolean(tokens[0] && tokens[1]))\n .filter(([t0, t1]) => t0.address !== t1.address)\n .filter(([tokenA, tokenB]) => {\n if (!chainId) return true\n const customBases = CUSTOM_BASES[chainId]\n if (!customBases) return true\n\n const customBasesA: Token[] | undefined = customBases[tokenA.address]\n const customBasesB: Token[] | undefined = customBases[tokenB.address]\n\n if (!customBasesA && !customBasesB) return true\n\n if (customBasesA && !customBasesA.find(base => tokenB.equals(base))) return false\n if (customBasesB && !customBasesB.find(base => tokenA.equals(base))) return false\n\n return true\n })\n : [],\n [tokenA, tokenB, bases, basePairs, chainId]\n )\n\n const allPairs = usePairs(allPairCombinations)\n\n // only pass along valid pairs, non-duplicated pairs\n return useMemo(\n () =>\n Object.values(\n allPairs\n // filter out invalid pairs\n .filter((result): result is [PairState.EXISTS, Pair] => Boolean(result[0] === PairState.EXISTS && result[1]))\n // filter out duplicated pairs\n .reduce<{ [pairAddress: string]: Pair }>((memo, [, curr]) => {\n memo[curr.liquidityToken.address] = memo[curr.liquidityToken.address] ?? curr\n return memo\n }, {})\n ),\n [allPairs]\n )\n}\n\n/**\n * Returns the best trade for the exact amount of tokens in to the given token out\n */\nexport function useTradeExactIn(currencyAmountIn?: CurrencyAmount, currencyOut?: Currency): Trade | null {\n const allowedPairs = useAllCommonPairs(currencyAmountIn?.currency, currencyOut)\n return useMemo(() => {\n if (currencyAmountIn && currencyOut && allowedPairs.length > 0) {\n return (\n Trade.bestTradeExactIn(allowedPairs, currencyAmountIn, currencyOut, { maxHops: 3, maxNumResults: 1 })[0] ?? null\n )\n }\n return null\n }, [allowedPairs, currencyAmountIn, currencyOut])\n}\n\n/**\n * Returns the best trade for the token in to the exact amount of token out\n */\nexport function useTradeExactOut(currencyIn?: Currency, currencyAmountOut?: CurrencyAmount): Trade | null {\n const allowedPairs = useAllCommonPairs(currencyIn, currencyAmountOut?.currency)\n\n return useMemo(() => {\n if (currencyIn && currencyAmountOut && allowedPairs.length > 0) {\n return (\n Trade.bestTradeExactOut(allowedPairs, currencyIn, currencyAmountOut, { maxHops: 3, maxNumResults: 1 })[0] ??\n null\n )\n }\n return null\n }, [allowedPairs, currencyIn, currencyAmountOut])\n}\n","import useENS from '../../hooks/useENS'\r\nimport { Version } from '../../hooks/useToggledVersion'\r\nimport { parseUnits } from '@ethersproject/units'\r\nimport { Currency, CurrencyAmount, ETHER, JSBI, Token, TokenAmount, Trade } from '@levinswap/uniswap-sdk'\r\nimport { ParsedQs } from 'qs'\r\nimport { useCallback, useEffect, useState } from 'react'\r\nimport { useDispatch, useSelector } from 'react-redux'\r\nimport { useV1Trade } from '../../data/V1'\r\nimport { useActiveWeb3React } from '../../hooks'\r\nimport { useCurrency } from '../../hooks/Tokens'\r\nimport { useTradeExactIn, useTradeExactOut } from '../../hooks/Trades'\r\nimport useParsedQueryString from '../../hooks/useParsedQueryString'\r\nimport { isAddress } from '../../utils'\r\nimport { AppDispatch, AppState } from '../index'\r\nimport { useCurrencyBalances } from '../wallet/hooks'\r\nimport { Field, replaceSwapState, selectCurrency, setRecipient, switchCurrencies, typeInput } from './actions'\r\nimport { SwapState } from './reducer'\r\nimport useToggledVersion from '../../hooks/useToggledVersion'\r\nimport { useUserSlippageTolerance } from '../user/hooks'\r\nimport { computeSlippageAdjustedAmounts } from '../../utils/prices'\r\n\r\nexport function useSwapState(): AppState['swap'] {\r\n return useSelector(state => state.swap)\r\n}\r\n\r\nexport function useSwapActionHandlers(): {\r\n onCurrencySelection: (field: Field, currency: Currency) => void\r\n onSwitchTokens: () => void\r\n onUserInput: (field: Field, typedValue: string) => void\r\n onChangeRecipient: (recipient: string | null) => void\r\n} {\r\n const dispatch = useDispatch()\r\n const onCurrencySelection = useCallback(\r\n (field: Field, currency: Currency) => {\r\n dispatch(\r\n selectCurrency({\r\n field,\r\n currencyId: currency instanceof Token ? currency.address : currency === ETHER ? 'ETH' : ''\r\n })\r\n )\r\n },\r\n [dispatch]\r\n )\r\n\r\n const onSwitchTokens = useCallback(() => {\r\n dispatch(switchCurrencies())\r\n }, [dispatch])\r\n\r\n const onUserInput = useCallback(\r\n (field: Field, typedValue: string) => {\r\n dispatch(typeInput({ field, typedValue }))\r\n },\r\n [dispatch]\r\n )\r\n\r\n const onChangeRecipient = useCallback(\r\n (recipient: string | null) => {\r\n dispatch(setRecipient({ recipient }))\r\n },\r\n [dispatch]\r\n )\r\n\r\n return {\r\n onSwitchTokens,\r\n onCurrencySelection,\r\n onUserInput,\r\n onChangeRecipient\r\n }\r\n}\r\n\r\n// try to parse a user entered amount for a given token\r\nexport function tryParseAmount(value?: string, currency?: Currency): CurrencyAmount | undefined {\r\n if (!value || !currency) {\r\n return undefined\r\n }\r\n try {\r\n const typedValueParsed = parseUnits(value, currency.decimals).toString()\r\n if (typedValueParsed !== '0') {\r\n return currency instanceof Token\r\n ? new TokenAmount(currency, JSBI.BigInt(typedValueParsed))\r\n : CurrencyAmount.ether(JSBI.BigInt(typedValueParsed))\r\n }\r\n } catch (error) {\r\n // should fail if the user specifies too many decimal places of precision (or maybe exceed max uint?)\r\n console.debug(`Failed to parse input amount: \"${value}\"`, error)\r\n }\r\n // necessary for all paths to return a value\r\n return undefined\r\n}\r\n\r\nconst BAD_RECIPIENT_ADDRESSES: string[] = [\r\n '0xD1A6d788Ce86E467B40e1d139868Ccb7615A5e1b', // v2 factory\r\n '0x21B7e4e9E3Fb3c767c541d765DB7a9fdD521433B', // v2 router 01\r\n '0x21B7e4e9E3Fb3c767c541d765DB7a9fdD521433B' // v2 router 02\r\n]\r\n\r\n/**\r\n * Returns true if any of the pairs or tokens in a trade have the given checksummed address\r\n * @param trade to check for the given address\r\n * @param checksummedAddress address to check in the pairs and tokens\r\n */\r\nfunction involvesAddress(trade: Trade, checksummedAddress: string): boolean {\r\n return (\r\n trade.route.path.some(token => token.address === checksummedAddress) ||\r\n trade.route.pairs.some(pair => pair.liquidityToken.address === checksummedAddress)\r\n )\r\n}\r\n\r\n// from the current swap inputs, compute the best trade and return it.\r\nexport function useDerivedSwapInfo(): {\r\n currencies: { [field in Field]?: Currency }\r\n currencyBalances: { [field in Field]?: CurrencyAmount }\r\n parsedAmount: CurrencyAmount | undefined\r\n v2Trade: Trade | undefined\r\n inputError?: string\r\n v1Trade: Trade | undefined\r\n} {\r\n const { account } = useActiveWeb3React()\r\n\r\n const toggledVersion = useToggledVersion()\r\n\r\n const {\r\n independentField,\r\n typedValue,\r\n [Field.INPUT]: { currencyId: inputCurrencyId },\r\n [Field.OUTPUT]: { currencyId: outputCurrencyId },\r\n recipient\r\n } = useSwapState()\r\n\r\n const inputCurrency = useCurrency(inputCurrencyId)\r\n const outputCurrency = useCurrency(outputCurrencyId)\r\n const recipientLookup = useENS(recipient ?? undefined)\r\n const to: string | null = (recipient === null ? account : recipientLookup.address) ?? null\r\n\r\n const relevantTokenBalances = useCurrencyBalances(account ?? undefined, [\r\n inputCurrency ?? undefined,\r\n outputCurrency ?? undefined\r\n ])\r\n\r\n const isExactIn: boolean = independentField === Field.INPUT\r\n const parsedAmount = tryParseAmount(typedValue, (isExactIn ? inputCurrency : outputCurrency) ?? undefined)\r\n\r\n const bestTradeExactIn = useTradeExactIn(isExactIn ? parsedAmount : undefined, outputCurrency ?? undefined)\r\n const bestTradeExactOut = useTradeExactOut(inputCurrency ?? undefined, !isExactIn ? parsedAmount : undefined)\r\n\r\n const v2Trade = isExactIn ? bestTradeExactIn : bestTradeExactOut\r\n\r\n const currencyBalances = {\r\n [Field.INPUT]: relevantTokenBalances[0],\r\n [Field.OUTPUT]: relevantTokenBalances[1]\r\n }\r\n\r\n const currencies: { [field in Field]?: Currency } = {\r\n [Field.INPUT]: inputCurrency ?? undefined,\r\n [Field.OUTPUT]: outputCurrency ?? undefined\r\n }\r\n\r\n // get link to trade on v1, if a better rate exists\r\n const v1Trade = useV1Trade(isExactIn, currencies[Field.INPUT], currencies[Field.OUTPUT], parsedAmount)\r\n\r\n let inputError: string | undefined\r\n if (!account) {\r\n inputError = 'Connect Wallet'\r\n }\r\n\r\n if (!parsedAmount) {\r\n inputError = inputError ?? 'Enter an amount'\r\n }\r\n\r\n if (!currencies[Field.INPUT] || !currencies[Field.OUTPUT]) {\r\n inputError = inputError ?? 'Select a token'\r\n }\r\n\r\n const formattedTo = isAddress(to)\r\n if (!to || !formattedTo) {\r\n inputError = inputError ?? 'Enter a recipient'\r\n } else {\r\n if (\r\n BAD_RECIPIENT_ADDRESSES.indexOf(formattedTo) !== -1 ||\r\n (bestTradeExactIn && involvesAddress(bestTradeExactIn, formattedTo)) ||\r\n (bestTradeExactOut && involvesAddress(bestTradeExactOut, formattedTo))\r\n ) {\r\n inputError = inputError ?? 'Invalid recipient'\r\n }\r\n }\r\n\r\n const [allowedSlippage] = useUserSlippageTolerance()\r\n\r\n const slippageAdjustedAmounts = v2Trade && allowedSlippage && computeSlippageAdjustedAmounts(v2Trade, allowedSlippage)\r\n\r\n const slippageAdjustedAmountsV1 =\r\n v1Trade && allowedSlippage && computeSlippageAdjustedAmounts(v1Trade, allowedSlippage)\r\n\r\n // compare input balance to max input based on version\r\n const [balanceIn, amountIn] = [\r\n currencyBalances[Field.INPUT],\r\n toggledVersion === Version.v1\r\n ? slippageAdjustedAmountsV1\r\n ? slippageAdjustedAmountsV1[Field.INPUT]\r\n : null\r\n : slippageAdjustedAmounts\r\n ? slippageAdjustedAmounts[Field.INPUT]\r\n : null\r\n ]\r\n\r\n if (balanceIn && amountIn && balanceIn.lessThan(amountIn)) {\r\n inputError = 'Insufficient ' + amountIn.currency.symbol + ' balance'\r\n }\r\n\r\n return {\r\n currencies,\r\n currencyBalances,\r\n parsedAmount,\r\n v2Trade: v2Trade ?? undefined,\r\n inputError,\r\n v1Trade\r\n }\r\n}\r\n\r\nfunction parseCurrencyFromURLParameter(urlParam: any): string {\r\n if (typeof urlParam === 'string') {\r\n const valid = isAddress(urlParam)\r\n if (valid) return valid\r\n if (urlParam.toUpperCase() === 'ETH') return 'ETH'\r\n if (valid === false) return 'ETH'\r\n }\r\n return 'ETH' ?? ''\r\n}\r\n\r\nfunction parseTokenAmountURLParameter(urlParam: any): string {\r\n return typeof urlParam === 'string' && !isNaN(parseFloat(urlParam)) ? urlParam : ''\r\n}\r\n\r\nfunction parseIndependentFieldURLParameter(urlParam: any): Field {\r\n return typeof urlParam === 'string' && urlParam.toLowerCase() === 'output' ? Field.OUTPUT : Field.INPUT\r\n}\r\n\r\nconst ENS_NAME_REGEX = /^[-a-zA-Z0-9@:%._+~#=]{1,256}\\.[a-zA-Z0-9()]{1,6}\\b([-a-zA-Z0-9()@:%_+.~#?&/=]*)?$/\r\nconst ADDRESS_REGEX = /^0x[a-fA-F0-9]{40}$/\r\nfunction validatedRecipient(recipient: any): string | null {\r\n if (typeof recipient !== 'string') return null\r\n const address = isAddress(recipient)\r\n if (address) return address\r\n if (ENS_NAME_REGEX.test(recipient)) return recipient\r\n if (ADDRESS_REGEX.test(recipient)) return recipient\r\n return null\r\n}\r\n\r\nexport function queryParametersToSwapState(parsedQs: ParsedQs): SwapState {\r\n let inputCurrency = parseCurrencyFromURLParameter(parsedQs.inputCurrency)\r\n let outputCurrency = parseCurrencyFromURLParameter(parsedQs.outputCurrency)\r\n if (inputCurrency === outputCurrency) {\r\n if (typeof parsedQs.outputCurrency === 'string') {\r\n inputCurrency = ''\r\n } else {\r\n outputCurrency = ''\r\n }\r\n }\r\n\r\n const recipient = validatedRecipient(parsedQs.recipient)\r\n\r\n return {\r\n [Field.INPUT]: {\r\n currencyId: inputCurrency\r\n },\r\n [Field.OUTPUT]: {\r\n currencyId: outputCurrency\r\n },\r\n typedValue: parseTokenAmountURLParameter(parsedQs.exactAmount),\r\n independentField: parseIndependentFieldURLParameter(parsedQs.exactField),\r\n recipient\r\n }\r\n}\r\n\r\n// updates the swap state to use the defaults for a given network\r\nexport function useDefaultsFromURLSearch():\r\n | { inputCurrencyId: string | undefined; outputCurrencyId: string | undefined }\r\n | undefined {\r\n const { chainId } = useActiveWeb3React()\r\n const dispatch = useDispatch()\r\n const parsedQs = useParsedQueryString()\r\n const [result, setResult] = useState<\r\n { inputCurrencyId: string | undefined; outputCurrencyId: string | undefined } | undefined\r\n >()\r\n\r\n useEffect(() => {\r\n if (!chainId) return\r\n const parsed = queryParametersToSwapState(parsedQs)\r\n\r\n dispatch(\r\n replaceSwapState({\r\n typedValue: parsed.typedValue,\r\n field: parsed.independentField,\r\n inputCurrencyId: parsed[Field.INPUT].currencyId,\r\n outputCurrencyId: parsed[Field.OUTPUT].currencyId,\r\n recipient: parsed.recipient\r\n })\r\n )\r\n\r\n setResult({ inputCurrencyId: parsed[Field.INPUT].currencyId, outputCurrencyId: parsed[Field.OUTPUT].currencyId })\r\n // eslint-disable-next-line react-hooks/exhaustive-deps\r\n }, [dispatch, chainId])\r\n\r\n return result\r\n}\r\n","import { Currency, CurrencyAmount, ETHER, JSBI, Pair, Percent, Price, TokenAmount } from '@levinswap/uniswap-sdk'\nimport { useCallback, useMemo } from 'react'\nimport { useDispatch, useSelector } from 'react-redux'\nimport { PairState, usePair } from '../../data/Reserves'\nimport { useTotalSupply } from '../../data/TotalSupply'\n\nimport { useActiveWeb3React } from '../../hooks'\nimport { wrappedCurrency, wrappedCurrencyAmount } from '../../utils/wrappedCurrency'\nimport { AppDispatch, AppState } from '../index'\nimport { tryParseAmount } from '../swap/hooks'\nimport { useCurrencyBalances } from '../wallet/hooks'\nimport { Field, typeInput } from './actions'\n\nconst ZERO = JSBI.BigInt(0)\n\nexport function useMintState(): AppState['mint'] {\n return useSelector(state => state.mint)\n}\n\nexport function useDerivedMintInfo(\n currencyA: Currency | undefined,\n currencyB: Currency | undefined\n): {\n dependentField: Field\n currencies: { [field in Field]?: Currency }\n pair?: Pair | null\n pairState: PairState\n currencyBalances: { [field in Field]?: CurrencyAmount }\n parsedAmounts: { [field in Field]?: CurrencyAmount }\n price?: Price\n noLiquidity?: boolean\n liquidityMinted?: TokenAmount\n poolTokenPercentage?: Percent\n error?: string\n} {\n const { account, chainId } = useActiveWeb3React()\n\n const { independentField, typedValue, otherTypedValue } = useMintState()\n\n const dependentField = independentField === Field.CURRENCY_A ? Field.CURRENCY_B : Field.CURRENCY_A\n\n // tokens\n const currencies: { [field in Field]?: Currency } = useMemo(\n () => ({\n [Field.CURRENCY_A]: currencyA ?? undefined,\n [Field.CURRENCY_B]: currencyB ?? undefined\n }),\n [currencyA, currencyB]\n )\n\n // pair\n const [pairState, pair] = usePair(currencies[Field.CURRENCY_A], currencies[Field.CURRENCY_B])\n const totalSupply = useTotalSupply(pair?.liquidityToken)\n\n const noLiquidity: boolean =\n pairState === PairState.NOT_EXISTS || Boolean(totalSupply && JSBI.equal(totalSupply.raw, ZERO))\n\n // balances\n const balances = useCurrencyBalances(account ?? undefined, [\n currencies[Field.CURRENCY_A],\n currencies[Field.CURRENCY_B]\n ])\n const currencyBalances: { [field in Field]?: CurrencyAmount } = {\n [Field.CURRENCY_A]: balances[0],\n [Field.CURRENCY_B]: balances[1]\n }\n\n // amounts\n const independentAmount: CurrencyAmount | undefined = tryParseAmount(typedValue, currencies[independentField])\n const dependentAmount: CurrencyAmount | undefined = useMemo(() => {\n if (noLiquidity) {\n if (otherTypedValue && currencies[dependentField]) {\n return tryParseAmount(otherTypedValue, currencies[dependentField])\n }\n return undefined\n } else if (independentAmount) {\n // we wrap the currencies just to get the price in terms of the other token\n const wrappedIndependentAmount = wrappedCurrencyAmount(independentAmount, chainId)\n const [tokenA, tokenB] = [wrappedCurrency(currencyA, chainId), wrappedCurrency(currencyB, chainId)]\n if (tokenA && tokenB && wrappedIndependentAmount && pair) {\n const dependentCurrency = dependentField === Field.CURRENCY_B ? currencyB : currencyA\n const dependentTokenAmount =\n dependentField === Field.CURRENCY_B\n ? pair.priceOf(tokenA).quote(wrappedIndependentAmount)\n : pair.priceOf(tokenB).quote(wrappedIndependentAmount)\n return dependentCurrency === ETHER ? CurrencyAmount.ether(dependentTokenAmount.raw) : dependentTokenAmount\n }\n return undefined\n } else {\n return undefined\n }\n }, [noLiquidity, otherTypedValue, currencies, dependentField, independentAmount, currencyA, chainId, currencyB, pair])\n const parsedAmounts: { [field in Field]: CurrencyAmount | undefined } = {\n [Field.CURRENCY_A]: independentField === Field.CURRENCY_A ? independentAmount : dependentAmount,\n [Field.CURRENCY_B]: independentField === Field.CURRENCY_A ? dependentAmount : independentAmount\n }\n\n const price = useMemo(() => {\n if (noLiquidity) {\n const { [Field.CURRENCY_A]: currencyAAmount, [Field.CURRENCY_B]: currencyBAmount } = parsedAmounts\n if (currencyAAmount && currencyBAmount) {\n return new Price(currencyAAmount.currency, currencyBAmount.currency, currencyAAmount.raw, currencyBAmount.raw)\n }\n return undefined\n } else {\n const wrappedCurrencyA = wrappedCurrency(currencyA, chainId)\n return pair && wrappedCurrencyA ? pair.priceOf(wrappedCurrencyA) : undefined\n }\n }, [chainId, currencyA, noLiquidity, pair, parsedAmounts])\n\n // liquidity minted\n const liquidityMinted = useMemo(() => {\n const { [Field.CURRENCY_A]: currencyAAmount, [Field.CURRENCY_B]: currencyBAmount } = parsedAmounts\n const [tokenAmountA, tokenAmountB] = [\n wrappedCurrencyAmount(currencyAAmount, chainId),\n wrappedCurrencyAmount(currencyBAmount, chainId)\n ]\n if (pair && totalSupply && tokenAmountA && tokenAmountB) {\n return pair.getLiquidityMinted(totalSupply, tokenAmountA, tokenAmountB)\n } else {\n return undefined\n }\n }, [parsedAmounts, chainId, pair, totalSupply])\n\n const poolTokenPercentage = useMemo(() => {\n if (liquidityMinted && totalSupply) {\n return new Percent(liquidityMinted.raw, totalSupply.add(liquidityMinted).raw)\n } else {\n return undefined\n }\n }, [liquidityMinted, totalSupply])\n\n let error: string | undefined\n if (!account) {\n error = 'Connect Wallet'\n }\n\n if (pairState === PairState.INVALID) {\n error = error ?? 'Invalid pair'\n }\n\n if (!parsedAmounts[Field.CURRENCY_A] || !parsedAmounts[Field.CURRENCY_B]) {\n error = error ?? 'Enter an amount'\n }\n\n const { [Field.CURRENCY_A]: currencyAAmount, [Field.CURRENCY_B]: currencyBAmount } = parsedAmounts\n\n if (currencyAAmount && currencyBalances?.[Field.CURRENCY_A]?.lessThan(currencyAAmount)) {\n error = 'Insufficient ' + currencies[Field.CURRENCY_A]?.symbol + ' balance'\n }\n\n if (currencyBAmount && currencyBalances?.[Field.CURRENCY_B]?.lessThan(currencyBAmount)) {\n error = 'Insufficient ' + currencies[Field.CURRENCY_B]?.symbol + ' balance'\n }\n\n return {\n dependentField,\n currencies,\n pair,\n pairState,\n currencyBalances,\n parsedAmounts,\n price,\n noLiquidity,\n liquidityMinted,\n poolTokenPercentage,\n error\n }\n}\n\nexport function useMintActionHandlers(\n noLiquidity: boolean | undefined\n): {\n onFieldAInput: (typedValue: string) => void\n onFieldBInput: (typedValue: string) => void\n} {\n const dispatch = useDispatch()\n\n const onFieldAInput = useCallback(\n (typedValue: string) => {\n dispatch(typeInput({ field: Field.CURRENCY_A, typedValue, noLiquidity: noLiquidity === true }))\n },\n [dispatch, noLiquidity]\n )\n const onFieldBInput = useCallback(\n (typedValue: string) => {\n dispatch(typeInput({ field: Field.CURRENCY_B, typedValue, noLiquidity: noLiquidity === true }))\n },\n [dispatch, noLiquidity]\n )\n\n return {\n onFieldAInput,\n onFieldBInput\n }\n}\n","import { CurrencyAmount, ETHER, JSBI } from '@levinswap/uniswap-sdk'\nimport { MIN_ETH } from '../constants'\n\n/**\n * Given some token amount, return the max that can be spent of it\n * @param currencyAmount to return max of\n */\nexport function maxAmountSpend(currencyAmount?: CurrencyAmount): CurrencyAmount | undefined {\n if (!currencyAmount) return undefined\n if (currencyAmount.currency === ETHER) {\n if (JSBI.greaterThan(currencyAmount.raw, MIN_ETH)) {\n return CurrencyAmount.ether(JSBI.subtract(currencyAmount.raw, MIN_ETH))\n } else {\n return CurrencyAmount.ether(JSBI.BigInt(0))\n }\n }\n return currencyAmount\n}\n","import React from 'react'\r\nimport styled from 'styled-components'\r\n\r\nexport const BodyWrapper = styled.div`\r\n position: relative;\r\n max-width: 550px;\r\n width: 100%;\r\n background: ${({ theme }) => theme.bg1};\r\n box-shadow: 0px 0px 1px rgba(0, 0, 0, 0.01), 0px 4px 8px rgba(0, 0, 0, 0.04), 0px 16px 24px rgba(0, 0, 0, 0.04),\r\n 0px 24px 32px rgba(0, 0, 0, 0.01);\r\n border-radius: 5px;\r\n padding: 1rem;\r\n`\r\n\r\n/**\r\n * The styled container element that wraps the content of most pages and the tabs.\r\n */\r\nexport default function AppBody({ children }: { children: React.ReactNode }) {\r\n return {children}\r\n}\r\n","import { Text } from 'rebass'\r\nimport styled from 'styled-components'\r\n\r\nexport const Wrapper = styled.div`\r\n position: relative;\r\n`\r\n\r\nexport const ClickableText = styled(Text)`\r\n :hover {\r\n cursor: pointer;\r\n }\r\n color: ${({ theme }) => theme.primary1};\r\n`\r\nexport const MaxButton = styled.button<{ width: string }>`\r\n padding: 0.5rem 1rem;\r\n background-color: ${({ theme }) => theme.primary5};\r\n border: 1px solid ${({ theme }) => theme.primary5};\r\n border-radius: 5px;\r\n font-size: 1rem;\r\n ${({ theme }) => theme.mediaWidth.upToSmall`\r\n padding: 0.25rem 0.5rem;\r\n `};\r\n font-weight: 500;\r\n cursor: pointer;\r\n margin: 0.25rem;\r\n overflow: hidden;\r\n color: ${({ theme }) => theme.white};\r\n :hover {\r\n border: 1px solid ${({ theme }) => theme.primary1};\r\n }\r\n :focus {\r\n border: 1px solid ${({ theme }) => theme.primary1};\r\n outline: none;\r\n }\r\n`\r\n\r\nexport const Dots = styled.span`\r\n &::after {\r\n display: inline-block;\r\n animation: ellipsis 1.25s infinite;\r\n content: '.';\r\n width: 1em;\r\n text-align: left;\r\n }\r\n @keyframes ellipsis {\r\n 0% {\r\n content: '.';\r\n }\r\n 33% {\r\n content: '..';\r\n }\r\n 66% {\r\n content: '...';\r\n }\r\n }\r\n`\r\n","import { Currency, CurrencyAmount, Fraction, Percent } from '@levinswap/uniswap-sdk'\nimport React from 'react'\nimport { Text } from 'rebass'\nimport { ButtonPrimary } from '../../components/Button'\nimport { RowBetween, RowFixed } from '../../components/Row'\nimport CurrencyLogo from '../../components/CurrencyLogo'\nimport { Field } from '../../state/mint/actions'\nimport { TYPE } from '../../theme'\n\nexport function ConfirmAddModalBottom({\n noLiquidity,\n price,\n currencies,\n parsedAmounts,\n poolTokenPercentage,\n onAdd\n}: {\n noLiquidity?: boolean\n price?: Fraction\n currencies: { [field in Field]?: Currency }\n parsedAmounts: { [field in Field]?: CurrencyAmount }\n poolTokenPercentage?: Percent\n onAdd: () => void\n}) {\n return (\n <>\n \n {currencies[Field.CURRENCY_A]?.symbol} Deposited\n \n \n {parsedAmounts[Field.CURRENCY_A]?.toSignificant(6)}\n \n \n \n {currencies[Field.CURRENCY_B]?.symbol} Deposited\n \n \n {parsedAmounts[Field.CURRENCY_B]?.toSignificant(6)}\n \n \n \n Rates\n \n {`1 ${currencies[Field.CURRENCY_A]?.symbol} = ${price?.toSignificant(4)} ${\n currencies[Field.CURRENCY_B]?.symbol\n }`}\n \n \n \n \n {`1 ${currencies[Field.CURRENCY_B]?.symbol} = ${price?.invert().toSignificant(4)} ${\n currencies[Field.CURRENCY_A]?.symbol\n }`}\n \n \n \n Share of Pool:\n {noLiquidity ? '100' : poolTokenPercentage?.toSignificant(4)}%\n \n \n \n {noLiquidity ? 'Create Pool & Supply' : 'Confirm Supply'}\n \n \n \n )\n}\n","import { Currency, Percent, Price } from '@levinswap/uniswap-sdk'\nimport React, { useContext } from 'react'\nimport { Text } from 'rebass'\nimport { ThemeContext } from 'styled-components'\nimport { AutoColumn } from '../../components/Column'\nimport { AutoRow } from '../../components/Row'\nimport { ONE_BIPS } from '../../constants'\nimport { Field } from '../../state/mint/actions'\nimport { TYPE } from '../../theme'\n\nexport function PoolPriceBar({\n currencies,\n noLiquidity,\n poolTokenPercentage,\n price\n}: {\n currencies: { [field in Field]?: Currency }\n noLiquidity?: boolean\n poolTokenPercentage?: Percent\n price?: Price\n}) {\n const theme = useContext(ThemeContext)\n return (\n \n \n \n {price?.toSignificant(6) ?? '-'}\n \n {currencies[Field.CURRENCY_B]?.symbol} per {currencies[Field.CURRENCY_A]?.symbol}\n \n \n \n {price?.invert()?.toSignificant(6) ?? '-'}\n \n {currencies[Field.CURRENCY_A]?.symbol} per {currencies[Field.CURRENCY_B]?.symbol}\n \n \n \n \n {noLiquidity && price\n ? '100'\n : (poolTokenPercentage?.lessThan(ONE_BIPS) ? '<0.01' : poolTokenPercentage?.toFixed(2)) ?? '0'}\n %\n \n \n Share of Pool\n \n \n \n \n )\n}\n","import { Interface } from '@ethersproject/abi'\nimport { abi as STAKING_REWARDS_ABI } from '@uniswap/liquidity-staker/build/StakingRewards.json'\nimport { abi as STAKING_REWARDS_FACTORY_ABI } from '@uniswap/liquidity-staker/build/StakingRewardsFactory.json'\n\nconst STAKING_REWARDS_INTERFACE = new Interface(STAKING_REWARDS_ABI)\n\nconst STAKING_REWARDS_FACTORY_INTERFACE = new Interface(STAKING_REWARDS_FACTORY_ABI)\n\nexport { STAKING_REWARDS_FACTORY_INTERFACE, STAKING_REWARDS_INTERFACE }\n","import { ChainId, CurrencyAmount, JSBI, Token, TokenAmount, WETH, Pair } from '@levinswap/uniswap-sdk'\r\nimport { useMemo } from 'react'\r\nimport { UNI, USDC } from '../../constants'\r\nimport { STAKING_REWARDS_INTERFACE } from '../../constants/abis/staking-rewards'\r\nimport { useActiveWeb3React } from '../../hooks'\r\nimport { NEVER_RELOAD, useMultipleContractSingleData } from '../multicall/hooks'\r\nimport { tryParseAmount } from '../swap/hooks'\r\nimport useCurrentBlockTimestamp from 'hooks/useCurrentBlockTimestamp'\r\n\r\nexport const STAKING_GENESIS = 1600387200\r\nexport const REWARDS_DURATION_DAYS = 60\r\n\r\n// TODO add staking rewards addresses here\r\nexport const STAKING_REWARDS_INFO: {\r\n [chainId in ChainId]?: {\r\n tokens: [Token, Token]\r\n stakingRewardAddress: string\r\n }[]\r\n} = {\r\n [ChainId.XDAI]: [\r\n {\r\n tokens: [WETH[ChainId.MAINNET], USDC],\r\n stakingRewardAddress: '0x7FBa4B8Dc5E7616e59622806932DBea72537A56b'\r\n }\r\n ]\r\n}\r\n\r\nexport interface StakingInfo {\r\n // the address of the reward contract\r\n stakingRewardAddress: string\r\n // the tokens involved in this pair\r\n tokens: [Token, Token]\r\n // the amount of token currently staked, or undefined if no account\r\n stakedAmount: TokenAmount\r\n // the amount of reward token earned by the active account, or undefined if no account\r\n earnedAmount: TokenAmount\r\n // the total amount of token staked in the contract\r\n totalStakedAmount: TokenAmount\r\n // the amount of token distributed per second to all LPs, constant\r\n totalRewardRate: TokenAmount\r\n // the current amount of token distributed to the active account per second.\r\n // equivalent to percent of total supply * reward rate\r\n rewardRate: TokenAmount\r\n // when the period ends\r\n periodFinish: Date | undefined\r\n // if pool is active\r\n active: boolean\r\n // calculates a hypothetical amount of token distributed to the active account per second.\r\n getHypotheticalRewardRate: (\r\n stakedAmount: TokenAmount,\r\n totalStakedAmount: TokenAmount,\r\n totalRewardRate: TokenAmount\r\n ) => TokenAmount\r\n}\r\n\r\n// // gets the staking info from the network for the active chain id\r\nexport function useStakingInfo(pairToFilterBy?: Pair | null): StakingInfo[] {\r\n const { chainId, account } = useActiveWeb3React()\r\n\r\n // detect if staking is ended\r\n const currentBlockTimestamp = useCurrentBlockTimestamp()\r\n\r\n const info = useMemo(\r\n () =>\r\n chainId\r\n ? STAKING_REWARDS_INFO[chainId]?.filter(stakingRewardInfo =>\r\n pairToFilterBy === undefined\r\n ? true\r\n : pairToFilterBy === null\r\n ? false\r\n : pairToFilterBy.involvesToken(stakingRewardInfo.tokens[0]) &&\r\n pairToFilterBy.involvesToken(stakingRewardInfo.tokens[1])\r\n ) ?? []\r\n : [],\r\n [chainId, pairToFilterBy]\r\n )\r\n\r\n const uni = chainId ? UNI[chainId] : undefined\r\n\r\n const rewardsAddresses = useMemo(() => info.map(({ stakingRewardAddress }) => stakingRewardAddress), [info])\r\n\r\n const accountArg = useMemo(() => [account ?? undefined], [account])\r\n\r\n // get all the info from the staking rewards contracts\r\n const balances = useMultipleContractSingleData(rewardsAddresses, STAKING_REWARDS_INTERFACE, 'balanceOf', accountArg)\r\n const earnedAmounts = useMultipleContractSingleData(rewardsAddresses, STAKING_REWARDS_INTERFACE, 'earned', accountArg)\r\n const totalSupplies = useMultipleContractSingleData(rewardsAddresses, STAKING_REWARDS_INTERFACE, 'totalSupply')\r\n\r\n // tokens per second, constants\r\n const rewardRates = useMultipleContractSingleData(\r\n rewardsAddresses,\r\n STAKING_REWARDS_INTERFACE,\r\n 'rewardRate',\r\n undefined,\r\n NEVER_RELOAD\r\n )\r\n const periodFinishes = useMultipleContractSingleData(\r\n rewardsAddresses,\r\n STAKING_REWARDS_INTERFACE,\r\n 'periodFinish',\r\n undefined,\r\n NEVER_RELOAD\r\n )\r\n\r\n return useMemo(() => {\r\n if (!chainId || !uni) return []\r\n\r\n return rewardsAddresses.reduce((memo, rewardsAddress, index) => {\r\n // these two are dependent on account\r\n const balanceState = balances[index]\r\n const earnedAmountState = earnedAmounts[index]\r\n\r\n // these get fetched regardless of account\r\n const totalSupplyState = totalSupplies[index]\r\n const rewardRateState = rewardRates[index]\r\n const periodFinishState = periodFinishes[index]\r\n\r\n if (\r\n // these may be undefined if not logged in\r\n !balanceState?.loading &&\r\n !earnedAmountState?.loading &&\r\n // always need these\r\n totalSupplyState &&\r\n !totalSupplyState.loading &&\r\n rewardRateState &&\r\n !rewardRateState.loading &&\r\n periodFinishState &&\r\n !periodFinishState.loading\r\n ) {\r\n if (\r\n balanceState?.error ||\r\n earnedAmountState?.error ||\r\n totalSupplyState.error ||\r\n rewardRateState.error ||\r\n periodFinishState.error\r\n ) {\r\n // console.error('Failed to load staking rewards info')\r\n return memo\r\n }\r\n\r\n // get the LP token\r\n const tokens = info[index].tokens\r\n const dummyPair = new Pair(new TokenAmount(tokens[0], '0'), new TokenAmount(tokens[1], '0'))\r\n\r\n // check for account, if no account set to 0\r\n\r\n const stakedAmount = new TokenAmount(dummyPair.liquidityToken, JSBI.BigInt(balanceState?.result?.[0] ?? 0))\r\n const totalStakedAmount = new TokenAmount(dummyPair.liquidityToken, JSBI.BigInt(totalSupplyState.result?.[0]))\r\n const totalRewardRate = new TokenAmount(uni, JSBI.BigInt(rewardRateState.result?.[0]))\r\n\r\n const getHypotheticalRewardRate = (\r\n stakedAmount: TokenAmount,\r\n totalStakedAmount: TokenAmount,\r\n totalRewardRate: TokenAmount\r\n ): TokenAmount => {\r\n return new TokenAmount(\r\n uni,\r\n JSBI.greaterThan(totalStakedAmount.raw, JSBI.BigInt(0))\r\n ? JSBI.divide(JSBI.multiply(totalRewardRate.raw, stakedAmount.raw), totalStakedAmount.raw)\r\n : JSBI.BigInt(0)\r\n )\r\n }\r\n\r\n const individualRewardRate = getHypotheticalRewardRate(stakedAmount, totalStakedAmount, totalRewardRate)\r\n\r\n const periodFinishSeconds = periodFinishState.result?.[0]?.toNumber()\r\n const periodFinishMs = periodFinishSeconds * 1000\r\n\r\n // compare period end timestamp vs current block timestamp (in seconds)\r\n const active =\r\n periodFinishSeconds && currentBlockTimestamp ? periodFinishSeconds > currentBlockTimestamp.toNumber() : true\r\n\r\n memo.push({\r\n stakingRewardAddress: rewardsAddress,\r\n tokens: info[index].tokens,\r\n periodFinish: periodFinishMs > 0 ? new Date(periodFinishMs) : undefined,\r\n earnedAmount: new TokenAmount(uni, JSBI.BigInt(earnedAmountState?.result?.[0] ?? 0)),\r\n rewardRate: individualRewardRate,\r\n totalRewardRate: totalRewardRate,\r\n stakedAmount: stakedAmount,\r\n totalStakedAmount: totalStakedAmount,\r\n getHypotheticalRewardRate,\r\n active\r\n })\r\n }\r\n return memo\r\n }, [])\r\n }, [\r\n balances,\r\n chainId,\r\n currentBlockTimestamp,\r\n earnedAmounts,\r\n info,\r\n periodFinishes,\r\n rewardRates,\r\n rewardsAddresses,\r\n totalSupplies,\r\n uni\r\n ])\r\n}\r\n\r\nexport function useTotalUniEarned(): TokenAmount | undefined {\r\n const { chainId } = useActiveWeb3React()\r\n const uni = chainId ? UNI[chainId] : undefined\r\n const stakingInfos = useStakingInfo()\r\n\r\n return useMemo(() => {\r\n if (!uni) return undefined\r\n return (\r\n stakingInfos?.reduce(\r\n (accumulator, stakingInfo) => accumulator.add(stakingInfo.earnedAmount),\r\n new TokenAmount(uni, '0')\r\n ) ?? new TokenAmount(uni, '0')\r\n )\r\n }, [stakingInfos, uni])\r\n}\r\n\r\n// based on typed value\r\nexport function useDerivedStakeInfo(\r\n typedValue: string,\r\n stakingToken: Token,\r\n userLiquidityUnstaked: TokenAmount | undefined\r\n): {\r\n parsedAmount?: CurrencyAmount\r\n error?: string\r\n} {\r\n const { account } = useActiveWeb3React()\r\n\r\n const parsedInput: CurrencyAmount | undefined = tryParseAmount(typedValue, stakingToken)\r\n\r\n const parsedAmount =\r\n parsedInput && userLiquidityUnstaked && JSBI.lessThanOrEqual(parsedInput.raw, userLiquidityUnstaked.raw)\r\n ? parsedInput\r\n : undefined\r\n\r\n let error: string | undefined\r\n if (!account) {\r\n error = 'Connect Wallet'\r\n }\r\n if (!parsedAmount) {\r\n error = error ?? 'Enter an amount'\r\n }\r\n\r\n return {\r\n parsedAmount,\r\n error\r\n }\r\n}\r\n\r\n// based on typed value\r\nexport function useDerivedUnstakeInfo(\r\n typedValue: string,\r\n stakingAmount: TokenAmount\r\n): {\r\n parsedAmount?: CurrencyAmount\r\n error?: string\r\n} {\r\n const { account } = useActiveWeb3React()\r\n\r\n const parsedInput: CurrencyAmount | undefined = tryParseAmount(typedValue, stakingAmount.token)\r\n\r\n const parsedAmount = parsedInput && JSBI.lessThanOrEqual(parsedInput.raw, stakingAmount.raw) ? parsedInput : undefined\r\n\r\n let error: string | undefined\r\n if (!account) {\r\n error = 'Connect Wallet'\r\n }\r\n if (!parsedAmount) {\r\n error = error ?? 'Enter an amount'\r\n }\r\n\r\n return {\r\n parsedAmount,\r\n error\r\n }\r\n}\r\n","import { BigNumber } from '@ethersproject/bignumber'\r\nimport { TransactionResponse } from '@ethersproject/providers'\r\nimport { Currency, currencyEquals, ETHER, TokenAmount, WETH } from '@levinswap/uniswap-sdk'\r\nimport React, { useCallback, useContext, useState } from 'react'\r\nimport { Plus } from 'react-feather'\r\nimport ReactGA from 'react-ga'\r\nimport { RouteComponentProps } from 'react-router-dom'\r\nimport { Text } from 'rebass'\r\nimport { ThemeContext } from 'styled-components'\r\nimport { ButtonError, ButtonLight, ButtonPrimary } from '../../components/Button'\r\nimport { BlueCard, LightCard } from '../../components/Card'\r\nimport { AutoColumn, ColumnCenter } from '../../components/Column'\r\nimport TransactionConfirmationModal, { ConfirmationModalContent } from '../../components/TransactionConfirmationModal'\r\nimport CurrencyInputPanel from '../../components/CurrencyInputPanel'\r\nimport DoubleCurrencyLogo from '../../components/DoubleLogo'\r\nimport { AddRemoveTabs } from '../../components/NavigationTabs'\r\nimport { MinimalPositionCard } from '../../components/PositionCard'\r\nimport Row, { RowBetween, RowFlat } from '../../components/Row'\r\n\r\nimport { ROUTER_ADDRESS } from '../../constants'\r\nimport { PairState } from '../../data/Reserves'\r\nimport { useActiveWeb3React } from '../../hooks'\r\nimport { useCurrency } from '../../hooks/Tokens'\r\nimport { ApprovalState, useApproveCallback } from '../../hooks/useApproveCallback'\r\nimport useTransactionDeadline from '../../hooks/useTransactionDeadline'\r\nimport { useWalletModalToggle } from '../../state/application/hooks'\r\nimport { Field } from '../../state/mint/actions'\r\nimport { useDerivedMintInfo, useMintActionHandlers, useMintState } from '../../state/mint/hooks'\r\n\r\nimport { useTransactionAdder } from '../../state/transactions/hooks'\r\nimport { useIsExpertMode, useUserSlippageTolerance } from '../../state/user/hooks'\r\nimport { TYPE } from '../../theme'\r\nimport { /* calculateGasMargin, */ calculateSlippageAmount, getRouterContract } from '../../utils'\r\nimport { maxAmountSpend } from '../../utils/maxAmountSpend'\r\nimport { wrappedCurrency } from '../../utils/wrappedCurrency'\r\nimport AppBody from '../AppBody'\r\nimport { Dots, Wrapper } from '../Pool/styleds'\r\nimport { ConfirmAddModalBottom } from './ConfirmAddModalBottom'\r\nimport { currencyId } from '../../utils/currencyId'\r\nimport { PoolPriceBar } from './PoolPriceBar'\r\nimport { StyledInternalLink, HideSmall } from '../../theme'\r\nimport FullPositionCard from '../../components/PositionCard'\r\nimport Card from '../../components/Card'\r\nimport styled from 'styled-components'\r\nimport { useTokenBalancesWithLoadingIndicator } from '../../state/wallet/hooks'\r\nimport { useMemo } from 'react'\r\nimport { toV2LiquidityToken, useTrackedTokenPairs } from '../../state/user/hooks'\r\nimport { usePairs } from '../../data/Reserves'\r\nimport { Pair, JSBI } from '@levinswap/uniswap-sdk'\r\nimport { useStakingInfo } from '../../state/stake/hooks'\r\nimport { BIG_INT_ZERO } from '../../constants'\r\nimport { useUserHasLiquidityInAllTokens } from '../../data/V1'\r\n\r\nexport default function AddLiquidity({\r\n match: {\r\n params: { currencyIdA, currencyIdB }\r\n },\r\n history\r\n}: RouteComponentProps<{ currencyIdA?: string; currencyIdB?: string }>) {\r\n const { account, chainId, library } = useActiveWeb3React()\r\n const theme = useContext(ThemeContext)\r\n\r\n const currencyA = useCurrency(currencyIdA)\r\n const currencyB = useCurrency(currencyIdB)\r\n\r\n const oneCurrencyIsWETH = Boolean(\r\n chainId &&\r\n ((currencyA && currencyEquals(currencyA, WETH[chainId])) ||\r\n (currencyB && currencyEquals(currencyB, WETH[chainId])))\r\n )\r\n\r\n const toggleWalletModal = useWalletModalToggle() // toggle wallet when disconnected\r\n\r\n const expertMode = useIsExpertMode()\r\n\r\n // mint state\r\n const { independentField, typedValue, otherTypedValue } = useMintState()\r\n const {\r\n dependentField,\r\n currencies,\r\n pair,\r\n pairState,\r\n currencyBalances,\r\n parsedAmounts,\r\n price,\r\n noLiquidity,\r\n liquidityMinted,\r\n poolTokenPercentage,\r\n error\r\n } = useDerivedMintInfo(currencyA ?? undefined, currencyB ?? undefined)\r\n const { onFieldAInput, onFieldBInput } = useMintActionHandlers(noLiquidity)\r\n\r\n const isValid = !error\r\n\r\n // modal and loading\r\n const [showConfirm, setShowConfirm] = useState(false)\r\n const [attemptingTxn, setAttemptingTxn] = useState(false) // clicked confirm\r\n\r\n // txn values\r\n const deadline = useTransactionDeadline() // custom from users settings\r\n const [allowedSlippage] = useUserSlippageTolerance() // custom from users\r\n const [txHash, setTxHash] = useState('')\r\n\r\n // get formatted amounts\r\n const formattedAmounts = {\r\n [independentField]: typedValue,\r\n [dependentField]: noLiquidity ? otherTypedValue : parsedAmounts[dependentField]?.toSignificant(6) ?? ''\r\n }\r\n\r\n // get the max amounts user can add\r\n const maxAmounts: { [field in Field]?: TokenAmount } = [Field.CURRENCY_A, Field.CURRENCY_B].reduce(\r\n (accumulator, field) => {\r\n return {\r\n ...accumulator,\r\n [field]: maxAmountSpend(currencyBalances[field])\r\n }\r\n },\r\n {}\r\n )\r\n\r\n const atMaxAmounts: { [field in Field]?: TokenAmount } = [Field.CURRENCY_A, Field.CURRENCY_B].reduce(\r\n (accumulator, field) => {\r\n return {\r\n ...accumulator,\r\n [field]: maxAmounts[field]?.equalTo(parsedAmounts[field] ?? '0')\r\n }\r\n },\r\n {}\r\n )\r\n\r\n // check whether the user has approved the router on the tokens\r\n const [approvalA, approveACallback] = useApproveCallback(parsedAmounts[Field.CURRENCY_A], ROUTER_ADDRESS)\r\n const [approvalB, approveBCallback] = useApproveCallback(parsedAmounts[Field.CURRENCY_B], ROUTER_ADDRESS)\r\n\r\n const addTransaction = useTransactionAdder()\r\n\r\n async function onAdd() {\r\n if (!chainId || !library || !account) return\r\n const router = getRouterContract(chainId, library, account)\r\n\r\n const { [Field.CURRENCY_A]: parsedAmountA, [Field.CURRENCY_B]: parsedAmountB } = parsedAmounts\r\n if (!parsedAmountA || !parsedAmountB || !currencyA || !currencyB || !deadline) {\r\n return\r\n }\r\n\r\n const amountsMin = {\r\n [Field.CURRENCY_A]: calculateSlippageAmount(parsedAmountA, noLiquidity ? 0 : allowedSlippage)[0],\r\n [Field.CURRENCY_B]: calculateSlippageAmount(parsedAmountB, noLiquidity ? 0 : allowedSlippage)[0]\r\n }\r\n\r\n let method: (...args: any) => Promise,\r\n args: Array,\r\n value: BigNumber | null\r\n if (currencyA === ETHER || currencyB === ETHER) {\r\n const tokenBIsETH = currencyB === ETHER\r\n // estimate = router.estimateGas.addLiquidityETH\r\n method = router.addLiquidityETH\r\n args = [\r\n wrappedCurrency(tokenBIsETH ? currencyA : currencyB, chainId)?.address ?? '', // token\r\n (tokenBIsETH ? parsedAmountA : parsedAmountB).raw.toString(), // token desired\r\n amountsMin[tokenBIsETH ? Field.CURRENCY_A : Field.CURRENCY_B].toString(), // token min\r\n amountsMin[tokenBIsETH ? Field.CURRENCY_B : Field.CURRENCY_A].toString(), // eth min\r\n account,\r\n deadline.toHexString()\r\n ]\r\n value = BigNumber.from((tokenBIsETH ? parsedAmountB : parsedAmountA).raw.toString())\r\n } else {\r\n // estimate = router.estimateGas.addLiquidity\r\n method = router.addLiquidity\r\n args = [\r\n wrappedCurrency(currencyA, chainId)?.address ?? '',\r\n wrappedCurrency(currencyB, chainId)?.address ?? '',\r\n parsedAmountA.raw.toString(),\r\n parsedAmountB.raw.toString(),\r\n amountsMin[Field.CURRENCY_A].toString(),\r\n amountsMin[Field.CURRENCY_B].toString(),\r\n account,\r\n deadline.toHexString()\r\n ]\r\n value = null\r\n }\r\n\r\n setAttemptingTxn(true)\r\n method(...args, {\r\n ...(value ? { value } : {}),\r\n gasLimit: 1000000\r\n })\r\n .then(response => {\r\n setAttemptingTxn(false)\r\n\r\n addTransaction(response, {\r\n summary:\r\n 'Add ' +\r\n parsedAmounts[Field.CURRENCY_A]?.toSignificant(3) +\r\n ' ' +\r\n currencies[Field.CURRENCY_A]?.symbol +\r\n ' and ' +\r\n parsedAmounts[Field.CURRENCY_B]?.toSignificant(3) +\r\n ' ' +\r\n currencies[Field.CURRENCY_B]?.symbol\r\n })\r\n\r\n setTxHash(response.hash)\r\n\r\n ReactGA.event({\r\n category: 'Liquidity',\r\n action: 'Add',\r\n label: [currencies[Field.CURRENCY_A]?.symbol, currencies[Field.CURRENCY_B]?.symbol].join('/')\r\n })\r\n })\r\n .catch(error => {\r\n setAttemptingTxn(false)\r\n // we only care if the error is something _other_ than the user rejected the tx\r\n if (error?.code !== 4001) {\r\n console.error(error)\r\n }\r\n })\r\n }\r\n\r\n const modalHeader = () => {\r\n return noLiquidity ? (\r\n \r\n \r\n \r\n \r\n {currencies[Field.CURRENCY_A]?.symbol + '/' + currencies[Field.CURRENCY_B]?.symbol}\r\n \r\n \r\n \r\n \r\n \r\n ) : (\r\n \r\n \r\n \r\n {liquidityMinted?.toSignificant(6)}\r\n \r\n \r\n \r\n \r\n \r\n {currencies[Field.CURRENCY_A]?.symbol + '/' + currencies[Field.CURRENCY_B]?.symbol + ' Pool Tokens'}\r\n \r\n \r\n \r\n {`Output is estimated. If the price changes by more than ${allowedSlippage /\r\n 100}% your transaction will revert.`}\r\n \r\n \r\n )\r\n }\r\n\r\n const modalBottom = () => {\r\n return (\r\n \r\n )\r\n }\r\n\r\n const pendingText = `Supplying ${parsedAmounts[Field.CURRENCY_A]?.toSignificant(6)} ${\r\n currencies[Field.CURRENCY_A]?.symbol\r\n } and ${parsedAmounts[Field.CURRENCY_B]?.toSignificant(6)} ${currencies[Field.CURRENCY_B]?.symbol}`\r\n\r\n const handleCurrencyASelect = useCallback(\r\n (currencyA: Currency) => {\r\n const newCurrencyIdA = currencyId(currencyA)\r\n if (newCurrencyIdA === currencyIdB) {\r\n history.push(`/add/${currencyIdB}/${currencyIdA}`)\r\n } else {\r\n history.push(`/add/${newCurrencyIdA}/${currencyIdB}`)\r\n }\r\n },\r\n [currencyIdB, history, currencyIdA]\r\n )\r\n const handleCurrencyBSelect = useCallback(\r\n (currencyB: Currency) => {\r\n const newCurrencyIdB = currencyId(currencyB)\r\n if (currencyIdA === newCurrencyIdB) {\r\n if (currencyIdB) {\r\n history.push(`/add/${currencyIdB}/${newCurrencyIdB}`)\r\n } else {\r\n history.push(`/add/${newCurrencyIdB}`)\r\n }\r\n } else {\r\n history.push(`/add/${currencyIdA ? currencyIdA : 'ETH'}/${newCurrencyIdB}`)\r\n }\r\n },\r\n [currencyIdA, history, currencyIdB]\r\n )\r\n\r\n const handleDismissConfirmation = useCallback(() => {\r\n setShowConfirm(false)\r\n // if there was a tx hash, we want to clear the input\r\n if (txHash) {\r\n onFieldAInput('')\r\n }\r\n setTxHash('')\r\n }, [onFieldAInput, txHash])\r\n\r\n // fetch the user's balances of all tracked V2 LP tokens\r\n const trackedTokenPairs = useTrackedTokenPairs()\r\n const tokenPairsWithLiquidityTokens = useMemo(\r\n () => trackedTokenPairs.map(tokens => ({ liquidityToken: toV2LiquidityToken(tokens), tokens })),\r\n [trackedTokenPairs]\r\n )\r\n const liquidityTokens = useMemo(() => tokenPairsWithLiquidityTokens.map(tpwlt => tpwlt.liquidityToken), [\r\n tokenPairsWithLiquidityTokens\r\n ])\r\n const [v2PairsBalances, fetchingV2PairBalances] = useTokenBalancesWithLoadingIndicator(\r\n account ?? undefined,\r\n liquidityTokens\r\n )\r\n\r\n // fetch the reserves for all V2 pools in which the user has a balance\r\n const liquidityTokensWithBalances = useMemo(\r\n () =>\r\n tokenPairsWithLiquidityTokens.filter(({ liquidityToken }) =>\r\n v2PairsBalances[liquidityToken.address]?.greaterThan('0')\r\n ),\r\n [tokenPairsWithLiquidityTokens, v2PairsBalances]\r\n )\r\n\r\n const v2Pairs = usePairs(liquidityTokensWithBalances.map(({ tokens }) => tokens))\r\n const v2IsLoading =\r\n fetchingV2PairBalances || v2Pairs?.length < liquidityTokensWithBalances.length || v2Pairs?.some(V2Pair => !V2Pair)\r\n\r\n const allV2PairsWithLiquidity = v2Pairs.map(([, pair]) => pair).filter((v2Pair): v2Pair is Pair => Boolean(v2Pair))\r\n\r\n const hasV1Liquidity = useUserHasLiquidityInAllTokens()\r\n\r\n // show liquidity even if its deposited in rewards contract\r\n const stakingInfo = useStakingInfo()\r\n const stakingInfosWithBalance = stakingInfo?.filter(pool => JSBI.greaterThan(pool.stakedAmount.raw, BIG_INT_ZERO))\r\n const stakingPairs = usePairs(stakingInfosWithBalance?.map(stakingInfo => stakingInfo.tokens))\r\n\r\n // remove any pairs that also are included in pairs with stake in mining pool\r\n const v2PairsWithoutStakedAmount = allV2PairsWithLiquidity.filter(v2Pair => {\r\n return (\r\n stakingPairs\r\n ?.map(stakingPair => stakingPair[1])\r\n .filter(stakingPair => stakingPair?.liquidityToken.address === v2Pair.liquidityToken.address).length === 0\r\n )\r\n })\r\n\r\n const isCreate = history.location.pathname.includes('/create')\r\n\r\n const TitleRow = styled(RowBetween)`\r\n ${({ theme }) => theme.mediaWidth.upToSmall`\r\n flex-wrap: wrap;\r\n gap: 12px;\r\n width: 100%;\r\n flex-direction: column-reverse;\r\n `};\r\n `\r\n\r\n const EmptyProposals = styled.div`\r\n border: 1px solid ${({ theme }) => theme.text4};\r\n padding: 16px 12px;\r\n border-radius: 5px;\r\n display: flex;\r\n flex-direction: column;\r\n justify-content: center;\r\n align-items: center;\r\n `\r\n\r\n return (\r\n <>\r\n \r\n \r\n \r\n (\r\n \r\n )}\r\n pendingText={pendingText}\r\n currencyToAdd={pair?.liquidityToken}\r\n />\r\n\r\n \r\n {noLiquidity ||\r\n (isCreate && (\r\n \r\n \r\n \r\n \r\n You are the first liquidity provider.\r\n \r\n \r\n The ratio of tokens you add will set the price of this pool.\r\n \r\n \r\n Once you are happy with the rate click supply to review.\r\n \r\n \r\n \r\n \r\n ))}\r\n {\r\n onFieldAInput(maxAmounts[Field.CURRENCY_A]?.toExact() ?? '')\r\n }}\r\n onCurrencySelect={handleCurrencyASelect}\r\n showMaxButton={!atMaxAmounts[Field.CURRENCY_A]}\r\n currency={currencies[Field.CURRENCY_A]}\r\n id=\"add-liquidity-input-tokena\"\r\n showCommonBases\r\n />\r\n \r\n \r\n \r\n {\r\n onFieldBInput(maxAmounts[Field.CURRENCY_B]?.toExact() ?? '')\r\n }}\r\n showMaxButton={!atMaxAmounts[Field.CURRENCY_B]}\r\n currency={currencies[Field.CURRENCY_B]}\r\n id=\"add-liquidity-input-tokenb\"\r\n showCommonBases\r\n />\r\n {currencies[Field.CURRENCY_A] && currencies[Field.CURRENCY_B] && pairState !== PairState.INVALID && (\r\n <>\r\n \r\n \r\n \r\n {noLiquidity ? 'Initial prices' : 'Prices'} and pool share\r\n \r\n {' '}\r\n \r\n \r\n \r\n \r\n \r\n )}\r\n\r\n {!account ? (\r\n Connect Wallet\r\n ) : (\r\n \r\n {(approvalA === ApprovalState.NOT_APPROVED ||\r\n approvalA === ApprovalState.PENDING ||\r\n approvalB === ApprovalState.NOT_APPROVED ||\r\n approvalB === ApprovalState.PENDING) &&\r\n isValid && (\r\n \r\n {approvalA !== ApprovalState.APPROVED && (\r\n \r\n {approvalA === ApprovalState.PENDING ? (\r\n Approving {currencies[Field.CURRENCY_A]?.symbol}\r\n ) : (\r\n 'Approve ' + currencies[Field.CURRENCY_A]?.symbol\r\n )}\r\n \r\n )}\r\n {approvalB !== ApprovalState.APPROVED && (\r\n \r\n {approvalB === ApprovalState.PENDING ? (\r\n Approving {currencies[Field.CURRENCY_B]?.symbol}\r\n ) : (\r\n 'Approve ' + currencies[Field.CURRENCY_B]?.symbol\r\n )}\r\n \r\n )}\r\n \r\n )}\r\n {\r\n expertMode ? onAdd() : setShowConfirm(true)\r\n }}\r\n disabled={!isValid || approvalA !== ApprovalState.APPROVED || approvalB !== ApprovalState.APPROVED}\r\n error={!isValid && !!parsedAmounts[Field.CURRENCY_A] && !!parsedAmounts[Field.CURRENCY_B]}\r\n >\r\n \r\n {error ?? 'Supply'}\r\n \r\n \r\n \r\n )}\r\n \r\n\r\n \r\n \r\n \r\n \r\n \r\n Your liquidity\r\n \r\n \r\n \r\n\r\n {!account ? (\r\n \r\n \r\n Connect to a wallet to view your liquidity.\r\n \r\n \r\n ) : v2IsLoading ? (\r\n \r\n \r\n Loading\r\n \r\n \r\n ) : allV2PairsWithLiquidity?.length > 0 || stakingPairs?.length > 0 ? (\r\n <>\r\n {v2PairsWithoutStakedAmount.map(v2Pair => (\r\n \r\n ))}\r\n {stakingPairs.map(\r\n (stakingPair, i) =>\r\n stakingPair[1] && ( // skip pairs that arent loaded\r\n \r\n )\r\n )}\r\n \r\n ) : (\r\n \r\n \r\n No liquidity found.\r\n \r\n \r\n )}\r\n\r\n \r\n \r\n {hasV1Liquidity ? 'Uniswap V1 liquidity found!' : \"Don't see a pool you joined?\"}{' '}\r\n \r\n {hasV1Liquidity ? 'Migrate now.' : 'Import it.'}\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n\r\n {pair && !noLiquidity && pairState !== PairState.INVALID ? (\r\n \r\n \r\n \r\n ) : null}\r\n \r\n )\r\n}\r\n","import React from 'react'\nimport { Redirect, RouteComponentProps } from 'react-router-dom'\nimport AddLiquidity from './index'\n\nexport function RedirectToAddLiquidity() {\n return \n}\n\nconst OLD_PATH_STRUCTURE = /^(0x[a-fA-F0-9]{40})-(0x[a-fA-F0-9]{40})$/\nexport function RedirectOldAddLiquidityPathStructure(props: RouteComponentProps<{ currencyIdA: string }>) {\n const {\n match: {\n params: { currencyIdA }\n }\n } = props\n const match = currencyIdA.match(OLD_PATH_STRUCTURE)\n if (match?.length) {\n return \n }\n\n return \n}\n\nexport function RedirectDuplicateTokenIds(props: RouteComponentProps<{ currencyIdA: string; currencyIdB: string }>) {\n const {\n match: {\n params: { currencyIdA, currencyIdB }\n }\n } = props\n if (currencyIdA.toLowerCase() === currencyIdB.toLowerCase()) {\n return \n }\n return \n}\n","import React from 'react'\nimport { AutoColumn } from '../../components/Column'\nimport { TYPE } from '../../theme'\n\nexport function EmptyState({ message }: { message: string }) {\n return (\n \n {message}\n \n )\n}\n","import React, { useContext } from 'react'\nimport { Link, RouteComponentProps, withRouter } from 'react-router-dom'\nimport { Token, TokenAmount, WETH } from '@levinswap/uniswap-sdk'\n\nimport { Text } from 'rebass'\nimport { AutoColumn } from '../Column'\nimport { ButtonSecondary } from '../Button'\nimport { RowBetween, RowFixed } from '../Row'\nimport { FixedHeightRow, HoverCard } from './index'\nimport DoubleCurrencyLogo from '../DoubleLogo'\nimport { useActiveWeb3React } from '../../hooks'\nimport { ThemeContext } from 'styled-components'\n\ninterface PositionCardProps extends RouteComponentProps<{}> {\n token: Token\n V1LiquidityBalance: TokenAmount\n}\n\nfunction V1PositionCard({ token, V1LiquidityBalance }: PositionCardProps) {\n const theme = useContext(ThemeContext)\n\n const { chainId } = useActiveWeb3React()\n\n return (\n \n \n \n \n \n \n {`${chainId && token.equals(WETH[chainId]) ? 'WETH' : token.symbol}/ETH`}\n \n \n V1\n \n \n \n\n \n \n \n Migrate\n \n\n \n Remove\n \n \n \n \n \n )\n}\n\nexport default withRouter(V1PositionCard)\n","import { JSBI, Token } from '@levinswap/uniswap-sdk'\r\nimport React, { useCallback, useContext, useMemo, useState } from 'react'\r\nimport { ThemeContext } from 'styled-components'\r\nimport { AutoColumn } from '../../components/Column'\r\nimport { AutoRow } from '../../components/Row'\r\nimport { SearchInput } from '../../components/SearchModal/styleds'\r\nimport { useAllTokenV1Exchanges } from '../../data/V1'\r\nimport { useActiveWeb3React } from '../../hooks'\r\nimport { useTokenBalancesWithLoadingIndicator } from '../../state/wallet/hooks'\r\nimport { BackArrow, TYPE } from '../../theme'\r\nimport { LightCard } from '../../components/Card'\r\nimport { BodyWrapper } from '../AppBody'\r\nimport { EmptyState } from './EmptyState'\r\nimport V1PositionCard from '../../components/PositionCard/V1'\r\nimport QuestionHelper from '../../components/QuestionHelper'\r\nimport { Dots } from '../../components/swap/styleds'\r\n\r\nexport default function MigrateV1() {\r\n const theme = useContext(ThemeContext)\r\n const { account, chainId } = useActiveWeb3React()\r\n\r\n const [tokenSearch, setTokenSearch] = useState('')\r\n const handleTokenSearchChange = useCallback(e => setTokenSearch(e.target.value), [setTokenSearch])\r\n\r\n // get V1 LP balances\r\n const V1Exchanges = useAllTokenV1Exchanges()\r\n const V1LiquidityTokens: Token[] = useMemo(() => {\r\n return chainId\r\n ? Object.keys(V1Exchanges).map(exchangeAddress => new Token(chainId, exchangeAddress, 18, 'UNI-V1', 'Uniswap V1'))\r\n : []\r\n }, [chainId, V1Exchanges])\r\n const [V1LiquidityBalances, V1LiquidityBalancesLoading] = useTokenBalancesWithLoadingIndicator(\r\n account ?? undefined,\r\n V1LiquidityTokens\r\n )\r\n const allV1PairsWithLiquidity = V1LiquidityTokens.filter(V1LiquidityToken => {\r\n const balance = V1LiquidityBalances?.[V1LiquidityToken.address]\r\n return balance && JSBI.greaterThan(balance.raw, JSBI.BigInt(0))\r\n }).map(V1LiquidityToken => {\r\n const balance = V1LiquidityBalances[V1LiquidityToken.address]\r\n return balance ? (\r\n \r\n ) : null\r\n })\r\n\r\n // should never always be false, because a V1 exhchange exists for WETH on all testnets\r\n const isLoading = Object.keys(V1Exchanges)?.length === 0 || V1LiquidityBalancesLoading\r\n\r\n return (\r\n \r\n \r\n \r\n \r\n Migrate V1 Liquidity\r\n
    \r\n \r\n
    \r\n
    \r\n\r\n \r\n For each pool shown below, click migrate to remove your liquidity from Uniswap V1 and deposit it into Uniswap\r\n V2.\r\n \r\n\r\n {!account ? (\r\n \r\n \r\n Connect to a wallet to view your V1 liquidity.\r\n \r\n \r\n ) : isLoading ? (\r\n \r\n \r\n Loading\r\n \r\n \r\n ) : (\r\n <>\r\n \r\n \r\n \r\n {allV1PairsWithLiquidity?.length > 0 ? (\r\n <>{allV1PairsWithLiquidity}\r\n ) : (\r\n \r\n )}\r\n \r\n )}\r\n
    \r\n
    \r\n )\r\n}\r\n","import React from 'react'\nimport { CurrencyAmount, Fraction, JSBI } from '@levinswap/uniswap-sdk'\n\nconst CURRENCY_AMOUNT_MIN = new Fraction(JSBI.BigInt(1), JSBI.BigInt(1000000))\n\nexport default function FormattedCurrencyAmount({\n currencyAmount,\n significantDigits = 4\n}: {\n currencyAmount: CurrencyAmount\n significantDigits?: number\n}) {\n return (\n <>\n {currencyAmount.equalTo(JSBI.BigInt(0))\n ? '0'\n : currencyAmount.greaterThan(CURRENCY_AMOUNT_MIN)\n ? currencyAmount.toSignificant(significantDigits)\n : `<${CURRENCY_AMOUNT_MIN.toSignificant(1)}`}\n \n )\n}\n","import { TransactionResponse } from '@ethersproject/abstract-provider'\nimport { AddressZero } from '@ethersproject/constants'\nimport { Currency, CurrencyAmount, Fraction, JSBI, Percent, Token, TokenAmount, WETH } from '@levinswap/uniswap-sdk'\nimport React, { useCallback, useMemo, useState } from 'react'\nimport ReactGA from 'react-ga'\nimport { Redirect, RouteComponentProps } from 'react-router'\nimport { Text } from 'rebass'\nimport { ButtonConfirmed } from '../../components/Button'\nimport { LightCard, PinkCard, YellowCard } from '../../components/Card'\nimport { AutoColumn } from '../../components/Column'\nimport CurrencyLogo from '../../components/CurrencyLogo'\nimport FormattedCurrencyAmount from '../../components/FormattedCurrencyAmount'\nimport QuestionHelper from '../../components/QuestionHelper'\nimport { AutoRow, RowBetween, RowFixed } from '../../components/Row'\nimport { Dots } from '../../components/swap/styleds'\nimport { DEFAULT_DEADLINE_FROM_NOW, INITIAL_ALLOWED_SLIPPAGE } from '../../constants'\nimport { MIGRATOR_ADDRESS } from '../../constants/abis/migrator'\nimport { PairState, usePair } from '../../data/Reserves'\nimport { useTotalSupply } from '../../data/TotalSupply'\nimport { useActiveWeb3React } from '../../hooks'\nimport { useToken } from '../../hooks/Tokens'\nimport { ApprovalState, useApproveCallback } from '../../hooks/useApproveCallback'\nimport { useV1ExchangeContract, useV2MigratorContract } from '../../hooks/useContract'\nimport { NEVER_RELOAD, useSingleCallResult } from '../../state/multicall/hooks'\nimport { useIsTransactionPending, useTransactionAdder } from '../../state/transactions/hooks'\nimport { useETHBalances, useTokenBalance } from '../../state/wallet/hooks'\nimport { BackArrow, ExternalLink, TYPE } from '../../theme'\nimport { getEtherscanLink, isAddress } from '../../utils'\nimport { BodyWrapper } from '../AppBody'\nimport { EmptyState } from './EmptyState'\n\nconst WEI_DENOM = JSBI.exponentiate(JSBI.BigInt(10), JSBI.BigInt(18))\nconst ZERO = JSBI.BigInt(0)\nconst ONE = JSBI.BigInt(1)\nconst ZERO_FRACTION = new Fraction(ZERO, ONE)\nconst ALLOWED_OUTPUT_MIN_PERCENT = new Percent(JSBI.BigInt(10000 - INITIAL_ALLOWED_SLIPPAGE), JSBI.BigInt(10000))\n\nexport function V1LiquidityInfo({\n token,\n liquidityTokenAmount,\n tokenWorth,\n ethWorth\n}: {\n token: Token\n liquidityTokenAmount: TokenAmount\n tokenWorth: TokenAmount\n ethWorth: CurrencyAmount\n}) {\n const { chainId } = useActiveWeb3React()\n\n return (\n <>\n \n \n
    \n \n {}{' '}\n {chainId && token.equals(WETH[chainId]) ? 'WETH' : token.symbol}/ETH\n \n
    \n
    \n\n \n \n Pooled {chainId && token.equals(WETH[chainId]) ? 'WETH' : token.symbol}:\n \n \n \n {tokenWorth.toSignificant(4)}\n \n \n \n \n \n \n Pooled ETH:\n \n \n \n \n \n \n \n \n \n )\n}\n\nfunction V1PairMigration({ liquidityTokenAmount, token }: { liquidityTokenAmount: TokenAmount; token: Token }) {\n const { account, chainId } = useActiveWeb3React()\n const totalSupply = useTotalSupply(liquidityTokenAmount.token)\n const exchangeETHBalance = useETHBalances([liquidityTokenAmount.token.address])?.[liquidityTokenAmount.token.address]\n const exchangeTokenBalance = useTokenBalance(liquidityTokenAmount.token.address, token)\n\n const [v2PairState, v2Pair] = usePair(chainId ? WETH[chainId] : undefined, token)\n const isFirstLiquidityProvider: boolean = v2PairState === PairState.NOT_EXISTS\n\n const v2SpotPrice = chainId && v2Pair ? v2Pair.reserveOf(token).divide(v2Pair.reserveOf(WETH[chainId])) : undefined\n\n const [confirmingMigration, setConfirmingMigration] = useState(false)\n const [pendingMigrationHash, setPendingMigrationHash] = useState(null)\n\n const shareFraction: Fraction = totalSupply ? new Percent(liquidityTokenAmount.raw, totalSupply.raw) : ZERO_FRACTION\n\n const ethWorth: CurrencyAmount = exchangeETHBalance\n ? CurrencyAmount.ether(exchangeETHBalance.multiply(shareFraction).multiply(WEI_DENOM).quotient)\n : CurrencyAmount.ether(ZERO)\n\n const tokenWorth: TokenAmount = exchangeTokenBalance\n ? new TokenAmount(token, shareFraction.multiply(exchangeTokenBalance.raw).quotient)\n : new TokenAmount(token, ZERO)\n\n const [approval, approve] = useApproveCallback(liquidityTokenAmount, MIGRATOR_ADDRESS)\n\n const v1SpotPrice =\n exchangeTokenBalance && exchangeETHBalance\n ? exchangeTokenBalance.divide(new Fraction(exchangeETHBalance.raw, WEI_DENOM))\n : null\n\n const priceDifferenceFraction: Fraction | undefined =\n v1SpotPrice && v2SpotPrice\n ? v1SpotPrice\n .divide(v2SpotPrice)\n .multiply('100')\n .subtract('100')\n : undefined\n\n const priceDifferenceAbs: Fraction | undefined = priceDifferenceFraction?.lessThan(ZERO)\n ? priceDifferenceFraction?.multiply('-1')\n : priceDifferenceFraction\n\n const minAmountETH: JSBI | undefined =\n v2SpotPrice && tokenWorth\n ? tokenWorth\n .divide(v2SpotPrice)\n .multiply(WEI_DENOM)\n .multiply(ALLOWED_OUTPUT_MIN_PERCENT).quotient\n : ethWorth?.numerator\n\n const minAmountToken: JSBI | undefined =\n v2SpotPrice && ethWorth\n ? ethWorth\n .multiply(v2SpotPrice)\n .multiply(JSBI.exponentiate(JSBI.BigInt(10), JSBI.BigInt(token.decimals)))\n .multiply(ALLOWED_OUTPUT_MIN_PERCENT).quotient\n : tokenWorth?.numerator\n\n const addTransaction = useTransactionAdder()\n const isMigrationPending = useIsTransactionPending(pendingMigrationHash ?? undefined)\n\n const migrator = useV2MigratorContract()\n const migrate = useCallback(() => {\n if (!minAmountToken || !minAmountETH || !migrator) return\n\n setConfirmingMigration(true)\n migrator\n .migrate(\n token.address,\n minAmountToken.toString(),\n minAmountETH.toString(),\n account,\n Math.floor(new Date().getTime() / 1000) + DEFAULT_DEADLINE_FROM_NOW\n )\n .then((response: TransactionResponse) => {\n ReactGA.event({\n category: 'Migrate',\n action: 'V1->V2',\n label: token?.symbol\n })\n\n addTransaction(response, {\n summary: `Migrate ${token.symbol} liquidity to V2`\n })\n setPendingMigrationHash(response.hash)\n })\n .catch(() => {\n setConfirmingMigration(false)\n })\n }, [minAmountToken, minAmountETH, migrator, token, account, addTransaction])\n\n const noLiquidityTokens = !!liquidityTokenAmount && liquidityTokenAmount.equalTo(ZERO)\n\n const largePriceDifference = !!priceDifferenceAbs && !priceDifferenceAbs.lessThan(JSBI.BigInt(5))\n\n const isSuccessfullyMigrated = !!pendingMigrationHash && noLiquidityTokens\n\n return (\n \n \n This tool will safely migrate your V1 liquidity to V2 with minimal price risk. The process is completely\n trustless thanks to the{' '}\n {chainId && (\n \n Uniswap migration contract↗\n \n )}\n .\n \n\n {!isFirstLiquidityProvider && largePriceDifference ? (\n \n \n It{\"'\"}s best to deposit liquidity into Uniswap V2 at a price you believe is correct. If the V2 price seems\n incorrect, you can either make a swap to move the price or wait for someone else to do so.\n \n \n \n V1 Price:\n \n {v1SpotPrice?.toSignificant(6)} {token.symbol}/ETH\n \n \n \n
    \n \n {v1SpotPrice?.invert()?.toSignificant(6)} ETH/{token.symbol}\n \n \n\n \n V2 Price:\n \n {v2SpotPrice?.toSignificant(6)} {token.symbol}/ETH\n \n \n \n
    \n \n {v2SpotPrice?.invert()?.toSignificant(6)} ETH/{token.symbol}\n \n \n\n \n Price Difference:\n {priceDifferenceAbs?.toSignificant(4)}%\n \n \n \n ) : null}\n\n {isFirstLiquidityProvider && (\n \n \n You are the first liquidity provider for this pair on Levinswap V2. Your liquidity will be migrated at the\n current V1 price. Your transaction cost also includes the gas to create the pool.\n \n\n \n \n V1 Price:\n \n {v1SpotPrice?.toSignificant(6)} {token.symbol}/ETH\n \n \n \n
    \n \n {v1SpotPrice?.invert()?.toSignificant(6)} ETH/{token.symbol}\n \n \n \n \n )}\n\n \n \n\n
    \n \n \n {approval === ApprovalState.PENDING ? (\n Approving\n ) : approval === ApprovalState.APPROVED ? (\n 'Approved'\n ) : (\n 'Approve'\n )}\n \n \n \n \n {isSuccessfullyMigrated ? 'Success' : isMigrationPending ? Migrating : 'Migrate'}\n \n \n
    \n
    \n \n {`Your Uniswap V1 ${token.symbol}/ETH liquidity will become Uniswap V2 ${token.symbol}/ETH liquidity.`}\n \n \n )\n}\n\nexport default function MigrateV1Exchange({\n history,\n match: {\n params: { address }\n }\n}: RouteComponentProps<{ address: string }>) {\n const validatedAddress = isAddress(address)\n const { chainId, account } = useActiveWeb3React()\n\n const exchangeContract = useV1ExchangeContract(validatedAddress ? validatedAddress : undefined)\n const tokenAddress = useSingleCallResult(exchangeContract, 'tokenAddress', undefined, NEVER_RELOAD)?.result?.[0]\n\n const token = useToken(tokenAddress)\n\n const liquidityToken: Token | undefined = useMemo(\n () =>\n validatedAddress && chainId && token\n ? new Token(chainId, validatedAddress, 18, `UNI-V1-${token.symbol}`, 'Uniswap V1')\n : undefined,\n [chainId, validatedAddress, token]\n )\n const userLiquidityBalance = useTokenBalance(account ?? undefined, liquidityToken)\n\n // redirect for invalid url params\n if (!validatedAddress || tokenAddress === AddressZero) {\n console.error('Invalid address in path', address)\n return \n }\n\n return (\n \n \n \n \n Migrate V1 Liquidity\n
    \n \n
    \n
    \n\n {!account ? (\n You must connect an account.\n ) : validatedAddress && chainId && token?.equals(WETH[chainId]) ? (\n <>\n \n Because Uniswap V2 uses WETH under the hood, your Uniswap V1 WETH/ETH liquidity cannot be migrated. You\n may want to remove your liquidity instead.\n \n\n {\n history.push(`/remove/v1/${validatedAddress}`)\n }}\n >\n Remove\n \n \n ) : userLiquidityBalance && token ? (\n \n ) : (\n \n )}\n
    \n
    \n )\n}\n","import { TransactionResponse } from '@ethersproject/abstract-provider'\nimport { JSBI, Token, TokenAmount, WETH, Fraction, Percent, CurrencyAmount } from '@levinswap/uniswap-sdk'\nimport React, { useCallback, useMemo, useState } from 'react'\nimport ReactGA from 'react-ga'\nimport { Redirect, RouteComponentProps } from 'react-router'\nimport { ButtonConfirmed } from '../../components/Button'\nimport { LightCard } from '../../components/Card'\nimport { AutoColumn } from '../../components/Column'\nimport QuestionHelper from '../../components/QuestionHelper'\nimport { AutoRow } from '../../components/Row'\nimport { DEFAULT_DEADLINE_FROM_NOW } from '../../constants'\nimport { useActiveWeb3React } from '../../hooks'\nimport { useToken } from '../../hooks/Tokens'\nimport { useV1ExchangeContract } from '../../hooks/useContract'\nimport { NEVER_RELOAD, useSingleCallResult } from '../../state/multicall/hooks'\nimport { useIsTransactionPending, useTransactionAdder } from '../../state/transactions/hooks'\nimport { useTokenBalance, useETHBalances } from '../../state/wallet/hooks'\nimport { BackArrow, TYPE } from '../../theme'\nimport { isAddress } from '../../utils'\nimport { BodyWrapper } from '../AppBody'\nimport { EmptyState } from './EmptyState'\nimport { V1LiquidityInfo } from './MigrateV1Exchange'\nimport { AddressZero } from '@ethersproject/constants'\nimport { Dots } from '../../components/swap/styleds'\nimport { Contract } from '@ethersproject/contracts'\nimport { useTotalSupply } from '../../data/TotalSupply'\n\nconst WEI_DENOM = JSBI.exponentiate(JSBI.BigInt(10), JSBI.BigInt(18))\nconst ZERO = JSBI.BigInt(0)\nconst ONE = JSBI.BigInt(1)\nconst ZERO_FRACTION = new Fraction(ZERO, ONE)\n\nfunction V1PairRemoval({\n exchangeContract,\n liquidityTokenAmount,\n token\n}: {\n exchangeContract: Contract\n liquidityTokenAmount: TokenAmount\n token: Token\n}) {\n const { chainId } = useActiveWeb3React()\n const totalSupply = useTotalSupply(liquidityTokenAmount.token)\n const exchangeETHBalance = useETHBalances([liquidityTokenAmount.token.address])?.[liquidityTokenAmount.token.address]\n const exchangeTokenBalance = useTokenBalance(liquidityTokenAmount.token.address, token)\n\n const [confirmingRemoval, setConfirmingRemoval] = useState(false)\n const [pendingRemovalHash, setPendingRemovalHash] = useState(null)\n\n const shareFraction: Fraction = totalSupply ? new Percent(liquidityTokenAmount.raw, totalSupply.raw) : ZERO_FRACTION\n\n const ethWorth: CurrencyAmount = exchangeETHBalance\n ? CurrencyAmount.ether(exchangeETHBalance.multiply(shareFraction).multiply(WEI_DENOM).quotient)\n : CurrencyAmount.ether(ZERO)\n\n const tokenWorth: TokenAmount = exchangeTokenBalance\n ? new TokenAmount(token, shareFraction.multiply(exchangeTokenBalance.raw).quotient)\n : new TokenAmount(token, ZERO)\n\n const addTransaction = useTransactionAdder()\n const isRemovalPending = useIsTransactionPending(pendingRemovalHash ?? undefined)\n\n const remove = useCallback(() => {\n if (!liquidityTokenAmount) return\n\n setConfirmingRemoval(true)\n exchangeContract\n .removeLiquidity(\n liquidityTokenAmount.raw.toString(),\n 1, // min_eth, this is safe because we're removing liquidity\n 1, // min_tokens, this is safe because we're removing liquidity\n Math.floor(new Date().getTime() / 1000) + DEFAULT_DEADLINE_FROM_NOW\n )\n .then((response: TransactionResponse) => {\n ReactGA.event({\n category: 'Remove',\n action: 'V1',\n label: token?.symbol\n })\n\n addTransaction(response, {\n summary: `Remove ${chainId && token.equals(WETH[chainId]) ? 'WETH' : token.symbol}/ETH V1 liquidity`\n })\n setPendingRemovalHash(response.hash)\n })\n .catch((error: Error) => {\n console.error(error)\n setConfirmingRemoval(false)\n })\n }, [exchangeContract, liquidityTokenAmount, token, chainId, addTransaction])\n\n const noLiquidityTokens = !!liquidityTokenAmount && liquidityTokenAmount.equalTo(ZERO)\n\n const isSuccessfullyRemoved = !!pendingRemovalHash && noLiquidityTokens\n\n return (\n \n \n This tool will remove your V1 liquidity and send the underlying assets to your wallet.\n \n\n \n \n\n
    \n \n {isSuccessfullyRemoved ? 'Success' : isRemovalPending ? Removing : 'Remove'}\n \n
    \n
    \n \n {`Your Uniswap V1 ${\n chainId && token.equals(WETH[chainId]) ? 'WETH' : token.symbol\n }/ETH liquidity will be redeemed for underlying assets.`}\n \n
    \n )\n}\n\nexport default function RemoveV1Exchange({\n match: {\n params: { address }\n }\n}: RouteComponentProps<{ address: string }>) {\n const validatedAddress = isAddress(address)\n const { chainId, account } = useActiveWeb3React()\n\n const exchangeContract = useV1ExchangeContract(validatedAddress ? validatedAddress : undefined, true)\n const tokenAddress = useSingleCallResult(exchangeContract, 'tokenAddress', undefined, NEVER_RELOAD)?.result?.[0]\n const token = useToken(tokenAddress)\n\n const liquidityToken: Token | undefined = useMemo(\n () =>\n validatedAddress && chainId && token\n ? new Token(chainId, validatedAddress, 18, `UNI-V1-${token.symbol}`, 'Uniswap V1')\n : undefined,\n [chainId, validatedAddress, token]\n )\n const userLiquidityBalance = useTokenBalance(account ?? undefined, liquidityToken)\n\n // redirect for invalid url params\n if (!validatedAddress || tokenAddress === AddressZero) {\n console.error('Invalid address in path', address)\n return \n }\n\n return (\n \n \n \n \n Remove V1 Liquidity\n
    \n \n
    \n
    \n\n {!account ? (\n You must connect an account.\n ) : userLiquidityBalance && token && exchangeContract ? (\n \n ) : (\n \n )}\n
    \n
    \n )\n}\n","import React, { useContext, useMemo } from 'react'\r\nimport styled, { ThemeContext } from 'styled-components'\r\nimport { Pair, JSBI } from '@levinswap/uniswap-sdk'\r\nimport { SwapPoolTabs } from '../../components/NavigationTabs'\r\n\r\nimport FullPositionCard from '../../components/PositionCard'\r\nimport { useUserHasLiquidityInAllTokens } from '../../data/V1'\r\nimport { useTokenBalancesWithLoadingIndicator } from '../../state/wallet/hooks'\r\nimport { StyledInternalLink, TYPE, HideSmall } from '../../theme'\r\nimport { Text } from 'rebass'\r\nimport Card from '../../components/Card'\r\nimport { RowBetween } from '../../components/Row'\r\nimport { AutoColumn } from '../../components/Column'\r\n\r\nimport { useActiveWeb3React } from '../../hooks'\r\nimport { usePairs } from '../../data/Reserves'\r\nimport { toV2LiquidityToken, useTrackedTokenPairs } from '../../state/user/hooks'\r\nimport { Dots } from '../../components/swap/styleds'\r\nimport { useStakingInfo } from '../../state/stake/hooks'\r\nimport { BIG_INT_ZERO } from '../../constants'\r\n\r\nconst PageWrapper = styled(AutoColumn)`\r\n max-width: 640px;\r\n width: 100%;\r\n`\r\n\r\n// const VoteCard = styled(DataCard)`\r\n// background: radial-gradient(76.02% 75.41% at 1.84% 0%, #d9b252 0%, #000000 100%);\r\n// overflow: hidden;\r\n// `\r\n\r\nconst TitleRow = styled(RowBetween)`\r\n ${({ theme }) => theme.mediaWidth.upToSmall`\r\n flex-wrap: wrap;\r\n gap: 12px;\r\n width: 100%;\r\n flex-direction: column-reverse;\r\n `};\r\n`\r\n\r\nconst EmptyProposals = styled.div`\r\n border: 1px solid ${({ theme }) => theme.text4};\r\n padding: 16px 12px;\r\n border-radius: 5px;\r\n display: flex;\r\n flex-direction: column;\r\n justify-content: center;\r\n align-items: center;\r\n`\r\n\r\nexport default function Pool() {\r\n const theme = useContext(ThemeContext)\r\n const { account } = useActiveWeb3React()\r\n\r\n // fetch the user's balances of all tracked V2 LP tokens\r\n const trackedTokenPairs = useTrackedTokenPairs()\r\n const tokenPairsWithLiquidityTokens = useMemo(\r\n () => trackedTokenPairs.map(tokens => ({ liquidityToken: toV2LiquidityToken(tokens), tokens })),\r\n [trackedTokenPairs]\r\n )\r\n const liquidityTokens = useMemo(() => tokenPairsWithLiquidityTokens.map(tpwlt => tpwlt.liquidityToken), [\r\n tokenPairsWithLiquidityTokens\r\n ])\r\n const [v2PairsBalances, fetchingV2PairBalances] = useTokenBalancesWithLoadingIndicator(\r\n account ?? undefined,\r\n liquidityTokens\r\n )\r\n\r\n // fetch the reserves for all V2 pools in which the user has a balance\r\n const liquidityTokensWithBalances = useMemo(\r\n () =>\r\n tokenPairsWithLiquidityTokens.filter(({ liquidityToken }) =>\r\n v2PairsBalances[liquidityToken.address]?.greaterThan('0')\r\n ),\r\n [tokenPairsWithLiquidityTokens, v2PairsBalances]\r\n )\r\n\r\n const v2Pairs = usePairs(liquidityTokensWithBalances.map(({ tokens }) => tokens))\r\n const v2IsLoading =\r\n fetchingV2PairBalances || v2Pairs?.length < liquidityTokensWithBalances.length || v2Pairs?.some(V2Pair => !V2Pair)\r\n\r\n const allV2PairsWithLiquidity = v2Pairs.map(([, pair]) => pair).filter((v2Pair): v2Pair is Pair => Boolean(v2Pair))\r\n\r\n const hasV1Liquidity = useUserHasLiquidityInAllTokens()\r\n\r\n // show liquidity even if its deposited in rewards contract\r\n const stakingInfo = useStakingInfo()\r\n const stakingInfosWithBalance = stakingInfo?.filter(pool => JSBI.greaterThan(pool.stakedAmount.raw, BIG_INT_ZERO))\r\n const stakingPairs = usePairs(stakingInfosWithBalance?.map(stakingInfo => stakingInfo.tokens))\r\n\r\n // remove any pairs that also are included in pairs with stake in mining pool\r\n const v2PairsWithoutStakedAmount = allV2PairsWithLiquidity.filter(v2Pair => {\r\n return (\r\n stakingPairs\r\n ?.map(stakingPair => stakingPair[1])\r\n .filter(stakingPair => stakingPair?.liquidityToken.address === v2Pair.liquidityToken.address).length === 0\r\n )\r\n })\r\n\r\n return (\r\n <>\r\n \r\n \r\n {/* \r\n \r\n \r\n \r\n \r\n \r\n Liquidity provider rewards\r\n \r\n \r\n \r\n {`Liquidity providers earn a 0.25% fee on all trades proportional to their share of the pool. Fees are added to the pool, accrue in real time and can be claimed by withdrawing your liquidity.`}\r\n \r\n \r\n \r\n Read more about providing liquidity\r\n \r\n \r\n \r\n \r\n \r\n */}\r\n\r\n \r\n \r\n \r\n \r\n \r\n Your liquidity\r\n \r\n \r\n \r\n\r\n {!account ? (\r\n \r\n \r\n Connect to a wallet to view your liquidity.\r\n \r\n \r\n ) : v2IsLoading ? (\r\n \r\n \r\n Loading\r\n \r\n \r\n ) : allV2PairsWithLiquidity?.length > 0 || stakingPairs?.length > 0 ? (\r\n <>\r\n {v2PairsWithoutStakedAmount.map(v2Pair => (\r\n \r\n ))}\r\n {stakingPairs.map(\r\n (stakingPair, i) =>\r\n stakingPair[1] && ( // skip pairs that arent loaded\r\n \r\n )\r\n )}\r\n \r\n ) : (\r\n \r\n \r\n No liquidity found.\r\n \r\n \r\n )}\r\n\r\n \r\n \r\n {hasV1Liquidity ? 'Uniswap V1 liquidity found!' : \"Don't see a pool you joined?\"}{' '}\r\n \r\n {hasV1Liquidity ? 'Migrate now.' : 'Import it.'}\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n )\r\n}\r\n","import { Currency, ETHER, JSBI, TokenAmount } from '@levinswap/uniswap-sdk'\r\nimport React, { useCallback, useEffect, useState } from 'react'\r\nimport { Plus } from 'react-feather'\r\nimport { Text } from 'rebass'\r\nimport { ButtonDropdownLight } from '../../components/Button'\r\nimport { LightCard } from '../../components/Card'\r\nimport { AutoColumn, ColumnCenter } from '../../components/Column'\r\nimport CurrencyLogo from '../../components/CurrencyLogo'\r\nimport { FindPoolTabs } from '../../components/NavigationTabs'\r\nimport { MinimalPositionCard } from '../../components/PositionCard'\r\nimport Row from '../../components/Row'\r\nimport CurrencySearchModal from '../../components/SearchModal/CurrencySearchModal'\r\nimport { PairState, usePair } from '../../data/Reserves'\r\nimport { useActiveWeb3React } from '../../hooks'\r\nimport { usePairAdder } from '../../state/user/hooks'\r\nimport { useTokenBalance } from '../../state/wallet/hooks'\r\nimport { StyledInternalLink } from '../../theme'\r\nimport { currencyId } from '../../utils/currencyId'\r\nimport AppBody from '../AppBody'\r\nimport { Dots } from '../Pool/styleds'\r\n\r\nenum Fields {\r\n TOKEN0 = 0,\r\n TOKEN1 = 1\r\n}\r\n\r\nexport default function PoolFinder() {\r\n const { account } = useActiveWeb3React()\r\n\r\n const [showSearch, setShowSearch] = useState(false)\r\n const [activeField, setActiveField] = useState(Fields.TOKEN1)\r\n\r\n const [currency0, setCurrency0] = useState(ETHER)\r\n const [currency1, setCurrency1] = useState(null)\r\n\r\n const [pairState, pair] = usePair(currency0 ?? undefined, currency1 ?? undefined)\r\n const addPair = usePairAdder()\r\n useEffect(() => {\r\n if (pair) {\r\n addPair(pair)\r\n }\r\n }, [pair, addPair])\r\n\r\n const validPairNoLiquidity: boolean =\r\n pairState === PairState.NOT_EXISTS ||\r\n Boolean(\r\n pairState === PairState.EXISTS &&\r\n pair &&\r\n JSBI.equal(pair.reserve0.raw, JSBI.BigInt(0)) &&\r\n JSBI.equal(pair.reserve1.raw, JSBI.BigInt(0))\r\n )\r\n\r\n const position: TokenAmount | undefined = useTokenBalance(account ?? undefined, pair?.liquidityToken)\r\n const hasPosition = Boolean(position && JSBI.greaterThan(position.raw, JSBI.BigInt(0)))\r\n\r\n const handleCurrencySelect = useCallback(\r\n (currency: Currency) => {\r\n if (activeField === Fields.TOKEN0) {\r\n setCurrency0(currency)\r\n } else {\r\n setCurrency1(currency)\r\n }\r\n },\r\n [activeField]\r\n )\r\n\r\n const handleSearchDismiss = useCallback(() => {\r\n setShowSearch(false)\r\n }, [setShowSearch])\r\n\r\n const prerequisiteMessage = (\r\n \r\n \r\n {!account ? 'Connect to a wallet to find pools' : 'Select a token to find your liquidity.'}\r\n \r\n \r\n )\r\n\r\n return (\r\n \r\n \r\n \r\n {\r\n setShowSearch(true)\r\n setActiveField(Fields.TOKEN0)\r\n }}\r\n >\r\n {currency0 ? (\r\n \r\n \r\n \r\n {currency0.symbol}\r\n \r\n \r\n ) : (\r\n \r\n Select a Token\r\n \r\n )}\r\n \r\n\r\n \r\n \r\n \r\n\r\n {\r\n setShowSearch(true)\r\n setActiveField(Fields.TOKEN1)\r\n }}\r\n >\r\n {currency1 ? (\r\n \r\n \r\n \r\n {currency1.symbol}\r\n \r\n \r\n ) : (\r\n \r\n Select a Token\r\n \r\n )}\r\n \r\n\r\n {hasPosition && (\r\n \r\n \r\n Pool Found!\r\n \r\n \r\n Manage this pool.\r\n \r\n \r\n )}\r\n\r\n {currency0 && currency1 ? (\r\n pairState === PairState.EXISTS ? (\r\n hasPosition && pair ? (\r\n \r\n ) : (\r\n \r\n \r\n You don’t have liquidity in this pool yet.\r\n \r\n Add liquidity.\r\n \r\n \r\n \r\n )\r\n ) : validPairNoLiquidity ? (\r\n \r\n \r\n No pool found.\r\n \r\n Create pool.\r\n \r\n \r\n \r\n ) : pairState === PairState.INVALID ? (\r\n \r\n \r\n \r\n Invalid pair.\r\n \r\n \r\n \r\n ) : pairState === PairState.LOADING ? (\r\n \r\n \r\n \r\n Loading\r\n \r\n \r\n \r\n \r\n ) : null\r\n ) : (\r\n prerequisiteMessage\r\n )}\r\n \r\n\r\n \r\n \r\n )\r\n}\r\n","import React, { useCallback } from 'react'\nimport styled from 'styled-components'\n\nconst StyledRangeInput = styled.input<{ size: number }>`\n -webkit-appearance: none; /* Hides the slider so that custom slider can be made */\n width: 100%; /* Specific width is required for Firefox. */\n background: transparent; /* Otherwise white in Chrome */\n cursor: pointer;\n\n &:focus {\n outline: none;\n }\n\n &::-moz-focus-outer {\n border: 0;\n }\n\n &::-webkit-slider-thumb {\n -webkit-appearance: none;\n height: ${({ size }) => size}px;\n width: ${({ size }) => size}px;\n background-color: #565a69;\n border-radius: 100%;\n border: none;\n transform: translateY(-50%);\n color: ${({ theme }) => theme.bg1};\n\n &:hover,\n &:focus {\n box-shadow: 0px 0px 1px rgba(0, 0, 0, 0.1), 0px 4px 8px rgba(0, 0, 0, 0.08), 0px 16px 24px rgba(0, 0, 0, 0.06),\n 0px 24px 32px rgba(0, 0, 0, 0.04);\n }\n }\n\n &::-moz-range-thumb {\n height: ${({ size }) => size}px;\n width: ${({ size }) => size}px;\n background-color: #565a69;\n border-radius: 100%;\n border: none;\n color: ${({ theme }) => theme.bg1};\n\n &:hover,\n &:focus {\n box-shadow: 0px 0px 1px rgba(0, 0, 0, 0.1), 0px 4px 8px rgba(0, 0, 0, 0.08), 0px 16px 24px rgba(0, 0, 0, 0.06),\n 0px 24px 32px rgba(0, 0, 0, 0.04);\n }\n }\n\n &::-ms-thumb {\n height: ${({ size }) => size}px;\n width: ${({ size }) => size}px;\n background-color: #565a69;\n border-radius: 100%;\n color: ${({ theme }) => theme.bg1};\n\n &:hover,\n &:focus {\n box-shadow: 0px 0px 1px rgba(0, 0, 0, 0.1), 0px 4px 8px rgba(0, 0, 0, 0.08), 0px 16px 24px rgba(0, 0, 0, 0.06),\n 0px 24px 32px rgba(0, 0, 0, 0.04);\n }\n }\n\n &::-webkit-slider-runnable-track {\n background: linear-gradient(90deg, ${({ theme }) => theme.bg5}, ${({ theme }) => theme.bg3});\n height: 2px;\n }\n\n &::-moz-range-track {\n background: linear-gradient(90deg, ${({ theme }) => theme.bg5}, ${({ theme }) => theme.bg3});\n height: 2px;\n }\n\n &::-ms-track {\n width: 100%;\n border-color: transparent;\n color: transparent;\n\n background: ${({ theme }) => theme.bg5};\n height: 2px;\n }\n &::-ms-fill-lower {\n background: ${({ theme }) => theme.bg5};\n }\n &::-ms-fill-upper {\n background: ${({ theme }) => theme.bg3};\n }\n`\n\ninterface InputSliderProps {\n value: number\n onChange: (value: number) => void\n step?: number\n min?: number\n max?: number\n size?: number\n}\n\nexport default function Slider({ value, onChange, min = 0, step = 1, max = 100, size = 28 }: InputSliderProps) {\n const changeCallback = useCallback(\n e => {\n onChange(parseInt(e.target.value))\n },\n [onChange]\n )\n\n return (\n \n )\n}\n","import { createAction } from '@reduxjs/toolkit'\n\nexport enum Field {\n LIQUIDITY_PERCENT = 'LIQUIDITY_PERCENT',\n LIQUIDITY = 'LIQUIDITY',\n CURRENCY_A = 'CURRENCY_A',\n CURRENCY_B = 'CURRENCY_B'\n}\n\nexport const typeInput = createAction<{ field: Field; typedValue: string }>('burn/typeInputBurn')\n","import { Currency, CurrencyAmount, JSBI, Pair, Percent, TokenAmount } from '@levinswap/uniswap-sdk'\nimport { useCallback } from 'react'\nimport { useDispatch, useSelector } from 'react-redux'\nimport { usePair } from '../../data/Reserves'\nimport { useTotalSupply } from '../../data/TotalSupply'\n\nimport { useActiveWeb3React } from '../../hooks'\nimport { wrappedCurrency } from '../../utils/wrappedCurrency'\nimport { AppDispatch, AppState } from '../index'\nimport { tryParseAmount } from '../swap/hooks'\nimport { useTokenBalances } from '../wallet/hooks'\nimport { Field, typeInput } from './actions'\n\nexport function useBurnState(): AppState['burn'] {\n return useSelector(state => state.burn)\n}\n\nexport function useDerivedBurnInfo(\n currencyA: Currency | undefined,\n currencyB: Currency | undefined\n): {\n pair?: Pair | null\n parsedAmounts: {\n [Field.LIQUIDITY_PERCENT]: Percent\n [Field.LIQUIDITY]?: TokenAmount\n [Field.CURRENCY_A]?: CurrencyAmount\n [Field.CURRENCY_B]?: CurrencyAmount\n }\n error?: string\n} {\n const { account, chainId } = useActiveWeb3React()\n\n const { independentField, typedValue } = useBurnState()\n\n // pair + totalsupply\n const [, pair] = usePair(currencyA, currencyB)\n\n // balances\n const relevantTokenBalances = useTokenBalances(account ?? undefined, [pair?.liquidityToken])\n const userLiquidity: undefined | TokenAmount = relevantTokenBalances?.[pair?.liquidityToken?.address ?? '']\n\n const [tokenA, tokenB] = [wrappedCurrency(currencyA, chainId), wrappedCurrency(currencyB, chainId)]\n const tokens = {\n [Field.CURRENCY_A]: tokenA,\n [Field.CURRENCY_B]: tokenB,\n [Field.LIQUIDITY]: pair?.liquidityToken\n }\n\n // liquidity values\n const totalSupply = useTotalSupply(pair?.liquidityToken)\n const liquidityValueA =\n pair &&\n totalSupply &&\n userLiquidity &&\n tokenA &&\n // this condition is a short-circuit in the case where useTokenBalance updates sooner than useTotalSupply\n JSBI.greaterThanOrEqual(totalSupply.raw, userLiquidity.raw)\n ? new TokenAmount(tokenA, pair.getLiquidityValue(tokenA, totalSupply, userLiquidity, false).raw)\n : undefined\n const liquidityValueB =\n pair &&\n totalSupply &&\n userLiquidity &&\n tokenB &&\n // this condition is a short-circuit in the case where useTokenBalance updates sooner than useTotalSupply\n JSBI.greaterThanOrEqual(totalSupply.raw, userLiquidity.raw)\n ? new TokenAmount(tokenB, pair.getLiquidityValue(tokenB, totalSupply, userLiquidity, false).raw)\n : undefined\n const liquidityValues: { [Field.CURRENCY_A]?: TokenAmount; [Field.CURRENCY_B]?: TokenAmount } = {\n [Field.CURRENCY_A]: liquidityValueA,\n [Field.CURRENCY_B]: liquidityValueB\n }\n\n let percentToRemove: Percent = new Percent('0', '100')\n // user specified a %\n if (independentField === Field.LIQUIDITY_PERCENT) {\n percentToRemove = new Percent(typedValue, '100')\n }\n // user specified a specific amount of liquidity tokens\n else if (independentField === Field.LIQUIDITY) {\n if (pair?.liquidityToken) {\n const independentAmount = tryParseAmount(typedValue, pair.liquidityToken)\n if (independentAmount && userLiquidity && !independentAmount.greaterThan(userLiquidity)) {\n percentToRemove = new Percent(independentAmount.raw, userLiquidity.raw)\n }\n }\n }\n // user specified a specific amount of token a or b\n else {\n if (tokens[independentField]) {\n const independentAmount = tryParseAmount(typedValue, tokens[independentField])\n const liquidityValue = liquidityValues[independentField]\n if (independentAmount && liquidityValue && !independentAmount.greaterThan(liquidityValue)) {\n percentToRemove = new Percent(independentAmount.raw, liquidityValue.raw)\n }\n }\n }\n\n const parsedAmounts: {\n [Field.LIQUIDITY_PERCENT]: Percent\n [Field.LIQUIDITY]?: TokenAmount\n [Field.CURRENCY_A]?: TokenAmount\n [Field.CURRENCY_B]?: TokenAmount\n } = {\n [Field.LIQUIDITY_PERCENT]: percentToRemove,\n [Field.LIQUIDITY]:\n userLiquidity && percentToRemove && percentToRemove.greaterThan('0')\n ? new TokenAmount(userLiquidity.token, percentToRemove.multiply(userLiquidity.raw).quotient)\n : undefined,\n [Field.CURRENCY_A]:\n tokenA && percentToRemove && percentToRemove.greaterThan('0') && liquidityValueA\n ? new TokenAmount(tokenA, percentToRemove.multiply(liquidityValueA.raw).quotient)\n : undefined,\n [Field.CURRENCY_B]:\n tokenB && percentToRemove && percentToRemove.greaterThan('0') && liquidityValueB\n ? new TokenAmount(tokenB, percentToRemove.multiply(liquidityValueB.raw).quotient)\n : undefined\n }\n\n let error: string | undefined\n if (!account) {\n error = 'Connect Wallet'\n }\n\n if (!parsedAmounts[Field.LIQUIDITY] || !parsedAmounts[Field.CURRENCY_A] || !parsedAmounts[Field.CURRENCY_B]) {\n error = error ?? 'Enter an amount'\n }\n\n return { pair, parsedAmounts, error }\n}\n\nexport function useBurnActionHandlers(): {\n onUserInput: (field: Field, typedValue: string) => void\n} {\n const dispatch = useDispatch()\n\n const onUserInput = useCallback(\n (field: Field, typedValue: string) => {\n dispatch(typeInput({ field, typedValue }))\n },\n [dispatch]\n )\n\n return {\n onUserInput\n }\n}\n","// import { splitSignature } from '@ethersproject/bytes'\nimport { Contract } from '@ethersproject/contracts'\nimport { TransactionResponse } from '@ethersproject/providers'\nimport { Currency, currencyEquals, ETHER, Percent, WETH } from '@levinswap/uniswap-sdk'\nimport React, { useCallback, useContext, useMemo, useState } from 'react'\nimport { ArrowDown, Plus } from 'react-feather'\nimport ReactGA from 'react-ga'\nimport { RouteComponentProps } from 'react-router'\nimport { Text } from 'rebass'\nimport { ThemeContext } from 'styled-components'\nimport { ButtonPrimary, ButtonLight, ButtonError, ButtonConfirmed } from '../../components/Button'\nimport { LightCard } from '../../components/Card'\nimport { AutoColumn, ColumnCenter } from '../../components/Column'\nimport TransactionConfirmationModal, { ConfirmationModalContent } from '../../components/TransactionConfirmationModal'\nimport CurrencyInputPanel from '../../components/CurrencyInputPanel'\nimport DoubleCurrencyLogo from '../../components/DoubleLogo'\nimport { AddRemoveTabs } from '../../components/NavigationTabs'\nimport { MinimalPositionCard } from '../../components/PositionCard'\nimport Row, { RowBetween, RowFixed } from '../../components/Row'\n\nimport Slider from '../../components/Slider'\nimport CurrencyLogo from '../../components/CurrencyLogo'\nimport { ROUTER_ADDRESS } from '../../constants'\nimport { useActiveWeb3React } from '../../hooks'\nimport { useCurrency } from '../../hooks/Tokens'\nimport { usePairContract } from '../../hooks/useContract'\nimport useTransactionDeadline from '../../hooks/useTransactionDeadline'\n\nimport { useTransactionAdder } from '../../state/transactions/hooks'\nimport { StyledInternalLink, TYPE } from '../../theme'\nimport { calculateGasMargin, calculateSlippageAmount, getRouterContract } from '../../utils'\nimport { currencyId } from '../../utils/currencyId'\nimport useDebouncedChangeHandler from '../../utils/useDebouncedChangeHandler'\nimport { wrappedCurrency } from '../../utils/wrappedCurrency'\nimport AppBody from '../AppBody'\nimport { ClickableText, MaxButton, Wrapper } from '../Pool/styleds'\nimport { useApproveCallback, ApprovalState } from '../../hooks/useApproveCallback'\nimport { Dots } from '../../components/swap/styleds'\nimport { useBurnActionHandlers } from '../../state/burn/hooks'\nimport { useDerivedBurnInfo, useBurnState } from '../../state/burn/hooks'\nimport { Field } from '../../state/burn/actions'\nimport { useWalletModalToggle } from '../../state/application/hooks'\nimport { useUserSlippageTolerance } from '../../state/user/hooks'\nimport { BigNumber } from '@ethersproject/bignumber'\n\nexport default function RemoveLiquidity({\n history,\n match: {\n params: { currencyIdA, currencyIdB }\n }\n}: RouteComponentProps<{ currencyIdA: string; currencyIdB: string }>) {\n const [currencyA, currencyB] = [useCurrency(currencyIdA) ?? undefined, useCurrency(currencyIdB) ?? undefined]\n const { account, chainId, library } = useActiveWeb3React()\n const [tokenA, tokenB] = useMemo(() => [wrappedCurrency(currencyA, chainId), wrappedCurrency(currencyB, chainId)], [\n currencyA,\n currencyB,\n chainId\n ])\n\n const theme = useContext(ThemeContext)\n\n // toggle wallet when disconnected\n const toggleWalletModal = useWalletModalToggle()\n\n // burn state\n const { independentField, typedValue } = useBurnState()\n const { pair, parsedAmounts, error } = useDerivedBurnInfo(currencyA ?? undefined, currencyB ?? undefined)\n const { onUserInput: _onUserInput } = useBurnActionHandlers()\n const isValid = !error\n\n // modal and loading\n const [showConfirm, setShowConfirm] = useState(false)\n const [showDetailed, setShowDetailed] = useState(false)\n const [attemptingTxn, setAttemptingTxn] = useState(false) // clicked confirm\n\n // txn values\n const [txHash, setTxHash] = useState('')\n const deadline = useTransactionDeadline()\n const [allowedSlippage] = useUserSlippageTolerance()\n\n const formattedAmounts = {\n [Field.LIQUIDITY_PERCENT]: parsedAmounts[Field.LIQUIDITY_PERCENT].equalTo('0')\n ? '0'\n : parsedAmounts[Field.LIQUIDITY_PERCENT].lessThan(new Percent('1', '100'))\n ? '<1'\n : parsedAmounts[Field.LIQUIDITY_PERCENT].toFixed(0),\n [Field.LIQUIDITY]:\n independentField === Field.LIQUIDITY ? typedValue : parsedAmounts[Field.LIQUIDITY]?.toSignificant(6) ?? '',\n [Field.CURRENCY_A]:\n independentField === Field.CURRENCY_A ? typedValue : parsedAmounts[Field.CURRENCY_A]?.toSignificant(6) ?? '',\n [Field.CURRENCY_B]:\n independentField === Field.CURRENCY_B ? typedValue : parsedAmounts[Field.CURRENCY_B]?.toSignificant(6) ?? ''\n }\n\n const atMaxAmount = parsedAmounts[Field.LIQUIDITY_PERCENT]?.equalTo(new Percent('1'))\n\n // pair contract\n const pairContract: Contract | null = usePairContract(pair?.liquidityToken?.address)\n\n // allowance handling\n const [signatureData, setSignatureData] = useState<{ v: number; r: string; s: string; deadline: number } | null>(null)\n const [approval, approveCallback] = useApproveCallback(parsedAmounts[Field.LIQUIDITY], ROUTER_ADDRESS)\n\n async function onAttemptToApprove() {\n if (!pairContract || !pair || !library || !deadline) throw new Error('missing dependencies')\n const liquidityAmount = parsedAmounts[Field.LIQUIDITY]\n if (!liquidityAmount) throw new Error('missing liquidity amount')\n\n // try to gather a signature for permission\n // const nonce = await pairContract.nonces(account)\n\n // const EIP712Domain = [\n // { name: 'name', type: 'string' },\n // { name: 'version', type: 'string' },\n // { name: 'chainId', type: 'uint256' },\n // { name: 'verifyingContract', type: 'address' }\n // ]\n // const domain = {\n // name: 'Uniswap V2',\n // version: '1',\n // chainId: chainId,\n // verifyingContract: pair.liquidityToken.address\n // }\n // const Permit = [\n // { name: 'owner', type: 'address' },\n // { name: 'spender', type: 'address' },\n // { name: 'value', type: 'uint256' },\n // { name: 'nonce', type: 'uint256' },\n // { name: 'deadline', type: 'uint256' }\n // ]\n // const message = {\n // owner: account,\n // spender: ROUTER_ADDRESS,\n // value: liquidityAmount.raw.toString(),\n // nonce: nonce.toHexString(),\n // deadline: deadline.toNumber()\n // }\n // const data = JSON.stringify({\n // types: {\n // EIP712Domain,\n // Permit\n // },\n // domain,\n // primaryType: 'Permit',\n // message\n // })\n\n // library\n // .send('eth_signTypedData_v4', [account, data])\n // .then(splitSignature)\n // .then(signature => {\n // setSignatureData({\n // v: signature.v,\n // r: signature.r,\n // s: signature.s,\n // deadline: deadline.toNumber()\n // })\n // })\n // .catch(error => {\n // // for all errors other than 4001 (EIP-1193 user rejected request), fall back to manual approve\n // if (error?.code !== 4001) {\n // approveCallback()\n // }\n // })\n approveCallback()\n }\n\n // wrapped onUserInput to clear signatures\n const onUserInput = useCallback(\n (field: Field, typedValue: string) => {\n setSignatureData(null)\n return _onUserInput(field, typedValue)\n },\n [_onUserInput]\n )\n\n const onLiquidityInput = useCallback((typedValue: string): void => onUserInput(Field.LIQUIDITY, typedValue), [\n onUserInput\n ])\n const onCurrencyAInput = useCallback((typedValue: string): void => onUserInput(Field.CURRENCY_A, typedValue), [\n onUserInput\n ])\n const onCurrencyBInput = useCallback((typedValue: string): void => onUserInput(Field.CURRENCY_B, typedValue), [\n onUserInput\n ])\n\n // tx sending\n const addTransaction = useTransactionAdder()\n async function onRemove() {\n if (!chainId || !library || !account || !deadline) throw new Error('missing dependencies')\n const { [Field.CURRENCY_A]: currencyAmountA, [Field.CURRENCY_B]: currencyAmountB } = parsedAmounts\n if (!currencyAmountA || !currencyAmountB) {\n throw new Error('missing currency amounts')\n }\n const router = getRouterContract(chainId, library, account)\n\n const amountsMin = {\n [Field.CURRENCY_A]: calculateSlippageAmount(currencyAmountA, allowedSlippage)[0],\n [Field.CURRENCY_B]: calculateSlippageAmount(currencyAmountB, allowedSlippage)[0]\n }\n\n if (!currencyA || !currencyB) throw new Error('missing tokens')\n const liquidityAmount = parsedAmounts[Field.LIQUIDITY]\n if (!liquidityAmount) throw new Error('missing liquidity amount')\n\n const currencyBIsETH = currencyB === ETHER\n const oneCurrencyIsETH = currencyA === ETHER || currencyBIsETH\n\n if (!tokenA || !tokenB) throw new Error('could not wrap')\n\n let methodNames: string[], args: Array\n // we have approval, use normal remove liquidity\n if (approval === ApprovalState.APPROVED) {\n // removeLiquidityETH\n if (oneCurrencyIsETH) {\n methodNames = ['removeLiquidityETH', 'removeLiquidityETHSupportingFeeOnTransferTokens']\n args = [\n currencyBIsETH ? tokenA.address : tokenB.address,\n liquidityAmount.raw.toString(),\n amountsMin[currencyBIsETH ? Field.CURRENCY_A : Field.CURRENCY_B].toString(),\n amountsMin[currencyBIsETH ? Field.CURRENCY_B : Field.CURRENCY_A].toString(),\n account,\n deadline.toHexString()\n ]\n }\n // removeLiquidity\n else {\n methodNames = ['removeLiquidity']\n args = [\n tokenA.address,\n tokenB.address,\n liquidityAmount.raw.toString(),\n amountsMin[Field.CURRENCY_A].toString(),\n amountsMin[Field.CURRENCY_B].toString(),\n account,\n deadline.toHexString()\n ]\n }\n }\n // we have a signataure, use permit versions of remove liquidity\n else if (signatureData !== null) {\n // removeLiquidityETHWithPermit\n if (oneCurrencyIsETH) {\n methodNames = ['removeLiquidityETHWithPermit', 'removeLiquidityETHWithPermitSupportingFeeOnTransferTokens']\n args = [\n currencyBIsETH ? tokenA.address : tokenB.address,\n liquidityAmount.raw.toString(),\n amountsMin[currencyBIsETH ? Field.CURRENCY_A : Field.CURRENCY_B].toString(),\n amountsMin[currencyBIsETH ? Field.CURRENCY_B : Field.CURRENCY_A].toString(),\n account,\n signatureData.deadline,\n false,\n signatureData.v,\n signatureData.r,\n signatureData.s\n ]\n }\n // removeLiquidityETHWithPermit\n else {\n methodNames = ['removeLiquidityWithPermit']\n args = [\n tokenA.address,\n tokenB.address,\n liquidityAmount.raw.toString(),\n amountsMin[Field.CURRENCY_A].toString(),\n amountsMin[Field.CURRENCY_B].toString(),\n account,\n signatureData.deadline,\n false,\n signatureData.v,\n signatureData.r,\n signatureData.s\n ]\n }\n } else {\n throw new Error('Attempting to confirm without approval or a signature. Please contact support.')\n }\n\n const safeGasEstimates: (BigNumber | undefined)[] = await Promise.all(\n methodNames.map(methodName =>\n router.estimateGas[methodName](...args)\n .then(calculateGasMargin)\n .catch(error => {\n console.error(`estimateGas failed`, methodName, args, error)\n return undefined\n })\n )\n )\n\n const indexOfSuccessfulEstimation = safeGasEstimates.findIndex(safeGasEstimate =>\n BigNumber.isBigNumber(safeGasEstimate)\n )\n\n // all estimations failed...\n if (indexOfSuccessfulEstimation === -1) {\n console.error('This transaction would fail. Please contact support.')\n } else {\n const methodName = methodNames[indexOfSuccessfulEstimation]\n const safeGasEstimate = safeGasEstimates[indexOfSuccessfulEstimation]\n\n setAttemptingTxn(true)\n await router[methodName](...args, {\n gasLimit: safeGasEstimate\n })\n .then((response: TransactionResponse) => {\n setAttemptingTxn(false)\n\n addTransaction(response, {\n summary:\n 'Remove ' +\n parsedAmounts[Field.CURRENCY_A]?.toSignificant(3) +\n ' ' +\n currencyA?.symbol +\n ' and ' +\n parsedAmounts[Field.CURRENCY_B]?.toSignificant(3) +\n ' ' +\n currencyB?.symbol\n })\n\n setTxHash(response.hash)\n\n ReactGA.event({\n category: 'Liquidity',\n action: 'Remove',\n label: [currencyA?.symbol, currencyB?.symbol].join('/')\n })\n })\n .catch((error: Error) => {\n setAttemptingTxn(false)\n // we only care if the error is something _other_ than the user rejected the tx\n console.error(error)\n })\n }\n }\n\n function modalHeader() {\n return (\n \n \n \n {parsedAmounts[Field.CURRENCY_A]?.toSignificant(6)}\n \n \n \n \n {currencyA?.symbol}\n \n \n \n \n \n \n \n \n {parsedAmounts[Field.CURRENCY_B]?.toSignificant(6)}\n \n \n \n \n {currencyB?.symbol}\n \n \n \n\n \n {`Output is estimated. If the price changes by more than ${allowedSlippage /\n 100}% your transaction will revert.`}\n \n \n )\n }\n\n function modalBottom() {\n return (\n <>\n \n \n {'UNI ' + currencyA?.symbol + '/' + currencyB?.symbol} Burned\n \n \n \n \n {parsedAmounts[Field.LIQUIDITY]?.toSignificant(6)}\n \n \n \n {pair && (\n <>\n \n \n Price\n \n \n 1 {currencyA?.symbol} = {tokenA ? pair.priceOf(tokenA).toSignificant(6) : '-'} {currencyB?.symbol}\n \n \n \n
    \n \n 1 {currencyB?.symbol} = {tokenB ? pair.priceOf(tokenB).toSignificant(6) : '-'} {currencyA?.symbol}\n \n \n \n )}\n \n \n Confirm\n \n \n \n )\n }\n\n const pendingText = `Removing ${parsedAmounts[Field.CURRENCY_A]?.toSignificant(6)} ${\n currencyA?.symbol\n } and ${parsedAmounts[Field.CURRENCY_B]?.toSignificant(6)} ${currencyB?.symbol}`\n\n const liquidityPercentChangeCallback = useCallback(\n (value: number) => {\n onUserInput(Field.LIQUIDITY_PERCENT, value.toString())\n },\n [onUserInput]\n )\n\n const oneCurrencyIsETH = currencyA === ETHER || currencyB === ETHER\n const oneCurrencyIsWETH = Boolean(\n chainId &&\n ((currencyA && currencyEquals(WETH[chainId], currencyA)) ||\n (currencyB && currencyEquals(WETH[chainId], currencyB)))\n )\n\n const handleSelectCurrencyA = useCallback(\n (currency: Currency) => {\n if (currencyIdB && currencyId(currency) === currencyIdB) {\n history.push(`/remove/${currencyId(currency)}/${currencyIdA}`)\n } else {\n history.push(`/remove/${currencyId(currency)}/${currencyIdB}`)\n }\n },\n [currencyIdA, currencyIdB, history]\n )\n const handleSelectCurrencyB = useCallback(\n (currency: Currency) => {\n if (currencyIdA && currencyId(currency) === currencyIdA) {\n history.push(`/remove/${currencyIdB}/${currencyId(currency)}`)\n } else {\n history.push(`/remove/${currencyIdA}/${currencyId(currency)}`)\n }\n },\n [currencyIdA, currencyIdB, history]\n )\n\n const handleDismissConfirmation = useCallback(() => {\n setShowConfirm(false)\n setSignatureData(null) // important that we clear signature data to avoid bad sigs\n // if there was a tx hash, we want to clear the input\n if (txHash) {\n onUserInput(Field.LIQUIDITY_PERCENT, '0')\n }\n setTxHash('')\n }, [onUserInput, txHash])\n\n const [innerLiquidityPercentage, setInnerLiquidityPercentage] = useDebouncedChangeHandler(\n Number.parseInt(parsedAmounts[Field.LIQUIDITY_PERCENT].toFixed(0)),\n liquidityPercentChangeCallback\n )\n\n return (\n <>\n \n \n \n (\n \n )}\n pendingText={pendingText}\n />\n \n \n \n \n Amount\n {\n setShowDetailed(!showDetailed)\n }}\n >\n {showDetailed ? 'Simple' : 'Detailed'}\n \n \n \n \n {formattedAmounts[Field.LIQUIDITY_PERCENT]}%\n \n \n {!showDetailed && (\n <>\n \n \n onUserInput(Field.LIQUIDITY_PERCENT, '25')} width=\"20%\">\n 25%\n \n onUserInput(Field.LIQUIDITY_PERCENT, '50')} width=\"20%\">\n 50%\n \n onUserInput(Field.LIQUIDITY_PERCENT, '75')} width=\"20%\">\n 75%\n \n onUserInput(Field.LIQUIDITY_PERCENT, '100')} width=\"20%\">\n Max\n \n \n \n )}\n \n \n {!showDetailed && (\n <>\n \n \n \n \n \n \n \n {formattedAmounts[Field.CURRENCY_A] || '-'}\n \n \n \n \n {currencyA?.symbol}\n \n \n \n \n \n {formattedAmounts[Field.CURRENCY_B] || '-'}\n \n \n \n \n {currencyB?.symbol}\n \n \n \n {chainId && (oneCurrencyIsWETH || oneCurrencyIsETH) ? (\n \n {oneCurrencyIsETH ? (\n \n Receive WETH\n \n ) : oneCurrencyIsWETH ? (\n \n Receive ETH\n \n ) : null}\n \n ) : null}\n \n \n \n )}\n\n {showDetailed && (\n <>\n {\n onUserInput(Field.LIQUIDITY_PERCENT, '100')\n }}\n showMaxButton={!atMaxAmount}\n disableCurrencySelect\n currency={pair?.liquidityToken}\n pair={pair}\n id=\"liquidity-amount\"\n />\n \n \n \n onUserInput(Field.LIQUIDITY_PERCENT, '100')}\n showMaxButton={!atMaxAmount}\n currency={currencyA}\n label={'Output'}\n onCurrencySelect={handleSelectCurrencyA}\n id=\"remove-liquidity-tokena\"\n />\n \n \n \n onUserInput(Field.LIQUIDITY_PERCENT, '100')}\n showMaxButton={!atMaxAmount}\n currency={currencyB}\n label={'Output'}\n onCurrencySelect={handleSelectCurrencyB}\n id=\"remove-liquidity-tokenb\"\n />\n \n )}\n {pair && (\n
    \n \n Price:\n
    \n 1 {currencyA?.symbol} = {tokenA ? pair.priceOf(tokenA).toSignificant(6) : '-'} {currencyB?.symbol}\n
    \n
    \n \n
    \n
    \n 1 {currencyB?.symbol} = {tokenB ? pair.priceOf(tokenB).toSignificant(6) : '-'} {currencyA?.symbol}\n
    \n \n
    \n )}\n
    \n {!account ? (\n Connect Wallet\n ) : (\n \n \n {approval === ApprovalState.PENDING ? (\n Approving\n ) : approval === ApprovalState.APPROVED || signatureData !== null ? (\n 'Approved'\n ) : (\n 'Approve'\n )}\n \n {\n setShowConfirm(true)\n }}\n disabled={!isValid || (signatureData === null && approval !== ApprovalState.APPROVED)}\n error={!isValid && !!parsedAmounts[Field.CURRENCY_A] && !!parsedAmounts[Field.CURRENCY_B]}\n >\n \n {error || 'Remove'}\n \n \n \n )}\n
    \n \n \n \n\n {pair ? (\n \n \n \n ) : null}\n \n )\n}\n","import { useCallback, useEffect, useRef, useState } from 'react'\n\n/**\n * Easy way to debounce the handling of a rapidly changing value, e.g. a changing slider input\n * @param value value that is rapidly changing\n * @param onChange change handler that should receive the debounced updates to the value\n * @param debouncedMs how long we should wait for changes to be applied\n */\nexport default function useDebouncedChangeHandler(\n value: T,\n onChange: (newValue: T) => void,\n debouncedMs = 100\n): [T, (value: T) => void] {\n const [inner, setInner] = useState(() => value)\n const timer = useRef>()\n\n const onChangeInner = useCallback(\n (newValue: T) => {\n setInner(newValue)\n if (timer.current) {\n clearTimeout(timer.current)\n }\n timer.current = setTimeout(() => {\n onChange(newValue)\n timer.current = undefined\n }, debouncedMs)\n },\n [debouncedMs, onChange]\n )\n\n useEffect(() => {\n if (timer.current) {\n clearTimeout(timer.current)\n timer.current = undefined\n }\n setInner(value)\n }, [value])\n\n return [inner, onChangeInner]\n}\n","import React from 'react'\nimport { RouteComponentProps, Redirect } from 'react-router-dom'\n\nconst OLD_PATH_STRUCTURE = /^(0x[a-fA-F0-9]{40})-(0x[a-fA-F0-9]{40})$/\n\nexport function RedirectOldRemoveLiquidityPathStructure({\n match: {\n params: { tokens }\n }\n}: RouteComponentProps<{ tokens: string }>) {\n if (!OLD_PATH_STRUCTURE.test(tokens)) {\n return \n }\n const [currency0, currency1] = tokens.split('-')\n\n return \n}\n","import React, { useContext, useCallback } from 'react'\r\nimport styled, { ThemeContext } from 'styled-components'\r\nimport useENS from '../../hooks/useENS'\r\nimport { useActiveWeb3React } from '../../hooks'\r\nimport { ExternalLink, TYPE } from '../../theme'\r\nimport { AutoColumn } from '../Column'\r\nimport { RowBetween } from '../Row'\r\nimport { getEtherscanLink } from '../../utils'\r\n\r\nconst InputPanel = styled.div`\r\n ${({ theme }) => theme.flexColumnNoWrap}\r\n position: relative;\r\n border-radius: 5px;\r\n background-color: ${({ theme }) => theme.bg1};\r\n z-index: 1;\r\n width: 100%;\r\n`\r\n\r\nconst ContainerRow = styled.div<{ error: boolean }>`\r\n display: flex;\r\n justify-content: center;\r\n align-items: center;\r\n border-radius: 5px;\r\n border: 1px solid ${({ error, theme }) => (error ? theme.red1 : theme.bg2)};\r\n transition: border-color 300ms ${({ error }) => (error ? 'step-end' : 'step-start')},\r\n color 500ms ${({ error }) => (error ? 'step-end' : 'step-start')};\r\n background-color: ${({ theme }) => theme.bg1};\r\n`\r\n\r\nconst InputContainer = styled.div`\r\n flex: 1;\r\n padding: 1rem;\r\n`\r\n\r\nconst Input = styled.input<{ error?: boolean }>`\r\n font-size: 1.25rem;\r\n outline: none;\r\n border: none;\r\n flex: 1 1 auto;\r\n width: 0;\r\n background-color: ${({ theme }) => theme.bg1};\r\n transition: color 300ms ${({ error }) => (error ? 'step-end' : 'step-start')};\r\n color: ${({ error, theme }) => (error ? theme.red1 : theme.primary1)};\r\n overflow: hidden;\r\n text-overflow: ellipsis;\r\n font-weight: 500;\r\n width: 100%;\r\n ::placeholder {\r\n color: ${({ theme }) => theme.text4};\r\n }\r\n padding: 0px;\r\n -webkit-appearance: textfield;\r\n\r\n ::-webkit-search-decoration {\r\n -webkit-appearance: none;\r\n }\r\n\r\n ::-webkit-outer-spin-button,\r\n ::-webkit-inner-spin-button {\r\n -webkit-appearance: none;\r\n }\r\n\r\n ::placeholder {\r\n color: ${({ theme }) => theme.text4};\r\n }\r\n`\r\n\r\nexport default function AddressInputPanel({\r\n id,\r\n value,\r\n onChange\r\n}: {\r\n id?: string\r\n // the typed string value\r\n value: string\r\n // triggers whenever the typed value changes\r\n onChange: (value: string) => void\r\n}) {\r\n const { chainId } = useActiveWeb3React()\r\n const theme = useContext(ThemeContext)\r\n\r\n const { address, loading, name } = useENS(value)\r\n\r\n const handleInput = useCallback(\r\n event => {\r\n const input = event.target.value\r\n const withoutSpaces = input.replace(/\\s+/g, '')\r\n onChange(withoutSpaces)\r\n },\r\n [onChange]\r\n )\r\n\r\n const error = Boolean(value.length > 0 && !loading && !address)\r\n\r\n return (\r\n \r\n \r\n \r\n \r\n \r\n \r\n Recipient\r\n \r\n {address && chainId && (\r\n \r\n (View on Blockscout)\r\n \r\n )}\r\n \r\n \r\n \r\n \r\n \r\n \r\n )\r\n}\r\n","import { Percent } from '@levinswap/uniswap-sdk'\nimport React from 'react'\nimport { ONE_BIPS } from '../../constants'\nimport { warningSeverity } from '../../utils/prices'\nimport { ErrorText } from './styleds'\n\n/**\n * Formatted version of price impact text with warning colors\n */\nexport default function FormattedPriceImpact({ priceImpact }: { priceImpact?: Percent }) {\n return (\n \n {priceImpact ? (priceImpact.lessThan(ONE_BIPS) ? '<0.01%' : `${priceImpact.toFixed(2)}%`) : '-'}\n \n )\n}\n","import { Trade, TradeType } from '@levinswap/uniswap-sdk'\nimport React, { useContext, useMemo, useState } from 'react'\nimport { Repeat } from 'react-feather'\nimport { Text } from 'rebass'\nimport { ThemeContext } from 'styled-components'\nimport { Field } from '../../state/swap/actions'\nimport { TYPE } from '../../theme'\nimport {\n computeSlippageAdjustedAmounts,\n computeTradePriceBreakdown,\n formatExecutionPrice,\n warningSeverity\n} from '../../utils/prices'\nimport { ButtonError } from '../Button'\nimport { AutoColumn } from '../Column'\nimport QuestionHelper from '../QuestionHelper'\nimport { AutoRow, RowBetween, RowFixed } from '../Row'\nimport FormattedPriceImpact from './FormattedPriceImpact'\nimport { StyledBalanceMaxMini, SwapCallbackError } from './styleds'\n\nexport default function SwapModalFooter({\n trade,\n onConfirm,\n allowedSlippage,\n swapErrorMessage,\n disabledConfirm\n}: {\n trade: Trade\n allowedSlippage: number\n onConfirm: () => void\n swapErrorMessage: string | undefined\n disabledConfirm: boolean\n}) {\n const [showInverted, setShowInverted] = useState(false)\n const theme = useContext(ThemeContext)\n const slippageAdjustedAmounts = useMemo(() => computeSlippageAdjustedAmounts(trade, allowedSlippage), [\n allowedSlippage,\n trade\n ])\n const { priceImpactWithoutFee, realizedLPFee } = useMemo(() => computeTradePriceBreakdown(trade), [trade])\n const severity = warningSeverity(priceImpactWithoutFee)\n\n return (\n <>\n \n \n \n Price\n \n \n {formatExecutionPrice(trade, showInverted)}\n setShowInverted(!showInverted)}>\n \n \n \n \n\n \n \n \n {trade.tradeType === TradeType.EXACT_INPUT ? 'Minimum received' : 'Maximum sold'}\n \n \n \n \n \n {trade.tradeType === TradeType.EXACT_INPUT\n ? slippageAdjustedAmounts[Field.OUTPUT]?.toSignificant(4) ?? '-'\n : slippageAdjustedAmounts[Field.INPUT]?.toSignificant(4) ?? '-'}\n \n \n {trade.tradeType === TradeType.EXACT_INPUT\n ? trade.outputAmount.currency.symbol\n : trade.inputAmount.currency.symbol}\n \n \n \n \n \n \n Price Impact\n \n \n \n \n \n \n \n \n Liquidity Provider Fee\n \n \n \n \n {realizedLPFee ? realizedLPFee?.toSignificant(6) + ' ' + trade.inputAmount.currency.symbol : '-'}\n \n \n \n\n \n 2}\n style={{ margin: '10px 0 0 0' }}\n id=\"confirm-swap-or-send\"\n >\n \n {severity > 2 ? 'Swap Anyway' : 'Confirm Swap'}\n \n \n\n {swapErrorMessage ? : null}\n \n \n )\n}\n","import { Trade, TradeType } from '@levinswap/uniswap-sdk'\nimport React, { useContext, useMemo } from 'react'\nimport { ArrowDown, AlertTriangle } from 'react-feather'\nimport { Text } from 'rebass'\nimport { ThemeContext } from 'styled-components'\nimport { Field } from '../../state/swap/actions'\nimport { TYPE } from '../../theme'\nimport { ButtonPrimary } from '../Button'\nimport { isAddress, shortenAddress } from '../../utils'\nimport { computeSlippageAdjustedAmounts, computeTradePriceBreakdown, warningSeverity } from '../../utils/prices'\nimport { AutoColumn } from '../Column'\nimport CurrencyLogo from '../CurrencyLogo'\nimport { RowBetween, RowFixed } from '../Row'\nimport { TruncatedText, SwapShowAcceptChanges } from './styleds'\n\nexport default function SwapModalHeader({\n trade,\n allowedSlippage,\n recipient,\n showAcceptChanges,\n onAcceptChanges\n}: {\n trade: Trade\n allowedSlippage: number\n recipient: string | null\n showAcceptChanges: boolean\n onAcceptChanges: () => void\n}) {\n const slippageAdjustedAmounts = useMemo(() => computeSlippageAdjustedAmounts(trade, allowedSlippage), [\n trade,\n allowedSlippage\n ])\n const { priceImpactWithoutFee } = useMemo(() => computeTradePriceBreakdown(trade), [trade])\n const priceImpactSeverity = warningSeverity(priceImpactWithoutFee)\n\n const theme = useContext(ThemeContext)\n\n return (\n \n \n \n \n \n {trade.inputAmount.toSignificant(6)}\n \n \n \n \n {trade.inputAmount.currency.symbol}\n \n \n \n \n \n \n \n \n \n 2\n ? theme.red1\n : showAcceptChanges && trade.tradeType === TradeType.EXACT_INPUT\n ? theme.primary1\n : ''\n }\n >\n {trade.outputAmount.toSignificant(6)}\n \n \n \n \n {trade.outputAmount.currency.symbol}\n \n \n \n {showAcceptChanges ? (\n \n \n \n \n Price Updated\n \n \n Accept\n \n \n \n ) : null}\n \n {trade.tradeType === TradeType.EXACT_INPUT ? (\n \n {`Output is estimated. You will receive at least `}\n \n {slippageAdjustedAmounts[Field.OUTPUT]?.toSignificant(6)} {trade.outputAmount.currency.symbol}\n \n {' or the transaction will revert.'}\n \n ) : (\n \n {`Input is estimated. You will sell at most `}\n \n {slippageAdjustedAmounts[Field.INPUT]?.toSignificant(6)} {trade.inputAmount.currency.symbol}\n \n {' or the transaction will revert.'}\n \n )}\n \n {recipient !== null ? (\n \n \n Output will be sent to{' '}\n {isAddress(recipient) ? shortenAddress(recipient) : recipient}\n \n \n ) : null}\n \n )\n}\n","import { currencyEquals, Trade } from '@levinswap/uniswap-sdk'\nimport React, { useCallback, useMemo } from 'react'\nimport TransactionConfirmationModal, {\n ConfirmationModalContent,\n TransactionErrorContent\n} from '../TransactionConfirmationModal'\nimport SwapModalFooter from './SwapModalFooter'\nimport SwapModalHeader from './SwapModalHeader'\n\n/**\n * Returns true if the trade requires a confirmation of details before we can submit it\n * @param tradeA trade A\n * @param tradeB trade B\n */\nfunction tradeMeaningfullyDiffers(tradeA: Trade, tradeB: Trade): boolean {\n return (\n tradeA.tradeType !== tradeB.tradeType ||\n !currencyEquals(tradeA.inputAmount.currency, tradeB.inputAmount.currency) ||\n !tradeA.inputAmount.equalTo(tradeB.inputAmount) ||\n !currencyEquals(tradeA.outputAmount.currency, tradeB.outputAmount.currency) ||\n !tradeA.outputAmount.equalTo(tradeB.outputAmount)\n )\n}\n\nexport default function ConfirmSwapModal({\n trade,\n originalTrade,\n onAcceptChanges,\n allowedSlippage,\n onConfirm,\n onDismiss,\n recipient,\n swapErrorMessage,\n isOpen,\n attemptingTxn,\n txHash\n}: {\n isOpen: boolean\n trade: Trade | undefined\n originalTrade: Trade | undefined\n attemptingTxn: boolean\n txHash: string | undefined\n recipient: string | null\n allowedSlippage: number\n onAcceptChanges: () => void\n onConfirm: () => void\n swapErrorMessage: string | undefined\n onDismiss: () => void\n}) {\n const showAcceptChanges = useMemo(\n () => Boolean(trade && originalTrade && tradeMeaningfullyDiffers(trade, originalTrade)),\n [originalTrade, trade]\n )\n\n const modalHeader = useCallback(() => {\n return trade ? (\n \n ) : null\n }, [allowedSlippage, onAcceptChanges, recipient, showAcceptChanges, trade])\n\n const modalBottom = useCallback(() => {\n return trade ? (\n \n ) : null\n }, [allowedSlippage, onConfirm, showAcceptChanges, swapErrorMessage, trade])\n\n // text to show while loading\n const pendingText = `Swapping ${trade?.inputAmount?.toSignificant(6)} ${\n trade?.inputAmount?.currency?.symbol\n } for ${trade?.outputAmount?.toSignificant(6)} ${trade?.outputAmount?.currency?.symbol}`\n\n const confirmationContent = useCallback(\n () =>\n swapErrorMessage ? (\n \n ) : (\n \n ),\n [onDismiss, modalBottom, modalHeader, swapErrorMessage]\n )\n\n return (\n \n )\n}\n","import { Trade } from '@levinswap/uniswap-sdk'\nimport React, { Fragment, memo, useContext } from 'react'\nimport { ChevronRight } from 'react-feather'\nimport { Flex } from 'rebass'\nimport { ThemeContext } from 'styled-components'\nimport { TYPE } from '../../theme'\nimport CurrencyLogo from '../CurrencyLogo'\n\nexport default memo(function SwapRoute({ trade }: { trade: Trade }) {\n const theme = useContext(ThemeContext)\n return (\n \n {trade.route.path.map((token, i, path) => {\n const isLastItem: boolean = i === path.length - 1\n return (\n \n \n \n \n {token.symbol}\n \n \n {isLastItem ? null : }\n \n )\n })}\n \n )\n})\n","import { Trade, TradeType } from '@levinswap/uniswap-sdk'\r\nimport React, { useContext } from 'react'\r\nimport styled, { ThemeContext } from 'styled-components'\r\nimport { Field } from '../../state/swap/actions'\r\nimport { useUserSlippageTolerance } from '../../state/user/hooks'\r\nimport { TYPE, ExternalLink } from '../../theme'\r\nimport { computeSlippageAdjustedAmounts, computeTradePriceBreakdown } from '../../utils/prices'\r\nimport { AutoColumn } from '../Column'\r\nimport QuestionHelper from '../QuestionHelper'\r\nimport { RowBetween, RowFixed } from '../Row'\r\nimport FormattedPriceImpact from './FormattedPriceImpact'\r\nimport { SectionBreak } from './styleds'\r\nimport SwapRoute from './SwapRoute'\r\n\r\nconst InfoLink = styled(ExternalLink)`\r\n width: 100%;\r\n border: 1px solid ${({ theme }) => theme.bg3};\r\n padding: 6px 6px;\r\n border-radius: 5px;\r\n text-align: center;\r\n font-size: 14px;\r\n color: ${({ theme }) => theme.text1};\r\n`\r\n\r\nfunction TradeSummary({ trade, allowedSlippage }: { trade: Trade; allowedSlippage: number }) {\r\n const theme = useContext(ThemeContext)\r\n const { priceImpactWithoutFee, realizedLPFee } = computeTradePriceBreakdown(trade)\r\n const isExactIn = trade.tradeType === TradeType.EXACT_INPUT\r\n const slippageAdjustedAmounts = computeSlippageAdjustedAmounts(trade, allowedSlippage)\r\n\r\n return (\r\n <>\r\n \r\n \r\n \r\n \r\n {isExactIn ? 'Minimum received' : 'Maximum sold'}\r\n \r\n \r\n \r\n \r\n \r\n {isExactIn\r\n ? `${slippageAdjustedAmounts[Field.OUTPUT]?.toSignificant(4)} ${trade.outputAmount.currency.symbol}` ??\r\n '-'\r\n : `${slippageAdjustedAmounts[Field.INPUT]?.toSignificant(4)} ${trade.inputAmount.currency.symbol}` ??\r\n '-'}\r\n \r\n \r\n \r\n \r\n \r\n \r\n Price Impact\r\n \r\n \r\n \r\n \r\n \r\n\r\n \r\n \r\n \r\n Liquidity Provider Fee\r\n \r\n \r\n \r\n \r\n {realizedLPFee ? `${realizedLPFee.toSignificant(4)} ${trade.inputAmount.currency.symbol}` : '-'}\r\n \r\n \r\n \r\n \r\n )\r\n}\r\n\r\nexport interface AdvancedSwapDetailsProps {\r\n trade?: Trade\r\n}\r\n\r\nexport function AdvancedSwapDetails({ trade }: AdvancedSwapDetailsProps) {\r\n const theme = useContext(ThemeContext)\r\n\r\n const [allowedSlippage] = useUserSlippageTolerance()\r\n\r\n const showRoute = Boolean(trade && trade.route.path.length > 2)\r\n\r\n return (\r\n \r\n {trade && (\r\n <>\r\n \r\n {showRoute && (\r\n <>\r\n \r\n \r\n \r\n \r\n Route\r\n \r\n \r\n \r\n \r\n \r\n \r\n )}\r\n \r\n \r\n View pair analytics ↗\r\n \r\n \r\n \r\n )}\r\n \r\n )\r\n}\r\n","import React from 'react'\nimport styled from 'styled-components'\nimport { useLastTruthy } from '../../hooks/useLast'\nimport { AdvancedSwapDetails, AdvancedSwapDetailsProps } from './AdvancedSwapDetails'\n\nconst AdvancedDetailsFooter = styled.div<{ show: boolean }>`\n padding-top: calc(16px + 2rem);\n padding-bottom: 20px;\n margin-top: -2rem;\n width: 100%;\n max-width: 400px;\n border-bottom-left-radius: 20px;\n border-bottom-right-radius: 20px;\n color: ${({ theme }) => theme.text2};\n background-color: ${({ theme }) => theme.advancedBG};\n z-index: -1;\n\n transform: ${({ show }) => (show ? 'translateY(0%)' : 'translateY(-100%)')};\n transition: transform 300ms ease-in-out;\n`\n\nexport default function AdvancedSwapDetailsDropdown({ trade, ...rest }: AdvancedSwapDetailsProps) {\n const lastTrade = useLastTruthy(trade)\n\n return (\n \n \n \n )\n}\n","import { stringify } from 'qs'\r\nimport React, { useContext, useMemo } from 'react'\r\nimport { useLocation } from 'react-router'\r\nimport { Text } from 'rebass'\r\nimport { ThemeContext } from 'styled-components'\r\nimport useParsedQueryString from '../../hooks/useParsedQueryString'\r\nimport useToggledVersion, { DEFAULT_VERSION, Version } from '../../hooks/useToggledVersion'\r\n\r\nimport { StyledInternalLink } from '../../theme'\r\nimport { YellowCard } from '../Card'\r\nimport { AutoColumn } from '../Column'\r\n\r\nfunction VersionLinkContainer({ children }: { children: React.ReactNode }) {\r\n const theme = useContext(ThemeContext)\r\n\r\n return (\r\n \r\n \r\n \r\n {children}\r\n \r\n \r\n \r\n )\r\n}\r\n\r\nexport default function BetterTradeLink({ version }: { version: Version }) {\r\n const location = useLocation()\r\n const search = useParsedQueryString()\r\n\r\n const linkDestination = useMemo(() => {\r\n return {\r\n ...location,\r\n search: `?${stringify({\r\n ...search,\r\n use: version !== DEFAULT_VERSION ? version : undefined\r\n })}`\r\n }\r\n }, [location, search, version])\r\n\r\n return (\r\n \r\n There is a better price for this trade on{' '}\r\n \r\n Uniswap {version.toUpperCase()} ↗\r\n \r\n \r\n )\r\n}\r\n\r\nexport function DefaultVersionLink() {\r\n const location = useLocation()\r\n const search = useParsedQueryString()\r\n const version = useToggledVersion()\r\n\r\n const linkDestination = useMemo(() => {\r\n return {\r\n ...location,\r\n search: `?${stringify({\r\n ...search,\r\n use: DEFAULT_VERSION\r\n })}`\r\n }\r\n }, [location, search])\r\n\r\n return (\r\n \r\n Showing {version.toUpperCase()} price.{' '}\r\n \r\n Switch to Levinswap {DEFAULT_VERSION.toUpperCase()} ↗\r\n \r\n \r\n )\r\n}\r\n","import React from 'react'\nimport { Price } from '@levinswap/uniswap-sdk'\nimport { useContext } from 'react'\nimport { Repeat } from 'react-feather'\nimport { Text } from 'rebass'\nimport { ThemeContext } from 'styled-components'\nimport { StyledBalanceMaxMini } from './styleds'\n\ninterface TradePriceProps {\n price?: Price\n showInverted: boolean\n setShowInverted: (showInverted: boolean) => void\n}\n\nexport default function TradePrice({ price, showInverted, setShowInverted }: TradePriceProps) {\n const theme = useContext(ThemeContext)\n\n const formattedPrice = showInverted ? price?.toSignificant(6) : price?.invert()?.toSignificant(6)\n\n const show = Boolean(price?.baseCurrency && price?.quoteCurrency)\n const label = showInverted\n ? `${price?.quoteCurrency?.symbol} per ${price?.baseCurrency?.symbol}`\n : `${price?.baseCurrency?.symbol} per ${price?.quoteCurrency?.symbol}`\n\n return (\n \n {show ? (\n <>\n {formattedPrice ?? '-'} {label}\n setShowInverted(!showInverted)}>\n \n \n \n ) : (\n '-'\n )}\n \n )\n}\n","import { Token } from '@levinswap/uniswap-sdk'\r\nimport { transparentize } from 'polished'\r\nimport React, { useCallback, useMemo, useState } from 'react'\r\nimport styled from 'styled-components'\r\nimport { useActiveWeb3React } from '../../hooks'\r\nimport { useAllTokens } from '../../hooks/Tokens'\r\nimport { ExternalLink, TYPE } from '../../theme'\r\nimport { getEtherscanLink, shortenAddress } from '../../utils'\r\nimport CurrencyLogo from '../CurrencyLogo'\r\nimport Modal from '../Modal'\r\nimport { AutoRow, RowBetween } from '../Row'\r\nimport { AutoColumn } from '../Column'\r\nimport { AlertTriangle } from 'react-feather'\r\nimport { ButtonError } from '../Button'\r\n\r\nconst Wrapper = styled.div<{ error: boolean }>`\r\n background: ${({ theme }) => transparentize(0.6, theme.bg3)};\r\n padding: 0.75rem;\r\n border-radius: 5px;\r\n`\r\n\r\nconst WarningContainer = styled.div`\r\n max-width: 420px;\r\n width: 100%;\r\n padding: 1rem;\r\n background: rgba(242, 150, 2, 0.05);\r\n border: 1px solid #f3841e;\r\n border-radius: 5px;\r\n overflow: auto;\r\n`\r\n\r\nconst StyledWarningIcon = styled(AlertTriangle)`\r\n stroke: ${({ theme }) => theme.red2};\r\n`\r\n\r\ninterface TokenWarningCardProps {\r\n token?: Token\r\n}\r\n\r\nfunction TokenWarningCard({ token }: TokenWarningCardProps) {\r\n const { chainId } = useActiveWeb3React()\r\n\r\n const tokenSymbol = token?.symbol?.toLowerCase() ?? ''\r\n const tokenName = token?.name?.toLowerCase() ?? ''\r\n\r\n const allTokens = useAllTokens()\r\n\r\n const duplicateNameOrSymbol = useMemo(() => {\r\n if (!token || !chainId) return false\r\n\r\n return Object.keys(allTokens).some(tokenAddress => {\r\n const userToken = allTokens[tokenAddress]\r\n if (userToken.equals(token)) {\r\n return false\r\n }\r\n return userToken.symbol?.toLowerCase() === tokenSymbol || userToken.name?.toLowerCase() === tokenName\r\n })\r\n }, [token, chainId, allTokens, tokenSymbol, tokenName])\r\n\r\n if (!token) return null\r\n\r\n return (\r\n \r\n \r\n \r\n \r\n
    \r\n
    \r\n \r\n \r\n {token && token.name && token.symbol && token.name !== token.symbol\r\n ? `${token.name} (${token.symbol})`\r\n : token.name || token.symbol}{' '}\r\n \r\n {chainId && (\r\n \r\n {shortenAddress(token.address)} (View on Blockscout)\r\n \r\n )}\r\n \r\n
    \r\n
    \r\n )\r\n}\r\n\r\nexport default function TokenWarningModal({\r\n isOpen,\r\n tokens,\r\n onConfirm\r\n}: {\r\n isOpen: boolean\r\n tokens: Token[]\r\n onConfirm: () => void\r\n}) {\r\n const [understandChecked, setUnderstandChecked] = useState(false)\r\n const toggleUnderstand = useCallback(() => setUnderstandChecked(uc => !uc), [])\r\n\r\n const handleDismiss = useCallback(() => null, [])\r\n return (\r\n \r\n \r\n \r\n \r\n \r\n Token imported\r\n \r\n \r\n Anyone can create an ERC20 token on Ethereum with any name, including creating fake versions of\r\n existing tokens and tokens that claim to represent projects that do not have a token.\r\n \r\n \r\n This interface can load arbitrary tokens by token addresses. Please take extra caution and do your research\r\n when interacting with arbitrary ERC20 tokens.\r\n \r\n \r\n If you purchase an arbitrary token, you may be unable to sell it back.\r\n \r\n {tokens.map(token => {\r\n return \r\n })}\r\n \r\n
    \r\n \r\n
    \r\n {\r\n onConfirm()\r\n }}\r\n >\r\n Continue\r\n \r\n
    \r\n
    \r\n
    \r\n
    \r\n )\r\n}\r\n","import React from 'react'\nimport styled from 'styled-components'\nimport { RowBetween } from '../Row'\nimport { AutoColumn } from '../Column'\nimport { transparentize } from 'polished'\n\nconst Wrapper = styled(AutoColumn)``\n\nconst Grouping = styled(RowBetween)`\n width: 50%;\n`\n\nconst Circle = styled.div<{ confirmed?: boolean; disabled?: boolean }>`\n min-width: 20px;\n min-height: 20px;\n background-color: ${({ theme, confirmed, disabled }) =>\n disabled ? theme.bg4 : confirmed ? theme.green1 : theme.primary1};\n border-radius: 50%;\n color: ${({ theme }) => theme.white};\n display: flex;\n align-items: center;\n justify-content: center;\n line-height: 8px;\n font-size: 12px;\n`\n\nconst CircleRow = styled.div`\n width: calc(100% - 20px);\n display: flex;\n align-items: center;\n`\n\nconst Connector = styled.div<{ prevConfirmed?: boolean; disabled?: boolean }>`\n width: 100%;\n height: 2px;\n background-color: ;\n background: linear-gradient(\n 90deg,\n ${({ theme, prevConfirmed, disabled }) =>\n disabled ? theme.bg4 : transparentize(0.5, prevConfirmed ? theme.green1 : theme.primary1)}\n 0%,\n ${({ theme, prevConfirmed, disabled }) => (disabled ? theme.bg4 : prevConfirmed ? theme.primary1 : theme.bg4)} 80%\n );\n opacity: 0.6;\n`\n\ninterface ProgressCirclesProps {\n steps: boolean[]\n disabled?: boolean\n}\n\n/**\n * Based on array of steps, create a step counter of circles.\n * A circle can be enabled, disabled, or confirmed. States are derived\n * from previous step.\n *\n * An extra circle is added to represent the ability to swap, add, or remove.\n * This step will never be marked as complete (because no 'txn done' state in body ui).\n *\n * @param steps array of booleans where true means step is complete\n */\nexport default function ProgressCircles({ steps, disabled = false, ...rest }: ProgressCirclesProps) {\n return (\n \n \n {steps.map((step, i) => {\n return (\n \n \n {step ? '✓' : i + 1}\n \n \n \n )\n })}\n {steps.length + 1}\n \n \n )\n}\n","import { BigNumber } from '@ethersproject/bignumber'\nimport { Contract } from '@ethersproject/contracts'\nimport { JSBI, Percent, Router, SwapParameters, Trade, TradeType } from '@levinswap/uniswap-sdk'\nimport { useMemo } from 'react'\nimport { BIPS_BASE, INITIAL_ALLOWED_SLIPPAGE } from '../constants'\nimport { getTradeVersion, useV1TradeExchangeAddress } from '../data/V1'\nimport { useTransactionAdder } from '../state/transactions/hooks'\nimport { calculateGasMargin, getRouterContract, isAddress, shortenAddress } from '../utils'\nimport isZero from '../utils/isZero'\nimport v1SwapArguments from '../utils/v1SwapArguments'\nimport { useActiveWeb3React } from './index'\nimport { useV1ExchangeContract } from './useContract'\nimport useTransactionDeadline from './useTransactionDeadline'\nimport useENS from './useENS'\nimport { Version } from './useToggledVersion'\n\nexport enum SwapCallbackState {\n INVALID,\n LOADING,\n VALID\n}\n\ninterface SwapCall {\n contract: Contract\n parameters: SwapParameters\n}\n\ninterface SuccessfulCall {\n call: SwapCall\n gasEstimate: BigNumber\n}\n\ninterface FailedCall {\n call: SwapCall\n error: Error\n}\n\ntype EstimatedSwapCall = SuccessfulCall | FailedCall\n\n/**\n * Returns the swap calls that can be used to make the trade\n * @param trade trade to execute\n * @param allowedSlippage user allowed slippage\n * @param recipientAddressOrName\n */\nfunction useSwapCallArguments(\n trade: Trade | undefined, // trade to execute, required\n allowedSlippage: number = INITIAL_ALLOWED_SLIPPAGE, // in bips\n recipientAddressOrName: string | null // the ENS name or address of the recipient of the trade, or null if swap should be returned to sender\n): SwapCall[] {\n const { account, chainId, library } = useActiveWeb3React()\n\n const { address: recipientAddress } = useENS(recipientAddressOrName)\n const recipient = recipientAddressOrName === null ? account : recipientAddress\n const deadline = useTransactionDeadline()\n\n const v1Exchange = useV1ExchangeContract(useV1TradeExchangeAddress(trade), true)\n\n return useMemo(() => {\n const tradeVersion = getTradeVersion(trade)\n if (!trade || !recipient || !library || !account || !tradeVersion || !chainId || !deadline) return []\n\n const contract: Contract | null =\n tradeVersion === Version.v2 ? getRouterContract(chainId, library, account) : v1Exchange\n if (!contract) {\n return []\n }\n\n const swapMethods = []\n\n switch (tradeVersion) {\n case Version.v2:\n swapMethods.push(\n Router.swapCallParameters(trade, {\n feeOnTransfer: false,\n allowedSlippage: new Percent(JSBI.BigInt(allowedSlippage), BIPS_BASE),\n recipient,\n deadline: deadline.toNumber()\n })\n )\n\n if (trade.tradeType === TradeType.EXACT_INPUT) {\n swapMethods.push(\n Router.swapCallParameters(trade, {\n feeOnTransfer: true,\n allowedSlippage: new Percent(JSBI.BigInt(allowedSlippage), BIPS_BASE),\n recipient,\n deadline: deadline.toNumber()\n })\n )\n }\n break\n case Version.v1:\n swapMethods.push(\n v1SwapArguments(trade, {\n allowedSlippage: new Percent(JSBI.BigInt(allowedSlippage), BIPS_BASE),\n recipient,\n deadline: deadline.toNumber()\n })\n )\n break\n }\n return swapMethods.map(parameters => ({ parameters, contract }))\n }, [account, allowedSlippage, chainId, deadline, library, recipient, trade, v1Exchange])\n}\n\n// returns a function that will execute a swap, if the parameters are all valid\n// and the user has approved the slippage adjusted input amount for the trade\nexport function useSwapCallback(\n trade: Trade | undefined, // trade to execute, required\n allowedSlippage: number = INITIAL_ALLOWED_SLIPPAGE, // in bips\n recipientAddressOrName: string | null // the ENS name or address of the recipient of the trade, or null if swap should be returned to sender\n): { state: SwapCallbackState; callback: null | (() => Promise); error: string | null } {\n const { account, chainId, library } = useActiveWeb3React()\n\n const swapCalls = useSwapCallArguments(trade, allowedSlippage, recipientAddressOrName)\n\n const addTransaction = useTransactionAdder()\n\n const { address: recipientAddress } = useENS(recipientAddressOrName)\n const recipient = recipientAddressOrName === null ? account : recipientAddress\n\n return useMemo(() => {\n if (!trade || !library || !account || !chainId) {\n return { state: SwapCallbackState.INVALID, callback: null, error: 'Missing dependencies' }\n }\n if (!recipient) {\n if (recipientAddressOrName !== null) {\n return { state: SwapCallbackState.INVALID, callback: null, error: 'Invalid recipient' }\n } else {\n return { state: SwapCallbackState.LOADING, callback: null, error: null }\n }\n }\n\n const tradeVersion = getTradeVersion(trade)\n\n return {\n state: SwapCallbackState.VALID,\n callback: async function onSwap(): Promise {\n const estimatedCalls: EstimatedSwapCall[] = await Promise.all(\n swapCalls.map(call => {\n const {\n parameters: { methodName, args, value },\n contract\n } = call\n const options = !value || isZero(value) ? {} : { value }\n\n return contract.estimateGas[methodName](...args, options)\n .then(gasEstimate => {\n return {\n call,\n gasEstimate\n }\n })\n .catch(gasError => {\n console.debug('Gas estimate failed, trying eth_call to extract error', call)\n\n return contract.callStatic[methodName](...args, options)\n .then(result => {\n console.debug('Unexpected successful call after failed estimate gas', call, gasError, result)\n return { call, error: new Error('Unexpected issue with estimating the gas. Please try again.') }\n })\n .catch(callError => {\n console.debug('Call threw error', call, callError)\n let errorMessage: string\n switch (callError.reason) {\n case 'UniswapV2Router: INSUFFICIENT_OUTPUT_AMOUNT':\n case 'UniswapV2Router: EXCESSIVE_INPUT_AMOUNT':\n errorMessage =\n 'This transaction will not succeed either due to price movement or fee on transfer. Try increasing your slippage tolerance.'\n break\n default:\n errorMessage = `The transaction cannot succeed due to error: ${callError.reason}. This is probably an issue with one of the tokens you are swapping.`\n }\n return { call, error: new Error(errorMessage) }\n })\n })\n })\n )\n\n // a successful estimation is a bignumber gas estimate and the next call is also a bignumber gas estimate\n const successfulEstimation = estimatedCalls.find(\n (el, ix, list): el is SuccessfulCall =>\n 'gasEstimate' in el && (ix === list.length - 1 || 'gasEstimate' in list[ix + 1])\n )\n\n if (!successfulEstimation) {\n const errorCalls = estimatedCalls.filter((call): call is FailedCall => 'error' in call)\n if (errorCalls.length > 0) throw errorCalls[errorCalls.length - 1].error\n throw new Error('Unexpected error. Please contact support: none of the calls threw an error')\n }\n\n const {\n call: {\n contract,\n parameters: { methodName, args, value }\n },\n gasEstimate\n } = successfulEstimation\n\n return contract[methodName](...args, {\n gasLimit: calculateGasMargin(gasEstimate),\n ...(value && !isZero(value) ? { value, from: account } : { from: account })\n })\n .then((response: any) => {\n const inputSymbol = trade.inputAmount.currency.symbol\n const outputSymbol = trade.outputAmount.currency.symbol\n const inputAmount = trade.inputAmount.toSignificant(3)\n const outputAmount = trade.outputAmount.toSignificant(3)\n\n const base = `Swap ${inputAmount} ${inputSymbol} for ${outputAmount} ${outputSymbol}`\n const withRecipient =\n recipient === account\n ? base\n : `${base} to ${\n recipientAddressOrName && isAddress(recipientAddressOrName)\n ? shortenAddress(recipientAddressOrName)\n : recipientAddressOrName\n }`\n\n const withVersion =\n tradeVersion === Version.v2 ? withRecipient : `${withRecipient} on ${(tradeVersion as any).toUpperCase()}`\n\n addTransaction(response, {\n summary: withVersion\n })\n\n return response.hash\n })\n .catch((error: any) => {\n // if the user rejected the tx, pass this along\n if (error?.code === 4001) {\n throw new Error('Transaction rejected.')\n } else {\n // otherwise, the error was unexpected and we need to convey that\n console.error(`Swap failed`, error, methodName, args, value)\n throw new Error(`Swap failed: ${error.message}`)\n }\n })\n },\n error: null\n }\n }, [trade, library, account, chainId, recipient, recipientAddressOrName, swapCalls, addTransaction])\n}\n","import { Currency, currencyEquals, ETHER, WETH } from '@levinswap/uniswap-sdk'\r\nimport { useMemo } from 'react'\r\nimport { tryParseAmount } from '../state/swap/hooks'\r\nimport { useTransactionAdder } from '../state/transactions/hooks'\r\nimport { useCurrencyBalance } from '../state/wallet/hooks'\r\nimport { useActiveWeb3React } from './index'\r\nimport { useWETHContract } from './useContract'\r\n\r\nexport enum WrapType {\r\n NOT_APPLICABLE,\r\n WRAP,\r\n UNWRAP\r\n}\r\n\r\nconst NOT_APPLICABLE = { wrapType: WrapType.NOT_APPLICABLE }\r\n/**\r\n * Given the selected input and output currency, return a wrap callback\r\n * @param inputCurrency the selected input currency\r\n * @param outputCurrency the selected output currency\r\n * @param typedValue the user input value\r\n */\r\nexport default function useWrapCallback(\r\n inputCurrency: Currency | undefined,\r\n outputCurrency: Currency | undefined,\r\n typedValue: string | undefined\r\n): { wrapType: WrapType; execute?: undefined | (() => Promise); inputError?: string } {\r\n const { chainId, account } = useActiveWeb3React()\r\n const wethContract = useWETHContract()\r\n const balance = useCurrencyBalance(account ?? undefined, inputCurrency)\r\n // we can always parse the amount typed as the input currency, since wrapping is 1:1\r\n const inputAmount = useMemo(() => tryParseAmount(typedValue, inputCurrency), [inputCurrency, typedValue])\r\n const addTransaction = useTransactionAdder()\r\n\r\n return useMemo(() => {\r\n if (!wethContract || !chainId || !inputCurrency || !outputCurrency) return NOT_APPLICABLE\r\n\r\n const sufficientBalance = inputAmount && balance && !balance.lessThan(inputAmount)\r\n\r\n if (inputCurrency === ETHER && currencyEquals(WETH[chainId], outputCurrency)) {\r\n return {\r\n wrapType: WrapType.WRAP,\r\n execute:\r\n sufficientBalance && inputAmount\r\n ? async () => {\r\n try {\r\n const txReceipt = await wethContract.deposit({ value: `0x${inputAmount.raw.toString(16)}` })\r\n addTransaction(txReceipt, { summary: `Wrap ${inputAmount.toSignificant(6)} ethereum to Wethereum` })\r\n } catch (error) {\r\n console.error('Could not deposit', error)\r\n }\r\n }\r\n : undefined,\r\n inputError: sufficientBalance ? undefined : 'Insufficient ETH balance'\r\n }\r\n } else if (currencyEquals(WETH[chainId], inputCurrency) && outputCurrency === ETHER) {\r\n return {\r\n wrapType: WrapType.UNWRAP,\r\n execute:\r\n sufficientBalance && inputAmount\r\n ? async () => {\r\n try {\r\n const txReceipt = await wethContract.withdraw(`0x${inputAmount.raw.toString(16)}`)\r\n addTransaction(txReceipt, { summary: `Unwrap ${inputAmount.toSignificant(6)} Wethereum to ethereum` })\r\n } catch (error) {\r\n console.error('Could not withdraw', error)\r\n }\r\n }\r\n : undefined,\r\n inputError: sufficientBalance ? undefined : 'Insufficient WETH balance'\r\n }\r\n } else {\r\n return NOT_APPLICABLE\r\n }\r\n }, [wethContract, chainId, inputCurrency, outputCurrency, inputAmount, balance, addTransaction])\r\n}\r\n","import { MaxUint256 } from '@ethersproject/constants'\nimport {\n CurrencyAmount,\n ETHER,\n SwapParameters,\n Token,\n Trade,\n TradeOptionsDeadline,\n TradeType\n} from '@levinswap/uniswap-sdk'\nimport { getTradeVersion } from '../data/V1'\nimport { Version } from '../hooks/useToggledVersion'\n\nfunction toHex(currencyAmount: CurrencyAmount): string {\n return `0x${currencyAmount.raw.toString(16)}`\n}\n\n/**\n * Get the arguments to make for a swap\n * @param trade trade to get v1 arguments for swapping\n * @param options options for swapping\n */\nexport default function v1SwapArguments(\n trade: Trade,\n options: Omit\n): SwapParameters {\n if (getTradeVersion(trade) !== Version.v1) {\n throw new Error('invalid trade version')\n }\n if (trade.route.pairs.length > 2) {\n throw new Error('too many pairs')\n }\n const isExactIn = trade.tradeType === TradeType.EXACT_INPUT\n const inputETH = trade.inputAmount.currency === ETHER\n const outputETH = trade.outputAmount.currency === ETHER\n if (inputETH && outputETH) throw new Error('ETHER to ETHER')\n const minimumAmountOut = toHex(trade.minimumAmountOut(options.allowedSlippage))\n const maximumAmountIn = toHex(trade.maximumAmountIn(options.allowedSlippage))\n const deadline = `0x${options.deadline.toString(16)}`\n if (isExactIn) {\n if (inputETH) {\n return {\n methodName: 'ethToTokenTransferInput',\n args: [minimumAmountOut, deadline, options.recipient],\n value: maximumAmountIn\n }\n } else if (outputETH) {\n return {\n methodName: 'tokenToEthTransferInput',\n args: [maximumAmountIn, minimumAmountOut, deadline, options.recipient],\n value: '0x0'\n }\n } else {\n const outputToken = trade.outputAmount.currency\n // should never happen, needed for type check\n if (!(outputToken instanceof Token)) {\n throw new Error('token to token')\n }\n return {\n methodName: 'tokenToTokenTransferInput',\n args: [maximumAmountIn, minimumAmountOut, '0x1', deadline, options.recipient, outputToken.address],\n value: '0x0'\n }\n }\n } else {\n if (inputETH) {\n return {\n methodName: 'ethToTokenTransferOutput',\n args: [minimumAmountOut, deadline, options.recipient],\n value: maximumAmountIn\n }\n } else if (outputETH) {\n return {\n methodName: 'tokenToEthTransferOutput',\n args: [minimumAmountOut, maximumAmountIn, deadline, options.recipient],\n value: '0x0'\n }\n } else {\n const output = trade.outputAmount.currency\n if (!(output instanceof Token)) {\n throw new Error('invalid output amount currency')\n }\n\n return {\n methodName: 'tokenToTokenTransferOutput',\n args: [\n minimumAmountOut,\n maximumAmountIn,\n MaxUint256.toHexString(),\n deadline,\n options.recipient,\n output.address\n ],\n value: '0x0'\n }\n }\n }\n}\n","import React from 'react'\r\nimport styled from 'styled-components'\r\n\r\nconst ToggleElement = styled.span<{ isActive?: boolean; isOnSwitch?: boolean }>`\r\n padding: 0.25rem 0.5rem;\r\n border-radius: 14px;\r\n background: ${({ theme, isActive, isOnSwitch }) => (isActive ? (isOnSwitch ? theme.primary1 : theme.text4) : 'none')};\r\n color: ${({ theme, isActive, isOnSwitch }) => (isActive ? (isOnSwitch ? theme.white : theme.text2) : theme.text3)};\r\n font-size: 1rem;\r\n font-weight: 400;\r\n\r\n padding: 0.35rem 0.6rem;\r\n border-radius: 12px;\r\n background: ${({ theme, isActive, isOnSwitch }) => (isActive ? (isOnSwitch ? theme.primary1 : theme.text4) : 'none')};\r\n color: ${({ theme, isActive, isOnSwitch }) => (isActive ? (isOnSwitch ? theme.white : theme.text2) : theme.text2)};\r\n font-size: 1rem;\r\n font-weight: ${({ isOnSwitch }) => (isOnSwitch ? '500' : '400')};\r\n :hover {\r\n user-select: ${({ isOnSwitch }) => (isOnSwitch ? 'none' : 'initial')};\r\n background: ${({ theme, isActive, isOnSwitch }) =>\r\n isActive ? (isOnSwitch ? theme.primary1 : theme.text3) : 'none'};\r\n color: ${({ theme, isActive, isOnSwitch }) => (isActive ? (isOnSwitch ? theme.white : theme.text2) : theme.text3)};\r\n }\r\n`\r\n\r\nconst StyledToggle = styled.button<{ isActive?: boolean; activeElement?: boolean }>`\r\n border-radius: 12px;\r\n border: none;\r\n /* border: 1px solid ${({ theme, isActive }) => (isActive ? theme.primary5 : theme.text4)}; */\r\n background: ${({ theme }) => theme.bg3};\r\n display: flex;\r\n width: fit-content;\r\n cursor: pointer;\r\n outline: none;\r\n padding: 0;\r\n /* background-color: transparent; */\r\n`\r\n\r\nexport interface ToggleProps {\r\n id?: string\r\n isActive: boolean\r\n toggle: () => void\r\n}\r\n\r\nexport default function Toggle({ id, isActive, toggle }: ToggleProps) {\r\n return (\r\n \r\n \r\n On\r\n \r\n \r\n Off\r\n \r\n \r\n )\r\n}\r\n","import React, { useState, useRef, useContext } from 'react'\nimport styled, { ThemeContext } from 'styled-components'\n\nimport QuestionHelper from '../QuestionHelper'\nimport { TYPE } from '../../theme'\nimport { AutoColumn } from '../Column'\nimport { RowBetween, RowFixed } from '../Row'\n\nimport { darken } from 'polished'\n\nenum SlippageError {\n InvalidInput = 'InvalidInput',\n RiskyLow = 'RiskyLow',\n RiskyHigh = 'RiskyHigh'\n}\n\nenum DeadlineError {\n InvalidInput = 'InvalidInput'\n}\n\nconst FancyButton = styled.button`\n color: ${({ theme }) => theme.text1};\n align-items: center;\n height: 2rem;\n border-radius: 36px;\n font-size: 1rem;\n width: auto;\n min-width: 3.5rem;\n border: 1px solid ${({ theme }) => theme.bg3};\n outline: none;\n background: ${({ theme }) => theme.bg1};\n :hover {\n border: 1px solid ${({ theme }) => theme.bg4};\n }\n :focus {\n border: 1px solid ${({ theme }) => theme.primary1};\n }\n`\n\nconst Option = styled(FancyButton)<{ active: boolean }>`\n margin-right: 8px;\n :hover {\n cursor: pointer;\n }\n background-color: ${({ active, theme }) => active && theme.primary1};\n color: ${({ active, theme }) => (active ? theme.white : theme.text1)};\n`\n\nconst Input = styled.input`\n background: ${({ theme }) => theme.bg1};\n font-size: 16px;\n width: auto;\n outline: none;\n &::-webkit-outer-spin-button,\n &::-webkit-inner-spin-button {\n -webkit-appearance: none;\n }\n color: ${({ theme, color }) => (color === 'red' ? theme.red1 : theme.text1)};\n text-align: right;\n`\n\nconst OptionCustom = styled(FancyButton)<{ active?: boolean; warning?: boolean }>`\n height: 2rem;\n position: relative;\n padding: 0 0.75rem;\n flex: 1;\n border: ${({ theme, active, warning }) => active && `1px solid ${warning ? theme.red1 : theme.primary1}`};\n :hover {\n border: ${({ theme, active, warning }) =>\n active && `1px solid ${warning ? darken(0.1, theme.red1) : darken(0.1, theme.primary1)}`};\n }\n\n input {\n width: 100%;\n height: 100%;\n border: 0px;\n border-radius: 2rem;\n }\n`\n\nconst SlippageEmojiContainer = styled.span`\n color: #f3841e;\n ${({ theme }) => theme.mediaWidth.upToSmall`\n display: none; \n `}\n`\n\nexport interface SlippageTabsProps {\n rawSlippage: number\n setRawSlippage: (rawSlippage: number) => void\n deadline: number\n setDeadline: (deadline: number) => void\n}\n\nexport default function SlippageTabs({ rawSlippage, setRawSlippage, deadline, setDeadline }: SlippageTabsProps) {\n const theme = useContext(ThemeContext)\n\n const inputRef = useRef()\n\n const [slippageInput, setSlippageInput] = useState('')\n const [deadlineInput, setDeadlineInput] = useState('')\n\n const slippageInputIsValid =\n slippageInput === '' || (rawSlippage / 100).toFixed(2) === Number.parseFloat(slippageInput).toFixed(2)\n const deadlineInputIsValid = deadlineInput === '' || (deadline / 60).toString() === deadlineInput\n\n let slippageError: SlippageError | undefined\n if (slippageInput !== '' && !slippageInputIsValid) {\n slippageError = SlippageError.InvalidInput\n } else if (slippageInputIsValid && rawSlippage < 50) {\n slippageError = SlippageError.RiskyLow\n } else if (slippageInputIsValid && rawSlippage > 500) {\n slippageError = SlippageError.RiskyHigh\n } else {\n slippageError = undefined\n }\n\n let deadlineError: DeadlineError | undefined\n if (deadlineInput !== '' && !deadlineInputIsValid) {\n deadlineError = DeadlineError.InvalidInput\n } else {\n deadlineError = undefined\n }\n\n function parseCustomSlippage(value: string) {\n setSlippageInput(value)\n\n try {\n const valueAsIntFromRoundedFloat = Number.parseInt((Number.parseFloat(value) * 100).toString())\n if (!Number.isNaN(valueAsIntFromRoundedFloat) && valueAsIntFromRoundedFloat < 5000) {\n setRawSlippage(valueAsIntFromRoundedFloat)\n }\n } catch {}\n }\n\n function parseCustomDeadline(value: string) {\n setDeadlineInput(value)\n\n try {\n const valueAsInt: number = Number.parseInt(value) * 60\n if (!Number.isNaN(valueAsInt) && valueAsInt > 0) {\n setDeadline(valueAsInt)\n }\n } catch {}\n }\n\n return (\n \n \n \n \n Slippage tolerance\n \n \n \n \n {\n setSlippageInput('')\n setRawSlippage(10)\n }}\n active={rawSlippage === 10}\n >\n 0.1%\n \n {\n setSlippageInput('')\n setRawSlippage(50)\n }}\n active={rawSlippage === 50}\n >\n 0.5%\n \n {\n setSlippageInput('')\n setRawSlippage(100)\n }}\n active={rawSlippage === 100}\n >\n 1%\n \n \n \n {!!slippageInput &&\n (slippageError === SlippageError.RiskyLow || slippageError === SlippageError.RiskyHigh) ? (\n \n \n ⚠️\n \n \n ) : null}\n {/* https://github.com/DefinitelyTyped/DefinitelyTyped/issues/30451 */}\n {\n parseCustomSlippage((rawSlippage / 100).toFixed(2))\n }}\n onChange={e => parseCustomSlippage(e.target.value)}\n color={!slippageInputIsValid ? 'red' : ''}\n />\n %\n \n \n \n {!!slippageError && (\n \n {slippageError === SlippageError.InvalidInput\n ? 'Enter a valid slippage percentage'\n : slippageError === SlippageError.RiskyLow\n ? 'Your transaction may fail'\n : 'Your transaction may be frontrun'}\n
    \n )}\n \n\n \n \n \n Transaction deadline\n \n \n \n \n \n {\n parseCustomDeadline((deadline / 60).toString())\n }}\n placeholder={(deadline / 60).toString()}\n value={deadlineInput}\n onChange={e => parseCustomDeadline(e.target.value)}\n />\n \n \n minutes\n \n \n \n \n )\n}\n","import React, { useContext, useRef, useState } from 'react'\r\nimport { X } from 'react-feather'\r\nimport { Text } from 'rebass'\r\nimport styled, { ThemeContext } from 'styled-components'\r\nimport { useOnClickOutside } from '../../hooks/useOnClickOutside'\r\nimport { ApplicationModal } from '../../state/application/actions'\r\nimport { useModalOpen, useToggleSettingsMenu } from '../../state/application/hooks'\r\nimport { useExpertModeManager, useUserTransactionTTL, useUserSlippageTolerance } from '../../state/user/hooks'\r\nimport { TYPE } from '../../theme'\r\nimport { ButtonError } from '../Button'\r\nimport { AutoColumn } from '../Column'\r\nimport Modal from '../Modal'\r\nimport QuestionHelper from '../QuestionHelper'\r\nimport { RowBetween, RowFixed } from '../Row'\r\nimport Toggle from '../Toggle'\r\nimport TransactionSettings from '../TransactionSettings'\r\n\r\nconst StyledCloseIcon = styled(X)`\r\n height: 20px;\r\n width: 20px;\r\n :hover {\r\n cursor: pointer;\r\n }\r\n\r\n > * {\r\n stroke: ${({ theme }) => theme.text1};\r\n }\r\n`\r\n\r\nconst StyledSettingsText = styled.div`\r\n text-align: center;\r\n font-size: 16px;\r\n color: ${({ theme }) => theme.text2};\r\n`\r\n\r\nconst StyledMenuButton = styled.button`\r\n position: relative;\r\n height: 100%;\r\n border: none;\r\n background-color: transparent;\r\n height: 35px;\r\n opacity: 0.75;\r\n text-align: center;\r\n\r\n border-radius: 5px;\r\n transition: 0.3s ease;\r\n\r\n :hover,\r\n :focus {\r\n cursor: pointer;\r\n outline: none;\r\n opacity: 1;\r\n }\r\n\r\n svg {\r\n margin-top: 5px;\r\n }\r\n`\r\nconst EmojiWrapper = styled.div`\r\n position: absolute;\r\n bottom: -6px;\r\n right: 0px;\r\n font-size: 14px;\r\n`\r\n\r\nconst StyledMenu = styled.div`\r\n display: flex;\r\n justify-content: center;\r\n position: relative;\r\n border: 1px solid ${({ theme }) => theme.bg2};\r\n`\r\n\r\nconst MenuFlyout = styled.span`\r\n min-width: 23.125rem;\r\n background-color: ${({ theme }) => theme.bg2};\r\n box-shadow: 0px 0px 1px rgba(0, 0, 0, 0.01), 0px 4px 8px rgba(0, 0, 0, 0.04), 0px 16px 24px rgba(0, 0, 0, 0.04),\r\n 0px 24px 32px rgba(0, 0, 0, 0.01);\r\n border-radius: 5px;\r\n display: flex;\r\n flex-direction: column;\r\n font-size: 1rem;\r\n position: absolute;\r\n top: 2.75rem;\r\n z-index: 100;\r\n\r\n ${({ theme }) => theme.mediaWidth.upToExtraSmall`\r\n min-width: 18.125rem;\r\n right: -46px;\r\n `};\r\n\r\n ${({ theme }) => theme.mediaWidth.upToMedium`\r\n min-width: 18.125rem;\r\n top: -22rem;\r\n `};\r\n`\r\n\r\nconst Break = styled.div`\r\n width: 100%;\r\n height: 1px;\r\n background-color: ${({ theme }) => theme.bg3};\r\n`\r\n\r\nconst ModalContentWrapper = styled.div`\r\n display: flex;\r\n align-items: center;\r\n justify-content: center;\r\n padding: 2rem 0;\r\n background-color: ${({ theme }) => theme.bg2};\r\n border-radius: 5px;\r\n`\r\n\r\nexport default function SettingsTab() {\r\n const node = useRef()\r\n const open = useModalOpen(ApplicationModal.SETTINGS)\r\n const toggle = useToggleSettingsMenu()\r\n\r\n const theme = useContext(ThemeContext)\r\n const [userSlippageTolerance, setUserslippageTolerance] = useUserSlippageTolerance()\r\n\r\n const [ttl, setTtl] = useUserTransactionTTL()\r\n\r\n const [expertMode, toggleExpertMode] = useExpertModeManager()\r\n\r\n // show confirmation view before turning on\r\n const [showConfirmation, setShowConfirmation] = useState(false)\r\n\r\n useOnClickOutside(node, open ? toggle : undefined)\r\n\r\n return (\r\n // https://github.com/DefinitelyTyped/DefinitelyTyped/issues/30451\r\n \r\n setShowConfirmation(false)} maxHeight={100}>\r\n \r\n \r\n \r\n
    \r\n \r\n Are you sure?\r\n \r\n setShowConfirmation(false)} />\r\n \r\n \r\n \r\n \r\n Expert mode turns off the confirm transaction prompt and allows high slippage trades that often result\r\n in bad rates and lost funds.\r\n \r\n \r\n ONLY USE THIS MODE IF YOU KNOW WHAT YOU ARE DOING.\r\n \r\n {\r\n if (window.prompt(`Please type the word \"confirm\" to enable expert mode.`) === 'confirm') {\r\n toggleExpertMode()\r\n setShowConfirmation(false)\r\n }\r\n }}\r\n >\r\n \r\n Turn On Expert Mode\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n Settings\r\n {expertMode ? (\r\n \r\n \r\n 🧙\r\n \r\n \r\n ) : null}\r\n \r\n {open && (\r\n \r\n \r\n \r\n Transaction Settings\r\n \r\n \r\n \r\n Interface Settings\r\n \r\n \r\n \r\n \r\n Toggle Expert Mode\r\n \r\n \r\n \r\n {\r\n toggleExpertMode()\r\n setShowConfirmation(false)\r\n }\r\n : () => {\r\n toggle()\r\n setShowConfirmation(true)\r\n }\r\n }\r\n />\r\n \r\n \r\n \r\n )}\r\n \r\n )\r\n}\r\n","import React from 'react'\r\nimport Settings from '../Settings'\r\nimport styled from 'styled-components'\r\nimport { NavLink } from 'react-router-dom'\r\nimport { darken } from 'polished'\r\nimport { useTranslation } from 'react-i18next'\r\nimport QuestionHelper from '../QuestionHelper'\r\n\r\nconst SwapMenuStyled = styled.div`\r\n font-weight: 500;\r\n`\r\n\r\nconst activeClassName = 'ACTIVE'\r\n\r\nconst StyledNavLink = styled(NavLink).attrs({\r\n activeClassName\r\n})`\r\n ${({ theme }) => theme.flexRowNoWrap}\r\n align-items: left;\r\n border-radius: 5px;\r\n outline: none;\r\n cursor: pointer;\r\n text-decoration: none;\r\n color: ${({ theme }) => theme.text2};\r\n font-size: 1rem;\r\n width: fit-content;\r\n font-weight: 500;\r\n opacity: 0.85;\r\n transition: 0.3s ease;\r\n\r\n &.${activeClassName} {\r\n border-radius: 25px;\r\n font-weight: 600;\r\n color: ${({ theme }) => theme.text1};\r\n }\r\n\r\n :hover {\r\n opacity: 1;\r\n }\r\n :focus {\r\n color: ${({ theme }) => darken(0.1, theme.text1)};\r\n }\r\n`\r\n\r\nconst StyledNavLinkLiquidity = styled(NavLink).attrs({\r\n activeClassName\r\n})`\r\n ${({ theme }) => theme.flexRowNoWrap}\r\n align-items: left;\r\n border-radius: 5px;\r\n margin-left: 15px;\r\n outline: none;\r\n cursor: pointer;\r\n text-decoration: none;\r\n color: ${({ theme }) => theme.text2};\r\n font-size: 1rem;\r\n width: fit-content;\r\n font-weight: 500;\r\n opacity: 0.85;\r\n transition: 0.3s ease;\r\n\r\n &.${activeClassName} {\r\n border-radius: 25px;\r\n font-weight: 600;\r\n color: ${({ theme }) => theme.text1};\r\n }\r\n\r\n :hover {\r\n opacity: 1;\r\n }\r\n :focus {\r\n color: ${({ theme }) => darken(0.1, theme.text1)};\r\n }\r\n`\r\n\r\nconst RowStyled = styled.div`\r\n display: flex;\r\n align-items: center;\r\n padding: 0px 15px 10px 15px;\r\n position: ;\r\n`\r\n\r\nconst Row = styled.div`\r\n display: flex;\r\n justify-content: space-between;\r\n height: 58px;\r\n`\r\nconst SettingsStyled = styled.div`\r\n margin: 10px 0px;\r\n`\r\n\r\nexport default function SwapMenu({ adding }: { adding: boolean }) {\r\n const { t } = useTranslation()\r\n return (\r\n \r\n \r\n \r\n \r\n {t('swap')}\r\n \r\n \r\n {t('+ Liquidity')}\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n )\r\n}\r\n","import { CurrencyAmount, JSBI, Token, Trade } from '@levinswap/uniswap-sdk'\r\nimport React, { useCallback, useContext, useEffect, useMemo, useState } from 'react'\r\nimport { ArrowDown } from 'react-feather'\r\nimport ReactGA from 'react-ga'\r\nimport { Text } from 'rebass'\r\nimport { ThemeContext } from 'styled-components'\r\nimport AddressInputPanel from '../../components/AddressInputPanel'\r\nimport { ButtonError, ButtonLight, ButtonPrimary, ButtonConfirmed } from '../../components/Button'\r\nimport Card, { GreyCard } from '../../components/Card'\r\nimport Column, { AutoColumn } from '../../components/Column'\r\nimport ConfirmSwapModal from '../../components/swap/ConfirmSwapModal'\r\nimport CurrencyInputPanel from '../../components/CurrencyInputPanel'\r\nimport { SwapPoolTabs } from '../../components/NavigationTabs'\r\nimport { AutoRow, RowBetween } from '../../components/Row'\r\nimport AdvancedSwapDetailsDropdown from '../../components/swap/AdvancedSwapDetailsDropdown'\r\nimport BetterTradeLink, { DefaultVersionLink } from '../../components/swap/BetterTradeLink'\r\nimport confirmPriceImpactWithoutFee from '../../components/swap/confirmPriceImpactWithoutFee'\r\nimport { ArrowWrapper, BottomGrouping, SwapCallbackError, Wrapper } from '../../components/swap/styleds'\r\nimport TradePrice from '../../components/swap/TradePrice'\r\nimport TokenWarningModal from '../../components/TokenWarningModal'\r\nimport ProgressSteps from '../../components/ProgressSteps'\r\n\r\nimport { BETTER_TRADE_LINK_THRESHOLD, INITIAL_ALLOWED_SLIPPAGE } from '../../constants'\r\nimport { getTradeVersion, isTradeBetter } from '../../data/V1'\r\nimport { useActiveWeb3React } from '../../hooks'\r\nimport { useCurrency } from '../../hooks/Tokens'\r\nimport { ApprovalState, useApproveCallbackFromTrade } from '../../hooks/useApproveCallback'\r\nimport useENSAddress from '../../hooks/useENSAddress'\r\nimport { useSwapCallback } from '../../hooks/useSwapCallback'\r\nimport useToggledVersion, { DEFAULT_VERSION, Version } from '../../hooks/useToggledVersion'\r\nimport useWrapCallback, { WrapType } from '../../hooks/useWrapCallback'\r\nimport { useToggleSettingsMenu, useWalletModalToggle } from '../../state/application/hooks'\r\nimport { Field } from '../../state/swap/actions'\r\nimport {\r\n useDefaultsFromURLSearch,\r\n useDerivedSwapInfo,\r\n useSwapActionHandlers,\r\n useSwapState\r\n} from '../../state/swap/hooks'\r\nimport { useExpertModeManager, useUserSlippageTolerance } from '../../state/user/hooks'\r\nimport { LinkStyledButton, TYPE } from '../../theme'\r\nimport { maxAmountSpend } from '../../utils/maxAmountSpend'\r\nimport { computeTradePriceBreakdown, warningSeverity } from '../../utils/prices'\r\nimport AppBody from '../AppBody'\r\nimport { ClickableText } from '../Pool/styleds'\r\nimport Loader from '../../components/Loader'\r\nimport SwapMenu from '../../components/SwapMenu'\r\n\r\nexport default function Swap() {\r\n const loadedUrlParams = useDefaultsFromURLSearch()\r\n\r\n // token warning stuff\r\n const [loadedInputCurrency, loadedOutputCurrency] = [\r\n useCurrency(loadedUrlParams?.inputCurrencyId),\r\n useCurrency(loadedUrlParams?.outputCurrencyId)\r\n ]\r\n const [dismissTokenWarning, setDismissTokenWarning] = useState(false)\r\n const urlLoadedTokens: Token[] = useMemo(\r\n () => [loadedInputCurrency, loadedOutputCurrency]?.filter((c): c is Token => c instanceof Token) ?? [],\r\n [loadedInputCurrency, loadedOutputCurrency]\r\n )\r\n const handleConfirmTokenWarning = useCallback(() => {\r\n setDismissTokenWarning(true)\r\n }, [])\r\n\r\n const { account } = useActiveWeb3React()\r\n const theme = useContext(ThemeContext)\r\n\r\n // toggle wallet when disconnected\r\n const toggleWalletModal = useWalletModalToggle()\r\n\r\n // for expert mode\r\n const toggleSettings = useToggleSettingsMenu()\r\n const [isExpertMode] = useExpertModeManager()\r\n\r\n // get custom setting values for user\r\n const [allowedSlippage] = useUserSlippageTolerance()\r\n\r\n // swap state\r\n const { independentField, typedValue, recipient } = useSwapState()\r\n const {\r\n v1Trade,\r\n v2Trade,\r\n currencyBalances,\r\n parsedAmount,\r\n currencies,\r\n inputError: swapInputError\r\n } = useDerivedSwapInfo()\r\n const { wrapType, execute: onWrap, inputError: wrapInputError } = useWrapCallback(\r\n currencies[Field.INPUT],\r\n currencies[Field.OUTPUT],\r\n typedValue\r\n )\r\n const showWrap: boolean = wrapType !== WrapType.NOT_APPLICABLE\r\n const { address: recipientAddress } = useENSAddress(recipient)\r\n const toggledVersion = useToggledVersion()\r\n const tradesByVersion = {\r\n [Version.v1]: v1Trade,\r\n [Version.v2]: v2Trade\r\n }\r\n const trade = showWrap ? undefined : tradesByVersion[toggledVersion]\r\n const defaultTrade = showWrap ? undefined : tradesByVersion[DEFAULT_VERSION]\r\n\r\n const betterTradeLinkVersion: Version | undefined =\r\n toggledVersion === Version.v2 && isTradeBetter(v2Trade, v1Trade, BETTER_TRADE_LINK_THRESHOLD)\r\n ? Version.v1\r\n : toggledVersion === Version.v1 && isTradeBetter(v1Trade, v2Trade)\r\n ? Version.v2\r\n : undefined\r\n\r\n const parsedAmounts = showWrap\r\n ? {\r\n [Field.INPUT]: parsedAmount,\r\n [Field.OUTPUT]: parsedAmount\r\n }\r\n : {\r\n [Field.INPUT]: independentField === Field.INPUT ? parsedAmount : trade?.inputAmount,\r\n [Field.OUTPUT]: independentField === Field.OUTPUT ? parsedAmount : trade?.outputAmount\r\n }\r\n\r\n const { onSwitchTokens, onCurrencySelection, onUserInput, onChangeRecipient } = useSwapActionHandlers()\r\n const isValid = !swapInputError\r\n const dependentField: Field = independentField === Field.INPUT ? Field.OUTPUT : Field.INPUT\r\n\r\n const handleTypeInput = useCallback(\r\n (value: string) => {\r\n onUserInput(Field.INPUT, value)\r\n },\r\n [onUserInput]\r\n )\r\n const handleTypeOutput = useCallback(\r\n (value: string) => {\r\n onUserInput(Field.OUTPUT, value)\r\n },\r\n [onUserInput]\r\n )\r\n\r\n // modal and loading\r\n const [{ showConfirm, tradeToConfirm, swapErrorMessage, attemptingTxn, txHash }, setSwapState] = useState<{\r\n showConfirm: boolean\r\n tradeToConfirm: Trade | undefined\r\n attemptingTxn: boolean\r\n swapErrorMessage: string | undefined\r\n txHash: string | undefined\r\n }>({\r\n showConfirm: false,\r\n tradeToConfirm: undefined,\r\n attemptingTxn: false,\r\n swapErrorMessage: undefined,\r\n txHash: undefined\r\n })\r\n\r\n const formattedAmounts = {\r\n [independentField]: typedValue,\r\n [dependentField]: showWrap\r\n ? parsedAmounts[independentField]?.toExact() ?? ''\r\n : parsedAmounts[dependentField]?.toSignificant(6) ?? ''\r\n }\r\n\r\n const route = trade?.route\r\n const userHasSpecifiedInputOutput = Boolean(\r\n currencies[Field.INPUT] && currencies[Field.OUTPUT] && parsedAmounts[independentField]?.greaterThan(JSBI.BigInt(0))\r\n )\r\n const noRoute = !route\r\n\r\n // check whether the user has approved the router on the input token\r\n const [approval, approveCallback] = useApproveCallbackFromTrade(trade, allowedSlippage)\r\n\r\n // check if user has gone through approval process, used to show two step buttons, reset on token change\r\n const [approvalSubmitted, setApprovalSubmitted] = useState(false)\r\n\r\n // mark when a user has submitted an approval, reset onTokenSelection for input field\r\n useEffect(() => {\r\n if (approval === ApprovalState.PENDING) {\r\n setApprovalSubmitted(true)\r\n }\r\n }, [approval, approvalSubmitted])\r\n\r\n const maxAmountInput: CurrencyAmount | undefined = maxAmountSpend(currencyBalances[Field.INPUT])\r\n const atMaxAmountInput = Boolean(maxAmountInput && parsedAmounts[Field.INPUT]?.equalTo(maxAmountInput))\r\n\r\n // the callback to execute the swap\r\n const { callback: swapCallback, error: swapCallbackError } = useSwapCallback(trade, allowedSlippage, recipient)\r\n\r\n const { priceImpactWithoutFee } = computeTradePriceBreakdown(trade)\r\n\r\n const handleSwap = useCallback(() => {\r\n if (priceImpactWithoutFee && !confirmPriceImpactWithoutFee(priceImpactWithoutFee)) {\r\n return\r\n }\r\n if (!swapCallback) {\r\n return\r\n }\r\n setSwapState({ attemptingTxn: true, tradeToConfirm, showConfirm, swapErrorMessage: undefined, txHash: undefined })\r\n swapCallback()\r\n .then(hash => {\r\n setSwapState({ attemptingTxn: false, tradeToConfirm, showConfirm, swapErrorMessage: undefined, txHash: hash })\r\n\r\n ReactGA.event({\r\n category: 'Swap',\r\n action:\r\n recipient === null\r\n ? 'Swap w/o Send'\r\n : (recipientAddress ?? recipient) === account\r\n ? 'Swap w/o Send + recipient'\r\n : 'Swap w/ Send',\r\n label: [\r\n trade?.inputAmount?.currency?.symbol,\r\n trade?.outputAmount?.currency?.symbol,\r\n getTradeVersion(trade)\r\n ].join('/')\r\n })\r\n })\r\n .catch(error => {\r\n setSwapState({\r\n attemptingTxn: false,\r\n tradeToConfirm,\r\n showConfirm,\r\n swapErrorMessage: error.message,\r\n txHash: undefined\r\n })\r\n })\r\n }, [tradeToConfirm, account, priceImpactWithoutFee, recipient, recipientAddress, showConfirm, swapCallback, trade])\r\n\r\n // errors\r\n const [showInverted, setShowInverted] = useState(false)\r\n\r\n // warnings on slippage\r\n const priceImpactSeverity = warningSeverity(priceImpactWithoutFee)\r\n\r\n // show approve flow when: no error on inputs, not approved or pending, or approved in current session\r\n // never show if price impact is above threshold in non expert mode\r\n const showApproveFlow =\r\n !swapInputError &&\r\n (approval === ApprovalState.NOT_APPROVED ||\r\n approval === ApprovalState.PENDING ||\r\n (approvalSubmitted && approval === ApprovalState.APPROVED)) &&\r\n !(priceImpactSeverity > 3 && !isExpertMode)\r\n\r\n const handleConfirmDismiss = useCallback(() => {\r\n setSwapState({ showConfirm: false, tradeToConfirm, attemptingTxn, swapErrorMessage, txHash })\r\n // if there was a tx hash, we want to clear the input\r\n if (txHash) {\r\n onUserInput(Field.INPUT, '')\r\n }\r\n }, [attemptingTxn, onUserInput, swapErrorMessage, tradeToConfirm, txHash])\r\n\r\n const handleAcceptChanges = useCallback(() => {\r\n setSwapState({ tradeToConfirm: trade, swapErrorMessage, txHash, attemptingTxn, showConfirm })\r\n }, [attemptingTxn, showConfirm, swapErrorMessage, trade, txHash])\r\n\r\n const handleInputSelect = useCallback(\r\n inputCurrency => {\r\n setApprovalSubmitted(false) // reset 2 step UI for approvals\r\n onCurrencySelection(Field.INPUT, inputCurrency)\r\n },\r\n [onCurrencySelection]\r\n )\r\n\r\n const handleMaxInput = useCallback(() => {\r\n maxAmountInput && onUserInput(Field.INPUT, maxAmountInput.toExact())\r\n }, [maxAmountInput, onUserInput])\r\n\r\n const handleOutputSelect = useCallback(outputCurrency => onCurrencySelection(Field.OUTPUT, outputCurrency), [\r\n onCurrencySelection\r\n ])\r\n\r\n return (\r\n <>\r\n 0 && !dismissTokenWarning}\r\n tokens={urlLoadedTokens}\r\n onConfirm={handleConfirmTokenWarning}\r\n />\r\n \r\n \r\n \r\n \r\n \r\n\r\n \r\n \r\n \r\n \r\n \r\n {\r\n setApprovalSubmitted(false) // reset 2 step UI for approvals\r\n onSwitchTokens()\r\n }}\r\n color={currencies[Field.INPUT] && currencies[Field.OUTPUT] ? theme.primary1 : theme.text2}\r\n />\r\n \r\n {recipient === null && !showWrap && isExpertMode ? (\r\n onChangeRecipient('')}>\r\n + Add a send (optional)\r\n \r\n ) : null}\r\n \r\n \r\n \r\n\r\n {recipient !== null && !showWrap ? (\r\n <>\r\n \r\n \r\n \r\n \r\n onChangeRecipient(null)}>\r\n - Remove send\r\n \r\n \r\n \r\n \r\n ) : null}\r\n\r\n {showWrap ? null : (\r\n \r\n \r\n {Boolean(trade) && (\r\n \r\n \r\n Price\r\n \r\n \r\n \r\n )}\r\n {allowedSlippage !== INITIAL_ALLOWED_SLIPPAGE && (\r\n \r\n \r\n Slippage Tolerance\r\n \r\n \r\n {allowedSlippage / 100}%\r\n \r\n \r\n )}\r\n \r\n \r\n )}\r\n \r\n \r\n {!account ? (\r\n Connect Wallet\r\n ) : showWrap ? (\r\n \r\n {wrapInputError ??\r\n (wrapType === WrapType.WRAP ? 'Wrap' : wrapType === WrapType.UNWRAP ? 'Unwrap' : null)}\r\n \r\n ) : noRoute && userHasSpecifiedInputOutput ? (\r\n \r\n Insufficient liquidity for this trade.\r\n \r\n ) : showApproveFlow ? (\r\n \r\n \r\n {approval === ApprovalState.PENDING ? (\r\n \r\n Approving \r\n \r\n ) : approvalSubmitted && approval === ApprovalState.APPROVED ? (\r\n 'Approved'\r\n ) : (\r\n 'Approve ' + currencies[Field.INPUT]?.symbol\r\n )}\r\n \r\n {\r\n if (isExpertMode) {\r\n handleSwap()\r\n } else {\r\n setSwapState({\r\n tradeToConfirm: trade,\r\n attemptingTxn: false,\r\n swapErrorMessage: undefined,\r\n showConfirm: true,\r\n txHash: undefined\r\n })\r\n }\r\n }}\r\n width=\"48%\"\r\n id=\"swap-button\"\r\n disabled={\r\n !isValid || approval !== ApprovalState.APPROVED || (priceImpactSeverity > 3 && !isExpertMode)\r\n }\r\n error={isValid && priceImpactSeverity > 2}\r\n >\r\n \r\n {priceImpactSeverity > 3 && !isExpertMode\r\n ? `Price Impact High`\r\n : `Swap${priceImpactSeverity > 2 ? ' Anyway' : ''}`}\r\n \r\n \r\n \r\n ) : (\r\n {\r\n if (isExpertMode) {\r\n handleSwap()\r\n } else {\r\n setSwapState({\r\n tradeToConfirm: trade,\r\n attemptingTxn: false,\r\n swapErrorMessage: undefined,\r\n showConfirm: true,\r\n txHash: undefined\r\n })\r\n }\r\n }}\r\n id=\"swap-button\"\r\n disabled={!isValid || (priceImpactSeverity > 3 && !isExpertMode) || !!swapCallbackError}\r\n error={isValid && priceImpactSeverity > 2 && !swapCallbackError}\r\n >\r\n \r\n {swapInputError\r\n ? swapInputError\r\n : priceImpactSeverity > 3 && !isExpertMode\r\n ? `Price Impact Too High`\r\n : `Swap${priceImpactSeverity > 2 ? ' Anyway' : ''}`}\r\n \r\n \r\n )}\r\n {showApproveFlow && (\r\n \r\n \r\n \r\n )}\r\n {isExpertMode && swapErrorMessage ? : null}\r\n {betterTradeLinkVersion ? (\r\n \r\n ) : toggledVersion !== DEFAULT_VERSION && defaultTrade ? (\r\n \r\n ) : null}\r\n \r\n \r\n \r\n \r\n \r\n )\r\n}\r\n","import { Percent } from '@levinswap/uniswap-sdk'\nimport { ALLOWED_PRICE_IMPACT_HIGH, PRICE_IMPACT_WITHOUT_FEE_CONFIRM_MIN } from '../../constants'\n\n/**\n * Given the price impact, get user confirmation.\n *\n * @param priceImpactWithoutFee price impact of the trade without the fee.\n */\nexport default function confirmPriceImpactWithoutFee(priceImpactWithoutFee: Percent): boolean {\n if (!priceImpactWithoutFee.lessThan(PRICE_IMPACT_WITHOUT_FEE_CONFIRM_MIN)) {\n return (\n window.prompt(\n `This swap has a price impact of at least ${PRICE_IMPACT_WITHOUT_FEE_CONFIRM_MIN.toFixed(\n 0\n )}%. Please type the word \"confirm\" to continue with this swap.`\n ) === 'confirm'\n )\n } else if (!priceImpactWithoutFee.lessThan(ALLOWED_PRICE_IMPACT_HIGH)) {\n return window.confirm(\n `This swap has a price impact of at least ${ALLOWED_PRICE_IMPACT_HIGH.toFixed(\n 0\n )}%. Please confirm that you would like to continue with this swap.`\n )\n }\n return true\n}\n","import React, { useEffect } from 'react'\nimport { useDispatch } from 'react-redux'\nimport { Redirect, RouteComponentProps } from 'react-router-dom'\nimport { AppDispatch } from '../../state'\nimport { ApplicationModal, setOpenModal } from '../../state/application/actions'\n\n// Redirects to swap but only replace the pathname\nexport function RedirectPathToSwapOnly({ location }: RouteComponentProps) {\n return \n}\n\n// Redirects from the /swap/:outputCurrency path to the /swap?outputCurrency=:outputCurrency format\nexport function RedirectToSwap(props: RouteComponentProps<{ outputCurrency: string }>) {\n const {\n location: { search },\n match: {\n params: { outputCurrency }\n }\n } = props\n\n return (\n 1\n ? `${search}&outputCurrency=${outputCurrency}`\n : `?outputCurrency=${outputCurrency}`\n }}\n />\n )\n}\n\nexport function OpenClaimAddressModalAndRedirectToSwap(props: RouteComponentProps) {\n const dispatch = useDispatch()\n useEffect(() => {\n dispatch(setOpenModal(ApplicationModal.ADDRESS_CLAIM))\n }, [dispatch])\n return \n}\n","import React, { Suspense } from 'react'\nimport { Route, Switch } from 'react-router-dom'\nimport styled from 'styled-components'\nimport GoogleAnalyticsReporter from '../components/analytics/GoogleAnalyticsReporter'\nimport Header from '../components/Header'\nimport Polling from '../components/Header/Polling'\nimport URLWarning from '../components/Header/URLWarning'\nimport Popups from '../components/Popups'\nimport Web3ReactManager from '../components/Web3ReactManager'\n// import { ApplicationModal } from '../state/application/actions'\n// import { useModalOpen, useToggleModal } from '../state/application/hooks'\nimport DarkModeQueryParamReader from '../theme/DarkModeQueryParamReader'\nimport AddLiquidity from './AddLiquidity'\nimport {\n RedirectDuplicateTokenIds,\n RedirectOldAddLiquidityPathStructure,\n RedirectToAddLiquidity\n} from './AddLiquidity/redirects'\nimport MigrateV1 from './MigrateV1'\nimport MigrateV1Exchange from './MigrateV1/MigrateV1Exchange'\nimport RemoveV1Exchange from './MigrateV1/RemoveV1Exchange'\nimport Pool from './Pool'\nimport PoolFinder from './PoolFinder'\nimport RemoveLiquidity from './RemoveLiquidity'\nimport { RedirectOldRemoveLiquidityPathStructure } from './RemoveLiquidity/redirects'\nimport Swap from './Swap'\nimport { OpenClaimAddressModalAndRedirectToSwap, RedirectPathToSwapOnly, RedirectToSwap } from './Swap/redirects'\n\nconst AppWrapper = styled.div`\n display: flex;\n flex-flow: column;\n align-items: flex-start;\n overflow-x: hidden;\n`\n\nconst HeaderWrapper = styled.div`\n ${({ theme }) => theme.flexRowNoWrap}\n width: 100%;\n justify-content: space-between;\n`\n\nconst BodyWrapper = styled.div`\n display: flex;\n flex-direction: column;\n width: 100%;\n padding-top: 100px;\n align-items: center;\n flex: 1;\n overflow-y: auto;\n overflow-x: hidden;\n z-index: 10;\n\n ${({ theme }) => theme.mediaWidth.upToSmall`\n padding: 16px;\n padding-top: 2rem;\n `};\n\n z-index: 1;\n`\n\nconst Marginer = styled.div`\n margin-top: 5rem;\n`\n\n// function TopLevelModals() {\n// const open = useModalOpen(ApplicationModal.ADDRESS_CLAIM)\n// const toggle = useToggleModal(ApplicationModal.ADDRESS_CLAIM)\n// return \n// }\n\nexport default function App() {\n return (\n \n \n \n \n \n \n
    \n \n \n \n \n {/* */}\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n )\n}\n","import { createReducer, nanoid } from '@reduxjs/toolkit'\nimport { addPopup, PopupContent, removePopup, updateBlockNumber, ApplicationModal, setOpenModal } from './actions'\n\ntype PopupList = Array<{ key: string; show: boolean; content: PopupContent; removeAfterMs: number | null }>\n\nexport interface ApplicationState {\n readonly blockNumber: { readonly [chainId: number]: number }\n readonly popupList: PopupList\n readonly openModal: ApplicationModal | null\n}\n\nconst initialState: ApplicationState = {\n blockNumber: {},\n popupList: [],\n openModal: null\n}\n\nexport default createReducer(initialState, builder =>\n builder\n .addCase(updateBlockNumber, (state, action) => {\n const { chainId, blockNumber } = action.payload\n if (typeof state.blockNumber[chainId] !== 'number') {\n state.blockNumber[chainId] = blockNumber\n } else {\n state.blockNumber[chainId] = Math.max(blockNumber, state.blockNumber[chainId])\n }\n })\n .addCase(setOpenModal, (state, action) => {\n state.openModal = action.payload\n })\n .addCase(addPopup, (state, { payload: { content, key, removeAfterMs = 15000 } }) => {\n state.popupList = (key ? state.popupList.filter(popup => popup.key !== key) : state.popupList).concat([\n {\n key: key || nanoid(),\n show: true,\n content,\n removeAfterMs\n }\n ])\n })\n .addCase(removePopup, (state, { payload: { key } }) => {\n state.popupList.forEach(p => {\n if (p.key === key) {\n p.show = false\n }\n })\n })\n)\n","import { createAction } from '@reduxjs/toolkit'\n\n// fired once when the app reloads but before the app renders\n// allows any updates to be applied to store data loaded from localStorage\nexport const updateVersion = createAction('global/updateVersion')\n","import { INITIAL_ALLOWED_SLIPPAGE, DEFAULT_DEADLINE_FROM_NOW } from '../../constants'\nimport { createReducer } from '@reduxjs/toolkit'\nimport { updateVersion } from '../global/actions'\nimport {\n addSerializedPair,\n addSerializedToken,\n removeSerializedPair,\n removeSerializedToken,\n SerializedPair,\n SerializedToken,\n updateMatchesDarkMode,\n updateUserDarkMode,\n updateUserExpertMode,\n updateUserSlippageTolerance,\n updateUserDeadline,\n toggleURLWarning\n} from './actions'\n\nconst currentTimestamp = () => new Date().getTime()\n\nexport interface UserState {\n // the timestamp of the last updateVersion action\n lastUpdateVersionTimestamp?: number\n\n userDarkMode: boolean | null // the user's choice for dark mode or light mode\n matchesDarkMode: boolean // whether the dark mode media query matches\n\n userExpertMode: boolean\n\n // user defined slippage tolerance in bips, used in all txns\n userSlippageTolerance: number\n\n // deadline set by user in minutes, used in all txns\n userDeadline: number\n\n tokens: {\n [chainId: number]: {\n [address: string]: SerializedToken\n }\n }\n\n pairs: {\n [chainId: number]: {\n // keyed by token0Address:token1Address\n [key: string]: SerializedPair\n }\n }\n\n timestamp: number\n URLWarningVisible: boolean\n}\n\nfunction pairKey(token0Address: string, token1Address: string) {\n return `${token0Address};${token1Address}`\n}\n\nexport const initialState: UserState = {\n userDarkMode: null,\n matchesDarkMode: false,\n userExpertMode: false,\n userSlippageTolerance: INITIAL_ALLOWED_SLIPPAGE,\n userDeadline: DEFAULT_DEADLINE_FROM_NOW,\n tokens: {},\n pairs: {},\n timestamp: currentTimestamp(),\n URLWarningVisible: true\n}\n\nexport default createReducer(initialState, builder =>\n builder\n .addCase(updateVersion, state => {\n // slippage isnt being tracked in local storage, reset to default\n // noinspection SuspiciousTypeOfGuard\n if (typeof state.userSlippageTolerance !== 'number') {\n state.userSlippageTolerance = INITIAL_ALLOWED_SLIPPAGE\n }\n\n // deadline isnt being tracked in local storage, reset to default\n // noinspection SuspiciousTypeOfGuard\n if (typeof state.userDeadline !== 'number') {\n state.userDeadline = DEFAULT_DEADLINE_FROM_NOW\n }\n\n state.lastUpdateVersionTimestamp = currentTimestamp()\n })\n .addCase(updateUserDarkMode, (state, action) => {\n state.userDarkMode = action.payload.userDarkMode\n state.timestamp = currentTimestamp()\n })\n .addCase(updateMatchesDarkMode, (state, action) => {\n state.matchesDarkMode = action.payload.matchesDarkMode\n state.timestamp = currentTimestamp()\n })\n .addCase(updateUserExpertMode, (state, action) => {\n state.userExpertMode = action.payload.userExpertMode\n state.timestamp = currentTimestamp()\n })\n .addCase(updateUserSlippageTolerance, (state, action) => {\n state.userSlippageTolerance = action.payload.userSlippageTolerance\n state.timestamp = currentTimestamp()\n })\n .addCase(updateUserDeadline, (state, action) => {\n state.userDeadline = action.payload.userDeadline\n state.timestamp = currentTimestamp()\n })\n .addCase(addSerializedToken, (state, { payload: { serializedToken } }) => {\n state.tokens[serializedToken.chainId] = state.tokens[serializedToken.chainId] || {}\n state.tokens[serializedToken.chainId][serializedToken.address] = serializedToken\n state.timestamp = currentTimestamp()\n })\n .addCase(removeSerializedToken, (state, { payload: { address, chainId } }) => {\n state.tokens[chainId] = state.tokens[chainId] || {}\n delete state.tokens[chainId][address]\n state.timestamp = currentTimestamp()\n })\n .addCase(addSerializedPair, (state, { payload: { serializedPair } }) => {\n if (\n serializedPair.token0.chainId === serializedPair.token1.chainId &&\n serializedPair.token0.address !== serializedPair.token1.address\n ) {\n const chainId = serializedPair.token0.chainId\n state.pairs[chainId] = state.pairs[chainId] || {}\n state.pairs[chainId][pairKey(serializedPair.token0.address, serializedPair.token1.address)] = serializedPair\n }\n state.timestamp = currentTimestamp()\n })\n .addCase(removeSerializedPair, (state, { payload: { chainId, tokenAAddress, tokenBAddress } }) => {\n if (state.pairs[chainId]) {\n // just delete both keys if either exists\n delete state.pairs[chainId][pairKey(tokenAAddress, tokenBAddress)]\n delete state.pairs[chainId][pairKey(tokenBAddress, tokenAAddress)]\n }\n state.timestamp = currentTimestamp()\n })\n .addCase(toggleURLWarning, state => {\n state.URLWarningVisible = !state.URLWarningVisible\n })\n)\n","import { createReducer } from '@reduxjs/toolkit'\nimport {\n addTransaction,\n checkedTransaction,\n clearAllTransactions,\n finalizeTransaction,\n SerializableTransactionReceipt\n} from './actions'\n\nconst now = () => new Date().getTime()\n\nexport interface TransactionDetails {\n hash: string\n approval?: { tokenAddress: string; spender: string }\n summary?: string\n claim?: { recipient: string }\n receipt?: SerializableTransactionReceipt\n lastCheckedBlockNumber?: number\n addedTime: number\n confirmedTime?: number\n from: string\n}\n\nexport interface TransactionState {\n [chainId: number]: {\n [txHash: string]: TransactionDetails\n }\n}\n\nexport const initialState: TransactionState = {}\n\nexport default createReducer(initialState, builder =>\n builder\n .addCase(addTransaction, (transactions, { payload: { chainId, from, hash, approval, summary, claim } }) => {\n if (transactions[chainId]?.[hash]) {\n throw Error('Attempted to add existing transaction.')\n }\n const txs = transactions[chainId] ?? {}\n txs[hash] = { hash, approval, summary, claim, from, addedTime: now() }\n transactions[chainId] = txs\n })\n .addCase(clearAllTransactions, (transactions, { payload: { chainId } }) => {\n if (!transactions[chainId]) return\n transactions[chainId] = {}\n })\n .addCase(checkedTransaction, (transactions, { payload: { chainId, hash, blockNumber } }) => {\n const tx = transactions[chainId]?.[hash]\n if (!tx) {\n return\n }\n if (!tx.lastCheckedBlockNumber) {\n tx.lastCheckedBlockNumber = blockNumber\n } else {\n tx.lastCheckedBlockNumber = Math.max(blockNumber, tx.lastCheckedBlockNumber)\n }\n })\n .addCase(finalizeTransaction, (transactions, { payload: { hash, chainId, receipt } }) => {\n const tx = transactions[chainId]?.[hash]\n if (!tx) {\n return\n }\n tx.receipt = receipt\n tx.confirmedTime = now()\n })\n)\n","import { createReducer } from '@reduxjs/toolkit'\nimport { Field, replaceSwapState, selectCurrency, setRecipient, switchCurrencies, typeInput } from './actions'\n\nexport interface SwapState {\n readonly independentField: Field\n readonly typedValue: string\n readonly [Field.INPUT]: {\n readonly currencyId: string | undefined\n }\n readonly [Field.OUTPUT]: {\n readonly currencyId: string | undefined\n }\n // the typed recipient address or ENS name, or null if swap should go to sender\n readonly recipient: string | null\n}\n\nconst initialState: SwapState = {\n independentField: Field.INPUT,\n typedValue: '',\n [Field.INPUT]: {\n currencyId: ''\n },\n [Field.OUTPUT]: {\n currencyId: ''\n },\n recipient: null\n}\n\nexport default createReducer(initialState, builder =>\n builder\n .addCase(\n replaceSwapState,\n (state, { payload: { typedValue, recipient, field, inputCurrencyId, outputCurrencyId } }) => {\n return {\n [Field.INPUT]: {\n currencyId: inputCurrencyId\n },\n [Field.OUTPUT]: {\n currencyId: outputCurrencyId\n },\n independentField: field,\n typedValue: typedValue,\n recipient\n }\n }\n )\n .addCase(selectCurrency, (state, { payload: { currencyId, field } }) => {\n const otherField = field === Field.INPUT ? Field.OUTPUT : Field.INPUT\n if (currencyId === state[otherField].currencyId) {\n // the case where we have to swap the order\n return {\n ...state,\n independentField: state.independentField === Field.INPUT ? Field.OUTPUT : Field.INPUT,\n [field]: { currencyId: currencyId },\n [otherField]: { currencyId: state[field].currencyId }\n }\n } else {\n // the normal case\n return {\n ...state,\n [field]: { currencyId: currencyId }\n }\n }\n })\n .addCase(switchCurrencies, state => {\n return {\n ...state,\n independentField: state.independentField === Field.INPUT ? Field.OUTPUT : Field.INPUT,\n [Field.INPUT]: { currencyId: state[Field.OUTPUT].currencyId },\n [Field.OUTPUT]: { currencyId: state[Field.INPUT].currencyId }\n }\n })\n .addCase(typeInput, (state, { payload: { field, typedValue } }) => {\n return {\n ...state,\n independentField: field,\n typedValue\n }\n })\n .addCase(setRecipient, (state, { payload: { recipient } }) => {\n state.recipient = recipient\n })\n)\n","import { createReducer } from '@reduxjs/toolkit'\nimport { Field, resetMintState, typeInput } from './actions'\n\nexport interface MintState {\n readonly independentField: Field\n readonly typedValue: string\n readonly otherTypedValue: string // for the case when there's no liquidity\n}\n\nconst initialState: MintState = {\n independentField: Field.CURRENCY_A,\n typedValue: '',\n otherTypedValue: ''\n}\n\nexport default createReducer(initialState, builder =>\n builder\n .addCase(resetMintState, () => initialState)\n .addCase(typeInput, (state, { payload: { field, typedValue, noLiquidity } }) => {\n if (noLiquidity) {\n // they're typing into the field they've last typed in\n if (field === state.independentField) {\n return {\n ...state,\n independentField: field,\n typedValue\n }\n }\n // they're typing into a new field, store the other value\n else {\n return {\n ...state,\n independentField: field,\n typedValue,\n otherTypedValue: state.typedValue\n }\n }\n } else {\n return {\n ...state,\n independentField: field,\n typedValue,\n otherTypedValue: ''\n }\n }\n })\n)\n","import { DEFAULT_ACTIVE_LIST_URLS, UNSUPPORTED_LIST_URLS } from './../../constants/lists'\r\nimport { createReducer } from '@reduxjs/toolkit'\r\nimport { getVersionUpgrade, VersionUpgrade } from '@uniswap/token-lists'\r\nimport { TokenList } from '@uniswap/token-lists/dist/types'\r\nimport { DEFAULT_LIST_OF_LISTS } from '../../constants/lists'\r\nimport { updateVersion } from '../global/actions'\r\nimport { acceptListUpdate, addList, fetchTokenList, removeList, enableList, disableList } from './actions'\r\n\r\nexport interface ListsState {\r\n readonly byUrl: {\r\n readonly [url: string]: {\r\n readonly current: TokenList | null\r\n readonly pendingUpdate: TokenList | null\r\n readonly loadingRequestId: string | null\r\n readonly error: string | null\r\n }\r\n }\r\n // this contains the default list of lists from the last time the updateVersion was called, i.e. the app was reloaded\r\n readonly lastInitializedDefaultListOfLists?: string[]\r\n\r\n // currently active lists\r\n readonly activeListUrls: string[] | undefined\r\n}\r\n\r\ntype ListState = ListsState['byUrl'][string]\r\n\r\nconst NEW_LIST_STATE: ListState = {\r\n error: null,\r\n current: null,\r\n loadingRequestId: null,\r\n pendingUpdate: null\r\n}\r\n\r\ntype Mutable = { -readonly [P in keyof T]: T[P] extends ReadonlyArray ? U[] : T[P] }\r\n\r\nconst initialState: ListsState = {\r\n lastInitializedDefaultListOfLists: DEFAULT_LIST_OF_LISTS,\r\n byUrl: {\r\n ...DEFAULT_LIST_OF_LISTS.concat(...UNSUPPORTED_LIST_URLS).reduce>((memo, listUrl) => {\r\n memo[listUrl] = NEW_LIST_STATE\r\n return memo\r\n }, {})\r\n },\r\n activeListUrls: DEFAULT_ACTIVE_LIST_URLS\r\n}\r\n\r\nexport default createReducer(initialState, builder =>\r\n builder\r\n .addCase(fetchTokenList.pending, (state, { payload: { requestId, url } }) => {\r\n state.byUrl[url] = {\r\n current: null,\r\n pendingUpdate: null,\r\n ...state.byUrl[url],\r\n loadingRequestId: requestId,\r\n error: null\r\n }\r\n })\r\n .addCase(fetchTokenList.fulfilled, (state, { payload: { requestId, tokenList, url } }) => {\r\n const current = state.byUrl[url]?.current\r\n const loadingRequestId = state.byUrl[url]?.loadingRequestId\r\n\r\n // no-op if update does nothing\r\n if (current) {\r\n const upgradeType = getVersionUpgrade(current.version, tokenList.version)\r\n\r\n if (upgradeType === VersionUpgrade.NONE) return\r\n if (loadingRequestId === null || loadingRequestId === requestId) {\r\n state.byUrl[url] = {\r\n ...state.byUrl[url],\r\n loadingRequestId: null,\r\n error: null,\r\n current: current,\r\n pendingUpdate: tokenList\r\n }\r\n }\r\n } else {\r\n // activate if on default active\r\n if (DEFAULT_ACTIVE_LIST_URLS.includes(url)) {\r\n state.activeListUrls?.push(url)\r\n }\r\n\r\n state.byUrl[url] = {\r\n ...state.byUrl[url],\r\n loadingRequestId: null,\r\n error: null,\r\n current: tokenList,\r\n pendingUpdate: null\r\n }\r\n }\r\n })\r\n .addCase(fetchTokenList.rejected, (state, { payload: { url, requestId, errorMessage } }) => {\r\n if (state.byUrl[url]?.loadingRequestId !== requestId) {\r\n // no-op since it's not the latest request\r\n return\r\n }\r\n\r\n state.byUrl[url] = {\r\n ...state.byUrl[url],\r\n loadingRequestId: null,\r\n error: errorMessage,\r\n current: null,\r\n pendingUpdate: null\r\n }\r\n })\r\n .addCase(addList, (state, { payload: url }) => {\r\n if (!state.byUrl[url]) {\r\n state.byUrl[url] = NEW_LIST_STATE\r\n }\r\n })\r\n .addCase(removeList, (state, { payload: url }) => {\r\n if (state.byUrl[url]) {\r\n delete state.byUrl[url]\r\n }\r\n // remove list from active urls if needed\r\n if (state.activeListUrls && state.activeListUrls.includes(url)) {\r\n state.activeListUrls = state.activeListUrls.filter(u => u !== url)\r\n }\r\n })\r\n .addCase(enableList, (state, { payload: url }) => {\r\n if (!state.byUrl[url]) {\r\n state.byUrl[url] = NEW_LIST_STATE\r\n }\r\n\r\n if (state.activeListUrls && !state.activeListUrls.includes(url)) {\r\n state.activeListUrls.push(url)\r\n }\r\n\r\n if (!state.activeListUrls) {\r\n state.activeListUrls = [url]\r\n }\r\n })\r\n .addCase(disableList, (state, { payload: url }) => {\r\n if (state.activeListUrls && state.activeListUrls.includes(url)) {\r\n state.activeListUrls = state.activeListUrls.filter(u => u !== url)\r\n }\r\n })\r\n .addCase(acceptListUpdate, (state, { payload: url }) => {\r\n if (!state.byUrl[url]?.pendingUpdate) {\r\n throw new Error('accept list update called without pending update')\r\n }\r\n state.byUrl[url] = {\r\n ...state.byUrl[url],\r\n pendingUpdate: null,\r\n current: state.byUrl[url].pendingUpdate\r\n }\r\n })\r\n .addCase(updateVersion, state => {\r\n // state loaded from localStorage, but new lists have never been initialized\r\n if (!state.lastInitializedDefaultListOfLists) {\r\n state.byUrl = initialState.byUrl\r\n state.activeListUrls = initialState.activeListUrls\r\n } else if (state.lastInitializedDefaultListOfLists) {\r\n const lastInitializedSet = state.lastInitializedDefaultListOfLists.reduce>(\r\n (s, l) => s.add(l),\r\n new Set()\r\n )\r\n const newListOfListsSet = DEFAULT_LIST_OF_LISTS.reduce>((s, l) => s.add(l), new Set())\r\n\r\n DEFAULT_LIST_OF_LISTS.forEach(listUrl => {\r\n if (!lastInitializedSet.has(listUrl)) {\r\n state.byUrl[listUrl] = NEW_LIST_STATE\r\n }\r\n })\r\n\r\n state.lastInitializedDefaultListOfLists.forEach(listUrl => {\r\n if (!newListOfListsSet.has(listUrl)) {\r\n delete state.byUrl[listUrl]\r\n }\r\n })\r\n }\r\n\r\n state.lastInitializedDefaultListOfLists = DEFAULT_LIST_OF_LISTS\r\n\r\n // if no active lists, activate defaults\r\n if (!state.activeListUrls) {\r\n state.activeListUrls = DEFAULT_ACTIVE_LIST_URLS\r\n\r\n // for each list on default list, initialize if needed\r\n DEFAULT_ACTIVE_LIST_URLS.map((listUrl: string) => {\r\n if (!state.byUrl[listUrl]) {\r\n state.byUrl[listUrl] = NEW_LIST_STATE\r\n }\r\n return true\r\n })\r\n }\r\n })\r\n)\r\n","import { createReducer } from '@reduxjs/toolkit'\nimport { Field, typeInput } from './actions'\n\nexport interface BurnState {\n readonly independentField: Field\n readonly typedValue: string\n}\n\nconst initialState: BurnState = {\n independentField: Field.LIQUIDITY_PERCENT,\n typedValue: '0'\n}\n\nexport default createReducer(initialState, builder =>\n builder.addCase(typeInput, (state, { payload: { field, typedValue } }) => {\n return {\n ...state,\n independentField: field,\n typedValue\n }\n })\n)\n","import { createReducer } from '@reduxjs/toolkit'\nimport {\n addMulticallListeners,\n errorFetchingMulticallResults,\n fetchingMulticallResults,\n removeMulticallListeners,\n toCallKey,\n updateMulticallResults\n} from './actions'\n\nexport interface MulticallState {\n callListeners?: {\n // on a per-chain basis\n [chainId: number]: {\n // stores for each call key the listeners' preferences\n [callKey: string]: {\n // stores how many listeners there are per each blocks per fetch preference\n [blocksPerFetch: number]: number\n }\n }\n }\n\n callResults: {\n [chainId: number]: {\n [callKey: string]: {\n data?: string | null\n blockNumber?: number\n fetchingBlockNumber?: number\n }\n }\n }\n}\n\nconst initialState: MulticallState = {\n callResults: {}\n}\n\nexport default createReducer(initialState, builder =>\n builder\n .addCase(addMulticallListeners, (state, { payload: { calls, chainId, options: { blocksPerFetch = 1 } = {} } }) => {\n const listeners: MulticallState['callListeners'] = state.callListeners\n ? state.callListeners\n : (state.callListeners = {})\n listeners[chainId] = listeners[chainId] ?? {}\n calls.forEach(call => {\n const callKey = toCallKey(call)\n listeners[chainId][callKey] = listeners[chainId][callKey] ?? {}\n listeners[chainId][callKey][blocksPerFetch] = (listeners[chainId][callKey][blocksPerFetch] ?? 0) + 1\n })\n })\n .addCase(\n removeMulticallListeners,\n (state, { payload: { chainId, calls, options: { blocksPerFetch = 1 } = {} } }) => {\n const listeners: MulticallState['callListeners'] = state.callListeners\n ? state.callListeners\n : (state.callListeners = {})\n\n if (!listeners[chainId]) return\n calls.forEach(call => {\n const callKey = toCallKey(call)\n if (!listeners[chainId][callKey]) return\n if (!listeners[chainId][callKey][blocksPerFetch]) return\n\n if (listeners[chainId][callKey][blocksPerFetch] === 1) {\n delete listeners[chainId][callKey][blocksPerFetch]\n } else {\n listeners[chainId][callKey][blocksPerFetch]--\n }\n })\n }\n )\n .addCase(fetchingMulticallResults, (state, { payload: { chainId, fetchingBlockNumber, calls } }) => {\n state.callResults[chainId] = state.callResults[chainId] ?? {}\n calls.forEach(call => {\n const callKey = toCallKey(call)\n const current = state.callResults[chainId][callKey]\n if (!current) {\n state.callResults[chainId][callKey] = {\n fetchingBlockNumber\n }\n } else {\n if ((current.fetchingBlockNumber ?? 0) >= fetchingBlockNumber) return\n state.callResults[chainId][callKey].fetchingBlockNumber = fetchingBlockNumber\n }\n })\n })\n .addCase(errorFetchingMulticallResults, (state, { payload: { fetchingBlockNumber, chainId, calls } }) => {\n state.callResults[chainId] = state.callResults[chainId] ?? {}\n calls.forEach(call => {\n const callKey = toCallKey(call)\n const current = state.callResults[chainId][callKey]\n if (!current) return // only should be dispatched if we are already fetching\n if (current.fetchingBlockNumber === fetchingBlockNumber) {\n delete current.fetchingBlockNumber\n current.data = null\n current.blockNumber = fetchingBlockNumber\n }\n })\n })\n .addCase(updateMulticallResults, (state, { payload: { chainId, results, blockNumber } }) => {\n state.callResults[chainId] = state.callResults[chainId] ?? {}\n Object.keys(results).forEach(callKey => {\n const current = state.callResults[chainId][callKey]\n if ((current?.blockNumber ?? 0) > blockNumber) return\n state.callResults[chainId][callKey] = {\n data: results[callKey],\n blockNumber\n }\n })\n })\n)\n","import { configureStore, getDefaultMiddleware } from '@reduxjs/toolkit'\nimport { save, load } from 'redux-localstorage-simple'\n\nimport application from './application/reducer'\nimport { updateVersion } from './global/actions'\nimport user from './user/reducer'\nimport transactions from './transactions/reducer'\nimport swap from './swap/reducer'\nimport mint from './mint/reducer'\nimport lists from './lists/reducer'\nimport burn from './burn/reducer'\nimport multicall from './multicall/reducer'\n\nconst PERSISTED_KEYS: string[] = ['user', 'transactions', 'lists']\n\nconst store = configureStore({\n reducer: {\n application,\n user,\n transactions,\n swap,\n mint,\n burn,\n multicall,\n lists\n },\n middleware: [...getDefaultMiddleware({ thunk: false }), save({ states: PERSISTED_KEYS })],\n preloadedState: load({ states: PERSISTED_KEYS })\n})\n\nstore.dispatch(updateVersion())\n\nexport default store\n\nexport type AppState = ReturnType\nexport type AppDispatch = typeof store.dispatch\n","import { useCallback, useEffect, useState } from 'react'\n\nconst VISIBILITY_STATE_SUPPORTED = 'visibilityState' in document\n\nfunction isWindowVisible() {\n return !VISIBILITY_STATE_SUPPORTED || document.visibilityState !== 'hidden'\n}\n\n/**\n * Returns whether the window is currently visible to the user.\n */\nexport default function useIsWindowVisible(): boolean {\n const [focused, setFocused] = useState(isWindowVisible())\n const listener = useCallback(() => {\n setFocused(isWindowVisible())\n }, [setFocused])\n\n useEffect(() => {\n if (!VISIBILITY_STATE_SUPPORTED) return undefined\n\n document.addEventListener('visibilitychange', listener)\n return () => {\n document.removeEventListener('visibilitychange', listener)\n }\n }, [listener])\n\n return focused\n}\n","import { useCallback, useEffect, useState } from 'react'\nimport { useActiveWeb3React } from '../../hooks'\nimport useDebounce from '../../hooks/useDebounce'\nimport useIsWindowVisible from '../../hooks/useIsWindowVisible'\nimport { updateBlockNumber } from './actions'\nimport { useDispatch } from 'react-redux'\n\nexport default function Updater(): null {\n const { library, chainId } = useActiveWeb3React()\n const dispatch = useDispatch()\n\n const windowVisible = useIsWindowVisible()\n\n const [state, setState] = useState<{ chainId: number | undefined; blockNumber: number | null }>({\n chainId,\n blockNumber: null\n })\n\n const blockNumberCallback = useCallback(\n (blockNumber: number) => {\n setState(state => {\n if (chainId === state.chainId) {\n if (typeof state.blockNumber !== 'number') return { chainId, blockNumber }\n return { chainId, blockNumber: Math.max(blockNumber, state.blockNumber) }\n }\n return state\n })\n },\n [chainId, setState]\n )\n\n // attach/detach listeners\n useEffect(() => {\n if (!library || !chainId || !windowVisible) return undefined\n\n setState({ chainId, blockNumber: null })\n\n library\n .getBlockNumber()\n .then(blockNumberCallback)\n .catch(error => console.error(`Failed to get block number for chainId: ${chainId}`, error))\n\n library.on('block', blockNumberCallback)\n return () => {\n library.removeListener('block', blockNumberCallback)\n }\n }, [dispatch, chainId, library, blockNumberCallback, windowVisible])\n\n const debouncedState = useDebounce(state, 100)\n\n useEffect(() => {\n if (!debouncedState.chainId || !debouncedState.blockNumber || !windowVisible) return\n dispatch(updateBlockNumber({ chainId: debouncedState.chainId, blockNumber: debouncedState.blockNumber }))\n }, [windowVisible, dispatch, debouncedState.blockNumber, debouncedState.chainId])\n\n return null\n}\n","import { useAllLists } from 'state/lists/hooks'\r\nimport { getVersionUpgrade, minVersionBump, VersionUpgrade } from '@uniswap/token-lists'\r\nimport { useCallback, useEffect } from 'react'\r\nimport { useDispatch } from 'react-redux'\r\nimport { useActiveWeb3React } from '../../hooks'\r\nimport { useFetchListCallback } from '../../hooks/useFetchListCallback'\r\nimport useInterval from '../../hooks/useInterval'\r\nimport useIsWindowVisible from '../../hooks/useIsWindowVisible'\r\nimport { AppDispatch } from '../index'\r\nimport { acceptListUpdate } from './actions'\r\nimport { useActiveListUrls } from './hooks'\r\nimport { useAllInactiveTokens } from 'hooks/Tokens'\r\nimport { UNSUPPORTED_LIST_URLS } from 'constants/lists'\r\n\r\nexport default function Updater(): null {\r\n const { library } = useActiveWeb3React()\r\n const dispatch = useDispatch()\r\n const isWindowVisible = useIsWindowVisible()\r\n\r\n // get all loaded lists, and the active urls\r\n const lists = useAllLists()\r\n const activeListUrls = useActiveListUrls()\r\n\r\n // initiate loading\r\n useAllInactiveTokens()\r\n\r\n const fetchList = useFetchListCallback()\r\n const fetchAllListsCallback = useCallback(() => {\r\n if (!isWindowVisible) return\r\n Object.keys(lists).forEach(url =>\r\n fetchList(url).catch(error => console.debug('interval list fetching error', error))\r\n )\r\n }, [fetchList, isWindowVisible, lists])\r\n\r\n // fetch all lists every 10 minutes, but only after we initialize library\r\n useInterval(fetchAllListsCallback, library ? 1000 * 60 * 10 : null)\r\n\r\n // whenever a list is not loaded and not loading, try again to load it\r\n useEffect(() => {\r\n Object.keys(lists).forEach(listUrl => {\r\n const list = lists[listUrl]\r\n if (!list.current && !list.loadingRequestId && !list.error) {\r\n fetchList(listUrl).catch(error => console.debug('list added fetching error', error))\r\n }\r\n })\r\n }, [dispatch, fetchList, library, lists])\r\n\r\n // if any lists from unsupported lists are loaded, check them too (in case new updates since last visit)\r\n useEffect(() => {\r\n Object.keys(UNSUPPORTED_LIST_URLS).forEach(listUrl => {\r\n const list = lists[listUrl]\r\n if (!list || (!list.current && !list.loadingRequestId && !list.error)) {\r\n fetchList(listUrl).catch(error => console.debug('list added fetching error', error))\r\n }\r\n })\r\n }, [dispatch, fetchList, library, lists])\r\n\r\n // automatically update lists if versions are minor/patch\r\n useEffect(() => {\r\n Object.keys(lists).forEach(listUrl => {\r\n const list = lists[listUrl]\r\n if (list.current && list.pendingUpdate) {\r\n const bump = getVersionUpgrade(list.current.version, list.pendingUpdate.version)\r\n switch (bump) {\r\n case VersionUpgrade.NONE:\r\n throw new Error('unexpected no version bump')\r\n case VersionUpgrade.PATCH:\r\n case VersionUpgrade.MINOR:\r\n const min = minVersionBump(list.current.tokens, list.pendingUpdate.tokens)\r\n // automatically update minor/patch as long as bump matches the min update\r\n if (bump >= min) {\r\n dispatch(acceptListUpdate(listUrl))\r\n } else {\r\n console.error(\r\n `List at url ${listUrl} could not automatically update because the version bump was only PATCH/MINOR while the update had breaking changes and should have been MAJOR`\r\n )\r\n }\r\n break\r\n\r\n // update any active or inactive lists\r\n case VersionUpgrade.MAJOR:\r\n dispatch(acceptListUpdate(listUrl))\r\n }\r\n }\r\n })\r\n }, [dispatch, lists, activeListUrls])\r\n\r\n return null\r\n}\r\n","function wait(ms: number): Promise {\n return new Promise(resolve => setTimeout(resolve, ms))\n}\n\nfunction waitRandom(min: number, max: number): Promise {\n return wait(min + Math.round(Math.random() * Math.max(0, max - min)))\n}\n\n/**\n * This error is thrown if the function is cancelled before completing\n */\nexport class CancelledError extends Error {\n constructor() {\n super('Cancelled')\n }\n}\n\n/**\n * Throw this error if the function should retry\n */\nexport class RetryableError extends Error {}\n\n/**\n * Retries the function that returns the promise until the promise successfully resolves up to n retries\n * @param fn function to retry\n * @param n how many times to retry\n * @param minWait min wait between retries in ms\n * @param maxWait max wait between retries in ms\n */\nexport function retry(\n fn: () => Promise,\n { n, minWait, maxWait }: { n: number; minWait: number; maxWait: number }\n): { promise: Promise; cancel: () => void } {\n let completed = false\n let rejectCancelled: (error: Error) => void\n const promise = new Promise(async (resolve, reject) => {\n rejectCancelled = reject\n while (true) {\n let result: T\n try {\n result = await fn()\n if (!completed) {\n resolve(result)\n completed = true\n }\n break\n } catch (error) {\n if (completed) {\n break\n }\n if (n <= 0 || !(error instanceof RetryableError)) {\n reject(error)\n completed = true\n break\n }\n n--\n }\n await waitRandom(minWait, maxWait)\n }\n })\n return {\n promise,\n cancel: () => {\n if (completed) return\n completed = true\n rejectCancelled(new CancelledError())\n }\n }\n}\n","import { Contract } from '@ethersproject/contracts'\nimport { useEffect, useMemo, useRef } from 'react'\nimport { useDispatch, useSelector } from 'react-redux'\nimport { useActiveWeb3React } from '../../hooks'\nimport { useMulticallContract } from '../../hooks/useContract'\nimport useDebounce from '../../hooks/useDebounce'\nimport chunkArray from '../../utils/chunkArray'\nimport { CancelledError, retry, RetryableError } from '../../utils/retry'\nimport { useBlockNumber } from '../application/hooks'\nimport { AppDispatch, AppState } from '../index'\nimport {\n Call,\n errorFetchingMulticallResults,\n fetchingMulticallResults,\n parseCallKey,\n updateMulticallResults\n} from './actions'\n\n// chunk calls so we do not exceed the gas limit\nconst CALL_CHUNK_SIZE = 500\n\n/**\n * Fetches a chunk of calls, enforcing a minimum block number constraint\n * @param multicallContract multicall contract to fetch against\n * @param chunk chunk of calls to make\n * @param minBlockNumber minimum block number of the result set\n */\nasync function fetchChunk(\n multicallContract: Contract,\n chunk: Call[],\n minBlockNumber: number\n): Promise<{ results: string[]; blockNumber: number }> {\n console.debug('Fetching chunk', multicallContract, chunk, minBlockNumber)\n let resultsBlockNumber, returnData\n try {\n ;[resultsBlockNumber, returnData] = await multicallContract.aggregate(chunk.map(obj => [obj.address, obj.callData]))\n } catch (error) {\n console.debug('Failed to fetch chunk inside retry', error)\n throw error\n }\n if (resultsBlockNumber.toNumber() < minBlockNumber) {\n console.debug(`Fetched results for old block number: ${resultsBlockNumber.toString()} vs. ${minBlockNumber}`)\n throw new RetryableError('Fetched for old block number')\n }\n return { results: returnData, blockNumber: resultsBlockNumber.toNumber() }\n}\n\n/**\n * From the current all listeners state, return each call key mapped to the\n * minimum number of blocks per fetch. This is how often each key must be fetched.\n * @param allListeners the all listeners state\n * @param chainId the current chain id\n */\nexport function activeListeningKeys(\n allListeners: AppState['multicall']['callListeners'],\n chainId?: number\n): { [callKey: string]: number } {\n if (!allListeners || !chainId) return {}\n const listeners = allListeners[chainId]\n if (!listeners) return {}\n\n return Object.keys(listeners).reduce<{ [callKey: string]: number }>((memo, callKey) => {\n const keyListeners = listeners[callKey]\n\n memo[callKey] = Object.keys(keyListeners)\n .filter(key => {\n const blocksPerFetch = parseInt(key)\n if (blocksPerFetch <= 0) return false\n return keyListeners[blocksPerFetch] > 0\n })\n .reduce((previousMin, current) => {\n return Math.min(previousMin, parseInt(current))\n }, Infinity)\n return memo\n }, {})\n}\n\n/**\n * Return the keys that need to be refetched\n * @param callResults current call result state\n * @param listeningKeys each call key mapped to how old the data can be in blocks\n * @param chainId the current chain id\n * @param latestBlockNumber the latest block number\n */\nexport function outdatedListeningKeys(\n callResults: AppState['multicall']['callResults'],\n listeningKeys: { [callKey: string]: number },\n chainId: number | undefined,\n latestBlockNumber: number | undefined\n): string[] {\n if (!chainId || !latestBlockNumber) return []\n const results = callResults[chainId]\n // no results at all, load everything\n if (!results) return Object.keys(listeningKeys)\n\n return Object.keys(listeningKeys).filter(callKey => {\n const blocksPerFetch = listeningKeys[callKey]\n\n const data = callResults[chainId][callKey]\n // no data, must fetch\n if (!data) return true\n\n const minDataBlockNumber = latestBlockNumber - (blocksPerFetch - 1)\n\n // already fetching it for a recent enough block, don't refetch it\n if (data.fetchingBlockNumber && data.fetchingBlockNumber >= minDataBlockNumber) return false\n\n // if data is older than minDataBlockNumber, fetch it\n return !data.blockNumber || data.blockNumber < minDataBlockNumber\n })\n}\n\nexport default function Updater(): null {\n const dispatch = useDispatch()\n const state = useSelector(state => state.multicall)\n // wait for listeners to settle before triggering updates\n const debouncedListeners = useDebounce(state.callListeners, 100)\n const latestBlockNumber = useBlockNumber()\n const { chainId } = useActiveWeb3React()\n const multicallContract = useMulticallContract()\n const cancellations = useRef<{ blockNumber: number; cancellations: (() => void)[] }>()\n\n const listeningKeys: { [callKey: string]: number } = useMemo(() => {\n return activeListeningKeys(debouncedListeners, chainId)\n }, [debouncedListeners, chainId])\n\n const unserializedOutdatedCallKeys = useMemo(() => {\n return outdatedListeningKeys(state.callResults, listeningKeys, chainId, latestBlockNumber)\n }, [chainId, state.callResults, listeningKeys, latestBlockNumber])\n\n const serializedOutdatedCallKeys = useMemo(() => JSON.stringify(unserializedOutdatedCallKeys.sort()), [\n unserializedOutdatedCallKeys\n ])\n\n useEffect(() => {\n if (!latestBlockNumber || !chainId || !multicallContract) return\n\n const outdatedCallKeys: string[] = JSON.parse(serializedOutdatedCallKeys)\n if (outdatedCallKeys.length === 0) return\n const calls = outdatedCallKeys.map(key => parseCallKey(key))\n\n const chunkedCalls = chunkArray(calls, CALL_CHUNK_SIZE)\n\n if (cancellations.current?.blockNumber !== latestBlockNumber) {\n cancellations.current?.cancellations?.forEach(c => c())\n }\n\n dispatch(\n fetchingMulticallResults({\n calls,\n chainId,\n fetchingBlockNumber: latestBlockNumber\n })\n )\n\n cancellations.current = {\n blockNumber: latestBlockNumber,\n cancellations: chunkedCalls.map((chunk, index) => {\n const { cancel, promise } = retry(() => fetchChunk(multicallContract, chunk, latestBlockNumber), {\n n: Infinity,\n minWait: 2500,\n maxWait: 3500\n })\n promise\n .then(({ results: returnData, blockNumber: fetchBlockNumber }) => {\n cancellations.current = { cancellations: [], blockNumber: latestBlockNumber }\n\n // accumulates the length of all previous indices\n const firstCallKeyIndex = chunkedCalls.slice(0, index).reduce((memo, curr) => memo + curr.length, 0)\n const lastCallKeyIndex = firstCallKeyIndex + returnData.length\n\n dispatch(\n updateMulticallResults({\n chainId,\n results: outdatedCallKeys\n .slice(firstCallKeyIndex, lastCallKeyIndex)\n .reduce<{ [callKey: string]: string | null }>((memo, callKey, i) => {\n memo[callKey] = returnData[i] ?? null\n return memo\n }, {}),\n blockNumber: fetchBlockNumber\n })\n )\n })\n .catch((error: any) => {\n if (error instanceof CancelledError) {\n console.debug('Cancelled fetch for blockNumber', latestBlockNumber)\n return\n }\n console.error('Failed to fetch multicall chunk', chunk, chainId, error)\n dispatch(\n errorFetchingMulticallResults({\n calls: chunk,\n chainId,\n fetchingBlockNumber: latestBlockNumber\n })\n )\n })\n return cancel\n })\n }\n }, [chainId, multicallContract, dispatch, serializedOutdatedCallKeys, latestBlockNumber])\n\n return null\n}\n","// chunks array into chunks of maximum size\n// evenly distributes items among the chunks\nexport default function chunkArray(items: T[], maxChunkSize: number): T[][] {\n if (maxChunkSize < 1) throw new Error('maxChunkSize must be gte 1')\n if (items.length <= maxChunkSize) return [items]\n\n const numChunks: number = Math.ceil(items.length / maxChunkSize)\n const chunkSize = Math.ceil(items.length / numChunks)\n\n return [...Array(numChunks).keys()].map(ix => items.slice(ix * chunkSize, ix * chunkSize + chunkSize))\n}\n","import { useEffect } from 'react'\nimport { useDispatch, useSelector } from 'react-redux'\nimport { useActiveWeb3React } from '../../hooks'\nimport { useAddPopup, useBlockNumber } from '../application/hooks'\nimport { AppDispatch, AppState } from '../index'\nimport { checkedTransaction, finalizeTransaction } from './actions'\n\nexport function shouldCheck(\n lastBlockNumber: number,\n tx: { addedTime: number; receipt?: {}; lastCheckedBlockNumber?: number }\n): boolean {\n if (tx.receipt) return false\n if (!tx.lastCheckedBlockNumber) return true\n const blocksSinceCheck = lastBlockNumber - tx.lastCheckedBlockNumber\n if (blocksSinceCheck < 1) return false\n const minutesPending = (new Date().getTime() - tx.addedTime) / 1000 / 60\n if (minutesPending > 60) {\n // every 10 blocks if pending for longer than an hour\n return blocksSinceCheck > 9\n } else if (minutesPending > 5) {\n // every 3 blocks if pending more than 5 minutes\n return blocksSinceCheck > 2\n } else {\n // otherwise every block\n return true\n }\n}\n\nexport default function Updater(): null {\n const { chainId, library } = useActiveWeb3React()\n\n const lastBlockNumber = useBlockNumber()\n\n const dispatch = useDispatch()\n const state = useSelector(state => state.transactions)\n\n const transactions = chainId ? state[chainId] ?? {} : {}\n\n // show popup on confirm\n const addPopup = useAddPopup()\n\n useEffect(() => {\n if (!chainId || !library || !lastBlockNumber) return\n\n Object.keys(transactions)\n .filter(hash => shouldCheck(lastBlockNumber, transactions[hash]))\n .forEach(hash => {\n library\n .getTransactionReceipt(hash)\n .then(receipt => {\n if (receipt) {\n dispatch(\n finalizeTransaction({\n chainId,\n hash,\n receipt: {\n blockHash: receipt.blockHash,\n blockNumber: receipt.blockNumber,\n contractAddress: receipt.contractAddress,\n from: receipt.from,\n status: receipt.status,\n to: receipt.to,\n transactionHash: receipt.transactionHash,\n transactionIndex: receipt.transactionIndex\n }\n })\n )\n\n addPopup(\n {\n txn: {\n hash,\n success: receipt.status === 1,\n summary: transactions[hash]?.summary\n }\n },\n hash\n )\n } else {\n dispatch(checkedTransaction({ chainId, hash, blockNumber: lastBlockNumber }))\n }\n })\n .catch(error => {\n console.error(`failed to check transaction hash: ${hash}`, error)\n })\n })\n }, [chainId, library, transactions, lastBlockNumber, dispatch, addPopup])\n\n return null\n}\n","import { useEffect } from 'react'\nimport { useDispatch } from 'react-redux'\nimport { AppDispatch } from '../index'\nimport { updateMatchesDarkMode } from './actions'\n\nexport default function Updater(): null {\n const dispatch = useDispatch()\n\n // keep dark mode in sync with the system\n useEffect(() => {\n const darkHandler = (match: MediaQueryListEvent) => {\n dispatch(updateMatchesDarkMode({ matchesDarkMode: match.matches }))\n }\n\n const match = window?.matchMedia('(prefers-color-scheme: dark)')\n dispatch(updateMatchesDarkMode({ matchesDarkMode: match.matches }))\n\n if (match?.addListener) {\n match?.addListener(darkHandler)\n } else if (match?.addEventListener) {\n match?.addEventListener('change', darkHandler)\n }\n\n return () => {\n if (match?.removeListener) {\n match?.removeListener(darkHandler)\n } else if (match?.removeEventListener) {\n match?.removeEventListener('change', darkHandler)\n }\n }\n }, [dispatch])\n\n return null\n}\n","import { Web3Provider } from '@ethersproject/providers'\n\nexport default function getLibrary(provider: any): Web3Provider {\n const library = new Web3Provider(provider, 'any')\n library.pollingInterval = 15000\n return library\n}\n","import { createWeb3ReactRoot, Web3ReactProvider } from '@web3-react/core'\r\nimport 'inter-ui'\r\nimport React, { StrictMode } from 'react'\r\nimport { isMobile } from 'react-device-detect'\r\nimport ReactDOM from 'react-dom'\r\nimport ReactGA from 'react-ga'\r\nimport { Provider } from 'react-redux'\r\nimport { HashRouter } from 'react-router-dom'\r\nimport Blocklist from './components/Blocklist'\r\nimport { NetworkContextName } from './constants'\r\nimport './i18n'\r\nimport App from './pages/App'\r\nimport store from './state'\r\nimport ApplicationUpdater from './state/application/updater'\r\nimport ListsUpdater from './state/lists/updater'\r\nimport MulticallUpdater from './state/multicall/updater'\r\nimport TransactionUpdater from './state/transactions/updater'\r\nimport UserUpdater from './state/user/updater'\r\nimport ThemeProvider, { FixedGlobalStyle, ThemedGlobalStyle } from './theme'\r\nimport getLibrary from './utils/getLibrary'\r\n\r\nconst Web3ProviderNetwork = createWeb3ReactRoot(NetworkContextName)\r\n\r\nif ('ethereum' in window) {\r\n ;(window.ethereum as any).autoRefreshOnNetworkChange = false\r\n}\r\n\r\nconst GOOGLE_ANALYTICS_ID: string | undefined = process.env.REACT_APP_GOOGLE_ANALYTICS_ID\r\nif (typeof GOOGLE_ANALYTICS_ID === 'string') {\r\n ReactGA.initialize(GOOGLE_ANALYTICS_ID)\r\n ReactGA.set({\r\n customBrowserType: !isMobile ? 'desktop' : 'web3' in window || 'ethereum' in window ? 'mobileWeb3' : 'mobileRegular'\r\n })\r\n} else {\r\n ReactGA.initialize('test', { testMode: true, debug: true })\r\n}\r\n\r\nwindow.addEventListener('error', error => {\r\n ReactGA.exception({\r\n description: `${error.message} @ ${error.filename}:${error.lineno}:${error.colno}`,\r\n fatal: true\r\n })\r\n})\r\n\r\nfunction Updaters() {\r\n return (\r\n <>\r\n \r\n \r\n \r\n \r\n \r\n \r\n )\r\n}\r\n\r\nReactDOM.render(\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n ,\r\n document.getElementById('root')\r\n)\r\n","module.exports = __webpack_public_path__ + \"static/media/metamask.023762b6.png\";"],"sourceRoot":""}